OSDN Git Service

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