Encoding of a block; very similar to MPEG-4 except for a different * escape coding (same as H.263) and more VLC tables. */
| 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. */ |
| 555 | void 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) { |
no test coverage detected