summaryrefslogtreecommitdiff
path: root/libavcodec/mpegvideo_enc.c (plain)
blob: db241c82f0982bc2ed4f8e7f3534505ffef041ee
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
76static int encode_picture(MpegEncContext *s, int picture_number);
77static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
78static int sse_mb(MpegEncContext *s);
79static void denoise_dct_c(MpegEncContext *s, int16_t *block);
80static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
81
82static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_DMV * 2 + 1];
83static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
84
85const AVOption ff_mpv_generic_options[] = {
86 FF_MPV_COMMON_OPTS
87 { NULL },
88};
89
90void 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
174static 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
202void 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 */
218void 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
231static 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 */
254static 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
269av_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 */
288av_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
355FF_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;
362FF_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
419FF_DISABLE_DEPRECATION_WARNINGS
420 s->me_method = avctx->me_method;
421FF_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
659FF_DISABLE_DEPRECATION_WARNINGS
660 if (avctx->scenechange_threshold)
661 s->scenechange_threshold = avctx->scenechange_threshold;
662FF_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
724FF_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;
729FF_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
762FF_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;
767FF_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
985FF_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;
994FF_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
1045FF_DISABLE_DEPRECATION_WARNINGS
1046 if (!s->rc_strategy)
1047 s->rc_strategy = s->avctx->rc_strategy;
1048FF_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;
1152fail:
1153 ff_mpv_encode_end(avctx);
1154 return AVERROR_UNKNOWN;
1155}
1156
1157av_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
1199static 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
1213static 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
1236static 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
1244static 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
1395static 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
1436static 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
1460static 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
1585fail:
1586 avcodec_free_context(&c);
1587 if (ret < 0)
1588 return ret;
1589 }
1590
1591 return best_b_count;
1592}
1593
1594static 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 }
1718no_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
1770static 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
1807FF_DISABLE_DEPRECATION_WARNINGS
1808 av_frame_unref(s->avctx->coded_frame);
1809 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1810FF_ENABLE_DEPRECATION_WARNINGS
1811#endif
1812#if FF_API_ERROR_FRAME
1813FF_DISABLE_DEPRECATION_WARNINGS
1814 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1815 sizeof(s->current_picture.encoding_error));
1816FF_ENABLE_DEPRECATION_WARNINGS
1817#endif
1818}
1819
1820static 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
1841static 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
1913int 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;
1961vbv_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
1972FF_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;
1982FF_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
2131FF_DISABLE_DEPRECATION_WARNINGS
2132 avctx->vbv_delay = vbv_delay * 300;
2133FF_ENABLE_DEPRECATION_WARNINGS
2134#endif
2135 }
2136 s->total_bits += s->frame_bits;
2137#if FF_API_STAT_BITS
2138FF_DISABLE_DEPRECATION_WARNINGS
2139 avctx->frame_bits = s->frame_bits;
2140FF_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
2174static 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
2230static 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
2264static 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
2288static 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
2668static 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
2675static 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
2703static 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
2742static 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
2793static 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
2814static 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
2837static 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
2856static 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
2883static 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
2908static 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
2926static 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
2946static 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
2969int 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
3005static 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
3158FF_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 }
3163FF_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
3641FF_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 }
3650FF_ENABLE_DEPRECATION_WARNINGS
3651#endif
3652
3653 return 0;
3654}
3655
3656#define MERGE(field) dst->field += src->field; src->field=0
3657static 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
3663static 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
3695static 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 */
3739static 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
3753static 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
4028static 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
4052static 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
4362static int16_t basis[64][64];
4363
4364static 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
4383static 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
4401static int count=0;
4402static int after_last=0;
4403static int to_zero=0;
4404static int from_zero=0;
4405static int raise=0;
4406static int lower=0;
4407static 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
4456STOP_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
4497if(last_non_zero>0){
4498STOP_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
4524STOP_TIMER("rem*w*w")}
4525{START_TIMER
4526#endif
4527 s->fdsp.fdct(d1);
4528#ifdef REFINE_STATS
4529STOP_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
4693STOP_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
4705after_last++;
4706#endif
4707 }else{
4708#ifdef REFINE_STATS
4709if(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
4729count++;
4730if(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
4754if(last_non_zero>0){
4755STOP_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 */
4774void 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
4799int 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
4882static 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
4889static 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
4896AVCodec 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
4909static 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};
4917static 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
4924AVCodec 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
4938static 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
4945AVCodec 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
4958static 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
4965AVCodec 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
4978static 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
4985AVCodec 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};
4997