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 Libav.
10 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "libavutil/internal.h"
33 #include "libavutil/intmath.h"
34 #include "libavutil/mathematics.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/timer.h"
42 #include "mpegvideo.h"
45 #include "mjpegenc_common.h"
47 #include "mpegutils.h"
50 #include "pixblockdsp.h"
54 #include "aandcttab.h"
56 #include "mpeg4video.h"
58 #include "bytestream.h"
62 #define QUANT_BIAS_SHIFT 8
64 #define QMAT_SHIFT_MMX 16
67 static int encode_picture(MpegEncContext *s, int picture_number);
68 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
69 static int sse_mb(MpegEncContext *s);
70 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
71 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
73 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
74 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
76 const AVOption ff_mpv_generic_options[] = {
81 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
82 uint16_t (*qmat16)[2][64],
83 const uint16_t *quant_matrix,
84 int bias, int qmin, int qmax, int intra)
86 FDCTDSPContext *fdsp = &s->fdsp;
90 for (qscale = qmin; qscale <= qmax; qscale++) {
92 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
94 fdsp->fdct == ff_faandct ||
95 #endif /* CONFIG_FAANDCT */
96 fdsp->fdct == ff_jpeg_fdct_islow_10) {
97 for (i = 0; i < 64; i++) {
98 const int j = s->idsp.idct_permutation[i];
99 int64_t den = (int64_t) qscale * quant_matrix[j];
100 /* 16 <= qscale * quant_matrix[i] <= 7905
101 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
102 * 19952 <= x <= 249205026
103 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
104 * 3444240 >= (1 << 36) / (x) >= 275 */
106 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
108 } else if (fdsp->fdct == ff_fdct_ifast) {
109 for (i = 0; i < 64; i++) {
110 const int j = s->idsp.idct_permutation[i];
111 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
112 /* 16 <= qscale * quant_matrix[i] <= 7905
113 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
114 * 19952 <= x <= 249205026
115 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
116 * 3444240 >= (1 << 36) / (x) >= 275 */
118 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
121 for (i = 0; i < 64; i++) {
122 const int j = s->idsp.idct_permutation[i];
123 int64_t den = (int64_t) qscale * quant_matrix[j];
124 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
125 * Assume x = qscale * quant_matrix[i]
127 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
128 * so 32768 >= (1 << 19) / (x) >= 67 */
129 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
130 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
131 // (qscale * quant_matrix[i]);
132 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
134 if (qmat16[qscale][0][i] == 0 ||
135 qmat16[qscale][0][i] == 128 * 256)
136 qmat16[qscale][0][i] = 128 * 256 - 1;
137 qmat16[qscale][1][i] =
138 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
139 qmat16[qscale][0][i]);
143 for (i = intra; i < 64; i++) {
145 if (fdsp->fdct == ff_fdct_ifast) {
146 max = (8191LL * ff_aanscales[i]) >> 14;
148 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
154 av_log(NULL, AV_LOG_INFO,
155 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
160 static inline void update_qscale(MpegEncContext *s)
162 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
163 (FF_LAMBDA_SHIFT + 7);
164 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
166 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
170 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
176 for (i = 0; i < 64; i++) {
177 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
184 * init s->current_picture.qscale_table from s->lambda_table
186 void ff_init_qscale_tab(MpegEncContext *s)
188 int8_t * const qscale_table = s->current_picture.qscale_table;
191 for (i = 0; i < s->mb_num; i++) {
192 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
193 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
194 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
199 static void update_duplicate_context_after_me(MpegEncContext *dst,
202 #define COPY(a) dst->a= src->a
204 COPY(current_picture);
210 COPY(picture_in_gop_number);
211 COPY(gop_picture_number);
212 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
213 COPY(progressive_frame); // FIXME don't set in encode_header
214 COPY(partitioned_frame); // FIXME don't set in encode_header
219 * Set the given MpegEncContext to defaults for encoding.
220 * the changed fields will not depend upon the prior state of the MpegEncContext.
222 static void mpv_encode_defaults(MpegEncContext *s)
225 ff_mpv_common_defaults(s);
227 for (i = -16; i < 16; i++) {
228 default_fcode_tab[i + MAX_MV] = 1;
230 s->me.mv_penalty = default_mv_penalty;
231 s->fcode_tab = default_fcode_tab;
233 s->input_picture_number = 0;
234 s->picture_in_gop_number = 0;
237 /* init video encoder */
238 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
240 MpegEncContext *s = avctx->priv_data;
241 int i, ret, format_supported;
243 mpv_encode_defaults(s);
245 switch (avctx->codec_id) {
246 case AV_CODEC_ID_MPEG2VIDEO:
247 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
248 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
249 av_log(avctx, AV_LOG_ERROR,
250 "only YUV420 and YUV422 are supported\n");
254 case AV_CODEC_ID_MJPEG:
255 format_supported = 0;
256 /* JPEG color space */
257 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
258 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
259 (avctx->color_range == AVCOL_RANGE_JPEG &&
260 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
261 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
262 format_supported = 1;
263 /* MPEG color space */
264 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
265 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
266 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
267 format_supported = 1;
269 if (!format_supported) {
270 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
275 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
276 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
281 switch (avctx->pix_fmt) {
282 case AV_PIX_FMT_YUVJ422P:
283 case AV_PIX_FMT_YUV422P:
284 s->chroma_format = CHROMA_422;
286 case AV_PIX_FMT_YUVJ420P:
287 case AV_PIX_FMT_YUV420P:
289 s->chroma_format = CHROMA_420;
293 s->bit_rate = avctx->bit_rate;
294 s->width = avctx->width;
295 s->height = avctx->height;
296 if (avctx->gop_size > 600 &&
297 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
298 av_log(avctx, AV_LOG_ERROR,
299 "Warning keyframe interval too large! reducing it ...\n");
300 avctx->gop_size = 600;
302 s->gop_size = avctx->gop_size;
304 if (avctx->max_b_frames > MAX_B_FRAMES) {
305 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
306 "is %d.\n", MAX_B_FRAMES);
308 s->max_b_frames = avctx->max_b_frames;
309 s->codec_id = avctx->codec->id;
310 s->strict_std_compliance = avctx->strict_std_compliance;
311 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
312 s->mpeg_quant = avctx->mpeg_quant;
313 s->rtp_mode = !!avctx->rtp_payload_size;
314 s->intra_dc_precision = avctx->intra_dc_precision;
315 s->user_specified_pts = AV_NOPTS_VALUE;
317 if (s->gop_size <= 1) {
324 s->me_method = avctx->me_method;
327 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
330 FF_DISABLE_DEPRECATION_WARNINGS
331 if (avctx->border_masking != 0.0)
332 s->border_masking = avctx->border_masking;
333 FF_ENABLE_DEPRECATION_WARNINGS
336 s->adaptive_quant = (s->avctx->lumi_masking ||
337 s->avctx->dark_masking ||
338 s->avctx->temporal_cplx_masking ||
339 s->avctx->spatial_cplx_masking ||
340 s->avctx->p_masking ||
342 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
345 s->loop_filter = !!(s->avctx->flags & CODEC_FLAG_LOOP_FILTER);
347 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
348 av_log(avctx, AV_LOG_ERROR,
349 "a vbv buffer size is needed, "
350 "for encoding with a maximum bitrate\n");
354 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
355 av_log(avctx, AV_LOG_INFO,
356 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
359 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
360 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
364 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
365 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
369 if (avctx->rc_max_rate &&
370 avctx->rc_max_rate == avctx->bit_rate &&
371 avctx->rc_max_rate != avctx->rc_min_rate) {
372 av_log(avctx, AV_LOG_INFO,
373 "impossible bitrate constraints, this will fail\n");
376 if (avctx->rc_buffer_size &&
377 avctx->bit_rate * (int64_t)avctx->time_base.num >
378 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
379 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
383 if (!s->fixed_qscale &&
384 avctx->bit_rate * av_q2d(avctx->time_base) >
385 avctx->bit_rate_tolerance) {
386 av_log(avctx, AV_LOG_ERROR,
387 "bitrate tolerance too small for bitrate\n");
391 if (s->avctx->rc_max_rate &&
392 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
393 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
394 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
395 90000LL * (avctx->rc_buffer_size - 1) >
396 s->avctx->rc_max_rate * 0xFFFFLL) {
397 av_log(avctx, AV_LOG_INFO,
398 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
399 "specified vbv buffer is too large for the given bitrate!\n");
402 if ((s->avctx->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
403 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
404 s->codec_id != AV_CODEC_ID_FLV1) {
405 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
409 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
410 av_log(avctx, AV_LOG_ERROR,
411 "OBMC is only supported with simple mb decision\n");
415 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
416 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
420 if (s->max_b_frames &&
421 s->codec_id != AV_CODEC_ID_MPEG4 &&
422 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
423 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
424 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
428 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
429 s->codec_id == AV_CODEC_ID_H263 ||
430 s->codec_id == AV_CODEC_ID_H263P) &&
431 (avctx->sample_aspect_ratio.num > 255 ||
432 avctx->sample_aspect_ratio.den > 255)) {
433 av_log(avctx, AV_LOG_ERROR,
434 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
435 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
439 if ((s->avctx->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
440 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
441 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
445 // FIXME mpeg2 uses that too
446 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
447 av_log(avctx, AV_LOG_ERROR,
448 "mpeg2 style quantization not supported by codec\n");
452 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
453 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
457 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
458 s->avctx->mb_decision != FF_MB_DECISION_RD) {
459 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
463 if (s->avctx->scenechange_threshold < 1000000000 &&
464 (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)) {
465 av_log(avctx, AV_LOG_ERROR,
466 "closed gop with scene change detection are not supported yet, "
467 "set threshold to 1000000000\n");
471 if (s->avctx->flags & CODEC_FLAG_LOW_DELAY) {
472 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
473 av_log(avctx, AV_LOG_ERROR,
474 "low delay forcing is only available for mpeg2\n");
477 if (s->max_b_frames != 0) {
478 av_log(avctx, AV_LOG_ERROR,
479 "b frames cannot be used with low delay\n");
484 if (s->q_scale_type == 1) {
485 if (avctx->qmax > 12) {
486 av_log(avctx, AV_LOG_ERROR,
487 "non linear quant only supports qmax <= 12 currently\n");
492 if (s->avctx->thread_count > 1 &&
493 s->codec_id != AV_CODEC_ID_MPEG4 &&
494 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
495 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
496 (s->codec_id != AV_CODEC_ID_H263P)) {
497 av_log(avctx, AV_LOG_ERROR,
498 "multi threaded encoding not supported by codec\n");
502 if (s->avctx->thread_count < 1) {
503 av_log(avctx, AV_LOG_ERROR,
504 "automatic thread number detection not supported by codec,"
509 if (s->avctx->thread_count > 1)
512 if (!avctx->time_base.den || !avctx->time_base.num) {
513 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
517 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
518 av_log(avctx, AV_LOG_INFO,
519 "notice: b_frame_strategy only affects the first pass\n");
520 avctx->b_frame_strategy = 0;
523 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
525 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
526 avctx->time_base.den /= i;
527 avctx->time_base.num /= i;
531 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
532 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
533 // (a + x * 3 / 8) / x
534 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
535 s->inter_quant_bias = 0;
537 s->intra_quant_bias = 0;
539 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
542 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
543 s->intra_quant_bias = avctx->intra_quant_bias;
544 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
545 s->inter_quant_bias = avctx->inter_quant_bias;
547 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
548 s->avctx->time_base.den > (1 << 16) - 1) {
549 av_log(avctx, AV_LOG_ERROR,
550 "timebase %d/%d not supported by MPEG 4 standard, "
551 "the maximum admitted value for the timebase denominator "
552 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
556 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
558 switch (avctx->codec->id) {
559 case AV_CODEC_ID_MPEG1VIDEO:
560 s->out_format = FMT_MPEG1;
561 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
562 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
564 case AV_CODEC_ID_MPEG2VIDEO:
565 s->out_format = FMT_MPEG1;
566 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
567 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
570 case AV_CODEC_ID_MJPEG:
571 s->out_format = FMT_MJPEG;
572 s->intra_only = 1; /* force intra only for jpeg */
573 if (!CONFIG_MJPEG_ENCODER ||
574 ff_mjpeg_encode_init(s) < 0)
579 case AV_CODEC_ID_H261:
580 if (!CONFIG_H261_ENCODER)
582 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
583 av_log(avctx, AV_LOG_ERROR,
584 "The specified picture size of %dx%d is not valid for the "
585 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
586 s->width, s->height);
589 s->out_format = FMT_H261;
592 s->rtp_mode = 0; /* Sliced encoding not supported */
594 case AV_CODEC_ID_H263:
595 if (!CONFIG_H263_ENCODER)
597 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
598 s->width, s->height) == 8) {
599 av_log(avctx, AV_LOG_INFO,
600 "The specified picture size of %dx%d is not valid for "
601 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
602 "352x288, 704x576, and 1408x1152."
603 "Try H.263+.\n", s->width, s->height);
606 s->out_format = FMT_H263;
610 case AV_CODEC_ID_H263P:
611 s->out_format = FMT_H263;
614 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
615 s->modified_quant = s->h263_aic;
616 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
617 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
620 /* These are just to be sure */
624 case AV_CODEC_ID_FLV1:
625 s->out_format = FMT_H263;
626 s->h263_flv = 2; /* format = 1; 11-bit codes */
627 s->unrestricted_mv = 1;
628 s->rtp_mode = 0; /* don't allow GOB */
632 case AV_CODEC_ID_RV10:
633 s->out_format = FMT_H263;
637 case AV_CODEC_ID_RV20:
638 s->out_format = FMT_H263;
641 s->modified_quant = 1;
645 s->unrestricted_mv = 0;
647 case AV_CODEC_ID_MPEG4:
648 s->out_format = FMT_H263;
650 s->unrestricted_mv = 1;
651 s->low_delay = s->max_b_frames ? 0 : 1;
652 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
654 case AV_CODEC_ID_MSMPEG4V2:
655 s->out_format = FMT_H263;
657 s->unrestricted_mv = 1;
658 s->msmpeg4_version = 2;
662 case AV_CODEC_ID_MSMPEG4V3:
663 s->out_format = FMT_H263;
665 s->unrestricted_mv = 1;
666 s->msmpeg4_version = 3;
667 s->flipflop_rounding = 1;
671 case AV_CODEC_ID_WMV1:
672 s->out_format = FMT_H263;
674 s->unrestricted_mv = 1;
675 s->msmpeg4_version = 4;
676 s->flipflop_rounding = 1;
680 case AV_CODEC_ID_WMV2:
681 s->out_format = FMT_H263;
683 s->unrestricted_mv = 1;
684 s->msmpeg4_version = 5;
685 s->flipflop_rounding = 1;
693 avctx->has_b_frames = !s->low_delay;
697 s->progressive_frame =
698 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
699 CODEC_FLAG_INTERLACED_ME) ||
704 if (ff_mpv_common_init(s) < 0)
708 ff_mpv_encode_init_x86(s);
710 ff_fdctdsp_init(&s->fdsp, avctx);
711 ff_me_cmp_init(&s->mecc, avctx);
712 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
713 ff_pixblockdsp_init(&s->pdsp, avctx);
714 ff_qpeldsp_init(&s->qdsp);
716 s->avctx->coded_frame = s->current_picture.f;
718 if (s->msmpeg4_version) {
719 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
720 2 * 2 * (MAX_LEVEL + 1) *
721 (MAX_RUN + 1) * 2 * sizeof(int), fail);
723 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
725 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
726 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
727 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
729 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
730 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
731 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
732 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
734 if (s->avctx->noise_reduction) {
735 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
736 2 * 64 * sizeof(uint16_t), fail);
739 if (CONFIG_H263_ENCODER)
740 ff_h263dsp_init(&s->h263dsp);
741 if (!s->dct_quantize)
742 s->dct_quantize = ff_dct_quantize_c;
744 s->denoise_dct = denoise_dct_c;
745 s->fast_dct_quantize = s->dct_quantize;
747 s->dct_quantize = dct_quantize_trellis_c;
749 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
750 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
752 s->quant_precision = 5;
754 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
755 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
757 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
758 ff_h261_encode_init(s);
759 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
760 ff_h263_encode_init(s);
761 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
762 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
764 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
765 && s->out_format == FMT_MPEG1)
766 ff_mpeg1_encode_init(s);
769 for (i = 0; i < 64; i++) {
770 int j = s->idsp.idct_permutation[i];
771 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
773 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
774 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
775 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
777 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
780 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
781 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
783 if (s->avctx->intra_matrix)
784 s->intra_matrix[j] = s->avctx->intra_matrix[i];
785 if (s->avctx->inter_matrix)
786 s->inter_matrix[j] = s->avctx->inter_matrix[i];
789 /* precompute matrix */
790 /* for mjpeg, we do include qscale in the matrix */
791 if (s->out_format != FMT_MJPEG) {
792 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
793 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
795 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
796 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
800 if (ff_rate_control_init(s) < 0)
803 #if FF_API_ERROR_RATE
804 FF_DISABLE_DEPRECATION_WARNINGS
805 if (avctx->error_rate)
806 s->error_rate = avctx->error_rate;
807 FF_ENABLE_DEPRECATION_WARNINGS;
810 #if FF_API_NORMALIZE_AQP
811 FF_DISABLE_DEPRECATION_WARNINGS
812 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
813 s->mpv_flags |= FF_MPV_FLAG_NAQ;
814 FF_ENABLE_DEPRECATION_WARNINGS;
818 FF_DISABLE_DEPRECATION_WARNINGS
819 if (avctx->flags & CODEC_FLAG_MV0)
820 s->mpv_flags |= FF_MPV_FLAG_MV0;
821 FF_ENABLE_DEPRECATION_WARNINGS
825 FF_DISABLE_DEPRECATION_WARNINGS
826 if (avctx->rc_qsquish != 0.0)
827 s->rc_qsquish = avctx->rc_qsquish;
828 if (avctx->rc_qmod_amp != 0.0)
829 s->rc_qmod_amp = avctx->rc_qmod_amp;
830 if (avctx->rc_qmod_freq)
831 s->rc_qmod_freq = avctx->rc_qmod_freq;
832 if (avctx->rc_buffer_aggressivity != 1.0)
833 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
834 if (avctx->rc_initial_cplx != 0.0)
835 s->rc_initial_cplx = avctx->rc_initial_cplx;
837 s->lmin = avctx->lmin;
839 s->lmax = avctx->lmax;
843 s->rc_eq = av_strdup(avctx->rc_eq);
845 return AVERROR(ENOMEM);
847 FF_ENABLE_DEPRECATION_WARNINGS
850 if (avctx->b_frame_strategy == 2) {
851 for (i = 0; i < s->max_b_frames + 2; i++) {
852 s->tmp_frames[i] = av_frame_alloc();
853 if (!s->tmp_frames[i])
854 return AVERROR(ENOMEM);
856 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
857 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
858 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
860 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
868 ff_mpv_encode_end(avctx);
869 return AVERROR_UNKNOWN;
872 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
874 MpegEncContext *s = avctx->priv_data;
877 ff_rate_control_uninit(s);
879 ff_mpv_common_end(s);
880 if (CONFIG_MJPEG_ENCODER &&
881 s->out_format == FMT_MJPEG)
882 ff_mjpeg_encode_close(s);
884 av_freep(&avctx->extradata);
886 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
887 av_frame_free(&s->tmp_frames[i]);
889 ff_free_picture_tables(&s->new_picture);
890 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
892 av_freep(&s->avctx->stats_out);
893 av_freep(&s->ac_stats);
895 av_freep(&s->q_intra_matrix);
896 av_freep(&s->q_inter_matrix);
897 av_freep(&s->q_intra_matrix16);
898 av_freep(&s->q_inter_matrix16);
899 av_freep(&s->input_picture);
900 av_freep(&s->reordered_input_picture);
901 av_freep(&s->dct_offset);
906 static int get_sae(uint8_t *src, int ref, int stride)
911 for (y = 0; y < 16; y++) {
912 for (x = 0; x < 16; x++) {
913 acc += FFABS(src[x + y * stride] - ref);
920 static int get_intra_count(MpegEncContext *s, uint8_t *src,
921 uint8_t *ref, int stride)
929 for (y = 0; y < h; y += 16) {
930 for (x = 0; x < w; x += 16) {
931 int offset = x + y * stride;
932 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
934 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
935 int sae = get_sae(src + offset, mean, stride);
937 acc += sae + 500 < sad;
944 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
948 int i, display_picture_number = 0, ret;
949 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
950 (s->low_delay ? 0 : 1);
955 display_picture_number = s->input_picture_number++;
957 if (pts != AV_NOPTS_VALUE) {
958 if (s->user_specified_pts != AV_NOPTS_VALUE) {
960 int64_t last = s->user_specified_pts;
963 av_log(s->avctx, AV_LOG_ERROR,
964 "Error, Invalid timestamp=%"PRId64", "
965 "last=%"PRId64"\n", pts, s->user_specified_pts);
969 if (!s->low_delay && display_picture_number == 1)
970 s->dts_delta = time - last;
972 s->user_specified_pts = pts;
974 if (s->user_specified_pts != AV_NOPTS_VALUE) {
975 s->user_specified_pts =
976 pts = s->user_specified_pts + 1;
977 av_log(s->avctx, AV_LOG_INFO,
978 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
981 pts = display_picture_number;
987 if (!pic_arg->buf[0] ||
988 pic_arg->linesize[0] != s->linesize ||
989 pic_arg->linesize[1] != s->uvlinesize ||
990 pic_arg->linesize[2] != s->uvlinesize)
992 if ((s->width & 15) || (s->height & 15))
995 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
996 pic_arg->linesize[1], s->linesize, s->uvlinesize);
998 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1002 pic = &s->picture[i];
1006 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1009 ret = ff_alloc_picture(s, pic, direct);
1014 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1015 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1016 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1019 int h_chroma_shift, v_chroma_shift;
1020 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1024 for (i = 0; i < 3; i++) {
1025 int src_stride = pic_arg->linesize[i];
1026 int dst_stride = i ? s->uvlinesize : s->linesize;
1027 int h_shift = i ? h_chroma_shift : 0;
1028 int v_shift = i ? v_chroma_shift : 0;
1029 int w = s->width >> h_shift;
1030 int h = s->height >> v_shift;
1031 uint8_t *src = pic_arg->data[i];
1032 uint8_t *dst = pic->f->data[i];
1034 if (!s->avctx->rc_buffer_size)
1035 dst += INPLACE_OFFSET;
1037 if (src_stride == dst_stride)
1038 memcpy(dst, src, src_stride * h);
1041 uint8_t *dst2 = dst;
1043 memcpy(dst2, src, w);
1048 if ((s->width & 15) || (s->height & 15)) {
1049 s->mpvencdsp.draw_edges(dst, dst_stride,
1058 ret = av_frame_copy_props(pic->f, pic_arg);
1062 pic->f->display_picture_number = display_picture_number;
1063 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1066 /* shift buffer entries */
1067 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1068 s->input_picture[i - 1] = s->input_picture[i];
1070 s->input_picture[encoding_delay] = (Picture*) pic;
1075 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1079 int64_t score64 = 0;
1081 for (plane = 0; plane < 3; plane++) {
1082 const int stride = p->f->linesize[plane];
1083 const int bw = plane ? 1 : 2;
1084 for (y = 0; y < s->mb_height * bw; y++) {
1085 for (x = 0; x < s->mb_width * bw; x++) {
1086 int off = p->shared ? 0 : 16;
1087 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1088 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1089 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1091 switch (s->avctx->frame_skip_exp) {
1092 case 0: score = FFMAX(score, v); break;
1093 case 1: score += FFABS(v); break;
1094 case 2: score += v * v; break;
1095 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1096 case 4: score64 += v * v * (int64_t)(v * v); break;
1105 if (score64 < s->avctx->frame_skip_threshold)
1107 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1112 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1114 AVPacket pkt = { 0 };
1115 int ret, got_output;
1117 av_init_packet(&pkt);
1118 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1123 av_free_packet(&pkt);
1127 static int estimate_best_b_count(MpegEncContext *s)
1129 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1130 AVCodecContext *c = avcodec_alloc_context3(NULL);
1131 const int scale = s->avctx->brd_scale;
1132 int i, j, out_size, p_lambda, b_lambda, lambda2;
1133 int64_t best_rd = INT64_MAX;
1134 int best_b_count = -1;
1137 return AVERROR(ENOMEM);
1138 assert(scale >= 0 && scale <= 3);
1141 //s->next_picture_ptr->quality;
1142 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1143 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1144 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1145 if (!b_lambda) // FIXME we should do this somewhere else
1146 b_lambda = p_lambda;
1147 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1150 c->width = s->width >> scale;
1151 c->height = s->height >> scale;
1152 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1153 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1154 c->mb_decision = s->avctx->mb_decision;
1155 c->me_cmp = s->avctx->me_cmp;
1156 c->mb_cmp = s->avctx->mb_cmp;
1157 c->me_sub_cmp = s->avctx->me_sub_cmp;
1158 c->pix_fmt = AV_PIX_FMT_YUV420P;
1159 c->time_base = s->avctx->time_base;
1160 c->max_b_frames = s->max_b_frames;
1162 if (avcodec_open2(c, codec, NULL) < 0)
1165 for (i = 0; i < s->max_b_frames + 2; i++) {
1166 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1167 s->next_picture_ptr;
1169 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1170 pre_input = *pre_input_ptr;
1172 if (!pre_input.shared && i) {
1173 pre_input.f->data[0] += INPLACE_OFFSET;
1174 pre_input.f->data[1] += INPLACE_OFFSET;
1175 pre_input.f->data[2] += INPLACE_OFFSET;
1178 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1179 s->tmp_frames[i]->linesize[0],
1180 pre_input.f->data[0],
1181 pre_input.f->linesize[0],
1182 c->width, c->height);
1183 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1184 s->tmp_frames[i]->linesize[1],
1185 pre_input.f->data[1],
1186 pre_input.f->linesize[1],
1187 c->width >> 1, c->height >> 1);
1188 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1189 s->tmp_frames[i]->linesize[2],
1190 pre_input.f->data[2],
1191 pre_input.f->linesize[2],
1192 c->width >> 1, c->height >> 1);
1196 for (j = 0; j < s->max_b_frames + 1; j++) {
1199 if (!s->input_picture[j])
1202 c->error[0] = c->error[1] = c->error[2] = 0;
1204 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1205 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1207 out_size = encode_frame(c, s->tmp_frames[0]);
1209 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1211 for (i = 0; i < s->max_b_frames + 1; i++) {
1212 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1214 s->tmp_frames[i + 1]->pict_type = is_p ?
1215 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1216 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1218 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1220 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1223 /* get the delayed frames */
1225 out_size = encode_frame(c, NULL);
1226 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1229 rd += c->error[0] + c->error[1] + c->error[2];
1240 return best_b_count;
1243 static int select_input_picture(MpegEncContext *s)
1247 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1248 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1249 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1251 /* set next picture type & ordering */
1252 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1253 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1254 !s->next_picture_ptr || s->intra_only) {
1255 s->reordered_input_picture[0] = s->input_picture[0];
1256 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1257 s->reordered_input_picture[0]->f->coded_picture_number =
1258 s->coded_picture_number++;
1262 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1263 if (s->picture_in_gop_number < s->gop_size &&
1264 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1265 // FIXME check that te gop check above is +-1 correct
1266 av_frame_unref(s->input_picture[0]->f);
1269 ff_vbv_update(s, 0);
1275 if (s->avctx->flags & CODEC_FLAG_PASS2) {
1276 for (i = 0; i < s->max_b_frames + 1; i++) {
1277 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1279 if (pict_num >= s->rc_context.num_entries)
1281 if (!s->input_picture[i]) {
1282 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1286 s->input_picture[i]->f->pict_type =
1287 s->rc_context.entry[pict_num].new_pict_type;
1291 if (s->avctx->b_frame_strategy == 0) {
1292 b_frames = s->max_b_frames;
1293 while (b_frames && !s->input_picture[b_frames])
1295 } else if (s->avctx->b_frame_strategy == 1) {
1296 for (i = 1; i < s->max_b_frames + 1; i++) {
1297 if (s->input_picture[i] &&
1298 s->input_picture[i]->b_frame_score == 0) {
1299 s->input_picture[i]->b_frame_score =
1301 s->input_picture[i ]->f->data[0],
1302 s->input_picture[i - 1]->f->data[0],
1306 for (i = 0; i < s->max_b_frames + 1; i++) {
1307 if (!s->input_picture[i] ||
1308 s->input_picture[i]->b_frame_score - 1 >
1309 s->mb_num / s->avctx->b_sensitivity)
1313 b_frames = FFMAX(0, i - 1);
1316 for (i = 0; i < b_frames + 1; i++) {
1317 s->input_picture[i]->b_frame_score = 0;
1319 } else if (s->avctx->b_frame_strategy == 2) {
1320 b_frames = estimate_best_b_count(s);
1322 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1328 for (i = b_frames - 1; i >= 0; i--) {
1329 int type = s->input_picture[i]->f->pict_type;
1330 if (type && type != AV_PICTURE_TYPE_B)
1333 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1334 b_frames == s->max_b_frames) {
1335 av_log(s->avctx, AV_LOG_ERROR,
1336 "warning, too many b frames in a row\n");
1339 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1340 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1341 s->gop_size > s->picture_in_gop_number) {
1342 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1344 if (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)
1346 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1350 if ((s->avctx->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1351 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1354 s->reordered_input_picture[0] = s->input_picture[b_frames];
1355 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1356 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1357 s->reordered_input_picture[0]->f->coded_picture_number =
1358 s->coded_picture_number++;
1359 for (i = 0; i < b_frames; i++) {
1360 s->reordered_input_picture[i + 1] = s->input_picture[i];
1361 s->reordered_input_picture[i + 1]->f->pict_type =
1363 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1364 s->coded_picture_number++;
1369 if (s->reordered_input_picture[0]) {
1370 s->reordered_input_picture[0]->reference =
1371 s->reordered_input_picture[0]->f->pict_type !=
1372 AV_PICTURE_TYPE_B ? 3 : 0;
1374 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1375 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1378 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1379 // input is a shared pix, so we can't modifiy it -> alloc a new
1380 // one & ensure that the shared one is reuseable
1383 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1386 pic = &s->picture[i];
1388 pic->reference = s->reordered_input_picture[0]->reference;
1389 if (ff_alloc_picture(s, pic, 0) < 0) {
1393 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1397 /* mark us unused / free shared pic */
1398 av_frame_unref(s->reordered_input_picture[0]->f);
1399 s->reordered_input_picture[0]->shared = 0;
1401 s->current_picture_ptr = pic;
1403 // input is not a shared pix -> reuse buffer for current_pix
1404 s->current_picture_ptr = s->reordered_input_picture[0];
1405 for (i = 0; i < 4; i++) {
1406 s->new_picture.f->data[i] += INPLACE_OFFSET;
1409 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1410 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1411 s->current_picture_ptr)) < 0)
1414 s->picture_number = s->new_picture.f->display_picture_number;
1416 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1421 static void frame_end(MpegEncContext *s)
1425 if (s->unrestricted_mv &&
1426 s->current_picture.reference &&
1428 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1429 int hshift = desc->log2_chroma_w;
1430 int vshift = desc->log2_chroma_h;
1431 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1432 s->h_edge_pos, s->v_edge_pos,
1433 EDGE_WIDTH, EDGE_WIDTH,
1434 EDGE_TOP | EDGE_BOTTOM);
1435 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1436 s->h_edge_pos >> hshift,
1437 s->v_edge_pos >> vshift,
1438 EDGE_WIDTH >> hshift,
1439 EDGE_WIDTH >> vshift,
1440 EDGE_TOP | EDGE_BOTTOM);
1441 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1442 s->h_edge_pos >> hshift,
1443 s->v_edge_pos >> vshift,
1444 EDGE_WIDTH >> hshift,
1445 EDGE_WIDTH >> vshift,
1446 EDGE_TOP | EDGE_BOTTOM);
1451 s->last_pict_type = s->pict_type;
1452 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1453 if (s->pict_type!= AV_PICTURE_TYPE_B)
1454 s->last_non_b_pict_type = s->pict_type;
1457 /* release non-reference frames */
1458 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1459 if (!s->picture[i].reference)
1460 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1464 s->avctx->coded_frame = s->current_picture_ptr->f;
1468 static void update_noise_reduction(MpegEncContext *s)
1472 for (intra = 0; intra < 2; intra++) {
1473 if (s->dct_count[intra] > (1 << 16)) {
1474 for (i = 0; i < 64; i++) {
1475 s->dct_error_sum[intra][i] >>= 1;
1477 s->dct_count[intra] >>= 1;
1480 for (i = 0; i < 64; i++) {
1481 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1482 s->dct_count[intra] +
1483 s->dct_error_sum[intra][i] / 2) /
1484 (s->dct_error_sum[intra][i] + 1);
1489 static int frame_start(MpegEncContext *s)
1493 /* mark & release old frames */
1494 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1495 s->last_picture_ptr != s->next_picture_ptr &&
1496 s->last_picture_ptr->f->buf[0]) {
1497 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1500 s->current_picture_ptr->f->pict_type = s->pict_type;
1501 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1503 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1504 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1505 s->current_picture_ptr)) < 0)
1508 if (s->pict_type != AV_PICTURE_TYPE_B) {
1509 s->last_picture_ptr = s->next_picture_ptr;
1511 s->next_picture_ptr = s->current_picture_ptr;
1514 if (s->last_picture_ptr) {
1515 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1516 if (s->last_picture_ptr->f->buf[0] &&
1517 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1518 s->last_picture_ptr)) < 0)
1521 if (s->next_picture_ptr) {
1522 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1523 if (s->next_picture_ptr->f->buf[0] &&
1524 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1525 s->next_picture_ptr)) < 0)
1529 if (s->picture_structure!= PICT_FRAME) {
1531 for (i = 0; i < 4; i++) {
1532 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1533 s->current_picture.f->data[i] +=
1534 s->current_picture.f->linesize[i];
1536 s->current_picture.f->linesize[i] *= 2;
1537 s->last_picture.f->linesize[i] *= 2;
1538 s->next_picture.f->linesize[i] *= 2;
1542 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1543 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1544 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1545 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1546 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1547 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1549 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1550 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1553 if (s->dct_error_sum) {
1554 assert(s->avctx->noise_reduction && s->encoding);
1555 update_noise_reduction(s);
1561 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1562 const AVFrame *pic_arg, int *got_packet)
1564 MpegEncContext *s = avctx->priv_data;
1565 int i, stuffing_count, ret;
1566 int context_count = s->slice_context_count;
1568 s->picture_in_gop_number++;
1570 if (load_input_picture(s, pic_arg) < 0)
1573 if (select_input_picture(s) < 0) {
1578 if (s->new_picture.f->data[0]) {
1580 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1583 s->mb_info_ptr = av_packet_new_side_data(pkt,
1584 AV_PKT_DATA_H263_MB_INFO,
1585 s->mb_width*s->mb_height*12);
1586 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1589 for (i = 0; i < context_count; i++) {
1590 int start_y = s->thread_context[i]->start_mb_y;
1591 int end_y = s->thread_context[i]-> end_mb_y;
1592 int h = s->mb_height;
1593 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1594 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1596 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1599 s->pict_type = s->new_picture.f->pict_type;
1601 ret = frame_start(s);
1605 if (encode_picture(s, s->picture_number) < 0)
1608 avctx->header_bits = s->header_bits;
1609 avctx->mv_bits = s->mv_bits;
1610 avctx->misc_bits = s->misc_bits;
1611 avctx->i_tex_bits = s->i_tex_bits;
1612 avctx->p_tex_bits = s->p_tex_bits;
1613 avctx->i_count = s->i_count;
1614 // FIXME f/b_count in avctx
1615 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1616 avctx->skip_count = s->skip_count;
1620 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1621 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1623 if (avctx->rc_buffer_size) {
1624 RateControlContext *rcc = &s->rc_context;
1625 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1627 if (put_bits_count(&s->pb) > max_size &&
1628 s->lambda < s->lmax) {
1629 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1630 (s->qscale + 1) / s->qscale);
1631 if (s->adaptive_quant) {
1633 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1634 s->lambda_table[i] =
1635 FFMAX(s->lambda_table[i] + 1,
1636 s->lambda_table[i] * (s->qscale + 1) /
1639 s->mb_skipped = 0; // done in frame_start()
1640 // done in encode_picture() so we must undo it
1641 if (s->pict_type == AV_PICTURE_TYPE_P) {
1642 if (s->flipflop_rounding ||
1643 s->codec_id == AV_CODEC_ID_H263P ||
1644 s->codec_id == AV_CODEC_ID_MPEG4)
1645 s->no_rounding ^= 1;
1647 if (s->pict_type != AV_PICTURE_TYPE_B) {
1648 s->time_base = s->last_time_base;
1649 s->last_non_b_time = s->time - s->pp_time;
1651 for (i = 0; i < context_count; i++) {
1652 PutBitContext *pb = &s->thread_context[i]->pb;
1653 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1658 assert(s->avctx->rc_max_rate);
1661 if (s->avctx->flags & CODEC_FLAG_PASS1)
1662 ff_write_pass1_stats(s);
1664 for (i = 0; i < 4; i++) {
1665 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1666 avctx->error[i] += s->current_picture_ptr->f->error[i];
1669 if (s->avctx->flags & CODEC_FLAG_PASS1)
1670 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1671 avctx->i_tex_bits + avctx->p_tex_bits ==
1672 put_bits_count(&s->pb));
1673 flush_put_bits(&s->pb);
1674 s->frame_bits = put_bits_count(&s->pb);
1676 stuffing_count = ff_vbv_update(s, s->frame_bits);
1677 if (stuffing_count) {
1678 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1679 stuffing_count + 50) {
1680 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1684 switch (s->codec_id) {
1685 case AV_CODEC_ID_MPEG1VIDEO:
1686 case AV_CODEC_ID_MPEG2VIDEO:
1687 while (stuffing_count--) {
1688 put_bits(&s->pb, 8, 0);
1691 case AV_CODEC_ID_MPEG4:
1692 put_bits(&s->pb, 16, 0);
1693 put_bits(&s->pb, 16, 0x1C3);
1694 stuffing_count -= 4;
1695 while (stuffing_count--) {
1696 put_bits(&s->pb, 8, 0xFF);
1700 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1702 flush_put_bits(&s->pb);
1703 s->frame_bits = put_bits_count(&s->pb);
1706 /* update mpeg1/2 vbv_delay for CBR */
1707 if (s->avctx->rc_max_rate &&
1708 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1709 s->out_format == FMT_MPEG1 &&
1710 90000LL * (avctx->rc_buffer_size - 1) <=
1711 s->avctx->rc_max_rate * 0xFFFFLL) {
1712 int vbv_delay, min_delay;
1713 double inbits = s->avctx->rc_max_rate *
1714 av_q2d(s->avctx->time_base);
1715 int minbits = s->frame_bits - 8 *
1716 (s->vbv_delay_ptr - s->pb.buf - 1);
1717 double bits = s->rc_context.buffer_index + minbits - inbits;
1720 av_log(s->avctx, AV_LOG_ERROR,
1721 "Internal error, negative bits\n");
1723 assert(s->repeat_first_field == 0);
1725 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1726 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1727 s->avctx->rc_max_rate;
1729 vbv_delay = FFMAX(vbv_delay, min_delay);
1731 assert(vbv_delay < 0xFFFF);
1733 s->vbv_delay_ptr[0] &= 0xF8;
1734 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1735 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1736 s->vbv_delay_ptr[2] &= 0x07;
1737 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1738 avctx->vbv_delay = vbv_delay * 300;
1740 s->total_bits += s->frame_bits;
1741 avctx->frame_bits = s->frame_bits;
1743 pkt->pts = s->current_picture.f->pts;
1744 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1745 if (!s->current_picture.f->coded_picture_number)
1746 pkt->dts = pkt->pts - s->dts_delta;
1748 pkt->dts = s->reordered_pts;
1749 s->reordered_pts = pkt->pts;
1751 pkt->dts = pkt->pts;
1752 if (s->current_picture.f->key_frame)
1753 pkt->flags |= AV_PKT_FLAG_KEY;
1755 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1759 assert((s->frame_bits & 7) == 0);
1761 pkt->size = s->frame_bits / 8;
1762 *got_packet = !!pkt->size;
1766 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1767 int n, int threshold)
1769 static const char tab[64] = {
1770 3, 2, 2, 1, 1, 1, 1, 1,
1771 1, 1, 1, 1, 1, 1, 1, 1,
1772 1, 1, 1, 1, 1, 1, 1, 1,
1773 0, 0, 0, 0, 0, 0, 0, 0,
1774 0, 0, 0, 0, 0, 0, 0, 0,
1775 0, 0, 0, 0, 0, 0, 0, 0,
1776 0, 0, 0, 0, 0, 0, 0, 0,
1777 0, 0, 0, 0, 0, 0, 0, 0
1782 int16_t *block = s->block[n];
1783 const int last_index = s->block_last_index[n];
1786 if (threshold < 0) {
1788 threshold = -threshold;
1792 /* Are all we could set to zero already zero? */
1793 if (last_index <= skip_dc - 1)
1796 for (i = 0; i <= last_index; i++) {
1797 const int j = s->intra_scantable.permutated[i];
1798 const int level = FFABS(block[j]);
1800 if (skip_dc && i == 0)
1804 } else if (level > 1) {
1810 if (score >= threshold)
1812 for (i = skip_dc; i <= last_index; i++) {
1813 const int j = s->intra_scantable.permutated[i];
1817 s->block_last_index[n] = 0;
1819 s->block_last_index[n] = -1;
1822 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1826 const int maxlevel = s->max_qcoeff;
1827 const int minlevel = s->min_qcoeff;
1831 i = 1; // skip clipping of intra dc
1835 for (; i <= last_index; i++) {
1836 const int j = s->intra_scantable.permutated[i];
1837 int level = block[j];
1839 if (level > maxlevel) {
1842 } else if (level < minlevel) {
1850 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1851 av_log(s->avctx, AV_LOG_INFO,
1852 "warning, clipping %d dct coefficients to %d..%d\n",
1853 overflow, minlevel, maxlevel);
1856 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1860 for (y = 0; y < 8; y++) {
1861 for (x = 0; x < 8; x++) {
1867 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1868 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1869 int v = ptr[x2 + y2 * stride];
1875 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1880 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1881 int motion_x, int motion_y,
1882 int mb_block_height,
1885 int16_t weight[8][64];
1886 int16_t orig[8][64];
1887 const int mb_x = s->mb_x;
1888 const int mb_y = s->mb_y;
1891 int dct_offset = s->linesize * 8; // default for progressive frames
1892 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1893 ptrdiff_t wrap_y, wrap_c;
1895 for (i = 0; i < mb_block_count; i++)
1896 skip_dct[i] = s->skipdct;
1898 if (s->adaptive_quant) {
1899 const int last_qp = s->qscale;
1900 const int mb_xy = mb_x + mb_y * s->mb_stride;
1902 s->lambda = s->lambda_table[mb_xy];
1905 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1906 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1907 s->dquant = s->qscale - last_qp;
1909 if (s->out_format == FMT_H263) {
1910 s->dquant = av_clip(s->dquant, -2, 2);
1912 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1914 if (s->pict_type == AV_PICTURE_TYPE_B) {
1915 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1918 if (s->mv_type == MV_TYPE_8X8)
1924 ff_set_qscale(s, last_qp + s->dquant);
1925 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1926 ff_set_qscale(s, s->qscale + s->dquant);
1928 wrap_y = s->linesize;
1929 wrap_c = s->uvlinesize;
1930 ptr_y = s->new_picture.f->data[0] +
1931 (mb_y * 16 * wrap_y) + mb_x * 16;
1932 ptr_cb = s->new_picture.f->data[1] +
1933 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1934 ptr_cr = s->new_picture.f->data[2] +
1935 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1937 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1938 uint8_t *ebuf = s->edge_emu_buffer + 32;
1939 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1941 16, 16, mb_x * 16, mb_y * 16,
1942 s->width, s->height);
1944 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1946 8, mb_block_height, mb_x * 8, mb_y * 8,
1947 s->width >> 1, s->height >> 1);
1948 ptr_cb = ebuf + 18 * wrap_y;
1949 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1951 8, mb_block_height, mb_x * 8, mb_y * 8,
1952 s->width >> 1, s->height >> 1);
1953 ptr_cr = ebuf + 18 * wrap_y + 8;
1957 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
1958 int progressive_score, interlaced_score;
1960 s->interlaced_dct = 0;
1961 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1962 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1963 NULL, wrap_y, 8) - 400;
1965 if (progressive_score > 0) {
1966 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1967 NULL, wrap_y * 2, 8) +
1968 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1969 NULL, wrap_y * 2, 8);
1970 if (progressive_score > interlaced_score) {
1971 s->interlaced_dct = 1;
1973 dct_offset = wrap_y;
1975 if (s->chroma_format == CHROMA_422)
1981 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1982 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1983 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
1984 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
1986 if (s->avctx->flags & CODEC_FLAG_GRAY) {
1990 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1991 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1992 if (!s->chroma_y_shift) { /* 422 */
1993 s->pdsp.get_pixels(s->block[6],
1994 ptr_cb + (dct_offset >> 1), wrap_c);
1995 s->pdsp.get_pixels(s->block[7],
1996 ptr_cr + (dct_offset >> 1), wrap_c);
2000 op_pixels_func (*op_pix)[4];
2001 qpel_mc_func (*op_qpix)[16];
2002 uint8_t *dest_y, *dest_cb, *dest_cr;
2004 dest_y = s->dest[0];
2005 dest_cb = s->dest[1];
2006 dest_cr = s->dest[2];
2008 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2009 op_pix = s->hdsp.put_pixels_tab;
2010 op_qpix = s->qdsp.put_qpel_pixels_tab;
2012 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2013 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2016 if (s->mv_dir & MV_DIR_FORWARD) {
2017 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2018 s->last_picture.f->data,
2020 op_pix = s->hdsp.avg_pixels_tab;
2021 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2023 if (s->mv_dir & MV_DIR_BACKWARD) {
2024 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2025 s->next_picture.f->data,
2029 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
2030 int progressive_score, interlaced_score;
2032 s->interlaced_dct = 0;
2033 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2034 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2038 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2039 progressive_score -= 400;
2041 if (progressive_score > 0) {
2042 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2044 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2048 if (progressive_score > interlaced_score) {
2049 s->interlaced_dct = 1;
2051 dct_offset = wrap_y;
2053 if (s->chroma_format == CHROMA_422)
2059 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2060 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2061 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2062 dest_y + dct_offset, wrap_y);
2063 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2064 dest_y + dct_offset + 8, wrap_y);
2066 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2070 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2071 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2072 if (!s->chroma_y_shift) { /* 422 */
2073 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2074 dest_cb + (dct_offset >> 1), wrap_c);
2075 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2076 dest_cr + (dct_offset >> 1), wrap_c);
2079 /* pre quantization */
2080 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2081 2 * s->qscale * s->qscale) {
2083 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2085 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2087 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2088 wrap_y, 8) < 20 * s->qscale)
2090 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2091 wrap_y, 8) < 20 * s->qscale)
2093 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2095 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2097 if (!s->chroma_y_shift) { /* 422 */
2098 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2099 dest_cb + (dct_offset >> 1),
2100 wrap_c, 8) < 20 * s->qscale)
2102 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2103 dest_cr + (dct_offset >> 1),
2104 wrap_c, 8) < 20 * s->qscale)
2110 if (s->quantizer_noise_shaping) {
2112 get_visual_weight(weight[0], ptr_y , wrap_y);
2114 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2116 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2118 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2120 get_visual_weight(weight[4], ptr_cb , wrap_c);
2122 get_visual_weight(weight[5], ptr_cr , wrap_c);
2123 if (!s->chroma_y_shift) { /* 422 */
2125 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2128 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2131 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2134 /* DCT & quantize */
2135 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2137 for (i = 0; i < mb_block_count; i++) {
2140 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2141 // FIXME we could decide to change to quantizer instead of
2143 // JS: I don't think that would be a good idea it could lower
2144 // quality instead of improve it. Just INTRADC clipping
2145 // deserves changes in quantizer
2147 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2149 s->block_last_index[i] = -1;
2151 if (s->quantizer_noise_shaping) {
2152 for (i = 0; i < mb_block_count; i++) {
2154 s->block_last_index[i] =
2155 dct_quantize_refine(s, s->block[i], weight[i],
2156 orig[i], i, s->qscale);
2161 if (s->luma_elim_threshold && !s->mb_intra)
2162 for (i = 0; i < 4; i++)
2163 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2164 if (s->chroma_elim_threshold && !s->mb_intra)
2165 for (i = 4; i < mb_block_count; i++)
2166 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2168 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2169 for (i = 0; i < mb_block_count; i++) {
2170 if (s->block_last_index[i] == -1)
2171 s->coded_score[i] = INT_MAX / 256;
2176 if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2177 s->block_last_index[4] =
2178 s->block_last_index[5] = 0;
2180 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2183 // non c quantize code returns incorrect block_last_index FIXME
2184 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2185 for (i = 0; i < mb_block_count; i++) {
2187 if (s->block_last_index[i] > 0) {
2188 for (j = 63; j > 0; j--) {
2189 if (s->block[i][s->intra_scantable.permutated[j]])
2192 s->block_last_index[i] = j;
2197 /* huffman encode */
2198 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2199 case AV_CODEC_ID_MPEG1VIDEO:
2200 case AV_CODEC_ID_MPEG2VIDEO:
2201 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2202 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2204 case AV_CODEC_ID_MPEG4:
2205 if (CONFIG_MPEG4_ENCODER)
2206 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2208 case AV_CODEC_ID_MSMPEG4V2:
2209 case AV_CODEC_ID_MSMPEG4V3:
2210 case AV_CODEC_ID_WMV1:
2211 if (CONFIG_MSMPEG4_ENCODER)
2212 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2214 case AV_CODEC_ID_WMV2:
2215 if (CONFIG_WMV2_ENCODER)
2216 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2218 case AV_CODEC_ID_H261:
2219 if (CONFIG_H261_ENCODER)
2220 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2222 case AV_CODEC_ID_H263:
2223 case AV_CODEC_ID_H263P:
2224 case AV_CODEC_ID_FLV1:
2225 case AV_CODEC_ID_RV10:
2226 case AV_CODEC_ID_RV20:
2227 if (CONFIG_H263_ENCODER)
2228 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2230 case AV_CODEC_ID_MJPEG:
2231 if (CONFIG_MJPEG_ENCODER)
2232 ff_mjpeg_encode_mb(s, s->block);
2239 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2241 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2242 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2245 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2248 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2251 d->mb_skip_run= s->mb_skip_run;
2253 d->last_dc[i] = s->last_dc[i];
2256 d->mv_bits= s->mv_bits;
2257 d->i_tex_bits= s->i_tex_bits;
2258 d->p_tex_bits= s->p_tex_bits;
2259 d->i_count= s->i_count;
2260 d->f_count= s->f_count;
2261 d->b_count= s->b_count;
2262 d->skip_count= s->skip_count;
2263 d->misc_bits= s->misc_bits;
2267 d->qscale= s->qscale;
2268 d->dquant= s->dquant;
2270 d->esc3_level_length= s->esc3_level_length;
2273 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2276 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2277 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2280 d->mb_skip_run= s->mb_skip_run;
2282 d->last_dc[i] = s->last_dc[i];
2285 d->mv_bits= s->mv_bits;
2286 d->i_tex_bits= s->i_tex_bits;
2287 d->p_tex_bits= s->p_tex_bits;
2288 d->i_count= s->i_count;
2289 d->f_count= s->f_count;
2290 d->b_count= s->b_count;
2291 d->skip_count= s->skip_count;
2292 d->misc_bits= s->misc_bits;
2294 d->mb_intra= s->mb_intra;
2295 d->mb_skipped= s->mb_skipped;
2296 d->mv_type= s->mv_type;
2297 d->mv_dir= s->mv_dir;
2299 if(s->data_partitioning){
2301 d->tex_pb= s->tex_pb;
2305 d->block_last_index[i]= s->block_last_index[i];
2306 d->interlaced_dct= s->interlaced_dct;
2307 d->qscale= s->qscale;
2309 d->esc3_level_length= s->esc3_level_length;
2312 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2313 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2314 int *dmin, int *next_block, int motion_x, int motion_y)
2317 uint8_t *dest_backup[3];
2319 copy_context_before_encode(s, backup, type);
2321 s->block= s->blocks[*next_block];
2322 s->pb= pb[*next_block];
2323 if(s->data_partitioning){
2324 s->pb2 = pb2 [*next_block];
2325 s->tex_pb= tex_pb[*next_block];
2329 memcpy(dest_backup, s->dest, sizeof(s->dest));
2330 s->dest[0] = s->rd_scratchpad;
2331 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2332 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2333 assert(s->linesize >= 32); //FIXME
2336 encode_mb(s, motion_x, motion_y);
2338 score= put_bits_count(&s->pb);
2339 if(s->data_partitioning){
2340 score+= put_bits_count(&s->pb2);
2341 score+= put_bits_count(&s->tex_pb);
2344 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2345 ff_mpv_decode_mb(s, s->block);
2347 score *= s->lambda2;
2348 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2352 memcpy(s->dest, dest_backup, sizeof(s->dest));
2359 copy_context_after_encode(best, s, type);
2363 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2364 uint32_t *sq = ff_square_tab + 256;
2369 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2370 else if(w==8 && h==8)
2371 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2375 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2384 static int sse_mb(MpegEncContext *s){
2388 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2389 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2392 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2393 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) +
2394 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) +
2395 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);
2397 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) +
2398 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) +
2399 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);
2402 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)
2403 +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)
2404 +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);
2407 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2408 MpegEncContext *s= *(void**)arg;
2412 s->me.dia_size= s->avctx->pre_dia_size;
2413 s->first_slice_line=1;
2414 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2415 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2416 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2418 s->first_slice_line=0;
2426 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2427 MpegEncContext *s= *(void**)arg;
2429 s->me.dia_size= s->avctx->dia_size;
2430 s->first_slice_line=1;
2431 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2432 s->mb_x=0; //for block init below
2433 ff_init_block_index(s);
2434 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2435 s->block_index[0]+=2;
2436 s->block_index[1]+=2;
2437 s->block_index[2]+=2;
2438 s->block_index[3]+=2;
2440 /* compute motion vector & mb_type and store in context */
2441 if(s->pict_type==AV_PICTURE_TYPE_B)
2442 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2444 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2446 s->first_slice_line=0;
2451 static int mb_var_thread(AVCodecContext *c, void *arg){
2452 MpegEncContext *s= *(void**)arg;
2455 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2456 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2459 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2461 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2463 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2464 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2466 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2467 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2468 s->me.mb_var_sum_temp += varc;
2474 static void write_slice_end(MpegEncContext *s){
2475 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2476 if(s->partitioned_frame){
2477 ff_mpeg4_merge_partitions(s);
2480 ff_mpeg4_stuffing(&s->pb);
2481 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2482 ff_mjpeg_encode_stuffing(&s->pb);
2485 avpriv_align_put_bits(&s->pb);
2486 flush_put_bits(&s->pb);
2488 if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
2489 s->misc_bits+= get_bits_diff(s);
2492 static void write_mb_info(MpegEncContext *s)
2494 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2495 int offset = put_bits_count(&s->pb);
2496 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2497 int gobn = s->mb_y / s->gob_index;
2499 if (CONFIG_H263_ENCODER)
2500 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2501 bytestream_put_le32(&ptr, offset);
2502 bytestream_put_byte(&ptr, s->qscale);
2503 bytestream_put_byte(&ptr, gobn);
2504 bytestream_put_le16(&ptr, mba);
2505 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2506 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2507 /* 4MV not implemented */
2508 bytestream_put_byte(&ptr, 0); /* hmv2 */
2509 bytestream_put_byte(&ptr, 0); /* vmv2 */
2512 static void update_mb_info(MpegEncContext *s, int startcode)
2516 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2517 s->mb_info_size += 12;
2518 s->prev_mb_info = s->last_mb_info;
2521 s->prev_mb_info = put_bits_count(&s->pb)/8;
2522 /* This might have incremented mb_info_size above, and we return without
2523 * actually writing any info into that slot yet. But in that case,
2524 * this will be called again at the start of the after writing the
2525 * start code, actually writing the mb info. */
2529 s->last_mb_info = put_bits_count(&s->pb)/8;
2530 if (!s->mb_info_size)
2531 s->mb_info_size += 12;
2535 static int encode_thread(AVCodecContext *c, void *arg){
2536 MpegEncContext *s= *(void**)arg;
2537 int mb_x, mb_y, pdif = 0;
2538 int chr_h= 16>>s->chroma_y_shift;
2540 MpegEncContext best_s = { 0 }, backup_s;
2541 uint8_t bit_buf[2][MAX_MB_BYTES];
2542 uint8_t bit_buf2[2][MAX_MB_BYTES];
2543 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2544 PutBitContext pb[2], pb2[2], tex_pb[2];
2547 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2548 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2549 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2552 s->last_bits= put_bits_count(&s->pb);
2563 /* init last dc values */
2564 /* note: quant matrix value (8) is implied here */
2565 s->last_dc[i] = 128 << s->intra_dc_precision;
2567 s->current_picture.f->error[i] = 0;
2570 memset(s->last_mv, 0, sizeof(s->last_mv));
2574 switch(s->codec_id){
2575 case AV_CODEC_ID_H263:
2576 case AV_CODEC_ID_H263P:
2577 case AV_CODEC_ID_FLV1:
2578 if (CONFIG_H263_ENCODER)
2579 s->gob_index = H263_GOB_HEIGHT(s->height);
2581 case AV_CODEC_ID_MPEG4:
2582 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2583 ff_mpeg4_init_partitions(s);
2589 s->first_slice_line = 1;
2590 s->ptr_lastgob = s->pb.buf;
2591 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2595 ff_set_qscale(s, s->qscale);
2596 ff_init_block_index(s);
2598 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2599 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2600 int mb_type= s->mb_type[xy];
2605 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2606 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2609 if(s->data_partitioning){
2610 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2611 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2612 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2618 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2619 ff_update_block_index(s);
2621 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2622 ff_h261_reorder_mb_index(s);
2623 xy= s->mb_y*s->mb_stride + s->mb_x;
2624 mb_type= s->mb_type[xy];
2627 /* write gob / video packet header */
2629 int current_packet_size, is_gob_start;
2631 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2633 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2635 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2637 switch(s->codec_id){
2638 case AV_CODEC_ID_H263:
2639 case AV_CODEC_ID_H263P:
2640 if(!s->h263_slice_structured)
2641 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2643 case AV_CODEC_ID_MPEG2VIDEO:
2644 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2645 case AV_CODEC_ID_MPEG1VIDEO:
2646 if(s->mb_skip_run) is_gob_start=0;
2651 if(s->start_mb_y != mb_y || mb_x!=0){
2654 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2655 ff_mpeg4_init_partitions(s);
2659 assert((put_bits_count(&s->pb)&7) == 0);
2660 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2662 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2663 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2664 int d = 100 / s->error_rate;
2666 current_packet_size=0;
2667 s->pb.buf_ptr= s->ptr_lastgob;
2668 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2672 if (s->avctx->rtp_callback){
2673 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2674 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2676 update_mb_info(s, 1);
2678 switch(s->codec_id){
2679 case AV_CODEC_ID_MPEG4:
2680 if (CONFIG_MPEG4_ENCODER) {
2681 ff_mpeg4_encode_video_packet_header(s);
2682 ff_mpeg4_clean_buffers(s);
2685 case AV_CODEC_ID_MPEG1VIDEO:
2686 case AV_CODEC_ID_MPEG2VIDEO:
2687 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2688 ff_mpeg1_encode_slice_header(s);
2689 ff_mpeg1_clean_buffers(s);
2692 case AV_CODEC_ID_H263:
2693 case AV_CODEC_ID_H263P:
2694 if (CONFIG_H263_ENCODER)
2695 ff_h263_encode_gob_header(s, mb_y);
2699 if (s->avctx->flags & CODEC_FLAG_PASS1) {
2700 int bits= put_bits_count(&s->pb);
2701 s->misc_bits+= bits - s->last_bits;
2705 s->ptr_lastgob += current_packet_size;
2706 s->first_slice_line=1;
2707 s->resync_mb_x=mb_x;
2708 s->resync_mb_y=mb_y;
2712 if( (s->resync_mb_x == s->mb_x)
2713 && s->resync_mb_y+1 == s->mb_y){
2714 s->first_slice_line=0;
2718 s->dquant=0; //only for QP_RD
2720 update_mb_info(s, 0);
2722 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
2724 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2726 copy_context_before_encode(&backup_s, s, -1);
2728 best_s.data_partitioning= s->data_partitioning;
2729 best_s.partitioned_frame= s->partitioned_frame;
2730 if(s->data_partitioning){
2731 backup_s.pb2= s->pb2;
2732 backup_s.tex_pb= s->tex_pb;
2735 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2736 s->mv_dir = MV_DIR_FORWARD;
2737 s->mv_type = MV_TYPE_16X16;
2739 s->mv[0][0][0] = s->p_mv_table[xy][0];
2740 s->mv[0][0][1] = s->p_mv_table[xy][1];
2741 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2742 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2744 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2745 s->mv_dir = MV_DIR_FORWARD;
2746 s->mv_type = MV_TYPE_FIELD;
2749 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2750 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2751 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2753 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2754 &dmin, &next_block, 0, 0);
2756 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2757 s->mv_dir = MV_DIR_FORWARD;
2758 s->mv_type = MV_TYPE_16X16;
2762 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2763 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2765 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2766 s->mv_dir = MV_DIR_FORWARD;
2767 s->mv_type = MV_TYPE_8X8;
2770 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2771 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2773 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2774 &dmin, &next_block, 0, 0);
2776 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2777 s->mv_dir = MV_DIR_FORWARD;
2778 s->mv_type = MV_TYPE_16X16;
2780 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2781 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2782 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2783 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2785 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2786 s->mv_dir = MV_DIR_BACKWARD;
2787 s->mv_type = MV_TYPE_16X16;
2789 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2790 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2791 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2792 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2794 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2795 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2796 s->mv_type = MV_TYPE_16X16;
2798 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2799 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2800 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2801 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2802 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2803 &dmin, &next_block, 0, 0);
2805 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2806 s->mv_dir = MV_DIR_FORWARD;
2807 s->mv_type = MV_TYPE_FIELD;
2810 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2811 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2812 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2814 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2815 &dmin, &next_block, 0, 0);
2817 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2818 s->mv_dir = MV_DIR_BACKWARD;
2819 s->mv_type = MV_TYPE_FIELD;
2822 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2823 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2824 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2826 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2827 &dmin, &next_block, 0, 0);
2829 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2830 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2831 s->mv_type = MV_TYPE_FIELD;
2833 for(dir=0; dir<2; dir++){
2835 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2836 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2837 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2840 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2841 &dmin, &next_block, 0, 0);
2843 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2845 s->mv_type = MV_TYPE_16X16;
2849 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2850 &dmin, &next_block, 0, 0);
2851 if(s->h263_pred || s->h263_aic){
2853 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2855 ff_clean_intra_table_entries(s); //old mode?
2859 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2860 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2861 const int last_qp= backup_s.qscale;
2864 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2865 static const int dquant_tab[4]={-1,1,-2,2};
2867 assert(backup_s.dquant == 0);
2870 s->mv_dir= best_s.mv_dir;
2871 s->mv_type = MV_TYPE_16X16;
2872 s->mb_intra= best_s.mb_intra;
2873 s->mv[0][0][0] = best_s.mv[0][0][0];
2874 s->mv[0][0][1] = best_s.mv[0][0][1];
2875 s->mv[1][0][0] = best_s.mv[1][0][0];
2876 s->mv[1][0][1] = best_s.mv[1][0][1];
2878 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2879 for(; qpi<4; qpi++){
2880 int dquant= dquant_tab[qpi];
2881 qp= last_qp + dquant;
2882 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2884 backup_s.dquant= dquant;
2885 if(s->mb_intra && s->dc_val[0]){
2887 dc[i]= s->dc_val[0][ s->block_index[i] ];
2888 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2892 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2893 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2894 if(best_s.qscale != qp){
2895 if(s->mb_intra && s->dc_val[0]){
2897 s->dc_val[0][ s->block_index[i] ]= dc[i];
2898 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2905 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2906 int mx= s->b_direct_mv_table[xy][0];
2907 int my= s->b_direct_mv_table[xy][1];
2909 backup_s.dquant = 0;
2910 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2912 ff_mpeg4_set_direct_mv(s, mx, my);
2913 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2914 &dmin, &next_block, mx, my);
2916 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2917 backup_s.dquant = 0;
2918 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2920 ff_mpeg4_set_direct_mv(s, 0, 0);
2921 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2922 &dmin, &next_block, 0, 0);
2924 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2927 coded |= s->block_last_index[i];
2930 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2931 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2932 mx=my=0; //FIXME find the one we actually used
2933 ff_mpeg4_set_direct_mv(s, mx, my);
2934 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2942 s->mv_dir= best_s.mv_dir;
2943 s->mv_type = best_s.mv_type;
2945 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2946 s->mv[0][0][1] = best_s.mv[0][0][1];
2947 s->mv[1][0][0] = best_s.mv[1][0][0];
2948 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2951 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2952 &dmin, &next_block, mx, my);
2957 s->current_picture.qscale_table[xy] = best_s.qscale;
2959 copy_context_after_encode(s, &best_s, -1);
2961 pb_bits_count= put_bits_count(&s->pb);
2962 flush_put_bits(&s->pb);
2963 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2966 if(s->data_partitioning){
2967 pb2_bits_count= put_bits_count(&s->pb2);
2968 flush_put_bits(&s->pb2);
2969 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2970 s->pb2= backup_s.pb2;
2972 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2973 flush_put_bits(&s->tex_pb);
2974 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2975 s->tex_pb= backup_s.tex_pb;
2977 s->last_bits= put_bits_count(&s->pb);
2979 if (CONFIG_H263_ENCODER &&
2980 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2981 ff_h263_update_motion_val(s);
2983 if(next_block==0){ //FIXME 16 vs linesize16
2984 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2985 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2986 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2989 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2990 ff_mpv_decode_mb(s, s->block);
2992 int motion_x = 0, motion_y = 0;
2993 s->mv_type=MV_TYPE_16X16;
2994 // only one MB-Type possible
2997 case CANDIDATE_MB_TYPE_INTRA:
3000 motion_x= s->mv[0][0][0] = 0;
3001 motion_y= s->mv[0][0][1] = 0;
3003 case CANDIDATE_MB_TYPE_INTER:
3004 s->mv_dir = MV_DIR_FORWARD;
3006 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3007 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3009 case CANDIDATE_MB_TYPE_INTER_I:
3010 s->mv_dir = MV_DIR_FORWARD;
3011 s->mv_type = MV_TYPE_FIELD;
3014 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3015 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3016 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3019 case CANDIDATE_MB_TYPE_INTER4V:
3020 s->mv_dir = MV_DIR_FORWARD;
3021 s->mv_type = MV_TYPE_8X8;
3024 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3025 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3028 case CANDIDATE_MB_TYPE_DIRECT:
3029 if (CONFIG_MPEG4_ENCODER) {
3030 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3032 motion_x=s->b_direct_mv_table[xy][0];
3033 motion_y=s->b_direct_mv_table[xy][1];
3034 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3037 case CANDIDATE_MB_TYPE_DIRECT0:
3038 if (CONFIG_MPEG4_ENCODER) {
3039 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3041 ff_mpeg4_set_direct_mv(s, 0, 0);
3044 case CANDIDATE_MB_TYPE_BIDIR:
3045 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3047 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3048 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3049 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3050 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3052 case CANDIDATE_MB_TYPE_BACKWARD:
3053 s->mv_dir = MV_DIR_BACKWARD;
3055 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3056 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3058 case CANDIDATE_MB_TYPE_FORWARD:
3059 s->mv_dir = MV_DIR_FORWARD;
3061 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3062 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3064 case CANDIDATE_MB_TYPE_FORWARD_I:
3065 s->mv_dir = MV_DIR_FORWARD;
3066 s->mv_type = MV_TYPE_FIELD;
3069 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3070 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3071 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3074 case CANDIDATE_MB_TYPE_BACKWARD_I:
3075 s->mv_dir = MV_DIR_BACKWARD;
3076 s->mv_type = MV_TYPE_FIELD;
3079 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3080 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3081 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3084 case CANDIDATE_MB_TYPE_BIDIR_I:
3085 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3086 s->mv_type = MV_TYPE_FIELD;
3088 for(dir=0; dir<2; dir++){
3090 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3091 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3092 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3097 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3100 encode_mb(s, motion_x, motion_y);
3102 // RAL: Update last macroblock type
3103 s->last_mv_dir = s->mv_dir;
3105 if (CONFIG_H263_ENCODER &&
3106 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3107 ff_h263_update_motion_val(s);
3109 ff_mpv_decode_mb(s, s->block);
3112 /* clean the MV table in IPS frames for direct mode in B frames */
3113 if(s->mb_intra /* && I,P,S_TYPE */){
3114 s->p_mv_table[xy][0]=0;
3115 s->p_mv_table[xy][1]=0;
3118 if (s->avctx->flags & CODEC_FLAG_PSNR) {
3122 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3123 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3125 s->current_picture.f->error[0] += sse(
3126 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3127 s->dest[0], w, h, s->linesize);
3128 s->current_picture.f->error[1] += sse(
3129 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3130 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3131 s->current_picture.f->error[2] += sse(
3132 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3133 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3136 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3137 ff_h263_loop_filter(s);
3139 ff_dlog(s->avctx, "MB %d %d bits\n",
3140 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3144 //not beautiful here but we must write it before flushing so it has to be here
3145 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3146 ff_msmpeg4_encode_ext_header(s);
3150 /* Send the last GOB if RTP */
3151 if (s->avctx->rtp_callback) {
3152 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3153 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3154 /* Call the RTP callback to send the last GOB */
3156 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3162 #define MERGE(field) dst->field += src->field; src->field=0
3163 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3164 MERGE(me.scene_change_score);
3165 MERGE(me.mc_mb_var_sum_temp);
3166 MERGE(me.mb_var_sum_temp);
3169 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3172 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3173 MERGE(dct_count[1]);
3182 MERGE(er.error_count);
3183 MERGE(padding_bug_score);
3184 MERGE(current_picture.f->error[0]);
3185 MERGE(current_picture.f->error[1]);
3186 MERGE(current_picture.f->error[2]);
3188 if(dst->avctx->noise_reduction){
3189 for(i=0; i<64; i++){
3190 MERGE(dct_error_sum[0][i]);
3191 MERGE(dct_error_sum[1][i]);
3195 assert(put_bits_count(&src->pb) % 8 ==0);
3196 assert(put_bits_count(&dst->pb) % 8 ==0);
3197 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3198 flush_put_bits(&dst->pb);
3201 static int estimate_qp(MpegEncContext *s, int dry_run){
3202 if (s->next_lambda){
3203 s->current_picture_ptr->f->quality =
3204 s->current_picture.f->quality = s->next_lambda;
3205 if(!dry_run) s->next_lambda= 0;
3206 } else if (!s->fixed_qscale) {
3207 s->current_picture_ptr->f->quality =
3208 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3209 if (s->current_picture.f->quality < 0)
3213 if(s->adaptive_quant){
3214 switch(s->codec_id){
3215 case AV_CODEC_ID_MPEG4:
3216 if (CONFIG_MPEG4_ENCODER)
3217 ff_clean_mpeg4_qscales(s);
3219 case AV_CODEC_ID_H263:
3220 case AV_CODEC_ID_H263P:
3221 case AV_CODEC_ID_FLV1:
3222 if (CONFIG_H263_ENCODER)
3223 ff_clean_h263_qscales(s);
3226 ff_init_qscale_tab(s);
3229 s->lambda= s->lambda_table[0];
3232 s->lambda = s->current_picture.f->quality;
3237 /* must be called before writing the header */
3238 static void set_frame_distances(MpegEncContext * s){
3239 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3240 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3242 if(s->pict_type==AV_PICTURE_TYPE_B){
3243 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3244 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3246 s->pp_time= s->time - s->last_non_b_time;
3247 s->last_non_b_time= s->time;
3248 assert(s->picture_number==0 || s->pp_time > 0);
3252 static int encode_picture(MpegEncContext *s, int picture_number)
3256 int context_count = s->slice_context_count;
3258 s->picture_number = picture_number;
3260 /* Reset the average MB variance */
3261 s->me.mb_var_sum_temp =
3262 s->me.mc_mb_var_sum_temp = 0;
3264 /* we need to initialize some time vars before we can encode b-frames */
3265 // RAL: Condition added for MPEG1VIDEO
3266 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3267 set_frame_distances(s);
3268 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3269 ff_set_mpeg4_time(s);
3271 s->me.scene_change_score=0;
3273 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3275 if(s->pict_type==AV_PICTURE_TYPE_I){
3276 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3277 else s->no_rounding=0;
3278 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3279 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3280 s->no_rounding ^= 1;
3283 if (s->avctx->flags & CODEC_FLAG_PASS2) {
3284 if (estimate_qp(s,1) < 0)
3286 ff_get_2pass_fcode(s);
3287 } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
3288 if(s->pict_type==AV_PICTURE_TYPE_B)
3289 s->lambda= s->last_lambda_for[s->pict_type];
3291 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3295 s->mb_intra=0; //for the rate distortion & bit compare functions
3296 for(i=1; i<context_count; i++){
3297 ret = ff_update_duplicate_context(s->thread_context[i], s);
3305 /* Estimate motion for every MB */
3306 if(s->pict_type != AV_PICTURE_TYPE_I){
3307 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3308 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3309 if (s->pict_type != AV_PICTURE_TYPE_B) {
3310 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3311 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3315 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3316 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3318 for(i=0; i<s->mb_stride*s->mb_height; i++)
3319 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3321 if(!s->fixed_qscale){
3322 /* finding spatial complexity for I-frame rate control */
3323 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3326 for(i=1; i<context_count; i++){
3327 merge_context_after_me(s, s->thread_context[i]);
3329 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3330 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3333 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3334 s->pict_type= AV_PICTURE_TYPE_I;
3335 for(i=0; i<s->mb_stride*s->mb_height; i++)
3336 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3337 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3338 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3342 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3343 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3345 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3347 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3348 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3349 s->f_code= FFMAX3(s->f_code, a, b);
3352 ff_fix_long_p_mvs(s);
3353 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3354 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3358 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3359 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3364 if(s->pict_type==AV_PICTURE_TYPE_B){
3367 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3368 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3369 s->f_code = FFMAX(a, b);
3371 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3372 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3373 s->b_code = FFMAX(a, b);
3375 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3376 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3377 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3378 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3379 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3381 for(dir=0; dir<2; dir++){
3384 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3385 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3386 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3387 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3395 if (estimate_qp(s, 0) < 0)
3398 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3399 s->pict_type == AV_PICTURE_TYPE_I &&
3400 !(s->avctx->flags & CODEC_FLAG_QSCALE))
3401 s->qscale= 3; //reduce clipping problems
3403 if (s->out_format == FMT_MJPEG) {
3404 /* for mjpeg, we do include qscale in the matrix */
3406 int j = s->idsp.idct_permutation[i];
3408 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3410 s->y_dc_scale_table=
3411 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3412 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3413 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3414 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3418 //FIXME var duplication
3419 s->current_picture_ptr->f->key_frame =
3420 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3421 s->current_picture_ptr->f->pict_type =
3422 s->current_picture.f->pict_type = s->pict_type;
3424 if (s->current_picture.f->key_frame)
3425 s->picture_in_gop_number=0;
3427 s->last_bits= put_bits_count(&s->pb);
3428 switch(s->out_format) {
3430 if (CONFIG_MJPEG_ENCODER)
3431 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3435 if (CONFIG_H261_ENCODER)
3436 ff_h261_encode_picture_header(s, picture_number);
3439 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3440 ff_wmv2_encode_picture_header(s, picture_number);
3441 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3442 ff_msmpeg4_encode_picture_header(s, picture_number);
3443 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3444 ff_mpeg4_encode_picture_header(s, picture_number);
3445 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3446 ret = ff_rv10_encode_picture_header(s, picture_number);
3450 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3451 ff_rv20_encode_picture_header(s, picture_number);
3452 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3453 ff_flv_encode_picture_header(s, picture_number);
3454 else if (CONFIG_H263_ENCODER)
3455 ff_h263_encode_picture_header(s, picture_number);
3458 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3459 ff_mpeg1_encode_picture_header(s, picture_number);
3464 bits= put_bits_count(&s->pb);
3465 s->header_bits= bits - s->last_bits;
3467 for(i=1; i<context_count; i++){
3468 update_duplicate_context_after_me(s->thread_context[i], s);
3470 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3471 for(i=1; i<context_count; i++){
3472 merge_context_after_encode(s, s->thread_context[i]);
3478 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3479 const int intra= s->mb_intra;
3482 s->dct_count[intra]++;
3484 for(i=0; i<64; i++){
3485 int level= block[i];
3489 s->dct_error_sum[intra][i] += level;
3490 level -= s->dct_offset[intra][i];
3491 if(level<0) level=0;
3493 s->dct_error_sum[intra][i] -= level;
3494 level += s->dct_offset[intra][i];
3495 if(level>0) level=0;
3502 static int dct_quantize_trellis_c(MpegEncContext *s,
3503 int16_t *block, int n,
3504 int qscale, int *overflow){
3506 const uint8_t *scantable= s->intra_scantable.scantable;
3507 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3509 unsigned int threshold1, threshold2;
3521 int coeff_count[64];
3522 int qmul, qadd, start_i, last_non_zero, i, dc;
3523 const int esc_length= s->ac_esc_length;
3525 uint8_t * last_length;
3526 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3528 s->fdsp.fdct(block);
3530 if(s->dct_error_sum)
3531 s->denoise_dct(s, block);
3533 qadd= ((qscale-1)|1)*8;
3544 /* For AIC we skip quant/dequant of INTRADC */
3549 /* note: block[0] is assumed to be positive */
3550 block[0] = (block[0] + (q >> 1)) / q;
3553 qmat = s->q_intra_matrix[qscale];
3554 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3555 bias= 1<<(QMAT_SHIFT-1);
3556 length = s->intra_ac_vlc_length;
3557 last_length= s->intra_ac_vlc_last_length;
3561 qmat = s->q_inter_matrix[qscale];
3562 length = s->inter_ac_vlc_length;
3563 last_length= s->inter_ac_vlc_last_length;
3567 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3568 threshold2= (threshold1<<1);
3570 for(i=63; i>=start_i; i--) {
3571 const int j = scantable[i];
3572 int level = block[j] * qmat[j];
3574 if(((unsigned)(level+threshold1))>threshold2){
3580 for(i=start_i; i<=last_non_zero; i++) {
3581 const int j = scantable[i];
3582 int level = block[j] * qmat[j];
3584 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3585 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3586 if(((unsigned)(level+threshold1))>threshold2){
3588 level= (bias + level)>>QMAT_SHIFT;
3590 coeff[1][i]= level-1;
3591 // coeff[2][k]= level-2;
3593 level= (bias - level)>>QMAT_SHIFT;
3594 coeff[0][i]= -level;
3595 coeff[1][i]= -level+1;
3596 // coeff[2][k]= -level+2;
3598 coeff_count[i]= FFMIN(level, 2);
3599 assert(coeff_count[i]);
3602 coeff[0][i]= (level>>31)|1;
3607 *overflow= s->max_qcoeff < max; //overflow might have happened
3609 if(last_non_zero < start_i){
3610 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3611 return last_non_zero;
3614 score_tab[start_i]= 0;
3615 survivor[0]= start_i;
3618 for(i=start_i; i<=last_non_zero; i++){
3619 int level_index, j, zero_distortion;
3620 int dct_coeff= FFABS(block[ scantable[i] ]);
3621 int best_score=256*256*256*120;
3623 if (s->fdsp.fdct == ff_fdct_ifast)
3624 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3625 zero_distortion= dct_coeff*dct_coeff;
3627 for(level_index=0; level_index < coeff_count[i]; level_index++){
3629 int level= coeff[level_index][i];
3630 const int alevel= FFABS(level);
3635 if(s->out_format == FMT_H263){
3636 unquant_coeff= alevel*qmul + qadd;
3638 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3640 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3641 unquant_coeff = (unquant_coeff - 1) | 1;
3643 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3644 unquant_coeff = (unquant_coeff - 1) | 1;
3649 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3651 if((level&(~127)) == 0){
3652 for(j=survivor_count-1; j>=0; j--){
3653 int run= i - survivor[j];
3654 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3655 score += score_tab[i-run];
3657 if(score < best_score){
3660 level_tab[i+1]= level-64;
3664 if(s->out_format == FMT_H263){
3665 for(j=survivor_count-1; j>=0; j--){
3666 int run= i - survivor[j];
3667 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3668 score += score_tab[i-run];
3669 if(score < last_score){
3672 last_level= level-64;
3678 distortion += esc_length*lambda;
3679 for(j=survivor_count-1; j>=0; j--){
3680 int run= i - survivor[j];
3681 int score= distortion + score_tab[i-run];
3683 if(score < best_score){
3686 level_tab[i+1]= level-64;
3690 if(s->out_format == FMT_H263){
3691 for(j=survivor_count-1; j>=0; j--){
3692 int run= i - survivor[j];
3693 int score= distortion + score_tab[i-run];
3694 if(score < last_score){
3697 last_level= level-64;
3705 score_tab[i+1]= best_score;
3707 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3708 if(last_non_zero <= 27){
3709 for(; survivor_count; survivor_count--){
3710 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3714 for(; survivor_count; survivor_count--){
3715 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3720 survivor[ survivor_count++ ]= i+1;
3723 if(s->out_format != FMT_H263){
3724 last_score= 256*256*256*120;
3725 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3726 int score= score_tab[i];
3727 if(i) score += lambda*2; //FIXME exacter?
3729 if(score < last_score){
3732 last_level= level_tab[i];
3733 last_run= run_tab[i];
3738 s->coded_score[n] = last_score;
3740 dc= FFABS(block[0]);
3741 last_non_zero= last_i - 1;
3742 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3744 if(last_non_zero < start_i)
3745 return last_non_zero;
3747 if(last_non_zero == 0 && start_i == 0){
3749 int best_score= dc * dc;
3751 for(i=0; i<coeff_count[0]; i++){
3752 int level= coeff[i][0];
3753 int alevel= FFABS(level);
3754 int unquant_coeff, score, distortion;
3756 if(s->out_format == FMT_H263){
3757 unquant_coeff= (alevel*qmul + qadd)>>3;
3759 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3760 unquant_coeff = (unquant_coeff - 1) | 1;
3762 unquant_coeff = (unquant_coeff + 4) >> 3;
3763 unquant_coeff<<= 3 + 3;
3765 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3767 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3768 else score= distortion + esc_length*lambda;
3770 if(score < best_score){
3772 best_level= level - 64;
3775 block[0]= best_level;
3776 s->coded_score[n] = best_score - dc*dc;
3777 if(best_level == 0) return -1;
3778 else return last_non_zero;
3784 block[ perm_scantable[last_non_zero] ]= last_level;
3787 for(; i>start_i; i -= run_tab[i] + 1){
3788 block[ perm_scantable[i-1] ]= level_tab[i];
3791 return last_non_zero;
3794 //#define REFINE_STATS 1
3795 static int16_t basis[64][64];
3797 static void build_basis(uint8_t *perm){
3804 double s= 0.25*(1<<BASIS_SHIFT);
3806 int perm_index= perm[index];
3807 if(i==0) s*= sqrt(0.5);
3808 if(j==0) s*= sqrt(0.5);
3809 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)));
3816 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3817 int16_t *block, int16_t *weight, int16_t *orig,
3820 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3821 const uint8_t *scantable= s->intra_scantable.scantable;
3822 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3823 // unsigned int threshold1, threshold2;
3828 int qmul, qadd, start_i, last_non_zero, i, dc;
3830 uint8_t * last_length;
3832 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3835 static int after_last=0;
3836 static int to_zero=0;
3837 static int from_zero=0;
3840 static int messed_sign=0;
3843 if(basis[0][0] == 0)
3844 build_basis(s->idsp.idct_permutation);
3855 /* For AIC we skip quant/dequant of INTRADC */
3859 q <<= RECON_SHIFT-3;
3860 /* note: block[0] is assumed to be positive */
3862 // block[0] = (block[0] + (q >> 1)) / q;
3864 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3865 // bias= 1<<(QMAT_SHIFT-1);
3866 length = s->intra_ac_vlc_length;
3867 last_length= s->intra_ac_vlc_last_length;
3871 length = s->inter_ac_vlc_length;
3872 last_length= s->inter_ac_vlc_last_length;
3874 last_non_zero = s->block_last_index[n];
3879 dc += (1<<(RECON_SHIFT-1));
3880 for(i=0; i<64; i++){
3881 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3884 STOP_TIMER("memset rem[]")}
3887 for(i=0; i<64; i++){
3892 w= FFABS(weight[i]) + qns*one;
3893 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3896 // w=weight[i] = (63*qns + (w/2)) / w;
3902 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3908 for(i=start_i; i<=last_non_zero; i++){
3909 int j= perm_scantable[i];
3910 const int level= block[j];
3914 if(level<0) coeff= qmul*level - qadd;
3915 else coeff= qmul*level + qadd;
3916 run_tab[rle_index++]=run;
3919 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3925 if(last_non_zero>0){
3926 STOP_TIMER("init rem[]")
3933 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3936 int run2, best_unquant_change=0, analyze_gradient;
3940 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3942 if(analyze_gradient){
3946 for(i=0; i<64; i++){
3949 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3952 STOP_TIMER("rem*w*w")}
3962 const int level= block[0];
3963 int change, old_coeff;
3965 assert(s->mb_intra);
3969 for(change=-1; change<=1; change+=2){
3970 int new_level= level + change;
3971 int score, new_coeff;
3973 new_coeff= q*new_level;
3974 if(new_coeff >= 2048 || new_coeff < 0)
3977 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3978 new_coeff - old_coeff);
3979 if(score<best_score){
3982 best_change= change;
3983 best_unquant_change= new_coeff - old_coeff;
3990 run2= run_tab[rle_index++];
3994 for(i=start_i; i<64; i++){
3995 int j= perm_scantable[i];
3996 const int level= block[j];
3997 int change, old_coeff;
3999 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4003 if(level<0) old_coeff= qmul*level - qadd;
4004 else old_coeff= qmul*level + qadd;
4005 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4009 assert(run2>=0 || i >= last_non_zero );
4012 for(change=-1; change<=1; change+=2){
4013 int new_level= level + change;
4014 int score, new_coeff, unquant_change;
4017 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4021 if(new_level<0) new_coeff= qmul*new_level - qadd;
4022 else new_coeff= qmul*new_level + qadd;
4023 if(new_coeff >= 2048 || new_coeff <= -2048)
4025 //FIXME check for overflow
4028 if(level < 63 && level > -63){
4029 if(i < last_non_zero)
4030 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4031 - length[UNI_AC_ENC_INDEX(run, level+64)];
4033 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4034 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4037 assert(FFABS(new_level)==1);
4039 if(analyze_gradient){
4040 int g= d1[ scantable[i] ];
4041 if(g && (g^new_level) >= 0)
4045 if(i < last_non_zero){
4046 int next_i= i + run2 + 1;
4047 int next_level= block[ perm_scantable[next_i] ] + 64;
4049 if(next_level&(~127))
4052 if(next_i < last_non_zero)
4053 score += length[UNI_AC_ENC_INDEX(run, 65)]
4054 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4055 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4057 score += length[UNI_AC_ENC_INDEX(run, 65)]
4058 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4059 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4061 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4063 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4064 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4070 assert(FFABS(level)==1);
4072 if(i < last_non_zero){
4073 int next_i= i + run2 + 1;
4074 int next_level= block[ perm_scantable[next_i] ] + 64;
4076 if(next_level&(~127))
4079 if(next_i < last_non_zero)
4080 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4081 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4082 - length[UNI_AC_ENC_INDEX(run, 65)];
4084 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4085 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4086 - length[UNI_AC_ENC_INDEX(run, 65)];
4088 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4090 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4091 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4098 unquant_change= new_coeff - old_coeff;
4099 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4101 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4103 if(score<best_score){
4106 best_change= change;
4107 best_unquant_change= unquant_change;
4111 prev_level= level + 64;
4112 if(prev_level&(~127))
4121 STOP_TIMER("iterative step")}
4125 int j= perm_scantable[ best_coeff ];
4127 block[j] += best_change;
4129 if(best_coeff > last_non_zero){
4130 last_non_zero= best_coeff;
4138 if(block[j] - best_change){
4139 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4151 for(; last_non_zero>=start_i; last_non_zero--){
4152 if(block[perm_scantable[last_non_zero]])
4158 if(256*256*256*64 % count == 0){
4159 printf("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);
4164 for(i=start_i; i<=last_non_zero; i++){
4165 int j= perm_scantable[i];
4166 const int level= block[j];
4169 run_tab[rle_index++]=run;
4176 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4182 if(last_non_zero>0){
4183 STOP_TIMER("iterative search")
4188 return last_non_zero;
4191 int ff_dct_quantize_c(MpegEncContext *s,
4192 int16_t *block, int n,
4193 int qscale, int *overflow)
4195 int i, j, level, last_non_zero, q, start_i;
4197 const uint8_t *scantable= s->intra_scantable.scantable;
4200 unsigned int threshold1, threshold2;
4202 s->fdsp.fdct(block);
4204 if(s->dct_error_sum)
4205 s->denoise_dct(s, block);
4215 /* For AIC we skip quant/dequant of INTRADC */
4218 /* note: block[0] is assumed to be positive */
4219 block[0] = (block[0] + (q >> 1)) / q;
4222 qmat = s->q_intra_matrix[qscale];
4223 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4227 qmat = s->q_inter_matrix[qscale];
4228 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4230 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4231 threshold2= (threshold1<<1);
4232 for(i=63;i>=start_i;i--) {
4234 level = block[j] * qmat[j];
4236 if(((unsigned)(level+threshold1))>threshold2){
4243 for(i=start_i; i<=last_non_zero; i++) {
4245 level = block[j] * qmat[j];
4247 // if( bias+level >= (1<<QMAT_SHIFT)
4248 // || bias-level >= (1<<QMAT_SHIFT)){
4249 if(((unsigned)(level+threshold1))>threshold2){
4251 level= (bias + level)>>QMAT_SHIFT;
4254 level= (bias - level)>>QMAT_SHIFT;
4262 *overflow= s->max_qcoeff < max; //overflow might have happened
4264 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4265 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4266 ff_block_permute(block, s->idsp.idct_permutation,
4267 scantable, last_non_zero);
4269 return last_non_zero;
4272 #define OFFSET(x) offsetof(MpegEncContext, x)
4273 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4274 static const AVOption h263_options[] = {
4275 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4276 { "structured_slices","Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
4277 { "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 },
4282 static const AVClass h263_class = {
4283 .class_name = "H.263 encoder",
4284 .item_name = av_default_item_name,
4285 .option = h263_options,
4286 .version = LIBAVUTIL_VERSION_INT,
4289 AVCodec ff_h263_encoder = {
4291 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4292 .type = AVMEDIA_TYPE_VIDEO,
4293 .id = AV_CODEC_ID_H263,
4294 .priv_data_size = sizeof(MpegEncContext),
4295 .init = ff_mpv_encode_init,
4296 .encode2 = ff_mpv_encode_picture,
4297 .close = ff_mpv_encode_end,
4298 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4299 .priv_class = &h263_class,
4302 static const AVOption h263p_options[] = {
4303 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4304 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4305 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4306 { "structured_slices", "Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
4310 static const AVClass h263p_class = {
4311 .class_name = "H.263p encoder",
4312 .item_name = av_default_item_name,
4313 .option = h263p_options,
4314 .version = LIBAVUTIL_VERSION_INT,
4317 AVCodec ff_h263p_encoder = {
4319 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4320 .type = AVMEDIA_TYPE_VIDEO,
4321 .id = AV_CODEC_ID_H263P,
4322 .priv_data_size = sizeof(MpegEncContext),
4323 .init = ff_mpv_encode_init,
4324 .encode2 = ff_mpv_encode_picture,
4325 .close = ff_mpv_encode_end,
4326 .capabilities = CODEC_CAP_SLICE_THREADS,
4327 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4328 .priv_class = &h263p_class,
4331 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4333 AVCodec ff_msmpeg4v2_encoder = {
4334 .name = "msmpeg4v2",
4335 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4336 .type = AVMEDIA_TYPE_VIDEO,
4337 .id = AV_CODEC_ID_MSMPEG4V2,
4338 .priv_data_size = sizeof(MpegEncContext),
4339 .init = ff_mpv_encode_init,
4340 .encode2 = ff_mpv_encode_picture,
4341 .close = ff_mpv_encode_end,
4342 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4343 .priv_class = &msmpeg4v2_class,
4346 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4348 AVCodec ff_msmpeg4v3_encoder = {
4350 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4351 .type = AVMEDIA_TYPE_VIDEO,
4352 .id = AV_CODEC_ID_MSMPEG4V3,
4353 .priv_data_size = sizeof(MpegEncContext),
4354 .init = ff_mpv_encode_init,
4355 .encode2 = ff_mpv_encode_picture,
4356 .close = ff_mpv_encode_end,
4357 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4358 .priv_class = &msmpeg4v3_class,
4361 FF_MPV_GENERIC_CLASS(wmv1)
4363 AVCodec ff_wmv1_encoder = {
4365 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4366 .type = AVMEDIA_TYPE_VIDEO,
4367 .id = AV_CODEC_ID_WMV1,
4368 .priv_data_size = sizeof(MpegEncContext),
4369 .init = ff_mpv_encode_init,
4370 .encode2 = ff_mpv_encode_picture,
4371 .close = ff_mpv_encode_end,
4372 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4373 .priv_class = &wmv1_class,