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>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of FFmpeg.
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.
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.
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
26 * non linear quantizers with large QPs and VBV with restrictive qmin fixes sponsored by NOA GmbH
31 * The simplest mpeg encoder (well, it was the simplest!).
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"
46 #include "mpegvideo.h"
47 #include "mpegvideodata.h"
51 #include "mjpegenc_common.h"
53 #include "mpegutils.h"
56 #include "pixblockdsp.h"
60 #include "aandcttab.h"
62 #include "mpeg4video.h"
64 #include "bytestream.h"
70 #define QUANT_BIAS_SHIFT 8
72 #define QMAT_SHIFT_MMX 16
75 static int encode_picture(MpegEncContext *s, int picture_number);
76 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
77 static int sse_mb(MpegEncContext *s);
78 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
79 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
81 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_DMV * 2 + 1];
82 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
84 const AVOption ff_mpv_generic_options[] = {
89 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
90 uint16_t (*qmat16)[2][64],
91 const uint16_t *quant_matrix,
92 int bias, int qmin, int qmax, int intra)
94 FDCTDSPContext *fdsp = &s->fdsp;
98 for (qscale = qmin; qscale <= qmax; qscale++) {
102 if (s->q_scale_type) qscale2 = ff_mpeg2_non_linear_qscale[qscale];
103 else qscale2 = qscale << 1;
105 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
107 fdsp->fdct == ff_faandct ||
108 #endif /* CONFIG_FAANDCT */
109 fdsp->fdct == ff_jpeg_fdct_islow_10) {
110 for (i = 0; i < 64; i++) {
111 const int j = s->idsp.idct_permutation[i];
112 int64_t den = (int64_t) qscale2 * quant_matrix[j];
113 /* 16 <= qscale * quant_matrix[i] <= 7905
114 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
115 * 19952 <= x <= 249205026
116 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
117 * 3444240 >= (1 << 36) / (x) >= 275 */
119 qmat[qscale][i] = (int)((UINT64_C(2) << QMAT_SHIFT) / den);
121 } else if (fdsp->fdct == ff_fdct_ifast) {
122 for (i = 0; i < 64; i++) {
123 const int j = s->idsp.idct_permutation[i];
124 int64_t den = ff_aanscales[i] * (int64_t) qscale2 * quant_matrix[j];
125 /* 16 <= qscale * quant_matrix[i] <= 7905
126 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
127 * 19952 <= x <= 249205026
128 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
129 * 3444240 >= (1 << 36) / (x) >= 275 */
131 qmat[qscale][i] = (int)((UINT64_C(2) << (QMAT_SHIFT + 14)) / den);
134 for (i = 0; i < 64; i++) {
135 const int j = s->idsp.idct_permutation[i];
136 int64_t den = (int64_t) qscale2 * quant_matrix[j];
137 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
138 * Assume x = qscale * quant_matrix[i]
140 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
141 * so 32768 >= (1 << 19) / (x) >= 67 */
142 qmat[qscale][i] = (int)((UINT64_C(2) << QMAT_SHIFT) / den);
143 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
144 // (qscale * quant_matrix[i]);
145 qmat16[qscale][0][i] = (2 << QMAT_SHIFT_MMX) / den;
147 if (qmat16[qscale][0][i] == 0 ||
148 qmat16[qscale][0][i] == 128 * 256)
149 qmat16[qscale][0][i] = 128 * 256 - 1;
150 qmat16[qscale][1][i] =
151 ROUNDED_DIV(bias * (1<<(16 - QUANT_BIAS_SHIFT)),
152 qmat16[qscale][0][i]);
156 for (i = intra; i < 64; i++) {
158 if (fdsp->fdct == ff_fdct_ifast) {
159 max = (8191LL * ff_aanscales[i]) >> 14;
161 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
167 av_log(NULL, AV_LOG_INFO,
168 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
173 static inline void update_qscale(MpegEncContext *s)
175 if (s->q_scale_type == 1 && 0) {
177 int bestdiff=INT_MAX;
180 for (i = 0 ; i<FF_ARRAY_ELEMS(ff_mpeg2_non_linear_qscale); i++) {
181 int diff = FFABS((ff_mpeg2_non_linear_qscale[i]<<(FF_LAMBDA_SHIFT + 6)) - (int)s->lambda * 139);
182 if (ff_mpeg2_non_linear_qscale[i] < s->avctx->qmin ||
183 (ff_mpeg2_non_linear_qscale[i] > s->avctx->qmax && !s->vbv_ignore_qmax))
185 if (diff < bestdiff) {
192 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
193 (FF_LAMBDA_SHIFT + 7);
194 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->vbv_ignore_qmax ? 31 : s->avctx->qmax);
197 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
201 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
207 for (i = 0; i < 64; i++) {
208 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
215 * init s->current_picture.qscale_table from s->lambda_table
217 void ff_init_qscale_tab(MpegEncContext *s)
219 int8_t * const qscale_table = s->current_picture.qscale_table;
222 for (i = 0; i < s->mb_num; i++) {
223 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
224 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
225 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
230 static void update_duplicate_context_after_me(MpegEncContext *dst,
233 #define COPY(a) dst->a= src->a
235 COPY(current_picture);
241 COPY(picture_in_gop_number);
242 COPY(gop_picture_number);
243 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
244 COPY(progressive_frame); // FIXME don't set in encode_header
245 COPY(partitioned_frame); // FIXME don't set in encode_header
250 * Set the given MpegEncContext to defaults for encoding.
251 * the changed fields will not depend upon the prior state of the MpegEncContext.
253 static void mpv_encode_defaults(MpegEncContext *s)
256 ff_mpv_common_defaults(s);
258 for (i = -16; i < 16; i++) {
259 default_fcode_tab[i + MAX_MV] = 1;
261 s->me.mv_penalty = default_mv_penalty;
262 s->fcode_tab = default_fcode_tab;
264 s->input_picture_number = 0;
265 s->picture_in_gop_number = 0;
268 av_cold int ff_dct_encode_init(MpegEncContext *s) {
270 ff_dct_encode_init_x86(s);
272 if (CONFIG_H263_ENCODER)
273 ff_h263dsp_init(&s->h263dsp);
274 if (!s->dct_quantize)
275 s->dct_quantize = ff_dct_quantize_c;
277 s->denoise_dct = denoise_dct_c;
278 s->fast_dct_quantize = s->dct_quantize;
279 if (s->avctx->trellis)
280 s->dct_quantize = dct_quantize_trellis_c;
285 /* init video encoder */
286 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
288 MpegEncContext *s = avctx->priv_data;
289 AVCPBProperties *cpb_props;
290 int i, ret, format_supported;
292 mpv_encode_defaults(s);
294 switch (avctx->codec_id) {
295 case AV_CODEC_ID_MPEG2VIDEO:
296 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
297 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
298 av_log(avctx, AV_LOG_ERROR,
299 "only YUV420 and YUV422 are supported\n");
303 case AV_CODEC_ID_MJPEG:
304 case AV_CODEC_ID_AMV:
305 format_supported = 0;
306 /* JPEG color space */
307 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
308 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
309 avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
310 (avctx->color_range == AVCOL_RANGE_JPEG &&
311 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
312 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
313 avctx->pix_fmt == AV_PIX_FMT_YUV444P)))
314 format_supported = 1;
315 /* MPEG color space */
316 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
317 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
318 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
319 avctx->pix_fmt == AV_PIX_FMT_YUV444P))
320 format_supported = 1;
322 if (!format_supported) {
323 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
328 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
329 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
334 switch (avctx->pix_fmt) {
335 case AV_PIX_FMT_YUVJ444P:
336 case AV_PIX_FMT_YUV444P:
337 s->chroma_format = CHROMA_444;
339 case AV_PIX_FMT_YUVJ422P:
340 case AV_PIX_FMT_YUV422P:
341 s->chroma_format = CHROMA_422;
343 case AV_PIX_FMT_YUVJ420P:
344 case AV_PIX_FMT_YUV420P:
346 s->chroma_format = CHROMA_420;
350 avctx->bits_per_raw_sample = av_clip(avctx->bits_per_raw_sample, 0, 8);
351 s->bit_rate = avctx->bit_rate;
352 s->width = avctx->width;
353 s->height = avctx->height;
354 if (avctx->gop_size > 600 &&
355 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
356 av_log(avctx, AV_LOG_WARNING,
357 "keyframe interval too large!, reducing it from %d to %d\n",
358 avctx->gop_size, 600);
359 avctx->gop_size = 600;
361 s->gop_size = avctx->gop_size;
363 if (avctx->max_b_frames > MAX_B_FRAMES) {
364 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
365 "is %d.\n", MAX_B_FRAMES);
366 avctx->max_b_frames = MAX_B_FRAMES;
368 s->max_b_frames = avctx->max_b_frames;
369 s->codec_id = avctx->codec->id;
370 s->strict_std_compliance = avctx->strict_std_compliance;
371 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
372 s->mpeg_quant = avctx->mpeg_quant;
373 s->rtp_mode = !!avctx->rtp_payload_size;
374 s->intra_dc_precision = avctx->intra_dc_precision;
376 // workaround some differences between how applications specify dc precision
377 if (s->intra_dc_precision < 0) {
378 s->intra_dc_precision += 8;
379 } else if (s->intra_dc_precision >= 8)
380 s->intra_dc_precision -= 8;
382 if (s->intra_dc_precision < 0) {
383 av_log(avctx, AV_LOG_ERROR,
384 "intra dc precision must be positive, note some applications use"
385 " 0 and some 8 as base meaning 8bit, the value must not be smaller than that\n");
386 return AVERROR(EINVAL);
389 if (s->intra_dc_precision > (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 3 : 0)) {
390 av_log(avctx, AV_LOG_ERROR, "intra dc precision too large\n");
391 return AVERROR(EINVAL);
393 s->user_specified_pts = AV_NOPTS_VALUE;
395 if (s->gop_size <= 1) {
402 #if FF_API_MOTION_EST
403 FF_DISABLE_DEPRECATION_WARNINGS
404 s->me_method = avctx->me_method;
405 FF_ENABLE_DEPRECATION_WARNINGS
409 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
412 FF_DISABLE_DEPRECATION_WARNINGS
413 if (avctx->border_masking != 0.0)
414 s->border_masking = avctx->border_masking;
415 FF_ENABLE_DEPRECATION_WARNINGS
418 s->adaptive_quant = (s->avctx->lumi_masking ||
419 s->avctx->dark_masking ||
420 s->avctx->temporal_cplx_masking ||
421 s->avctx->spatial_cplx_masking ||
422 s->avctx->p_masking ||
424 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
427 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
429 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
430 switch(avctx->codec_id) {
431 case AV_CODEC_ID_MPEG1VIDEO:
432 case AV_CODEC_ID_MPEG2VIDEO:
433 avctx->rc_buffer_size = FFMAX(avctx->rc_max_rate, 15000000) * 112LL / 15000000 * 16384;
435 case AV_CODEC_ID_MPEG4:
436 case AV_CODEC_ID_MSMPEG4V1:
437 case AV_CODEC_ID_MSMPEG4V2:
438 case AV_CODEC_ID_MSMPEG4V3:
439 if (avctx->rc_max_rate >= 15000000) {
440 avctx->rc_buffer_size = 320 + (avctx->rc_max_rate - 15000000LL) * (760-320) / (38400000 - 15000000);
441 } else if(avctx->rc_max_rate >= 2000000) {
442 avctx->rc_buffer_size = 80 + (avctx->rc_max_rate - 2000000LL) * (320- 80) / (15000000 - 2000000);
443 } else if(avctx->rc_max_rate >= 384000) {
444 avctx->rc_buffer_size = 40 + (avctx->rc_max_rate - 384000LL) * ( 80- 40) / ( 2000000 - 384000);
446 avctx->rc_buffer_size = 40;
447 avctx->rc_buffer_size *= 16384;
450 if (avctx->rc_buffer_size) {
451 av_log(avctx, AV_LOG_INFO, "Automatically choosing VBV buffer size of %d kbyte\n", avctx->rc_buffer_size/8192);
455 if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
456 av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
460 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
461 av_log(avctx, AV_LOG_INFO,
462 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
465 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
466 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
470 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
471 av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
475 if (avctx->rc_max_rate &&
476 avctx->rc_max_rate == avctx->bit_rate &&
477 avctx->rc_max_rate != avctx->rc_min_rate) {
478 av_log(avctx, AV_LOG_INFO,
479 "impossible bitrate constraints, this will fail\n");
482 if (avctx->rc_buffer_size &&
483 avctx->bit_rate * (int64_t)avctx->time_base.num >
484 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
485 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
489 if (!s->fixed_qscale &&
490 avctx->bit_rate * av_q2d(avctx->time_base) >
491 avctx->bit_rate_tolerance) {
492 av_log(avctx, AV_LOG_WARNING,
493 "bitrate tolerance %d too small for bitrate %"PRId64", overriding\n", avctx->bit_rate_tolerance, (int64_t)avctx->bit_rate);
494 avctx->bit_rate_tolerance = 5 * avctx->bit_rate * av_q2d(avctx->time_base);
497 if (s->avctx->rc_max_rate &&
498 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
499 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
500 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
501 90000LL * (avctx->rc_buffer_size - 1) >
502 s->avctx->rc_max_rate * 0xFFFFLL) {
503 av_log(avctx, AV_LOG_INFO,
504 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
505 "specified vbv buffer is too large for the given bitrate!\n");
508 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
509 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
510 s->codec_id != AV_CODEC_ID_FLV1) {
511 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
515 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
516 av_log(avctx, AV_LOG_ERROR,
517 "OBMC is only supported with simple mb decision\n");
521 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
522 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
526 if (s->max_b_frames &&
527 s->codec_id != AV_CODEC_ID_MPEG4 &&
528 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
529 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
530 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
533 if (s->max_b_frames < 0) {
534 av_log(avctx, AV_LOG_ERROR,
535 "max b frames must be 0 or positive for mpegvideo based encoders\n");
539 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
540 s->codec_id == AV_CODEC_ID_H263 ||
541 s->codec_id == AV_CODEC_ID_H263P) &&
542 (avctx->sample_aspect_ratio.num > 255 ||
543 avctx->sample_aspect_ratio.den > 255)) {
544 av_log(avctx, AV_LOG_WARNING,
545 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
546 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
547 av_reduce(&avctx->sample_aspect_ratio.num, &avctx->sample_aspect_ratio.den,
548 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 255);
551 if ((s->codec_id == AV_CODEC_ID_H263 ||
552 s->codec_id == AV_CODEC_ID_H263P) &&
553 (avctx->width > 2048 ||
554 avctx->height > 1152 )) {
555 av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
558 if ((s->codec_id == AV_CODEC_ID_H263 ||
559 s->codec_id == AV_CODEC_ID_H263P) &&
560 ((avctx->width &3) ||
561 (avctx->height&3) )) {
562 av_log(avctx, AV_LOG_ERROR, "w/h must be a multiple of 4\n");
566 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
567 (avctx->width > 4095 ||
568 avctx->height > 4095 )) {
569 av_log(avctx, AV_LOG_ERROR, "MPEG-1 does not support resolutions above 4095x4095\n");
573 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
574 (avctx->width > 16383 ||
575 avctx->height > 16383 )) {
576 av_log(avctx, AV_LOG_ERROR, "MPEG-2 does not support resolutions above 16383x16383\n");
580 if (s->codec_id == AV_CODEC_ID_RV10 &&
582 avctx->height&15 )) {
583 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 16\n");
584 return AVERROR(EINVAL);
587 if (s->codec_id == AV_CODEC_ID_RV20 &&
590 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 4\n");
591 return AVERROR(EINVAL);
594 if ((s->codec_id == AV_CODEC_ID_WMV1 ||
595 s->codec_id == AV_CODEC_ID_WMV2) &&
597 av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
601 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
602 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
603 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
607 // FIXME mpeg2 uses that too
608 if (s->mpeg_quant && ( s->codec_id != AV_CODEC_ID_MPEG4
609 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO)) {
610 av_log(avctx, AV_LOG_ERROR,
611 "mpeg2 style quantization not supported by codec\n");
615 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
616 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
620 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
621 s->avctx->mb_decision != FF_MB_DECISION_RD) {
622 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
626 if (s->avctx->scenechange_threshold < 1000000000 &&
627 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
628 av_log(avctx, AV_LOG_ERROR,
629 "closed gop with scene change detection are not supported yet, "
630 "set threshold to 1000000000\n");
634 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
635 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
636 av_log(avctx, AV_LOG_ERROR,
637 "low delay forcing is only available for mpeg2\n");
640 if (s->max_b_frames != 0) {
641 av_log(avctx, AV_LOG_ERROR,
642 "b frames cannot be used with low delay\n");
647 if (s->q_scale_type == 1) {
648 if (avctx->qmax > 28) {
649 av_log(avctx, AV_LOG_ERROR,
650 "non linear quant only supports qmax <= 28 currently\n");
655 if (avctx->slices > 1 &&
656 (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
657 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
658 return AVERROR(EINVAL);
661 if (s->avctx->thread_count > 1 &&
662 s->codec_id != AV_CODEC_ID_MPEG4 &&
663 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
664 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
665 s->codec_id != AV_CODEC_ID_MJPEG &&
666 (s->codec_id != AV_CODEC_ID_H263P)) {
667 av_log(avctx, AV_LOG_ERROR,
668 "multi threaded encoding not supported by codec\n");
672 if (s->avctx->thread_count < 1) {
673 av_log(avctx, AV_LOG_ERROR,
674 "automatic thread number detection not supported by codec, "
679 if (!avctx->time_base.den || !avctx->time_base.num) {
680 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
684 #if FF_API_PRIVATE_OPT
685 FF_DISABLE_DEPRECATION_WARNINGS
686 if (avctx->b_frame_strategy)
687 s->b_frame_strategy = avctx->b_frame_strategy;
688 if (avctx->b_sensitivity != 40)
689 s->b_sensitivity = avctx->b_sensitivity;
690 FF_ENABLE_DEPRECATION_WARNINGS
693 if (s->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
694 av_log(avctx, AV_LOG_INFO,
695 "notice: b_frame_strategy only affects the first pass\n");
696 s->b_frame_strategy = 0;
699 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
701 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
702 avctx->time_base.den /= i;
703 avctx->time_base.num /= i;
707 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) {
708 // (a + x * 3 / 8) / x
709 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
710 s->inter_quant_bias = 0;
712 s->intra_quant_bias = 0;
714 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
717 if (avctx->qmin > avctx->qmax || avctx->qmin <= 0) {
718 av_log(avctx, AV_LOG_ERROR, "qmin and or qmax are invalid, they must be 0 < min <= max\n");
719 return AVERROR(EINVAL);
722 #if FF_API_QUANT_BIAS
723 FF_DISABLE_DEPRECATION_WARNINGS
724 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
725 s->intra_quant_bias = avctx->intra_quant_bias;
726 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
727 s->inter_quant_bias = avctx->inter_quant_bias;
728 FF_ENABLE_DEPRECATION_WARNINGS
731 av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
733 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
734 s->avctx->time_base.den > (1 << 16) - 1) {
735 av_log(avctx, AV_LOG_ERROR,
736 "timebase %d/%d not supported by MPEG 4 standard, "
737 "the maximum admitted value for the timebase denominator "
738 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
742 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
744 switch (avctx->codec->id) {
745 case AV_CODEC_ID_MPEG1VIDEO:
746 s->out_format = FMT_MPEG1;
747 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
748 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
750 case AV_CODEC_ID_MPEG2VIDEO:
751 s->out_format = FMT_MPEG1;
752 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
753 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
756 case AV_CODEC_ID_MJPEG:
757 case AV_CODEC_ID_AMV:
758 s->out_format = FMT_MJPEG;
759 s->intra_only = 1; /* force intra only for jpeg */
760 if (!CONFIG_MJPEG_ENCODER ||
761 ff_mjpeg_encode_init(s) < 0)
766 case AV_CODEC_ID_H261:
767 if (!CONFIG_H261_ENCODER)
769 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
770 av_log(avctx, AV_LOG_ERROR,
771 "The specified picture size of %dx%d is not valid for the "
772 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
773 s->width, s->height);
776 s->out_format = FMT_H261;
779 s->rtp_mode = 0; /* Sliced encoding not supported */
781 case AV_CODEC_ID_H263:
782 if (!CONFIG_H263_ENCODER)
784 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
785 s->width, s->height) == 8) {
786 av_log(avctx, AV_LOG_ERROR,
787 "The specified picture size of %dx%d is not valid for "
788 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
789 "352x288, 704x576, and 1408x1152. "
790 "Try H.263+.\n", s->width, s->height);
793 s->out_format = FMT_H263;
797 case AV_CODEC_ID_H263P:
798 s->out_format = FMT_H263;
801 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
802 s->modified_quant = s->h263_aic;
803 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
804 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
807 /* These are just to be sure */
811 case AV_CODEC_ID_FLV1:
812 s->out_format = FMT_H263;
813 s->h263_flv = 2; /* format = 1; 11-bit codes */
814 s->unrestricted_mv = 1;
815 s->rtp_mode = 0; /* don't allow GOB */
819 case AV_CODEC_ID_RV10:
820 s->out_format = FMT_H263;
824 case AV_CODEC_ID_RV20:
825 s->out_format = FMT_H263;
828 s->modified_quant = 1;
832 s->unrestricted_mv = 0;
834 case AV_CODEC_ID_MPEG4:
835 s->out_format = FMT_H263;
837 s->unrestricted_mv = 1;
838 s->low_delay = s->max_b_frames ? 0 : 1;
839 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
841 case AV_CODEC_ID_MSMPEG4V2:
842 s->out_format = FMT_H263;
844 s->unrestricted_mv = 1;
845 s->msmpeg4_version = 2;
849 case AV_CODEC_ID_MSMPEG4V3:
850 s->out_format = FMT_H263;
852 s->unrestricted_mv = 1;
853 s->msmpeg4_version = 3;
854 s->flipflop_rounding = 1;
858 case AV_CODEC_ID_WMV1:
859 s->out_format = FMT_H263;
861 s->unrestricted_mv = 1;
862 s->msmpeg4_version = 4;
863 s->flipflop_rounding = 1;
867 case AV_CODEC_ID_WMV2:
868 s->out_format = FMT_H263;
870 s->unrestricted_mv = 1;
871 s->msmpeg4_version = 5;
872 s->flipflop_rounding = 1;
880 avctx->has_b_frames = !s->low_delay;
884 s->progressive_frame =
885 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
886 AV_CODEC_FLAG_INTERLACED_ME) ||
891 if (ff_mpv_common_init(s) < 0)
894 ff_fdctdsp_init(&s->fdsp, avctx);
895 ff_me_cmp_init(&s->mecc, avctx);
896 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
897 ff_pixblockdsp_init(&s->pdsp, avctx);
898 ff_qpeldsp_init(&s->qdsp);
900 if (s->msmpeg4_version) {
901 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
902 2 * 2 * (MAX_LEVEL + 1) *
903 (MAX_RUN + 1) * 2 * sizeof(int), fail);
905 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
907 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
908 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail);
909 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
910 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
911 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
912 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
913 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
914 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
915 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
916 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
918 if (s->avctx->noise_reduction) {
919 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
920 2 * 64 * sizeof(uint16_t), fail);
923 ff_dct_encode_init(s);
925 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
926 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
928 if (s->slice_context_count > 1) {
931 if (avctx->codec_id == AV_CODEC_ID_H263P)
932 s->h263_slice_structured = 1;
935 s->quant_precision = 5;
937 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
938 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
940 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
941 ff_h261_encode_init(s);
942 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
943 ff_h263_encode_init(s);
944 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
945 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
947 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
948 && s->out_format == FMT_MPEG1)
949 ff_mpeg1_encode_init(s);
952 for (i = 0; i < 64; i++) {
953 int j = s->idsp.idct_permutation[i];
954 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
956 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
957 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
958 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
960 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
963 s->chroma_intra_matrix[j] =
964 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
965 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
967 if (s->avctx->intra_matrix)
968 s->intra_matrix[j] = s->avctx->intra_matrix[i];
969 if (s->avctx->inter_matrix)
970 s->inter_matrix[j] = s->avctx->inter_matrix[i];
973 /* precompute matrix */
974 /* for mjpeg, we do include qscale in the matrix */
975 if (s->out_format != FMT_MJPEG) {
976 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
977 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
979 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
980 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
984 if (ff_rate_control_init(s) < 0)
987 #if FF_API_ERROR_RATE
988 FF_DISABLE_DEPRECATION_WARNINGS
989 if (avctx->error_rate)
990 s->error_rate = avctx->error_rate;
991 FF_ENABLE_DEPRECATION_WARNINGS;
994 #if FF_API_NORMALIZE_AQP
995 FF_DISABLE_DEPRECATION_WARNINGS
996 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
997 s->mpv_flags |= FF_MPV_FLAG_NAQ;
998 FF_ENABLE_DEPRECATION_WARNINGS;
1002 FF_DISABLE_DEPRECATION_WARNINGS
1003 if (avctx->flags & CODEC_FLAG_MV0)
1004 s->mpv_flags |= FF_MPV_FLAG_MV0;
1005 FF_ENABLE_DEPRECATION_WARNINGS
1009 FF_DISABLE_DEPRECATION_WARNINGS
1010 if (avctx->rc_qsquish != 0.0)
1011 s->rc_qsquish = avctx->rc_qsquish;
1012 if (avctx->rc_qmod_amp != 0.0)
1013 s->rc_qmod_amp = avctx->rc_qmod_amp;
1014 if (avctx->rc_qmod_freq)
1015 s->rc_qmod_freq = avctx->rc_qmod_freq;
1016 if (avctx->rc_buffer_aggressivity != 1.0)
1017 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
1018 if (avctx->rc_initial_cplx != 0.0)
1019 s->rc_initial_cplx = avctx->rc_initial_cplx;
1021 s->lmin = avctx->lmin;
1023 s->lmax = avctx->lmax;
1026 av_freep(&s->rc_eq);
1027 s->rc_eq = av_strdup(avctx->rc_eq);
1029 return AVERROR(ENOMEM);
1031 FF_ENABLE_DEPRECATION_WARNINGS
1034 if (s->b_frame_strategy == 2) {
1035 for (i = 0; i < s->max_b_frames + 2; i++) {
1036 s->tmp_frames[i] = av_frame_alloc();
1037 if (!s->tmp_frames[i])
1038 return AVERROR(ENOMEM);
1040 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
1041 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
1042 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
1044 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
1050 cpb_props = ff_add_cpb_side_data(avctx);
1052 return AVERROR(ENOMEM);
1053 cpb_props->max_bitrate = avctx->rc_max_rate;
1054 cpb_props->min_bitrate = avctx->rc_min_rate;
1055 cpb_props->avg_bitrate = avctx->bit_rate;
1056 cpb_props->buffer_size = avctx->rc_buffer_size;
1060 ff_mpv_encode_end(avctx);
1061 return AVERROR_UNKNOWN;
1064 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
1066 MpegEncContext *s = avctx->priv_data;
1069 ff_rate_control_uninit(s);
1071 ff_mpv_common_end(s);
1072 if (CONFIG_MJPEG_ENCODER &&
1073 s->out_format == FMT_MJPEG)
1074 ff_mjpeg_encode_close(s);
1076 av_freep(&avctx->extradata);
1078 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
1079 av_frame_free(&s->tmp_frames[i]);
1081 ff_free_picture_tables(&s->new_picture);
1082 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1084 av_freep(&s->avctx->stats_out);
1085 av_freep(&s->ac_stats);
1087 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
1088 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
1089 s->q_chroma_intra_matrix= NULL;
1090 s->q_chroma_intra_matrix16= NULL;
1091 av_freep(&s->q_intra_matrix);
1092 av_freep(&s->q_inter_matrix);
1093 av_freep(&s->q_intra_matrix16);
1094 av_freep(&s->q_inter_matrix16);
1095 av_freep(&s->input_picture);
1096 av_freep(&s->reordered_input_picture);
1097 av_freep(&s->dct_offset);
1102 static int get_sae(uint8_t *src, int ref, int stride)
1107 for (y = 0; y < 16; y++) {
1108 for (x = 0; x < 16; x++) {
1109 acc += FFABS(src[x + y * stride] - ref);
1116 static int get_intra_count(MpegEncContext *s, uint8_t *src,
1117 uint8_t *ref, int stride)
1123 h = s->height & ~15;
1125 for (y = 0; y < h; y += 16) {
1126 for (x = 0; x < w; x += 16) {
1127 int offset = x + y * stride;
1128 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
1130 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
1131 int sae = get_sae(src + offset, mean, stride);
1133 acc += sae + 500 < sad;
1139 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
1141 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
1142 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
1143 s->mb_stride, s->mb_width, s->mb_height, s->b8_stride,
1144 &s->linesize, &s->uvlinesize);
1147 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
1149 Picture *pic = NULL;
1151 int i, display_picture_number = 0, ret;
1152 int encoding_delay = s->max_b_frames ? s->max_b_frames
1153 : (s->low_delay ? 0 : 1);
1154 int flush_offset = 1;
1159 display_picture_number = s->input_picture_number++;
1161 if (pts != AV_NOPTS_VALUE) {
1162 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1163 int64_t last = s->user_specified_pts;
1166 av_log(s->avctx, AV_LOG_ERROR,
1167 "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
1169 return AVERROR(EINVAL);
1172 if (!s->low_delay && display_picture_number == 1)
1173 s->dts_delta = pts - last;
1175 s->user_specified_pts = pts;
1177 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1178 s->user_specified_pts =
1179 pts = s->user_specified_pts + 1;
1180 av_log(s->avctx, AV_LOG_INFO,
1181 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1184 pts = display_picture_number;
1188 if (!pic_arg->buf[0] ||
1189 pic_arg->linesize[0] != s->linesize ||
1190 pic_arg->linesize[1] != s->uvlinesize ||
1191 pic_arg->linesize[2] != s->uvlinesize)
1193 if ((s->width & 15) || (s->height & 15))
1195 if (((intptr_t)(pic_arg->data[0])) & (STRIDE_ALIGN-1))
1197 if (s->linesize & (STRIDE_ALIGN-1))
1200 ff_dlog(s->avctx, "%d %d %"PTRDIFF_SPECIFIER" %"PTRDIFF_SPECIFIER"\n", pic_arg->linesize[0],
1201 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1203 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1207 pic = &s->picture[i];
1211 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1214 ret = alloc_picture(s, pic, direct);
1219 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1220 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1221 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1224 int h_chroma_shift, v_chroma_shift;
1225 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1229 for (i = 0; i < 3; i++) {
1230 int src_stride = pic_arg->linesize[i];
1231 int dst_stride = i ? s->uvlinesize : s->linesize;
1232 int h_shift = i ? h_chroma_shift : 0;
1233 int v_shift = i ? v_chroma_shift : 0;
1234 int w = s->width >> h_shift;
1235 int h = s->height >> v_shift;
1236 uint8_t *src = pic_arg->data[i];
1237 uint8_t *dst = pic->f->data[i];
1240 if ( s->codec_id == AV_CODEC_ID_MPEG2VIDEO
1241 && !s->progressive_sequence
1242 && FFALIGN(s->height, 32) - s->height > 16)
1245 if (!s->avctx->rc_buffer_size)
1246 dst += INPLACE_OFFSET;
1248 if (src_stride == dst_stride)
1249 memcpy(dst, src, src_stride * h);
1252 uint8_t *dst2 = dst;
1254 memcpy(dst2, src, w);
1259 if ((s->width & 15) || (s->height & (vpad-1))) {
1260 s->mpvencdsp.draw_edges(dst, dst_stride,
1269 ret = av_frame_copy_props(pic->f, pic_arg);
1273 pic->f->display_picture_number = display_picture_number;
1274 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1276 /* Flushing: When we have not received enough input frames,
1277 * ensure s->input_picture[0] contains the first picture */
1278 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1279 if (s->input_picture[flush_offset])
1282 if (flush_offset <= 1)
1285 encoding_delay = encoding_delay - flush_offset + 1;
1288 /* shift buffer entries */
1289 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1290 s->input_picture[i - flush_offset] = s->input_picture[i];
1292 s->input_picture[encoding_delay] = (Picture*) pic;
1297 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1301 int64_t score64 = 0;
1303 for (plane = 0; plane < 3; plane++) {
1304 const int stride = p->f->linesize[plane];
1305 const int bw = plane ? 1 : 2;
1306 for (y = 0; y < s->mb_height * bw; y++) {
1307 for (x = 0; x < s->mb_width * bw; x++) {
1308 int off = p->shared ? 0 : 16;
1309 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1310 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1311 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1313 switch (FFABS(s->avctx->frame_skip_exp)) {
1314 case 0: score = FFMAX(score, v); break;
1315 case 1: score += FFABS(v); break;
1316 case 2: score64 += v * (int64_t)v; break;
1317 case 3: score64 += FFABS(v * (int64_t)v * v); break;
1318 case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v); break;
1327 if (s->avctx->frame_skip_exp < 0)
1328 score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
1329 -1.0/s->avctx->frame_skip_exp);
1331 if (score64 < s->avctx->frame_skip_threshold)
1333 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1338 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1340 AVPacket pkt = { 0 };
1341 int ret, got_output;
1343 av_init_packet(&pkt);
1344 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1349 av_packet_unref(&pkt);
1353 static int estimate_best_b_count(MpegEncContext *s)
1355 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1356 AVCodecContext *c = avcodec_alloc_context3(NULL);
1357 const int scale = s->avctx->brd_scale;
1358 int i, j, out_size, p_lambda, b_lambda, lambda2;
1359 int64_t best_rd = INT64_MAX;
1360 int best_b_count = -1;
1363 return AVERROR(ENOMEM);
1364 av_assert0(scale >= 0 && scale <= 3);
1367 //s->next_picture_ptr->quality;
1368 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1369 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1370 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1371 if (!b_lambda) // FIXME we should do this somewhere else
1372 b_lambda = p_lambda;
1373 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1376 c->width = s->width >> scale;
1377 c->height = s->height >> scale;
1378 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1379 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1380 c->mb_decision = s->avctx->mb_decision;
1381 c->me_cmp = s->avctx->me_cmp;
1382 c->mb_cmp = s->avctx->mb_cmp;
1383 c->me_sub_cmp = s->avctx->me_sub_cmp;
1384 c->pix_fmt = AV_PIX_FMT_YUV420P;
1385 c->time_base = s->avctx->time_base;
1386 c->max_b_frames = s->max_b_frames;
1388 if (avcodec_open2(c, codec, NULL) < 0)
1391 for (i = 0; i < s->max_b_frames + 2; i++) {
1392 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1393 s->next_picture_ptr;
1396 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1397 pre_input = *pre_input_ptr;
1398 memcpy(data, pre_input_ptr->f->data, sizeof(data));
1400 if (!pre_input.shared && i) {
1401 data[0] += INPLACE_OFFSET;
1402 data[1] += INPLACE_OFFSET;
1403 data[2] += INPLACE_OFFSET;
1406 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1407 s->tmp_frames[i]->linesize[0],
1409 pre_input.f->linesize[0],
1410 c->width, c->height);
1411 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1412 s->tmp_frames[i]->linesize[1],
1414 pre_input.f->linesize[1],
1415 c->width >> 1, c->height >> 1);
1416 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1417 s->tmp_frames[i]->linesize[2],
1419 pre_input.f->linesize[2],
1420 c->width >> 1, c->height >> 1);
1424 for (j = 0; j < s->max_b_frames + 1; j++) {
1427 if (!s->input_picture[j])
1430 c->error[0] = c->error[1] = c->error[2] = 0;
1432 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1433 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1435 out_size = encode_frame(c, s->tmp_frames[0]);
1437 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1439 for (i = 0; i < s->max_b_frames + 1; i++) {
1440 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1442 s->tmp_frames[i + 1]->pict_type = is_p ?
1443 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1444 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1446 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1448 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1451 /* get the delayed frames */
1453 out_size = encode_frame(c, NULL);
1454 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1457 rd += c->error[0] + c->error[1] + c->error[2];
1468 return best_b_count;
1471 static int select_input_picture(MpegEncContext *s)
1475 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1476 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1477 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1479 /* set next picture type & ordering */
1480 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1481 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1482 if (s->picture_in_gop_number < s->gop_size &&
1483 s->next_picture_ptr &&
1484 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1485 // FIXME check that te gop check above is +-1 correct
1486 av_frame_unref(s->input_picture[0]->f);
1488 ff_vbv_update(s, 0);
1494 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1495 !s->next_picture_ptr || s->intra_only) {
1496 s->reordered_input_picture[0] = s->input_picture[0];
1497 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1498 s->reordered_input_picture[0]->f->coded_picture_number =
1499 s->coded_picture_number++;
1503 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1504 for (i = 0; i < s->max_b_frames + 1; i++) {
1505 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1507 if (pict_num >= s->rc_context.num_entries)
1509 if (!s->input_picture[i]) {
1510 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1514 s->input_picture[i]->f->pict_type =
1515 s->rc_context.entry[pict_num].new_pict_type;
1519 if (s->b_frame_strategy == 0) {
1520 b_frames = s->max_b_frames;
1521 while (b_frames && !s->input_picture[b_frames])
1523 } else if (s->b_frame_strategy == 1) {
1524 for (i = 1; i < s->max_b_frames + 1; i++) {
1525 if (s->input_picture[i] &&
1526 s->input_picture[i]->b_frame_score == 0) {
1527 s->input_picture[i]->b_frame_score =
1529 s->input_picture[i ]->f->data[0],
1530 s->input_picture[i - 1]->f->data[0],
1534 for (i = 0; i < s->max_b_frames + 1; i++) {
1535 if (!s->input_picture[i] ||
1536 s->input_picture[i]->b_frame_score - 1 >
1537 s->mb_num / s->b_sensitivity)
1541 b_frames = FFMAX(0, i - 1);
1544 for (i = 0; i < b_frames + 1; i++) {
1545 s->input_picture[i]->b_frame_score = 0;
1547 } else if (s->b_frame_strategy == 2) {
1548 b_frames = estimate_best_b_count(s);
1553 for (i = b_frames - 1; i >= 0; i--) {
1554 int type = s->input_picture[i]->f->pict_type;
1555 if (type && type != AV_PICTURE_TYPE_B)
1558 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1559 b_frames == s->max_b_frames) {
1560 av_log(s->avctx, AV_LOG_ERROR,
1561 "warning, too many b frames in a row\n");
1564 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1565 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1566 s->gop_size > s->picture_in_gop_number) {
1567 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1569 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1571 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1575 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1576 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1579 s->reordered_input_picture[0] = s->input_picture[b_frames];
1580 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1581 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1582 s->reordered_input_picture[0]->f->coded_picture_number =
1583 s->coded_picture_number++;
1584 for (i = 0; i < b_frames; i++) {
1585 s->reordered_input_picture[i + 1] = s->input_picture[i];
1586 s->reordered_input_picture[i + 1]->f->pict_type =
1588 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1589 s->coded_picture_number++;
1594 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1596 if (s->reordered_input_picture[0]) {
1597 s->reordered_input_picture[0]->reference =
1598 s->reordered_input_picture[0]->f->pict_type !=
1599 AV_PICTURE_TYPE_B ? 3 : 0;
1601 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1604 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1605 // input is a shared pix, so we can't modifiy it -> alloc a new
1606 // one & ensure that the shared one is reuseable
1609 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1612 pic = &s->picture[i];
1614 pic->reference = s->reordered_input_picture[0]->reference;
1615 if (alloc_picture(s, pic, 0) < 0) {
1619 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1623 /* mark us unused / free shared pic */
1624 av_frame_unref(s->reordered_input_picture[0]->f);
1625 s->reordered_input_picture[0]->shared = 0;
1627 s->current_picture_ptr = pic;
1629 // input is not a shared pix -> reuse buffer for current_pix
1630 s->current_picture_ptr = s->reordered_input_picture[0];
1631 for (i = 0; i < 4; i++) {
1632 s->new_picture.f->data[i] += INPLACE_OFFSET;
1635 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1636 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1637 s->current_picture_ptr)) < 0)
1640 s->picture_number = s->new_picture.f->display_picture_number;
1645 static void frame_end(MpegEncContext *s)
1647 if (s->unrestricted_mv &&
1648 s->current_picture.reference &&
1650 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1651 int hshift = desc->log2_chroma_w;
1652 int vshift = desc->log2_chroma_h;
1653 s->mpvencdsp.draw_edges(s->current_picture.f->data[0],
1654 s->current_picture.f->linesize[0],
1655 s->h_edge_pos, s->v_edge_pos,
1656 EDGE_WIDTH, EDGE_WIDTH,
1657 EDGE_TOP | EDGE_BOTTOM);
1658 s->mpvencdsp.draw_edges(s->current_picture.f->data[1],
1659 s->current_picture.f->linesize[1],
1660 s->h_edge_pos >> hshift,
1661 s->v_edge_pos >> vshift,
1662 EDGE_WIDTH >> hshift,
1663 EDGE_WIDTH >> vshift,
1664 EDGE_TOP | EDGE_BOTTOM);
1665 s->mpvencdsp.draw_edges(s->current_picture.f->data[2],
1666 s->current_picture.f->linesize[2],
1667 s->h_edge_pos >> hshift,
1668 s->v_edge_pos >> vshift,
1669 EDGE_WIDTH >> hshift,
1670 EDGE_WIDTH >> vshift,
1671 EDGE_TOP | EDGE_BOTTOM);
1676 s->last_pict_type = s->pict_type;
1677 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1678 if (s->pict_type!= AV_PICTURE_TYPE_B)
1679 s->last_non_b_pict_type = s->pict_type;
1681 #if FF_API_CODED_FRAME
1682 FF_DISABLE_DEPRECATION_WARNINGS
1683 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1684 FF_ENABLE_DEPRECATION_WARNINGS
1686 #if FF_API_ERROR_FRAME
1687 FF_DISABLE_DEPRECATION_WARNINGS
1688 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1689 sizeof(s->current_picture.encoding_error));
1690 FF_ENABLE_DEPRECATION_WARNINGS
1694 static void update_noise_reduction(MpegEncContext *s)
1698 for (intra = 0; intra < 2; intra++) {
1699 if (s->dct_count[intra] > (1 << 16)) {
1700 for (i = 0; i < 64; i++) {
1701 s->dct_error_sum[intra][i] >>= 1;
1703 s->dct_count[intra] >>= 1;
1706 for (i = 0; i < 64; i++) {
1707 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1708 s->dct_count[intra] +
1709 s->dct_error_sum[intra][i] / 2) /
1710 (s->dct_error_sum[intra][i] + 1);
1715 static int frame_start(MpegEncContext *s)
1719 /* mark & release old frames */
1720 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1721 s->last_picture_ptr != s->next_picture_ptr &&
1722 s->last_picture_ptr->f->buf[0]) {
1723 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1726 s->current_picture_ptr->f->pict_type = s->pict_type;
1727 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1729 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1730 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1731 s->current_picture_ptr)) < 0)
1734 if (s->pict_type != AV_PICTURE_TYPE_B) {
1735 s->last_picture_ptr = s->next_picture_ptr;
1737 s->next_picture_ptr = s->current_picture_ptr;
1740 if (s->last_picture_ptr) {
1741 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1742 if (s->last_picture_ptr->f->buf[0] &&
1743 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1744 s->last_picture_ptr)) < 0)
1747 if (s->next_picture_ptr) {
1748 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1749 if (s->next_picture_ptr->f->buf[0] &&
1750 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1751 s->next_picture_ptr)) < 0)
1755 if (s->picture_structure!= PICT_FRAME) {
1757 for (i = 0; i < 4; i++) {
1758 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1759 s->current_picture.f->data[i] +=
1760 s->current_picture.f->linesize[i];
1762 s->current_picture.f->linesize[i] *= 2;
1763 s->last_picture.f->linesize[i] *= 2;
1764 s->next_picture.f->linesize[i] *= 2;
1768 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1769 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1770 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1771 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1772 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1773 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1775 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1776 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1779 if (s->dct_error_sum) {
1780 av_assert2(s->avctx->noise_reduction && s->encoding);
1781 update_noise_reduction(s);
1787 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1788 const AVFrame *pic_arg, int *got_packet)
1790 MpegEncContext *s = avctx->priv_data;
1791 int i, stuffing_count, ret;
1792 int context_count = s->slice_context_count;
1794 s->vbv_ignore_qmax = 0;
1796 s->picture_in_gop_number++;
1798 if (load_input_picture(s, pic_arg) < 0)
1801 if (select_input_picture(s) < 0) {
1806 if (s->new_picture.f->data[0]) {
1807 int growing_buffer = context_count == 1 && !pkt->data && !s->data_partitioning;
1808 int pkt_size = growing_buffer ? FFMAX(s->mb_width*s->mb_height*64+10000, avctx->internal->byte_buffer_size) - AV_INPUT_BUFFER_PADDING_SIZE
1810 s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000;
1811 if ((ret = ff_alloc_packet2(avctx, pkt, pkt_size, 0)) < 0)
1814 s->mb_info_ptr = av_packet_new_side_data(pkt,
1815 AV_PKT_DATA_H263_MB_INFO,
1816 s->mb_width*s->mb_height*12);
1817 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1820 for (i = 0; i < context_count; i++) {
1821 int start_y = s->thread_context[i]->start_mb_y;
1822 int end_y = s->thread_context[i]-> end_mb_y;
1823 int h = s->mb_height;
1824 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1825 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1827 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1830 s->pict_type = s->new_picture.f->pict_type;
1832 ret = frame_start(s);
1836 ret = encode_picture(s, s->picture_number);
1837 if (growing_buffer) {
1838 av_assert0(s->pb.buf == avctx->internal->byte_buffer);
1839 pkt->data = s->pb.buf;
1840 pkt->size = avctx->internal->byte_buffer_size;
1845 #if FF_API_STAT_BITS
1846 FF_DISABLE_DEPRECATION_WARNINGS
1847 avctx->header_bits = s->header_bits;
1848 avctx->mv_bits = s->mv_bits;
1849 avctx->misc_bits = s->misc_bits;
1850 avctx->i_tex_bits = s->i_tex_bits;
1851 avctx->p_tex_bits = s->p_tex_bits;
1852 avctx->i_count = s->i_count;
1853 // FIXME f/b_count in avctx
1854 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1855 avctx->skip_count = s->skip_count;
1856 FF_ENABLE_DEPRECATION_WARNINGS
1861 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1862 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1864 if (avctx->rc_buffer_size) {
1865 RateControlContext *rcc = &s->rc_context;
1866 int max_size = FFMAX(rcc->buffer_index * avctx->rc_max_available_vbv_use, rcc->buffer_index - 500);
1867 int hq = (s->avctx->mb_decision == FF_MB_DECISION_RD || s->avctx->trellis);
1868 int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139;
1870 if (put_bits_count(&s->pb) > max_size &&
1871 s->lambda < s->lmax) {
1872 s->next_lambda = FFMAX(s->lambda + min_step, s->lambda *
1873 (s->qscale + 1) / s->qscale);
1874 if (s->adaptive_quant) {
1876 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1877 s->lambda_table[i] =
1878 FFMAX(s->lambda_table[i] + min_step,
1879 s->lambda_table[i] * (s->qscale + 1) /
1882 s->mb_skipped = 0; // done in frame_start()
1883 // done in encode_picture() so we must undo it
1884 if (s->pict_type == AV_PICTURE_TYPE_P) {
1885 if (s->flipflop_rounding ||
1886 s->codec_id == AV_CODEC_ID_H263P ||
1887 s->codec_id == AV_CODEC_ID_MPEG4)
1888 s->no_rounding ^= 1;
1890 if (s->pict_type != AV_PICTURE_TYPE_B) {
1891 s->time_base = s->last_time_base;
1892 s->last_non_b_time = s->time - s->pp_time;
1894 for (i = 0; i < context_count; i++) {
1895 PutBitContext *pb = &s->thread_context[i]->pb;
1896 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1898 s->vbv_ignore_qmax = 1;
1899 av_log(s->avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n");
1903 av_assert0(s->avctx->rc_max_rate);
1906 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1907 ff_write_pass1_stats(s);
1909 for (i = 0; i < 4; i++) {
1910 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1911 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1913 ff_side_data_set_encoder_stats(pkt, s->current_picture.f->quality,
1914 s->current_picture_ptr->encoding_error,
1915 (s->avctx->flags&AV_CODEC_FLAG_PSNR) ? 4 : 0,
1918 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1919 assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits +
1920 s->misc_bits + s->i_tex_bits +
1922 flush_put_bits(&s->pb);
1923 s->frame_bits = put_bits_count(&s->pb);
1925 stuffing_count = ff_vbv_update(s, s->frame_bits);
1926 s->stuffing_bits = 8*stuffing_count;
1927 if (stuffing_count) {
1928 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1929 stuffing_count + 50) {
1930 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1934 switch (s->codec_id) {
1935 case AV_CODEC_ID_MPEG1VIDEO:
1936 case AV_CODEC_ID_MPEG2VIDEO:
1937 while (stuffing_count--) {
1938 put_bits(&s->pb, 8, 0);
1941 case AV_CODEC_ID_MPEG4:
1942 put_bits(&s->pb, 16, 0);
1943 put_bits(&s->pb, 16, 0x1C3);
1944 stuffing_count -= 4;
1945 while (stuffing_count--) {
1946 put_bits(&s->pb, 8, 0xFF);
1950 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1952 flush_put_bits(&s->pb);
1953 s->frame_bits = put_bits_count(&s->pb);
1956 /* update mpeg1/2 vbv_delay for CBR */
1957 if (s->avctx->rc_max_rate &&
1958 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1959 s->out_format == FMT_MPEG1 &&
1960 90000LL * (avctx->rc_buffer_size - 1) <=
1961 s->avctx->rc_max_rate * 0xFFFFLL) {
1962 AVCPBProperties *props;
1965 int vbv_delay, min_delay;
1966 double inbits = s->avctx->rc_max_rate *
1967 av_q2d(s->avctx->time_base);
1968 int minbits = s->frame_bits - 8 *
1969 (s->vbv_delay_ptr - s->pb.buf - 1);
1970 double bits = s->rc_context.buffer_index + minbits - inbits;
1973 av_log(s->avctx, AV_LOG_ERROR,
1974 "Internal error, negative bits\n");
1976 assert(s->repeat_first_field == 0);
1978 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1979 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1980 s->avctx->rc_max_rate;
1982 vbv_delay = FFMAX(vbv_delay, min_delay);
1984 av_assert0(vbv_delay < 0xFFFF);
1986 s->vbv_delay_ptr[0] &= 0xF8;
1987 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1988 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1989 s->vbv_delay_ptr[2] &= 0x07;
1990 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1992 props = av_cpb_properties_alloc(&props_size);
1994 return AVERROR(ENOMEM);
1995 props->vbv_delay = vbv_delay * 300;
1997 ret = av_packet_add_side_data(pkt, AV_PKT_DATA_CPB_PROPERTIES,
1998 (uint8_t*)props, props_size);
2004 #if FF_API_VBV_DELAY
2005 FF_DISABLE_DEPRECATION_WARNINGS
2006 avctx->vbv_delay = vbv_delay * 300;
2007 FF_ENABLE_DEPRECATION_WARNINGS
2010 s->total_bits += s->frame_bits;
2011 #if FF_API_STAT_BITS
2012 FF_DISABLE_DEPRECATION_WARNINGS
2013 avctx->frame_bits = s->frame_bits;
2014 FF_ENABLE_DEPRECATION_WARNINGS
2018 pkt->pts = s->current_picture.f->pts;
2019 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
2020 if (!s->current_picture.f->coded_picture_number)
2021 pkt->dts = pkt->pts - s->dts_delta;
2023 pkt->dts = s->reordered_pts;
2024 s->reordered_pts = pkt->pts;
2026 pkt->dts = pkt->pts;
2027 if (s->current_picture.f->key_frame)
2028 pkt->flags |= AV_PKT_FLAG_KEY;
2030 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
2035 /* release non-reference frames */
2036 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
2037 if (!s->picture[i].reference)
2038 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
2041 av_assert1((s->frame_bits & 7) == 0);
2043 pkt->size = s->frame_bits / 8;
2044 *got_packet = !!pkt->size;
2048 static inline void dct_single_coeff_elimination(MpegEncContext *s,
2049 int n, int threshold)
2051 static const char tab[64] = {
2052 3, 2, 2, 1, 1, 1, 1, 1,
2053 1, 1, 1, 1, 1, 1, 1, 1,
2054 1, 1, 1, 1, 1, 1, 1, 1,
2055 0, 0, 0, 0, 0, 0, 0, 0,
2056 0, 0, 0, 0, 0, 0, 0, 0,
2057 0, 0, 0, 0, 0, 0, 0, 0,
2058 0, 0, 0, 0, 0, 0, 0, 0,
2059 0, 0, 0, 0, 0, 0, 0, 0
2064 int16_t *block = s->block[n];
2065 const int last_index = s->block_last_index[n];
2068 if (threshold < 0) {
2070 threshold = -threshold;
2074 /* Are all we could set to zero already zero? */
2075 if (last_index <= skip_dc - 1)
2078 for (i = 0; i <= last_index; i++) {
2079 const int j = s->intra_scantable.permutated[i];
2080 const int level = FFABS(block[j]);
2082 if (skip_dc && i == 0)
2086 } else if (level > 1) {
2092 if (score >= threshold)
2094 for (i = skip_dc; i <= last_index; i++) {
2095 const int j = s->intra_scantable.permutated[i];
2099 s->block_last_index[n] = 0;
2101 s->block_last_index[n] = -1;
2104 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
2108 const int maxlevel = s->max_qcoeff;
2109 const int minlevel = s->min_qcoeff;
2113 i = 1; // skip clipping of intra dc
2117 for (; i <= last_index; i++) {
2118 const int j = s->intra_scantable.permutated[i];
2119 int level = block[j];
2121 if (level > maxlevel) {
2124 } else if (level < minlevel) {
2132 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
2133 av_log(s->avctx, AV_LOG_INFO,
2134 "warning, clipping %d dct coefficients to %d..%d\n",
2135 overflow, minlevel, maxlevel);
2138 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
2142 for (y = 0; y < 8; y++) {
2143 for (x = 0; x < 8; x++) {
2149 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
2150 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
2151 int v = ptr[x2 + y2 * stride];
2157 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2162 static av_always_inline void encode_mb_internal(MpegEncContext *s,
2163 int motion_x, int motion_y,
2164 int mb_block_height,
2168 int16_t weight[12][64];
2169 int16_t orig[12][64];
2170 const int mb_x = s->mb_x;
2171 const int mb_y = s->mb_y;
2174 int dct_offset = s->linesize * 8; // default for progressive frames
2175 int uv_dct_offset = s->uvlinesize * 8;
2176 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2177 ptrdiff_t wrap_y, wrap_c;
2179 for (i = 0; i < mb_block_count; i++)
2180 skip_dct[i] = s->skipdct;
2182 if (s->adaptive_quant) {
2183 const int last_qp = s->qscale;
2184 const int mb_xy = mb_x + mb_y * s->mb_stride;
2186 s->lambda = s->lambda_table[mb_xy];
2189 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2190 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
2191 s->dquant = s->qscale - last_qp;
2193 if (s->out_format == FMT_H263) {
2194 s->dquant = av_clip(s->dquant, -2, 2);
2196 if (s->codec_id == AV_CODEC_ID_MPEG4) {
2198 if (s->pict_type == AV_PICTURE_TYPE_B) {
2199 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
2202 if (s->mv_type == MV_TYPE_8X8)
2208 ff_set_qscale(s, last_qp + s->dquant);
2209 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2210 ff_set_qscale(s, s->qscale + s->dquant);
2212 wrap_y = s->linesize;
2213 wrap_c = s->uvlinesize;
2214 ptr_y = s->new_picture.f->data[0] +
2215 (mb_y * 16 * wrap_y) + mb_x * 16;
2216 ptr_cb = s->new_picture.f->data[1] +
2217 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2218 ptr_cr = s->new_picture.f->data[2] +
2219 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2221 if((mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
2222 uint8_t *ebuf = s->sc.edge_emu_buffer + 36 * wrap_y;
2223 int cw = (s->width + s->chroma_x_shift) >> s->chroma_x_shift;
2224 int ch = (s->height + s->chroma_y_shift) >> s->chroma_y_shift;
2225 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2227 16, 16, mb_x * 16, mb_y * 16,
2228 s->width, s->height);
2230 s->vdsp.emulated_edge_mc(ebuf + 16 * wrap_y, ptr_cb,
2232 mb_block_width, mb_block_height,
2233 mb_x * mb_block_width, mb_y * mb_block_height,
2235 ptr_cb = ebuf + 16 * wrap_y;
2236 s->vdsp.emulated_edge_mc(ebuf + 16 * wrap_y + 16, ptr_cr,
2238 mb_block_width, mb_block_height,
2239 mb_x * mb_block_width, mb_y * mb_block_height,
2241 ptr_cr = ebuf + 16 * wrap_y + 16;
2245 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2246 int progressive_score, interlaced_score;
2248 s->interlaced_dct = 0;
2249 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2250 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2251 NULL, wrap_y, 8) - 400;
2253 if (progressive_score > 0) {
2254 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2255 NULL, wrap_y * 2, 8) +
2256 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2257 NULL, wrap_y * 2, 8);
2258 if (progressive_score > interlaced_score) {
2259 s->interlaced_dct = 1;
2261 dct_offset = wrap_y;
2262 uv_dct_offset = wrap_c;
2264 if (s->chroma_format == CHROMA_422 ||
2265 s->chroma_format == CHROMA_444)
2271 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2272 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2273 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2274 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2276 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2280 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2281 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2282 if (!s->chroma_y_shift && s->chroma_x_shift) { /* 422 */
2283 s->pdsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2284 s->pdsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2285 } else if (!s->chroma_y_shift && !s->chroma_x_shift) { /* 444 */
2286 s->pdsp.get_pixels(s->block[ 6], ptr_cb + 8, wrap_c);
2287 s->pdsp.get_pixels(s->block[ 7], ptr_cr + 8, wrap_c);
2288 s->pdsp.get_pixels(s->block[ 8], ptr_cb + uv_dct_offset, wrap_c);
2289 s->pdsp.get_pixels(s->block[ 9], ptr_cr + uv_dct_offset, wrap_c);
2290 s->pdsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2291 s->pdsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2295 op_pixels_func (*op_pix)[4];
2296 qpel_mc_func (*op_qpix)[16];
2297 uint8_t *dest_y, *dest_cb, *dest_cr;
2299 dest_y = s->dest[0];
2300 dest_cb = s->dest[1];
2301 dest_cr = s->dest[2];
2303 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2304 op_pix = s->hdsp.put_pixels_tab;
2305 op_qpix = s->qdsp.put_qpel_pixels_tab;
2307 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2308 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2311 if (s->mv_dir & MV_DIR_FORWARD) {
2312 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2313 s->last_picture.f->data,
2315 op_pix = s->hdsp.avg_pixels_tab;
2316 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2318 if (s->mv_dir & MV_DIR_BACKWARD) {
2319 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2320 s->next_picture.f->data,
2324 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2325 int progressive_score, interlaced_score;
2327 s->interlaced_dct = 0;
2328 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2329 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2333 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2334 progressive_score -= 400;
2336 if (progressive_score > 0) {
2337 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2339 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2343 if (progressive_score > interlaced_score) {
2344 s->interlaced_dct = 1;
2346 dct_offset = wrap_y;
2347 uv_dct_offset = wrap_c;
2349 if (s->chroma_format == CHROMA_422)
2355 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2356 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2357 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2358 dest_y + dct_offset, wrap_y);
2359 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2360 dest_y + dct_offset + 8, wrap_y);
2362 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2366 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2367 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2368 if (!s->chroma_y_shift) { /* 422 */
2369 s->pdsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
2370 dest_cb + uv_dct_offset, wrap_c);
2371 s->pdsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
2372 dest_cr + uv_dct_offset, wrap_c);
2375 /* pre quantization */
2376 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2377 2 * s->qscale * s->qscale) {
2379 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2381 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2383 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2384 wrap_y, 8) < 20 * s->qscale)
2386 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2387 wrap_y, 8) < 20 * s->qscale)
2389 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2391 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2393 if (!s->chroma_y_shift) { /* 422 */
2394 if (s->mecc.sad[1](NULL, ptr_cb + uv_dct_offset,
2395 dest_cb + uv_dct_offset,
2396 wrap_c, 8) < 20 * s->qscale)
2398 if (s->mecc.sad[1](NULL, ptr_cr + uv_dct_offset,
2399 dest_cr + uv_dct_offset,
2400 wrap_c, 8) < 20 * s->qscale)
2406 if (s->quantizer_noise_shaping) {
2408 get_visual_weight(weight[0], ptr_y , wrap_y);
2410 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2412 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2414 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2416 get_visual_weight(weight[4], ptr_cb , wrap_c);
2418 get_visual_weight(weight[5], ptr_cr , wrap_c);
2419 if (!s->chroma_y_shift) { /* 422 */
2421 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2424 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2427 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2430 /* DCT & quantize */
2431 av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
2433 for (i = 0; i < mb_block_count; i++) {
2436 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2437 // FIXME we could decide to change to quantizer instead of
2439 // JS: I don't think that would be a good idea it could lower
2440 // quality instead of improve it. Just INTRADC clipping
2441 // deserves changes in quantizer
2443 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2445 s->block_last_index[i] = -1;
2447 if (s->quantizer_noise_shaping) {
2448 for (i = 0; i < mb_block_count; i++) {
2450 s->block_last_index[i] =
2451 dct_quantize_refine(s, s->block[i], weight[i],
2452 orig[i], i, s->qscale);
2457 if (s->luma_elim_threshold && !s->mb_intra)
2458 for (i = 0; i < 4; i++)
2459 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2460 if (s->chroma_elim_threshold && !s->mb_intra)
2461 for (i = 4; i < mb_block_count; i++)
2462 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2464 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2465 for (i = 0; i < mb_block_count; i++) {
2466 if (s->block_last_index[i] == -1)
2467 s->coded_score[i] = INT_MAX / 256;
2472 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2473 s->block_last_index[4] =
2474 s->block_last_index[5] = 0;
2476 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2477 if (!s->chroma_y_shift) { /* 422 / 444 */
2478 for (i=6; i<12; i++) {
2479 s->block_last_index[i] = 0;
2480 s->block[i][0] = s->block[4][0];
2485 // non c quantize code returns incorrect block_last_index FIXME
2486 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2487 for (i = 0; i < mb_block_count; i++) {
2489 if (s->block_last_index[i] > 0) {
2490 for (j = 63; j > 0; j--) {
2491 if (s->block[i][s->intra_scantable.permutated[j]])
2494 s->block_last_index[i] = j;
2499 /* huffman encode */
2500 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2501 case AV_CODEC_ID_MPEG1VIDEO:
2502 case AV_CODEC_ID_MPEG2VIDEO:
2503 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2504 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2506 case AV_CODEC_ID_MPEG4:
2507 if (CONFIG_MPEG4_ENCODER)
2508 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2510 case AV_CODEC_ID_MSMPEG4V2:
2511 case AV_CODEC_ID_MSMPEG4V3:
2512 case AV_CODEC_ID_WMV1:
2513 if (CONFIG_MSMPEG4_ENCODER)
2514 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2516 case AV_CODEC_ID_WMV2:
2517 if (CONFIG_WMV2_ENCODER)
2518 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2520 case AV_CODEC_ID_H261:
2521 if (CONFIG_H261_ENCODER)
2522 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2524 case AV_CODEC_ID_H263:
2525 case AV_CODEC_ID_H263P:
2526 case AV_CODEC_ID_FLV1:
2527 case AV_CODEC_ID_RV10:
2528 case AV_CODEC_ID_RV20:
2529 if (CONFIG_H263_ENCODER)
2530 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2532 case AV_CODEC_ID_MJPEG:
2533 case AV_CODEC_ID_AMV:
2534 if (CONFIG_MJPEG_ENCODER)
2535 ff_mjpeg_encode_mb(s, s->block);
2542 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2544 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 8, 6);
2545 else if (s->chroma_format == CHROMA_422) encode_mb_internal(s, motion_x, motion_y, 16, 8, 8);
2546 else encode_mb_internal(s, motion_x, motion_y, 16, 16, 12);
2549 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2552 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2555 d->mb_skip_run= s->mb_skip_run;
2557 d->last_dc[i] = s->last_dc[i];
2560 d->mv_bits= s->mv_bits;
2561 d->i_tex_bits= s->i_tex_bits;
2562 d->p_tex_bits= s->p_tex_bits;
2563 d->i_count= s->i_count;
2564 d->f_count= s->f_count;
2565 d->b_count= s->b_count;
2566 d->skip_count= s->skip_count;
2567 d->misc_bits= s->misc_bits;
2571 d->qscale= s->qscale;
2572 d->dquant= s->dquant;
2574 d->esc3_level_length= s->esc3_level_length;
2577 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2580 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2581 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2584 d->mb_skip_run= s->mb_skip_run;
2586 d->last_dc[i] = s->last_dc[i];
2589 d->mv_bits= s->mv_bits;
2590 d->i_tex_bits= s->i_tex_bits;
2591 d->p_tex_bits= s->p_tex_bits;
2592 d->i_count= s->i_count;
2593 d->f_count= s->f_count;
2594 d->b_count= s->b_count;
2595 d->skip_count= s->skip_count;
2596 d->misc_bits= s->misc_bits;
2598 d->mb_intra= s->mb_intra;
2599 d->mb_skipped= s->mb_skipped;
2600 d->mv_type= s->mv_type;
2601 d->mv_dir= s->mv_dir;
2603 if(s->data_partitioning){
2605 d->tex_pb= s->tex_pb;
2609 d->block_last_index[i]= s->block_last_index[i];
2610 d->interlaced_dct= s->interlaced_dct;
2611 d->qscale= s->qscale;
2613 d->esc3_level_length= s->esc3_level_length;
2616 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2617 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2618 int *dmin, int *next_block, int motion_x, int motion_y)
2621 uint8_t *dest_backup[3];
2623 copy_context_before_encode(s, backup, type);
2625 s->block= s->blocks[*next_block];
2626 s->pb= pb[*next_block];
2627 if(s->data_partitioning){
2628 s->pb2 = pb2 [*next_block];
2629 s->tex_pb= tex_pb[*next_block];
2633 memcpy(dest_backup, s->dest, sizeof(s->dest));
2634 s->dest[0] = s->sc.rd_scratchpad;
2635 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2636 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2637 av_assert0(s->linesize >= 32); //FIXME
2640 encode_mb(s, motion_x, motion_y);
2642 score= put_bits_count(&s->pb);
2643 if(s->data_partitioning){
2644 score+= put_bits_count(&s->pb2);
2645 score+= put_bits_count(&s->tex_pb);
2648 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2649 ff_mpv_decode_mb(s, s->block);
2651 score *= s->lambda2;
2652 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2656 memcpy(s->dest, dest_backup, sizeof(s->dest));
2663 copy_context_after_encode(best, s, type);
2667 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2668 uint32_t *sq = ff_square_tab + 256;
2673 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2674 else if(w==8 && h==8)
2675 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2679 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2688 static int sse_mb(MpegEncContext *s){
2692 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2693 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2696 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2697 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) +
2698 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) +
2699 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);
2701 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) +
2702 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) +
2703 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);
2706 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)
2707 +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)
2708 +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);
2711 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2712 MpegEncContext *s= *(void**)arg;
2716 s->me.dia_size= s->avctx->pre_dia_size;
2717 s->first_slice_line=1;
2718 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2719 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2720 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2722 s->first_slice_line=0;
2730 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2731 MpegEncContext *s= *(void**)arg;
2733 ff_check_alignment();
2735 s->me.dia_size= s->avctx->dia_size;
2736 s->first_slice_line=1;
2737 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2738 s->mb_x=0; //for block init below
2739 ff_init_block_index(s);
2740 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2741 s->block_index[0]+=2;
2742 s->block_index[1]+=2;
2743 s->block_index[2]+=2;
2744 s->block_index[3]+=2;
2746 /* compute motion vector & mb_type and store in context */
2747 if(s->pict_type==AV_PICTURE_TYPE_B)
2748 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2750 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2752 s->first_slice_line=0;
2757 static int mb_var_thread(AVCodecContext *c, void *arg){
2758 MpegEncContext *s= *(void**)arg;
2761 ff_check_alignment();
2763 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2764 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2767 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2769 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2771 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2772 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2774 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2775 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2776 s->me.mb_var_sum_temp += varc;
2782 static void write_slice_end(MpegEncContext *s){
2783 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2784 if(s->partitioned_frame){
2785 ff_mpeg4_merge_partitions(s);
2788 ff_mpeg4_stuffing(&s->pb);
2789 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2790 ff_mjpeg_encode_stuffing(s);
2793 avpriv_align_put_bits(&s->pb);
2794 flush_put_bits(&s->pb);
2796 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2797 s->misc_bits+= get_bits_diff(s);
2800 static void write_mb_info(MpegEncContext *s)
2802 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2803 int offset = put_bits_count(&s->pb);
2804 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2805 int gobn = s->mb_y / s->gob_index;
2807 if (CONFIG_H263_ENCODER)
2808 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2809 bytestream_put_le32(&ptr, offset);
2810 bytestream_put_byte(&ptr, s->qscale);
2811 bytestream_put_byte(&ptr, gobn);
2812 bytestream_put_le16(&ptr, mba);
2813 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2814 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2815 /* 4MV not implemented */
2816 bytestream_put_byte(&ptr, 0); /* hmv2 */
2817 bytestream_put_byte(&ptr, 0); /* vmv2 */
2820 static void update_mb_info(MpegEncContext *s, int startcode)
2824 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2825 s->mb_info_size += 12;
2826 s->prev_mb_info = s->last_mb_info;
2829 s->prev_mb_info = put_bits_count(&s->pb)/8;
2830 /* This might have incremented mb_info_size above, and we return without
2831 * actually writing any info into that slot yet. But in that case,
2832 * this will be called again at the start of the after writing the
2833 * start code, actually writing the mb info. */
2837 s->last_mb_info = put_bits_count(&s->pb)/8;
2838 if (!s->mb_info_size)
2839 s->mb_info_size += 12;
2843 int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase)
2845 if ( s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold
2846 && s->slice_context_count == 1
2847 && s->pb.buf == s->avctx->internal->byte_buffer) {
2848 int lastgob_pos = s->ptr_lastgob - s->pb.buf;
2849 int vbv_pos = s->vbv_delay_ptr - s->pb.buf;
2851 uint8_t *new_buffer = NULL;
2852 int new_buffer_size = 0;
2854 if ((s->avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
2855 av_log(s->avctx, AV_LOG_ERROR, "Cannot reallocate putbit buffer\n");
2856 return AVERROR(ENOMEM);
2859 av_fast_padded_malloc(&new_buffer, &new_buffer_size,
2860 s->avctx->internal->byte_buffer_size + size_increase);
2862 return AVERROR(ENOMEM);
2864 memcpy(new_buffer, s->avctx->internal->byte_buffer, s->avctx->internal->byte_buffer_size);
2865 av_free(s->avctx->internal->byte_buffer);
2866 s->avctx->internal->byte_buffer = new_buffer;
2867 s->avctx->internal->byte_buffer_size = new_buffer_size;
2868 rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
2869 s->ptr_lastgob = s->pb.buf + lastgob_pos;
2870 s->vbv_delay_ptr = s->pb.buf + vbv_pos;
2872 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold)
2873 return AVERROR(EINVAL);
2877 static int encode_thread(AVCodecContext *c, void *arg){
2878 MpegEncContext *s= *(void**)arg;
2879 int mb_x, mb_y, pdif = 0;
2880 int chr_h= 16>>s->chroma_y_shift;
2882 MpegEncContext best_s = { 0 }, backup_s;
2883 uint8_t bit_buf[2][MAX_MB_BYTES];
2884 uint8_t bit_buf2[2][MAX_MB_BYTES];
2885 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2886 PutBitContext pb[2], pb2[2], tex_pb[2];
2888 ff_check_alignment();
2891 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2892 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2893 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2896 s->last_bits= put_bits_count(&s->pb);
2907 /* init last dc values */
2908 /* note: quant matrix value (8) is implied here */
2909 s->last_dc[i] = 128 << s->intra_dc_precision;
2911 s->current_picture.encoding_error[i] = 0;
2913 if(s->codec_id==AV_CODEC_ID_AMV){
2914 s->last_dc[0] = 128*8/13;
2915 s->last_dc[1] = 128*8/14;
2916 s->last_dc[2] = 128*8/14;
2919 memset(s->last_mv, 0, sizeof(s->last_mv));
2923 switch(s->codec_id){
2924 case AV_CODEC_ID_H263:
2925 case AV_CODEC_ID_H263P:
2926 case AV_CODEC_ID_FLV1:
2927 if (CONFIG_H263_ENCODER)
2928 s->gob_index = H263_GOB_HEIGHT(s->height);
2930 case AV_CODEC_ID_MPEG4:
2931 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2932 ff_mpeg4_init_partitions(s);
2938 s->first_slice_line = 1;
2939 s->ptr_lastgob = s->pb.buf;
2940 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2944 ff_set_qscale(s, s->qscale);
2945 ff_init_block_index(s);
2947 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2948 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2949 int mb_type= s->mb_type[xy];
2953 int size_increase = s->avctx->internal->byte_buffer_size/4
2954 + s->mb_width*MAX_MB_BYTES;
2956 ff_mpv_reallocate_putbitbuffer(s, MAX_MB_BYTES, size_increase);
2957 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2958 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2961 if(s->data_partitioning){
2962 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2963 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2964 av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
2970 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2971 ff_update_block_index(s);
2973 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2974 ff_h261_reorder_mb_index(s);
2975 xy= s->mb_y*s->mb_stride + s->mb_x;
2976 mb_type= s->mb_type[xy];
2979 /* write gob / video packet header */
2981 int current_packet_size, is_gob_start;
2983 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2985 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2987 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2989 switch(s->codec_id){
2990 case AV_CODEC_ID_H263:
2991 case AV_CODEC_ID_H263P:
2992 if(!s->h263_slice_structured)
2993 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2995 case AV_CODEC_ID_MPEG2VIDEO:
2996 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2997 case AV_CODEC_ID_MPEG1VIDEO:
2998 if(s->mb_skip_run) is_gob_start=0;
3000 case AV_CODEC_ID_MJPEG:
3001 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
3006 if(s->start_mb_y != mb_y || mb_x!=0){
3009 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
3010 ff_mpeg4_init_partitions(s);
3014 av_assert2((put_bits_count(&s->pb)&7) == 0);
3015 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
3017 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
3018 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
3019 int d = 100 / s->error_rate;
3021 current_packet_size=0;
3022 s->pb.buf_ptr= s->ptr_lastgob;
3023 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
3027 #if FF_API_RTP_CALLBACK
3028 FF_DISABLE_DEPRECATION_WARNINGS
3029 if (s->avctx->rtp_callback){
3030 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
3031 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
3033 FF_ENABLE_DEPRECATION_WARNINGS
3035 update_mb_info(s, 1);
3037 switch(s->codec_id){
3038 case AV_CODEC_ID_MPEG4:
3039 if (CONFIG_MPEG4_ENCODER) {
3040 ff_mpeg4_encode_video_packet_header(s);
3041 ff_mpeg4_clean_buffers(s);
3044 case AV_CODEC_ID_MPEG1VIDEO:
3045 case AV_CODEC_ID_MPEG2VIDEO:
3046 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
3047 ff_mpeg1_encode_slice_header(s);
3048 ff_mpeg1_clean_buffers(s);
3051 case AV_CODEC_ID_H263:
3052 case AV_CODEC_ID_H263P:
3053 if (CONFIG_H263_ENCODER)
3054 ff_h263_encode_gob_header(s, mb_y);
3058 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
3059 int bits= put_bits_count(&s->pb);
3060 s->misc_bits+= bits - s->last_bits;
3064 s->ptr_lastgob += current_packet_size;
3065 s->first_slice_line=1;
3066 s->resync_mb_x=mb_x;
3067 s->resync_mb_y=mb_y;
3071 if( (s->resync_mb_x == s->mb_x)
3072 && s->resync_mb_y+1 == s->mb_y){
3073 s->first_slice_line=0;
3077 s->dquant=0; //only for QP_RD
3079 update_mb_info(s, 0);
3081 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
3083 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3085 copy_context_before_encode(&backup_s, s, -1);
3087 best_s.data_partitioning= s->data_partitioning;
3088 best_s.partitioned_frame= s->partitioned_frame;
3089 if(s->data_partitioning){
3090 backup_s.pb2= s->pb2;
3091 backup_s.tex_pb= s->tex_pb;
3094 if(mb_type&CANDIDATE_MB_TYPE_INTER){
3095 s->mv_dir = MV_DIR_FORWARD;
3096 s->mv_type = MV_TYPE_16X16;
3098 s->mv[0][0][0] = s->p_mv_table[xy][0];
3099 s->mv[0][0][1] = s->p_mv_table[xy][1];
3100 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
3101 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3103 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
3104 s->mv_dir = MV_DIR_FORWARD;
3105 s->mv_type = MV_TYPE_FIELD;
3108 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3109 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3110 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3112 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
3113 &dmin, &next_block, 0, 0);
3115 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
3116 s->mv_dir = MV_DIR_FORWARD;
3117 s->mv_type = MV_TYPE_16X16;
3121 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
3122 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3124 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
3125 s->mv_dir = MV_DIR_FORWARD;
3126 s->mv_type = MV_TYPE_8X8;
3129 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3130 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3132 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
3133 &dmin, &next_block, 0, 0);
3135 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
3136 s->mv_dir = MV_DIR_FORWARD;
3137 s->mv_type = MV_TYPE_16X16;
3139 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3140 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3141 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
3142 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3144 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
3145 s->mv_dir = MV_DIR_BACKWARD;
3146 s->mv_type = MV_TYPE_16X16;
3148 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3149 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3150 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
3151 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
3153 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
3154 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3155 s->mv_type = MV_TYPE_16X16;
3157 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3158 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3159 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3160 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3161 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
3162 &dmin, &next_block, 0, 0);
3164 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
3165 s->mv_dir = MV_DIR_FORWARD;
3166 s->mv_type = MV_TYPE_FIELD;
3169 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3170 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3171 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3173 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
3174 &dmin, &next_block, 0, 0);
3176 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
3177 s->mv_dir = MV_DIR_BACKWARD;
3178 s->mv_type = MV_TYPE_FIELD;
3181 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3182 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3183 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3185 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
3186 &dmin, &next_block, 0, 0);
3188 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
3189 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3190 s->mv_type = MV_TYPE_FIELD;
3192 for(dir=0; dir<2; dir++){
3194 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3195 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3196 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3199 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
3200 &dmin, &next_block, 0, 0);
3202 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
3204 s->mv_type = MV_TYPE_16X16;
3208 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
3209 &dmin, &next_block, 0, 0);
3210 if(s->h263_pred || s->h263_aic){
3212 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
3214 ff_clean_intra_table_entries(s); //old mode?
3218 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
3219 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
3220 const int last_qp= backup_s.qscale;
3223 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
3224 static const int dquant_tab[4]={-1,1,-2,2};
3225 int storecoefs = s->mb_intra && s->dc_val[0];
3227 av_assert2(backup_s.dquant == 0);
3230 s->mv_dir= best_s.mv_dir;
3231 s->mv_type = MV_TYPE_16X16;
3232 s->mb_intra= best_s.mb_intra;
3233 s->mv[0][0][0] = best_s.mv[0][0][0];
3234 s->mv[0][0][1] = best_s.mv[0][0][1];
3235 s->mv[1][0][0] = best_s.mv[1][0][0];
3236 s->mv[1][0][1] = best_s.mv[1][0][1];
3238 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3239 for(; qpi<4; qpi++){
3240 int dquant= dquant_tab[qpi];
3241 qp= last_qp + dquant;
3242 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
3244 backup_s.dquant= dquant;
3247 dc[i]= s->dc_val[0][ s->block_index[i] ];
3248 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
3252 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3253 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
3254 if(best_s.qscale != qp){
3257 s->dc_val[0][ s->block_index[i] ]= dc[i];
3258 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
3265 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3266 int mx= s->b_direct_mv_table[xy][0];
3267 int my= s->b_direct_mv_table[xy][1];
3269 backup_s.dquant = 0;
3270 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3272 ff_mpeg4_set_direct_mv(s, mx, my);
3273 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3274 &dmin, &next_block, mx, my);
3276 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3277 backup_s.dquant = 0;
3278 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3280 ff_mpeg4_set_direct_mv(s, 0, 0);
3281 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3282 &dmin, &next_block, 0, 0);
3284 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3287 coded |= s->block_last_index[i];
3290 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3291 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3292 mx=my=0; //FIXME find the one we actually used
3293 ff_mpeg4_set_direct_mv(s, mx, my);
3294 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3302 s->mv_dir= best_s.mv_dir;
3303 s->mv_type = best_s.mv_type;
3305 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3306 s->mv[0][0][1] = best_s.mv[0][0][1];
3307 s->mv[1][0][0] = best_s.mv[1][0][0];
3308 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3311 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3312 &dmin, &next_block, mx, my);
3317 s->current_picture.qscale_table[xy] = best_s.qscale;
3319 copy_context_after_encode(s, &best_s, -1);
3321 pb_bits_count= put_bits_count(&s->pb);
3322 flush_put_bits(&s->pb);
3323 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3326 if(s->data_partitioning){
3327 pb2_bits_count= put_bits_count(&s->pb2);
3328 flush_put_bits(&s->pb2);
3329 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3330 s->pb2= backup_s.pb2;
3332 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3333 flush_put_bits(&s->tex_pb);
3334 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3335 s->tex_pb= backup_s.tex_pb;
3337 s->last_bits= put_bits_count(&s->pb);
3339 if (CONFIG_H263_ENCODER &&
3340 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3341 ff_h263_update_motion_val(s);
3343 if(next_block==0){ //FIXME 16 vs linesize16
3344 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3345 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3346 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3349 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3350 ff_mpv_decode_mb(s, s->block);
3352 int motion_x = 0, motion_y = 0;
3353 s->mv_type=MV_TYPE_16X16;
3354 // only one MB-Type possible
3357 case CANDIDATE_MB_TYPE_INTRA:
3360 motion_x= s->mv[0][0][0] = 0;
3361 motion_y= s->mv[0][0][1] = 0;
3363 case CANDIDATE_MB_TYPE_INTER:
3364 s->mv_dir = MV_DIR_FORWARD;
3366 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3367 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3369 case CANDIDATE_MB_TYPE_INTER_I:
3370 s->mv_dir = MV_DIR_FORWARD;
3371 s->mv_type = MV_TYPE_FIELD;
3374 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3375 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3376 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3379 case CANDIDATE_MB_TYPE_INTER4V:
3380 s->mv_dir = MV_DIR_FORWARD;
3381 s->mv_type = MV_TYPE_8X8;
3384 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3385 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3388 case CANDIDATE_MB_TYPE_DIRECT:
3389 if (CONFIG_MPEG4_ENCODER) {
3390 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3392 motion_x=s->b_direct_mv_table[xy][0];
3393 motion_y=s->b_direct_mv_table[xy][1];
3394 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3397 case CANDIDATE_MB_TYPE_DIRECT0:
3398 if (CONFIG_MPEG4_ENCODER) {
3399 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3401 ff_mpeg4_set_direct_mv(s, 0, 0);
3404 case CANDIDATE_MB_TYPE_BIDIR:
3405 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3407 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3408 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3409 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3410 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3412 case CANDIDATE_MB_TYPE_BACKWARD:
3413 s->mv_dir = MV_DIR_BACKWARD;
3415 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3416 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3418 case CANDIDATE_MB_TYPE_FORWARD:
3419 s->mv_dir = MV_DIR_FORWARD;
3421 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3422 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3424 case CANDIDATE_MB_TYPE_FORWARD_I:
3425 s->mv_dir = MV_DIR_FORWARD;
3426 s->mv_type = MV_TYPE_FIELD;
3429 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3430 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3431 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3434 case CANDIDATE_MB_TYPE_BACKWARD_I:
3435 s->mv_dir = MV_DIR_BACKWARD;
3436 s->mv_type = MV_TYPE_FIELD;
3439 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3440 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3441 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3444 case CANDIDATE_MB_TYPE_BIDIR_I:
3445 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3446 s->mv_type = MV_TYPE_FIELD;
3448 for(dir=0; dir<2; dir++){
3450 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3451 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3452 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3457 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3460 encode_mb(s, motion_x, motion_y);
3462 // RAL: Update last macroblock type
3463 s->last_mv_dir = s->mv_dir;
3465 if (CONFIG_H263_ENCODER &&
3466 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3467 ff_h263_update_motion_val(s);
3469 ff_mpv_decode_mb(s, s->block);
3472 /* clean the MV table in IPS frames for direct mode in B frames */
3473 if(s->mb_intra /* && I,P,S_TYPE */){
3474 s->p_mv_table[xy][0]=0;
3475 s->p_mv_table[xy][1]=0;
3478 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3482 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3483 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3485 s->current_picture.encoding_error[0] += sse(
3486 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3487 s->dest[0], w, h, s->linesize);
3488 s->current_picture.encoding_error[1] += sse(
3489 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3490 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3491 s->current_picture.encoding_error[2] += sse(
3492 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3493 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3496 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3497 ff_h263_loop_filter(s);
3499 ff_dlog(s->avctx, "MB %d %d bits\n",
3500 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3504 //not beautiful here but we must write it before flushing so it has to be here
3505 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3506 ff_msmpeg4_encode_ext_header(s);
3510 #if FF_API_RTP_CALLBACK
3511 FF_DISABLE_DEPRECATION_WARNINGS
3512 /* Send the last GOB if RTP */
3513 if (s->avctx->rtp_callback) {
3514 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3515 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3516 /* Call the RTP callback to send the last GOB */
3518 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3520 FF_ENABLE_DEPRECATION_WARNINGS
3526 #define MERGE(field) dst->field += src->field; src->field=0
3527 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3528 MERGE(me.scene_change_score);
3529 MERGE(me.mc_mb_var_sum_temp);
3530 MERGE(me.mb_var_sum_temp);
3533 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3536 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3537 MERGE(dct_count[1]);
3546 MERGE(er.error_count);
3547 MERGE(padding_bug_score);
3548 MERGE(current_picture.encoding_error[0]);
3549 MERGE(current_picture.encoding_error[1]);
3550 MERGE(current_picture.encoding_error[2]);
3552 if(dst->avctx->noise_reduction){
3553 for(i=0; i<64; i++){
3554 MERGE(dct_error_sum[0][i]);
3555 MERGE(dct_error_sum[1][i]);
3559 assert(put_bits_count(&src->pb) % 8 ==0);
3560 assert(put_bits_count(&dst->pb) % 8 ==0);
3561 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3562 flush_put_bits(&dst->pb);
3565 static int estimate_qp(MpegEncContext *s, int dry_run){
3566 if (s->next_lambda){
3567 s->current_picture_ptr->f->quality =
3568 s->current_picture.f->quality = s->next_lambda;
3569 if(!dry_run) s->next_lambda= 0;
3570 } else if (!s->fixed_qscale) {
3571 s->current_picture_ptr->f->quality =
3572 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3573 if (s->current_picture.f->quality < 0)
3577 if(s->adaptive_quant){
3578 switch(s->codec_id){
3579 case AV_CODEC_ID_MPEG4:
3580 if (CONFIG_MPEG4_ENCODER)
3581 ff_clean_mpeg4_qscales(s);
3583 case AV_CODEC_ID_H263:
3584 case AV_CODEC_ID_H263P:
3585 case AV_CODEC_ID_FLV1:
3586 if (CONFIG_H263_ENCODER)
3587 ff_clean_h263_qscales(s);
3590 ff_init_qscale_tab(s);
3593 s->lambda= s->lambda_table[0];
3596 s->lambda = s->current_picture.f->quality;
3601 /* must be called before writing the header */
3602 static void set_frame_distances(MpegEncContext * s){
3603 av_assert1(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3604 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3606 if(s->pict_type==AV_PICTURE_TYPE_B){
3607 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3608 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3610 s->pp_time= s->time - s->last_non_b_time;
3611 s->last_non_b_time= s->time;
3612 assert(s->picture_number==0 || s->pp_time > 0);
3616 static int encode_picture(MpegEncContext *s, int picture_number)
3620 int context_count = s->slice_context_count;
3622 s->picture_number = picture_number;
3624 /* Reset the average MB variance */
3625 s->me.mb_var_sum_temp =
3626 s->me.mc_mb_var_sum_temp = 0;
3628 /* we need to initialize some time vars before we can encode b-frames */
3629 // RAL: Condition added for MPEG1VIDEO
3630 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3631 set_frame_distances(s);
3632 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3633 ff_set_mpeg4_time(s);
3635 s->me.scene_change_score=0;
3637 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3639 if(s->pict_type==AV_PICTURE_TYPE_I){
3640 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3641 else s->no_rounding=0;
3642 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3643 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3644 s->no_rounding ^= 1;
3647 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3648 if (estimate_qp(s,1) < 0)
3650 ff_get_2pass_fcode(s);
3651 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3652 if(s->pict_type==AV_PICTURE_TYPE_B)
3653 s->lambda= s->last_lambda_for[s->pict_type];
3655 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3659 if(s->codec_id != AV_CODEC_ID_AMV && s->codec_id != AV_CODEC_ID_MJPEG){
3660 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
3661 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
3662 s->q_chroma_intra_matrix = s->q_intra_matrix;
3663 s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
3666 s->mb_intra=0; //for the rate distortion & bit compare functions
3667 for(i=1; i<context_count; i++){
3668 ret = ff_update_duplicate_context(s->thread_context[i], s);
3676 /* Estimate motion for every MB */
3677 if(s->pict_type != AV_PICTURE_TYPE_I){
3678 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3679 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3680 if (s->pict_type != AV_PICTURE_TYPE_B) {
3681 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3682 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3686 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3687 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3689 for(i=0; i<s->mb_stride*s->mb_height; i++)
3690 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3692 if(!s->fixed_qscale){
3693 /* finding spatial complexity for I-frame rate control */
3694 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3697 for(i=1; i<context_count; i++){
3698 merge_context_after_me(s, s->thread_context[i]);
3700 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3701 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3704 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3705 s->pict_type= AV_PICTURE_TYPE_I;
3706 for(i=0; i<s->mb_stride*s->mb_height; i++)
3707 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3708 if(s->msmpeg4_version >= 3)
3710 ff_dlog(s, "Scene change detected, encoding as I Frame %"PRId64" %"PRId64"\n",
3711 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3715 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3716 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3718 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3720 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3721 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3722 s->f_code= FFMAX3(s->f_code, a, b);
3725 ff_fix_long_p_mvs(s);
3726 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3727 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3731 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3732 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3737 if(s->pict_type==AV_PICTURE_TYPE_B){
3740 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3741 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3742 s->f_code = FFMAX(a, b);
3744 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3745 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3746 s->b_code = FFMAX(a, b);
3748 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3749 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3750 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3751 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3752 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3754 for(dir=0; dir<2; dir++){
3757 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3758 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3759 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3760 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3768 if (estimate_qp(s, 0) < 0)
3771 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3772 s->pict_type == AV_PICTURE_TYPE_I &&
3773 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3774 s->qscale= 3; //reduce clipping problems
3776 if (s->out_format == FMT_MJPEG) {
3777 const uint16_t * luma_matrix = ff_mpeg1_default_intra_matrix;
3778 const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix;
3780 if (s->avctx->intra_matrix) {
3782 luma_matrix = s->avctx->intra_matrix;
3784 if (s->avctx->chroma_intra_matrix)
3785 chroma_matrix = s->avctx->chroma_intra_matrix;
3787 /* for mjpeg, we do include qscale in the matrix */
3789 int j = s->idsp.idct_permutation[i];
3791 s->chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->qscale) >> 3);
3792 s-> intra_matrix[j] = av_clip_uint8(( luma_matrix[i] * s->qscale) >> 3);
3794 s->y_dc_scale_table=
3795 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3796 s->chroma_intra_matrix[0] =
3797 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3798 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3799 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3800 ff_convert_matrix(s, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3801 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3804 if(s->codec_id == AV_CODEC_ID_AMV){
3805 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};
3806 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};
3808 int j= s->idsp.idct_permutation[ff_zigzag_direct[i]];
3810 s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
3811 s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
3813 s->y_dc_scale_table= y;
3814 s->c_dc_scale_table= c;
3815 s->intra_matrix[0] = 13;
3816 s->chroma_intra_matrix[0] = 14;
3817 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3818 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3819 ff_convert_matrix(s, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3820 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3824 //FIXME var duplication
3825 s->current_picture_ptr->f->key_frame =
3826 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3827 s->current_picture_ptr->f->pict_type =
3828 s->current_picture.f->pict_type = s->pict_type;
3830 if (s->current_picture.f->key_frame)
3831 s->picture_in_gop_number=0;
3833 s->mb_x = s->mb_y = 0;
3834 s->last_bits= put_bits_count(&s->pb);
3835 switch(s->out_format) {
3837 if (CONFIG_MJPEG_ENCODER)
3838 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3839 s->intra_matrix, s->chroma_intra_matrix);
3842 if (CONFIG_H261_ENCODER)
3843 ff_h261_encode_picture_header(s, picture_number);
3846 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3847 ff_wmv2_encode_picture_header(s, picture_number);
3848 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3849 ff_msmpeg4_encode_picture_header(s, picture_number);
3850 else if (CONFIG_MPEG4_ENCODER && s->h263_pred) {
3851 ret = ff_mpeg4_encode_picture_header(s, picture_number);
3854 } else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3855 ret = ff_rv10_encode_picture_header(s, picture_number);
3859 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3860 ff_rv20_encode_picture_header(s, picture_number);
3861 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3862 ff_flv_encode_picture_header(s, picture_number);
3863 else if (CONFIG_H263_ENCODER)
3864 ff_h263_encode_picture_header(s, picture_number);
3867 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3868 ff_mpeg1_encode_picture_header(s, picture_number);
3873 bits= put_bits_count(&s->pb);
3874 s->header_bits= bits - s->last_bits;
3876 for(i=1; i<context_count; i++){
3877 update_duplicate_context_after_me(s->thread_context[i], s);
3879 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3880 for(i=1; i<context_count; i++){
3881 if (s->pb.buf_end == s->thread_context[i]->pb.buf)
3882 set_put_bits_buffer_size(&s->pb, FFMIN(s->thread_context[i]->pb.buf_end - s->pb.buf, INT_MAX/8-32));
3883 merge_context_after_encode(s, s->thread_context[i]);
3889 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3890 const int intra= s->mb_intra;
3893 s->dct_count[intra]++;
3895 for(i=0; i<64; i++){
3896 int level= block[i];
3900 s->dct_error_sum[intra][i] += level;
3901 level -= s->dct_offset[intra][i];
3902 if(level<0) level=0;
3904 s->dct_error_sum[intra][i] -= level;
3905 level += s->dct_offset[intra][i];
3906 if(level>0) level=0;
3913 static int dct_quantize_trellis_c(MpegEncContext *s,
3914 int16_t *block, int n,
3915 int qscale, int *overflow){
3917 const uint16_t *matrix;
3918 const uint8_t *scantable= s->intra_scantable.scantable;
3919 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3921 unsigned int threshold1, threshold2;
3933 int coeff_count[64];
3934 int qmul, qadd, start_i, last_non_zero, i, dc;
3935 const int esc_length= s->ac_esc_length;
3937 uint8_t * last_length;
3938 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3941 s->fdsp.fdct(block);
3943 if(s->dct_error_sum)
3944 s->denoise_dct(s, block);
3946 qadd= ((qscale-1)|1)*8;
3948 if (s->q_scale_type) mpeg2_qscale = ff_mpeg2_non_linear_qscale[qscale];
3949 else mpeg2_qscale = qscale << 1;
3960 /* For AIC we skip quant/dequant of INTRADC */
3965 /* note: block[0] is assumed to be positive */
3966 block[0] = (block[0] + (q >> 1)) / q;
3969 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3970 matrix = n < 4 ? s->intra_matrix : s->chroma_intra_matrix;
3971 if(s->mpeg_quant || s->out_format == FMT_MPEG1 || s->out_format == FMT_MJPEG)
3972 bias= 1<<(QMAT_SHIFT-1);
3974 if (n > 3 && s->intra_chroma_ac_vlc_length) {
3975 length = s->intra_chroma_ac_vlc_length;
3976 last_length= s->intra_chroma_ac_vlc_last_length;
3978 length = s->intra_ac_vlc_length;
3979 last_length= s->intra_ac_vlc_last_length;
3984 qmat = s->q_inter_matrix[qscale];
3985 matrix = s->inter_matrix;
3986 length = s->inter_ac_vlc_length;
3987 last_length= s->inter_ac_vlc_last_length;
3991 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3992 threshold2= (threshold1<<1);
3994 for(i=63; i>=start_i; i--) {
3995 const int j = scantable[i];
3996 int level = block[j] * qmat[j];
3998 if(((unsigned)(level+threshold1))>threshold2){
4004 for(i=start_i; i<=last_non_zero; i++) {
4005 const int j = scantable[i];
4006 int level = block[j] * qmat[j];
4008 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
4009 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
4010 if(((unsigned)(level+threshold1))>threshold2){
4012 level= (bias + level)>>QMAT_SHIFT;
4014 coeff[1][i]= level-1;
4015 // coeff[2][k]= level-2;
4017 level= (bias - level)>>QMAT_SHIFT;
4018 coeff[0][i]= -level;
4019 coeff[1][i]= -level+1;
4020 // coeff[2][k]= -level+2;
4022 coeff_count[i]= FFMIN(level, 2);
4023 av_assert2(coeff_count[i]);
4026 coeff[0][i]= (level>>31)|1;
4031 *overflow= s->max_qcoeff < max; //overflow might have happened
4033 if(last_non_zero < start_i){
4034 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
4035 return last_non_zero;
4038 score_tab[start_i]= 0;
4039 survivor[0]= start_i;
4042 for(i=start_i; i<=last_non_zero; i++){
4043 int level_index, j, zero_distortion;
4044 int dct_coeff= FFABS(block[ scantable[i] ]);
4045 int best_score=256*256*256*120;
4047 if (s->fdsp.fdct == ff_fdct_ifast)
4048 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
4049 zero_distortion= dct_coeff*dct_coeff;
4051 for(level_index=0; level_index < coeff_count[i]; level_index++){
4053 int level= coeff[level_index][i];
4054 const int alevel= FFABS(level);
4059 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
4060 unquant_coeff= alevel*qmul + qadd;
4061 } else if(s->out_format == FMT_MJPEG) {
4062 j = s->idsp.idct_permutation[scantable[i]];
4063 unquant_coeff = alevel * matrix[j] * 8;
4065 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
4067 unquant_coeff = (int)( alevel * mpeg2_qscale * matrix[j]) >> 4;
4068 unquant_coeff = (unquant_coeff - 1) | 1;
4070 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int) matrix[j])) >> 5;
4071 unquant_coeff = (unquant_coeff - 1) | 1;
4076 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
4078 if((level&(~127)) == 0){
4079 for(j=survivor_count-1; j>=0; j--){
4080 int run= i - survivor[j];
4081 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4082 score += score_tab[i-run];
4084 if(score < best_score){
4087 level_tab[i+1]= level-64;
4091 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
4092 for(j=survivor_count-1; j>=0; j--){
4093 int run= i - survivor[j];
4094 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4095 score += score_tab[i-run];
4096 if(score < last_score){
4099 last_level= level-64;
4105 distortion += esc_length*lambda;
4106 for(j=survivor_count-1; j>=0; j--){
4107 int run= i - survivor[j];
4108 int score= distortion + score_tab[i-run];
4110 if(score < best_score){
4113 level_tab[i+1]= level-64;
4117 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
4118 for(j=survivor_count-1; j>=0; j--){
4119 int run= i - survivor[j];
4120 int score= distortion + score_tab[i-run];
4121 if(score < last_score){
4124 last_level= level-64;
4132 score_tab[i+1]= best_score;
4134 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
4135 if(last_non_zero <= 27){
4136 for(; survivor_count; survivor_count--){
4137 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
4141 for(; survivor_count; survivor_count--){
4142 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
4147 survivor[ survivor_count++ ]= i+1;
4150 if(s->out_format != FMT_H263 && s->out_format != FMT_H261){
4151 last_score= 256*256*256*120;
4152 for(i= survivor[0]; i<=last_non_zero + 1; i++){
4153 int score= score_tab[i];
4154 if(i) score += lambda*2; //FIXME exacter?
4156 if(score < last_score){
4159 last_level= level_tab[i];
4160 last_run= run_tab[i];
4165 s->coded_score[n] = last_score;
4167 dc= FFABS(block[0]);
4168 last_non_zero= last_i - 1;
4169 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
4171 if(last_non_zero < start_i)
4172 return last_non_zero;
4174 if(last_non_zero == 0 && start_i == 0){
4176 int best_score= dc * dc;
4178 for(i=0; i<coeff_count[0]; i++){
4179 int level= coeff[i][0];
4180 int alevel= FFABS(level);
4181 int unquant_coeff, score, distortion;
4183 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
4184 unquant_coeff= (alevel*qmul + qadd)>>3;
4186 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int) matrix[0])) >> 5;
4187 unquant_coeff = (unquant_coeff - 1) | 1;
4189 unquant_coeff = (unquant_coeff + 4) >> 3;
4190 unquant_coeff<<= 3 + 3;
4192 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
4194 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
4195 else score= distortion + esc_length*lambda;
4197 if(score < best_score){
4199 best_level= level - 64;
4202 block[0]= best_level;
4203 s->coded_score[n] = best_score - dc*dc;
4204 if(best_level == 0) return -1;
4205 else return last_non_zero;
4209 av_assert2(last_level);
4211 block[ perm_scantable[last_non_zero] ]= last_level;
4214 for(; i>start_i; i -= run_tab[i] + 1){
4215 block[ perm_scantable[i-1] ]= level_tab[i];
4218 return last_non_zero;
4221 //#define REFINE_STATS 1
4222 static int16_t basis[64][64];
4224 static void build_basis(uint8_t *perm){
4231 double s= 0.25*(1<<BASIS_SHIFT);
4233 int perm_index= perm[index];
4234 if(i==0) s*= sqrt(0.5);
4235 if(j==0) s*= sqrt(0.5);
4236 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)));
4243 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
4244 int16_t *block, int16_t *weight, int16_t *orig,
4247 LOCAL_ALIGNED_16(int16_t, d1, [64]);
4248 const uint8_t *scantable= s->intra_scantable.scantable;
4249 const uint8_t *perm_scantable= s->intra_scantable.permutated;
4250 // unsigned int threshold1, threshold2;
4255 int qmul, qadd, start_i, last_non_zero, i, dc;
4257 uint8_t * last_length;
4259 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
4262 static int after_last=0;
4263 static int to_zero=0;
4264 static int from_zero=0;
4267 static int messed_sign=0;
4270 if(basis[0][0] == 0)
4271 build_basis(s->idsp.idct_permutation);
4282 /* For AIC we skip quant/dequant of INTRADC */
4286 q <<= RECON_SHIFT-3;
4287 /* note: block[0] is assumed to be positive */
4289 // block[0] = (block[0] + (q >> 1)) / q;
4291 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4292 // bias= 1<<(QMAT_SHIFT-1);
4293 if (n > 3 && s->intra_chroma_ac_vlc_length) {
4294 length = s->intra_chroma_ac_vlc_length;
4295 last_length= s->intra_chroma_ac_vlc_last_length;
4297 length = s->intra_ac_vlc_length;
4298 last_length= s->intra_ac_vlc_last_length;
4303 length = s->inter_ac_vlc_length;
4304 last_length= s->inter_ac_vlc_last_length;
4306 last_non_zero = s->block_last_index[n];
4311 dc += (1<<(RECON_SHIFT-1));
4312 for(i=0; i<64; i++){
4313 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
4316 STOP_TIMER("memset rem[]")}
4319 for(i=0; i<64; i++){
4324 w= FFABS(weight[i]) + qns*one;
4325 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4328 // w=weight[i] = (63*qns + (w/2)) / w;
4331 av_assert2(w<(1<<6));
4334 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4340 for(i=start_i; i<=last_non_zero; i++){
4341 int j= perm_scantable[i];
4342 const int level= block[j];
4346 if(level<0) coeff= qmul*level - qadd;
4347 else coeff= qmul*level + qadd;
4348 run_tab[rle_index++]=run;
4351 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4357 if(last_non_zero>0){
4358 STOP_TIMER("init rem[]")
4365 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4368 int run2, best_unquant_change=0, analyze_gradient;
4372 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4374 if(analyze_gradient){
4378 for(i=0; i<64; i++){
4381 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4384 STOP_TIMER("rem*w*w")}
4394 const int level= block[0];
4395 int change, old_coeff;
4397 av_assert2(s->mb_intra);
4401 for(change=-1; change<=1; change+=2){
4402 int new_level= level + change;
4403 int score, new_coeff;
4405 new_coeff= q*new_level;
4406 if(new_coeff >= 2048 || new_coeff < 0)
4409 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4410 new_coeff - old_coeff);
4411 if(score<best_score){
4414 best_change= change;
4415 best_unquant_change= new_coeff - old_coeff;
4422 run2= run_tab[rle_index++];
4426 for(i=start_i; i<64; i++){
4427 int j= perm_scantable[i];
4428 const int level= block[j];
4429 int change, old_coeff;
4431 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4435 if(level<0) old_coeff= qmul*level - qadd;
4436 else old_coeff= qmul*level + qadd;
4437 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4441 av_assert2(run2>=0 || i >= last_non_zero );
4444 for(change=-1; change<=1; change+=2){
4445 int new_level= level + change;
4446 int score, new_coeff, unquant_change;
4449 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4453 if(new_level<0) new_coeff= qmul*new_level - qadd;
4454 else new_coeff= qmul*new_level + qadd;
4455 if(new_coeff >= 2048 || new_coeff <= -2048)
4457 //FIXME check for overflow
4460 if(level < 63 && level > -63){
4461 if(i < last_non_zero)
4462 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4463 - length[UNI_AC_ENC_INDEX(run, level+64)];
4465 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4466 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4469 av_assert2(FFABS(new_level)==1);
4471 if(analyze_gradient){
4472 int g= d1[ scantable[i] ];
4473 if(g && (g^new_level) >= 0)
4477 if(i < last_non_zero){
4478 int next_i= i + run2 + 1;
4479 int next_level= block[ perm_scantable[next_i] ] + 64;
4481 if(next_level&(~127))
4484 if(next_i < last_non_zero)
4485 score += length[UNI_AC_ENC_INDEX(run, 65)]
4486 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4487 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4489 score += length[UNI_AC_ENC_INDEX(run, 65)]
4490 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4491 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4493 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4495 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4496 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4502 av_assert2(FFABS(level)==1);
4504 if(i < last_non_zero){
4505 int next_i= i + run2 + 1;
4506 int next_level= block[ perm_scantable[next_i] ] + 64;
4508 if(next_level&(~127))
4511 if(next_i < last_non_zero)
4512 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4513 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4514 - length[UNI_AC_ENC_INDEX(run, 65)];
4516 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4517 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4518 - length[UNI_AC_ENC_INDEX(run, 65)];
4520 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4522 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4523 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4530 unquant_change= new_coeff - old_coeff;
4531 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4533 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4535 if(score<best_score){
4538 best_change= change;
4539 best_unquant_change= unquant_change;
4543 prev_level= level + 64;
4544 if(prev_level&(~127))
4553 STOP_TIMER("iterative step")}
4557 int j= perm_scantable[ best_coeff ];
4559 block[j] += best_change;
4561 if(best_coeff > last_non_zero){
4562 last_non_zero= best_coeff;
4563 av_assert2(block[j]);
4570 if(block[j] - best_change){
4571 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4583 for(; last_non_zero>=start_i; last_non_zero--){
4584 if(block[perm_scantable[last_non_zero]])
4590 if(256*256*256*64 % count == 0){
4591 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);
4596 for(i=start_i; i<=last_non_zero; i++){
4597 int j= perm_scantable[i];
4598 const int level= block[j];
4601 run_tab[rle_index++]=run;
4608 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4614 if(last_non_zero>0){
4615 STOP_TIMER("iterative search")
4620 return last_non_zero;
4624 * Permute an 8x8 block according to permuatation.
4625 * @param block the block which will be permuted according to
4626 * the given permutation vector
4627 * @param permutation the permutation vector
4628 * @param last the last non zero coefficient in scantable order, used to
4629 * speed the permutation up
4630 * @param scantable the used scantable, this is only used to speed the
4631 * permutation up, the block is not (inverse) permutated
4632 * to scantable order!
4634 void ff_block_permute(int16_t *block, uint8_t *permutation,
4635 const uint8_t *scantable, int last)
4642 //FIXME it is ok but not clean and might fail for some permutations
4643 // if (permutation[1] == 1)
4646 for (i = 0; i <= last; i++) {
4647 const int j = scantable[i];
4652 for (i = 0; i <= last; i++) {
4653 const int j = scantable[i];
4654 const int perm_j = permutation[j];
4655 block[perm_j] = temp[j];
4659 int ff_dct_quantize_c(MpegEncContext *s,
4660 int16_t *block, int n,
4661 int qscale, int *overflow)
4663 int i, j, level, last_non_zero, q, start_i;
4665 const uint8_t *scantable= s->intra_scantable.scantable;
4668 unsigned int threshold1, threshold2;
4670 s->fdsp.fdct(block);
4672 if(s->dct_error_sum)
4673 s->denoise_dct(s, block);
4683 /* For AIC we skip quant/dequant of INTRADC */
4686 /* note: block[0] is assumed to be positive */
4687 block[0] = (block[0] + (q >> 1)) / q;
4690 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4691 bias= s->intra_quant_bias*(1<<(QMAT_SHIFT - QUANT_BIAS_SHIFT));
4695 qmat = s->q_inter_matrix[qscale];
4696 bias= s->inter_quant_bias*(1<<(QMAT_SHIFT - QUANT_BIAS_SHIFT));
4698 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4699 threshold2= (threshold1<<1);
4700 for(i=63;i>=start_i;i--) {
4702 level = block[j] * qmat[j];
4704 if(((unsigned)(level+threshold1))>threshold2){
4711 for(i=start_i; i<=last_non_zero; i++) {
4713 level = block[j] * qmat[j];
4715 // if( bias+level >= (1<<QMAT_SHIFT)
4716 // || bias-level >= (1<<QMAT_SHIFT)){
4717 if(((unsigned)(level+threshold1))>threshold2){
4719 level= (bias + level)>>QMAT_SHIFT;
4722 level= (bias - level)>>QMAT_SHIFT;
4730 *overflow= s->max_qcoeff < max; //overflow might have happened
4732 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4733 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4734 ff_block_permute(block, s->idsp.idct_permutation,
4735 scantable, last_non_zero);
4737 return last_non_zero;
4740 #define OFFSET(x) offsetof(MpegEncContext, x)
4741 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4742 static const AVOption h263_options[] = {
4743 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
4744 { "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 },
4749 static const AVClass h263_class = {
4750 .class_name = "H.263 encoder",
4751 .item_name = av_default_item_name,
4752 .option = h263_options,
4753 .version = LIBAVUTIL_VERSION_INT,
4756 AVCodec ff_h263_encoder = {
4758 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4759 .type = AVMEDIA_TYPE_VIDEO,
4760 .id = AV_CODEC_ID_H263,
4761 .priv_data_size = sizeof(MpegEncContext),
4762 .init = ff_mpv_encode_init,
4763 .encode2 = ff_mpv_encode_picture,
4764 .close = ff_mpv_encode_end,
4765 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4766 .priv_class = &h263_class,
4769 static const AVOption h263p_options[] = {
4770 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
4771 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
4772 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
4773 { "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},
4777 static const AVClass h263p_class = {
4778 .class_name = "H.263p encoder",
4779 .item_name = av_default_item_name,
4780 .option = h263p_options,
4781 .version = LIBAVUTIL_VERSION_INT,
4784 AVCodec ff_h263p_encoder = {
4786 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4787 .type = AVMEDIA_TYPE_VIDEO,
4788 .id = AV_CODEC_ID_H263P,
4789 .priv_data_size = sizeof(MpegEncContext),
4790 .init = ff_mpv_encode_init,
4791 .encode2 = ff_mpv_encode_picture,
4792 .close = ff_mpv_encode_end,
4793 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4794 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4795 .priv_class = &h263p_class,
4798 static const AVClass msmpeg4v2_class = {
4799 .class_name = "msmpeg4v2 encoder",
4800 .item_name = av_default_item_name,
4801 .option = ff_mpv_generic_options,
4802 .version = LIBAVUTIL_VERSION_INT,
4805 AVCodec ff_msmpeg4v2_encoder = {
4806 .name = "msmpeg4v2",
4807 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4808 .type = AVMEDIA_TYPE_VIDEO,
4809 .id = AV_CODEC_ID_MSMPEG4V2,
4810 .priv_data_size = sizeof(MpegEncContext),
4811 .init = ff_mpv_encode_init,
4812 .encode2 = ff_mpv_encode_picture,
4813 .close = ff_mpv_encode_end,
4814 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4815 .priv_class = &msmpeg4v2_class,
4818 static const AVClass msmpeg4v3_class = {
4819 .class_name = "msmpeg4v3 encoder",
4820 .item_name = av_default_item_name,
4821 .option = ff_mpv_generic_options,
4822 .version = LIBAVUTIL_VERSION_INT,
4825 AVCodec ff_msmpeg4v3_encoder = {
4827 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4828 .type = AVMEDIA_TYPE_VIDEO,
4829 .id = AV_CODEC_ID_MSMPEG4V3,
4830 .priv_data_size = sizeof(MpegEncContext),
4831 .init = ff_mpv_encode_init,
4832 .encode2 = ff_mpv_encode_picture,
4833 .close = ff_mpv_encode_end,
4834 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4835 .priv_class = &msmpeg4v3_class,
4838 static const AVClass wmv1_class = {
4839 .class_name = "wmv1 encoder",
4840 .item_name = av_default_item_name,
4841 .option = ff_mpv_generic_options,
4842 .version = LIBAVUTIL_VERSION_INT,
4845 AVCodec ff_wmv1_encoder = {
4847 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4848 .type = AVMEDIA_TYPE_VIDEO,
4849 .id = AV_CODEC_ID_WMV1,
4850 .priv_data_size = sizeof(MpegEncContext),
4851 .init = ff_mpv_encode_init,
4852 .encode2 = ff_mpv_encode_picture,
4853 .close = ff_mpv_encode_end,
4854 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4855 .priv_class = &wmv1_class,