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