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"
61 #define QUANT_BIAS_SHIFT 8
63 #define QMAT_SHIFT_MMX 16
66 static int encode_picture(MpegEncContext *s, int picture_number);
67 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
68 static int sse_mb(MpegEncContext *s);
69 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
70 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
72 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
73 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
75 const AVOption ff_mpv_generic_options[] = {
80 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
81 uint16_t (*qmat16)[2][64],
82 const uint16_t *quant_matrix,
83 int bias, int qmin, int qmax, int intra)
85 FDCTDSPContext *fdsp = &s->fdsp;
89 for (qscale = qmin; qscale <= qmax; qscale++) {
91 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
93 fdsp->fdct == ff_faandct ||
94 #endif /* CONFIG_FAANDCT */
95 fdsp->fdct == ff_jpeg_fdct_islow_10) {
96 for (i = 0; i < 64; i++) {
97 const int j = s->idsp.idct_permutation[i];
98 int64_t den = (int64_t) qscale * quant_matrix[j];
99 /* 16 <= qscale * quant_matrix[i] <= 7905
100 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
101 * 19952 <= x <= 249205026
102 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
103 * 3444240 >= (1 << 36) / (x) >= 275 */
105 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
107 } else if (fdsp->fdct == ff_fdct_ifast) {
108 for (i = 0; i < 64; i++) {
109 const int j = s->idsp.idct_permutation[i];
110 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
111 /* 16 <= qscale * quant_matrix[i] <= 7905
112 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
113 * 19952 <= x <= 249205026
114 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
115 * 3444240 >= (1 << 36) / (x) >= 275 */
117 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
120 for (i = 0; i < 64; i++) {
121 const int j = s->idsp.idct_permutation[i];
122 int64_t den = (int64_t) qscale * quant_matrix[j];
123 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
124 * Assume x = qscale * quant_matrix[i]
126 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
127 * so 32768 >= (1 << 19) / (x) >= 67 */
128 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
129 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
130 // (qscale * quant_matrix[i]);
131 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
133 if (qmat16[qscale][0][i] == 0 ||
134 qmat16[qscale][0][i] == 128 * 256)
135 qmat16[qscale][0][i] = 128 * 256 - 1;
136 qmat16[qscale][1][i] =
137 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
138 qmat16[qscale][0][i]);
142 for (i = intra; i < 64; i++) {
144 if (fdsp->fdct == ff_fdct_ifast) {
145 max = (8191LL * ff_aanscales[i]) >> 14;
147 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
153 av_log(NULL, AV_LOG_INFO,
154 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
159 static inline void update_qscale(MpegEncContext *s)
161 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
162 (FF_LAMBDA_SHIFT + 7);
163 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
165 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
169 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
175 for (i = 0; i < 64; i++) {
176 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
183 * init s->current_picture.qscale_table from s->lambda_table
185 void ff_init_qscale_tab(MpegEncContext *s)
187 int8_t * const qscale_table = s->current_picture.qscale_table;
190 for (i = 0; i < s->mb_num; i++) {
191 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
192 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
193 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
198 static void update_duplicate_context_after_me(MpegEncContext *dst,
201 #define COPY(a) dst->a= src->a
203 COPY(current_picture);
209 COPY(picture_in_gop_number);
210 COPY(gop_picture_number);
211 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
212 COPY(progressive_frame); // FIXME don't set in encode_header
213 COPY(partitioned_frame); // FIXME don't set in encode_header
218 * Set the given MpegEncContext to defaults for encoding.
219 * the changed fields will not depend upon the prior state of the MpegEncContext.
221 static void mpv_encode_defaults(MpegEncContext *s)
224 ff_mpv_common_defaults(s);
226 for (i = -16; i < 16; i++) {
227 default_fcode_tab[i + MAX_MV] = 1;
229 s->me.mv_penalty = default_mv_penalty;
230 s->fcode_tab = default_fcode_tab;
232 s->input_picture_number = 0;
233 s->picture_in_gop_number = 0;
236 /* init video encoder */
237 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
239 MpegEncContext *s = avctx->priv_data;
240 int i, ret, format_supported;
242 mpv_encode_defaults(s);
244 switch (avctx->codec_id) {
245 case AV_CODEC_ID_MPEG2VIDEO:
246 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
247 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
248 av_log(avctx, AV_LOG_ERROR,
249 "only YUV420 and YUV422 are supported\n");
253 case AV_CODEC_ID_MJPEG:
254 format_supported = 0;
255 /* JPEG color space */
256 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
257 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
258 (avctx->color_range == AVCOL_RANGE_JPEG &&
259 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
260 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
261 format_supported = 1;
262 /* MPEG color space */
263 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
264 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
265 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
266 format_supported = 1;
268 if (!format_supported) {
269 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
274 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
275 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
280 switch (avctx->pix_fmt) {
281 case AV_PIX_FMT_YUVJ422P:
282 case AV_PIX_FMT_YUV422P:
283 s->chroma_format = CHROMA_422;
285 case AV_PIX_FMT_YUVJ420P:
286 case AV_PIX_FMT_YUV420P:
288 s->chroma_format = CHROMA_420;
292 s->bit_rate = avctx->bit_rate;
293 s->width = avctx->width;
294 s->height = avctx->height;
295 if (avctx->gop_size > 600 &&
296 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
297 av_log(avctx, AV_LOG_ERROR,
298 "Warning keyframe interval too large! reducing it ...\n");
299 avctx->gop_size = 600;
301 s->gop_size = avctx->gop_size;
303 s->flags = avctx->flags;
304 s->flags2 = avctx->flags2;
305 if (avctx->max_b_frames > MAX_B_FRAMES) {
306 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
307 "is %d.\n", MAX_B_FRAMES);
309 s->max_b_frames = avctx->max_b_frames;
310 s->codec_id = avctx->codec->id;
311 s->strict_std_compliance = avctx->strict_std_compliance;
312 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
313 s->mpeg_quant = avctx->mpeg_quant;
314 s->rtp_mode = !!avctx->rtp_payload_size;
315 s->intra_dc_precision = avctx->intra_dc_precision;
316 s->user_specified_pts = AV_NOPTS_VALUE;
318 if (s->gop_size <= 1) {
325 s->me_method = avctx->me_method;
328 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
331 FF_DISABLE_DEPRECATION_WARNINGS
332 if (avctx->border_masking != 0.0)
333 s->border_masking = avctx->border_masking;
334 FF_ENABLE_DEPRECATION_WARNINGS
337 s->adaptive_quant = (s->avctx->lumi_masking ||
338 s->avctx->dark_masking ||
339 s->avctx->temporal_cplx_masking ||
340 s->avctx->spatial_cplx_masking ||
341 s->avctx->p_masking ||
343 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
346 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
348 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
349 av_log(avctx, AV_LOG_ERROR,
350 "a vbv buffer size is needed, "
351 "for encoding with a maximum bitrate\n");
355 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
356 av_log(avctx, AV_LOG_INFO,
357 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
360 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
361 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
365 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
366 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
370 if (avctx->rc_max_rate &&
371 avctx->rc_max_rate == avctx->bit_rate &&
372 avctx->rc_max_rate != avctx->rc_min_rate) {
373 av_log(avctx, AV_LOG_INFO,
374 "impossible bitrate constraints, this will fail\n");
377 if (avctx->rc_buffer_size &&
378 avctx->bit_rate * (int64_t)avctx->time_base.num >
379 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
380 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
384 if (!s->fixed_qscale &&
385 avctx->bit_rate * av_q2d(avctx->time_base) >
386 avctx->bit_rate_tolerance) {
387 av_log(avctx, AV_LOG_ERROR,
388 "bitrate tolerance too small for bitrate\n");
392 if (s->avctx->rc_max_rate &&
393 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
394 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
395 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
396 90000LL * (avctx->rc_buffer_size - 1) >
397 s->avctx->rc_max_rate * 0xFFFFLL) {
398 av_log(avctx, AV_LOG_INFO,
399 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
400 "specified vbv buffer is too large for the given bitrate!\n");
403 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
404 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
405 s->codec_id != AV_CODEC_ID_FLV1) {
406 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
410 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
411 av_log(avctx, AV_LOG_ERROR,
412 "OBMC is only supported with simple mb decision\n");
416 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
417 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
421 if (s->max_b_frames &&
422 s->codec_id != AV_CODEC_ID_MPEG4 &&
423 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
424 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
425 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
429 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
430 s->codec_id == AV_CODEC_ID_H263 ||
431 s->codec_id == AV_CODEC_ID_H263P) &&
432 (avctx->sample_aspect_ratio.num > 255 ||
433 avctx->sample_aspect_ratio.den > 255)) {
434 av_log(avctx, AV_LOG_ERROR,
435 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
436 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
440 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
441 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
442 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
446 // FIXME mpeg2 uses that too
447 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
448 av_log(avctx, AV_LOG_ERROR,
449 "mpeg2 style quantization not supported by codec\n");
453 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
454 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
458 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
459 s->avctx->mb_decision != FF_MB_DECISION_RD) {
460 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
464 if (s->avctx->scenechange_threshold < 1000000000 &&
465 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
466 av_log(avctx, AV_LOG_ERROR,
467 "closed gop with scene change detection are not supported yet, "
468 "set threshold to 1000000000\n");
472 if (s->flags & CODEC_FLAG_LOW_DELAY) {
473 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
474 av_log(avctx, AV_LOG_ERROR,
475 "low delay forcing is only available for mpeg2\n");
478 if (s->max_b_frames != 0) {
479 av_log(avctx, AV_LOG_ERROR,
480 "b frames cannot be used with low delay\n");
485 if (s->q_scale_type == 1) {
486 if (avctx->qmax > 12) {
487 av_log(avctx, AV_LOG_ERROR,
488 "non linear quant only supports qmax <= 12 currently\n");
493 if (s->avctx->thread_count > 1 &&
494 s->codec_id != AV_CODEC_ID_MPEG4 &&
495 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
496 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
497 (s->codec_id != AV_CODEC_ID_H263P)) {
498 av_log(avctx, AV_LOG_ERROR,
499 "multi threaded encoding not supported by codec\n");
503 if (s->avctx->thread_count < 1) {
504 av_log(avctx, AV_LOG_ERROR,
505 "automatic thread number detection not supported by codec,"
510 if (s->avctx->thread_count > 1)
513 if (!avctx->time_base.den || !avctx->time_base.num) {
514 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
518 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
519 av_log(avctx, AV_LOG_INFO,
520 "notice: b_frame_strategy only affects the first pass\n");
521 avctx->b_frame_strategy = 0;
524 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
526 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
527 avctx->time_base.den /= i;
528 avctx->time_base.num /= i;
532 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
533 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
534 // (a + x * 3 / 8) / x
535 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
536 s->inter_quant_bias = 0;
538 s->intra_quant_bias = 0;
540 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
543 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
544 s->intra_quant_bias = avctx->intra_quant_bias;
545 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
546 s->inter_quant_bias = avctx->inter_quant_bias;
548 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
549 s->avctx->time_base.den > (1 << 16) - 1) {
550 av_log(avctx, AV_LOG_ERROR,
551 "timebase %d/%d not supported by MPEG 4 standard, "
552 "the maximum admitted value for the timebase denominator "
553 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
557 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
559 switch (avctx->codec->id) {
560 case AV_CODEC_ID_MPEG1VIDEO:
561 s->out_format = FMT_MPEG1;
562 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
563 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
565 case AV_CODEC_ID_MPEG2VIDEO:
566 s->out_format = FMT_MPEG1;
567 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
568 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
571 case AV_CODEC_ID_MJPEG:
572 s->out_format = FMT_MJPEG;
573 s->intra_only = 1; /* force intra only for jpeg */
574 if (!CONFIG_MJPEG_ENCODER ||
575 ff_mjpeg_encode_init(s) < 0)
580 case AV_CODEC_ID_H261:
581 if (!CONFIG_H261_ENCODER)
583 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
584 av_log(avctx, AV_LOG_ERROR,
585 "The specified picture size of %dx%d is not valid for the "
586 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
587 s->width, s->height);
590 s->out_format = FMT_H261;
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 ff_msmpeg4_encode_init(s);
763 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
764 && s->out_format == FMT_MPEG1)
765 ff_mpeg1_encode_init(s);
768 for (i = 0; i < 64; i++) {
769 int j = s->idsp.idct_permutation[i];
770 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
772 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
773 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
774 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
776 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
779 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
780 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
782 if (s->avctx->intra_matrix)
783 s->intra_matrix[j] = s->avctx->intra_matrix[i];
784 if (s->avctx->inter_matrix)
785 s->inter_matrix[j] = s->avctx->inter_matrix[i];
788 /* precompute matrix */
789 /* for mjpeg, we do include qscale in the matrix */
790 if (s->out_format != FMT_MJPEG) {
791 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
792 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
794 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
795 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
799 if (ff_rate_control_init(s) < 0)
802 #if FF_API_ERROR_RATE
803 FF_DISABLE_DEPRECATION_WARNINGS
804 if (avctx->error_rate)
805 s->error_rate = avctx->error_rate;
806 FF_ENABLE_DEPRECATION_WARNINGS;
809 #if FF_API_NORMALIZE_AQP
810 FF_DISABLE_DEPRECATION_WARNINGS
811 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
812 s->mpv_flags |= FF_MPV_FLAG_NAQ;
813 FF_ENABLE_DEPRECATION_WARNINGS;
817 FF_DISABLE_DEPRECATION_WARNINGS
818 if (avctx->flags & CODEC_FLAG_MV0)
819 s->mpv_flags |= FF_MPV_FLAG_MV0;
820 FF_ENABLE_DEPRECATION_WARNINGS
824 FF_DISABLE_DEPRECATION_WARNINGS
825 if (avctx->rc_qsquish != 0.0)
826 s->rc_qsquish = avctx->rc_qsquish;
827 if (avctx->rc_qmod_amp != 0.0)
828 s->rc_qmod_amp = avctx->rc_qmod_amp;
829 if (avctx->rc_qmod_freq)
830 s->rc_qmod_freq = avctx->rc_qmod_freq;
831 if (avctx->rc_buffer_aggressivity != 1.0)
832 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
833 if (avctx->rc_initial_cplx != 0.0)
834 s->rc_initial_cplx = avctx->rc_initial_cplx;
836 s->lmin = avctx->lmin;
838 s->lmax = avctx->lmax;
842 s->rc_eq = av_strdup(avctx->rc_eq);
844 return AVERROR(ENOMEM);
846 FF_ENABLE_DEPRECATION_WARNINGS
849 if (avctx->b_frame_strategy == 2) {
850 for (i = 0; i < s->max_b_frames + 2; i++) {
851 s->tmp_frames[i] = av_frame_alloc();
852 if (!s->tmp_frames[i])
853 return AVERROR(ENOMEM);
855 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
856 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
857 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
859 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
867 ff_mpv_encode_end(avctx);
868 return AVERROR_UNKNOWN;
871 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
873 MpegEncContext *s = avctx->priv_data;
876 ff_rate_control_uninit(s);
878 ff_mpv_common_end(s);
879 if (CONFIG_MJPEG_ENCODER &&
880 s->out_format == FMT_MJPEG)
881 ff_mjpeg_encode_close(s);
883 av_freep(&avctx->extradata);
885 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
886 av_frame_free(&s->tmp_frames[i]);
888 ff_free_picture_tables(&s->new_picture);
889 ff_mpeg_unref_picture(s, &s->new_picture);
891 av_freep(&s->avctx->stats_out);
892 av_freep(&s->ac_stats);
894 av_freep(&s->q_intra_matrix);
895 av_freep(&s->q_inter_matrix);
896 av_freep(&s->q_intra_matrix16);
897 av_freep(&s->q_inter_matrix16);
898 av_freep(&s->input_picture);
899 av_freep(&s->reordered_input_picture);
900 av_freep(&s->dct_offset);
905 static int get_sae(uint8_t *src, int ref, int stride)
910 for (y = 0; y < 16; y++) {
911 for (x = 0; x < 16; x++) {
912 acc += FFABS(src[x + y * stride] - ref);
919 static int get_intra_count(MpegEncContext *s, uint8_t *src,
920 uint8_t *ref, int stride)
928 for (y = 0; y < h; y += 16) {
929 for (x = 0; x < w; x += 16) {
930 int offset = x + y * stride;
931 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
933 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
934 int sae = get_sae(src + offset, mean, stride);
936 acc += sae + 500 < sad;
943 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
947 int i, display_picture_number = 0, ret;
948 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
949 (s->low_delay ? 0 : 1);
954 display_picture_number = s->input_picture_number++;
956 if (pts != AV_NOPTS_VALUE) {
957 if (s->user_specified_pts != AV_NOPTS_VALUE) {
959 int64_t last = s->user_specified_pts;
962 av_log(s->avctx, AV_LOG_ERROR,
963 "Error, Invalid timestamp=%"PRId64", "
964 "last=%"PRId64"\n", pts, s->user_specified_pts);
968 if (!s->low_delay && display_picture_number == 1)
969 s->dts_delta = time - last;
971 s->user_specified_pts = pts;
973 if (s->user_specified_pts != AV_NOPTS_VALUE) {
974 s->user_specified_pts =
975 pts = s->user_specified_pts + 1;
976 av_log(s->avctx, AV_LOG_INFO,
977 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
980 pts = display_picture_number;
986 if (!pic_arg->buf[0] ||
987 pic_arg->linesize[0] != s->linesize ||
988 pic_arg->linesize[1] != s->uvlinesize ||
989 pic_arg->linesize[2] != s->uvlinesize)
992 av_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
993 pic_arg->linesize[1], s->linesize, s->uvlinesize);
995 i = ff_find_unused_picture(s, direct);
999 pic = &s->picture[i];
1003 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1005 if (ff_alloc_picture(s, pic, 1) < 0) {
1009 if (ff_alloc_picture(s, pic, 0) < 0) {
1013 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1014 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1015 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1018 int h_chroma_shift, v_chroma_shift;
1019 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1023 for (i = 0; i < 3; i++) {
1024 int src_stride = pic_arg->linesize[i];
1025 int dst_stride = i ? s->uvlinesize : s->linesize;
1026 int h_shift = i ? h_chroma_shift : 0;
1027 int v_shift = i ? v_chroma_shift : 0;
1028 int w = s->width >> h_shift;
1029 int h = s->height >> v_shift;
1030 uint8_t *src = pic_arg->data[i];
1031 uint8_t *dst = pic->f->data[i];
1033 if (!s->avctx->rc_buffer_size)
1034 dst += INPLACE_OFFSET;
1036 if (src_stride == dst_stride)
1037 memcpy(dst, src, src_stride * h);
1040 memcpy(dst, src, w);
1048 ret = av_frame_copy_props(pic->f, pic_arg);
1052 pic->f->display_picture_number = display_picture_number;
1053 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1056 /* shift buffer entries */
1057 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1058 s->input_picture[i - 1] = s->input_picture[i];
1060 s->input_picture[encoding_delay] = (Picture*) pic;
1065 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1069 int64_t score64 = 0;
1071 for (plane = 0; plane < 3; plane++) {
1072 const int stride = p->f->linesize[plane];
1073 const int bw = plane ? 1 : 2;
1074 for (y = 0; y < s->mb_height * bw; y++) {
1075 for (x = 0; x < s->mb_width * bw; x++) {
1076 int off = p->shared ? 0 : 16;
1077 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1078 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1079 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1081 switch (s->avctx->frame_skip_exp) {
1082 case 0: score = FFMAX(score, v); break;
1083 case 1: score += FFABS(v); break;
1084 case 2: score += v * v; break;
1085 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1086 case 4: score64 += v * v * (int64_t)(v * v); break;
1095 if (score64 < s->avctx->frame_skip_threshold)
1097 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1102 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1104 AVPacket pkt = { 0 };
1105 int ret, got_output;
1107 av_init_packet(&pkt);
1108 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1113 av_free_packet(&pkt);
1117 static int estimate_best_b_count(MpegEncContext *s)
1119 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1120 AVCodecContext *c = avcodec_alloc_context3(NULL);
1121 const int scale = s->avctx->brd_scale;
1122 int i, j, out_size, p_lambda, b_lambda, lambda2;
1123 int64_t best_rd = INT64_MAX;
1124 int best_b_count = -1;
1126 assert(scale >= 0 && scale <= 3);
1129 //s->next_picture_ptr->quality;
1130 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1131 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1132 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1133 if (!b_lambda) // FIXME we should do this somewhere else
1134 b_lambda = p_lambda;
1135 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1138 c->width = s->width >> scale;
1139 c->height = s->height >> scale;
1140 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1141 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1142 c->mb_decision = s->avctx->mb_decision;
1143 c->me_cmp = s->avctx->me_cmp;
1144 c->mb_cmp = s->avctx->mb_cmp;
1145 c->me_sub_cmp = s->avctx->me_sub_cmp;
1146 c->pix_fmt = AV_PIX_FMT_YUV420P;
1147 c->time_base = s->avctx->time_base;
1148 c->max_b_frames = s->max_b_frames;
1150 if (avcodec_open2(c, codec, NULL) < 0)
1153 for (i = 0; i < s->max_b_frames + 2; i++) {
1154 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1155 s->next_picture_ptr;
1157 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1158 pre_input = *pre_input_ptr;
1160 if (!pre_input.shared && i) {
1161 pre_input.f->data[0] += INPLACE_OFFSET;
1162 pre_input.f->data[1] += INPLACE_OFFSET;
1163 pre_input.f->data[2] += INPLACE_OFFSET;
1166 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1167 s->tmp_frames[i]->linesize[0],
1168 pre_input.f->data[0],
1169 pre_input.f->linesize[0],
1170 c->width, c->height);
1171 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1172 s->tmp_frames[i]->linesize[1],
1173 pre_input.f->data[1],
1174 pre_input.f->linesize[1],
1175 c->width >> 1, c->height >> 1);
1176 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1177 s->tmp_frames[i]->linesize[2],
1178 pre_input.f->data[2],
1179 pre_input.f->linesize[2],
1180 c->width >> 1, c->height >> 1);
1184 for (j = 0; j < s->max_b_frames + 1; j++) {
1187 if (!s->input_picture[j])
1190 c->error[0] = c->error[1] = c->error[2] = 0;
1192 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1193 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1195 out_size = encode_frame(c, s->tmp_frames[0]);
1197 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1199 for (i = 0; i < s->max_b_frames + 1; i++) {
1200 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1202 s->tmp_frames[i + 1]->pict_type = is_p ?
1203 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1204 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1206 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1208 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1211 /* get the delayed frames */
1213 out_size = encode_frame(c, NULL);
1214 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1217 rd += c->error[0] + c->error[1] + c->error[2];
1228 return best_b_count;
1231 static int select_input_picture(MpegEncContext *s)
1235 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1236 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1237 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1239 /* set next picture type & ordering */
1240 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1241 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1242 !s->next_picture_ptr || s->intra_only) {
1243 s->reordered_input_picture[0] = s->input_picture[0];
1244 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1245 s->reordered_input_picture[0]->f->coded_picture_number =
1246 s->coded_picture_number++;
1250 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1251 if (s->picture_in_gop_number < s->gop_size &&
1252 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1253 // FIXME check that te gop check above is +-1 correct
1254 av_frame_unref(s->input_picture[0]->f);
1257 ff_vbv_update(s, 0);
1263 if (s->flags & CODEC_FLAG_PASS2) {
1264 for (i = 0; i < s->max_b_frames + 1; i++) {
1265 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1267 if (pict_num >= s->rc_context.num_entries)
1269 if (!s->input_picture[i]) {
1270 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1274 s->input_picture[i]->f->pict_type =
1275 s->rc_context.entry[pict_num].new_pict_type;
1279 if (s->avctx->b_frame_strategy == 0) {
1280 b_frames = s->max_b_frames;
1281 while (b_frames && !s->input_picture[b_frames])
1283 } else if (s->avctx->b_frame_strategy == 1) {
1284 for (i = 1; i < s->max_b_frames + 1; i++) {
1285 if (s->input_picture[i] &&
1286 s->input_picture[i]->b_frame_score == 0) {
1287 s->input_picture[i]->b_frame_score =
1289 s->input_picture[i ]->f->data[0],
1290 s->input_picture[i - 1]->f->data[0],
1294 for (i = 0; i < s->max_b_frames + 1; i++) {
1295 if (!s->input_picture[i] ||
1296 s->input_picture[i]->b_frame_score - 1 >
1297 s->mb_num / s->avctx->b_sensitivity)
1301 b_frames = FFMAX(0, i - 1);
1304 for (i = 0; i < b_frames + 1; i++) {
1305 s->input_picture[i]->b_frame_score = 0;
1307 } else if (s->avctx->b_frame_strategy == 2) {
1308 b_frames = estimate_best_b_count(s);
1310 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1316 for (i = b_frames - 1; i >= 0; i--) {
1317 int type = s->input_picture[i]->f->pict_type;
1318 if (type && type != AV_PICTURE_TYPE_B)
1321 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1322 b_frames == s->max_b_frames) {
1323 av_log(s->avctx, AV_LOG_ERROR,
1324 "warning, too many b frames in a row\n");
1327 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1328 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1329 s->gop_size > s->picture_in_gop_number) {
1330 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1332 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1334 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1338 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1339 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1342 s->reordered_input_picture[0] = s->input_picture[b_frames];
1343 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1344 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1345 s->reordered_input_picture[0]->f->coded_picture_number =
1346 s->coded_picture_number++;
1347 for (i = 0; i < b_frames; i++) {
1348 s->reordered_input_picture[i + 1] = s->input_picture[i];
1349 s->reordered_input_picture[i + 1]->f->pict_type =
1351 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1352 s->coded_picture_number++;
1357 if (s->reordered_input_picture[0]) {
1358 s->reordered_input_picture[0]->reference =
1359 s->reordered_input_picture[0]->f->pict_type !=
1360 AV_PICTURE_TYPE_B ? 3 : 0;
1362 ff_mpeg_unref_picture(s, &s->new_picture);
1363 if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1366 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1367 // input is a shared pix, so we can't modifiy it -> alloc a new
1368 // one & ensure that the shared one is reuseable
1371 int i = ff_find_unused_picture(s, 0);
1374 pic = &s->picture[i];
1376 pic->reference = s->reordered_input_picture[0]->reference;
1377 if (ff_alloc_picture(s, pic, 0) < 0) {
1381 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1385 /* mark us unused / free shared pic */
1386 av_frame_unref(s->reordered_input_picture[0]->f);
1387 s->reordered_input_picture[0]->shared = 0;
1389 s->current_picture_ptr = pic;
1391 // input is not a shared pix -> reuse buffer for current_pix
1392 s->current_picture_ptr = s->reordered_input_picture[0];
1393 for (i = 0; i < 4; i++) {
1394 s->new_picture.f->data[i] += INPLACE_OFFSET;
1397 ff_mpeg_unref_picture(s, &s->current_picture);
1398 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1399 s->current_picture_ptr)) < 0)
1402 s->picture_number = s->new_picture.f->display_picture_number;
1404 ff_mpeg_unref_picture(s, &s->new_picture);
1409 static void frame_end(MpegEncContext *s)
1413 if (s->unrestricted_mv &&
1414 s->current_picture.reference &&
1416 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1417 int hshift = desc->log2_chroma_w;
1418 int vshift = desc->log2_chroma_h;
1419 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1420 s->h_edge_pos, s->v_edge_pos,
1421 EDGE_WIDTH, EDGE_WIDTH,
1422 EDGE_TOP | EDGE_BOTTOM);
1423 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1424 s->h_edge_pos >> hshift,
1425 s->v_edge_pos >> vshift,
1426 EDGE_WIDTH >> hshift,
1427 EDGE_WIDTH >> vshift,
1428 EDGE_TOP | EDGE_BOTTOM);
1429 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1430 s->h_edge_pos >> hshift,
1431 s->v_edge_pos >> vshift,
1432 EDGE_WIDTH >> hshift,
1433 EDGE_WIDTH >> vshift,
1434 EDGE_TOP | EDGE_BOTTOM);
1439 s->last_pict_type = s->pict_type;
1440 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1441 if (s->pict_type!= AV_PICTURE_TYPE_B)
1442 s->last_non_b_pict_type = s->pict_type;
1445 /* release non-reference frames */
1446 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1447 if (!s->picture[i].reference)
1448 ff_mpeg_unref_picture(s, &s->picture[i]);
1452 s->avctx->coded_frame = s->current_picture_ptr->f;
1456 static void update_noise_reduction(MpegEncContext *s)
1460 for (intra = 0; intra < 2; intra++) {
1461 if (s->dct_count[intra] > (1 << 16)) {
1462 for (i = 0; i < 64; i++) {
1463 s->dct_error_sum[intra][i] >>= 1;
1465 s->dct_count[intra] >>= 1;
1468 for (i = 0; i < 64; i++) {
1469 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1470 s->dct_count[intra] +
1471 s->dct_error_sum[intra][i] / 2) /
1472 (s->dct_error_sum[intra][i] + 1);
1477 static int frame_start(MpegEncContext *s)
1481 /* mark & release old frames */
1482 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1483 s->last_picture_ptr != s->next_picture_ptr &&
1484 s->last_picture_ptr->f->buf[0]) {
1485 ff_mpeg_unref_picture(s, s->last_picture_ptr);
1488 s->current_picture_ptr->f->pict_type = s->pict_type;
1489 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1491 ff_mpeg_unref_picture(s, &s->current_picture);
1492 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1493 s->current_picture_ptr)) < 0)
1496 if (s->pict_type != AV_PICTURE_TYPE_B) {
1497 s->last_picture_ptr = s->next_picture_ptr;
1499 s->next_picture_ptr = s->current_picture_ptr;
1502 if (s->last_picture_ptr) {
1503 ff_mpeg_unref_picture(s, &s->last_picture);
1504 if (s->last_picture_ptr->f->buf[0] &&
1505 (ret = ff_mpeg_ref_picture(s, &s->last_picture,
1506 s->last_picture_ptr)) < 0)
1509 if (s->next_picture_ptr) {
1510 ff_mpeg_unref_picture(s, &s->next_picture);
1511 if (s->next_picture_ptr->f->buf[0] &&
1512 (ret = ff_mpeg_ref_picture(s, &s->next_picture,
1513 s->next_picture_ptr)) < 0)
1517 if (s->picture_structure!= PICT_FRAME) {
1519 for (i = 0; i < 4; i++) {
1520 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1521 s->current_picture.f->data[i] +=
1522 s->current_picture.f->linesize[i];
1524 s->current_picture.f->linesize[i] *= 2;
1525 s->last_picture.f->linesize[i] *= 2;
1526 s->next_picture.f->linesize[i] *= 2;
1530 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1531 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1532 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1533 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1534 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1535 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1537 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1538 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1541 if (s->dct_error_sum) {
1542 assert(s->avctx->noise_reduction && s->encoding);
1543 update_noise_reduction(s);
1549 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1550 const AVFrame *pic_arg, int *got_packet)
1552 MpegEncContext *s = avctx->priv_data;
1553 int i, stuffing_count, ret;
1554 int context_count = s->slice_context_count;
1556 s->picture_in_gop_number++;
1558 if (load_input_picture(s, pic_arg) < 0)
1561 if (select_input_picture(s) < 0) {
1566 if (s->new_picture.f->data[0]) {
1568 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1571 s->mb_info_ptr = av_packet_new_side_data(pkt,
1572 AV_PKT_DATA_H263_MB_INFO,
1573 s->mb_width*s->mb_height*12);
1574 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1577 for (i = 0; i < context_count; i++) {
1578 int start_y = s->thread_context[i]->start_mb_y;
1579 int end_y = s->thread_context[i]-> end_mb_y;
1580 int h = s->mb_height;
1581 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1582 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1584 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1587 s->pict_type = s->new_picture.f->pict_type;
1589 ret = frame_start(s);
1593 if (encode_picture(s, s->picture_number) < 0)
1596 avctx->header_bits = s->header_bits;
1597 avctx->mv_bits = s->mv_bits;
1598 avctx->misc_bits = s->misc_bits;
1599 avctx->i_tex_bits = s->i_tex_bits;
1600 avctx->p_tex_bits = s->p_tex_bits;
1601 avctx->i_count = s->i_count;
1602 // FIXME f/b_count in avctx
1603 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1604 avctx->skip_count = s->skip_count;
1608 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1609 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1611 if (avctx->rc_buffer_size) {
1612 RateControlContext *rcc = &s->rc_context;
1613 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1615 if (put_bits_count(&s->pb) > max_size &&
1616 s->lambda < s->lmax) {
1617 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1618 (s->qscale + 1) / s->qscale);
1619 if (s->adaptive_quant) {
1621 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1622 s->lambda_table[i] =
1623 FFMAX(s->lambda_table[i] + 1,
1624 s->lambda_table[i] * (s->qscale + 1) /
1627 s->mb_skipped = 0; // done in frame_start()
1628 // done in encode_picture() so we must undo it
1629 if (s->pict_type == AV_PICTURE_TYPE_P) {
1630 if (s->flipflop_rounding ||
1631 s->codec_id == AV_CODEC_ID_H263P ||
1632 s->codec_id == AV_CODEC_ID_MPEG4)
1633 s->no_rounding ^= 1;
1635 if (s->pict_type != AV_PICTURE_TYPE_B) {
1636 s->time_base = s->last_time_base;
1637 s->last_non_b_time = s->time - s->pp_time;
1639 for (i = 0; i < context_count; i++) {
1640 PutBitContext *pb = &s->thread_context[i]->pb;
1641 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1646 assert(s->avctx->rc_max_rate);
1649 if (s->flags & CODEC_FLAG_PASS1)
1650 ff_write_pass1_stats(s);
1652 for (i = 0; i < 4; i++) {
1653 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1654 avctx->error[i] += s->current_picture_ptr->f->error[i];
1657 if (s->flags & CODEC_FLAG_PASS1)
1658 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1659 avctx->i_tex_bits + avctx->p_tex_bits ==
1660 put_bits_count(&s->pb));
1661 flush_put_bits(&s->pb);
1662 s->frame_bits = put_bits_count(&s->pb);
1664 stuffing_count = ff_vbv_update(s, s->frame_bits);
1665 if (stuffing_count) {
1666 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1667 stuffing_count + 50) {
1668 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1672 switch (s->codec_id) {
1673 case AV_CODEC_ID_MPEG1VIDEO:
1674 case AV_CODEC_ID_MPEG2VIDEO:
1675 while (stuffing_count--) {
1676 put_bits(&s->pb, 8, 0);
1679 case AV_CODEC_ID_MPEG4:
1680 put_bits(&s->pb, 16, 0);
1681 put_bits(&s->pb, 16, 0x1C3);
1682 stuffing_count -= 4;
1683 while (stuffing_count--) {
1684 put_bits(&s->pb, 8, 0xFF);
1688 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1690 flush_put_bits(&s->pb);
1691 s->frame_bits = put_bits_count(&s->pb);
1694 /* update mpeg1/2 vbv_delay for CBR */
1695 if (s->avctx->rc_max_rate &&
1696 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1697 s->out_format == FMT_MPEG1 &&
1698 90000LL * (avctx->rc_buffer_size - 1) <=
1699 s->avctx->rc_max_rate * 0xFFFFLL) {
1700 int vbv_delay, min_delay;
1701 double inbits = s->avctx->rc_max_rate *
1702 av_q2d(s->avctx->time_base);
1703 int minbits = s->frame_bits - 8 *
1704 (s->vbv_delay_ptr - s->pb.buf - 1);
1705 double bits = s->rc_context.buffer_index + minbits - inbits;
1708 av_log(s->avctx, AV_LOG_ERROR,
1709 "Internal error, negative bits\n");
1711 assert(s->repeat_first_field == 0);
1713 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1714 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1715 s->avctx->rc_max_rate;
1717 vbv_delay = FFMAX(vbv_delay, min_delay);
1719 assert(vbv_delay < 0xFFFF);
1721 s->vbv_delay_ptr[0] &= 0xF8;
1722 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1723 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1724 s->vbv_delay_ptr[2] &= 0x07;
1725 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1726 avctx->vbv_delay = vbv_delay * 300;
1728 s->total_bits += s->frame_bits;
1729 avctx->frame_bits = s->frame_bits;
1731 pkt->pts = s->current_picture.f->pts;
1732 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1733 if (!s->current_picture.f->coded_picture_number)
1734 pkt->dts = pkt->pts - s->dts_delta;
1736 pkt->dts = s->reordered_pts;
1737 s->reordered_pts = pkt->pts;
1739 pkt->dts = pkt->pts;
1740 if (s->current_picture.f->key_frame)
1741 pkt->flags |= AV_PKT_FLAG_KEY;
1743 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1747 assert((s->frame_bits & 7) == 0);
1749 pkt->size = s->frame_bits / 8;
1750 *got_packet = !!pkt->size;
1754 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1755 int n, int threshold)
1757 static const char tab[64] = {
1758 3, 2, 2, 1, 1, 1, 1, 1,
1759 1, 1, 1, 1, 1, 1, 1, 1,
1760 1, 1, 1, 1, 1, 1, 1, 1,
1761 0, 0, 0, 0, 0, 0, 0, 0,
1762 0, 0, 0, 0, 0, 0, 0, 0,
1763 0, 0, 0, 0, 0, 0, 0, 0,
1764 0, 0, 0, 0, 0, 0, 0, 0,
1765 0, 0, 0, 0, 0, 0, 0, 0
1770 int16_t *block = s->block[n];
1771 const int last_index = s->block_last_index[n];
1774 if (threshold < 0) {
1776 threshold = -threshold;
1780 /* Are all we could set to zero already zero? */
1781 if (last_index <= skip_dc - 1)
1784 for (i = 0; i <= last_index; i++) {
1785 const int j = s->intra_scantable.permutated[i];
1786 const int level = FFABS(block[j]);
1788 if (skip_dc && i == 0)
1792 } else if (level > 1) {
1798 if (score >= threshold)
1800 for (i = skip_dc; i <= last_index; i++) {
1801 const int j = s->intra_scantable.permutated[i];
1805 s->block_last_index[n] = 0;
1807 s->block_last_index[n] = -1;
1810 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1814 const int maxlevel = s->max_qcoeff;
1815 const int minlevel = s->min_qcoeff;
1819 i = 1; // skip clipping of intra dc
1823 for (; i <= last_index; i++) {
1824 const int j = s->intra_scantable.permutated[i];
1825 int level = block[j];
1827 if (level > maxlevel) {
1830 } else if (level < minlevel) {
1838 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1839 av_log(s->avctx, AV_LOG_INFO,
1840 "warning, clipping %d dct coefficients to %d..%d\n",
1841 overflow, minlevel, maxlevel);
1844 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1848 for (y = 0; y < 8; y++) {
1849 for (x = 0; x < 8; x++) {
1855 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1856 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1857 int v = ptr[x2 + y2 * stride];
1863 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1868 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1869 int motion_x, int motion_y,
1870 int mb_block_height,
1873 int16_t weight[8][64];
1874 int16_t orig[8][64];
1875 const int mb_x = s->mb_x;
1876 const int mb_y = s->mb_y;
1879 int dct_offset = s->linesize * 8; // default for progressive frames
1880 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1881 ptrdiff_t wrap_y, wrap_c;
1883 for (i = 0; i < mb_block_count; i++)
1884 skip_dct[i] = s->skipdct;
1886 if (s->adaptive_quant) {
1887 const int last_qp = s->qscale;
1888 const int mb_xy = mb_x + mb_y * s->mb_stride;
1890 s->lambda = s->lambda_table[mb_xy];
1893 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1894 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1895 s->dquant = s->qscale - last_qp;
1897 if (s->out_format == FMT_H263) {
1898 s->dquant = av_clip(s->dquant, -2, 2);
1900 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1902 if (s->pict_type == AV_PICTURE_TYPE_B) {
1903 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1906 if (s->mv_type == MV_TYPE_8X8)
1912 ff_set_qscale(s, last_qp + s->dquant);
1913 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1914 ff_set_qscale(s, s->qscale + s->dquant);
1916 wrap_y = s->linesize;
1917 wrap_c = s->uvlinesize;
1918 ptr_y = s->new_picture.f->data[0] +
1919 (mb_y * 16 * wrap_y) + mb_x * 16;
1920 ptr_cb = s->new_picture.f->data[1] +
1921 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1922 ptr_cr = s->new_picture.f->data[2] +
1923 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1925 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1926 uint8_t *ebuf = s->edge_emu_buffer + 32;
1927 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1929 16, 16, mb_x * 16, mb_y * 16,
1930 s->width, s->height);
1932 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1934 8, mb_block_height, mb_x * 8, mb_y * 8,
1935 s->width >> 1, s->height >> 1);
1936 ptr_cb = ebuf + 18 * wrap_y;
1937 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1939 8, mb_block_height, mb_x * 8, mb_y * 8,
1940 s->width >> 1, s->height >> 1);
1941 ptr_cr = ebuf + 18 * wrap_y + 8;
1945 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1946 int progressive_score, interlaced_score;
1948 s->interlaced_dct = 0;
1949 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1950 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1951 NULL, wrap_y, 8) - 400;
1953 if (progressive_score > 0) {
1954 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1955 NULL, wrap_y * 2, 8) +
1956 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1957 NULL, wrap_y * 2, 8);
1958 if (progressive_score > interlaced_score) {
1959 s->interlaced_dct = 1;
1961 dct_offset = wrap_y;
1963 if (s->chroma_format == CHROMA_422)
1969 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1970 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1971 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
1972 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
1974 if (s->flags & CODEC_FLAG_GRAY) {
1978 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1979 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1980 if (!s->chroma_y_shift) { /* 422 */
1981 s->pdsp.get_pixels(s->block[6],
1982 ptr_cb + (dct_offset >> 1), wrap_c);
1983 s->pdsp.get_pixels(s->block[7],
1984 ptr_cr + (dct_offset >> 1), wrap_c);
1988 op_pixels_func (*op_pix)[4];
1989 qpel_mc_func (*op_qpix)[16];
1990 uint8_t *dest_y, *dest_cb, *dest_cr;
1992 dest_y = s->dest[0];
1993 dest_cb = s->dest[1];
1994 dest_cr = s->dest[2];
1996 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1997 op_pix = s->hdsp.put_pixels_tab;
1998 op_qpix = s->qdsp.put_qpel_pixels_tab;
2000 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2001 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2004 if (s->mv_dir & MV_DIR_FORWARD) {
2005 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2006 s->last_picture.f->data,
2008 op_pix = s->hdsp.avg_pixels_tab;
2009 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2011 if (s->mv_dir & MV_DIR_BACKWARD) {
2012 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2013 s->next_picture.f->data,
2017 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
2018 int progressive_score, interlaced_score;
2020 s->interlaced_dct = 0;
2021 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2022 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2026 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2027 progressive_score -= 400;
2029 if (progressive_score > 0) {
2030 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2032 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2036 if (progressive_score > interlaced_score) {
2037 s->interlaced_dct = 1;
2039 dct_offset = wrap_y;
2041 if (s->chroma_format == CHROMA_422)
2047 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2048 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2049 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2050 dest_y + dct_offset, wrap_y);
2051 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2052 dest_y + dct_offset + 8, wrap_y);
2054 if (s->flags & CODEC_FLAG_GRAY) {
2058 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2059 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2060 if (!s->chroma_y_shift) { /* 422 */
2061 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2062 dest_cb + (dct_offset >> 1), wrap_c);
2063 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2064 dest_cr + (dct_offset >> 1), wrap_c);
2067 /* pre quantization */
2068 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2069 2 * s->qscale * s->qscale) {
2071 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2073 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2075 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2076 wrap_y, 8) < 20 * s->qscale)
2078 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2079 wrap_y, 8) < 20 * s->qscale)
2081 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2083 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2085 if (!s->chroma_y_shift) { /* 422 */
2086 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2087 dest_cb + (dct_offset >> 1),
2088 wrap_c, 8) < 20 * s->qscale)
2090 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2091 dest_cr + (dct_offset >> 1),
2092 wrap_c, 8) < 20 * s->qscale)
2098 if (s->quantizer_noise_shaping) {
2100 get_visual_weight(weight[0], ptr_y , wrap_y);
2102 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2104 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2106 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2108 get_visual_weight(weight[4], ptr_cb , wrap_c);
2110 get_visual_weight(weight[5], ptr_cr , wrap_c);
2111 if (!s->chroma_y_shift) { /* 422 */
2113 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2116 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2119 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2122 /* DCT & quantize */
2123 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2125 for (i = 0; i < mb_block_count; i++) {
2128 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2129 // FIXME we could decide to change to quantizer instead of
2131 // JS: I don't think that would be a good idea it could lower
2132 // quality instead of improve it. Just INTRADC clipping
2133 // deserves changes in quantizer
2135 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2137 s->block_last_index[i] = -1;
2139 if (s->quantizer_noise_shaping) {
2140 for (i = 0; i < mb_block_count; i++) {
2142 s->block_last_index[i] =
2143 dct_quantize_refine(s, s->block[i], weight[i],
2144 orig[i], i, s->qscale);
2149 if (s->luma_elim_threshold && !s->mb_intra)
2150 for (i = 0; i < 4; i++)
2151 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2152 if (s->chroma_elim_threshold && !s->mb_intra)
2153 for (i = 4; i < mb_block_count; i++)
2154 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2156 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2157 for (i = 0; i < mb_block_count; i++) {
2158 if (s->block_last_index[i] == -1)
2159 s->coded_score[i] = INT_MAX / 256;
2164 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2165 s->block_last_index[4] =
2166 s->block_last_index[5] = 0;
2168 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2171 // non c quantize code returns incorrect block_last_index FIXME
2172 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2173 for (i = 0; i < mb_block_count; i++) {
2175 if (s->block_last_index[i] > 0) {
2176 for (j = 63; j > 0; j--) {
2177 if (s->block[i][s->intra_scantable.permutated[j]])
2180 s->block_last_index[i] = j;
2185 /* huffman encode */
2186 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2187 case AV_CODEC_ID_MPEG1VIDEO:
2188 case AV_CODEC_ID_MPEG2VIDEO:
2189 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2190 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2192 case AV_CODEC_ID_MPEG4:
2193 if (CONFIG_MPEG4_ENCODER)
2194 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2196 case AV_CODEC_ID_MSMPEG4V2:
2197 case AV_CODEC_ID_MSMPEG4V3:
2198 case AV_CODEC_ID_WMV1:
2199 if (CONFIG_MSMPEG4_ENCODER)
2200 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2202 case AV_CODEC_ID_WMV2:
2203 if (CONFIG_WMV2_ENCODER)
2204 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2206 case AV_CODEC_ID_H261:
2207 if (CONFIG_H261_ENCODER)
2208 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2210 case AV_CODEC_ID_H263:
2211 case AV_CODEC_ID_H263P:
2212 case AV_CODEC_ID_FLV1:
2213 case AV_CODEC_ID_RV10:
2214 case AV_CODEC_ID_RV20:
2215 if (CONFIG_H263_ENCODER)
2216 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2218 case AV_CODEC_ID_MJPEG:
2219 if (CONFIG_MJPEG_ENCODER)
2220 ff_mjpeg_encode_mb(s, s->block);
2227 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2229 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2230 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2233 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2236 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2239 d->mb_skip_run= s->mb_skip_run;
2241 d->last_dc[i] = s->last_dc[i];
2244 d->mv_bits= s->mv_bits;
2245 d->i_tex_bits= s->i_tex_bits;
2246 d->p_tex_bits= s->p_tex_bits;
2247 d->i_count= s->i_count;
2248 d->f_count= s->f_count;
2249 d->b_count= s->b_count;
2250 d->skip_count= s->skip_count;
2251 d->misc_bits= s->misc_bits;
2255 d->qscale= s->qscale;
2256 d->dquant= s->dquant;
2258 d->esc3_level_length= s->esc3_level_length;
2261 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2264 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2265 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2268 d->mb_skip_run= s->mb_skip_run;
2270 d->last_dc[i] = s->last_dc[i];
2273 d->mv_bits= s->mv_bits;
2274 d->i_tex_bits= s->i_tex_bits;
2275 d->p_tex_bits= s->p_tex_bits;
2276 d->i_count= s->i_count;
2277 d->f_count= s->f_count;
2278 d->b_count= s->b_count;
2279 d->skip_count= s->skip_count;
2280 d->misc_bits= s->misc_bits;
2282 d->mb_intra= s->mb_intra;
2283 d->mb_skipped= s->mb_skipped;
2284 d->mv_type= s->mv_type;
2285 d->mv_dir= s->mv_dir;
2287 if(s->data_partitioning){
2289 d->tex_pb= s->tex_pb;
2293 d->block_last_index[i]= s->block_last_index[i];
2294 d->interlaced_dct= s->interlaced_dct;
2295 d->qscale= s->qscale;
2297 d->esc3_level_length= s->esc3_level_length;
2300 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2301 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2302 int *dmin, int *next_block, int motion_x, int motion_y)
2305 uint8_t *dest_backup[3];
2307 copy_context_before_encode(s, backup, type);
2309 s->block= s->blocks[*next_block];
2310 s->pb= pb[*next_block];
2311 if(s->data_partitioning){
2312 s->pb2 = pb2 [*next_block];
2313 s->tex_pb= tex_pb[*next_block];
2317 memcpy(dest_backup, s->dest, sizeof(s->dest));
2318 s->dest[0] = s->rd_scratchpad;
2319 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2320 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2321 assert(s->linesize >= 32); //FIXME
2324 encode_mb(s, motion_x, motion_y);
2326 score= put_bits_count(&s->pb);
2327 if(s->data_partitioning){
2328 score+= put_bits_count(&s->pb2);
2329 score+= put_bits_count(&s->tex_pb);
2332 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2333 ff_mpv_decode_mb(s, s->block);
2335 score *= s->lambda2;
2336 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2340 memcpy(s->dest, dest_backup, sizeof(s->dest));
2347 copy_context_after_encode(best, s, type);
2351 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2352 uint32_t *sq = ff_square_tab + 256;
2357 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2358 else if(w==8 && h==8)
2359 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2363 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2372 static int sse_mb(MpegEncContext *s){
2376 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2377 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2380 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2381 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) +
2382 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) +
2383 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);
2385 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) +
2386 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) +
2387 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);
2390 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)
2391 +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)
2392 +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);
2395 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2396 MpegEncContext *s= *(void**)arg;
2400 s->me.dia_size= s->avctx->pre_dia_size;
2401 s->first_slice_line=1;
2402 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2403 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2404 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2406 s->first_slice_line=0;
2414 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2415 MpegEncContext *s= *(void**)arg;
2417 s->me.dia_size= s->avctx->dia_size;
2418 s->first_slice_line=1;
2419 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2420 s->mb_x=0; //for block init below
2421 ff_init_block_index(s);
2422 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2423 s->block_index[0]+=2;
2424 s->block_index[1]+=2;
2425 s->block_index[2]+=2;
2426 s->block_index[3]+=2;
2428 /* compute motion vector & mb_type and store in context */
2429 if(s->pict_type==AV_PICTURE_TYPE_B)
2430 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2432 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2434 s->first_slice_line=0;
2439 static int mb_var_thread(AVCodecContext *c, void *arg){
2440 MpegEncContext *s= *(void**)arg;
2443 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2444 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2447 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2449 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2451 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2452 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2454 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2455 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2456 s->me.mb_var_sum_temp += varc;
2462 static void write_slice_end(MpegEncContext *s){
2463 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2464 if(s->partitioned_frame){
2465 ff_mpeg4_merge_partitions(s);
2468 ff_mpeg4_stuffing(&s->pb);
2469 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2470 ff_mjpeg_encode_stuffing(&s->pb);
2473 avpriv_align_put_bits(&s->pb);
2474 flush_put_bits(&s->pb);
2476 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2477 s->misc_bits+= get_bits_diff(s);
2480 static void write_mb_info(MpegEncContext *s)
2482 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2483 int offset = put_bits_count(&s->pb);
2484 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2485 int gobn = s->mb_y / s->gob_index;
2487 if (CONFIG_H263_ENCODER)
2488 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2489 bytestream_put_le32(&ptr, offset);
2490 bytestream_put_byte(&ptr, s->qscale);
2491 bytestream_put_byte(&ptr, gobn);
2492 bytestream_put_le16(&ptr, mba);
2493 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2494 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2495 /* 4MV not implemented */
2496 bytestream_put_byte(&ptr, 0); /* hmv2 */
2497 bytestream_put_byte(&ptr, 0); /* vmv2 */
2500 static void update_mb_info(MpegEncContext *s, int startcode)
2504 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2505 s->mb_info_size += 12;
2506 s->prev_mb_info = s->last_mb_info;
2509 s->prev_mb_info = put_bits_count(&s->pb)/8;
2510 /* This might have incremented mb_info_size above, and we return without
2511 * actually writing any info into that slot yet. But in that case,
2512 * this will be called again at the start of the after writing the
2513 * start code, actually writing the mb info. */
2517 s->last_mb_info = put_bits_count(&s->pb)/8;
2518 if (!s->mb_info_size)
2519 s->mb_info_size += 12;
2523 static int encode_thread(AVCodecContext *c, void *arg){
2524 MpegEncContext *s= *(void**)arg;
2525 int mb_x, mb_y, pdif = 0;
2526 int chr_h= 16>>s->chroma_y_shift;
2528 MpegEncContext best_s, backup_s;
2529 uint8_t bit_buf[2][MAX_MB_BYTES];
2530 uint8_t bit_buf2[2][MAX_MB_BYTES];
2531 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2532 PutBitContext pb[2], pb2[2], tex_pb[2];
2535 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2536 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2537 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2540 s->last_bits= put_bits_count(&s->pb);
2551 /* init last dc values */
2552 /* note: quant matrix value (8) is implied here */
2553 s->last_dc[i] = 128 << s->intra_dc_precision;
2555 s->current_picture.f->error[i] = 0;
2558 memset(s->last_mv, 0, sizeof(s->last_mv));
2562 switch(s->codec_id){
2563 case AV_CODEC_ID_H263:
2564 case AV_CODEC_ID_H263P:
2565 case AV_CODEC_ID_FLV1:
2566 if (CONFIG_H263_ENCODER)
2567 s->gob_index = ff_h263_get_gob_height(s);
2569 case AV_CODEC_ID_MPEG4:
2570 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2571 ff_mpeg4_init_partitions(s);
2577 s->first_slice_line = 1;
2578 s->ptr_lastgob = s->pb.buf;
2579 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2583 ff_set_qscale(s, s->qscale);
2584 ff_init_block_index(s);
2586 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2587 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2588 int mb_type= s->mb_type[xy];
2593 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2594 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2597 if(s->data_partitioning){
2598 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2599 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2600 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2606 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2607 ff_update_block_index(s);
2609 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2610 ff_h261_reorder_mb_index(s);
2611 xy= s->mb_y*s->mb_stride + s->mb_x;
2612 mb_type= s->mb_type[xy];
2615 /* write gob / video packet header */
2617 int current_packet_size, is_gob_start;
2619 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2621 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2623 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2625 switch(s->codec_id){
2626 case AV_CODEC_ID_H263:
2627 case AV_CODEC_ID_H263P:
2628 if(!s->h263_slice_structured)
2629 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2631 case AV_CODEC_ID_MPEG2VIDEO:
2632 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2633 case AV_CODEC_ID_MPEG1VIDEO:
2634 if(s->mb_skip_run) is_gob_start=0;
2639 if(s->start_mb_y != mb_y || mb_x!=0){
2642 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2643 ff_mpeg4_init_partitions(s);
2647 assert((put_bits_count(&s->pb)&7) == 0);
2648 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2650 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2651 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2652 int d = 100 / s->error_rate;
2654 current_packet_size=0;
2655 s->pb.buf_ptr= s->ptr_lastgob;
2656 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2660 if (s->avctx->rtp_callback){
2661 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2662 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2664 update_mb_info(s, 1);
2666 switch(s->codec_id){
2667 case AV_CODEC_ID_MPEG4:
2668 if (CONFIG_MPEG4_ENCODER) {
2669 ff_mpeg4_encode_video_packet_header(s);
2670 ff_mpeg4_clean_buffers(s);
2673 case AV_CODEC_ID_MPEG1VIDEO:
2674 case AV_CODEC_ID_MPEG2VIDEO:
2675 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2676 ff_mpeg1_encode_slice_header(s);
2677 ff_mpeg1_clean_buffers(s);
2680 case AV_CODEC_ID_H263:
2681 case AV_CODEC_ID_H263P:
2682 if (CONFIG_H263_ENCODER)
2683 ff_h263_encode_gob_header(s, mb_y);
2687 if(s->flags&CODEC_FLAG_PASS1){
2688 int bits= put_bits_count(&s->pb);
2689 s->misc_bits+= bits - s->last_bits;
2693 s->ptr_lastgob += current_packet_size;
2694 s->first_slice_line=1;
2695 s->resync_mb_x=mb_x;
2696 s->resync_mb_y=mb_y;
2700 if( (s->resync_mb_x == s->mb_x)
2701 && s->resync_mb_y+1 == s->mb_y){
2702 s->first_slice_line=0;
2706 s->dquant=0; //only for QP_RD
2708 update_mb_info(s, 0);
2710 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
2712 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2714 copy_context_before_encode(&backup_s, s, -1);
2716 best_s.data_partitioning= s->data_partitioning;
2717 best_s.partitioned_frame= s->partitioned_frame;
2718 if(s->data_partitioning){
2719 backup_s.pb2= s->pb2;
2720 backup_s.tex_pb= s->tex_pb;
2723 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2724 s->mv_dir = MV_DIR_FORWARD;
2725 s->mv_type = MV_TYPE_16X16;
2727 s->mv[0][0][0] = s->p_mv_table[xy][0];
2728 s->mv[0][0][1] = s->p_mv_table[xy][1];
2729 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2730 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2732 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2733 s->mv_dir = MV_DIR_FORWARD;
2734 s->mv_type = MV_TYPE_FIELD;
2737 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2738 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2739 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2741 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2742 &dmin, &next_block, 0, 0);
2744 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2745 s->mv_dir = MV_DIR_FORWARD;
2746 s->mv_type = MV_TYPE_16X16;
2750 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2751 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2753 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2754 s->mv_dir = MV_DIR_FORWARD;
2755 s->mv_type = MV_TYPE_8X8;
2758 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2759 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2761 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2762 &dmin, &next_block, 0, 0);
2764 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2765 s->mv_dir = MV_DIR_FORWARD;
2766 s->mv_type = MV_TYPE_16X16;
2768 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2769 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2770 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2771 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2773 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2774 s->mv_dir = MV_DIR_BACKWARD;
2775 s->mv_type = MV_TYPE_16X16;
2777 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2778 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2779 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2780 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2782 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2783 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2784 s->mv_type = MV_TYPE_16X16;
2786 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2787 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2788 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2789 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2790 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2791 &dmin, &next_block, 0, 0);
2793 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2794 s->mv_dir = MV_DIR_FORWARD;
2795 s->mv_type = MV_TYPE_FIELD;
2798 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2799 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2800 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2802 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2803 &dmin, &next_block, 0, 0);
2805 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2806 s->mv_dir = MV_DIR_BACKWARD;
2807 s->mv_type = MV_TYPE_FIELD;
2810 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2811 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2812 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2814 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2815 &dmin, &next_block, 0, 0);
2817 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2818 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2819 s->mv_type = MV_TYPE_FIELD;
2821 for(dir=0; dir<2; dir++){
2823 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2824 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2825 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2828 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2829 &dmin, &next_block, 0, 0);
2831 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2833 s->mv_type = MV_TYPE_16X16;
2837 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2838 &dmin, &next_block, 0, 0);
2839 if(s->h263_pred || s->h263_aic){
2841 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2843 ff_clean_intra_table_entries(s); //old mode?
2847 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2848 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2849 const int last_qp= backup_s.qscale;
2852 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2853 static const int dquant_tab[4]={-1,1,-2,2};
2855 assert(backup_s.dquant == 0);
2858 s->mv_dir= best_s.mv_dir;
2859 s->mv_type = MV_TYPE_16X16;
2860 s->mb_intra= best_s.mb_intra;
2861 s->mv[0][0][0] = best_s.mv[0][0][0];
2862 s->mv[0][0][1] = best_s.mv[0][0][1];
2863 s->mv[1][0][0] = best_s.mv[1][0][0];
2864 s->mv[1][0][1] = best_s.mv[1][0][1];
2866 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2867 for(; qpi<4; qpi++){
2868 int dquant= dquant_tab[qpi];
2869 qp= last_qp + dquant;
2870 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2872 backup_s.dquant= dquant;
2873 if(s->mb_intra && s->dc_val[0]){
2875 dc[i]= s->dc_val[0][ s->block_index[i] ];
2876 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2880 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2881 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2882 if(best_s.qscale != qp){
2883 if(s->mb_intra && s->dc_val[0]){
2885 s->dc_val[0][ s->block_index[i] ]= dc[i];
2886 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2893 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2894 int mx= s->b_direct_mv_table[xy][0];
2895 int my= s->b_direct_mv_table[xy][1];
2897 backup_s.dquant = 0;
2898 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2900 ff_mpeg4_set_direct_mv(s, mx, my);
2901 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2902 &dmin, &next_block, mx, my);
2904 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2905 backup_s.dquant = 0;
2906 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2908 ff_mpeg4_set_direct_mv(s, 0, 0);
2909 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2910 &dmin, &next_block, 0, 0);
2912 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2915 coded |= s->block_last_index[i];
2918 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2919 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2920 mx=my=0; //FIXME find the one we actually used
2921 ff_mpeg4_set_direct_mv(s, mx, my);
2922 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2930 s->mv_dir= best_s.mv_dir;
2931 s->mv_type = best_s.mv_type;
2933 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2934 s->mv[0][0][1] = best_s.mv[0][0][1];
2935 s->mv[1][0][0] = best_s.mv[1][0][0];
2936 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2939 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2940 &dmin, &next_block, mx, my);
2945 s->current_picture.qscale_table[xy] = best_s.qscale;
2947 copy_context_after_encode(s, &best_s, -1);
2949 pb_bits_count= put_bits_count(&s->pb);
2950 flush_put_bits(&s->pb);
2951 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2954 if(s->data_partitioning){
2955 pb2_bits_count= put_bits_count(&s->pb2);
2956 flush_put_bits(&s->pb2);
2957 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2958 s->pb2= backup_s.pb2;
2960 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2961 flush_put_bits(&s->tex_pb);
2962 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2963 s->tex_pb= backup_s.tex_pb;
2965 s->last_bits= put_bits_count(&s->pb);
2967 if (CONFIG_H263_ENCODER &&
2968 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2969 ff_h263_update_motion_val(s);
2971 if(next_block==0){ //FIXME 16 vs linesize16
2972 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2973 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2974 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2977 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2978 ff_mpv_decode_mb(s, s->block);
2980 int motion_x = 0, motion_y = 0;
2981 s->mv_type=MV_TYPE_16X16;
2982 // only one MB-Type possible
2985 case CANDIDATE_MB_TYPE_INTRA:
2988 motion_x= s->mv[0][0][0] = 0;
2989 motion_y= s->mv[0][0][1] = 0;
2991 case CANDIDATE_MB_TYPE_INTER:
2992 s->mv_dir = MV_DIR_FORWARD;
2994 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2995 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2997 case CANDIDATE_MB_TYPE_INTER_I:
2998 s->mv_dir = MV_DIR_FORWARD;
2999 s->mv_type = MV_TYPE_FIELD;
3002 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3003 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3004 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3007 case CANDIDATE_MB_TYPE_INTER4V:
3008 s->mv_dir = MV_DIR_FORWARD;
3009 s->mv_type = MV_TYPE_8X8;
3012 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3013 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3016 case CANDIDATE_MB_TYPE_DIRECT:
3017 if (CONFIG_MPEG4_ENCODER) {
3018 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3020 motion_x=s->b_direct_mv_table[xy][0];
3021 motion_y=s->b_direct_mv_table[xy][1];
3022 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3025 case CANDIDATE_MB_TYPE_DIRECT0:
3026 if (CONFIG_MPEG4_ENCODER) {
3027 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3029 ff_mpeg4_set_direct_mv(s, 0, 0);
3032 case CANDIDATE_MB_TYPE_BIDIR:
3033 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3035 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3036 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3037 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3038 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3040 case CANDIDATE_MB_TYPE_BACKWARD:
3041 s->mv_dir = MV_DIR_BACKWARD;
3043 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3044 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3046 case CANDIDATE_MB_TYPE_FORWARD:
3047 s->mv_dir = MV_DIR_FORWARD;
3049 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3050 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3052 case CANDIDATE_MB_TYPE_FORWARD_I:
3053 s->mv_dir = MV_DIR_FORWARD;
3054 s->mv_type = MV_TYPE_FIELD;
3057 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3058 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3059 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3062 case CANDIDATE_MB_TYPE_BACKWARD_I:
3063 s->mv_dir = MV_DIR_BACKWARD;
3064 s->mv_type = MV_TYPE_FIELD;
3067 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3068 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3069 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3072 case CANDIDATE_MB_TYPE_BIDIR_I:
3073 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3074 s->mv_type = MV_TYPE_FIELD;
3076 for(dir=0; dir<2; dir++){
3078 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3079 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3080 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3085 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3088 encode_mb(s, motion_x, motion_y);
3090 // RAL: Update last macroblock type
3091 s->last_mv_dir = s->mv_dir;
3093 if (CONFIG_H263_ENCODER &&
3094 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3095 ff_h263_update_motion_val(s);
3097 ff_mpv_decode_mb(s, s->block);
3100 /* clean the MV table in IPS frames for direct mode in B frames */
3101 if(s->mb_intra /* && I,P,S_TYPE */){
3102 s->p_mv_table[xy][0]=0;
3103 s->p_mv_table[xy][1]=0;
3106 if(s->flags&CODEC_FLAG_PSNR){
3110 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3111 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3113 s->current_picture.f->error[0] += sse(
3114 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3115 s->dest[0], w, h, s->linesize);
3116 s->current_picture.f->error[1] += sse(
3117 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3118 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3119 s->current_picture.f->error[2] += sse(
3120 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3121 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3124 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3125 ff_h263_loop_filter(s);
3127 av_dlog(s->avctx, "MB %d %d bits\n",
3128 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3132 //not beautiful here but we must write it before flushing so it has to be here
3133 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3134 ff_msmpeg4_encode_ext_header(s);
3138 /* Send the last GOB if RTP */
3139 if (s->avctx->rtp_callback) {
3140 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3141 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3142 /* Call the RTP callback to send the last GOB */
3144 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3150 #define MERGE(field) dst->field += src->field; src->field=0
3151 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3152 MERGE(me.scene_change_score);
3153 MERGE(me.mc_mb_var_sum_temp);
3154 MERGE(me.mb_var_sum_temp);
3157 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3160 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3161 MERGE(dct_count[1]);
3170 MERGE(er.error_count);
3171 MERGE(padding_bug_score);
3172 MERGE(current_picture.f->error[0]);
3173 MERGE(current_picture.f->error[1]);
3174 MERGE(current_picture.f->error[2]);
3176 if(dst->avctx->noise_reduction){
3177 for(i=0; i<64; i++){
3178 MERGE(dct_error_sum[0][i]);
3179 MERGE(dct_error_sum[1][i]);
3183 assert(put_bits_count(&src->pb) % 8 ==0);
3184 assert(put_bits_count(&dst->pb) % 8 ==0);
3185 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3186 flush_put_bits(&dst->pb);
3189 static int estimate_qp(MpegEncContext *s, int dry_run){
3190 if (s->next_lambda){
3191 s->current_picture_ptr->f->quality =
3192 s->current_picture.f->quality = s->next_lambda;
3193 if(!dry_run) s->next_lambda= 0;
3194 } else if (!s->fixed_qscale) {
3195 s->current_picture_ptr->f->quality =
3196 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3197 if (s->current_picture.f->quality < 0)
3201 if(s->adaptive_quant){
3202 switch(s->codec_id){
3203 case AV_CODEC_ID_MPEG4:
3204 if (CONFIG_MPEG4_ENCODER)
3205 ff_clean_mpeg4_qscales(s);
3207 case AV_CODEC_ID_H263:
3208 case AV_CODEC_ID_H263P:
3209 case AV_CODEC_ID_FLV1:
3210 if (CONFIG_H263_ENCODER)
3211 ff_clean_h263_qscales(s);
3214 ff_init_qscale_tab(s);
3217 s->lambda= s->lambda_table[0];
3220 s->lambda = s->current_picture.f->quality;
3225 /* must be called before writing the header */
3226 static void set_frame_distances(MpegEncContext * s){
3227 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3228 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3230 if(s->pict_type==AV_PICTURE_TYPE_B){
3231 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3232 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3234 s->pp_time= s->time - s->last_non_b_time;
3235 s->last_non_b_time= s->time;
3236 assert(s->picture_number==0 || s->pp_time > 0);
3240 static int encode_picture(MpegEncContext *s, int picture_number)
3244 int context_count = s->slice_context_count;
3246 s->picture_number = picture_number;
3248 /* Reset the average MB variance */
3249 s->me.mb_var_sum_temp =
3250 s->me.mc_mb_var_sum_temp = 0;
3252 /* we need to initialize some time vars before we can encode b-frames */
3253 // RAL: Condition added for MPEG1VIDEO
3254 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3255 set_frame_distances(s);
3256 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3257 ff_set_mpeg4_time(s);
3259 s->me.scene_change_score=0;
3261 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3263 if(s->pict_type==AV_PICTURE_TYPE_I){
3264 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3265 else s->no_rounding=0;
3266 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3267 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3268 s->no_rounding ^= 1;
3271 if(s->flags & CODEC_FLAG_PASS2){
3272 if (estimate_qp(s,1) < 0)
3274 ff_get_2pass_fcode(s);
3275 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3276 if(s->pict_type==AV_PICTURE_TYPE_B)
3277 s->lambda= s->last_lambda_for[s->pict_type];
3279 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3283 s->mb_intra=0; //for the rate distortion & bit compare functions
3284 for(i=1; i<context_count; i++){
3285 ret = ff_update_duplicate_context(s->thread_context[i], s);
3293 /* Estimate motion for every MB */
3294 if(s->pict_type != AV_PICTURE_TYPE_I){
3295 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3296 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3297 if (s->pict_type != AV_PICTURE_TYPE_B) {
3298 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3299 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3303 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3304 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3306 for(i=0; i<s->mb_stride*s->mb_height; i++)
3307 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3309 if(!s->fixed_qscale){
3310 /* finding spatial complexity for I-frame rate control */
3311 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3314 for(i=1; i<context_count; i++){
3315 merge_context_after_me(s, s->thread_context[i]);
3317 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3318 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3321 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3322 s->pict_type= AV_PICTURE_TYPE_I;
3323 for(i=0; i<s->mb_stride*s->mb_height; i++)
3324 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3325 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3326 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3330 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3331 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3333 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3335 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3336 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3337 s->f_code= FFMAX3(s->f_code, a, b);
3340 ff_fix_long_p_mvs(s);
3341 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3342 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3346 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3347 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3352 if(s->pict_type==AV_PICTURE_TYPE_B){
3355 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3356 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3357 s->f_code = FFMAX(a, b);
3359 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3360 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3361 s->b_code = FFMAX(a, b);
3363 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3364 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3365 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3366 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3367 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3369 for(dir=0; dir<2; dir++){
3372 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3373 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3374 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3375 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3383 if (estimate_qp(s, 0) < 0)
3386 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3387 s->qscale= 3; //reduce clipping problems
3389 if (s->out_format == FMT_MJPEG) {
3390 /* for mjpeg, we do include qscale in the matrix */
3392 int j = s->idsp.idct_permutation[i];
3394 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3396 s->y_dc_scale_table=
3397 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3398 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3399 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3400 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3404 //FIXME var duplication
3405 s->current_picture_ptr->f->key_frame =
3406 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3407 s->current_picture_ptr->f->pict_type =
3408 s->current_picture.f->pict_type = s->pict_type;
3410 if (s->current_picture.f->key_frame)
3411 s->picture_in_gop_number=0;
3413 s->last_bits= put_bits_count(&s->pb);
3414 switch(s->out_format) {
3416 if (CONFIG_MJPEG_ENCODER)
3417 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3421 if (CONFIG_H261_ENCODER)
3422 ff_h261_encode_picture_header(s, picture_number);
3425 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3426 ff_wmv2_encode_picture_header(s, picture_number);
3427 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3428 ff_msmpeg4_encode_picture_header(s, picture_number);
3429 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3430 ff_mpeg4_encode_picture_header(s, picture_number);
3431 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3432 ff_rv10_encode_picture_header(s, picture_number);
3433 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3434 ff_rv20_encode_picture_header(s, picture_number);
3435 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3436 ff_flv_encode_picture_header(s, picture_number);
3437 else if (CONFIG_H263_ENCODER)
3438 ff_h263_encode_picture_header(s, picture_number);
3441 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3442 ff_mpeg1_encode_picture_header(s, picture_number);
3447 bits= put_bits_count(&s->pb);
3448 s->header_bits= bits - s->last_bits;
3450 for(i=1; i<context_count; i++){
3451 update_duplicate_context_after_me(s->thread_context[i], s);
3453 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3454 for(i=1; i<context_count; i++){
3455 merge_context_after_encode(s, s->thread_context[i]);
3461 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3462 const int intra= s->mb_intra;
3465 s->dct_count[intra]++;
3467 for(i=0; i<64; i++){
3468 int level= block[i];
3472 s->dct_error_sum[intra][i] += level;
3473 level -= s->dct_offset[intra][i];
3474 if(level<0) level=0;
3476 s->dct_error_sum[intra][i] -= level;
3477 level += s->dct_offset[intra][i];
3478 if(level>0) level=0;
3485 static int dct_quantize_trellis_c(MpegEncContext *s,
3486 int16_t *block, int n,
3487 int qscale, int *overflow){
3489 const uint8_t *scantable= s->intra_scantable.scantable;
3490 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3492 unsigned int threshold1, threshold2;
3504 int coeff_count[64];
3505 int qmul, qadd, start_i, last_non_zero, i, dc;
3506 const int esc_length= s->ac_esc_length;
3508 uint8_t * last_length;
3509 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3511 s->fdsp.fdct(block);
3513 if(s->dct_error_sum)
3514 s->denoise_dct(s, block);
3516 qadd= ((qscale-1)|1)*8;
3527 /* For AIC we skip quant/dequant of INTRADC */
3532 /* note: block[0] is assumed to be positive */
3533 block[0] = (block[0] + (q >> 1)) / q;
3536 qmat = s->q_intra_matrix[qscale];
3537 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3538 bias= 1<<(QMAT_SHIFT-1);
3539 length = s->intra_ac_vlc_length;
3540 last_length= s->intra_ac_vlc_last_length;
3544 qmat = s->q_inter_matrix[qscale];
3545 length = s->inter_ac_vlc_length;
3546 last_length= s->inter_ac_vlc_last_length;
3550 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3551 threshold2= (threshold1<<1);
3553 for(i=63; i>=start_i; i--) {
3554 const int j = scantable[i];
3555 int level = block[j] * qmat[j];
3557 if(((unsigned)(level+threshold1))>threshold2){
3563 for(i=start_i; i<=last_non_zero; i++) {
3564 const int j = scantable[i];
3565 int level = block[j] * qmat[j];
3567 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3568 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3569 if(((unsigned)(level+threshold1))>threshold2){
3571 level= (bias + level)>>QMAT_SHIFT;
3573 coeff[1][i]= level-1;
3574 // coeff[2][k]= level-2;
3576 level= (bias - level)>>QMAT_SHIFT;
3577 coeff[0][i]= -level;
3578 coeff[1][i]= -level+1;
3579 // coeff[2][k]= -level+2;
3581 coeff_count[i]= FFMIN(level, 2);
3582 assert(coeff_count[i]);
3585 coeff[0][i]= (level>>31)|1;
3590 *overflow= s->max_qcoeff < max; //overflow might have happened
3592 if(last_non_zero < start_i){
3593 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3594 return last_non_zero;
3597 score_tab[start_i]= 0;
3598 survivor[0]= start_i;
3601 for(i=start_i; i<=last_non_zero; i++){
3602 int level_index, j, zero_distortion;
3603 int dct_coeff= FFABS(block[ scantable[i] ]);
3604 int best_score=256*256*256*120;
3606 if (s->fdsp.fdct == ff_fdct_ifast)
3607 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3608 zero_distortion= dct_coeff*dct_coeff;
3610 for(level_index=0; level_index < coeff_count[i]; level_index++){
3612 int level= coeff[level_index][i];
3613 const int alevel= FFABS(level);
3618 if(s->out_format == FMT_H263){
3619 unquant_coeff= alevel*qmul + qadd;
3621 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3623 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3624 unquant_coeff = (unquant_coeff - 1) | 1;
3626 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3627 unquant_coeff = (unquant_coeff - 1) | 1;
3632 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3634 if((level&(~127)) == 0){
3635 for(j=survivor_count-1; j>=0; j--){
3636 int run= i - survivor[j];
3637 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3638 score += score_tab[i-run];
3640 if(score < best_score){
3643 level_tab[i+1]= level-64;
3647 if(s->out_format == FMT_H263){
3648 for(j=survivor_count-1; j>=0; j--){
3649 int run= i - survivor[j];
3650 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3651 score += score_tab[i-run];
3652 if(score < last_score){
3655 last_level= level-64;
3661 distortion += esc_length*lambda;
3662 for(j=survivor_count-1; j>=0; j--){
3663 int run= i - survivor[j];
3664 int score= distortion + score_tab[i-run];
3666 if(score < best_score){
3669 level_tab[i+1]= level-64;
3673 if(s->out_format == FMT_H263){
3674 for(j=survivor_count-1; j>=0; j--){
3675 int run= i - survivor[j];
3676 int score= distortion + score_tab[i-run];
3677 if(score < last_score){
3680 last_level= level-64;
3688 score_tab[i+1]= best_score;
3690 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3691 if(last_non_zero <= 27){
3692 for(; survivor_count; survivor_count--){
3693 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3697 for(; survivor_count; survivor_count--){
3698 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3703 survivor[ survivor_count++ ]= i+1;
3706 if(s->out_format != FMT_H263){
3707 last_score= 256*256*256*120;
3708 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3709 int score= score_tab[i];
3710 if(i) score += lambda*2; //FIXME exacter?
3712 if(score < last_score){
3715 last_level= level_tab[i];
3716 last_run= run_tab[i];
3721 s->coded_score[n] = last_score;
3723 dc= FFABS(block[0]);
3724 last_non_zero= last_i - 1;
3725 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3727 if(last_non_zero < start_i)
3728 return last_non_zero;
3730 if(last_non_zero == 0 && start_i == 0){
3732 int best_score= dc * dc;
3734 for(i=0; i<coeff_count[0]; i++){
3735 int level= coeff[i][0];
3736 int alevel= FFABS(level);
3737 int unquant_coeff, score, distortion;
3739 if(s->out_format == FMT_H263){
3740 unquant_coeff= (alevel*qmul + qadd)>>3;
3742 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3743 unquant_coeff = (unquant_coeff - 1) | 1;
3745 unquant_coeff = (unquant_coeff + 4) >> 3;
3746 unquant_coeff<<= 3 + 3;
3748 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3750 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3751 else score= distortion + esc_length*lambda;
3753 if(score < best_score){
3755 best_level= level - 64;
3758 block[0]= best_level;
3759 s->coded_score[n] = best_score - dc*dc;
3760 if(best_level == 0) return -1;
3761 else return last_non_zero;
3767 block[ perm_scantable[last_non_zero] ]= last_level;
3770 for(; i>start_i; i -= run_tab[i] + 1){
3771 block[ perm_scantable[i-1] ]= level_tab[i];
3774 return last_non_zero;
3777 //#define REFINE_STATS 1
3778 static int16_t basis[64][64];
3780 static void build_basis(uint8_t *perm){
3787 double s= 0.25*(1<<BASIS_SHIFT);
3789 int perm_index= perm[index];
3790 if(i==0) s*= sqrt(0.5);
3791 if(j==0) s*= sqrt(0.5);
3792 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)));
3799 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3800 int16_t *block, int16_t *weight, int16_t *orig,
3803 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3804 const uint8_t *scantable= s->intra_scantable.scantable;
3805 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3806 // unsigned int threshold1, threshold2;
3811 int qmul, qadd, start_i, last_non_zero, i, dc;
3813 uint8_t * last_length;
3815 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3818 static int after_last=0;
3819 static int to_zero=0;
3820 static int from_zero=0;
3823 static int messed_sign=0;
3826 if(basis[0][0] == 0)
3827 build_basis(s->idsp.idct_permutation);
3838 /* For AIC we skip quant/dequant of INTRADC */
3842 q <<= RECON_SHIFT-3;
3843 /* note: block[0] is assumed to be positive */
3845 // block[0] = (block[0] + (q >> 1)) / q;
3847 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3848 // bias= 1<<(QMAT_SHIFT-1);
3849 length = s->intra_ac_vlc_length;
3850 last_length= s->intra_ac_vlc_last_length;
3854 length = s->inter_ac_vlc_length;
3855 last_length= s->inter_ac_vlc_last_length;
3857 last_non_zero = s->block_last_index[n];
3862 dc += (1<<(RECON_SHIFT-1));
3863 for(i=0; i<64; i++){
3864 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3867 STOP_TIMER("memset rem[]")}
3870 for(i=0; i<64; i++){
3875 w= FFABS(weight[i]) + qns*one;
3876 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3879 // w=weight[i] = (63*qns + (w/2)) / w;
3885 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3891 for(i=start_i; i<=last_non_zero; i++){
3892 int j= perm_scantable[i];
3893 const int level= block[j];
3897 if(level<0) coeff= qmul*level - qadd;
3898 else coeff= qmul*level + qadd;
3899 run_tab[rle_index++]=run;
3902 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3908 if(last_non_zero>0){
3909 STOP_TIMER("init rem[]")
3916 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3919 int run2, best_unquant_change=0, analyze_gradient;
3923 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3925 if(analyze_gradient){
3929 for(i=0; i<64; i++){
3932 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3935 STOP_TIMER("rem*w*w")}
3945 const int level= block[0];
3946 int change, old_coeff;
3948 assert(s->mb_intra);
3952 for(change=-1; change<=1; change+=2){
3953 int new_level= level + change;
3954 int score, new_coeff;
3956 new_coeff= q*new_level;
3957 if(new_coeff >= 2048 || new_coeff < 0)
3960 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3961 new_coeff - old_coeff);
3962 if(score<best_score){
3965 best_change= change;
3966 best_unquant_change= new_coeff - old_coeff;
3973 run2= run_tab[rle_index++];
3977 for(i=start_i; i<64; i++){
3978 int j= perm_scantable[i];
3979 const int level= block[j];
3980 int change, old_coeff;
3982 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3986 if(level<0) old_coeff= qmul*level - qadd;
3987 else old_coeff= qmul*level + qadd;
3988 run2= run_tab[rle_index++]; //FIXME ! maybe after last
3992 assert(run2>=0 || i >= last_non_zero );
3995 for(change=-1; change<=1; change+=2){
3996 int new_level= level + change;
3997 int score, new_coeff, unquant_change;
4000 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4004 if(new_level<0) new_coeff= qmul*new_level - qadd;
4005 else new_coeff= qmul*new_level + qadd;
4006 if(new_coeff >= 2048 || new_coeff <= -2048)
4008 //FIXME check for overflow
4011 if(level < 63 && level > -63){
4012 if(i < last_non_zero)
4013 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4014 - length[UNI_AC_ENC_INDEX(run, level+64)];
4016 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4017 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4020 assert(FFABS(new_level)==1);
4022 if(analyze_gradient){
4023 int g= d1[ scantable[i] ];
4024 if(g && (g^new_level) >= 0)
4028 if(i < last_non_zero){
4029 int next_i= i + run2 + 1;
4030 int next_level= block[ perm_scantable[next_i] ] + 64;
4032 if(next_level&(~127))
4035 if(next_i < last_non_zero)
4036 score += length[UNI_AC_ENC_INDEX(run, 65)]
4037 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4038 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4040 score += length[UNI_AC_ENC_INDEX(run, 65)]
4041 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4042 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4044 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4046 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4047 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4053 assert(FFABS(level)==1);
4055 if(i < last_non_zero){
4056 int next_i= i + run2 + 1;
4057 int next_level= block[ perm_scantable[next_i] ] + 64;
4059 if(next_level&(~127))
4062 if(next_i < last_non_zero)
4063 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4064 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4065 - length[UNI_AC_ENC_INDEX(run, 65)];
4067 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4068 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4069 - length[UNI_AC_ENC_INDEX(run, 65)];
4071 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4073 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4074 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4081 unquant_change= new_coeff - old_coeff;
4082 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4084 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4086 if(score<best_score){
4089 best_change= change;
4090 best_unquant_change= unquant_change;
4094 prev_level= level + 64;
4095 if(prev_level&(~127))
4104 STOP_TIMER("iterative step")}
4108 int j= perm_scantable[ best_coeff ];
4110 block[j] += best_change;
4112 if(best_coeff > last_non_zero){
4113 last_non_zero= best_coeff;
4121 if(block[j] - best_change){
4122 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4134 for(; last_non_zero>=start_i; last_non_zero--){
4135 if(block[perm_scantable[last_non_zero]])
4141 if(256*256*256*64 % count == 0){
4142 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);
4147 for(i=start_i; i<=last_non_zero; i++){
4148 int j= perm_scantable[i];
4149 const int level= block[j];
4152 run_tab[rle_index++]=run;
4159 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4165 if(last_non_zero>0){
4166 STOP_TIMER("iterative search")
4171 return last_non_zero;
4174 int ff_dct_quantize_c(MpegEncContext *s,
4175 int16_t *block, int n,
4176 int qscale, int *overflow)
4178 int i, j, level, last_non_zero, q, start_i;
4180 const uint8_t *scantable= s->intra_scantable.scantable;
4183 unsigned int threshold1, threshold2;
4185 s->fdsp.fdct(block);
4187 if(s->dct_error_sum)
4188 s->denoise_dct(s, block);
4198 /* For AIC we skip quant/dequant of INTRADC */
4201 /* note: block[0] is assumed to be positive */
4202 block[0] = (block[0] + (q >> 1)) / q;
4205 qmat = s->q_intra_matrix[qscale];
4206 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4210 qmat = s->q_inter_matrix[qscale];
4211 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4213 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4214 threshold2= (threshold1<<1);
4215 for(i=63;i>=start_i;i--) {
4217 level = block[j] * qmat[j];
4219 if(((unsigned)(level+threshold1))>threshold2){
4226 for(i=start_i; i<=last_non_zero; i++) {
4228 level = block[j] * qmat[j];
4230 // if( bias+level >= (1<<QMAT_SHIFT)
4231 // || bias-level >= (1<<QMAT_SHIFT)){
4232 if(((unsigned)(level+threshold1))>threshold2){
4234 level= (bias + level)>>QMAT_SHIFT;
4237 level= (bias - level)>>QMAT_SHIFT;
4245 *overflow= s->max_qcoeff < max; //overflow might have happened
4247 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4248 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4249 ff_block_permute(block, s->idsp.idct_permutation,
4250 scantable, last_non_zero);
4252 return last_non_zero;
4255 #define OFFSET(x) offsetof(MpegEncContext, x)
4256 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4257 static const AVOption h263_options[] = {
4258 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4259 { "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},
4260 { "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 },
4265 static const AVClass h263_class = {
4266 .class_name = "H.263 encoder",
4267 .item_name = av_default_item_name,
4268 .option = h263_options,
4269 .version = LIBAVUTIL_VERSION_INT,
4272 AVCodec ff_h263_encoder = {
4274 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4275 .type = AVMEDIA_TYPE_VIDEO,
4276 .id = AV_CODEC_ID_H263,
4277 .priv_data_size = sizeof(MpegEncContext),
4278 .init = ff_mpv_encode_init,
4279 .encode2 = ff_mpv_encode_picture,
4280 .close = ff_mpv_encode_end,
4281 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4282 .priv_class = &h263_class,
4285 static const AVOption h263p_options[] = {
4286 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4287 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4288 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4289 { "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},
4293 static const AVClass h263p_class = {
4294 .class_name = "H.263p encoder",
4295 .item_name = av_default_item_name,
4296 .option = h263p_options,
4297 .version = LIBAVUTIL_VERSION_INT,
4300 AVCodec ff_h263p_encoder = {
4302 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4303 .type = AVMEDIA_TYPE_VIDEO,
4304 .id = AV_CODEC_ID_H263P,
4305 .priv_data_size = sizeof(MpegEncContext),
4306 .init = ff_mpv_encode_init,
4307 .encode2 = ff_mpv_encode_picture,
4308 .close = ff_mpv_encode_end,
4309 .capabilities = CODEC_CAP_SLICE_THREADS,
4310 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4311 .priv_class = &h263p_class,
4314 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4316 AVCodec ff_msmpeg4v2_encoder = {
4317 .name = "msmpeg4v2",
4318 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4319 .type = AVMEDIA_TYPE_VIDEO,
4320 .id = AV_CODEC_ID_MSMPEG4V2,
4321 .priv_data_size = sizeof(MpegEncContext),
4322 .init = ff_mpv_encode_init,
4323 .encode2 = ff_mpv_encode_picture,
4324 .close = ff_mpv_encode_end,
4325 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4326 .priv_class = &msmpeg4v2_class,
4329 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4331 AVCodec ff_msmpeg4v3_encoder = {
4333 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4334 .type = AVMEDIA_TYPE_VIDEO,
4335 .id = AV_CODEC_ID_MSMPEG4V3,
4336 .priv_data_size = sizeof(MpegEncContext),
4337 .init = ff_mpv_encode_init,
4338 .encode2 = ff_mpv_encode_picture,
4339 .close = ff_mpv_encode_end,
4340 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4341 .priv_class = &msmpeg4v3_class,
4344 FF_MPV_GENERIC_CLASS(wmv1)
4346 AVCodec ff_wmv1_encoder = {
4348 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4349 .type = AVMEDIA_TYPE_VIDEO,
4350 .id = AV_CODEC_ID_WMV1,
4351 .priv_data_size = sizeof(MpegEncContext),
4352 .init = ff_mpv_encode_init,
4353 .encode2 = ff_mpv_encode_picture,
4354 .close = ff_mpv_encode_end,
4355 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4356 .priv_class = &wmv1_class,