FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mpegvideo_enc.c
Go to the documentation of this file.
1 /*
2  * The simplest mpeg encoder (well, it was the simplest!)
3  * Copyright (c) 2000,2001 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * 4MV & hq & B-frame encoding stuff by 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  * The simplest mpeg encoder (well, it was the simplest!).
28  */
29 
30 #include "libavutil/internal.h"
31 #include "libavutil/intmath.h"
32 #include "libavutil/mathematics.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/opt.h"
35 #include "avcodec.h"
36 #include "dct.h"
37 #include "dsputil.h"
38 #include "mpeg12.h"
39 #include "mpegvideo.h"
40 #include "h261.h"
41 #include "h263.h"
42 #include "mathops.h"
43 #include "mjpegenc.h"
44 #include "msmpeg4.h"
45 #include "faandct.h"
46 #include "thread.h"
47 #include "aandcttab.h"
48 #include "flv.h"
49 #include "mpeg4video.h"
50 #include "internal.h"
51 #include "bytestream.h"
52 #include <limits.h>
53 #include "sp5x.h"
54 
56 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
57 static int sse_mb(MpegEncContext *s);
58 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
59 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
60 
63 
66  { NULL },
67 };
68 
69 void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64],
70  uint16_t (*qmat16)[2][64],
71  const uint16_t *quant_matrix,
72  int bias, int qmin, int qmax, int intra)
73 {
74  int qscale;
75  int shift = 0;
76 
77  for (qscale = qmin; qscale <= qmax; qscale++) {
78  int i;
79  if (dsp->fdct == ff_jpeg_fdct_islow_8 ||
80  dsp->fdct == ff_jpeg_fdct_islow_10 ||
81  dsp->fdct == ff_faandct) {
82  for (i = 0; i < 64; i++) {
83  const int j = dsp->idct_permutation[i];
84  /* 16 <= qscale * quant_matrix[i] <= 7905
85  * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
86  * 19952 <= x <= 249205026
87  * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
88  * 3444240 >= (1 << 36) / (x) >= 275 */
89 
90  qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
91  (qscale * quant_matrix[j]));
92  }
93  } else if (dsp->fdct == ff_fdct_ifast) {
94  for (i = 0; i < 64; i++) {
95  const int j = dsp->idct_permutation[i];
96  /* 16 <= qscale * quant_matrix[i] <= 7905
97  * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
98  * 19952 <= x <= 249205026
99  * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
100  * 3444240 >= (1 << 36) / (x) >= 275 */
101 
102  qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
103  (ff_aanscales[i] * (int64_t)qscale * quant_matrix[j]));
104  }
105  } else {
106  for (i = 0; i < 64; i++) {
107  const int j = dsp->idct_permutation[i];
108  /* We can safely suppose that 16 <= quant_matrix[i] <= 255
109  * Assume x = qscale * quant_matrix[i]
110  * So 16 <= x <= 7905
111  * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
112  * so 32768 >= (1 << 19) / (x) >= 67 */
113  qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
114  (qscale * quant_matrix[j]));
115  //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
116  // (qscale * quant_matrix[i]);
117  qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
118  (qscale * quant_matrix[j]);
119 
120  if (qmat16[qscale][0][i] == 0 ||
121  qmat16[qscale][0][i] == 128 * 256)
122  qmat16[qscale][0][i] = 128 * 256 - 1;
123  qmat16[qscale][1][i] =
124  ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
125  qmat16[qscale][0][i]);
126  }
127  }
128 
129  for (i = intra; i < 64; i++) {
130  int64_t max = 8191;
131  if (dsp->fdct == ff_fdct_ifast) {
132  max = (8191LL * ff_aanscales[i]) >> 14;
133  }
134  while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
135  shift++;
136  }
137  }
138  }
139  if (shift) {
140  av_log(NULL, AV_LOG_INFO,
141  "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
142  QMAT_SHIFT - shift);
143  }
144 }
145 
146 static inline void update_qscale(MpegEncContext *s)
147 {
148  s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
149  (FF_LAMBDA_SHIFT + 7);
150  s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
151 
152  s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
154 }
155 
156 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
157 {
158  int i;
159 
160  if (matrix) {
161  put_bits(pb, 1, 1);
162  for (i = 0; i < 64; i++) {
163  put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
164  }
165  } else
166  put_bits(pb, 1, 0);
167 }
168 
169 /**
170  * init s->current_picture.qscale_table from s->lambda_table
171  */
173 {
174  int8_t * const qscale_table = s->current_picture.qscale_table;
175  int i;
176 
177  for (i = 0; i < s->mb_num; i++) {
178  unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
179  int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
180  qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
181  s->avctx->qmax);
182  }
183 }
184 
186  const AVFrame *src)
187 {
188  dst->pict_type = src->pict_type;
189  dst->quality = src->quality;
192  //dst->reference = src->reference;
193  dst->pts = src->pts;
195  dst->top_field_first = src->top_field_first;
196 }
197 
200 {
201 #define COPY(a) dst->a= src->a
202  COPY(pict_type);
204  COPY(f_code);
205  COPY(b_code);
206  COPY(qscale);
207  COPY(lambda);
208  COPY(lambda2);
211  COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
212  COPY(progressive_frame); // FIXME don't set in encode_header
213  COPY(partitioned_frame); // FIXME don't set in encode_header
214 #undef COPY
215 }
216 
217 /**
218  * Set the given MpegEncContext to defaults for encoding.
219  * the changed fields will not depend upon the prior state of the MpegEncContext.
220  */
222 {
223  int i;
225 
226  for (i = -16; i < 16; i++) {
227  default_fcode_tab[i + MAX_MV] = 1;
228  }
231 }
232 
234  if (ARCH_X86)
236 
237  if (!s->dct_quantize)
239  if (!s->denoise_dct)
242  if (s->avctx->trellis)
244 
245  return 0;
246 }
247 
248 /* init video encoder */
250 {
251  MpegEncContext *s = avctx->priv_data;
252  int i;
253  int chroma_h_shift, chroma_v_shift;
254 
256 
257  switch (avctx->codec_id) {
259  if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
260  avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
261  av_log(avctx, AV_LOG_ERROR,
262  "only YUV420 and YUV422 are supported\n");
263  return -1;
264  }
265  break;
266  case AV_CODEC_ID_LJPEG:
267  if (avctx->pix_fmt != AV_PIX_FMT_YUVJ420P &&
268  avctx->pix_fmt != AV_PIX_FMT_YUVJ422P &&
269  avctx->pix_fmt != AV_PIX_FMT_YUVJ444P &&
270  avctx->pix_fmt != AV_PIX_FMT_BGR0 &&
271  avctx->pix_fmt != AV_PIX_FMT_BGRA &&
272  avctx->pix_fmt != AV_PIX_FMT_BGR24 &&
273  ((avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
274  avctx->pix_fmt != AV_PIX_FMT_YUV422P &&
275  avctx->pix_fmt != AV_PIX_FMT_YUV444P) ||
277  av_log(avctx, AV_LOG_ERROR, "colorspace not supported in LJPEG\n");
278  return -1;
279  }
280  break;
281  case AV_CODEC_ID_MJPEG:
282  case AV_CODEC_ID_AMV:
283  if (avctx->pix_fmt != AV_PIX_FMT_YUVJ420P &&
284  avctx->pix_fmt != AV_PIX_FMT_YUVJ422P &&
285  avctx->pix_fmt != AV_PIX_FMT_YUVJ444P &&
286  ((avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
287  avctx->pix_fmt != AV_PIX_FMT_YUV422P &&
288  avctx->pix_fmt != AV_PIX_FMT_YUV444P) ||
290  av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
291  return -1;
292  }
293  break;
294  default:
295  if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
296  av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
297  return -1;
298  }
299  }
300 
301  switch (avctx->pix_fmt) {
302  case AV_PIX_FMT_YUVJ444P:
303  case AV_PIX_FMT_YUV444P:
305  break;
306  case AV_PIX_FMT_YUVJ422P:
307  case AV_PIX_FMT_YUV422P:
309  break;
310  case AV_PIX_FMT_YUVJ420P:
311  case AV_PIX_FMT_YUV420P:
312  default:
314  break;
315  }
316 
317  s->bit_rate = avctx->bit_rate;
318  s->width = avctx->width;
319  s->height = avctx->height;
320  if (avctx->gop_size > 600 &&
322  av_log(avctx, AV_LOG_WARNING,
323  "keyframe interval too large!, reducing it from %d to %d\n",
324  avctx->gop_size, 600);
325  avctx->gop_size = 600;
326  }
327  s->gop_size = avctx->gop_size;
328  s->avctx = avctx;
329  s->flags = avctx->flags;
330  s->flags2 = avctx->flags2;
331  s->max_b_frames = avctx->max_b_frames;
332  s->codec_id = avctx->codec->id;
334  s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
335  s->mpeg_quant = avctx->mpeg_quant;
336  s->rtp_mode = !!avctx->rtp_payload_size;
339 
340  if (s->gop_size <= 1) {
341  s->intra_only = 1;
342  s->gop_size = 12;
343  } else {
344  s->intra_only = 0;
345  }
346 
347  s->me_method = avctx->me_method;
348 
349  /* Fixed QSCALE */
350  s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
351 
352  s->adaptive_quant = (s->avctx->lumi_masking ||
353  s->avctx->dark_masking ||
356  s->avctx->p_masking ||
357  s->avctx->border_masking ||
358  (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
359  !s->fixed_qscale;
360 
362 
363  if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
364  switch(avctx->codec_id) {
367  avctx->rc_buffer_size = FFMAX(avctx->rc_max_rate, 15000000) * 112L / 15000000 * 16384;
368  break;
369  case AV_CODEC_ID_MPEG4:
373  if (avctx->rc_max_rate >= 15000000) {
374  avctx->rc_buffer_size = 320 + (avctx->rc_max_rate - 15000000L) * (760-320) / (38400000 - 15000000);
375  } else if(avctx->rc_max_rate >= 2000000) {
376  avctx->rc_buffer_size = 80 + (avctx->rc_max_rate - 2000000L) * (320- 80) / (15000000 - 2000000);
377  } else if(avctx->rc_max_rate >= 384000) {
378  avctx->rc_buffer_size = 40 + (avctx->rc_max_rate - 384000L) * ( 80- 40) / ( 2000000 - 384000);
379  } else
380  avctx->rc_buffer_size = 40;
381  avctx->rc_buffer_size *= 16384;
382  break;
383  }
384  if (avctx->rc_buffer_size) {
385  av_log(avctx, AV_LOG_INFO, "Automatically choosing VBV buffer size of %d kbyte\n", avctx->rc_buffer_size/8192);
386  }
387  }
388 
389  if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
390  av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
391  if (avctx->rc_max_rate && !avctx->rc_buffer_size)
392  return -1;
393  }
394 
395  if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
396  av_log(avctx, AV_LOG_INFO,
397  "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
398  }
399 
400  if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
401  av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
402  return -1;
403  }
404 
405  if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
406  av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
407  return -1;
408  }
409 
410  if (avctx->rc_max_rate &&
411  avctx->rc_max_rate == avctx->bit_rate &&
412  avctx->rc_max_rate != avctx->rc_min_rate) {
413  av_log(avctx, AV_LOG_INFO,
414  "impossible bitrate constraints, this will fail\n");
415  }
416 
417  if (avctx->rc_buffer_size &&
418  avctx->bit_rate * (int64_t)avctx->time_base.num >
419  avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
420  av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
421  return -1;
422  }
423 
424  if (!s->fixed_qscale &&
425  avctx->bit_rate * av_q2d(avctx->time_base) >
426  avctx->bit_rate_tolerance) {
427  av_log(avctx, AV_LOG_ERROR,
428  "bitrate tolerance too small for bitrate\n");
429  return -1;
430  }
431 
432  if (s->avctx->rc_max_rate &&
433  s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
436  90000LL * (avctx->rc_buffer_size - 1) >
437  s->avctx->rc_max_rate * 0xFFFFLL) {
438  av_log(avctx, AV_LOG_INFO,
439  "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
440  "specified vbv buffer is too large for the given bitrate!\n");
441  }
442 
443  if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
445  s->codec_id != AV_CODEC_ID_FLV1) {
446  av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
447  return -1;
448  }
449 
450  if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
451  av_log(avctx, AV_LOG_ERROR,
452  "OBMC is only supported with simple mb decision\n");
453  return -1;
454  }
455 
456  if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
457  av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
458  return -1;
459  }
460 
461  if (s->max_b_frames &&
462  s->codec_id != AV_CODEC_ID_MPEG4 &&
465  av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
466  return -1;
467  }
468 
469  if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
470  s->codec_id == AV_CODEC_ID_H263 ||
471  s->codec_id == AV_CODEC_ID_H263P) &&
472  (avctx->sample_aspect_ratio.num > 255 ||
473  avctx->sample_aspect_ratio.den > 255)) {
474  av_log(avctx, AV_LOG_WARNING,
475  "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
478  avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 255);
479  }
480 
481  if ((s->codec_id == AV_CODEC_ID_H263 ||
482  s->codec_id == AV_CODEC_ID_H263P) &&
483  (avctx->width > 2048 ||
484  avctx->height > 1152 )) {
485  av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
486  return -1;
487  }
488  if ((s->codec_id == AV_CODEC_ID_H263 ||
489  s->codec_id == AV_CODEC_ID_H263P) &&
490  ((avctx->width &3) ||
491  (avctx->height&3) )) {
492  av_log(avctx, AV_LOG_ERROR, "w/h must be a multiple of 4\n");
493  return -1;
494  }
495 
496  if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
497  (avctx->width > 4095 ||
498  avctx->height > 4095 )) {
499  av_log(avctx, AV_LOG_ERROR, "MPEG-1 does not support resolutions above 4095x4095\n");
500  return -1;
501  }
502 
503  if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
504  (avctx->width > 16383 ||
505  avctx->height > 16383 )) {
506  av_log(avctx, AV_LOG_ERROR, "MPEG-2 does not support resolutions above 16383x16383\n");
507  return -1;
508  }
509 
510  if (s->codec_id == AV_CODEC_ID_RV10 &&
511  (avctx->width &15 ||
512  avctx->height&15 )) {
513  av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 16\n");
514  return AVERROR(EINVAL);
515  }
516 
517  if (s->codec_id == AV_CODEC_ID_RV20 &&
518  (avctx->width &3 ||
519  avctx->height&3 )) {
520  av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 4\n");
521  return AVERROR(EINVAL);
522  }
523 
524  if ((s->codec_id == AV_CODEC_ID_WMV1 ||
525  s->codec_id == AV_CODEC_ID_WMV2) &&
526  avctx->width & 1) {
527  av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
528  return -1;
529  }
530 
533  av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
534  return -1;
535  }
536 
537  // FIXME mpeg2 uses that too
538  if (s->mpeg_quant && ( s->codec_id != AV_CODEC_ID_MPEG4
539  && s->codec_id != AV_CODEC_ID_MPEG2VIDEO)) {
540  av_log(avctx, AV_LOG_ERROR,
541  "mpeg2 style quantization not supported by codec\n");
542  return -1;
543  }
544 
545  if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
546  av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
547  return -1;
548  }
549 
550  if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
552  av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
553  return -1;
554  }
555 
556  if (s->avctx->scenechange_threshold < 1000000000 &&
557  (s->flags & CODEC_FLAG_CLOSED_GOP)) {
558  av_log(avctx, AV_LOG_ERROR,
559  "closed gop with scene change detection are not supported yet, "
560  "set threshold to 1000000000\n");
561  return -1;
562  }
563 
564  if (s->flags & CODEC_FLAG_LOW_DELAY) {
565  if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
566  av_log(avctx, AV_LOG_ERROR,
567  "low delay forcing is only available for mpeg2\n");
568  return -1;
569  }
570  if (s->max_b_frames != 0) {
571  av_log(avctx, AV_LOG_ERROR,
572  "b frames cannot be used with low delay\n");
573  return -1;
574  }
575  }
576 
577  if (s->q_scale_type == 1) {
578  if (avctx->qmax > 12) {
579  av_log(avctx, AV_LOG_ERROR,
580  "non linear quant only supports qmax <= 12 currently\n");
581  return -1;
582  }
583  }
584 
585  if (s->avctx->thread_count > 1 &&
586  s->codec_id != AV_CODEC_ID_MPEG4 &&
589  s->codec_id != AV_CODEC_ID_MJPEG &&
590  (s->codec_id != AV_CODEC_ID_H263P)) {
591  av_log(avctx, AV_LOG_ERROR,
592  "multi threaded encoding not supported by codec\n");
593  return -1;
594  }
595 
596  if (s->avctx->thread_count < 1) {
597  av_log(avctx, AV_LOG_ERROR,
598  "automatic thread number detection not supported by codec, "
599  "patch welcome\n");
600  return -1;
601  }
602 
603  if (s->avctx->slices > 1 || s->avctx->thread_count > 1)
604  s->rtp_mode = 1;
605 
606  if (s->avctx->thread_count > 1 && s->codec_id == AV_CODEC_ID_H263P)
607  s->h263_slice_structured = 1;
608 
609  if (!avctx->time_base.den || !avctx->time_base.num) {
610  av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
611  return -1;
612  }
613 
614  i = (INT_MAX / 2 + 128) >> 8;
615  if (avctx->mb_threshold >= i) {
616  av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
617  i - 1);
618  return -1;
619  }
620 
621  if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
622  av_log(avctx, AV_LOG_INFO,
623  "notice: b_frame_strategy only affects the first pass\n");
624  avctx->b_frame_strategy = 0;
625  }
626 
627  i = av_gcd(avctx->time_base.den, avctx->time_base.num);
628  if (i > 1) {
629  av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
630  avctx->time_base.den /= i;
631  avctx->time_base.num /= i;
632  //return -1;
633  }
634 
636  // (a + x * 3 / 8) / x
637  s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
638  s->inter_quant_bias = 0;
639  } else {
640  s->intra_quant_bias = 0;
641  // (a - x / 4) / x
642  s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
643  }
644 
649 
650  av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
651 
652  avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
653 
654  if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
655  s->avctx->time_base.den > (1 << 16) - 1) {
656  av_log(avctx, AV_LOG_ERROR,
657  "timebase %d/%d not supported by MPEG 4 standard, "
658  "the maximum admitted value for the timebase denominator "
659  "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
660  (1 << 16) - 1);
661  return -1;
662  }
663  s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
664 
665  switch (avctx->codec->id) {
667  s->out_format = FMT_MPEG1;
668  s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
669  avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
670  break;
672  s->out_format = FMT_MPEG1;
673  s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
674  avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
675  s->rtp_mode = 1;
676  break;
677  case AV_CODEC_ID_LJPEG:
678  case AV_CODEC_ID_MJPEG:
679  case AV_CODEC_ID_AMV:
680  s->out_format = FMT_MJPEG;
681  s->intra_only = 1; /* force intra only for jpeg */
682  if (avctx->codec->id == AV_CODEC_ID_LJPEG &&
683  (avctx->pix_fmt == AV_PIX_FMT_BGR0
684  || s->avctx->pix_fmt == AV_PIX_FMT_BGRA
685  || s->avctx->pix_fmt == AV_PIX_FMT_BGR24)) {
686  s->mjpeg_vsample[0] = s->mjpeg_hsample[0] =
687  s->mjpeg_vsample[1] = s->mjpeg_hsample[1] =
688  s->mjpeg_vsample[2] = s->mjpeg_hsample[2] = 1;
689  } else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUVJ444P) {
690  s->mjpeg_vsample[0] = s->mjpeg_vsample[1] = s->mjpeg_vsample[2] = 2;
691  s->mjpeg_hsample[0] = s->mjpeg_hsample[1] = s->mjpeg_hsample[2] = 1;
692  } else {
693  s->mjpeg_vsample[0] = 2;
694  s->mjpeg_vsample[1] = 2 >> chroma_v_shift;
695  s->mjpeg_vsample[2] = 2 >> chroma_v_shift;
696  s->mjpeg_hsample[0] = 2;
697  s->mjpeg_hsample[1] = 2 >> chroma_h_shift;
698  s->mjpeg_hsample[2] = 2 >> chroma_h_shift;
699  }
700  if (!(CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) ||
701  ff_mjpeg_encode_init(s) < 0)
702  return -1;
703  avctx->delay = 0;
704  s->low_delay = 1;
705  break;
706  case AV_CODEC_ID_H261:
707  if (!CONFIG_H261_ENCODER)
708  return -1;
709  if (ff_h261_get_picture_format(s->width, s->height) < 0) {
710  av_log(avctx, AV_LOG_ERROR,
711  "The specified picture size of %dx%d is not valid for the "
712  "H.261 codec.\nValid sizes are 176x144, 352x288\n",
713  s->width, s->height);
714  return -1;
715  }
716  s->out_format = FMT_H261;
717  avctx->delay = 0;
718  s->low_delay = 1;
719  break;
720  case AV_CODEC_ID_H263:
721  if (!CONFIG_H263_ENCODER)
722  return -1;
724  s->width, s->height) == 8) {
725  av_log(avctx, AV_LOG_ERROR,
726  "The specified picture size of %dx%d is not valid for "
727  "the H.263 codec.\nValid sizes are 128x96, 176x144, "
728  "352x288, 704x576, and 1408x1152. "
729  "Try H.263+.\n", s->width, s->height);
730  return -1;
731  }
732  s->out_format = FMT_H263;
733  avctx->delay = 0;
734  s->low_delay = 1;
735  break;
736  case AV_CODEC_ID_H263P:
737  s->out_format = FMT_H263;
738  s->h263_plus = 1;
739  /* Fx */
740  s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
741  s->modified_quant = s->h263_aic;
742  s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
743  s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
744 
745  /* /Fx */
746  /* These are just to be sure */
747  avctx->delay = 0;
748  s->low_delay = 1;
749  break;
750  case AV_CODEC_ID_FLV1:
751  s->out_format = FMT_H263;
752  s->h263_flv = 2; /* format = 1; 11-bit codes */
753  s->unrestricted_mv = 1;
754  s->rtp_mode = 0; /* don't allow GOB */
755  avctx->delay = 0;
756  s->low_delay = 1;
757  break;
758  case AV_CODEC_ID_RV10:
759  s->out_format = FMT_H263;
760  avctx->delay = 0;
761  s->low_delay = 1;
762  break;
763  case AV_CODEC_ID_RV20:
764  s->out_format = FMT_H263;
765  avctx->delay = 0;
766  s->low_delay = 1;
767  s->modified_quant = 1;
768  s->h263_aic = 1;
769  s->h263_plus = 1;
770  s->loop_filter = 1;
771  s->unrestricted_mv = 0;
772  break;
773  case AV_CODEC_ID_MPEG4:
774  s->out_format = FMT_H263;
775  s->h263_pred = 1;
776  s->unrestricted_mv = 1;
777  s->low_delay = s->max_b_frames ? 0 : 1;
778  avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
779  break;
781  s->out_format = FMT_H263;
782  s->h263_pred = 1;
783  s->unrestricted_mv = 1;
784  s->msmpeg4_version = 2;
785  avctx->delay = 0;
786  s->low_delay = 1;
787  break;
789  s->out_format = FMT_H263;
790  s->h263_pred = 1;
791  s->unrestricted_mv = 1;
792  s->msmpeg4_version = 3;
793  s->flipflop_rounding = 1;
794  avctx->delay = 0;
795  s->low_delay = 1;
796  break;
797  case AV_CODEC_ID_WMV1:
798  s->out_format = FMT_H263;
799  s->h263_pred = 1;
800  s->unrestricted_mv = 1;
801  s->msmpeg4_version = 4;
802  s->flipflop_rounding = 1;
803  avctx->delay = 0;
804  s->low_delay = 1;
805  break;
806  case AV_CODEC_ID_WMV2:
807  s->out_format = FMT_H263;
808  s->h263_pred = 1;
809  s->unrestricted_mv = 1;
810  s->msmpeg4_version = 5;
811  s->flipflop_rounding = 1;
812  avctx->delay = 0;
813  s->low_delay = 1;
814  break;
815  default:
816  return -1;
817  }
818 
819  avctx->has_b_frames = !s->low_delay;
820 
821  s->encoding = 1;
822 
823  s->progressive_frame =
826  s->alternate_scan);
827 
828  /* init */
829  if (ff_MPV_common_init(s) < 0)
830  return -1;
831 
833 
834  if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
836 
837  s->quant_precision = 5;
838 
839  ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
841 
842  if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
844  if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
848  if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
849  && s->out_format == FMT_MPEG1)
851 
852  /* init q matrix */
853  for (i = 0; i < 64; i++) {
854  int j = s->dsp.idct_permutation[i];
855  if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
856  s->mpeg_quant) {
859  } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
860  s->intra_matrix[j] =
862  } else {
863  /* mpeg1/2 */
866  }
867  if (s->avctx->intra_matrix)
868  s->intra_matrix[j] = s->avctx->intra_matrix[i];
869  if (s->avctx->inter_matrix)
870  s->inter_matrix[j] = s->avctx->inter_matrix[i];
871  }
872 
873  /* precompute matrix */
874  /* for mjpeg, we do include qscale in the matrix */
875  if (s->out_format != FMT_MJPEG) {
877  s->intra_matrix, s->intra_quant_bias, avctx->qmin,
878  31, 1);
880  s->inter_matrix, s->inter_quant_bias, avctx->qmin,
881  31, 0);
882  }
883 
884  if (ff_rate_control_init(s) < 0)
885  return -1;
886 
887  return 0;
888 }
889 
891 {
892  MpegEncContext *s = avctx->priv_data;
893 
895 
897  if ((CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) &&
898  s->out_format == FMT_MJPEG)
900 
901  av_freep(&avctx->extradata);
902 
903  return 0;
904 }
905 
906 static int get_sae(uint8_t *src, int ref, int stride)
907 {
908  int x,y;
909  int acc = 0;
910 
911  for (y = 0; y < 16; y++) {
912  for (x = 0; x < 16; x++) {
913  acc += FFABS(src[x + y * stride] - ref);
914  }
915  }
916 
917  return acc;
918 }
919 
921  uint8_t *ref, int stride)
922 {
923  int x, y, w, h;
924  int acc = 0;
925 
926  w = s->width & ~15;
927  h = s->height & ~15;
928 
929  for (y = 0; y < h; y += 16) {
930  for (x = 0; x < w; x += 16) {
931  int offset = x + y * stride;
932  int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
933  16);
934  int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
935  int sae = get_sae(src + offset, mean, stride);
936 
937  acc += sae + 500 < sad;
938  }
939  }
940  return acc;
941 }
942 
943 
944 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
945 {
946  Picture *pic = NULL;
947  int64_t pts;
948  int i, display_picture_number = 0, ret;
949  const int encoding_delay = s->max_b_frames ? s->max_b_frames :
950  (s->low_delay ? 0 : 1);
951  int direct = 1;
952 
953  if (pic_arg) {
954  pts = pic_arg->pts;
955  display_picture_number = s->input_picture_number++;
956 
957  if (pts != AV_NOPTS_VALUE) {
959  int64_t last = s->user_specified_pts;
960 
961  if (pts <= last) {
963  "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
964  pts, last);
965  return AVERROR(EINVAL);
966  }
967 
968  if (!s->low_delay && display_picture_number == 1)
969  s->dts_delta = pts - last;
970  }
971  s->user_specified_pts = pts;
972  } else {
974  s->user_specified_pts =
975  pts = s->user_specified_pts + 1;
977  "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
978  pts);
979  } else {
980  pts = display_picture_number;
981  }
982  }
983  }
984 
985  if (pic_arg) {
986  if (!pic_arg->buf[0])
987  direct = 0;
988  if (pic_arg->linesize[0] != s->linesize)
989  direct = 0;
990  if (pic_arg->linesize[1] != s->uvlinesize)
991  direct = 0;
992  if (pic_arg->linesize[2] != s->uvlinesize)
993  direct = 0;
994 
995  av_dlog(s->avctx, "%d %d %d %d\n", pic_arg->linesize[0],
996  pic_arg->linesize[1], s->linesize, s->uvlinesize);
997 
998  if (direct) {
999  i = ff_find_unused_picture(s, 1);
1000  if (i < 0)
1001  return i;
1002 
1003  pic = &s->picture[i];
1004  pic->reference = 3;
1005 
1006  if ((ret = av_frame_ref(&pic->f, pic_arg)) < 0)
1007  return ret;
1008  if (ff_alloc_picture(s, pic, 1) < 0) {
1009  return -1;
1010  }
1011  } else {
1012  i = ff_find_unused_picture(s, 0);
1013  if (i < 0)
1014  return i;
1015 
1016  pic = &s->picture[i];
1017  pic->reference = 3;
1018 
1019  if (ff_alloc_picture(s, pic, 0) < 0) {
1020  return -1;
1021  }
1022 
1023  if (pic->f.data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1024  pic->f.data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1025  pic->f.data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1026  // empty
1027  } else {
1028  int h_chroma_shift, v_chroma_shift;
1030  &h_chroma_shift,
1031  &v_chroma_shift);
1032 
1033  for (i = 0; i < 3; i++) {
1034  int src_stride = pic_arg->linesize[i];
1035  int dst_stride = i ? s->uvlinesize : s->linesize;
1036  int h_shift = i ? h_chroma_shift : 0;
1037  int v_shift = i ? v_chroma_shift : 0;
1038  int w = s->width >> h_shift;
1039  int h = s->height >> v_shift;
1040  uint8_t *src = pic_arg->data[i];
1041  uint8_t *dst = pic->f.data[i];
1042 
1043  if (s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)) {
1044  h = ((s->height + 15)/16*16) >> v_shift;
1045  }
1046 
1047  if (!s->avctx->rc_buffer_size)
1048  dst += INPLACE_OFFSET;
1049 
1050  if (src_stride == dst_stride)
1051  memcpy(dst, src, src_stride * h);
1052  else {
1053  int h2 = h;
1054  uint8_t *dst2 = dst;
1055  while (h2--) {
1056  memcpy(dst2, src, w);
1057  dst2 += dst_stride;
1058  src += src_stride;
1059  }
1060  }
1061  if ((s->width & 15) || (s->height & 15)) {
1062  s->dsp.draw_edges(dst, dst_stride,
1063  w, h,
1064  16>>h_shift,
1065  16>>v_shift,
1066  EDGE_BOTTOM);
1067  }
1068  }
1069  }
1070  }
1071  copy_picture_attributes(s, &pic->f, pic_arg);
1072  pic->f.display_picture_number = display_picture_number;
1073  pic->f.pts = pts; // we set this here to avoid modifiying pic_arg
1074  }
1075 
1076  /* shift buffer entries */
1077  for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1078  s->input_picture[i - 1] = s->input_picture[i];
1079 
1080  s->input_picture[encoding_delay] = (Picture*) pic;
1081 
1082  return 0;
1083 }
1084 
1086 {
1087  int x, y, plane;
1088  int score = 0;
1089  int64_t score64 = 0;
1090 
1091  for (plane = 0; plane < 3; plane++) {
1092  const int stride = p->f.linesize[plane];
1093  const int bw = plane ? 1 : 2;
1094  for (y = 0; y < s->mb_height * bw; y++) {
1095  for (x = 0; x < s->mb_width * bw; x++) {
1096  int off = p->shared ? 0 : 16;
1097  uint8_t *dptr = p->f.data[plane] + 8 * (x + y * stride) + off;
1098  uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride);
1099  int v = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1100 
1101  switch (s->avctx->frame_skip_exp) {
1102  case 0: score = FFMAX(score, v); break;
1103  case 1: score += FFABS(v); break;
1104  case 2: score += v * v; break;
1105  case 3: score64 += FFABS(v * v * (int64_t)v); break;
1106  case 4: score64 += v * v * (int64_t)(v * v); break;
1107  }
1108  }
1109  }
1110  }
1111 
1112  if (score)
1113  score64 = score;
1114 
1115  if (score64 < s->avctx->frame_skip_threshold)
1116  return 1;
1117  if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1118  return 1;
1119  return 0;
1120 }
1121 
1123 {
1124  AVPacket pkt = { 0 };
1125  int ret, got_output;
1126 
1127  av_init_packet(&pkt);
1128  ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1129  if (ret < 0)
1130  return ret;
1131 
1132  ret = pkt.size;
1133  av_free_packet(&pkt);
1134  return ret;
1135 }
1136 
1138 {
1141  AVFrame input[FF_MAX_B_FRAMES + 2];
1142  const int scale = s->avctx->brd_scale;
1143  int i, j, out_size, p_lambda, b_lambda, lambda2;
1144  int64_t best_rd = INT64_MAX;
1145  int best_b_count = -1;
1146 
1147  av_assert0(scale >= 0 && scale <= 3);
1148 
1149  //emms_c();
1150  //s->next_picture_ptr->quality;
1151  p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1152  //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1153  b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1154  if (!b_lambda) // FIXME we should do this somewhere else
1155  b_lambda = p_lambda;
1156  lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1158 
1159  c->width = s->width >> scale;
1160  c->height = s->height >> scale;
1162  CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
1163  c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1164  c->mb_decision = s->avctx->mb_decision;
1165  c->me_cmp = s->avctx->me_cmp;
1166  c->mb_cmp = s->avctx->mb_cmp;
1167  c->me_sub_cmp = s->avctx->me_sub_cmp;
1169  c->time_base = s->avctx->time_base;
1170  c->max_b_frames = s->max_b_frames;
1171 
1172  if (avcodec_open2(c, codec, NULL) < 0)
1173  return -1;
1174 
1175  for (i = 0; i < s->max_b_frames + 2; i++) {
1176  int ysize = c->width * c->height;
1177  int csize = (c->width / 2) * (c->height / 2);
1178  Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1179  s->next_picture_ptr;
1180 
1181  avcodec_get_frame_defaults(&input[i]);
1182  input[i].data[0] = av_malloc(ysize + 2 * csize);
1183  input[i].data[1] = input[i].data[0] + ysize;
1184  input[i].data[2] = input[i].data[1] + csize;
1185  input[i].linesize[0] = c->width;
1186  input[i].linesize[1] =
1187  input[i].linesize[2] = c->width / 2;
1188 
1189  if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1190  pre_input = *pre_input_ptr;
1191 
1192  if (!pre_input.shared && i) {
1193  pre_input.f.data[0] += INPLACE_OFFSET;
1194  pre_input.f.data[1] += INPLACE_OFFSET;
1195  pre_input.f.data[2] += INPLACE_OFFSET;
1196  }
1197 
1198  s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0],
1199  pre_input.f.data[0], pre_input.f.linesize[0],
1200  c->width, c->height);
1201  s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1],
1202  pre_input.f.data[1], pre_input.f.linesize[1],
1203  c->width >> 1, c->height >> 1);
1204  s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2],
1205  pre_input.f.data[2], pre_input.f.linesize[2],
1206  c->width >> 1, c->height >> 1);
1207  }
1208  }
1209 
1210  for (j = 0; j < s->max_b_frames + 1; j++) {
1211  int64_t rd = 0;
1212 
1213  if (!s->input_picture[j])
1214  break;
1215 
1216  c->error[0] = c->error[1] = c->error[2] = 0;
1217 
1218  input[0].pict_type = AV_PICTURE_TYPE_I;
1219  input[0].quality = 1 * FF_QP2LAMBDA;
1220 
1221  out_size = encode_frame(c, &input[0]);
1222 
1223  //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1224 
1225  for (i = 0; i < s->max_b_frames + 1; i++) {
1226  int is_p = i % (j + 1) == j || i == s->max_b_frames;
1227 
1228  input[i + 1].pict_type = is_p ?
1230  input[i + 1].quality = is_p ? p_lambda : b_lambda;
1231 
1232  out_size = encode_frame(c, &input[i + 1]);
1233 
1234  rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1235  }
1236 
1237  /* get the delayed frames */
1238  while (out_size) {
1239  out_size = encode_frame(c, NULL);
1240  rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1241  }
1242 
1243  rd += c->error[0] + c->error[1] + c->error[2];
1244 
1245  if (rd < best_rd) {
1246  best_rd = rd;
1247  best_b_count = j;
1248  }
1249  }
1250 
1251  avcodec_close(c);
1252  av_freep(&c);
1253 
1254  for (i = 0; i < s->max_b_frames + 2; i++) {
1255  av_freep(&input[i].data[0]);
1256  }
1257 
1258  return best_b_count;
1259 }
1260 
1262 {
1263  int i, ret;
1264 
1265  for (i = 1; i < MAX_PICTURE_COUNT; i++)
1267  s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1268 
1269  /* set next picture type & ordering */
1270  if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1271  if (/*s->picture_in_gop_number >= s->gop_size ||*/
1272  s->next_picture_ptr == NULL || s->intra_only) {
1273  s->reordered_input_picture[0] = s->input_picture[0];
1276  s->coded_picture_number++;
1277  } else {
1278  int b_frames;
1279 
1281  if (s->picture_in_gop_number < s->gop_size &&
1282  skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1283  // FIXME check that te gop check above is +-1 correct
1284  av_frame_unref(&s->input_picture[0]->f);
1285 
1286  emms_c();
1287  ff_vbv_update(s, 0);
1288 
1289  goto no_output_pic;
1290  }
1291  }
1292 
1293  if (s->flags & CODEC_FLAG_PASS2) {
1294  for (i = 0; i < s->max_b_frames + 1; i++) {
1295  int pict_num = s->input_picture[0]->f.display_picture_number + i;
1296 
1297  if (pict_num >= s->rc_context.num_entries)
1298  break;
1299  if (!s->input_picture[i]) {
1300  s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1301  break;
1302  }
1303 
1304  s->input_picture[i]->f.pict_type =
1305  s->rc_context.entry[pict_num].new_pict_type;
1306  }
1307  }
1308 
1309  if (s->avctx->b_frame_strategy == 0) {
1310  b_frames = s->max_b_frames;
1311  while (b_frames && !s->input_picture[b_frames])
1312  b_frames--;
1313  } else if (s->avctx->b_frame_strategy == 1) {
1314  for (i = 1; i < s->max_b_frames + 1; i++) {
1315  if (s->input_picture[i] &&
1316  s->input_picture[i]->b_frame_score == 0) {
1317  s->input_picture[i]->b_frame_score =
1318  get_intra_count(s,
1319  s->input_picture[i ]->f.data[0],
1320  s->input_picture[i - 1]->f.data[0],
1321  s->linesize) + 1;
1322  }
1323  }
1324  for (i = 0; i < s->max_b_frames + 1; i++) {
1325  if (s->input_picture[i] == NULL ||
1326  s->input_picture[i]->b_frame_score - 1 >
1327  s->mb_num / s->avctx->b_sensitivity)
1328  break;
1329  }
1330 
1331  b_frames = FFMAX(0, i - 1);
1332 
1333  /* reset scores */
1334  for (i = 0; i < b_frames + 1; i++) {
1335  s->input_picture[i]->b_frame_score = 0;
1336  }
1337  } else if (s->avctx->b_frame_strategy == 2) {
1338  b_frames = estimate_best_b_count(s);
1339  } else {
1340  av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1341  b_frames = 0;
1342  }
1343 
1344  emms_c();
1345 
1346  for (i = b_frames - 1; i >= 0; i--) {
1347  int type = s->input_picture[i]->f.pict_type;
1348  if (type && type != AV_PICTURE_TYPE_B)
1349  b_frames = i;
1350  }
1351  if (s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_B &&
1352  b_frames == s->max_b_frames) {
1354  "warning, too many b frames in a row\n");
1355  }
1356 
1357  if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1358  if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1359  s->gop_size > s->picture_in_gop_number) {
1360  b_frames = s->gop_size - s->picture_in_gop_number - 1;
1361  } else {
1362  if (s->flags & CODEC_FLAG_CLOSED_GOP)
1363  b_frames = 0;
1364  s->input_picture[b_frames]->f.pict_type = AV_PICTURE_TYPE_I;
1365  }
1366  }
1367 
1368  if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1369  s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_I)
1370  b_frames--;
1371 
1372  s->reordered_input_picture[0] = s->input_picture[b_frames];
1376  s->coded_picture_number++;
1377  for (i = 0; i < b_frames; i++) {
1378  s->reordered_input_picture[i + 1] = s->input_picture[i];
1379  s->reordered_input_picture[i + 1]->f.pict_type =
1382  s->coded_picture_number++;
1383  }
1384  }
1385  }
1386 no_output_pic:
1387  if (s->reordered_input_picture[0]) {
1390  AV_PICTURE_TYPE_B ? 3 : 0;
1391 
1393  if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1394  return ret;
1395 
1396  if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1397  // input is a shared pix, so we can't modifiy it -> alloc a new
1398  // one & ensure that the shared one is reuseable
1399 
1400  Picture *pic;
1401  int i = ff_find_unused_picture(s, 0);
1402  if (i < 0)
1403  return i;
1404  pic = &s->picture[i];
1405 
1407  if (ff_alloc_picture(s, pic, 0) < 0) {
1408  return -1;
1409  }
1410 
1411  copy_picture_attributes(s, &pic->f,
1412  &s->reordered_input_picture[0]->f);
1413 
1414  /* mark us unused / free shared pic */
1416  s->reordered_input_picture[0]->shared = 0;
1417 
1418  s->current_picture_ptr = pic;
1419  } else {
1420  // input is not a shared pix -> reuse buffer for current_pix
1422  for (i = 0; i < 4; i++) {
1423  s->new_picture.f.data[i] += INPLACE_OFFSET;
1424  }
1425  }
1427  if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1428  s->current_picture_ptr)) < 0)
1429  return ret;
1430 
1432  } else {
1434  }
1435  return 0;
1436 }
1437 
1439  AVFrame *pic_arg, int *got_packet)
1440 {
1441  MpegEncContext *s = avctx->priv_data;
1442  int i, stuffing_count, ret;
1443  int context_count = s->slice_context_count;
1444 
1445  s->picture_in_gop_number++;
1446 
1447  if (load_input_picture(s, pic_arg) < 0)
1448  return -1;
1449 
1450  if (select_input_picture(s) < 0) {
1451  return -1;
1452  }
1453 
1454  /* output? */
1455  if (s->new_picture.f.data[0]) {
1456  if ((ret = ff_alloc_packet2(avctx, pkt, s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000)) < 0)
1457  return ret;
1458  if (s->mb_info) {
1461  s->mb_width*s->mb_height*12);
1462  s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1463  }
1464 
1465  for (i = 0; i < context_count; i++) {
1466  int start_y = s->thread_context[i]->start_mb_y;
1467  int end_y = s->thread_context[i]-> end_mb_y;
1468  int h = s->mb_height;
1469  uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1470  uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1471 
1472  init_put_bits(&s->thread_context[i]->pb, start, end - start);
1473  }
1474 
1475  s->pict_type = s->new_picture.f.pict_type;
1476  //emms_c();
1477  if (ff_MPV_frame_start(s, avctx) < 0)
1478  return -1;
1479 vbv_retry:
1480  if (encode_picture(s, s->picture_number) < 0)
1481  return -1;
1482 
1483  avctx->header_bits = s->header_bits;
1484  avctx->mv_bits = s->mv_bits;
1485  avctx->misc_bits = s->misc_bits;
1486  avctx->i_tex_bits = s->i_tex_bits;
1487  avctx->p_tex_bits = s->p_tex_bits;
1488  avctx->i_count = s->i_count;
1489  // FIXME f/b_count in avctx
1490  avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1491  avctx->skip_count = s->skip_count;
1492 
1493  ff_MPV_frame_end(s);
1494 
1495  if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1497 
1498  if (avctx->rc_buffer_size) {
1499  RateControlContext *rcc = &s->rc_context;
1500  int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1501 
1502  if (put_bits_count(&s->pb) > max_size &&
1503  s->lambda < s->avctx->lmax) {
1504  s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1505  (s->qscale + 1) / s->qscale);
1506  if (s->adaptive_quant) {
1507  int i;
1508  for (i = 0; i < s->mb_height * s->mb_stride; i++)
1509  s->lambda_table[i] =
1510  FFMAX(s->lambda_table[i] + 1,
1511  s->lambda_table[i] * (s->qscale + 1) /
1512  s->qscale);
1513  }
1514  s->mb_skipped = 0; // done in MPV_frame_start()
1515  // done in encode_picture() so we must undo it
1516  if (s->pict_type == AV_PICTURE_TYPE_P) {
1517  if (s->flipflop_rounding ||
1518  s->codec_id == AV_CODEC_ID_H263P ||
1520  s->no_rounding ^= 1;
1521  }
1522  if (s->pict_type != AV_PICTURE_TYPE_B) {
1523  s->time_base = s->last_time_base;
1524  s->last_non_b_time = s->time - s->pp_time;
1525  }
1526  for (i = 0; i < context_count; i++) {
1527  PutBitContext *pb = &s->thread_context[i]->pb;
1528  init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1529  }
1530  goto vbv_retry;
1531  }
1532 
1533  assert(s->avctx->rc_max_rate);
1534  }
1535 
1536  if (s->flags & CODEC_FLAG_PASS1)
1538 
1539  for (i = 0; i < 4; i++) {
1541  avctx->error[i] += s->current_picture_ptr->f.error[i];
1542  }
1543 
1544  if (s->flags & CODEC_FLAG_PASS1)
1545  assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1546  avctx->i_tex_bits + avctx->p_tex_bits ==
1547  put_bits_count(&s->pb));
1548  flush_put_bits(&s->pb);
1549  s->frame_bits = put_bits_count(&s->pb);
1550 
1551  stuffing_count = ff_vbv_update(s, s->frame_bits);
1552  s->stuffing_bits = 8*stuffing_count;
1553  if (stuffing_count) {
1554  if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1555  stuffing_count + 50) {
1556  av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1557  return -1;
1558  }
1559 
1560  switch (s->codec_id) {
1563  while (stuffing_count--) {
1564  put_bits(&s->pb, 8, 0);
1565  }
1566  break;
1567  case AV_CODEC_ID_MPEG4:
1568  put_bits(&s->pb, 16, 0);
1569  put_bits(&s->pb, 16, 0x1C3);
1570  stuffing_count -= 4;
1571  while (stuffing_count--) {
1572  put_bits(&s->pb, 8, 0xFF);
1573  }
1574  break;
1575  default:
1576  av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1577  }
1578  flush_put_bits(&s->pb);
1579  s->frame_bits = put_bits_count(&s->pb);
1580  }
1581 
1582  /* update mpeg1/2 vbv_delay for CBR */
1583  if (s->avctx->rc_max_rate &&
1584  s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1585  s->out_format == FMT_MPEG1 &&
1586  90000LL * (avctx->rc_buffer_size - 1) <=
1587  s->avctx->rc_max_rate * 0xFFFFLL) {
1588  int vbv_delay, min_delay;
1589  double inbits = s->avctx->rc_max_rate *
1590  av_q2d(s->avctx->time_base);
1591  int minbits = s->frame_bits - 8 *
1592  (s->vbv_delay_ptr - s->pb.buf - 1);
1593  double bits = s->rc_context.buffer_index + minbits - inbits;
1594 
1595  if (bits < 0)
1597  "Internal error, negative bits\n");
1598 
1599  assert(s->repeat_first_field == 0);
1600 
1601  vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1602  min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1603  s->avctx->rc_max_rate;
1604 
1605  vbv_delay = FFMAX(vbv_delay, min_delay);
1606 
1607  av_assert0(vbv_delay < 0xFFFF);
1608 
1609  s->vbv_delay_ptr[0] &= 0xF8;
1610  s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1611  s->vbv_delay_ptr[1] = vbv_delay >> 5;
1612  s->vbv_delay_ptr[2] &= 0x07;
1613  s->vbv_delay_ptr[2] |= vbv_delay << 3;
1614  avctx->vbv_delay = vbv_delay * 300;
1615  }
1616  s->total_bits += s->frame_bits;
1617  avctx->frame_bits = s->frame_bits;
1618 
1619  pkt->pts = s->current_picture.f.pts;
1620  if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1622  pkt->dts = pkt->pts - s->dts_delta;
1623  else
1624  pkt->dts = s->reordered_pts;
1625  s->reordered_pts = pkt->pts;
1626  } else
1627  pkt->dts = pkt->pts;
1628  if (s->current_picture.f.key_frame)
1629  pkt->flags |= AV_PKT_FLAG_KEY;
1630  if (s->mb_info)
1632  } else {
1633  s->frame_bits = 0;
1634  }
1635 
1636  /* release non-reference frames */
1637  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1638  if (!s->picture[i].reference)
1639  ff_mpeg_unref_picture(s, &s->picture[i]);
1640  }
1641 
1642  assert((s->frame_bits & 7) == 0);
1643 
1644  pkt->size = s->frame_bits / 8;
1645  *got_packet = !!pkt->size;
1646  return 0;
1647 }
1648 
1650  int n, int threshold)
1651 {
1652  static const char tab[64] = {
1653  3, 2, 2, 1, 1, 1, 1, 1,
1654  1, 1, 1, 1, 1, 1, 1, 1,
1655  1, 1, 1, 1, 1, 1, 1, 1,
1656  0, 0, 0, 0, 0, 0, 0, 0,
1657  0, 0, 0, 0, 0, 0, 0, 0,
1658  0, 0, 0, 0, 0, 0, 0, 0,
1659  0, 0, 0, 0, 0, 0, 0, 0,
1660  0, 0, 0, 0, 0, 0, 0, 0
1661  };
1662  int score = 0;
1663  int run = 0;
1664  int i;
1665  int16_t *block = s->block[n];
1666  const int last_index = s->block_last_index[n];
1667  int skip_dc;
1668 
1669  if (threshold < 0) {
1670  skip_dc = 0;
1671  threshold = -threshold;
1672  } else
1673  skip_dc = 1;
1674 
1675  /* Are all we could set to zero already zero? */
1676  if (last_index <= skip_dc - 1)
1677  return;
1678 
1679  for (i = 0; i <= last_index; i++) {
1680  const int j = s->intra_scantable.permutated[i];
1681  const int level = FFABS(block[j]);
1682  if (level == 1) {
1683  if (skip_dc && i == 0)
1684  continue;
1685  score += tab[run];
1686  run = 0;
1687  } else if (level > 1) {
1688  return;
1689  } else {
1690  run++;
1691  }
1692  }
1693  if (score >= threshold)
1694  return;
1695  for (i = skip_dc; i <= last_index; i++) {
1696  const int j = s->intra_scantable.permutated[i];
1697  block[j] = 0;
1698  }
1699  if (block[0])
1700  s->block_last_index[n] = 0;
1701  else
1702  s->block_last_index[n] = -1;
1703 }
1704 
1705 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1706  int last_index)
1707 {
1708  int i;
1709  const int maxlevel = s->max_qcoeff;
1710  const int minlevel = s->min_qcoeff;
1711  int overflow = 0;
1712 
1713  if (s->mb_intra) {
1714  i = 1; // skip clipping of intra dc
1715  } else
1716  i = 0;
1717 
1718  for (; i <= last_index; i++) {
1719  const int j = s->intra_scantable.permutated[i];
1720  int level = block[j];
1721 
1722  if (level > maxlevel) {
1723  level = maxlevel;
1724  overflow++;
1725  } else if (level < minlevel) {
1726  level = minlevel;
1727  overflow++;
1728  }
1729 
1730  block[j] = level;
1731  }
1732 
1733  if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1734  av_log(s->avctx, AV_LOG_INFO,
1735  "warning, clipping %d dct coefficients to %d..%d\n",
1736  overflow, minlevel, maxlevel);
1737 }
1738 
1739 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1740 {
1741  int x, y;
1742  // FIXME optimize
1743  for (y = 0; y < 8; y++) {
1744  for (x = 0; x < 8; x++) {
1745  int x2, y2;
1746  int sum = 0;
1747  int sqr = 0;
1748  int count = 0;
1749 
1750  for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1751  for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1752  int v = ptr[x2 + y2 * stride];
1753  sum += v;
1754  sqr += v * v;
1755  count++;
1756  }
1757  }
1758  weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1759  }
1760  }
1761 }
1762 
1764  int motion_x, int motion_y,
1765  int mb_block_height,
1766  int mb_block_width,
1767  int mb_block_count)
1768 {
1769  int16_t weight[12][64];
1770  int16_t orig[12][64];
1771  const int mb_x = s->mb_x;
1772  const int mb_y = s->mb_y;
1773  int i;
1774  int skip_dct[12];
1775  int dct_offset = s->linesize * 8; // default for progressive frames
1776  int uv_dct_offset = s->uvlinesize * 8;
1777  uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1778  int wrap_y, wrap_c;
1779 
1780  for (i = 0; i < mb_block_count; i++)
1781  skip_dct[i] = s->skipdct;
1782 
1783  if (s->adaptive_quant) {
1784  const int last_qp = s->qscale;
1785  const int mb_xy = mb_x + mb_y * s->mb_stride;
1786 
1787  s->lambda = s->lambda_table[mb_xy];
1788  update_qscale(s);
1789 
1790  if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1791  s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1792  s->dquant = s->qscale - last_qp;
1793 
1794  if (s->out_format == FMT_H263) {
1795  s->dquant = av_clip(s->dquant, -2, 2);
1796 
1797  if (s->codec_id == AV_CODEC_ID_MPEG4) {
1798  if (!s->mb_intra) {
1799  if (s->pict_type == AV_PICTURE_TYPE_B) {
1800  if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1801  s->dquant = 0;
1802  }
1803  if (s->mv_type == MV_TYPE_8X8)
1804  s->dquant = 0;
1805  }
1806  }
1807  }
1808  }
1809  ff_set_qscale(s, last_qp + s->dquant);
1810  } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1811  ff_set_qscale(s, s->qscale + s->dquant);
1812 
1813  wrap_y = s->linesize;
1814  wrap_c = s->uvlinesize;
1815  ptr_y = s->new_picture.f.data[0] +
1816  (mb_y * 16 * wrap_y) + mb_x * 16;
1817  ptr_cb = s->new_picture.f.data[1] +
1818  (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1819  ptr_cr = s->new_picture.f.data[2] +
1820  (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1821 
1822  if((mb_x*16+16 > s->width || mb_y*16+16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
1823  uint8_t *ebuf = s->edge_emu_buffer + 32;
1824  int cw = (s->width + s->chroma_x_shift) >> s->chroma_x_shift;
1825  int ch = (s->height + s->chroma_y_shift) >> s->chroma_y_shift;
1826  s->vdsp.emulated_edge_mc(ebuf, ptr_y, wrap_y, 16, 16, mb_x * 16,
1827  mb_y * 16, s->width, s->height);
1828  ptr_y = ebuf;
1829  s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb, wrap_c, mb_block_width,
1830  mb_block_height, mb_x * mb_block_width, mb_y * mb_block_height,
1831  cw, ch);
1832  ptr_cb = ebuf + 18 * wrap_y;
1833  s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 16, ptr_cr, wrap_c, mb_block_width,
1834  mb_block_height, mb_x * mb_block_width, mb_y * mb_block_height,
1835  cw, ch);
1836  ptr_cr = ebuf + 18 * wrap_y + 16;
1837  }
1838 
1839  if (s->mb_intra) {
1840  if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1841  int progressive_score, interlaced_score;
1842 
1843  s->interlaced_dct = 0;
1844  progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
1845  NULL, wrap_y, 8) +
1846  s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1847  NULL, wrap_y, 8) - 400;
1848 
1849  if (progressive_score > 0) {
1850  interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
1851  NULL, wrap_y * 2, 8) +
1852  s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
1853  NULL, wrap_y * 2, 8);
1854  if (progressive_score > interlaced_score) {
1855  s->interlaced_dct = 1;
1856 
1857  dct_offset = wrap_y;
1858  uv_dct_offset = wrap_c;
1859  wrap_y <<= 1;
1860  if (s->chroma_format == CHROMA_422 ||
1861  s->chroma_format == CHROMA_444)
1862  wrap_c <<= 1;
1863  }
1864  }
1865  }
1866 
1867  s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
1868  s->dsp.get_pixels(s->block[1], ptr_y + 8 , wrap_y);
1869  s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
1870  s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
1871 
1872  if (s->flags & CODEC_FLAG_GRAY) {
1873  skip_dct[4] = 1;
1874  skip_dct[5] = 1;
1875  } else {
1876  s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1877  s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1878  if (!s->chroma_y_shift && s->chroma_x_shift) { /* 422 */
1879  s->dsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
1880  s->dsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
1881  } else if (!s->chroma_y_shift && !s->chroma_x_shift) { /* 444 */
1882  s->dsp.get_pixels(s->block[6], ptr_cb + 8, wrap_c);
1883  s->dsp.get_pixels(s->block[7], ptr_cr + 8, wrap_c);
1884  s->dsp.get_pixels(s->block[8], ptr_cb + uv_dct_offset, wrap_c);
1885  s->dsp.get_pixels(s->block[9], ptr_cr + uv_dct_offset, wrap_c);
1886  s->dsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
1887  s->dsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
1888  }
1889  }
1890  } else {
1891  op_pixels_func (*op_pix)[4];
1892  qpel_mc_func (*op_qpix)[16];
1893  uint8_t *dest_y, *dest_cb, *dest_cr;
1894 
1895  dest_y = s->dest[0];
1896  dest_cb = s->dest[1];
1897  dest_cr = s->dest[2];
1898 
1899  if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1900  op_pix = s->hdsp.put_pixels_tab;
1901  op_qpix = s->dsp.put_qpel_pixels_tab;
1902  } else {
1903  op_pix = s->hdsp.put_no_rnd_pixels_tab;
1904  op_qpix = s->dsp.put_no_rnd_qpel_pixels_tab;
1905  }
1906 
1907  if (s->mv_dir & MV_DIR_FORWARD) {
1908  ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
1909  s->last_picture.f.data,
1910  op_pix, op_qpix);
1911  op_pix = s->hdsp.avg_pixels_tab;
1912  op_qpix = s->dsp.avg_qpel_pixels_tab;
1913  }
1914  if (s->mv_dir & MV_DIR_BACKWARD) {
1915  ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
1916  s->next_picture.f.data,
1917  op_pix, op_qpix);
1918  }
1919 
1920  if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1921  int progressive_score, interlaced_score;
1922 
1923  s->interlaced_dct = 0;
1924  progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
1925  ptr_y, wrap_y,
1926  8) +
1927  s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
1928  ptr_y + wrap_y * 8, wrap_y,
1929  8) - 400;
1930 
1931  if (s->avctx->ildct_cmp == FF_CMP_VSSE)
1932  progressive_score -= 400;
1933 
1934  if (progressive_score > 0) {
1935  interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
1936  ptr_y,
1937  wrap_y * 2, 8) +
1938  s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
1939  ptr_y + wrap_y,
1940  wrap_y * 2, 8);
1941 
1942  if (progressive_score > interlaced_score) {
1943  s->interlaced_dct = 1;
1944 
1945  dct_offset = wrap_y;
1946  uv_dct_offset = wrap_c;
1947  wrap_y <<= 1;
1948  if (s->chroma_format == CHROMA_422)
1949  wrap_c <<= 1;
1950  }
1951  }
1952  }
1953 
1954  s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
1955  s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
1956  s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
1957  dest_y + dct_offset, wrap_y);
1958  s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
1959  dest_y + dct_offset + 8, wrap_y);
1960 
1961  if (s->flags & CODEC_FLAG_GRAY) {
1962  skip_dct[4] = 1;
1963  skip_dct[5] = 1;
1964  } else {
1965  s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
1966  s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
1967  if (!s->chroma_y_shift) { /* 422 */
1968  s->dsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
1969  dest_cb + uv_dct_offset, wrap_c);
1970  s->dsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
1971  dest_cr + uv_dct_offset, wrap_c);
1972  }
1973  }
1974  /* pre quantization */
1975  if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
1976  2 * s->qscale * s->qscale) {
1977  // FIXME optimize
1978  if (s->dsp.sad[1](NULL, ptr_y , dest_y,
1979  wrap_y, 8) < 20 * s->qscale)
1980  skip_dct[0] = 1;
1981  if (s->dsp.sad[1](NULL, ptr_y + 8,
1982  dest_y + 8, wrap_y, 8) < 20 * s->qscale)
1983  skip_dct[1] = 1;
1984  if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
1985  dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
1986  skip_dct[2] = 1;
1987  if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
1988  dest_y + dct_offset + 8,
1989  wrap_y, 8) < 20 * s->qscale)
1990  skip_dct[3] = 1;
1991  if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
1992  wrap_c, 8) < 20 * s->qscale)
1993  skip_dct[4] = 1;
1994  if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
1995  wrap_c, 8) < 20 * s->qscale)
1996  skip_dct[5] = 1;
1997  if (!s->chroma_y_shift) { /* 422 */
1998  if (s->dsp.sad[1](NULL, ptr_cb + uv_dct_offset,
1999  dest_cb + uv_dct_offset,
2000  wrap_c, 8) < 20 * s->qscale)
2001  skip_dct[6] = 1;
2002  if (s->dsp.sad[1](NULL, ptr_cr + uv_dct_offset,
2003  dest_cr + uv_dct_offset,
2004  wrap_c, 8) < 20 * s->qscale)
2005  skip_dct[7] = 1;
2006  }
2007  }
2008  }
2009 
2010  if (s->quantizer_noise_shaping) {
2011  if (!skip_dct[0])
2012  get_visual_weight(weight[0], ptr_y , wrap_y);
2013  if (!skip_dct[1])
2014  get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2015  if (!skip_dct[2])
2016  get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2017  if (!skip_dct[3])
2018  get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2019  if (!skip_dct[4])
2020  get_visual_weight(weight[4], ptr_cb , wrap_c);
2021  if (!skip_dct[5])
2022  get_visual_weight(weight[5], ptr_cr , wrap_c);
2023  if (!s->chroma_y_shift) { /* 422 */
2024  if (!skip_dct[6])
2025  get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2026  wrap_c);
2027  if (!skip_dct[7])
2028  get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2029  wrap_c);
2030  }
2031  memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2032  }
2033 
2034  /* DCT & quantize */
2035  av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
2036  {
2037  for (i = 0; i < mb_block_count; i++) {
2038  if (!skip_dct[i]) {
2039  int overflow;
2040  s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2041  // FIXME we could decide to change to quantizer instead of
2042  // clipping
2043  // JS: I don't think that would be a good idea it could lower
2044  // quality instead of improve it. Just INTRADC clipping
2045  // deserves changes in quantizer
2046  if (overflow)
2047  clip_coeffs(s, s->block[i], s->block_last_index[i]);
2048  } else
2049  s->block_last_index[i] = -1;
2050  }
2051  if (s->quantizer_noise_shaping) {
2052  for (i = 0; i < mb_block_count; i++) {
2053  if (!skip_dct[i]) {
2054  s->block_last_index[i] =
2055  dct_quantize_refine(s, s->block[i], weight[i],
2056  orig[i], i, s->qscale);
2057  }
2058  }
2059  }
2060 
2061  if (s->luma_elim_threshold && !s->mb_intra)
2062  for (i = 0; i < 4; i++)
2064  if (s->chroma_elim_threshold && !s->mb_intra)
2065  for (i = 4; i < mb_block_count; i++)
2067 
2068  if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2069  for (i = 0; i < mb_block_count; i++) {
2070  if (s->block_last_index[i] == -1)
2071  s->coded_score[i] = INT_MAX / 256;
2072  }
2073  }
2074  }
2075 
2076  if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2077  s->block_last_index[4] =
2078  s->block_last_index[5] = 0;
2079  s->block[4][0] =
2080  s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2081  if (!s->chroma_y_shift) { /* 422 / 444 */
2082  for (i=6; i<12; i++) {
2083  s->block_last_index[i] = 0;
2084  s->block[i][0] = s->block[4][0];
2085  }
2086  }
2087  }
2088 
2089  // non c quantize code returns incorrect block_last_index FIXME
2090  if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2091  for (i = 0; i < mb_block_count; i++) {
2092  int j;
2093  if (s->block_last_index[i] > 0) {
2094  for (j = 63; j > 0; j--) {
2095  if (s->block[i][s->intra_scantable.permutated[j]])
2096  break;
2097  }
2098  s->block_last_index[i] = j;
2099  }
2100  }
2101  }
2102 
2103  /* huffman encode */
2104  switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2107  if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2108  ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2109  break;
2110  case AV_CODEC_ID_MPEG4:
2111  if (CONFIG_MPEG4_ENCODER)
2112  ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2113  break;
2114  case AV_CODEC_ID_MSMPEG4V2:
2115  case AV_CODEC_ID_MSMPEG4V3:
2116  case AV_CODEC_ID_WMV1:
2118  ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2119  break;
2120  case AV_CODEC_ID_WMV2:
2121  if (CONFIG_WMV2_ENCODER)
2122  ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2123  break;
2124  case AV_CODEC_ID_H261:
2125  if (CONFIG_H261_ENCODER)
2126  ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2127  break;
2128  case AV_CODEC_ID_H263:
2129  case AV_CODEC_ID_H263P:
2130  case AV_CODEC_ID_FLV1:
2131  case AV_CODEC_ID_RV10:
2132  case AV_CODEC_ID_RV20:
2133  if (CONFIG_H263_ENCODER)
2134  ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2135  break;
2136  case AV_CODEC_ID_MJPEG:
2137  case AV_CODEC_ID_AMV:
2138  if (CONFIG_MJPEG_ENCODER)
2139  ff_mjpeg_encode_mb(s, s->block);
2140  break;
2141  default:
2142  av_assert1(0);
2143  }
2144 }
2145 
2146 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2147 {
2148  if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 8, 6);
2149  else if (s->chroma_format == CHROMA_422) encode_mb_internal(s, motion_x, motion_y, 16, 8, 8);
2150  else encode_mb_internal(s, motion_x, motion_y, 16, 16, 12);
2151 }
2152 
2153 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2154  int i;
2155 
2156  memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2157 
2158  /* mpeg1 */
2159  d->mb_skip_run= s->mb_skip_run;
2160  for(i=0; i<3; i++)
2161  d->last_dc[i] = s->last_dc[i];
2162 
2163  /* statistics */
2164  d->mv_bits= s->mv_bits;
2165  d->i_tex_bits= s->i_tex_bits;
2166  d->p_tex_bits= s->p_tex_bits;
2167  d->i_count= s->i_count;
2168  d->f_count= s->f_count;
2169  d->b_count= s->b_count;
2170  d->skip_count= s->skip_count;
2171  d->misc_bits= s->misc_bits;
2172  d->last_bits= 0;
2173 
2174  d->mb_skipped= 0;
2175  d->qscale= s->qscale;
2176  d->dquant= s->dquant;
2177 
2179 }
2180 
2181 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2182  int i;
2183 
2184  memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2185  memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2186 
2187  /* mpeg1 */
2188  d->mb_skip_run= s->mb_skip_run;
2189  for(i=0; i<3; i++)
2190  d->last_dc[i] = s->last_dc[i];
2191 
2192  /* statistics */
2193  d->mv_bits= s->mv_bits;
2194  d->i_tex_bits= s->i_tex_bits;
2195  d->p_tex_bits= s->p_tex_bits;
2196  d->i_count= s->i_count;
2197  d->f_count= s->f_count;
2198  d->b_count= s->b_count;
2199  d->skip_count= s->skip_count;
2200  d->misc_bits= s->misc_bits;
2201 
2202  d->mb_intra= s->mb_intra;
2203  d->mb_skipped= s->mb_skipped;
2204  d->mv_type= s->mv_type;
2205  d->mv_dir= s->mv_dir;
2206  d->pb= s->pb;
2207  if(s->data_partitioning){
2208  d->pb2= s->pb2;
2209  d->tex_pb= s->tex_pb;
2210  }
2211  d->block= s->block;
2212  for(i=0; i<8; i++)
2213  d->block_last_index[i]= s->block_last_index[i];
2215  d->qscale= s->qscale;
2216 
2218 }
2219 
2220 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2222  int *dmin, int *next_block, int motion_x, int motion_y)
2223 {
2224  int score;
2225  uint8_t *dest_backup[3];
2226 
2227  copy_context_before_encode(s, backup, type);
2228 
2229  s->block= s->blocks[*next_block];
2230  s->pb= pb[*next_block];
2231  if(s->data_partitioning){
2232  s->pb2 = pb2 [*next_block];
2233  s->tex_pb= tex_pb[*next_block];
2234  }
2235 
2236  if(*next_block){
2237  memcpy(dest_backup, s->dest, sizeof(s->dest));
2238  s->dest[0] = s->rd_scratchpad;
2239  s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2240  s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2241  assert(s->linesize >= 32); //FIXME
2242  }
2243 
2244  encode_mb(s, motion_x, motion_y);
2245 
2246  score= put_bits_count(&s->pb);
2247  if(s->data_partitioning){
2248  score+= put_bits_count(&s->pb2);
2249  score+= put_bits_count(&s->tex_pb);
2250  }
2251 
2252  if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2253  ff_MPV_decode_mb(s, s->block);
2254 
2255  score *= s->lambda2;
2256  score += sse_mb(s) << FF_LAMBDA_SHIFT;
2257  }
2258 
2259  if(*next_block){
2260  memcpy(s->dest, dest_backup, sizeof(s->dest));
2261  }
2262 
2263  if(score<*dmin){
2264  *dmin= score;
2265  *next_block^=1;
2266 
2267  copy_context_after_encode(best, s, type);
2268  }
2269 }
2270 
2271 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2272  uint32_t *sq = ff_squareTbl + 256;
2273  int acc=0;
2274  int x,y;
2275 
2276  if(w==16 && h==16)
2277  return s->dsp.sse[0](NULL, src1, src2, stride, 16);
2278  else if(w==8 && h==8)
2279  return s->dsp.sse[1](NULL, src1, src2, stride, 8);
2280 
2281  for(y=0; y<h; y++){
2282  for(x=0; x<w; x++){
2283  acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2284  }
2285  }
2286 
2287  av_assert2(acc>=0);
2288 
2289  return acc;
2290 }
2291 
2292 static int sse_mb(MpegEncContext *s){
2293  int w= 16;
2294  int h= 16;
2295 
2296  if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2297  if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2298 
2299  if(w==16 && h==16)
2300  if(s->avctx->mb_cmp == FF_CMP_NSSE){
2301  return s->dsp.nsse[0](s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
2302  +s->dsp.nsse[1](s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
2303  +s->dsp.nsse[1](s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
2304  }else{
2305  return s->dsp.sse[0](NULL, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
2306  +s->dsp.sse[1](NULL, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
2307  +s->dsp.sse[1](NULL, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
2308  }
2309  else
2310  return sse(s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize)
2311  +sse(s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize)
2312  +sse(s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize);
2313 }
2314 
2316  MpegEncContext *s= *(void**)arg;
2317 
2318 
2319  s->me.pre_pass=1;
2320  s->me.dia_size= s->avctx->pre_dia_size;
2321  s->first_slice_line=1;
2322  for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2323  for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2325  }
2326  s->first_slice_line=0;
2327  }
2328 
2329  s->me.pre_pass=0;
2330 
2331  return 0;
2332 }
2333 
2335  MpegEncContext *s= *(void**)arg;
2336 
2338 
2339  s->me.dia_size= s->avctx->dia_size;
2340  s->first_slice_line=1;
2341  for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2342  s->mb_x=0; //for block init below
2344  for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2345  s->block_index[0]+=2;
2346  s->block_index[1]+=2;
2347  s->block_index[2]+=2;
2348  s->block_index[3]+=2;
2349 
2350  /* compute motion vector & mb_type and store in context */
2353  else
2355  }
2356  s->first_slice_line=0;
2357  }
2358  return 0;
2359 }
2360 
2361 static int mb_var_thread(AVCodecContext *c, void *arg){
2362  MpegEncContext *s= *(void**)arg;
2363  int mb_x, mb_y;
2364 
2366 
2367  for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2368  for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2369  int xx = mb_x * 16;
2370  int yy = mb_y * 16;
2371  uint8_t *pix = s->new_picture.f.data[0] + (yy * s->linesize) + xx;
2372  int varc;
2373  int sum = s->dsp.pix_sum(pix, s->linesize);
2374 
2375  varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
2376 
2377  s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2378  s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2379  s->me.mb_var_sum_temp += varc;
2380  }
2381  }
2382  return 0;
2383 }
2384 
2386  if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2387  if(s->partitioned_frame){
2389  }
2390 
2391  ff_mpeg4_stuffing(&s->pb);
2392  }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2394  }
2395 
2397  flush_put_bits(&s->pb);
2398 
2399  if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2400  s->misc_bits+= get_bits_diff(s);
2401 }
2402 
2404 {
2405  uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2406  int offset = put_bits_count(&s->pb);
2407  int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2408  int gobn = s->mb_y / s->gob_index;
2409  int pred_x, pred_y;
2410  if (CONFIG_H263_ENCODER)
2411  ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2412  bytestream_put_le32(&ptr, offset);
2413  bytestream_put_byte(&ptr, s->qscale);
2414  bytestream_put_byte(&ptr, gobn);
2415  bytestream_put_le16(&ptr, mba);
2416  bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2417  bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2418  /* 4MV not implemented */
2419  bytestream_put_byte(&ptr, 0); /* hmv2 */
2420  bytestream_put_byte(&ptr, 0); /* vmv2 */
2421 }
2422 
2423 static void update_mb_info(MpegEncContext *s, int startcode)
2424 {
2425  if (!s->mb_info)
2426  return;
2427  if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2428  s->mb_info_size += 12;
2429  s->prev_mb_info = s->last_mb_info;
2430  }
2431  if (startcode) {
2432  s->prev_mb_info = put_bits_count(&s->pb)/8;
2433  /* This might have incremented mb_info_size above, and we return without
2434  * actually writing any info into that slot yet. But in that case,
2435  * this will be called again at the start of the after writing the
2436  * start code, actually writing the mb info. */
2437  return;
2438  }
2439 
2440  s->last_mb_info = put_bits_count(&s->pb)/8;
2441  if (!s->mb_info_size)
2442  s->mb_info_size += 12;
2443  write_mb_info(s);
2444 }
2445 
2446 static int encode_thread(AVCodecContext *c, void *arg){
2447  MpegEncContext *s= *(void**)arg;
2448  int mb_x, mb_y, pdif = 0;
2449  int chr_h= 16>>s->chroma_y_shift;
2450  int i, j;
2451  MpegEncContext best_s, backup_s;
2452  uint8_t bit_buf[2][MAX_MB_BYTES];
2453  uint8_t bit_buf2[2][MAX_MB_BYTES];
2454  uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2455  PutBitContext pb[2], pb2[2], tex_pb[2];
2456 
2458 
2459  for(i=0; i<2; i++){
2460  init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2461  init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2462  init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2463  }
2464 
2465  s->last_bits= put_bits_count(&s->pb);
2466  s->mv_bits=0;
2467  s->misc_bits=0;
2468  s->i_tex_bits=0;
2469  s->p_tex_bits=0;
2470  s->i_count=0;
2471  s->f_count=0;
2472  s->b_count=0;
2473  s->skip_count=0;
2474 
2475  for(i=0; i<3; i++){
2476  /* init last dc values */
2477  /* note: quant matrix value (8) is implied here */
2478  s->last_dc[i] = 128 << s->intra_dc_precision;
2479 
2480  s->current_picture.f.error[i] = 0;
2481  }
2482  if(s->codec_id==AV_CODEC_ID_AMV){
2483  s->last_dc[0] = 128*8/13;
2484  s->last_dc[1] = 128*8/14;
2485  s->last_dc[2] = 128*8/14;
2486  }
2487  s->mb_skip_run = 0;
2488  memset(s->last_mv, 0, sizeof(s->last_mv));
2489 
2490  s->last_mv_dir = 0;
2491 
2492  switch(s->codec_id){
2493  case AV_CODEC_ID_H263:
2494  case AV_CODEC_ID_H263P:
2495  case AV_CODEC_ID_FLV1:
2496  if (CONFIG_H263_ENCODER)
2498  break;
2499  case AV_CODEC_ID_MPEG4:
2500  if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2502  break;
2503  }
2504 
2505  s->resync_mb_x=0;
2506  s->resync_mb_y=0;
2507  s->first_slice_line = 1;
2508  s->ptr_lastgob = s->pb.buf;
2509  for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2510  s->mb_x=0;
2511  s->mb_y= mb_y;
2512 
2513  ff_set_qscale(s, s->qscale);
2515 
2516  for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2517  int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2518  int mb_type= s->mb_type[xy];
2519 // int d;
2520  int dmin= INT_MAX;
2521  int dir;
2522 
2523  if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2524  av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2525  return -1;
2526  }
2527  if(s->data_partitioning){
2528  if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2529  || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2530  av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
2531  return -1;
2532  }
2533  }
2534 
2535  s->mb_x = mb_x;
2536  s->mb_y = mb_y; // moved into loop, can get changed by H.261
2538 
2539  if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2541  xy= s->mb_y*s->mb_stride + s->mb_x;
2542  mb_type= s->mb_type[xy];
2543  }
2544 
2545  /* write gob / video packet header */
2546  if(s->rtp_mode){
2547  int current_packet_size, is_gob_start;
2548 
2549  current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2550 
2551  is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2552 
2553  if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2554 
2555  switch(s->codec_id){
2556  case AV_CODEC_ID_H263:
2557  case AV_CODEC_ID_H263P:
2558  if(!s->h263_slice_structured)
2559  if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2560  break;
2562  if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2564  if(s->mb_skip_run) is_gob_start=0;
2565  break;
2566  case AV_CODEC_ID_MJPEG:
2567  if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2568  break;
2569  }
2570 
2571  if(is_gob_start){
2572  if(s->start_mb_y != mb_y || mb_x!=0){
2573  write_slice_end(s);
2574  if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2576  }
2577  }
2578 
2579  av_assert2((put_bits_count(&s->pb)&7) == 0);
2580  current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2581 
2582  if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
2583  int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2584  int d= 100 / s->avctx->error_rate;
2585  if(r % d == 0){
2586  current_packet_size=0;
2587  s->pb.buf_ptr= s->ptr_lastgob;
2588  assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2589  }
2590  }
2591 
2592  if (s->avctx->rtp_callback){
2593  int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2594  s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2595  }
2596  update_mb_info(s, 1);
2597 
2598  switch(s->codec_id){
2599  case AV_CODEC_ID_MPEG4:
2600  if (CONFIG_MPEG4_ENCODER) {
2603  }
2604  break;
2607  if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2610  }
2611  break;
2612  case AV_CODEC_ID_H263:
2613  case AV_CODEC_ID_H263P:
2614  if (CONFIG_H263_ENCODER)
2615  ff_h263_encode_gob_header(s, mb_y);
2616  break;
2617  }
2618 
2619  if(s->flags&CODEC_FLAG_PASS1){
2620  int bits= put_bits_count(&s->pb);
2621  s->misc_bits+= bits - s->last_bits;
2622  s->last_bits= bits;
2623  }
2624 
2625  s->ptr_lastgob += current_packet_size;
2626  s->first_slice_line=1;
2627  s->resync_mb_x=mb_x;
2628  s->resync_mb_y=mb_y;
2629  }
2630  }
2631 
2632  if( (s->resync_mb_x == s->mb_x)
2633  && s->resync_mb_y+1 == s->mb_y){
2634  s->first_slice_line=0;
2635  }
2636 
2637  s->mb_skipped=0;
2638  s->dquant=0; //only for QP_RD
2639 
2640  update_mb_info(s, 0);
2641 
2642  if (mb_type & (mb_type-1) || (s->mpv_flags & FF_MPV_FLAG_QP_RD)) { // more than 1 MB type possible or FF_MPV_FLAG_QP_RD
2643  int next_block=0;
2644  int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2645 
2646  copy_context_before_encode(&backup_s, s, -1);
2647  backup_s.pb= s->pb;
2650  if(s->data_partitioning){
2651  backup_s.pb2= s->pb2;
2652  backup_s.tex_pb= s->tex_pb;
2653  }
2654 
2655  if(mb_type&CANDIDATE_MB_TYPE_INTER){
2656  s->mv_dir = MV_DIR_FORWARD;
2657  s->mv_type = MV_TYPE_16X16;
2658  s->mb_intra= 0;
2659  s->mv[0][0][0] = s->p_mv_table[xy][0];
2660  s->mv[0][0][1] = s->p_mv_table[xy][1];
2661  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2662  &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2663  }
2664  if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2665  s->mv_dir = MV_DIR_FORWARD;
2666  s->mv_type = MV_TYPE_FIELD;
2667  s->mb_intra= 0;
2668  for(i=0; i<2; i++){
2669  j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2670  s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2671  s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2672  }
2673  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2674  &dmin, &next_block, 0, 0);
2675  }
2676  if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2677  s->mv_dir = MV_DIR_FORWARD;
2678  s->mv_type = MV_TYPE_16X16;
2679  s->mb_intra= 0;
2680  s->mv[0][0][0] = 0;
2681  s->mv[0][0][1] = 0;
2682  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2683  &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2684  }
2685  if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2686  s->mv_dir = MV_DIR_FORWARD;
2687  s->mv_type = MV_TYPE_8X8;
2688  s->mb_intra= 0;
2689  for(i=0; i<4; i++){
2690  s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2691  s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2692  }
2693  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2694  &dmin, &next_block, 0, 0);
2695  }
2696  if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2697  s->mv_dir = MV_DIR_FORWARD;
2698  s->mv_type = MV_TYPE_16X16;
2699  s->mb_intra= 0;
2700  s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2701  s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2702  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2703  &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2704  }
2705  if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2706  s->mv_dir = MV_DIR_BACKWARD;
2707  s->mv_type = MV_TYPE_16X16;
2708  s->mb_intra= 0;
2709  s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2710  s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2711  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2712  &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2713  }
2714  if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2716  s->mv_type = MV_TYPE_16X16;
2717  s->mb_intra= 0;
2718  s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2719  s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2720  s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2721  s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2722  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2723  &dmin, &next_block, 0, 0);
2724  }
2725  if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2726  s->mv_dir = MV_DIR_FORWARD;
2727  s->mv_type = MV_TYPE_FIELD;
2728  s->mb_intra= 0;
2729  for(i=0; i<2; i++){
2730  j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2731  s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2732  s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2733  }
2734  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2735  &dmin, &next_block, 0, 0);
2736  }
2737  if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2738  s->mv_dir = MV_DIR_BACKWARD;
2739  s->mv_type = MV_TYPE_FIELD;
2740  s->mb_intra= 0;
2741  for(i=0; i<2; i++){
2742  j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2743  s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2744  s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2745  }
2746  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2747  &dmin, &next_block, 0, 0);
2748  }
2749  if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2751  s->mv_type = MV_TYPE_FIELD;
2752  s->mb_intra= 0;
2753  for(dir=0; dir<2; dir++){
2754  for(i=0; i<2; i++){
2755  j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2756  s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2757  s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2758  }
2759  }
2760  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2761  &dmin, &next_block, 0, 0);
2762  }
2763  if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2764  s->mv_dir = 0;
2765  s->mv_type = MV_TYPE_16X16;
2766  s->mb_intra= 1;
2767  s->mv[0][0][0] = 0;
2768  s->mv[0][0][1] = 0;
2769  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2770  &dmin, &next_block, 0, 0);
2771  if(s->h263_pred || s->h263_aic){
2772  if(best_s.mb_intra)
2773  s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2774  else
2775  ff_clean_intra_table_entries(s); //old mode?
2776  }
2777  }
2778 
2779  if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2780  if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2781  const int last_qp= backup_s.qscale;
2782  int qpi, qp, dc[6];
2783  int16_t ac[6][16];
2784  const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2785  static const int dquant_tab[4]={-1,1,-2,2};
2786  int storecoefs = s->mb_intra && s->dc_val[0];
2787 
2788  av_assert2(backup_s.dquant == 0);
2789 
2790  //FIXME intra
2791  s->mv_dir= best_s.mv_dir;
2792  s->mv_type = MV_TYPE_16X16;
2793  s->mb_intra= best_s.mb_intra;
2794  s->mv[0][0][0] = best_s.mv[0][0][0];
2795  s->mv[0][0][1] = best_s.mv[0][0][1];
2796  s->mv[1][0][0] = best_s.mv[1][0][0];
2797  s->mv[1][0][1] = best_s.mv[1][0][1];
2798 
2799  qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2800  for(; qpi<4; qpi++){
2801  int dquant= dquant_tab[qpi];
2802  qp= last_qp + dquant;
2803  if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2804  continue;
2805  backup_s.dquant= dquant;
2806  if(storecoefs){
2807  for(i=0; i<6; i++){
2808  dc[i]= s->dc_val[0][ s->block_index[i] ];
2809  memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2810  }
2811  }
2812 
2813  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2814  &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2815  if(best_s.qscale != qp){
2816  if(storecoefs){
2817  for(i=0; i<6; i++){
2818  s->dc_val[0][ s->block_index[i] ]= dc[i];
2819  memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2820  }
2821  }
2822  }
2823  }
2824  }
2825  }
2826  if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2827  int mx= s->b_direct_mv_table[xy][0];
2828  int my= s->b_direct_mv_table[xy][1];
2829 
2830  backup_s.dquant = 0;
2832  s->mb_intra= 0;
2833  ff_mpeg4_set_direct_mv(s, mx, my);
2834  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2835  &dmin, &next_block, mx, my);
2836  }
2837  if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2838  backup_s.dquant = 0;
2840  s->mb_intra= 0;
2841  ff_mpeg4_set_direct_mv(s, 0, 0);
2842  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2843  &dmin, &next_block, 0, 0);
2844  }
2845  if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2846  int coded=0;
2847  for(i=0; i<6; i++)
2848  coded |= s->block_last_index[i];
2849  if(coded){
2850  int mx,my;
2851  memcpy(s->mv, best_s.mv, sizeof(s->mv));
2852  if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2853  mx=my=0; //FIXME find the one we actually used
2854  ff_mpeg4_set_direct_mv(s, mx, my);
2855  }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2856  mx= s->mv[1][0][0];
2857  my= s->mv[1][0][1];
2858  }else{
2859  mx= s->mv[0][0][0];
2860  my= s->mv[0][0][1];
2861  }
2862 
2863  s->mv_dir= best_s.mv_dir;
2864  s->mv_type = best_s.mv_type;
2865  s->mb_intra= 0;
2866 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2867  s->mv[0][0][1] = best_s.mv[0][0][1];
2868  s->mv[1][0][0] = best_s.mv[1][0][0];
2869  s->mv[1][0][1] = best_s.mv[1][0][1];*/
2870  backup_s.dquant= 0;
2871  s->skipdct=1;
2872  encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2873  &dmin, &next_block, mx, my);
2874  s->skipdct=0;
2875  }
2876  }
2877 
2878  s->current_picture.qscale_table[xy] = best_s.qscale;
2879 
2880  copy_context_after_encode(s, &best_s, -1);
2881 
2882  pb_bits_count= put_bits_count(&s->pb);
2883  flush_put_bits(&s->pb);
2884  avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2885  s->pb= backup_s.pb;
2886 
2887  if(s->data_partitioning){
2888  pb2_bits_count= put_bits_count(&s->pb2);
2889  flush_put_bits(&s->pb2);
2890  avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2891  s->pb2= backup_s.pb2;
2892 
2893  tex_pb_bits_count= put_bits_count(&s->tex_pb);
2894  flush_put_bits(&s->tex_pb);
2895  avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2896  s->tex_pb= backup_s.tex_pb;
2897  }
2898  s->last_bits= put_bits_count(&s->pb);
2899 
2900  if (CONFIG_H263_ENCODER &&
2903 
2904  if(next_block==0){ //FIXME 16 vs linesize16
2905  s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2906  s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2907  s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2908  }
2909 
2911  ff_MPV_decode_mb(s, s->block);
2912  } else {
2913  int motion_x = 0, motion_y = 0;
2915  // only one MB-Type possible
2916 
2917  switch(mb_type){
2919  s->mv_dir = 0;
2920  s->mb_intra= 1;
2921  motion_x= s->mv[0][0][0] = 0;
2922  motion_y= s->mv[0][0][1] = 0;
2923  break;
2925  s->mv_dir = MV_DIR_FORWARD;
2926  s->mb_intra= 0;
2927  motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2928  motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2929  break;
2931  s->mv_dir = MV_DIR_FORWARD;
2932  s->mv_type = MV_TYPE_FIELD;
2933  s->mb_intra= 0;
2934  for(i=0; i<2; i++){
2935  j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2936  s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2937  s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2938  }
2939  break;
2941  s->mv_dir = MV_DIR_FORWARD;
2942  s->mv_type = MV_TYPE_8X8;
2943  s->mb_intra= 0;
2944  for(i=0; i<4; i++){
2945  s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2946  s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2947  }
2948  break;
2950  if (CONFIG_MPEG4_ENCODER) {
2952  s->mb_intra= 0;
2953  motion_x=s->b_direct_mv_table[xy][0];
2954  motion_y=s->b_direct_mv_table[xy][1];
2955  ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
2956  }
2957  break;
2959  if (CONFIG_MPEG4_ENCODER) {
2961  s->mb_intra= 0;
2962  ff_mpeg4_set_direct_mv(s, 0, 0);
2963  }
2964  break;
2967  s->mb_intra= 0;
2968  s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2969  s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2970  s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2971  s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2972  break;
2974  s->mv_dir = MV_DIR_BACKWARD;
2975  s->mb_intra= 0;
2976  motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2977  motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2978  break;
2980  s->mv_dir = MV_DIR_FORWARD;
2981  s->mb_intra= 0;
2982  motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2983  motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2984  break;
2986  s->mv_dir = MV_DIR_FORWARD;
2987  s->mv_type = MV_TYPE_FIELD;
2988  s->mb_intra= 0;
2989  for(i=0; i<2; i++){
2990  j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2991  s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2992  s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2993  }
2994  break;
2996  s->mv_dir = MV_DIR_BACKWARD;
2997  s->mv_type = MV_TYPE_FIELD;
2998  s->mb_intra= 0;
2999  for(i=0; i<2; i++){
3000  j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3001  s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3002  s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3003  }
3004  break;
3007  s->mv_type = MV_TYPE_FIELD;
3008  s->mb_intra= 0;
3009  for(dir=0; dir<2; dir++){
3010  for(i=0; i<2; i++){
3011  j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3012  s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3013  s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3014  }
3015  }
3016  break;
3017  default:
3018  av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3019  }
3020 
3021  encode_mb(s, motion_x, motion_y);
3022 
3023  // RAL: Update last macroblock type
3024  s->last_mv_dir = s->mv_dir;
3025 
3026  if (CONFIG_H263_ENCODER &&
3029 
3030  ff_MPV_decode_mb(s, s->block);
3031  }
3032 
3033  /* clean the MV table in IPS frames for direct mode in B frames */
3034  if(s->mb_intra /* && I,P,S_TYPE */){
3035  s->p_mv_table[xy][0]=0;
3036  s->p_mv_table[xy][1]=0;
3037  }
3038 
3039  if(s->flags&CODEC_FLAG_PSNR){
3040  int w= 16;
3041  int h= 16;
3042 
3043  if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3044  if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3045 
3046  s->current_picture.f.error[0] += sse(
3047  s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3048  s->dest[0], w, h, s->linesize);
3049  s->current_picture.f.error[1] += sse(
3050  s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3051  s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3052  s->current_picture.f.error[2] += sse(
3053  s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3054  s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3055  }
3056  if(s->loop_filter){
3057  if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3059  }
3060  av_dlog(s->avctx, "MB %d %d bits\n",
3061  s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3062  }
3063  }
3064 
3065  //not beautiful here but we must write it before flushing so it has to be here
3068 
3069  write_slice_end(s);
3070 
3071  /* Send the last GOB if RTP */
3072  if (s->avctx->rtp_callback) {
3073  int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3074  pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3075  /* Call the RTP callback to send the last GOB */
3076  emms_c();
3077  s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3078  }
3079 
3080  return 0;
3081 }
3082 
3083 #define MERGE(field) dst->field += src->field; src->field=0
3085  MERGE(me.scene_change_score);
3086  MERGE(me.mc_mb_var_sum_temp);
3087  MERGE(me.mb_var_sum_temp);
3088 }
3089 
3091  int i;
3092 
3093  MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3094  MERGE(dct_count[1]);
3095  MERGE(mv_bits);
3096  MERGE(i_tex_bits);
3097  MERGE(p_tex_bits);
3098  MERGE(i_count);
3099  MERGE(f_count);
3100  MERGE(b_count);
3101  MERGE(skip_count);
3102  MERGE(misc_bits);
3103  MERGE(er.error_count);
3108 
3109  if(dst->avctx->noise_reduction){
3110  for(i=0; i<64; i++){
3111  MERGE(dct_error_sum[0][i]);
3112  MERGE(dct_error_sum[1][i]);
3113  }
3114  }
3115 
3116  assert(put_bits_count(&src->pb) % 8 ==0);
3117  assert(put_bits_count(&dst->pb) % 8 ==0);
3118  avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3119  flush_put_bits(&dst->pb);
3120 }
3121 
3122 static int estimate_qp(MpegEncContext *s, int dry_run){
3123  if (s->next_lambda){
3126  if(!dry_run) s->next_lambda= 0;
3127  } else if (!s->fixed_qscale) {
3130  if (s->current_picture.f.quality < 0)
3131  return -1;
3132  }
3133 
3134  if(s->adaptive_quant){
3135  switch(s->codec_id){
3136  case AV_CODEC_ID_MPEG4:
3137  if (CONFIG_MPEG4_ENCODER)
3139  break;
3140  case AV_CODEC_ID_H263:
3141  case AV_CODEC_ID_H263P:
3142  case AV_CODEC_ID_FLV1:
3143  if (CONFIG_H263_ENCODER)
3145  break;
3146  default:
3147  ff_init_qscale_tab(s);
3148  }
3149 
3150  s->lambda= s->lambda_table[0];
3151  //FIXME broken
3152  }else
3153  s->lambda = s->current_picture.f.quality;
3154  update_qscale(s);
3155  return 0;
3156 }
3157 
3158 /* must be called before writing the header */
3160  assert(s->current_picture_ptr->f.pts != AV_NOPTS_VALUE);
3161  s->time = s->current_picture_ptr->f.pts * s->avctx->time_base.num;
3162 
3163  if(s->pict_type==AV_PICTURE_TYPE_B){
3164  s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3165  assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3166  }else{
3167  s->pp_time= s->time - s->last_non_b_time;
3168  s->last_non_b_time= s->time;
3169  assert(s->picture_number==0 || s->pp_time > 0);
3170  }
3171 }
3172 
3174 {
3175  int i, ret;
3176  int bits;
3177  int context_count = s->slice_context_count;
3178 
3180 
3181  /* Reset the average MB variance */
3182  s->me.mb_var_sum_temp =
3183  s->me.mc_mb_var_sum_temp = 0;
3184 
3185  /* we need to initialize some time vars before we can encode b-frames */
3186  // RAL: Condition added for MPEG1VIDEO
3189  if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3190  ff_set_mpeg4_time(s);
3191 
3192  s->me.scene_change_score=0;
3193 
3194 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3195 
3196  if(s->pict_type==AV_PICTURE_TYPE_I){
3197  if(s->msmpeg4_version >= 3) s->no_rounding=1;
3198  else s->no_rounding=0;
3199  }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3201  s->no_rounding ^= 1;
3202  }
3203 
3204  if(s->flags & CODEC_FLAG_PASS2){
3205  if (estimate_qp(s,1) < 0)
3206  return -1;
3207  ff_get_2pass_fcode(s);
3208  }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3210  s->lambda= s->last_lambda_for[s->pict_type];
3211  else
3213  update_qscale(s);
3214  }
3215 
3216  if(s->codec_id != AV_CODEC_ID_AMV){
3221  }
3222 
3223  s->mb_intra=0; //for the rate distortion & bit compare functions
3224  for(i=1; i<context_count; i++){
3226  if (ret < 0)
3227  return ret;
3228  }
3229 
3230  if(ff_init_me(s)<0)
3231  return -1;
3232 
3233  /* Estimate motion for every MB */
3234  if(s->pict_type != AV_PICTURE_TYPE_I){
3235  s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3236  s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3237  if (s->pict_type != AV_PICTURE_TYPE_B) {
3238  if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3239  s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3240  }
3241  }
3242 
3243  s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3244  }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3245  /* I-Frame */
3246  for(i=0; i<s->mb_stride*s->mb_height; i++)
3248 
3249  if(!s->fixed_qscale){
3250  /* finding spatial complexity for I-frame rate control */
3251  s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3252  }
3253  }
3254  for(i=1; i<context_count; i++){
3256  }
3258  s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3259  emms_c();
3260 
3263  for(i=0; i<s->mb_stride*s->mb_height; i++)
3265  if(s->msmpeg4_version >= 3)
3266  s->no_rounding=1;
3267  av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3269  }
3270 
3271  if(!s->umvplus){
3274 
3276  int a,b;
3277  a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3279  s->f_code= FFMAX3(s->f_code, a, b);
3280  }
3281 
3282  ff_fix_long_p_mvs(s);
3283  ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3285  int j;
3286  for(i=0; i<2; i++){
3287  for(j=0; j<2; j++)
3290  }
3291  }
3292  }
3293 
3294  if(s->pict_type==AV_PICTURE_TYPE_B){
3295  int a, b;
3296 
3299  s->f_code = FFMAX(a, b);
3300 
3303  s->b_code = FFMAX(a, b);
3304 
3310  int dir, j;
3311  for(dir=0; dir<2; dir++){
3312  for(i=0; i<2; i++){
3313  for(j=0; j<2; j++){
3316  ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3317  s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3318  }
3319  }
3320  }
3321  }
3322  }
3323  }
3324 
3325  if (estimate_qp(s, 0) < 0)
3326  return -1;
3327 
3328  if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3329  s->qscale= 3; //reduce clipping problems
3330 
3331  if (s->out_format == FMT_MJPEG) {
3332  /* for mjpeg, we do include qscale in the matrix */
3333  for(i=1;i<64;i++){
3334  int j= s->dsp.idct_permutation[i];
3335 
3336  s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3337  }
3338  s->y_dc_scale_table=
3342  s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3343  s->qscale= 8;
3344  }
3345  if(s->codec_id == AV_CODEC_ID_AMV){
3346  static const uint8_t y[32]={13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
3347  static const uint8_t c[32]={14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14};
3348  for(i=1;i<64;i++){
3349  int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];
3350 
3351  s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
3352  s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
3353  }
3354  s->y_dc_scale_table= y;
3355  s->c_dc_scale_table= c;
3356  s->intra_matrix[0] = 13;
3357  s->chroma_intra_matrix[0] = 14;
3359  s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3361  s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3362  s->qscale= 8;
3363  }
3364 
3365  //FIXME var duplication
3367  s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3370 
3371  if (s->current_picture.f.key_frame)
3372  s->picture_in_gop_number=0;
3373 
3374  s->mb_x = s->mb_y = 0;
3375  s->last_bits= put_bits_count(&s->pb);
3376  switch(s->out_format) {
3377  case FMT_MJPEG:
3378  if (CONFIG_MJPEG_ENCODER)
3380  break;
3381  case FMT_H261:
3382  if (CONFIG_H261_ENCODER)
3383  ff_h261_encode_picture_header(s, picture_number);
3384  break;
3385  case FMT_H263:
3386  if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3387  ff_wmv2_encode_picture_header(s, picture_number);
3388  else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3389  ff_msmpeg4_encode_picture_header(s, picture_number);
3390  else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3391  ff_mpeg4_encode_picture_header(s, picture_number);
3392  else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3393  ff_rv10_encode_picture_header(s, picture_number);
3394  else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3395  ff_rv20_encode_picture_header(s, picture_number);
3396  else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3397  ff_flv_encode_picture_header(s, picture_number);
3398  else if (CONFIG_H263_ENCODER)
3399  ff_h263_encode_picture_header(s, picture_number);
3400  break;
3401  case FMT_MPEG1:
3402  if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3403  ff_mpeg1_encode_picture_header(s, picture_number);
3404  break;
3405  default:
3406  av_assert0(0);
3407  }
3408  bits= put_bits_count(&s->pb);
3409  s->header_bits= bits - s->last_bits;
3410 
3411  for(i=1; i<context_count; i++){
3413  }
3414  s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3415  for(i=1; i<context_count; i++){
3417  }
3418  emms_c();
3419  return 0;
3420 }
3421 
3422 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3423  const int intra= s->mb_intra;
3424  int i;
3425 
3426  s->dct_count[intra]++;
3427 
3428  for(i=0; i<64; i++){
3429  int level= block[i];
3430 
3431  if(level){
3432  if(level>0){
3433  s->dct_error_sum[intra][i] += level;
3434  level -= s->dct_offset[intra][i];
3435  if(level<0) level=0;
3436  }else{
3437  s->dct_error_sum[intra][i] -= level;
3438  level += s->dct_offset[intra][i];
3439  if(level>0) level=0;
3440  }
3441  block[i]= level;
3442  }
3443  }
3444 }
3445 
3447  int16_t *block, int n,
3448  int qscale, int *overflow){
3449  const int *qmat;
3450  const uint8_t *scantable= s->intra_scantable.scantable;
3451  const uint8_t *perm_scantable= s->intra_scantable.permutated;
3452  int max=0;
3453  unsigned int threshold1, threshold2;
3454  int bias=0;
3455  int run_tab[65];
3456  int level_tab[65];
3457  int score_tab[65];
3458  int survivor[65];
3459  int survivor_count;
3460  int last_run=0;
3461  int last_level=0;
3462  int last_score= 0;
3463  int last_i;
3464  int coeff[2][64];
3465  int coeff_count[64];
3466  int qmul, qadd, start_i, last_non_zero, i, dc;
3467  const int esc_length= s->ac_esc_length;
3468  uint8_t * length;
3469  uint8_t * last_length;
3470  const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3471 
3472  s->dsp.fdct (block);
3473 
3474  if(s->dct_error_sum)
3475  s->denoise_dct(s, block);
3476  qmul= qscale*16;
3477  qadd= ((qscale-1)|1)*8;
3478 
3479  if (s->mb_intra) {
3480  int q;
3481  if (!s->h263_aic) {
3482  if (n < 4)
3483  q = s->y_dc_scale;
3484  else
3485  q = s->c_dc_scale;
3486  q = q << 3;
3487  } else{
3488  /* For AIC we skip quant/dequant of INTRADC */
3489  q = 1 << 3;
3490  qadd=0;
3491  }
3492 
3493  /* note: block[0] is assumed to be positive */
3494  block[0] = (block[0] + (q >> 1)) / q;
3495  start_i = 1;
3496  last_non_zero = 0;
3497  qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3498  if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3499  bias= 1<<(QMAT_SHIFT-1);
3500  length = s->intra_ac_vlc_length;
3501  last_length= s->intra_ac_vlc_last_length;
3502  } else {
3503  start_i = 0;
3504  last_non_zero = -1;
3505  qmat = s->q_inter_matrix[qscale];
3506  length = s->inter_ac_vlc_length;
3507  last_length= s->inter_ac_vlc_last_length;
3508  }
3509  last_i= start_i;
3510 
3511  threshold1= (1<<QMAT_SHIFT) - bias - 1;
3512  threshold2= (threshold1<<1);
3513 
3514  for(i=63; i>=start_i; i--) {
3515  const int j = scantable[i];
3516  int level = block[j] * qmat[j];
3517 
3518  if(((unsigned)(level+threshold1))>threshold2){
3519  last_non_zero = i;
3520  break;
3521  }
3522  }
3523 
3524  for(i=start_i; i<=last_non_zero; i++) {
3525  const int j = scantable[i];
3526  int level = block[j] * qmat[j];
3527 
3528 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3529 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3530  if(((unsigned)(level+threshold1))>threshold2){
3531  if(level>0){
3532  level= (bias + level)>>QMAT_SHIFT;
3533  coeff[0][i]= level;
3534  coeff[1][i]= level-1;
3535 // coeff[2][k]= level-2;
3536  }else{
3537  level= (bias - level)>>QMAT_SHIFT;
3538  coeff[0][i]= -level;
3539  coeff[1][i]= -level+1;
3540 // coeff[2][k]= -level+2;
3541  }
3542  coeff_count[i]= FFMIN(level, 2);
3543  av_assert2(coeff_count[i]);
3544  max |=level;
3545  }else{
3546  coeff[0][i]= (level>>31)|1;
3547  coeff_count[i]= 1;
3548  }
3549  }
3550 
3551  *overflow= s->max_qcoeff < max; //overflow might have happened
3552 
3553  if(last_non_zero < start_i){
3554  memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3555  return last_non_zero;
3556  }
3557 
3558  score_tab[start_i]= 0;
3559  survivor[0]= start_i;
3560  survivor_count= 1;
3561 
3562  for(i=start_i; i<=last_non_zero; i++){
3563  int level_index, j, zero_distortion;
3564  int dct_coeff= FFABS(block[ scantable[i] ]);
3565  int best_score=256*256*256*120;
3566 
3567  if (s->dsp.fdct == ff_fdct_ifast)
3568  dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3569  zero_distortion= dct_coeff*dct_coeff;
3570 
3571  for(level_index=0; level_index < coeff_count[i]; level_index++){
3572  int distortion;
3573  int level= coeff[level_index][i];
3574  const int alevel= FFABS(level);
3575  int unquant_coeff;
3576 
3577  av_assert2(level);
3578 
3579  if(s->out_format == FMT_H263){
3580  unquant_coeff= alevel*qmul + qadd;
3581  }else{ //MPEG1
3582  j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3583  if(s->mb_intra){
3584  unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3585  unquant_coeff = (unquant_coeff - 1) | 1;
3586  }else{
3587  unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3588  unquant_coeff = (unquant_coeff - 1) | 1;
3589  }
3590  unquant_coeff<<= 3;
3591  }
3592 
3593  distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3594  level+=64;
3595  if((level&(~127)) == 0){
3596  for(j=survivor_count-1; j>=0; j--){
3597  int run= i - survivor[j];
3598  int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3599  score += score_tab[i-run];
3600 
3601  if(score < best_score){
3602  best_score= score;
3603  run_tab[i+1]= run;
3604  level_tab[i+1]= level-64;
3605  }
3606  }
3607 
3608  if(s->out_format == FMT_H263){
3609  for(j=survivor_count-1; j>=0; j--){
3610  int run= i - survivor[j];
3611  int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3612  score += score_tab[i-run];
3613  if(score < last_score){
3614  last_score= score;
3615  last_run= run;
3616  last_level= level-64;
3617  last_i= i+1;
3618  }
3619  }
3620  }
3621  }else{
3622  distortion += esc_length*lambda;
3623  for(j=survivor_count-1; j>=0; j--){
3624  int run= i - survivor[j];
3625  int score= distortion + score_tab[i-run];
3626 
3627  if(score < best_score){
3628  best_score= score;
3629  run_tab[i+1]= run;
3630  level_tab[i+1]= level-64;
3631  }
3632  }
3633 
3634  if(s->out_format == FMT_H263){
3635  for(j=survivor_count-1; j>=0; j--){
3636  int run= i - survivor[j];
3637  int score= distortion + score_tab[i-run];
3638  if(score < last_score){
3639  last_score= score;
3640  last_run= run;
3641  last_level= level-64;
3642  last_i= i+1;
3643  }
3644  }
3645  }
3646  }
3647  }
3648 
3649  score_tab[i+1]= best_score;
3650 
3651  //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3652  if(last_non_zero <= 27){
3653  for(; survivor_count; survivor_count--){
3654  if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3655  break;
3656  }
3657  }else{
3658  for(; survivor_count; survivor_count--){
3659  if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3660  break;
3661  }
3662  }
3663 
3664  survivor[ survivor_count++ ]= i+1;
3665  }
3666 
3667  if(s->out_format != FMT_H263){
3668  last_score= 256*256*256*120;
3669  for(i= survivor[0]; i<=last_non_zero + 1; i++){
3670  int score= score_tab[i];
3671  if(i) score += lambda*2; //FIXME exacter?
3672 
3673  if(score < last_score){
3674  last_score= score;
3675  last_i= i;
3676  last_level= level_tab[i];
3677  last_run= run_tab[i];
3678  }
3679  }
3680  }
3681 
3682  s->coded_score[n] = last_score;
3683 
3684  dc= FFABS(block[0]);
3685  last_non_zero= last_i - 1;
3686  memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3687 
3688  if(last_non_zero < start_i)
3689  return last_non_zero;
3690 
3691  if(last_non_zero == 0 && start_i == 0){
3692  int best_level= 0;
3693  int best_score= dc * dc;
3694 
3695  for(i=0; i<coeff_count[0]; i++){
3696  int level= coeff[i][0];
3697  int alevel= FFABS(level);
3698  int unquant_coeff, score, distortion;
3699 
3700  if(s->out_format == FMT_H263){
3701  unquant_coeff= (alevel*qmul + qadd)>>3;
3702  }else{ //MPEG1
3703  unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3704  unquant_coeff = (unquant_coeff - 1) | 1;
3705  }
3706  unquant_coeff = (unquant_coeff + 4) >> 3;
3707  unquant_coeff<<= 3 + 3;
3708 
3709  distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3710  level+=64;
3711  if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3712  else score= distortion + esc_length*lambda;
3713 
3714  if(score < best_score){
3715  best_score= score;
3716  best_level= level - 64;
3717  }
3718  }
3719  block[0]= best_level;
3720  s->coded_score[n] = best_score - dc*dc;
3721  if(best_level == 0) return -1;
3722  else return last_non_zero;
3723  }
3724 
3725  i= last_i;
3726  av_assert2(last_level);
3727 
3728  block[ perm_scantable[last_non_zero] ]= last_level;
3729  i -= last_run + 1;
3730 
3731  for(; i>start_i; i -= run_tab[i] + 1){
3732  block[ perm_scantable[i-1] ]= level_tab[i];
3733  }
3734 
3735  return last_non_zero;
3736 }
3737 
3738 //#define REFINE_STATS 1
3739 static int16_t basis[64][64];
3740 
3741 static void build_basis(uint8_t *perm){
3742  int i, j, x, y;
3743  emms_c();
3744  for(i=0; i<8; i++){
3745  for(j=0; j<8; j++){
3746  for(y=0; y<8; y++){
3747  for(x=0; x<8; x++){
3748  double s= 0.25*(1<<BASIS_SHIFT);
3749  int index= 8*i + j;
3750  int perm_index= perm[index];
3751  if(i==0) s*= sqrt(0.5);
3752  if(j==0) s*= sqrt(0.5);
3753  basis[perm_index][8*x + y]= lrintf(s * cos((M_PI/8.0)*i*(x+0.5)) * cos((M_PI/8.0)*j*(y+0.5)));
3754  }
3755  }
3756  }
3757  }
3758 }
3759 
3760 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3761  int16_t *block, int16_t *weight, int16_t *orig,
3762  int n, int qscale){
3763  int16_t rem[64];
3764  LOCAL_ALIGNED_16(int16_t, d1, [64]);
3765  const uint8_t *scantable= s->intra_scantable.scantable;
3766  const uint8_t *perm_scantable= s->intra_scantable.permutated;
3767 // unsigned int threshold1, threshold2;
3768 // int bias=0;
3769  int run_tab[65];
3770  int prev_run=0;
3771  int prev_level=0;
3772  int qmul, qadd, start_i, last_non_zero, i, dc;
3773  uint8_t * length;
3774  uint8_t * last_length;
3775  int lambda;
3776  int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3777 #ifdef REFINE_STATS
3778 static int count=0;
3779 static int after_last=0;
3780 static int to_zero=0;
3781 static int from_zero=0;
3782 static int raise=0;
3783 static int lower=0;
3784 static int messed_sign=0;
3785 #endif
3786 
3787  if(basis[0][0] == 0)
3789 
3790  qmul= qscale*2;
3791  qadd= (qscale-1)|1;
3792  if (s->mb_intra) {
3793  if (!s->h263_aic) {
3794  if (n < 4)
3795  q = s->y_dc_scale;
3796  else
3797  q = s->c_dc_scale;
3798  } else{
3799  /* For AIC we skip quant/dequant of INTRADC */
3800  q = 1;
3801  qadd=0;
3802  }
3803  q <<= RECON_SHIFT-3;
3804  /* note: block[0] is assumed to be positive */
3805  dc= block[0]*q;
3806 // block[0] = (block[0] + (q >> 1)) / q;
3807  start_i = 1;
3808 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3809 // bias= 1<<(QMAT_SHIFT-1);
3810  length = s->intra_ac_vlc_length;
3811  last_length= s->intra_ac_vlc_last_length;
3812  } else {
3813  dc= 0;
3814  start_i = 0;
3815  length = s->inter_ac_vlc_length;
3816  last_length= s->inter_ac_vlc_last_length;
3817  }
3818  last_non_zero = s->block_last_index[n];
3819 
3820 #ifdef REFINE_STATS
3821 {START_TIMER
3822 #endif
3823  dc += (1<<(RECON_SHIFT-1));
3824  for(i=0; i<64; i++){
3825  rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3826  }
3827 #ifdef REFINE_STATS
3828 STOP_TIMER("memset rem[]")}
3829 #endif
3830  sum=0;
3831  for(i=0; i<64; i++){
3832  int one= 36;
3833  int qns=4;
3834  int w;
3835 
3836  w= FFABS(weight[i]) + qns*one;
3837  w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3838 
3839  weight[i] = w;
3840 // w=weight[i] = (63*qns + (w/2)) / w;
3841 
3842  av_assert2(w>0);
3843  av_assert2(w<(1<<6));
3844  sum += w*w;
3845  }
3846  lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3847 #ifdef REFINE_STATS
3848 {START_TIMER
3849 #endif
3850  run=0;
3851  rle_index=0;
3852  for(i=start_i; i<=last_non_zero; i++){
3853  int j= perm_scantable[i];
3854  const int level= block[j];
3855  int coeff;
3856 
3857  if(level){
3858  if(level<0) coeff= qmul*level - qadd;
3859  else coeff= qmul*level + qadd;
3860  run_tab[rle_index++]=run;
3861  run=0;
3862 
3863  s->dsp.add_8x8basis(rem, basis[j], coeff);
3864  }else{
3865  run++;
3866  }
3867  }
3868 #ifdef REFINE_STATS
3869 if(last_non_zero>0){
3870 STOP_TIMER("init rem[]")
3871 }
3872 }
3873 
3874 {START_TIMER
3875 #endif
3876  for(;;){
3877  int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
3878  int best_coeff=0;
3879  int best_change=0;
3880  int run2, best_unquant_change=0, analyze_gradient;
3881 #ifdef REFINE_STATS
3882 {START_TIMER
3883 #endif
3884  analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3885 
3886  if(analyze_gradient){
3887 #ifdef REFINE_STATS
3888 {START_TIMER
3889 #endif
3890  for(i=0; i<64; i++){
3891  int w= weight[i];
3892 
3893  d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3894  }
3895 #ifdef REFINE_STATS
3896 STOP_TIMER("rem*w*w")}
3897 {START_TIMER
3898 #endif
3899  s->dsp.fdct(d1);
3900 #ifdef REFINE_STATS
3901 STOP_TIMER("dct")}
3902 #endif
3903  }
3904 
3905  if(start_i){
3906  const int level= block[0];
3907  int change, old_coeff;
3908 
3909  av_assert2(s->mb_intra);
3910 
3911  old_coeff= q*level;
3912 
3913  for(change=-1; change<=1; change+=2){
3914  int new_level= level + change;
3915  int score, new_coeff;
3916 
3917  new_coeff= q*new_level;
3918  if(new_coeff >= 2048 || new_coeff < 0)
3919  continue;
3920 
3921  score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
3922  if(score<best_score){
3923  best_score= score;
3924  best_coeff= 0;
3925  best_change= change;
3926  best_unquant_change= new_coeff - old_coeff;
3927  }
3928  }
3929  }
3930 
3931  run=0;
3932  rle_index=0;
3933  run2= run_tab[rle_index++];
3934  prev_level=0;
3935  prev_run=0;
3936 
3937  for(i=start_i; i<64; i++){
3938  int j= perm_scantable[i];
3939  const int level= block[j];
3940  int change, old_coeff;
3941 
3942  if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3943  break;
3944 
3945  if(level){
3946  if(level<0) old_coeff= qmul*level - qadd;
3947  else old_coeff= qmul*level + qadd;
3948  run2= run_tab[rle_index++]; //FIXME ! maybe after last
3949  }else{
3950  old_coeff=0;
3951  run2--;
3952  av_assert2(run2>=0 || i >= last_non_zero );
3953  }
3954 
3955  for(change=-1; change<=1; change+=2){
3956  int new_level= level + change;
3957  int score, new_coeff, unquant_change;
3958 
3959  score=0;
3960  if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
3961  continue;
3962 
3963  if(new_level){
3964  if(new_level<0) new_coeff= qmul*new_level - qadd;
3965  else new_coeff= qmul*new_level + qadd;
3966  if(new_coeff >= 2048 || new_coeff <= -2048)
3967  continue;
3968  //FIXME check for overflow
3969 
3970  if(level){
3971  if(level < 63 && level > -63){
3972  if(i < last_non_zero)
3973  score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
3974  - length[UNI_AC_ENC_INDEX(run, level+64)];
3975  else
3976  score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
3977  - last_length[UNI_AC_ENC_INDEX(run, level+64)];
3978  }
3979  }else{
3980  av_assert2(FFABS(new_level)==1);
3981 
3982  if(analyze_gradient){
3983  int g= d1[ scantable[i] ];
3984  if(g && (g^new_level) >= 0)
3985  continue;
3986  }
3987 
3988  if(i < last_non_zero){
3989  int next_i= i + run2 + 1;
3990  int next_level= block[ perm_scantable[next_i] ] + 64;
3991 
3992  if(next_level&(~127))
3993  next_level= 0;
3994 
3995  if(next_i < last_non_zero)
3996  score += length[UNI_AC_ENC_INDEX(run, 65)]
3997  + length[UNI_AC_ENC_INDEX(run2, next_level)]
3998  - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
3999  else
4000  score += length[UNI_AC_ENC_INDEX(run, 65)]
4001  + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4002  - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4003  }else{
4004  score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4005  if(prev_level){
4006  score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4007  - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4008  }
4009  }
4010  }
4011  }else{
4012  new_coeff=0;
4013  av_assert2(FFABS(level)==1);
4014 
4015  if(i < last_non_zero){
4016  int next_i= i + run2 + 1;
4017  int next_level= block[ perm_scantable[next_i] ] + 64;
4018 
4019  if(next_level&(~127))
4020  next_level= 0;
4021 
4022  if(next_i < last_non_zero)
4023  score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4024  - length[UNI_AC_ENC_INDEX(run2, next_level)]
4025  - length[UNI_AC_ENC_INDEX(run, 65)];
4026  else
4027  score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4028  - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4029  - length[UNI_AC_ENC_INDEX(run, 65)];
4030  }else{
4031  score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4032  if(prev_level){
4033  score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4034  - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4035  }
4036  }
4037  }
4038 
4039  score *= lambda;
4040 
4041  unquant_change= new_coeff - old_coeff;
4042  av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4043 
4044  score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
4045  if(score<best_score){
4046  best_score= score;
4047  best_coeff= i;
4048  best_change= change;
4049  best_unquant_change= unquant_change;
4050  }
4051  }
4052  if(level){
4053  prev_level= level + 64;
4054  if(prev_level&(~127))
4055  prev_level= 0;
4056  prev_run= run;
4057  run=0;
4058  }else{
4059  run++;
4060  }
4061  }
4062 #ifdef REFINE_STATS
4063 STOP_TIMER("iterative step")}
4064 #endif
4065 
4066  if(best_change){
4067  int j= perm_scantable[ best_coeff ];
4068 
4069  block[j] += best_change;
4070 
4071  if(best_coeff > last_non_zero){
4072  last_non_zero= best_coeff;
4073  av_assert2(block[j]);
4074 #ifdef REFINE_STATS
4075 after_last++;
4076 #endif
4077  }else{
4078 #ifdef REFINE_STATS
4079 if(block[j]){
4080  if(block[j] - best_change){
4081  if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4082  raise++;
4083  }else{
4084  lower++;
4085  }
4086  }else{
4087  from_zero++;
4088  }
4089 }else{
4090  to_zero++;
4091 }
4092 #endif
4093  for(; last_non_zero>=start_i; last_non_zero--){
4094  if(block[perm_scantable[last_non_zero]])
4095  break;
4096  }
4097  }
4098 #ifdef REFINE_STATS
4099 count++;
4100 if(256*256*256*64 % count == 0){
4101  av_log(s->avctx, AV_LOG_DEBUG, "after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
4102 }
4103 #endif
4104  run=0;
4105  rle_index=0;
4106  for(i=start_i; i<=last_non_zero; i++){
4107  int j= perm_scantable[i];
4108  const int level= block[j];
4109 
4110  if(level){
4111  run_tab[rle_index++]=run;
4112  run=0;
4113  }else{
4114  run++;
4115  }
4116  }
4117 
4118  s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
4119  }else{
4120  break;
4121  }
4122  }
4123 #ifdef REFINE_STATS
4124 if(last_non_zero>0){
4125 STOP_TIMER("iterative search")
4126 }
4127 }
4128 #endif
4129 
4130  return last_non_zero;
4131 }
4132 
4134  int16_t *block, int n,
4135  int qscale, int *overflow)
4136 {
4137  int i, j, level, last_non_zero, q, start_i;
4138  const int *qmat;
4139  const uint8_t *scantable= s->intra_scantable.scantable;
4140  int bias;
4141  int max=0;
4142  unsigned int threshold1, threshold2;
4143 
4144  s->dsp.fdct (block);
4145 
4146  if(s->dct_error_sum)
4147  s->denoise_dct(s, block);
4148 
4149  if (s->mb_intra) {
4150  if (!s->h263_aic) {
4151  if (n < 4)
4152  q = s->y_dc_scale;
4153  else
4154  q = s->c_dc_scale;
4155  q = q << 3;
4156  } else
4157  /* For AIC we skip quant/dequant of INTRADC */
4158  q = 1 << 3;
4159 
4160  /* note: block[0] is assumed to be positive */
4161  block[0] = (block[0] + (q >> 1)) / q;
4162  start_i = 1;
4163  last_non_zero = 0;
4164  qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4166  } else {
4167  start_i = 0;
4168  last_non_zero = -1;
4169  qmat = s->q_inter_matrix[qscale];
4171  }
4172  threshold1= (1<<QMAT_SHIFT) - bias - 1;
4173  threshold2= (threshold1<<1);
4174  for(i=63;i>=start_i;i--) {
4175  j = scantable[i];
4176  level = block[j] * qmat[j];
4177 
4178  if(((unsigned)(level+threshold1))>threshold2){
4179  last_non_zero = i;
4180  break;
4181  }else{
4182  block[j]=0;
4183  }
4184  }
4185  for(i=start_i; i<=last_non_zero; i++) {
4186  j = scantable[i];
4187  level = block[j] * qmat[j];
4188 
4189 // if( bias+level >= (1<<QMAT_SHIFT)
4190 // || bias-level >= (1<<QMAT_SHIFT)){
4191  if(((unsigned)(level+threshold1))>threshold2){
4192  if(level>0){
4193  level= (bias + level)>>QMAT_SHIFT;
4194  block[j]= level;
4195  }else{
4196  level= (bias - level)>>QMAT_SHIFT;
4197  block[j]= -level;
4198  }
4199  max |=level;
4200  }else{
4201  block[j]=0;
4202  }
4203  }
4204  *overflow= s->max_qcoeff < max; //overflow might have happened
4205 
4206  /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4208  ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4209 
4210  return last_non_zero;
4211 }
4212 
4213 #define OFFSET(x) offsetof(MpegEncContext, x)
4214 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4215 static const AVOption h263_options[] = {
4216  { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4217  { "structured_slices","Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
4218  { "mb_info", "emit macroblock info for RFC 2190 packetization, the parameter value is the maximum payload size", OFFSET(mb_info), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
4220  { NULL },
4221 };
4222 
4223 static const AVClass h263_class = {
4224  .class_name = "H.263 encoder",
4225  .item_name = av_default_item_name,
4226  .option = h263_options,
4227  .version = LIBAVUTIL_VERSION_INT,
4228 };
4229 
4231  .name = "h263",
4232  .type = AVMEDIA_TYPE_VIDEO,
4233  .id = AV_CODEC_ID_H263,
4234  .priv_data_size = sizeof(MpegEncContext),
4236  .encode2 = ff_MPV_encode_picture,
4238  .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4239  .long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4240  .priv_class = &h263_class,
4241 };
4242 
4243 static const AVOption h263p_options[] = {
4244  { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4245  { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4246  { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4247  { "structured_slices", "Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
4249  { NULL },
4250 };
4251 static const AVClass h263p_class = {
4252  .class_name = "H.263p encoder",
4253  .item_name = av_default_item_name,
4254  .option = h263p_options,
4255  .version = LIBAVUTIL_VERSION_INT,
4256 };
4257 
4259  .name = "h263p",
4260  .type = AVMEDIA_TYPE_VIDEO,
4261  .id = AV_CODEC_ID_H263P,
4262  .priv_data_size = sizeof(MpegEncContext),
4264  .encode2 = ff_MPV_encode_picture,
4266  .capabilities = CODEC_CAP_SLICE_THREADS,
4267  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4268  .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4269  .priv_class = &h263p_class,
4270 };
4271 
4272 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4273 
4275  .name = "msmpeg4v2",
4276  .type = AVMEDIA_TYPE_VIDEO,
4277  .id = AV_CODEC_ID_MSMPEG4V2,
4278  .priv_data_size = sizeof(MpegEncContext),
4280  .encode2 = ff_MPV_encode_picture,
4282  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4283  .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4284  .priv_class = &msmpeg4v2_class,
4285 };
4286 
4287 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4288 
4290  .name = "msmpeg4",
4291  .type = AVMEDIA_TYPE_VIDEO,
4292  .id = AV_CODEC_ID_MSMPEG4V3,
4293  .priv_data_size = sizeof(MpegEncContext),
4295  .encode2 = ff_MPV_encode_picture,
4297  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4298  .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4299  .priv_class = &msmpeg4v3_class,
4300 };
4301 
4303 
4305  .name = "wmv1",
4306  .type = AVMEDIA_TYPE_VIDEO,
4307  .id = AV_CODEC_ID_WMV1,
4308  .priv_data_size = sizeof(MpegEncContext),
4310  .encode2 = ff_MPV_encode_picture,
4312  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4313  .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4314  .priv_class = &wmv1_class,
4315 };