FFmpeg
mpeg4videoenc.c
Go to the documentation of this file.
1 /*
2  * MPEG-4 encoder
3  * Copyright (c) 2000,2001 Fabrice Bellard
4  * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "libavutil/attributes.h"
24 #include "libavutil/log.h"
25 #include "libavutil/opt.h"
26 #include "mpegutils.h"
27 #include "mpegvideo.h"
28 #include "h263.h"
29 #include "mpeg4video.h"
30 #include "profiles.h"
31 
32 /* The uni_DCtab_* tables below contain unified bits+length tables to encode DC
33  * differences in MPEG-4. Unified in the sense that the specification specifies
34  * this encoding in several steps. */
37 static uint16_t uni_DCtab_lum_bits[512];
38 static uint16_t uni_DCtab_chrom_bits[512];
39 
40 /* Unified encoding tables for run length encoding of coefficients.
41  * Unified in the sense that the specification specifies the encoding in several steps. */
42 static uint32_t uni_mpeg4_intra_rl_bits[64 * 64 * 2 * 2];
43 static uint8_t uni_mpeg4_intra_rl_len[64 * 64 * 2 * 2];
44 static uint32_t uni_mpeg4_inter_rl_bits[64 * 64 * 2 * 2];
45 static uint8_t uni_mpeg4_inter_rl_len[64 * 64 * 2 * 2];
46 
47 //#define UNI_MPEG4_ENC_INDEX(last, run, level) ((last) * 128 + (run) * 256 + (level))
48 //#define UNI_MPEG4_ENC_INDEX(last, run, level) ((last) * 128 * 64 + (run) + (level) * 64)
49 #define UNI_MPEG4_ENC_INDEX(last, run, level) ((last) * 128 * 64 + (run) * 128 + (level))
50 
51 /* MPEG-4
52  * inter
53  * max level: 24/6
54  * max run: 53/63
55  *
56  * intra
57  * max level: 53/16
58  * max run: 29/41
59  */
60 
61 /**
62  * Return the number of bits that encoding the 8x8 block in block would need.
63  * @param[in] block_last_index last index in scantable order that refers to a non zero element in block.
64  */
65 static inline int get_block_rate(MpegEncContext *s, int16_t block[64],
66  int block_last_index, uint8_t scantable[64])
67 {
68  int last = 0;
69  int j;
70  int rate = 0;
71 
72  for (j = 1; j <= block_last_index; j++) {
73  const int index = scantable[j];
74  int level = block[index];
75  if (level) {
76  level += 64;
77  if ((level & (~127)) == 0) {
78  if (j < block_last_index)
79  rate += s->intra_ac_vlc_length[UNI_AC_ENC_INDEX(j - last - 1, level)];
80  else
81  rate += s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j - last - 1, level)];
82  } else
83  rate += s->ac_esc_length;
84 
85  last = j;
86  }
87  }
88 
89  return rate;
90 }
91 
92 /**
93  * Restore the ac coefficients in block that have been changed by decide_ac_pred().
94  * This function also restores s->block_last_index.
95  * @param[in,out] block MB coefficients, these will be restored
96  * @param[in] dir ac prediction direction for each 8x8 block
97  * @param[out] st scantable for each 8x8 block
98  * @param[in] zigzag_last_index index referring to the last non zero coefficient in zigzag order
99  */
100 static inline void restore_ac_coeffs(MpegEncContext *s, int16_t block[6][64],
101  const int dir[6], uint8_t *st[6],
102  const int zigzag_last_index[6])
103 {
104  int i, n;
105  memcpy(s->block_last_index, zigzag_last_index, sizeof(int) * 6);
106 
107  for (n = 0; n < 6; n++) {
108  int16_t *ac_val = &s->ac_val[0][0][0] + s->block_index[n] * 16;
109 
110  st[n] = s->intra_scantable.permutated;
111  if (dir[n]) {
112  /* top prediction */
113  for (i = 1; i < 8; i++)
114  block[n][s->idsp.idct_permutation[i]] = ac_val[i + 8];
115  } else {
116  /* left prediction */
117  for (i = 1; i < 8; i++)
118  block[n][s->idsp.idct_permutation[i << 3]] = ac_val[i];
119  }
120  }
121 }
122 
123 /**
124  * Return the optimal value (0 or 1) for the ac_pred element for the given MB in MPEG-4.
125  * This function will also update s->block_last_index and s->ac_val.
126  * @param[in,out] block MB coefficients, these will be updated if 1 is returned
127  * @param[in] dir ac prediction direction for each 8x8 block
128  * @param[out] st scantable for each 8x8 block
129  * @param[out] zigzag_last_index index referring to the last non zero coefficient in zigzag order
130  */
131 static inline int decide_ac_pred(MpegEncContext *s, int16_t block[6][64],
132  const int dir[6], uint8_t *st[6],
133  int zigzag_last_index[6])
134 {
135  int score = 0;
136  int i, n;
137  int8_t *const qscale_table = s->current_picture.qscale_table;
138 
139  memcpy(zigzag_last_index, s->block_last_index, sizeof(int) * 6);
140 
141  for (n = 0; n < 6; n++) {
142  int16_t *ac_val, *ac_val1;
143 
144  score -= get_block_rate(s, block[n], s->block_last_index[n],
145  s->intra_scantable.permutated);
146 
147  ac_val = &s->ac_val[0][0][0] + s->block_index[n] * 16;
148  ac_val1 = ac_val;
149  if (dir[n]) {
150  const int xy = s->mb_x + s->mb_y * s->mb_stride - s->mb_stride;
151  /* top prediction */
152  ac_val -= s->block_wrap[n] * 16;
153  if (s->mb_y == 0 || s->qscale == qscale_table[xy] || n == 2 || n == 3) {
154  /* same qscale */
155  for (i = 1; i < 8; i++) {
156  const int level = block[n][s->idsp.idct_permutation[i]];
157  block[n][s->idsp.idct_permutation[i]] = level - ac_val[i + 8];
158  ac_val1[i] = block[n][s->idsp.idct_permutation[i << 3]];
159  ac_val1[i + 8] = level;
160  }
161  } else {
162  /* different qscale, we must rescale */
163  for (i = 1; i < 8; i++) {
164  const int level = block[n][s->idsp.idct_permutation[i]];
165  block[n][s->idsp.idct_permutation[i]] = level - ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
166  ac_val1[i] = block[n][s->idsp.idct_permutation[i << 3]];
167  ac_val1[i + 8] = level;
168  }
169  }
170  st[n] = s->intra_h_scantable.permutated;
171  } else {
172  const int xy = s->mb_x - 1 + s->mb_y * s->mb_stride;
173  /* left prediction */
174  ac_val -= 16;
175  if (s->mb_x == 0 || s->qscale == qscale_table[xy] || n == 1 || n == 3) {
176  /* same qscale */
177  for (i = 1; i < 8; i++) {
178  const int level = block[n][s->idsp.idct_permutation[i << 3]];
179  block[n][s->idsp.idct_permutation[i << 3]] = level - ac_val[i];
180  ac_val1[i] = level;
181  ac_val1[i + 8] = block[n][s->idsp.idct_permutation[i]];
182  }
183  } else {
184  /* different qscale, we must rescale */
185  for (i = 1; i < 8; i++) {
186  const int level = block[n][s->idsp.idct_permutation[i << 3]];
187  block[n][s->idsp.idct_permutation[i << 3]] = level - ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
188  ac_val1[i] = level;
189  ac_val1[i + 8] = block[n][s->idsp.idct_permutation[i]];
190  }
191  }
192  st[n] = s->intra_v_scantable.permutated;
193  }
194 
195  for (i = 63; i > 0; i--) // FIXME optimize
196  if (block[n][st[n][i]])
197  break;
198  s->block_last_index[n] = i;
199 
200  score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
201  }
202 
203  if (score < 0) {
204  return 1;
205  } else {
206  restore_ac_coeffs(s, block, dir, st, zigzag_last_index);
207  return 0;
208  }
209 }
210 
211 /**
212  * modify mb_type & qscale so that encoding is actually possible in MPEG-4
213  */
215 {
216  int i;
217  int8_t *const qscale_table = s->current_picture.qscale_table;
218 
220 
221  if (s->pict_type == AV_PICTURE_TYPE_B) {
222  int odd = 0;
223  /* ok, come on, this isn't funny anymore, there's more code for
224  * handling this MPEG-4 mess than for the actual adaptive quantization */
225 
226  for (i = 0; i < s->mb_num; i++) {
227  int mb_xy = s->mb_index2xy[i];
228  odd += qscale_table[mb_xy] & 1;
229  }
230 
231  if (2 * odd > s->mb_num)
232  odd = 1;
233  else
234  odd = 0;
235 
236  for (i = 0; i < s->mb_num; i++) {
237  int mb_xy = s->mb_index2xy[i];
238  if ((qscale_table[mb_xy] & 1) != odd)
239  qscale_table[mb_xy]++;
240  if (qscale_table[mb_xy] > 31)
241  qscale_table[mb_xy] = 31;
242  }
243 
244  for (i = 1; i < s->mb_num; i++) {
245  int mb_xy = s->mb_index2xy[i];
246  if (qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i - 1]] &&
247  (s->mb_type[mb_xy] & CANDIDATE_MB_TYPE_DIRECT)) {
248  s->mb_type[mb_xy] |= CANDIDATE_MB_TYPE_BIDIR;
249  }
250  }
251  }
252 }
253 
254 /**
255  * Encode the dc value.
256  * @param n block index (0-3 are luma, 4-5 are chroma)
257  */
258 static inline void mpeg4_encode_dc(PutBitContext *s, int level, int n)
259 {
260  /* DC will overflow if level is outside the [-255,255] range. */
261  level += 256;
262  if (n < 4) {
263  /* luminance */
265  } else {
266  /* chrominance */
268  }
269 }
270 
271 static inline int mpeg4_get_dc_length(int level, int n)
272 {
273  if (n < 4)
274  return uni_DCtab_lum_len[level + 256];
275  else
276  return uni_DCtab_chrom_len[level + 256];
277 }
278 
279 /**
280  * Encode an 8x8 block.
281  * @param n block index (0-3 are luma, 4-5 are chroma)
282  */
283 static inline void mpeg4_encode_block(MpegEncContext *s,
284  int16_t *block, int n, int intra_dc,
285  uint8_t *scan_table, PutBitContext *dc_pb,
286  PutBitContext *ac_pb)
287 {
288  int i, last_non_zero;
289  uint32_t *bits_tab;
290  uint8_t *len_tab;
291  const int last_index = s->block_last_index[n];
292 
293  if (s->mb_intra) { // Note gcc (3.2.1 at least) will optimize this away
294  /* MPEG-4 based DC predictor */
295  mpeg4_encode_dc(dc_pb, intra_dc, n);
296  if (last_index < 1)
297  return;
298  i = 1;
299  bits_tab = uni_mpeg4_intra_rl_bits;
300  len_tab = uni_mpeg4_intra_rl_len;
301  } else {
302  if (last_index < 0)
303  return;
304  i = 0;
305  bits_tab = uni_mpeg4_inter_rl_bits;
306  len_tab = uni_mpeg4_inter_rl_len;
307  }
308 
309  /* AC coefs */
310  last_non_zero = i - 1;
311  for (; i < last_index; i++) {
312  int level = block[scan_table[i]];
313  if (level) {
314  int run = i - last_non_zero - 1;
315  level += 64;
316  if ((level & (~127)) == 0) {
317  const int index = UNI_MPEG4_ENC_INDEX(0, run, level);
318  put_bits(ac_pb, len_tab[index], bits_tab[index]);
319  } else { // ESC3
320  put_bits(ac_pb,
321  7 + 2 + 1 + 6 + 1 + 12 + 1,
322  (3 << 23) + (3 << 21) + (0 << 20) + (run << 14) +
323  (1 << 13) + (((level - 64) & 0xfff) << 1) + 1);
324  }
325  last_non_zero = i;
326  }
327  }
328  /* if (i <= last_index) */ {
329  int level = block[scan_table[i]];
330  int run = i - last_non_zero - 1;
331  level += 64;
332  if ((level & (~127)) == 0) {
333  const int index = UNI_MPEG4_ENC_INDEX(1, run, level);
334  put_bits(ac_pb, len_tab[index], bits_tab[index]);
335  } else { // ESC3
336  put_bits(ac_pb,
337  7 + 2 + 1 + 6 + 1 + 12 + 1,
338  (3 << 23) + (3 << 21) + (1 << 20) + (run << 14) +
339  (1 << 13) + (((level - 64) & 0xfff) << 1) + 1);
340  }
341  }
342 }
343 
345  int16_t *block, int n,
346  int intra_dc, uint8_t *scan_table)
347 {
348  int i, last_non_zero;
349  uint8_t *len_tab;
350  const int last_index = s->block_last_index[n];
351  int len = 0;
352 
353  if (s->mb_intra) { // Note gcc (3.2.1 at least) will optimize this away
354  /* MPEG-4 based DC predictor */
355  len += mpeg4_get_dc_length(intra_dc, n);
356  if (last_index < 1)
357  return len;
358  i = 1;
359  len_tab = uni_mpeg4_intra_rl_len;
360  } else {
361  if (last_index < 0)
362  return 0;
363  i = 0;
364  len_tab = uni_mpeg4_inter_rl_len;
365  }
366 
367  /* AC coefs */
368  last_non_zero = i - 1;
369  for (; i < last_index; i++) {
370  int level = block[scan_table[i]];
371  if (level) {
372  int run = i - last_non_zero - 1;
373  level += 64;
374  if ((level & (~127)) == 0) {
375  const int index = UNI_MPEG4_ENC_INDEX(0, run, level);
376  len += len_tab[index];
377  } else { // ESC3
378  len += 7 + 2 + 1 + 6 + 1 + 12 + 1;
379  }
380  last_non_zero = i;
381  }
382  }
383  /* if (i <= last_index) */ {
384  int level = block[scan_table[i]];
385  int run = i - last_non_zero - 1;
386  level += 64;
387  if ((level & (~127)) == 0) {
388  const int index = UNI_MPEG4_ENC_INDEX(1, run, level);
389  len += len_tab[index];
390  } else { // ESC3
391  len += 7 + 2 + 1 + 6 + 1 + 12 + 1;
392  }
393  }
394 
395  return len;
396 }
397 
398 static inline void mpeg4_encode_blocks(MpegEncContext *s, int16_t block[6][64],
399  int intra_dc[6], uint8_t **scan_table,
400  PutBitContext *dc_pb,
401  PutBitContext *ac_pb)
402 {
403  int i;
404 
405  if (scan_table) {
406  if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT) {
407  for (i = 0; i < 6; i++)
408  skip_put_bits(&s->pb,
410  intra_dc[i], scan_table[i]));
411  } else {
412  /* encode each block */
413  for (i = 0; i < 6; i++)
415  intra_dc[i], scan_table[i], dc_pb, ac_pb);
416  }
417  } else {
418  if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT) {
419  for (i = 0; i < 6; i++)
420  skip_put_bits(&s->pb,
422  s->intra_scantable.permutated));
423  } else {
424  /* encode each block */
425  for (i = 0; i < 6; i++)
426  mpeg4_encode_block(s, block[i], i, 0,
427  s->intra_scantable.permutated, dc_pb, ac_pb);
428  }
429  }
430 }
431 
432 static inline int get_b_cbp(MpegEncContext *s, int16_t block[6][64],
433  int motion_x, int motion_y, int mb_type)
434 {
435  int cbp = 0, i;
436 
437  if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
438  int score = 0;
439  const int lambda = s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
440 
441  for (i = 0; i < 6; i++) {
442  if (s->coded_score[i] < 0) {
443  score += s->coded_score[i];
444  cbp |= 1 << (5 - i);
445  }
446  }
447 
448  if (cbp) {
449  int zero_score = -6;
450  if ((motion_x | motion_y | s->dquant | mb_type) == 0)
451  zero_score -= 4; // 2 * MV + mb_type + cbp bit
452 
453  zero_score *= lambda;
454  if (zero_score <= score)
455  cbp = 0;
456  }
457 
458  for (i = 0; i < 6; i++) {
459  if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i)) & 1) == 0) {
460  s->block_last_index[i] = -1;
461  s->bdsp.clear_block(s->block[i]);
462  }
463  }
464  } else {
465  for (i = 0; i < 6; i++) {
466  if (s->block_last_index[i] >= 0)
467  cbp |= 1 << (5 - i);
468  }
469  }
470  return cbp;
471 }
472 
473 // FIXME this is duplicated to h263.c
474 static const int dquant_code[5] = { 1, 0, 9, 2, 3 };
475 
476 void ff_mpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64],
477  int motion_x, int motion_y)
478 {
479  int cbpc, cbpy, pred_x, pred_y;
480  PutBitContext *const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
481  PutBitContext *const tex_pb = s->data_partitioning && s->pict_type != AV_PICTURE_TYPE_B ? &s->tex_pb : &s->pb;
482  PutBitContext *const dc_pb = s->data_partitioning && s->pict_type != AV_PICTURE_TYPE_I ? &s->pb2 : &s->pb;
483  const int interleaved_stats = (s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
484 
485  if (!s->mb_intra) {
486  int i, cbp;
487 
488  if (s->pict_type == AV_PICTURE_TYPE_B) {
489  /* convert from mv_dir to type */
490  static const int mb_type_table[8] = { -1, 3, 2, 1, -1, -1, -1, 0 };
491  int mb_type = mb_type_table[s->mv_dir];
492 
493  if (s->mb_x == 0) {
494  for (i = 0; i < 2; i++)
495  s->last_mv[i][0][0] =
496  s->last_mv[i][0][1] =
497  s->last_mv[i][1][0] =
498  s->last_mv[i][1][1] = 0;
499  }
500 
501  av_assert2(s->dquant >= -2 && s->dquant <= 2);
502  av_assert2((s->dquant & 1) == 0);
503  av_assert2(mb_type >= 0);
504 
505  /* nothing to do if this MB was skipped in the next P-frame */
506  if (s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]) { // FIXME avoid DCT & ...
507  s->skip_count++;
508  s->mv[0][0][0] =
509  s->mv[0][0][1] =
510  s->mv[1][0][0] =
511  s->mv[1][0][1] = 0;
512  s->mv_dir = MV_DIR_FORWARD; // doesn't matter
513  s->qscale -= s->dquant;
514 // s->mb_skipped = 1;
515 
516  return;
517  }
518 
519  cbp = get_b_cbp(s, block, motion_x, motion_y, mb_type);
520 
521  if ((cbp | motion_x | motion_y | mb_type) == 0) {
522  /* direct MB with MV={0,0} */
523  av_assert2(s->dquant == 0);
524 
525  put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
526 
527  if (interleaved_stats) {
528  s->misc_bits++;
529  s->last_bits++;
530  }
531  s->skip_count++;
532  return;
533  }
534 
535  put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
536  put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ // FIXME merge
537  put_bits(&s->pb, mb_type + 1, 1); // this table is so simple that we don't need it :)
538  if (cbp)
539  put_bits(&s->pb, 6, cbp);
540 
541  if (cbp && mb_type) {
542  if (s->dquant)
543  put_bits(&s->pb, 2, (s->dquant >> 2) + 3);
544  else
545  put_bits(&s->pb, 1, 0);
546  } else
547  s->qscale -= s->dquant;
548 
549  if (!s->progressive_sequence) {
550  if (cbp)
551  put_bits(&s->pb, 1, s->interlaced_dct);
552  if (mb_type) // not direct mode
553  put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
554  }
555 
556  if (interleaved_stats)
557  s->misc_bits += get_bits_diff(s);
558 
559  if (!mb_type) {
560  av_assert2(s->mv_dir & MV_DIRECT);
561  ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
562  s->b_count++;
563  s->f_count++;
564  } else {
565  av_assert2(mb_type > 0 && mb_type < 4);
566  if (s->mv_type != MV_TYPE_FIELD) {
567  if (s->mv_dir & MV_DIR_FORWARD) {
569  s->mv[0][0][0] - s->last_mv[0][0][0],
570  s->mv[0][0][1] - s->last_mv[0][0][1],
571  s->f_code);
572  s->last_mv[0][0][0] =
573  s->last_mv[0][1][0] = s->mv[0][0][0];
574  s->last_mv[0][0][1] =
575  s->last_mv[0][1][1] = s->mv[0][0][1];
576  s->f_count++;
577  }
578  if (s->mv_dir & MV_DIR_BACKWARD) {
580  s->mv[1][0][0] - s->last_mv[1][0][0],
581  s->mv[1][0][1] - s->last_mv[1][0][1],
582  s->b_code);
583  s->last_mv[1][0][0] =
584  s->last_mv[1][1][0] = s->mv[1][0][0];
585  s->last_mv[1][0][1] =
586  s->last_mv[1][1][1] = s->mv[1][0][1];
587  s->b_count++;
588  }
589  } else {
590  if (s->mv_dir & MV_DIR_FORWARD) {
591  put_bits(&s->pb, 1, s->field_select[0][0]);
592  put_bits(&s->pb, 1, s->field_select[0][1]);
593  }
594  if (s->mv_dir & MV_DIR_BACKWARD) {
595  put_bits(&s->pb, 1, s->field_select[1][0]);
596  put_bits(&s->pb, 1, s->field_select[1][1]);
597  }
598  if (s->mv_dir & MV_DIR_FORWARD) {
599  for (i = 0; i < 2; i++) {
601  s->mv[0][i][0] - s->last_mv[0][i][0],
602  s->mv[0][i][1] - s->last_mv[0][i][1] / 2,
603  s->f_code);
604  s->last_mv[0][i][0] = s->mv[0][i][0];
605  s->last_mv[0][i][1] = s->mv[0][i][1] * 2;
606  }
607  s->f_count++;
608  }
609  if (s->mv_dir & MV_DIR_BACKWARD) {
610  for (i = 0; i < 2; i++) {
612  s->mv[1][i][0] - s->last_mv[1][i][0],
613  s->mv[1][i][1] - s->last_mv[1][i][1] / 2,
614  s->b_code);
615  s->last_mv[1][i][0] = s->mv[1][i][0];
616  s->last_mv[1][i][1] = s->mv[1][i][1] * 2;
617  }
618  s->b_count++;
619  }
620  }
621  }
622 
623  if (interleaved_stats)
624  s->mv_bits += get_bits_diff(s);
625 
627 
628  if (interleaved_stats)
629  s->p_tex_bits += get_bits_diff(s);
630  } else { /* s->pict_type==AV_PICTURE_TYPE_B */
631  cbp = get_p_cbp(s, block, motion_x, motion_y);
632 
633  if ((cbp | motion_x | motion_y | s->dquant) == 0 &&
634  s->mv_type == MV_TYPE_16X16) {
635  /* Check if the B-frames can skip it too, as we must skip it
636  * if we skip here why didn't they just compress
637  * the skip-mb bits instead of reusing them ?! */
638  if (s->max_b_frames > 0) {
639  int i;
640  int x, y, offset;
641  uint8_t *p_pic;
642 
643  x = s->mb_x * 16;
644  y = s->mb_y * 16;
645 
646  offset = x + y * s->linesize;
647  p_pic = s->new_picture.f->data[0] + offset;
648 
649  s->mb_skipped = 1;
650  for (i = 0; i < s->max_b_frames; i++) {
651  uint8_t *b_pic;
652  int diff;
653  Picture *pic = s->reordered_input_picture[i + 1];
654 
655  if (!pic || pic->f->pict_type != AV_PICTURE_TYPE_B)
656  break;
657 
658  b_pic = pic->f->data[0] + offset;
659  if (!pic->shared)
660  b_pic += INPLACE_OFFSET;
661 
662  if (x + 16 > s->width || y + 16 > s->height) {
663  int x1, y1;
664  int xe = FFMIN(16, s->width - x);
665  int ye = FFMIN(16, s->height - y);
666  diff = 0;
667  for (y1 = 0; y1 < ye; y1++) {
668  for (x1 = 0; x1 < xe; x1++) {
669  diff += FFABS(p_pic[x1 + y1 * s->linesize] - b_pic[x1 + y1 * s->linesize]);
670  }
671  }
672  diff = diff * 256 / (xe * ye);
673  } else {
674  diff = s->mecc.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
675  }
676  if (diff > s->qscale * 70) { // FIXME check that 70 is optimal
677  s->mb_skipped = 0;
678  break;
679  }
680  }
681  } else
682  s->mb_skipped = 1;
683 
684  if (s->mb_skipped == 1) {
685  /* skip macroblock */
686  put_bits(&s->pb, 1, 1);
687 
688  if (interleaved_stats) {
689  s->misc_bits++;
690  s->last_bits++;
691  }
692  s->skip_count++;
693 
694  return;
695  }
696  }
697 
698  put_bits(&s->pb, 1, 0); /* mb coded */
699  cbpc = cbp & 3;
700  cbpy = cbp >> 2;
701  cbpy ^= 0xf;
702  if (s->mv_type == MV_TYPE_16X16) {
703  if (s->dquant)
704  cbpc += 8;
705  put_bits(&s->pb,
708 
709  put_bits(pb2, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
710  if (s->dquant)
711  put_bits(pb2, 2, dquant_code[s->dquant + 2]);
712 
713  if (!s->progressive_sequence) {
714  if (cbp)
715  put_bits(pb2, 1, s->interlaced_dct);
716  put_bits(pb2, 1, 0);
717  }
718 
719  if (interleaved_stats)
720  s->misc_bits += get_bits_diff(s);
721 
722  /* motion vectors: 16x16 mode */
723  ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
724 
726  motion_x - pred_x,
727  motion_y - pred_y,
728  s->f_code);
729  } else if (s->mv_type == MV_TYPE_FIELD) {
730  if (s->dquant)
731  cbpc += 8;
732  put_bits(&s->pb,
735 
736  put_bits(pb2, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
737  if (s->dquant)
738  put_bits(pb2, 2, dquant_code[s->dquant + 2]);
739 
740  av_assert2(!s->progressive_sequence);
741  if (cbp)
742  put_bits(pb2, 1, s->interlaced_dct);
743  put_bits(pb2, 1, 1);
744 
745  if (interleaved_stats)
746  s->misc_bits += get_bits_diff(s);
747 
748  /* motion vectors: 16x8 interlaced mode */
749  ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
750  pred_y /= 2;
751 
752  put_bits(&s->pb, 1, s->field_select[0][0]);
753  put_bits(&s->pb, 1, s->field_select[0][1]);
754 
756  s->mv[0][0][0] - pred_x,
757  s->mv[0][0][1] - pred_y,
758  s->f_code);
760  s->mv[0][1][0] - pred_x,
761  s->mv[0][1][1] - pred_y,
762  s->f_code);
763  } else {
764  av_assert2(s->mv_type == MV_TYPE_8X8);
765  put_bits(&s->pb,
766  ff_h263_inter_MCBPC_bits[cbpc + 16],
767  ff_h263_inter_MCBPC_code[cbpc + 16]);
768  put_bits(pb2, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
769 
770  if (!s->progressive_sequence && cbp)
771  put_bits(pb2, 1, s->interlaced_dct);
772 
773  if (interleaved_stats)
774  s->misc_bits += get_bits_diff(s);
775 
776  for (i = 0; i < 4; i++) {
777  /* motion vectors: 8x8 mode*/
778  ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
779 
781  s->current_picture.motion_val[0][s->block_index[i]][0] - pred_x,
782  s->current_picture.motion_val[0][s->block_index[i]][1] - pred_y,
783  s->f_code);
784  }
785  }
786 
787  if (interleaved_stats)
788  s->mv_bits += get_bits_diff(s);
789 
790  mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
791 
792  if (interleaved_stats)
793  s->p_tex_bits += get_bits_diff(s);
794 
795  s->f_count++;
796  }
797  } else {
798  int cbp;
799  int dc_diff[6]; // dc values with the dc prediction subtracted
800  int dir[6]; // prediction direction
801  int zigzag_last_index[6];
802  uint8_t *scan_table[6];
803  int i;
804 
805  for (i = 0; i < 6; i++)
806  dc_diff[i] = ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
807 
808  if (s->avctx->flags & AV_CODEC_FLAG_AC_PRED) {
809  s->ac_pred = decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
810  } else {
811  for (i = 0; i < 6; i++)
812  scan_table[i] = s->intra_scantable.permutated;
813  }
814 
815  /* compute cbp */
816  cbp = 0;
817  for (i = 0; i < 6; i++)
818  if (s->block_last_index[i] >= 1)
819  cbp |= 1 << (5 - i);
820 
821  cbpc = cbp & 3;
822  if (s->pict_type == AV_PICTURE_TYPE_I) {
823  if (s->dquant)
824  cbpc += 4;
825  put_bits(&s->pb,
828  } else {
829  if (s->dquant)
830  cbpc += 8;
831  put_bits(&s->pb, 1, 0); /* mb coded */
832  put_bits(&s->pb,
833  ff_h263_inter_MCBPC_bits[cbpc + 4],
834  ff_h263_inter_MCBPC_code[cbpc + 4]);
835  }
836  put_bits(pb2, 1, s->ac_pred);
837  cbpy = cbp >> 2;
838  put_bits(pb2, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
839  if (s->dquant)
840  put_bits(dc_pb, 2, dquant_code[s->dquant + 2]);
841 
842  if (!s->progressive_sequence)
843  put_bits(dc_pb, 1, s->interlaced_dct);
844 
845  if (interleaved_stats)
846  s->misc_bits += get_bits_diff(s);
847 
848  mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
849 
850  if (interleaved_stats)
851  s->i_tex_bits += get_bits_diff(s);
852  s->i_count++;
853 
854  /* restore ac coeffs & last_index stuff
855  * if we messed them up with the prediction */
856  if (s->ac_pred)
857  restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
858  }
859 }
860 
861 /**
862  * add MPEG-4 stuffing bits (01...1)
863  */
865 {
866  int length;
867  put_bits(pbc, 1, 0);
868  length = (-put_bits_count(pbc)) & 7;
869  if (length)
870  put_bits(pbc, length, (1 << length) - 1);
871 }
872 
873 /* must be called before writing the header */
875 {
876  if (s->pict_type == AV_PICTURE_TYPE_B) {
878  } else {
879  s->last_time_base = s->time_base;
880  s->time_base = FFUDIV(s->time, s->avctx->time_base.den);
881  }
882 }
883 
885 {
886  int64_t hours, minutes, seconds;
887  int64_t time;
888 
889  put_bits(&s->pb, 16, 0);
890  put_bits(&s->pb, 16, GOP_STARTCODE);
891 
892  time = s->current_picture_ptr->f->pts;
893  if (s->reordered_input_picture[1])
894  time = FFMIN(time, s->reordered_input_picture[1]->f->pts);
895  time = time * s->avctx->time_base.num;
896  s->last_time_base = FFUDIV(time, s->avctx->time_base.den);
897 
898  seconds = FFUDIV(time, s->avctx->time_base.den);
899  minutes = FFUDIV(seconds, 60); seconds = FFUMOD(seconds, 60);
900  hours = FFUDIV(minutes, 60); minutes = FFUMOD(minutes, 60);
901  hours = FFUMOD(hours , 24);
902 
903  put_bits(&s->pb, 5, hours);
904  put_bits(&s->pb, 6, minutes);
905  put_bits(&s->pb, 1, 1);
906  put_bits(&s->pb, 6, seconds);
907 
908  put_bits(&s->pb, 1, !!(s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP));
909  put_bits(&s->pb, 1, 0); // broken link == NO
910 
911  ff_mpeg4_stuffing(&s->pb);
912 }
913 
915 {
916  int profile_and_level_indication;
917  int vo_ver_id;
918 
919  if (s->avctx->profile != FF_PROFILE_UNKNOWN) {
920  profile_and_level_indication = s->avctx->profile << 4;
921  } else if (s->max_b_frames || s->quarter_sample) {
922  profile_and_level_indication = 0xF0; // adv simple
923  } else {
924  profile_and_level_indication = 0x00; // simple
925  }
926 
927  if (s->avctx->level != FF_LEVEL_UNKNOWN)
928  profile_and_level_indication |= s->avctx->level;
929  else
930  profile_and_level_indication |= 1; // level 1
931 
932  if (profile_and_level_indication >> 4 == 0xF)
933  vo_ver_id = 5;
934  else
935  vo_ver_id = 1;
936 
937  // FIXME levels
938 
939  put_bits(&s->pb, 16, 0);
940  put_bits(&s->pb, 16, VOS_STARTCODE);
941 
942  put_bits(&s->pb, 8, profile_and_level_indication);
943 
944  put_bits(&s->pb, 16, 0);
945  put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
946 
947  put_bits(&s->pb, 1, 1);
948  put_bits(&s->pb, 4, vo_ver_id);
949  put_bits(&s->pb, 3, 1); // priority
950 
951  put_bits(&s->pb, 4, 1); // visual obj type== video obj
952 
953  put_bits(&s->pb, 1, 0); // video signal type == no clue // FIXME
954 
955  ff_mpeg4_stuffing(&s->pb);
956 }
957 
959  int vo_number,
960  int vol_number)
961 {
962  int vo_ver_id;
963 
964  if (!CONFIG_MPEG4_ENCODER)
965  return;
966 
967  if (s->max_b_frames || s->quarter_sample) {
968  vo_ver_id = 5;
969  s->vo_type = ADV_SIMPLE_VO_TYPE;
970  } else {
971  vo_ver_id = 1;
972  s->vo_type = SIMPLE_VO_TYPE;
973  }
974 
975  put_bits(&s->pb, 16, 0);
976  put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
977  put_bits(&s->pb, 16, 0);
978  put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
979 
980  put_bits(&s->pb, 1, 0); /* random access vol */
981  put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
982  if (s->workaround_bugs & FF_BUG_MS) {
983  put_bits(&s->pb, 1, 0); /* is obj layer id= no */
984  } else {
985  put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
986  put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
987  put_bits(&s->pb, 3, 1); /* is obj layer priority */
988  }
989 
990  s->aspect_ratio_info = ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio);
991 
992  put_bits(&s->pb, 4, s->aspect_ratio_info); /* aspect ratio info */
993  if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
994  av_reduce(&s->avctx->sample_aspect_ratio.num, &s->avctx->sample_aspect_ratio.den,
995  s->avctx->sample_aspect_ratio.num, s->avctx->sample_aspect_ratio.den, 255);
996  put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
997  put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
998  }
999 
1000  if (s->workaround_bugs & FF_BUG_MS) {
1001  put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
1002  } else {
1003  put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1004  put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1005  put_bits(&s->pb, 1, s->low_delay);
1006  put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1007  }
1008 
1009  put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1010  put_bits(&s->pb, 1, 1); /* marker bit */
1011 
1012  put_bits(&s->pb, 16, s->avctx->time_base.den);
1013  if (s->time_increment_bits < 1)
1014  s->time_increment_bits = 1;
1015  put_bits(&s->pb, 1, 1); /* marker bit */
1016  put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1017  put_bits(&s->pb, 1, 1); /* marker bit */
1018  put_bits(&s->pb, 13, s->width); /* vol width */
1019  put_bits(&s->pb, 1, 1); /* marker bit */
1020  put_bits(&s->pb, 13, s->height); /* vol height */
1021  put_bits(&s->pb, 1, 1); /* marker bit */
1022  put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1023  put_bits(&s->pb, 1, 1); /* obmc disable */
1024  if (vo_ver_id == 1)
1025  put_bits(&s->pb, 1, 0); /* sprite enable */
1026  else
1027  put_bits(&s->pb, 2, 0); /* sprite enable */
1028 
1029  put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1030  put_bits(&s->pb, 1, s->mpeg_quant); /* quant type = (0 = H.263 style) */
1031 
1032  if (s->mpeg_quant) {
1033  ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
1034  ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
1035  }
1036 
1037  if (vo_ver_id != 1)
1038  put_bits(&s->pb, 1, s->quarter_sample);
1039  put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1040  put_bits(&s->pb, 1, s->rtp_mode ? 0 : 1); /* resync marker disable */
1041  put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1042  if (s->data_partitioning)
1043  put_bits(&s->pb, 1, 0); /* no rvlc */
1044 
1045  if (vo_ver_id != 1) {
1046  put_bits(&s->pb, 1, 0); /* newpred */
1047  put_bits(&s->pb, 1, 0); /* reduced res vop */
1048  }
1049  put_bits(&s->pb, 1, 0); /* scalability */
1050 
1051  ff_mpeg4_stuffing(&s->pb);
1052 
1053  /* user data */
1054  if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT)) {
1055  put_bits(&s->pb, 16, 0);
1056  put_bits(&s->pb, 16, 0x1B2); /* user_data */
1058  }
1059 }
1060 
1061 /* write MPEG-4 VOP header */
1063 {
1064  uint64_t time_incr;
1065  int64_t time_div, time_mod;
1066 
1067  if (s->pict_type == AV_PICTURE_TYPE_I) {
1068  if (!(s->avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)) {
1069  if (s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) // HACK, the reference sw is buggy
1071  if (s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number == 0) // HACK, the reference sw is buggy
1072  mpeg4_encode_vol_header(s, 0, 0);
1073  }
1074  if (!(s->workaround_bugs & FF_BUG_MS))
1076  }
1077 
1078  s->partitioned_frame = s->data_partitioning && s->pict_type != AV_PICTURE_TYPE_B;
1079 
1080  put_bits(&s->pb, 16, 0); /* vop header */
1081  put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
1082  put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1083 
1084  time_div = FFUDIV(s->time, s->avctx->time_base.den);
1085  time_mod = FFUMOD(s->time, s->avctx->time_base.den);
1086  time_incr = time_div - s->last_time_base;
1087 
1088  // This limits the frame duration to max 1 hour
1089  if (time_incr > 3600) {
1090  av_log(s->avctx, AV_LOG_ERROR, "time_incr %"PRIu64" too large\n", time_incr);
1091  return AVERROR(EINVAL);
1092  }
1093  while (time_incr--)
1094  put_bits(&s->pb, 1, 1);
1095 
1096  put_bits(&s->pb, 1, 0);
1097 
1098  put_bits(&s->pb, 1, 1); /* marker */
1099  put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1100  put_bits(&s->pb, 1, 1); /* marker */
1101  put_bits(&s->pb, 1, 1); /* vop coded */
1102  if (s->pict_type == AV_PICTURE_TYPE_P) {
1103  put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1104  }
1105  put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1106  if (!s->progressive_sequence) {
1107  put_bits(&s->pb, 1, s->current_picture_ptr->f->top_field_first);
1108  put_bits(&s->pb, 1, s->alternate_scan);
1109  }
1110  // FIXME sprite stuff
1111 
1112  put_bits(&s->pb, 5, s->qscale);
1113 
1114  if (s->pict_type != AV_PICTURE_TYPE_I)
1115  put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1116  if (s->pict_type == AV_PICTURE_TYPE_B)
1117  put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1118 
1119  return 0;
1120 }
1121 
1122 static av_cold void init_uni_dc_tab(void)
1123 {
1124  int level, uni_code, uni_len;
1125 
1126  for (level = -256; level < 256; level++) {
1127  int size, v, l;
1128  /* find number of bits */
1129  size = 0;
1130  v = abs(level);
1131  while (v) {
1132  v >>= 1;
1133  size++;
1134  }
1135 
1136  if (level < 0)
1137  l = (-level) ^ ((1 << size) - 1);
1138  else
1139  l = level;
1140 
1141  /* luminance */
1142  uni_code = ff_mpeg4_DCtab_lum[size][0];
1143  uni_len = ff_mpeg4_DCtab_lum[size][1];
1144 
1145  if (size > 0) {
1146  uni_code <<= size;
1147  uni_code |= l;
1148  uni_len += size;
1149  if (size > 8) {
1150  uni_code <<= 1;
1151  uni_code |= 1;
1152  uni_len++;
1153  }
1154  }
1155  uni_DCtab_lum_bits[level + 256] = uni_code;
1156  uni_DCtab_lum_len[level + 256] = uni_len;
1157 
1158  /* chrominance */
1159  uni_code = ff_mpeg4_DCtab_chrom[size][0];
1160  uni_len = ff_mpeg4_DCtab_chrom[size][1];
1161 
1162  if (size > 0) {
1163  uni_code <<= size;
1164  uni_code |= l;
1165  uni_len += size;
1166  if (size > 8) {
1167  uni_code <<= 1;
1168  uni_code |= 1;
1169  uni_len++;
1170  }
1171  }
1172  uni_DCtab_chrom_bits[level + 256] = uni_code;
1173  uni_DCtab_chrom_len[level + 256] = uni_len;
1174  }
1175 }
1176 
1177 static av_cold void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab,
1178  uint8_t *len_tab)
1179 {
1180  int slevel, run, last;
1181 
1182  av_assert0(MAX_LEVEL >= 64);
1183  av_assert0(MAX_RUN >= 63);
1184 
1185  for (slevel = -64; slevel < 64; slevel++) {
1186  if (slevel == 0)
1187  continue;
1188  for (run = 0; run < 64; run++) {
1189  for (last = 0; last <= 1; last++) {
1190  const int index = UNI_MPEG4_ENC_INDEX(last, run, slevel + 64);
1191  int level = slevel < 0 ? -slevel : slevel;
1192  int sign = slevel < 0 ? 1 : 0;
1193  int bits, len, code;
1194  int level1, run1;
1195 
1196  len_tab[index] = 100;
1197 
1198  /* ESC0 */
1199  code = get_rl_index(rl, last, run, level);
1200  bits = rl->table_vlc[code][0];
1201  len = rl->table_vlc[code][1];
1202  bits = bits * 2 + sign;
1203  len++;
1204 
1205  if (code != rl->n && len < len_tab[index]) {
1206  bits_tab[index] = bits;
1207  len_tab[index] = len;
1208  }
1209  /* ESC1 */
1210  bits = rl->table_vlc[rl->n][0];
1211  len = rl->table_vlc[rl->n][1];
1212  bits = bits * 2;
1213  len++; // esc1
1214  level1 = level - rl->max_level[last][run];
1215  if (level1 > 0) {
1216  code = get_rl_index(rl, last, run, level1);
1217  bits <<= rl->table_vlc[code][1];
1218  len += rl->table_vlc[code][1];
1219  bits += rl->table_vlc[code][0];
1220  bits = bits * 2 + sign;
1221  len++;
1222 
1223  if (code != rl->n && len < len_tab[index]) {
1224  bits_tab[index] = bits;
1225  len_tab[index] = len;
1226  }
1227  }
1228  /* ESC2 */
1229  bits = rl->table_vlc[rl->n][0];
1230  len = rl->table_vlc[rl->n][1];
1231  bits = bits * 4 + 2;
1232  len += 2; // esc2
1233  run1 = run - rl->max_run[last][level] - 1;
1234  if (run1 >= 0) {
1235  code = get_rl_index(rl, last, run1, level);
1236  bits <<= rl->table_vlc[code][1];
1237  len += rl->table_vlc[code][1];
1238  bits += rl->table_vlc[code][0];
1239  bits = bits * 2 + sign;
1240  len++;
1241 
1242  if (code != rl->n && len < len_tab[index]) {
1243  bits_tab[index] = bits;
1244  len_tab[index] = len;
1245  }
1246  }
1247  /* ESC3 */
1248  bits = rl->table_vlc[rl->n][0];
1249  len = rl->table_vlc[rl->n][1];
1250  bits = bits * 4 + 3;
1251  len += 2; // esc3
1252  bits = bits * 2 + last;
1253  len++;
1254  bits = bits * 64 + run;
1255  len += 6;
1256  bits = bits * 2 + 1;
1257  len++; // marker
1258  bits = bits * 4096 + (slevel & 0xfff);
1259  len += 12;
1260  bits = bits * 2 + 1;
1261  len++; // marker
1262 
1263  if (len < len_tab[index]) {
1264  bits_tab[index] = bits;
1265  len_tab[index] = len;
1266  }
1267  }
1268  }
1269  }
1270 }
1271 
1273 {
1274  MpegEncContext *s = avctx->priv_data;
1275  int ret;
1276  static int done = 0;
1277 
1278  if (avctx->width >= (1<<13) || avctx->height >= (1<<13)) {
1279  av_log(avctx, AV_LOG_ERROR, "dimensions too large for MPEG-4\n");
1280  return AVERROR(EINVAL);
1281  }
1282 
1283  if ((ret = ff_mpv_encode_init(avctx)) < 0)
1284  return ret;
1285 
1286  if (!done) {
1287  done = 1;
1288 
1289  init_uni_dc_tab();
1290 
1292 
1295  }
1296 
1297  s->min_qcoeff = -2048;
1298  s->max_qcoeff = 2047;
1299  s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1300  s->intra_ac_vlc_last_length = uni_mpeg4_intra_rl_len + 128 * 64;
1301  s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1302  s->inter_ac_vlc_last_length = uni_mpeg4_inter_rl_len + 128 * 64;
1303  s->luma_dc_vlc_length = uni_DCtab_lum_len;
1304  s->ac_esc_length = 7 + 2 + 1 + 6 + 1 + 12 + 1;
1305  s->y_dc_scale_table = ff_mpeg4_y_dc_scale_table;
1306  s->c_dc_scale_table = ff_mpeg4_c_dc_scale_table;
1307 
1308  if (s->avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
1309  s->avctx->extradata = av_malloc(1024);
1310  if (!s->avctx->extradata)
1311  return AVERROR(ENOMEM);
1312  init_put_bits(&s->pb, s->avctx->extradata, 1024);
1313 
1314  if (!(s->workaround_bugs & FF_BUG_MS))
1316  mpeg4_encode_vol_header(s, 0, 0);
1317 
1318 // ff_mpeg4_stuffing(&s->pb); ?
1319  flush_put_bits(&s->pb);
1320  s->avctx->extradata_size = (put_bits_count(&s->pb) + 7) >> 3;
1321  }
1322  return 0;
1323 }
1324 
1326 {
1327  uint8_t *start = put_bits_ptr(&s->pb);
1328  uint8_t *end = s->pb.buf_end;
1329  int size = end - start;
1330  int pb_size = (((intptr_t)start + size / 3) & (~3)) - (intptr_t)start;
1331  int tex_size = (size - 2 * pb_size) & (~3);
1332 
1333  set_put_bits_buffer_size(&s->pb, pb_size);
1334  init_put_bits(&s->tex_pb, start + pb_size, tex_size);
1335  init_put_bits(&s->pb2, start + pb_size + tex_size, pb_size);
1336 }
1337 
1339 {
1340  const int pb2_len = put_bits_count(&s->pb2);
1341  const int tex_pb_len = put_bits_count(&s->tex_pb);
1342  const int bits = put_bits_count(&s->pb);
1343 
1344  if (s->pict_type == AV_PICTURE_TYPE_I) {
1345  put_bits(&s->pb, 19, DC_MARKER);
1346  s->misc_bits += 19 + pb2_len + bits - s->last_bits;
1347  s->i_tex_bits += tex_pb_len;
1348  } else {
1349  put_bits(&s->pb, 17, MOTION_MARKER);
1350  s->misc_bits += 17 + pb2_len;
1351  s->mv_bits += bits - s->last_bits;
1352  s->p_tex_bits += tex_pb_len;
1353  }
1354 
1355  flush_put_bits(&s->pb2);
1356  flush_put_bits(&s->tex_pb);
1357 
1358  set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
1359  avpriv_copy_bits(&s->pb, s->pb2.buf, pb2_len);
1360  avpriv_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
1361  s->last_bits = put_bits_count(&s->pb);
1362 }
1363 
1365 {
1366  int mb_num_bits = av_log2(s->mb_num - 1) + 1;
1367 
1369  put_bits(&s->pb, 1, 1);
1370 
1371  put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y * s->mb_width);
1372  put_bits(&s->pb, s->quant_precision, s->qscale);
1373  put_bits(&s->pb, 1, 0); /* no HEC */
1374 }
1375 
1376 #define OFFSET(x) offsetof(MpegEncContext, x)
1377 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1378 static const AVOption options[] = {
1379  { "data_partitioning", "Use data partitioning.", OFFSET(data_partitioning), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
1380  { "alternate_scan", "Enable alternate scantable.", OFFSET(alternate_scan), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
1383  { NULL },
1384 };
1385 
1386 static const AVClass mpeg4enc_class = {
1387  .class_name = "MPEG4 encoder",
1388  .item_name = av_default_item_name,
1389  .option = options,
1390  .version = LIBAVUTIL_VERSION_INT,
1391 };
1392 
1394  .name = "mpeg4",
1395  .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
1396  .type = AVMEDIA_TYPE_VIDEO,
1397  .id = AV_CODEC_ID_MPEG4,
1398  .priv_data_size = sizeof(MpegEncContext),
1399  .init = encode_init,
1400  .encode2 = ff_mpv_encode_picture,
1401  .close = ff_mpv_encode_end,
1404  .priv_class = &mpeg4enc_class,
1405 };
mpeg4_get_dc_length
static int mpeg4_get_dc_length(int level, int n)
Definition: mpeg4videoenc.c:271
AVCodec
AVCodec.
Definition: codec.h:190
FFUMOD
#define FFUMOD(a, b)
Definition: common.h:64
MV_TYPE_16X16
#define MV_TYPE_16X16
1 vector for the whole mb
Definition: mpegvideo.h:266
mpeg4_encode_blocks
static void mpeg4_encode_blocks(MpegEncContext *s, int16_t block[6][64], int intra_dc[6], uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
Definition: mpeg4videoenc.c:398
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
FF_ASPECT_EXTENDED
#define FF_ASPECT_EXTENDED
Definition: h263.h:30
mpeg4_encode_vol_header
static void mpeg4_encode_vol_header(MpegEncContext *s, int vo_number, int vol_number)
Definition: mpeg4videoenc.c:958
level
uint8_t level
Definition: svq3.c:210
VISUAL_OBJ_STARTCODE
#define VISUAL_OBJ_STARTCODE
Definition: mpeg4video.h:64
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
FF_COMPLIANCE_VERY_STRICT
#define FF_COMPLIANCE_VERY_STRICT
Strictly conform to an older more strict version of the spec or reference software.
Definition: avcodec.h:1590
ff_clean_mpeg4_qscales
void ff_clean_mpeg4_qscales(MpegEncContext *s)
modify mb_type & qscale so that encoding is actually possible in MPEG-4
Definition: mpeg4videoenc.c:214
LIBAVCODEC_IDENT
#define LIBAVCODEC_IDENT
Definition: version.h:42
MAX_RUN
#define MAX_RUN
Definition: rl.h:35
init_put_bits
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:48
MV_DIRECT
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
Definition: mpegvideo.h:264
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:61
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
UNI_AC_ENC_INDEX
#define UNI_AC_ENC_INDEX(run, level)
Definition: mpegvideo.h:318
OFFSET
#define OFFSET(x)
Definition: mpeg4videoenc.c:1376
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:208
avpriv_put_string
void avpriv_put_string(PutBitContext *pb, const char *string, int terminate_string)
Put the string string in the bitstream.
Definition: bitstream.c:53
ADV_SIMPLE_VO_TYPE
#define ADV_SIMPLE_VO_TYPE
Definition: mpeg4video.h:46
AVOption
AVOption.
Definition: opt.h:246
init_uni_dc_tab
static av_cold void init_uni_dc_tab(void)
Definition: mpeg4videoenc.c:1122
INPLACE_OFFSET
#define INPLACE_OFFSET
Definition: mpegutils.h:121
ff_mpeg4_encoder
AVCodec ff_mpeg4_encoder
Definition: mpeg4videoenc.c:1393
mpegvideo.h
FF_LEVEL_UNKNOWN
#define FF_LEVEL_UNKNOWN
Definition: avcodec.h:1983
Picture
Picture.
Definition: mpegpicture.h:45
mpeg4_encode_visual_object_header
static void mpeg4_encode_visual_object_header(MpegEncContext *s)
Definition: mpeg4videoenc.c:914
FF_LAMBDA_SHIFT
#define FF_LAMBDA_SHIFT
Definition: avutil.h:225
mpegutils.h
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:314
MV_DIR_BACKWARD
#define MV_DIR_BACKWARD
Definition: mpegvideo.h:263
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
mpeg4_encode_block
static void mpeg4_encode_block(MpegEncContext *s, int16_t *block, int n, int intra_dc, uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
Encode an 8x8 block.
Definition: mpeg4videoenc.c:283
AV_CODEC_FLAG_GLOBAL_HEADER
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition: avcodec.h:329
uni_mpeg4_intra_rl_bits
static uint32_t uni_mpeg4_intra_rl_bits[64 *64 *2 *2]
Definition: mpeg4videoenc.c:42
uni_mpeg4_intra_rl_len
static uint8_t uni_mpeg4_intra_rl_len[64 *64 *2 *2]
Definition: mpeg4videoenc.c:43
VOS_STARTCODE
#define VOS_STARTCODE
Definition: mpeg4video.h:61
ff_mpeg4_DCtab_chrom
const uint8_t ff_mpeg4_DCtab_chrom[13][2]
Definition: mpeg4data.h:41
ff_h263_pred_motion
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Definition: h263.c:307
get_block_rate
static int get_block_rate(MpegEncContext *s, int16_t block[64], int block_last_index, uint8_t scantable[64])
Return the number of bits that encoding the 8x8 block in block would need.
Definition: mpeg4videoenc.c:65
CANDIDATE_MB_TYPE_BIDIR
#define CANDIDATE_MB_TYPE_BIDIR
Definition: mpegutils.h:112
restore_ac_coeffs
static void restore_ac_coeffs(MpegEncContext *s, int16_t block[6][64], const int dir[6], uint8_t *st[6], const int zigzag_last_index[6])
Restore the ac coefficients in block that have been changed by decide_ac_pred().
Definition: mpeg4videoenc.c:100
FF_BUG_MS
#define FF_BUG_MS
Work around various bugs in Microsoft's broken decoders.
Definition: avcodec.h:1573
RLTable
RLTable.
Definition: rl.h:39
ff_mpeg4_get_video_packet_prefix_length
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s)
Definition: mpeg4video.c:30
uni_mpeg4_inter_rl_bits
static uint32_t uni_mpeg4_inter_rl_bits[64 *64 *2 *2]
Definition: mpeg4videoenc.c:44
uni_DCtab_chrom_len
static uint8_t uni_DCtab_chrom_len[512]
Definition: mpeg4videoenc.c:36
FFUDIV
#define FFUDIV(a, b)
Definition: common.h:63
AV_CODEC_FLAG2_NO_OUTPUT
#define AV_CODEC_FLAG2_NO_OUTPUT
Skip bitstream encoding.
Definition: avcodec.h:352
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
dquant_code
static const int dquant_code[5]
Definition: mpeg4videoenc.c:474
RLTable::n
int n
number of entries of table_vlc minus 1
Definition: rl.h:40
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:90
RLTable::max_level
int8_t * max_level[2]
encoding & decoding
Definition: rl.h:46
s
#define s(width, name)
Definition: cbs_vp9.c:257
uni_mpeg4_inter_rl_len
static uint8_t uni_mpeg4_inter_rl_len[64 *64 *2 *2]
Definition: mpeg4videoenc.c:45
ff_mpv_encode_init
int ff_mpv_encode_init(AVCodecContext *avctx)
Definition: mpegvideo_enc.c:288
ff_mpeg4_stuffing
void ff_mpeg4_stuffing(PutBitContext *pbc)
add MPEG-4 stuffing bits (01...1)
Definition: mpeg4videoenc.c:864
GOP_STARTCODE
#define GOP_STARTCODE
Definition: mpeg4video.h:63
get_rl_index
static int get_rl_index(const RLTable *rl, int last, int run, int level)
Definition: rl.h:76
skip_put_bits
static void skip_put_bits(PutBitContext *s, int n)
Skip the given number of bits.
Definition: put_bits.h:346
ff_mpeg4_rl_intra
RLTable ff_mpeg4_rl_intra
Definition: mpeg4data.h:109
uni_DCtab_chrom_bits
static uint16_t uni_DCtab_chrom_bits[512]
Definition: mpeg4videoenc.c:38
bits
uint8_t bits
Definition: vp3data.h:202
FF_PROFILE_UNKNOWN
#define FF_PROFILE_UNKNOWN
Definition: avcodec.h:1860
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
ff_mpv_encode_picture
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: mpegvideo_enc.c:1824
UNI_MPEG4_ENC_INDEX
#define UNI_MPEG4_ENC_INDEX(last, run, level)
Definition: mpeg4videoenc.c:49
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:275
uni_DCtab_lum_bits
static uint16_t uni_DCtab_lum_bits[512]
Definition: mpeg4videoenc.c:37
get_p_cbp
static int get_p_cbp(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
Definition: h263.h:127
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:66
init_uni_mpeg4_rl_tab
static av_cold void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab)
Definition: mpeg4videoenc.c:1177
PutBitContext
Definition: put_bits.h:35
mpeg4_encode_gop_header
static void mpeg4_encode_gop_header(MpegEncContext *s)
Definition: mpeg4videoenc.c:884
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
if
if(ret)
Definition: filter_design.txt:179
ff_mpeg4_DCtab_lum
const uint8_t ff_mpeg4_DCtab_lum[13][2]
Definition: mpeg4data.h:35
decide_ac_pred
static int decide_ac_pred(MpegEncContext *s, int16_t block[6][64], const int dir[6], uint8_t *st[6], int zigzag_last_index[6])
Return the optimal value (0 or 1) for the ac_pred element for the given MB in MPEG-4.
Definition: mpeg4videoenc.c:131
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
ff_mpeg4_encode_mb
void ff_mpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
Definition: mpeg4videoenc.c:476
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
NULL
#define NULL
Definition: coverity.c:32
ff_mpeg4_encode_picture_header
int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number)
Definition: mpeg4videoenc.c:1062
run
uint8_t run
Definition: svq3.c:209
RLTable::table_vlc
const uint16_t(* table_vlc)[2]
Definition: rl.h:42
ROUNDED_DIV
#define ROUNDED_DIV(a, b)
Definition: common.h:56
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
profiles.h
AV_CODEC_FLAG_AC_PRED
#define AV_CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
Definition: avcodec.h:338
abs
#define abs(x)
Definition: cuda_runtime.h:35
ff_mpeg4_init_partitions
void ff_mpeg4_init_partitions(MpegEncContext *s)
Definition: mpeg4videoenc.c:1325
index
int index
Definition: gxfenc.c:89
ff_clean_h263_qscales
void ff_clean_h263_qscales(MpegEncContext *s)
modify qscale so that encoding is actually possible in H.263 (limit difference to -2....
Definition: ituh263enc.c:266
MV_TYPE_8X8
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
Definition: mpegvideo.h:267
avpriv_copy_bits
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
Definition: bitstream.c:64
set_put_bits_buffer_size
static void set_put_bits_buffer_size(PutBitContext *s, int size)
Change the end of the buffer.
Definition: put_bits.h:358
ff_mpeg4_merge_partitions
void ff_mpeg4_merge_partitions(MpegEncContext *s)
Definition: mpeg4videoenc.c:1338
MAX_LEVEL
#define MAX_LEVEL
Definition: rl.h:36
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:383
ff_h263_rl_inter
RLTable ff_h263_rl_inter
Definition: h263data.c:161
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
ff_mpeg4_y_dc_scale_table
const uint8_t ff_mpeg4_y_dc_scale_table[32]
Definition: mpeg4data.h:359
ff_mpeg4_pred_dc
static int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level, int *dir_ptr, int encoding)
Predict the dc.
Definition: mpeg4video.h:202
get_b_cbp
static int get_b_cbp(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y, int mb_type)
Definition: mpeg4videoenc.c:432
ff_h263_cbpy_tab
const uint8_t ff_h263_cbpy_tab[16][2]
Definition: h263data.c:84
size
int size
Definition: twinvq_data.h:11134
ff_mpeg4_static_rl_table_store
uint8_t ff_mpeg4_static_rl_table_store[3][2][2 *MAX_RUN+MAX_LEVEL+3]
Definition: mpeg4video.c:28
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:110
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 offset
Definition: writing_filters.txt:86
attributes.h
MV_TYPE_FIELD
#define MV_TYPE_FIELD
2 vectors, one per field
Definition: mpegvideo.h:269
ff_h263_inter_MCBPC_bits
const uint8_t ff_h263_inter_MCBPC_bits[28]
Definition: h263data.c:49
DC_MARKER
#define DC_MARKER
Definition: mpeg4video.h:59
FF_MPEG4_PROFILE_OPTS
#define FF_MPEG4_PROFILE_OPTS
Definition: profiles.h:40
VE
#define VE
Definition: mpeg4videoenc.c:1377
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
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
put_bits_count
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:67
RLTable::max_run
int8_t * max_run[2]
encoding & decoding
Definition: rl.h:47
uni_DCtab_lum_len
static uint8_t uni_DCtab_lum_len[512]
Definition: mpeg4videoenc.c:35
mpeg4enc_class
static const AVClass mpeg4enc_class
Definition: mpeg4videoenc.c:1386
options
static const AVOption options[]
Definition: mpeg4videoenc.c:1378
ff_mpv_encode_end
int ff_mpv_encode_end(AVCodecContext *avctx)
Definition: mpegvideo_enc.c:1072
uint8_t
uint8_t
Definition: audio_convert.c:194
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:197
ff_h263_aspect_to_info
av_const int ff_h263_aspect_to_info(AVRational aspect)
Return the 4 bit value that specifies the given aspect ratio.
Definition: ituh263enc.c:89
len
int len
Definition: vorbis_enc_data.h:452
AVCodecContext::height
int height
Definition: avcodec.h:699
CANDIDATE_MB_TYPE_DIRECT
#define CANDIDATE_MB_TYPE_DIRECT
Definition: mpegutils.h:109
get_bits_diff
static int get_bits_diff(MpegEncContext *s)
Definition: mpegvideo.h:755
AV_CODEC_FLAG_CLOSED_GOP
#define AV_CODEC_FLAG_CLOSED_GOP
Definition: avcodec.h:343
ret
ret
Definition: filter_design.txt:187
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:72
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: mpeg4videoenc.c:1272
FF_MPV_FLAG_CBP_RD
#define FF_MPV_FLAG_CBP_RD
Definition: mpegvideo.h:591
ff_mpeg4_init_direct_mv
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
Definition: mpeg4video.c:71
ff_set_mpeg4_time
void ff_set_mpeg4_time(MpegEncContext *s)
Definition: mpeg4videoenc.c:874
ff_h263_intra_MCBPC_bits
const uint8_t ff_h263_intra_MCBPC_bits[9]
Definition: h263data.c:35
AVCodecContext
main external API structure.
Definition: avcodec.h:526
Picture::shared
int shared
Definition: mpegpicture.h:88
ff_mpeg4_encode_video_packet_header
void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
Definition: mpeg4videoenc.c:1364
put_bits_ptr
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
Definition: put_bits.h:324
ff_h263_intra_MCBPC_code
const uint8_t ff_h263_intra_MCBPC_code[9]
Definition: h263data.c:34
AV_PICTURE_TYPE_B
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition: avutil.h:276
mpeg4video.h
mpeg4_encode_dc
static void mpeg4_encode_dc(PutBitContext *s, int level, int n)
Encode the dc value.
Definition: mpeg4videoenc.c:258
Picture::f
struct AVFrame * f
Definition: mpegpicture.h:46
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
ff_rl_init
av_cold int ff_rl_init(RLTable *rl, uint8_t static_store[2][2 *MAX_RUN+MAX_LEVEL+3])
Definition: rl.c:39
mpeg4_get_block_length
static int mpeg4_get_block_length(MpegEncContext *s, int16_t *block, int n, int intra_dc, uint8_t *scan_table)
Definition: mpeg4videoenc.c:344
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:75
RECT_SHAPE
#define RECT_SHAPE
Definition: mpeg4video.h:33
VOP_STARTCODE
#define VOP_STARTCODE
Definition: mpeg4video.h:65
ff_h263_inter_MCBPC_code
const uint8_t ff_h263_inter_MCBPC_code[28]
Definition: h263data.c:40
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
ff_h263_encode_motion_vector
static void ff_h263_encode_motion_vector(MpegEncContext *s, int x, int y, int f_code)
Definition: h263.h:116
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:333
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:101
ff_mpeg4_c_dc_scale_table
const uint8_t ff_mpeg4_c_dc_scale_table[32]
Definition: mpeg4data.h:363
diff
static av_always_inline int diff(const uint32_t a, const uint32_t b)
Definition: vf_palettegen.c:136
MV_DIR_FORWARD
#define MV_DIR_FORWARD
Definition: mpegvideo.h:262
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:553
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:240
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:699
ff_write_quant_matrix
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
Definition: mpegvideo_enc.c:202
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
MOTION_MARKER
#define MOTION_MARKER
Definition: mpeg4video.h:58
FF_MPV_COMMON_OPTS
#define FF_MPV_COMMON_OPTS
Definition: mpegvideo.h:616
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:81
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
SIMPLE_VO_TYPE
#define SIMPLE_VO_TYPE
Definition: mpeg4video.h:38
AV_CODEC_FLAG_PASS1
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:296
h263.h