| 847 | } |
| 848 | |
| 849 | static void mpeg1_encode_block(MpegEncContext *s, |
| 850 | DCTELEM *block, |
| 851 | int n) |
| 852 | { |
| 853 | int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign; |
| 854 | int code, component; |
| 855 | const uint16_t (*table_vlc)[2] = ff_rl_mpeg1.table_vlc; |
| 856 | |
| 857 | last_index = s->block_last_index[n]; |
| 858 | |
| 859 | /* DC coef */ |
| 860 | if (s->mb_intra) { |
| 861 | component = (n <= 3 ? 0 : (n&1) + 1); |
| 862 | dc = block[0]; /* overflow is impossible */ |
| 863 | diff = dc - s->last_dc[component]; |
| 864 | encode_dc(s, diff, component); |
| 865 | s->last_dc[component] = dc; |
| 866 | i = 1; |
| 867 | if (s->intra_vlc_format) |
| 868 | table_vlc = ff_rl_mpeg2.table_vlc; |
| 869 | } else { |
| 870 | /* encode the first coefficient : needs to be done here because |
| 871 | it is handled slightly differently */ |
| 872 | level = block[0]; |
| 873 | if (abs(level) == 1) { |
| 874 | code = ((uint32_t)level >> 31); /* the sign bit */ |
| 875 | put_bits(&s->pb, 2, code | 0x02); |
| 876 | i = 1; |
| 877 | } else { |
| 878 | i = 0; |
| 879 | last_non_zero = -1; |
| 880 | goto next_coef; |
| 881 | } |
| 882 | } |
| 883 | |
| 884 | /* now quantify & encode AC coefs */ |
| 885 | last_non_zero = i - 1; |
| 886 | |
| 887 | for(;i<=last_index;i++) { |
| 888 | j = s->intra_scantable.permutated[i]; |
| 889 | level = block[j]; |
| 890 | next_coef: |
| 891 | #if 0 |
| 892 | if (level != 0) |
| 893 | dprintf(s->avctx, "level[%d]=%d\n", i, level); |
| 894 | #endif |
| 895 | /* encode using VLC */ |
| 896 | if (level != 0) { |
| 897 | run = i - last_non_zero - 1; |
| 898 | |
| 899 | alevel= level; |
| 900 | MASK_ABS(sign, alevel) |
| 901 | sign&=1; |
| 902 | |
| 903 | if (alevel <= mpeg1_max_level[0][run]){ |
| 904 | code= mpeg1_index_run[0][run] + alevel - 1; |
| 905 | /* store the vlc & sign at once */ |
| 906 | put_bits(&s->pb, table_vlc[code][1]+1, (table_vlc[code][0]<<1) + sign); |
no test coverage detected