MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / ff_msmpeg4_encode_block

Function ff_msmpeg4_encode_block

libavcodec/msmpeg4enc.c:555–671  ·  view source on GitHub ↗

Encoding of a block; very similar to MPEG-4 except for a different * escape coding (same as H.263) and more VLC tables. */

Source from the content-addressed store, hash-verified

553/* Encoding of a block; very similar to MPEG-4 except for a different
554 * escape coding (same as H.263) and more VLC tables. */
555void ff_msmpeg4_encode_block(MPVEncContext *const s, int16_t * block, int n)
556{
557 MSMPEG4EncContext *const ms = (MSMPEG4EncContext*)s;
558 int level, run, last, i, j, last_index;
559 int last_non_zero, sign, slevel;
560 int code, run_diff, dc_pred_dir;
561 const RLTable *rl;
562 const uint8_t *scantable;
563
564 if (s->c.mb_intra) {
565 msmpeg4_encode_dc(ms, block[0], n, &dc_pred_dir);
566 i = 1;
567 if (n < 4) {
568 rl = &ff_rl_table[ms->rl_table_index];
569 } else {
570 rl = &ff_rl_table[3 + ms->rl_chroma_table_index];
571 }
572 run_diff = s->c.msmpeg4_version >= MSMP4_WMV1;
573 scantable = s->c.intra_scantable.permutated;
574 } else {
575 i = 0;
576 rl = &ff_rl_table[3 + ms->rl_table_index];
577 run_diff = s->c.msmpeg4_version > MSMP4_V2;
578 scantable = s->c.inter_scantable.permutated;
579 }
580
581 /* recalculate block_last_index for M$ wmv1 */
582 if (s->c.msmpeg4_version >= MSMP4_WMV1 && s->c.block_last_index[n] > 0) {
583 for(last_index=63; last_index>=0; last_index--){
584 if(block[scantable[last_index]]) break;
585 }
586 s->c.block_last_index[n] = last_index;
587 }else
588 last_index = s->c.block_last_index[n];
589 /* AC coefs */
590 last_non_zero = i - 1;
591 for (; i <= last_index; i++) {
592 j = scantable[i];
593 level = block[j];
594 if (level) {
595 run = i - last_non_zero - 1;
596 last = (i == last_index);
597 sign = 0;
598 slevel = level;
599 if (level < 0) {
600 sign = 1;
601 level = -level;
602 }
603
604 if(level<=MAX_LEVEL && run<=MAX_RUN){
605 ms->ac_stats[s->c.mb_intra][n>3][level][run][last]++;
606 }
607
608 ms->ac_stats[s->c.mb_intra][n > 3][40][63][0]++; //esc3 like
609
610 code = get_rl_index(rl, last, run, level);
611 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
612 if (code == rl->n) {

Callers 2

wmv2_encode_mbFunction · 0.85
msmpeg4_encode_mbFunction · 0.85

Calls 4

msmpeg4_encode_dcFunction · 0.85
get_rl_indexFunction · 0.85
put_sbitsFunction · 0.85
put_bitsFunction · 0.70

Tested by

no test coverage detected