void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[12][64]) { int i; if (s->chroma_format == CHROMA_444) { encode_block(s, block[0], 0); encode_block(s, block[2], 2); encode_block(s, block[4], 4); encode_block(s, block[8], 8); encode_block(s, block[5], 5); encode_block(s, block[9], 9); if (16*s->mb_x+8 < s->width) { encode_block(s, block[1], 1); encode_block(s, block[3], 3); encode_block(s, block[6], 6); encode_block(s, block[10], 10); encode_block(s, block[7], 7); encode_block(s, block[11], 11); } } else { for(i=0;i<5;i++) { encode_block(s, block[i], i); } if (s->chroma_format == CHROMA_420) { encode_block(s, block[5], 5); } else { encode_block(s, block[6], 6); encode_block(s, block[5], 5); encode_block(s, block[7], 7); } } s->i_tex_bits += get_bits_diff(s); }
/** * Intra picture MB layer bitstream encoder * @param s Mpeg encoder context * @param block macroblock to encode */ void vc1_intra_picture_encode_mb(MpegEncContext * s, DCTELEM block[6][64]) { int cbp, coded_cbp, i; uint8_t *coded_block; /* compute cbp */ cbp = 0; coded_cbp = 0; for (i = 0; i < 6; i++) { int val, pred; val = (s->block_last_index[i] >= 1); cbp |= val << (5 - i); if (i < 4) { /* predict value for close blocks only for luma */ pred = vc1_coded_block_pred(s, i, &coded_block); *coded_block = val; val = val ^ pred; } coded_cbp |= val << (5 - i); } put_bits(&s->pb,ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);//CBPCY //predict dc_val and dc_direction for each block //brute force test to switch ACPRED on/off put_bits(&s->pb,1,0);//ACPRED for (i = 0; i < 6; i++) ff_msmpeg4_encode_block(s, block[i], i); s->i_tex_bits += get_bits_diff(s); s->i_count++; }
void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[6][64]) { int i; for(i=0;i<5;i++) { encode_block(s, block[i], i); } if (s->chroma_format == CHROMA_420) { encode_block(s, block[5], 5); } else { encode_block(s, block[6], 6); encode_block(s, block[5], 5); encode_block(s, block[7], 7); } s->i_tex_bits += get_bits_diff(s); }
/* Nearly identical to wmv1 but that is just because we do not use the * useless M$ crap features. It is duplicated here in case someone wants * to add support for these crap features. */ void ff_wmv2_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y) { Wmv2Context *const w = (Wmv2Context *) s; int cbp, coded_cbp, i; int pred_x, pred_y; uint8_t *coded_block; ff_msmpeg4_handle_slices(s); if (!s->mb_intra) { /* compute cbp */ cbp = 0; for (i = 0; i < 6; i++) if (s->block_last_index[i] >= 0) cbp |= 1 << (5 - i); put_bits(&s->pb, ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][1], ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][0]); s->misc_bits += get_bits_diff(s); /* motion vector */ ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); ff_msmpeg4_encode_motion(s, motion_x - pred_x, motion_y - pred_y); s->mv_bits += get_bits_diff(s); } else { /* compute cbp */ cbp = 0; coded_cbp = 0; for (i = 0; i < 6; i++) { int val, pred; val = (s->block_last_index[i] >= 1); cbp |= val << (5 - i); if (i < 4) { /* predict value for close blocks only for luma */ pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); *coded_block = val; val = val ^ pred; } coded_cbp |= val << (5 - i); } if (s->pict_type == AV_PICTURE_TYPE_I) put_bits(&s->pb, ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); else put_bits(&s->pb, ff_wmv2_inter_table[w->cbp_table_index][cbp][1], ff_wmv2_inter_table[w->cbp_table_index][cbp][0]); put_bits(&s->pb, 1, 0); /* no AC prediction yet */ if (s->inter_intra_pred) { s->h263_aic_dir = 0; put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]); } s->misc_bits += get_bits_diff(s); } for (i = 0; i < 6; i++) ff_msmpeg4_encode_block(s, block[i], i); if (s->mb_intra) s->i_tex_bits += get_bits_diff(s); else s->p_tex_bits += get_bits_diff(s); }