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

Function mpeg1_encode_block

libavcodec/mpeg12enc.c:849–931  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

847}
848
849static 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);

Callers 1

mpeg1_encode_mb_internalFunction · 0.85

Calls 2

encode_dcFunction · 0.85
put_sbitsFunction · 0.85

Tested by

no test coverage detected