FFmpeg
ituh263enc.c
Go to the documentation of this file.
1 /*
2  * ITU H.263 bitstream encoder
3  * Copyright (c) 2000,2001 Fabrice Bellard
4  * H.263+ support.
5  * Copyright (c) 2001 Juan J. Sierralta P
6  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
7  *
8  * This file is part of FFmpeg.
9  *
10  * FFmpeg is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * FFmpeg is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with FFmpeg; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 /**
26  * @file
27  * H.263 bitstream encoder.
28  */
29 
30 #include "config_components.h"
31 
32 #include <limits.h>
33 #include <string.h>
34 
35 #include "libavutil/attributes.h"
36 #include "libavutil/thread.h"
37 #include "avcodec.h"
38 #include "codec_internal.h"
39 #include "mpegvideo.h"
40 #include "flvenc.h"
41 #include "mpegvideoenc.h"
42 #include "h263.h"
43 #include "h263enc.h"
44 #include "h263data.h"
45 #include "h263dsp.h"
46 #include "mathops.h"
47 #include "mpegutils.h"
48 #include "internal.h"
49 #include "put_bits.h"
50 
51 /**
52  * Table of number of bits a motion vector component needs.
53  */
54 static uint8_t mv_penalty[MAX_FCODE+1][MAX_DMV*2+1];
55 
56 static av_cold void init_mv_penalty(void)
57 {
58  for (int f_code = 1; f_code <= MAX_FCODE; f_code++) {
59  for (int mv = -MAX_DMV; mv <= MAX_DMV; mv++) {
60  int len;
61 
62  if (mv == 0) len = 1; // ff_mvtab[0][1]
63  else {
64  int val, bit_size, code;
65 
66  bit_size = f_code - 1;
67 
68  val = mv;
69  if (val < 0)
70  val = -val;
71  val--;
72  code = (val >> bit_size) + 1;
73  if (code < 33) {
74  len = ff_mvtab[code][1] + 1 + bit_size;
75  } else {
76  len = 12 /* ff_mvtab[32][1] */ + av_log2(code>>5) + 2 + bit_size;
77  }
78  }
79 
80  mv_penalty[f_code][mv + MAX_DMV] = len;
81  }
82  }
83 }
84 
85 #if CONFIG_H263_ENCODER
86 /**
87  * Minimal fcode that a motion vector component would need in umv.
88  * All entries in this table are 1.
89  */
90 static uint8_t umv_fcode_tab[MAX_MV*2+1];
91 
92 //unified encoding tables for run length encoding of coefficients
93 //unified in the sense that the specification specifies the encoding in several steps.
94 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
95 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
96 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
97 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
98 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
99 
100 static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab)
101 {
102  av_assert0(MAX_LEVEL >= 64);
103  av_assert0(MAX_RUN >= 63);
104 
105  for (int slevel = -64; slevel < 64; slevel++) {
106  if (slevel == 0) continue;
107  for (int run = 0; run < 64; run++) {
108  for (int last = 0; last <= 1; last++) {
109  const int index = UNI_MPEG4_ENC_INDEX(last, run, slevel + 64);
110  int level = slevel < 0 ? -slevel : slevel;
111  int sign = slevel < 0 ? 1 : 0;
112  int bits, len, code;
113 
114  len_tab[index] = 100;
115 
116  /* ESC0 */
117  code = get_rl_index(rl, last, run, level);
118  bits = rl->table_vlc[code][0];
119  len = rl->table_vlc[code][1];
120  bits = bits * 2 + sign;
121  len++;
122 
123  if (code != rl->n && len < len_tab[index])
124  len_tab[index] = len;
125 
126  /* ESC */
127  bits = rl->table_vlc[rl->n][0];
128  len = rl->table_vlc[rl->n][1];
129  bits = bits * 2 + last; len++;
130  bits = bits * 64 + run; len += 6;
131  bits = bits * 256 + (level & 0xff); len += 8;
132 
133  if (len < len_tab[index])
134  len_tab[index] = len;
135  }
136  }
137  }
138 }
139 #endif
140 
142 {
143 #if CONFIG_H263_ENCODER
144  static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3];
145  ff_rl_init(&ff_rl_intra_aic, rl_intra_table);
147 
148  init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len);
149  init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len);
150 
151  memset(umv_fcode_tab, 1, sizeof(umv_fcode_tab));
152 #endif
153 
154  init_mv_penalty();
155 }
156 
157 av_cold const uint8_t (*ff_h263_get_mv_penalty(void))[MAX_DMV*2+1]
158 {
159  static AVOnce init_static_once = AV_ONCE_INIT;
160 
161  ff_thread_once(&init_static_once, h263_encode_init_static);
162 
163  return mv_penalty;
164 }
165 
166 void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code)
167 {
168  if (val == 0) {
169  /* zero vector -- corresponds to ff_mvtab[0] */
170  put_bits(pb, 1, 1);
171  } else {
172  int sign, code, bits;
173  int bit_size = f_code - 1;
174  int range = 1 << bit_size;
175  /* modulo encoding */
176  val = sign_extend(val, 6 + bit_size);
177  sign = val>>31;
178  val= (val^sign)-sign;
179  sign&=1;
180 
181  val--;
182  code = (val >> bit_size) + 1;
183  bits = val & (range - 1);
184 
185  put_bits(pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
186  if (bit_size > 0) {
187  put_bits(pb, bit_size, bits);
188  }
189  }
190 }
191 
192 #if CONFIG_H263_ENCODER // Snow and SVQ1 need the above
193 static const uint8_t wrong_run[102] = {
194  1, 2, 3, 5, 4, 10, 9, 8,
195 11, 15, 17, 16, 23, 22, 21, 20,
196 19, 18, 25, 24, 27, 26, 11, 7,
197  6, 1, 2, 13, 2, 2, 2, 2,
198  6, 12, 3, 9, 1, 3, 4, 3,
199  7, 4, 1, 1, 5, 5, 14, 6,
200  1, 7, 1, 8, 1, 1, 1, 1,
201 10, 1, 1, 5, 9, 17, 25, 24,
202 29, 33, 32, 41, 2, 23, 28, 31,
203  3, 22, 30, 4, 27, 40, 8, 26,
204  6, 39, 7, 38, 16, 37, 15, 10,
205 11, 12, 13, 14, 1, 21, 20, 18,
206 19, 2, 1, 34, 35, 36
207 };
208 
209 /**
210  * Return the 4 bit value that specifies the given aspect ratio.
211  * This may be one of the standard aspect ratios or it specifies
212  * that the aspect will be stored explicitly later.
213  */
215  int i;
216 
217  if(aspect.num==0 || aspect.den==0) aspect= (AVRational){1,1};
218 
219  for(i=1; i<6; i++){
220  if(av_cmp_q(ff_h263_pixel_aspect[i], aspect) == 0){
221  return i;
222  }
223  }
224 
225  return FF_ASPECT_EXTENDED;
226 }
227 
228 static int h263_encode_picture_header(MPVMainEncContext *const m)
229 {
230  MPVEncContext *const s = &m->s;
231  int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
232  int best_clock_code=1;
233  int best_divisor=60;
234  int best_error= INT_MAX;
235  int custom_pcf;
236 
238 
239  if (s->c.codec_id == AV_CODEC_ID_H263P) {
240  for(i=0; i<2; i++){
241  int div, error;
242  div= (s->c.avctx->time_base.num*1800000LL + 500LL*s->c.avctx->time_base.den) / ((1000LL+i)*s->c.avctx->time_base.den);
243  div= av_clip(div, 1, 127);
244  error= FFABS(s->c.avctx->time_base.num*1800000LL - (1000LL+i)*s->c.avctx->time_base.den*div);
245  if(error < best_error){
246  best_error= error;
247  best_divisor= div;
248  best_clock_code= i;
249  }
250  }
251  }
252  custom_pcf = best_clock_code != 1 || best_divisor != 60;
253  coded_frame_rate= 1800000;
254  coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
255 
256  put_bits(&s->pb, 22, 0x20); /* PSC */
257  temp_ref= s->c.picture_number * (int64_t)coded_frame_rate * s->c.avctx->time_base.num / //FIXME use timestamp
258  (coded_frame_rate_base * (int64_t)s->c.avctx->time_base.den);
259  put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
260 
261  put_bits(&s->pb, 1, 1); /* marker */
262  put_bits(&s->pb, 1, 0); /* H.263 id */
263  put_bits(&s->pb, 1, 0); /* split screen off */
264  put_bits(&s->pb, 1, 0); /* camera off */
265  put_bits(&s->pb, 1, 0); /* freeze picture release off */
266 
268  if (s->c.codec_id != AV_CODEC_ID_H263P) {
269  /* H.263v1 */
270  put_bits(&s->pb, 3, format);
271  put_bits(&s->pb, 1, (s->c.pict_type == AV_PICTURE_TYPE_P));
272  /* By now UMV IS DISABLED ON H.263v1, since the restrictions
273  of H.263v1 UMV implies to check the predicted MV after
274  calculation of the current MB to see if we're on the limits */
275  put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
276  put_bits(&s->pb, 1, 0); /* SAC: off */
277  put_bits(&s->pb, 1, s->c.obmc); /* Advanced Prediction */
278  put_bits(&s->pb, 1, 0); /* only I/P-frames, no PB-frame */
279  put_bits(&s->pb, 5, s->c.qscale);
280  put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
281  } else {
282  int ufep=1;
283  /* H.263v2 */
284  /* H.263 Plus PTYPE */
285 
286  put_bits(&s->pb, 3, 7);
287  put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
288  if (format == 8)
289  put_bits(&s->pb,3,6); /* Custom Source Format */
290  else
291  put_bits(&s->pb, 3, format);
292 
293  put_bits(&s->pb,1, custom_pcf);
294  put_bits(&s->pb,1, s->c.umvplus); /* Unrestricted Motion Vector */
295  put_bits(&s->pb,1,0); /* SAC: off */
296  put_bits(&s->pb,1,s->c.obmc); /* Advanced Prediction Mode */
297  put_bits(&s->pb,1,s->c.h263_aic); /* Advanced Intra Coding */
298  put_bits(&s->pb,1,s->c.loop_filter); /* Deblocking Filter */
299  put_bits(&s->pb,1,s->c.h263_slice_structured); /* Slice Structured */
300  put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
301  put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
302  put_bits(&s->pb,1,s->c.alt_inter_vlc); /* Alternative Inter VLC */
303  put_bits(&s->pb,1,s->c.modified_quant); /* Modified Quantization: */
304  put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
305  put_bits(&s->pb,3,0); /* Reserved */
306 
307  put_bits(&s->pb, 3, s->c.pict_type == AV_PICTURE_TYPE_P);
308 
309  put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
310  put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
311  put_bits(&s->pb,1,s->c.no_rounding); /* Rounding Type */
312  put_bits(&s->pb,2,0); /* Reserved */
313  put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
314 
315  /* This should be here if PLUSPTYPE */
316  put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
317 
318  if (format == 8) {
319  /* Custom Picture Format (CPFMT) */
320  unsigned aspect_ratio_info = ff_h263_aspect_to_info(s->c.avctx->sample_aspect_ratio);
321 
322  put_bits(&s->pb,4, aspect_ratio_info);
323  put_bits(&s->pb,9,(s->c.width >> 2) - 1);
324  put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
325  put_bits(&s->pb,9,(s->c.height >> 2));
326  if (aspect_ratio_info == FF_ASPECT_EXTENDED){
327  put_bits(&s->pb, 8, s->c.avctx->sample_aspect_ratio.num);
328  put_bits(&s->pb, 8, s->c.avctx->sample_aspect_ratio.den);
329  }
330  }
331  if (custom_pcf) {
332  if(ufep){
333  put_bits(&s->pb, 1, best_clock_code);
334  put_bits(&s->pb, 7, best_divisor);
335  }
336  put_sbits(&s->pb, 2, temp_ref>>8);
337  }
338 
339  /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
340  if (s->c.umvplus)
341 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
342 //FIXME check actual requested range
343  put_bits(&s->pb,2,1); /* unlimited */
344  if(s->c.h263_slice_structured)
345  put_bits(&s->pb,2,0); /* no weird submodes */
346 
347  put_bits(&s->pb, 5, s->c.qscale);
348  }
349 
350  put_bits(&s->pb, 1, 0); /* no PEI */
351 
352  if(s->c.h263_slice_structured){
353  put_bits(&s->pb, 1, 1);
354 
355  av_assert1(s->c.mb_x == 0 && s->c.mb_y == 0);
357 
358  put_bits(&s->pb, 1, 1);
359  }
360 
361  return 0;
362 }
363 
365 {
366  int16_t *dc = s->c.dc_val;
367 
368  // The "- 1" is for the top-left entry
369  const int l_xy = s->c.block_index[2];
370  for (int i = l_xy - 2 * s->c.b8_stride - 1; i < l_xy; i += 2)
371  AV_WN32A(dc + i, 1024 << 16 | 1024);
372 
373  const int u_xy = s->c.block_index[4];
374  const int v_xy = s->c.block_index[5];
375  int16_t *dc2 = dc + v_xy - u_xy;
376  for (int i = u_xy - s->c.mb_stride - 1; i < u_xy; ++i)
377  dc[i] = dc2[i] = 1024;
378 }
379 
380 /**
381  * Encode a group of blocks header.
382  */
383 void ff_h263_encode_gob_header(MPVEncContext *const s, int mb_line)
384 {
385  put_bits(&s->pb, 17, 1); /* GBSC */
386 
387  if(s->c.h263_slice_structured){
388  put_bits(&s->pb, 1, 1);
389 
391 
392  if(s->c.mb_num > 1583)
393  put_bits(&s->pb, 1, 1);
394  put_bits(&s->pb, 5, s->c.qscale); /* GQUANT */
395  put_bits(&s->pb, 1, 1);
396  put_bits(&s->pb, 2, s->c.pict_type == AV_PICTURE_TYPE_I); /* GFID */
397  }else{
398  int gob_number= mb_line / s->c.gob_index;
399 
400  put_bits(&s->pb, 5, gob_number); /* GN */
401  put_bits(&s->pb, 2, s->c.pict_type == AV_PICTURE_TYPE_I); /* GFID */
402  put_bits(&s->pb, 5, s->c.qscale); /* GQUANT */
403  }
404 }
405 
406 /**
407  * modify qscale so that encoding is actually possible in H.263 (limit difference to -2..2)
408  */
410 {
411  int8_t * const qscale_table = s->c.cur_pic.qscale_table;
412 
413  for (int i = 1; i < s->c.mb_num; i++) {
414  if (qscale_table[ s->c.mb_index2xy[i] ] - qscale_table[ s->c.mb_index2xy[i-1] ] > 2)
415  qscale_table[ s->c.mb_index2xy[i] ] = qscale_table[ s->c.mb_index2xy[i-1] ] + 2;
416  }
417  for(int i = s->c.mb_num - 2; i >= 0; i--) {
418  if (qscale_table[ s->c.mb_index2xy[i] ] - qscale_table[ s->c.mb_index2xy[i+1] ] > 2)
419  qscale_table[ s->c.mb_index2xy[i] ] = qscale_table[ s->c.mb_index2xy[i+1] ] + 2;
420  }
421 
422  if (s->c.codec_id != AV_CODEC_ID_H263P) {
423  for (int i = 1; i < s->c.mb_num; i++) {
424  int mb_xy = s->c.mb_index2xy[i];
425 
426  if (qscale_table[mb_xy] != qscale_table[s->c.mb_index2xy[i - 1]] &&
427  (s->mb_type[mb_xy] & CANDIDATE_MB_TYPE_INTER4V)) {
428  s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
429  }
430  }
431  }
432 }
433 
434 static const int dquant_code[5]= {1,0,9,2,3};
435 
436 static void flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level,
437  int run, int last)
438 {
439  unsigned code;
440  int bits;
441  if (level < 64) { // 7-bit level
442  bits = 1 + 1 + 6 + 7;
443  code = (0 << (1 + 6 + 7)) |
444  (last << (6 + 7)) |
445  (run << 7) |
446  (slevel & 0x7f);
447  } else {
448  /* 11-bit level */
449  bits = 1 + 1 + 6 + 11;
450  code = (1 << (1 + 6 + 11)) |
451  (last << (6 + 11)) |
452  (run << 11) |
453  (slevel & 0x7ff);
454  }
455  put_bits(pb, bits, code);
456 }
457 
458 /**
459  * Encode an 8x8 block.
460  * @param block the 8x8 block
461  * @param n block index (0-3 are luma, 4-5 are chroma)
462  */
463 static void h263_encode_block(MPVEncContext *const s, int16_t block[], int n)
464 {
465  int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
466  const RLTable *rl;
467 
468  rl = &ff_h263_rl_inter;
469  if (s->c.mb_intra && !s->c.h263_aic) {
470  /* DC coef */
471  level = block[0];
472  /* 255 cannot be represented, so we clamp */
473  if (level > 254) {
474  level = 254;
475  block[0] = 254;
476  }
477  /* 0 cannot be represented also */
478  else if (level < 1) {
479  level = 1;
480  block[0] = 1;
481  }
482  if (level == 128) //FIXME check rv10
483  put_bits(&s->pb, 8, 0xff);
484  else
485  put_bits(&s->pb, 8, level);
486  i = 1;
487  } else {
488  i = 0;
489  if (s->c.h263_aic && s->c.mb_intra)
490  rl = &ff_rl_intra_aic;
491 
492  if(s->c.alt_inter_vlc && !s->c.mb_intra){
493  int aic_vlc_bits=0;
494  int inter_vlc_bits=0;
495  int wrong_pos=-1;
496  int aic_code;
497 
498  last_index = s->c.block_last_index[n];
499  last_non_zero = i - 1;
500  for (; i <= last_index; i++) {
501  j = s->c.intra_scantable.permutated[i];
502  level = block[j];
503  if (level) {
504  run = i - last_non_zero - 1;
505  last = (i == last_index);
506 
507  if(level<0) level= -level;
508 
509  code = get_rl_index(rl, last, run, level);
510  aic_code = get_rl_index(&ff_rl_intra_aic, last, run, level);
511  inter_vlc_bits += rl->table_vlc[code][1]+1;
512  aic_vlc_bits += ff_rl_intra_aic.table_vlc[aic_code][1]+1;
513 
514  if (code == rl->n) {
515  inter_vlc_bits += 1+6+8-1;
516  }
517  if (aic_code == ff_rl_intra_aic.n) {
518  aic_vlc_bits += 1+6+8-1;
519  wrong_pos += run + 1;
520  }else
521  wrong_pos += wrong_run[aic_code];
522  last_non_zero = i;
523  }
524  }
525  i = 0;
526  if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
527  rl = &ff_rl_intra_aic;
528  }
529  }
530 
531  /* AC coefs */
532  last_index = s->c.block_last_index[n];
533  last_non_zero = i - 1;
534  for (; i <= last_index; i++) {
535  j = s->c.intra_scantable.permutated[i];
536  level = block[j];
537  if (level) {
538  run = i - last_non_zero - 1;
539  last = (i == last_index);
540  sign = 0;
541  slevel = level;
542  if (level < 0) {
543  sign = 1;
544  level = -level;
545  }
546  code = get_rl_index(rl, last, run, level);
547  put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
548  if (code == rl->n) {
549  if (!CONFIG_FLV_ENCODER || s->c.h263_flv <= 1) {
550  put_bits(&s->pb, 1, last);
551  put_bits(&s->pb, 6, run);
552 
553  av_assert2(slevel != 0);
554 
555  if (level < 128) {
556  put_sbits(&s->pb, 8, slevel);
557  } else {
558  put_bits(&s->pb, 8, 128);
559  put_sbits(&s->pb, 5, slevel);
560  put_sbits(&s->pb, 6, slevel>>5);
561  }
562  } else {
563  flv2_encode_ac_esc(&s->pb, slevel, level, run, last);
564  }
565  } else {
566  put_bits(&s->pb, 1, sign);
567  }
568  last_non_zero = i;
569  }
570  }
571 }
572 
573 /* Encode MV differences on H.263+ with Unrestricted MV mode */
574 static void h263p_encode_umotion(PutBitContext *pb, int val)
575 {
576  if ( val == 0)
577  put_bits(pb, 1, 1);
578  else {
579  unsigned code = (val < 0) << 1;
580  unsigned aval = val < 0 ? -val : val;
581  unsigned n_bits = 2;
582 
583  while (aval != 1) { // The leading digit is implicitly coded via length
584  unsigned tmp = (aval & 1) << 1 | 1;
585  aval >>= 1;
586  code |= tmp << n_bits;
587  n_bits += 2;
588  }
589  put_bits(pb, n_bits + 1, code);
590  }
591 }
592 
593 static int h263_pred_dc(MPVEncContext *const s, int n, int16_t **dc_val_ptr)
594 {
595  const int wrap = s->c.block_wrap[n];
596  const int xy = s->c.block_index[n];
597  int16_t *const dc_val = s->c.dc_val + xy;
598  int pred_dc;
599 
600  /* find prediction */
601  /* B C
602  * A X
603  */
604  int a = dc_val[-1];
605  int c = dc_val[-wrap];
606 
607  /* just DC prediction */
608  if (a != 1024 && c != 1024)
609  pred_dc = (a + c) >> 1;
610  else if (a != 1024)
611  pred_dc = a;
612  else
613  pred_dc = c;
614 
615  /* we assume pred is positive */
616  *dc_val_ptr = dc_val;
617  return pred_dc;
618 }
619 
620 static void h263_encode_mb(MPVEncContext *const s,
621  int16_t block[][64],
622  int motion_x, int motion_y)
623 {
624  int cbpc, cbpy, i, cbp, pred_x, pred_y;
625  int16_t pred_dc;
626  int16_t rec_intradc[6];
627  const int interleaved_stats = s->c.avctx->flags & AV_CODEC_FLAG_PASS1;
628 
629  if (!s->c.mb_intra) {
630  /* compute cbp */
631  cbp= get_p_cbp(s, block, motion_x, motion_y);
632 
633  if ((cbp | motion_x | motion_y | s->dquant | (s->c.mv_type - MV_TYPE_16X16)) == 0) {
634  /* skip macroblock */
635  put_bits(&s->pb, 1, 1);
636  if(interleaved_stats){
637  s->misc_bits++;
638  s->last_bits++;
639  }
640 
641  return;
642  }
643  put_bits(&s->pb, 1, 0); /* mb coded */
644 
645  cbpc = cbp & 3;
646  cbpy = cbp >> 2;
647  if(s->c.alt_inter_vlc==0 || cbpc!=3)
648  cbpy ^= 0xF;
649  if(s->dquant) cbpc+= 8;
650  if(s->c.mv_type==MV_TYPE_16X16){
651  put_bits(&s->pb,
654 
655  put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
656  if(s->dquant)
657  put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
658 
659  if(interleaved_stats){
660  s->misc_bits+= get_bits_diff(s);
661  }
662 
663  /* motion vectors: 16x16 mode */
664  ff_h263_pred_motion(&s->c, 0, 0, &pred_x, &pred_y);
665 
666  if (!s->c.umvplus) {
667  ff_h263_encode_motion_vector(s, motion_x - pred_x,
668  motion_y - pred_y, 1);
669  }
670  else {
671  h263p_encode_umotion(&s->pb, motion_x - pred_x);
672  h263p_encode_umotion(&s->pb, motion_y - pred_y);
673  if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
674  /* To prevent Start Code emulation */
675  put_bits(&s->pb,1,1);
676  }
677  }else{
678  put_bits(&s->pb,
679  ff_h263_inter_MCBPC_bits[cbpc+16],
680  ff_h263_inter_MCBPC_code[cbpc+16]);
681  put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
682  if(s->dquant)
683  put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
684 
685  if(interleaved_stats){
686  s->misc_bits+= get_bits_diff(s);
687  }
688 
689  for(i=0; i<4; i++){
690  /* motion vectors: 8x8 mode*/
691  ff_h263_pred_motion(&s->c, i, 0, &pred_x, &pred_y);
692 
693  motion_x = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
694  motion_y = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
695  if (!s->c.umvplus) {
696  ff_h263_encode_motion_vector(s, motion_x - pred_x,
697  motion_y - pred_y, 1);
698  }
699  else {
700  h263p_encode_umotion(&s->pb, motion_x - pred_x);
701  h263p_encode_umotion(&s->pb, motion_y - pred_y);
702  if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
703  /* To prevent Start Code emulation */
704  put_bits(&s->pb,1,1);
705  }
706  }
707  }
708 
709  if(interleaved_stats){
710  s->mv_bits+= get_bits_diff(s);
711  }
712  } else {
713  av_assert2(s->c.mb_intra);
714 
715  cbp = 0;
716  if (s->c.h263_aic) {
717  /* Predict DC */
718  for(i=0; i<6; i++) {
719  int16_t level = block[i][0];
720  int16_t *dc_ptr;
721  int scale = i < 4 ? s->c.y_dc_scale : s->c.c_dc_scale;
722 
723  pred_dc = h263_pred_dc(s, i, &dc_ptr);
724  level -= pred_dc;
725  /* Quant */
726  if (level >= 0)
727  level = (level + (scale>>1))/scale;
728  else
729  level = (level - (scale>>1))/scale;
730 
731  if (!s->c.modified_quant) {
732  if (level < -127)
733  level = -127;
734  else if (level > 127)
735  level = 127;
736  }
737 
738  block[i][0] = level;
739  /* Reconstruction */
740  rec_intradc[i] = scale*level + pred_dc;
741  /* Oddify */
742  rec_intradc[i] |= 1;
743  //if ((rec_intradc[i] % 2) == 0)
744  // rec_intradc[i]++;
745  /* Clipping */
746  if (rec_intradc[i] < 0)
747  rec_intradc[i] = 0;
748  else if (rec_intradc[i] > 2047)
749  rec_intradc[i] = 2047;
750 
751  /* Update AC/DC tables */
752  *dc_ptr = rec_intradc[i];
753  /* AIC can change CBP */
754  if (s->c.block_last_index[i] > 0 ||
755  (s->c.block_last_index[i] == 0 && level !=0))
756  cbp |= 1 << (5 - i);
757  }
758  }else{
759  for(i=0; i<6; i++) {
760  /* compute cbp */
761  if (s->c.block_last_index[i] >= 1)
762  cbp |= 1 << (5 - i);
763  }
764  }
765 
766  cbpc = cbp & 3;
767  if (s->c.pict_type == AV_PICTURE_TYPE_I) {
768  if(s->dquant) cbpc+=4;
769  put_bits(&s->pb,
772  } else {
773  if(s->dquant) cbpc+=8;
774  put_bits(&s->pb, 1, 0); /* mb coded */
775  put_bits(&s->pb,
776  ff_h263_inter_MCBPC_bits[cbpc + 4],
777  ff_h263_inter_MCBPC_code[cbpc + 4]);
778  }
779  if (s->c.h263_aic) {
780  /* XXX: currently, we do not try to use ac prediction */
781  put_bits(&s->pb, 1, 0); /* no AC prediction */
782  }
783  cbpy = cbp >> 2;
784  put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
785  if(s->dquant)
786  put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
787 
788  if(interleaved_stats){
789  s->misc_bits+= get_bits_diff(s);
790  }
791  }
792 
793  for(i=0; i<6; i++) {
794  /* encode each block */
795  h263_encode_block(s, block[i], i);
796 
797  /* Update INTRADC for decoding */
798  if (s->c.h263_aic && s->c.mb_intra)
799  block[i][0] = rec_intradc[i];
800  }
801 
802  if(interleaved_stats){
803  if (!s->c.mb_intra) {
804  s->p_tex_bits+= get_bits_diff(s);
805  }else{
806  s->i_tex_bits+= get_bits_diff(s);
807  s->i_count++;
808  }
809  }
810 }
811 
812 void ff_h263_update_mb(MPVEncContext *const s)
813 {
814  const int mb_xy = s->c.mb_y * s->c.mb_stride + s->c.mb_x;
815 
816  if (s->c.cur_pic.mbskip_table)
817  s->c.cur_pic.mbskip_table[mb_xy] = s->c.mb_skipped;
818 
819  if (s->c.mv_type == MV_TYPE_8X8)
820  s->c.cur_pic.mb_type[mb_xy] = MB_TYPE_FORWARD_MV | MB_TYPE_8x8;
821  else if(s->c.mb_intra)
822  s->c.cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA;
823  else
824  s->c.cur_pic.mb_type[mb_xy] = MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
825 
827 }
828 
830 {
831  MPVEncContext *const s = &m->s;
832 
833  s->me.mv_penalty = ff_h263_get_mv_penalty(); // FIXME exact table for MSMPEG4 & H.263+
834 
835  ff_h263dsp_init(&s->c.h263dsp);
836 
837  if (s->c.codec_id == AV_CODEC_ID_MPEG4)
838  return;
839 
840  s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
841  s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
842  if (s->c.h263_aic) {
843  s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
844  s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
845 
846  s->c.y_dc_scale_table =
847  s->c.c_dc_scale_table = ff_aic_dc_scale_table;
848  }
849  s->ac_esc_length= 7+1+6+8;
850 
851  if (s->c.modified_quant)
852  s->c.chroma_qscale_table = ff_h263_chroma_qscale_table;
853 
854  // Only used for H.263 and H.263+
855  s->c.gob_index = H263_GOB_HEIGHT(s->c.height);
856 
857  // use fcodes >1 only for MPEG-4 & H.263 & H.263+ FIXME
858  switch(s->c.codec_id){
859  case AV_CODEC_ID_H263P:
860  if (s->c.umvplus)
861  m->fcode_tab = umv_fcode_tab + MAX_MV;
862  if (s->c.modified_quant) {
863  s->min_qcoeff= -2047;
864  s->max_qcoeff= 2047;
865  }else{
866  s->min_qcoeff= -127;
867  s->max_qcoeff= 127;
868  }
869  break;
870  // Note for MPEG-4 & H.263 the dc-scale table will be set per frame as needed later
871 #if CONFIG_FLV_ENCODER
872  case AV_CODEC_ID_FLV1:
874  if (s->c.h263_flv > 1) {
875  s->min_qcoeff= -1023;
876  s->max_qcoeff= 1023;
877  } else {
878  s->min_qcoeff= -127;
879  s->max_qcoeff= 127;
880  }
881  break;
882 #endif
883  default: //nothing needed - default table already set in mpegvideo.c
884  s->min_qcoeff= -127;
885  s->max_qcoeff= 127;
886  }
887  // H.263, H.263+; will be overwritten for MSMPEG-4 later
888  if (!m->encode_picture_header)
889  m->encode_picture_header = h263_encode_picture_header;
890  if (!s->encode_mb)
891  s->encode_mb = h263_encode_mb;
892 }
893 
895 {
896  int i, mb_pos;
897 
898  for(i=0; i<6; i++){
899  if(s->c.mb_num-1 <= ff_mba_max[i]) break;
900  }
901  mb_pos= s->c.mb_x + s->c.mb_width*s->c.mb_y;
902  put_bits(&s->pb, ff_mba_length[i], mb_pos);
903 }
904 
905 #define OFFSET(x) offsetof(MpegEncContext, x)
906 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
907 static const AVOption h263_options[] = {
908  { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
909  { "mb_info", "emit macroblock info for RFC 2190 packetization, the parameter value is the maximum payload size", FF_MPV_OFFSET(mb_info), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
912  { NULL },
913 };
914 
915 static const AVClass h263_class = {
916  .class_name = "H.263 encoder",
917  .item_name = av_default_item_name,
918  .option = h263_options,
919  .version = LIBAVUTIL_VERSION_INT,
920 };
921 
922 const FFCodec ff_h263_encoder = {
923  .p.name = "h263",
924  CODEC_LONG_NAME("H.263 / H.263-1996"),
925  .p.type = AVMEDIA_TYPE_VIDEO,
926  .p.id = AV_CODEC_ID_H263,
928  .color_ranges = AVCOL_RANGE_MPEG,
929  .p.priv_class = &h263_class,
931  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
932  .priv_data_size = sizeof(MPVMainEncContext),
935  .close = ff_mpv_encode_end,
936 };
937 
938 static const AVOption h263p_options[] = {
939  { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
940  { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
941  { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
942  { "structured_slices", "Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE},
945  { NULL },
946 };
947 static const AVClass h263p_class = {
948  .class_name = "H.263p encoder",
949  .item_name = av_default_item_name,
950  .option = h263p_options,
951  .version = LIBAVUTIL_VERSION_INT,
952 };
953 
954 const FFCodec ff_h263p_encoder = {
955  .p.name = "h263p",
956  CODEC_LONG_NAME("H.263+ / H.263-1998 / H.263 version 2"),
957  .p.type = AVMEDIA_TYPE_VIDEO,
958  .p.id = AV_CODEC_ID_H263P,
960  .color_ranges = AVCOL_RANGE_MPEG,
961  .p.priv_class = &h263p_class,
962  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS |
964  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
965  .priv_data_size = sizeof(MPVMainEncContext),
968  .close = ff_mpv_encode_end,
969 };
970 #endif
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
MPVMainEncContext::fcode_tab
const uint8_t * fcode_tab
smallest fcode needed for each MV
Definition: mpegvideoenc.h:218
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:386
MV_TYPE_16X16
#define MV_TYPE_16X16
1 vector for the whole mb
Definition: mpegvideo.h:185
h263data.h
FF_ASPECT_EXTENDED
#define FF_ASPECT_EXTENDED
Definition: h263.h:26
level
uint8_t level
Definition: svq3.c:208
av_clip
#define av_clip
Definition: common.h:100
MPVEncContext
Definition: mpegvideoenc.h:45
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
H263_GOB_HEIGHT
#define H263_GOB_HEIGHT(h)
Definition: h263.h:28
MAX_FCODE
#define MAX_FCODE
Definition: mpegvideoenc.h:264
thread.h
mpegvideoenc.h
int64_t
long long int64_t
Definition: coverity.c:34
mv
static const int8_t mv[256][2]
Definition: 4xm.c:81
put_sbits
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition: put_bits.h:291
MAX_RUN
#define MAX_RUN
Definition: rl.h:35
h263enc.h
ff_clean_h263_qscales
void ff_clean_h263_qscales(MPVEncContext *s)
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
CANDIDATE_MB_TYPE_INTER
#define CANDIDATE_MB_TYPE_INTER
Definition: mpegvideoenc.h:270
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:223
MAX_DMV
#define MAX_DMV
Definition: motion_est.h:39
internal.h
av_const
#define av_const
Definition: attributes.h:84
h263dsp.h
AVOption
AVOption.
Definition: opt.h:429
MB_TYPE_16x16
#define MB_TYPE_16x16
Definition: mpegutils.h:41
FFCodec
Definition: codec_internal.h:127
AV_WN32A
#define AV_WN32A(p, v)
Definition: intreadwrite.h:534
init_mv_penalty
static av_cold void init_mv_penalty(void)
Definition: ituh263enc.c:56
mpegvideo.h
mpegutils.h
MPVMainEncContext::encode_picture_header
int(* encode_picture_header)(struct MPVMainEncContext *m)
Definition: mpegvideoenc.h:227
FF_MPV_COMMON_MOTION_EST_OPTS
#define FF_MPV_COMMON_MOTION_EST_OPTS
Definition: mpegvideoenc.h:356
ff_mpv_encode_picture
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet)
Definition: mpegvideo_enc.c:1941
FF_MPV_COMMON_OPTS
#define FF_MPV_COMMON_OPTS
Definition: mpegvideoenc.h:315
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
ff_match_2uint16
int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
Definition: utils.c:830
ff_h263_pred_motion
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Definition: h263.c:182
wrap
#define wrap(func)
Definition: neontest.h:65
ff_h263_pixel_aspect
const AVRational ff_h263_pixel_aspect[16]
Definition: h263data.c:273
RLTable
RLTable.
Definition: rl.h:39
mv_penalty
static uint8_t mv_penalty[MAX_FCODE+1][MAX_DMV *2+1]
Table of number of bits a motion vector component needs.
Definition: ituh263enc.c:54
ff_h263_encode_init
void ff_h263_encode_init(MPVMainEncContext *m)
val
static double val(void *priv, double ch)
Definition: aeval.c:77
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
ff_h263_update_motion_val
void ff_h263_update_motion_val(MpegEncContext *s)
Definition: h263.c:56
AVRational::num
int num
Numerator.
Definition: rational.h:59
dquant_code
static const int dquant_code[5]
Definition: mpeg4videoenc.c:449
RLTable::n
int n
number of entries of table_vlc minus 1
Definition: rl.h:40
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
ff_h263_encode_motion
void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code)
Definition: ituh263enc.c:166
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
ff_h263_encode_gob_header
void ff_h263_encode_gob_header(MPVEncContext *s, int mb_line)
MAX_MV
#define MAX_MV
Definition: motion_est.h:37
ff_h263_chroma_qscale_table
const uint8_t ff_h263_chroma_qscale_table[32]
Definition: h263data.c:260
s
#define s(width, name)
Definition: cbs_vp9.c:198
get_rl_index
static int get_rl_index(const RLTable *rl, int last, int run, int level)
Definition: rl.h:101
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
bits
uint8_t bits
Definition: vp3data.h:128
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
UNI_MPEG4_ENC_INDEX
#define UNI_MPEG4_ENC_INDEX(last, run, level)
Definition: mpeg4videoenc.c:63
limits.h
FF_MPV_OFFSET
#define FF_MPV_OFFSET(x)
Definition: mpegvideoenc.h:311
ff_h263_get_mv_penalty
const av_cold uint8_t(* ff_h263_get_mv_penalty(void))[MAX_DMV *2+1]
Definition: ituh263enc.c:157
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
ff_h263_encode_mba
void ff_h263_encode_mba(MPVEncContext *s)
PutBitContext
Definition: put_bits.h:50
ff_rl_init
av_cold void ff_rl_init(RLTable *rl, uint8_t static_store[2][2 *MAX_RUN+MAX_LEVEL+3])
Initialize index_run, max_level and max_run from n, last, table_vlc, table_run and table_level.
Definition: rl.c:43
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
format
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
Definition: swscale-v2.txt:14
run
uint8_t run
Definition: svq3.c:207
RLTable::table_vlc
const uint16_t(* table_vlc)[2]
Definition: rl.h:42
tmp
static uint8_t tmp[20]
Definition: aes_ctr.c:47
ff_h263_init_rl_inter
void ff_h263_init_rl_inter(void)
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
MB_TYPE_8x8
#define MB_TYPE_8x8
Definition: mpegutils.h:44
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
mathops.h
ff_mba_max
const uint16_t ff_mba_max[6]
Definition: h263data.c:265
ff_mpv_encode_end
av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
Definition: mpegvideo_enc.c:1121
get_p_cbp
static int get_p_cbp(MPVEncContext *const s, int16_t block[6][64], int motion_x, int motion_y)
Definition: h263enc.h:46
MPVMainEncContext
Definition: mpegvideoenc.h:178
AVOnce
#define AVOnce
Definition: thread.h:202
index
int index
Definition: gxfenc.c:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
MV_TYPE_8X8
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
Definition: mpegvideo.h:186
MAX_LEVEL
#define MAX_LEVEL
Definition: rl.h:36
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
ff_h263_rl_inter
RLTable ff_h263_rl_inter
Definition: h263data.c:159
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
codec_internal.h
AV_CODEC_ID_H263
@ AV_CODEC_ID_H263
Definition: codec_id.h:56
put_bits_assume_flushed
static void put_bits_assume_flushed(const PutBitContext *s)
Inform the compiler that a PutBitContext is flushed (i.e.
Definition: put_bits.h:82
ff_h263_cbpy_tab
const uint8_t ff_h263_cbpy_tab[16][2]
Definition: h263data.c:82
ff_h263p_encoder
const FFCodec ff_h263p_encoder
ff_rl_intra_aic
RLTable ff_rl_intra_aic
Definition: h263data.c:228
ff_h263dsp_init
av_cold void ff_h263dsp_init(H263DSPContext *ctx)
Definition: h263dsp.c:117
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2594
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:99
attributes.h
ff_h263_inter_MCBPC_bits
const uint8_t ff_h263_inter_MCBPC_bits[28]
Definition: h263data.c:47
pred_dc
static void FUNC() pred_dc(uint8_t *_src, const uint8_t *_top, const uint8_t *_left, ptrdiff_t stride, int log2_size, int c_idx)
Definition: pred_template.c:391
CANDIDATE_MB_TYPE_INTER4V
#define CANDIDATE_MB_TYPE_INTER4V
Definition: mpegvideoenc.h:271
get_bits_diff
static int get_bits_diff(MPVEncContext *s)
Definition: mpegvideoenc.h:388
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
ff_h263_encoder
const FFCodec ff_h263_encoder
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
ff_h263_update_mb
void ff_h263_update_mb(MPVEncContext *s)
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
ff_h263_format
const uint16_t ff_h263_format[8][2]
Definition: h263data.c:236
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
ff_h263_aspect_to_info
av_const int ff_h263_aspect_to_info(AVRational aspect)
len
int len
Definition: vorbis_enc_data.h:426
ff_flv_encode_picture_header
int ff_flv_encode_picture_header(MPVMainEncContext *const m)
Definition: flvenc.c:27
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
avcodec.h
av_cmp_q
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition: rational.h:89
h263_encode_init_static
static av_cold void h263_encode_init_static(void)
Definition: ituh263enc.c:141
ff_h263_mpeg4_reset_dc
void ff_h263_mpeg4_reset_dc(MPVEncContext *s)
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
ff_aic_dc_scale_table
const uint8_t ff_aic_dc_scale_table[32]
Definition: h263data.c:245
ff_mvtab
const uint8_t ff_mvtab[33][2]
Definition: h263data.c:88
ff_h263_intra_MCBPC_bits
const uint8_t ff_h263_intra_MCBPC_bits[9]
Definition: h263data.c:33
OFFSET
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your see the OFFSET() macro
AV_CODEC_ID_H263P
@ AV_CODEC_ID_H263P
Definition: codec_id.h:71
ff_h263_intra_MCBPC_code
const uint8_t ff_h263_intra_MCBPC_code[9]
Definition: h263data.c:32
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:132
ff_mba_length
const uint8_t ff_mba_length[7]
Definition: h263data.c:269
flvenc.h
ff_h263_inter_MCBPC_code
const uint8_t ff_h263_inter_MCBPC_code[28]
Definition: h263data.c:38
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
ff_mpv_encode_init
av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
Definition: mpegvideo_enc.c:557
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:273
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
ff_h263_encode_motion_vector
static void ff_h263_encode_motion_vector(MPVEncContext *s, int x, int y, int f_code)
Definition: h263enc.h:39
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
VE
#define VE
Definition: amfenc_av1.c:30
AV_CODEC_ID_FLV1
@ AV_CODEC_ID_FLV1
Definition: codec_id.h:73
put_bits.h
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
MPVMainEncContext::s
MPVEncContext s
The main slicecontext.
Definition: mpegvideoenc.h:179
mb_info
Definition: cinepakenc.c:87
MB_TYPE_FORWARD_MV
#define MB_TYPE_FORWARD_MV
Definition: mpegutils.h:49
MB_TYPE_INTRA
#define MB_TYPE_INTRA
Definition: mpegutils.h:64
AV_CODEC_FLAG_PASS1
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:290
h263.h