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"
43 #include "mpegvideodata.h"
47 #include "mjpegenc_common.h"
49 #include "mpegutils.h"
52 #include "pixblockdsp.h"
56 #include "aandcttab.h"
58 #include "mpeg4video.h"
60 #include "bytestream.h"
66 #define QUANT_BIAS_SHIFT 8
68 #define QMAT_SHIFT_MMX 16
71 static int encode_picture(MpegEncContext *s, int picture_number);
72 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
73 static int sse_mb(MpegEncContext *s);
74 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
75 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
77 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
78 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
80 const AVOption ff_mpv_generic_options[] = {
85 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
86 uint16_t (*qmat16)[2][64],
87 const uint16_t *quant_matrix,
88 int bias, int qmin, int qmax, int intra)
90 FDCTDSPContext *fdsp = &s->fdsp;
94 for (qscale = qmin; qscale <= qmax; qscale++) {
96 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
98 fdsp->fdct == ff_faandct ||
99 #endif /* CONFIG_FAANDCT */
100 fdsp->fdct == ff_jpeg_fdct_islow_10) {
101 for (i = 0; i < 64; i++) {
102 const int j = s->idsp.idct_permutation[i];
103 int64_t den = (int64_t) qscale * quant_matrix[j];
104 /* 16 <= qscale * quant_matrix[i] <= 7905
105 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
106 * 19952 <= x <= 249205026
107 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
108 * 3444240 >= (1 << 36) / (x) >= 275 */
110 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
112 } else if (fdsp->fdct == ff_fdct_ifast) {
113 for (i = 0; i < 64; i++) {
114 const int j = s->idsp.idct_permutation[i];
115 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
116 /* 16 <= qscale * quant_matrix[i] <= 7905
117 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
118 * 19952 <= x <= 249205026
119 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
120 * 3444240 >= (1 << 36) / (x) >= 275 */
122 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
125 for (i = 0; i < 64; i++) {
126 const int j = s->idsp.idct_permutation[i];
127 int64_t den = (int64_t) qscale * quant_matrix[j];
128 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
129 * Assume x = qscale * quant_matrix[i]
131 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
132 * so 32768 >= (1 << 19) / (x) >= 67 */
133 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
134 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
135 // (qscale * quant_matrix[i]);
136 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
138 if (qmat16[qscale][0][i] == 0 ||
139 qmat16[qscale][0][i] == 128 * 256)
140 qmat16[qscale][0][i] = 128 * 256 - 1;
141 qmat16[qscale][1][i] =
142 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
143 qmat16[qscale][0][i]);
147 for (i = intra; i < 64; i++) {
149 if (fdsp->fdct == ff_fdct_ifast) {
150 max = (8191LL * ff_aanscales[i]) >> 14;
152 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
158 av_log(NULL, AV_LOG_INFO,
159 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
164 static inline void update_qscale(MpegEncContext *s)
166 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
167 (FF_LAMBDA_SHIFT + 7);
168 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
170 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
174 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
180 for (i = 0; i < 64; i++) {
181 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
188 * init s->current_picture.qscale_table from s->lambda_table
190 void ff_init_qscale_tab(MpegEncContext *s)
192 int8_t * const qscale_table = s->current_picture.qscale_table;
195 for (i = 0; i < s->mb_num; i++) {
196 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
197 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
198 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
203 static void update_duplicate_context_after_me(MpegEncContext *dst,
206 #define COPY(a) dst->a= src->a
208 COPY(current_picture);
214 COPY(picture_in_gop_number);
215 COPY(gop_picture_number);
216 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
217 COPY(progressive_frame); // FIXME don't set in encode_header
218 COPY(partitioned_frame); // FIXME don't set in encode_header
223 * Set the given MpegEncContext to defaults for encoding.
224 * the changed fields will not depend upon the prior state of the MpegEncContext.
226 static void mpv_encode_defaults(MpegEncContext *s)
229 ff_mpv_common_defaults(s);
231 for (i = -16; i < 16; i++) {
232 default_fcode_tab[i + MAX_MV] = 1;
234 s->me.mv_penalty = default_mv_penalty;
235 s->fcode_tab = default_fcode_tab;
237 s->input_picture_number = 0;
238 s->picture_in_gop_number = 0;
241 /* init video encoder */
242 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
244 MpegEncContext *s = avctx->priv_data;
245 AVCPBProperties *cpb_props;
246 int i, ret, format_supported;
248 mpv_encode_defaults(s);
250 switch (avctx->codec_id) {
251 case AV_CODEC_ID_MPEG2VIDEO:
252 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
253 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
254 av_log(avctx, AV_LOG_ERROR,
255 "only YUV420 and YUV422 are supported\n");
259 case AV_CODEC_ID_MJPEG:
260 format_supported = 0;
261 /* JPEG color space */
262 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
263 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
264 (avctx->color_range == AVCOL_RANGE_JPEG &&
265 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
266 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
267 format_supported = 1;
268 /* MPEG color space */
269 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
270 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
271 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
272 format_supported = 1;
274 if (!format_supported) {
275 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
280 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
281 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
286 switch (avctx->pix_fmt) {
287 case AV_PIX_FMT_YUVJ422P:
288 case AV_PIX_FMT_YUV422P:
289 s->chroma_format = CHROMA_422;
291 case AV_PIX_FMT_YUVJ420P:
292 case AV_PIX_FMT_YUV420P:
294 s->chroma_format = CHROMA_420;
298 #if FF_API_PRIVATE_OPT
299 FF_DISABLE_DEPRECATION_WARNINGS
300 if (avctx->rtp_payload_size)
301 s->rtp_payload_size = avctx->rtp_payload_size;
302 if (avctx->me_penalty_compensation)
303 s->me_penalty_compensation = avctx->me_penalty_compensation;
305 s->me_pre = avctx->pre_me;
306 FF_ENABLE_DEPRECATION_WARNINGS
309 s->bit_rate = avctx->bit_rate;
310 s->width = avctx->width;
311 s->height = avctx->height;
312 if (avctx->gop_size > 600 &&
313 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
314 av_log(avctx, AV_LOG_ERROR,
315 "Warning keyframe interval too large! reducing it ...\n");
316 avctx->gop_size = 600;
318 s->gop_size = avctx->gop_size;
320 if (avctx->max_b_frames > MAX_B_FRAMES) {
321 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
322 "is %d.\n", MAX_B_FRAMES);
324 s->max_b_frames = avctx->max_b_frames;
325 s->codec_id = avctx->codec->id;
326 s->strict_std_compliance = avctx->strict_std_compliance;
327 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
328 s->rtp_mode = !!s->rtp_payload_size;
329 s->intra_dc_precision = avctx->intra_dc_precision;
330 s->user_specified_pts = AV_NOPTS_VALUE;
332 if (s->gop_size <= 1) {
339 #if FF_API_MOTION_EST
340 FF_DISABLE_DEPRECATION_WARNINGS
341 s->me_method = avctx->me_method;
342 FF_ENABLE_DEPRECATION_WARNINGS
346 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
349 FF_DISABLE_DEPRECATION_WARNINGS
350 if (avctx->border_masking != 0.0)
351 s->border_masking = avctx->border_masking;
352 FF_ENABLE_DEPRECATION_WARNINGS
355 s->adaptive_quant = (s->avctx->lumi_masking ||
356 s->avctx->dark_masking ||
357 s->avctx->temporal_cplx_masking ||
358 s->avctx->spatial_cplx_masking ||
359 s->avctx->p_masking ||
361 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
364 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
366 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
367 av_log(avctx, AV_LOG_ERROR,
368 "a vbv buffer size is needed, "
369 "for encoding with a maximum bitrate\n");
373 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
374 av_log(avctx, AV_LOG_INFO,
375 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
378 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
379 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
383 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
384 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
388 if (avctx->rc_max_rate &&
389 avctx->rc_max_rate == avctx->bit_rate &&
390 avctx->rc_max_rate != avctx->rc_min_rate) {
391 av_log(avctx, AV_LOG_INFO,
392 "impossible bitrate constraints, this will fail\n");
395 if (avctx->rc_buffer_size &&
396 avctx->bit_rate * (int64_t)avctx->time_base.num >
397 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
398 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
402 if (!s->fixed_qscale &&
403 avctx->bit_rate * av_q2d(avctx->time_base) >
404 avctx->bit_rate_tolerance) {
405 av_log(avctx, AV_LOG_ERROR,
406 "bitrate tolerance too small for bitrate\n");
410 if (s->avctx->rc_max_rate &&
411 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
412 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
413 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
414 90000LL * (avctx->rc_buffer_size - 1) >
415 s->avctx->rc_max_rate * 0xFFFFLL) {
416 av_log(avctx, AV_LOG_INFO,
417 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
418 "specified vbv buffer is too large for the given bitrate!\n");
421 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
422 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
423 s->codec_id != AV_CODEC_ID_FLV1) {
424 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
428 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
429 av_log(avctx, AV_LOG_ERROR,
430 "OBMC is only supported with simple mb decision\n");
434 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
435 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
439 if (s->max_b_frames &&
440 s->codec_id != AV_CODEC_ID_MPEG4 &&
441 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
442 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
443 av_log(avctx, AV_LOG_ERROR, "B-frames not supported by codec\n");
447 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
448 s->codec_id == AV_CODEC_ID_H263 ||
449 s->codec_id == AV_CODEC_ID_H263P) &&
450 (avctx->sample_aspect_ratio.num > 255 ||
451 avctx->sample_aspect_ratio.den > 255)) {
452 av_log(avctx, AV_LOG_ERROR,
453 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
454 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
458 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
459 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
460 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
464 #if FF_API_PRIVATE_OPT
465 FF_DISABLE_DEPRECATION_WARNINGS
466 if (avctx->mpeg_quant)
467 s->mpeg_quant = avctx->mpeg_quant;
468 FF_ENABLE_DEPRECATION_WARNINGS
471 // FIXME mpeg2 uses that too
472 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
473 av_log(avctx, AV_LOG_ERROR,
474 "mpeg2 style quantization not supported by codec\n");
478 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
479 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
483 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
484 s->avctx->mb_decision != FF_MB_DECISION_RD) {
485 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
489 #if FF_API_PRIVATE_OPT
490 FF_DISABLE_DEPRECATION_WARNINGS
491 if (avctx->scenechange_threshold)
492 s->scenechange_threshold = avctx->scenechange_threshold;
493 FF_ENABLE_DEPRECATION_WARNINGS
496 if (s->scenechange_threshold < 1000000000 &&
497 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
498 av_log(avctx, AV_LOG_ERROR,
499 "closed gop with scene change detection are not supported yet, "
500 "set threshold to 1000000000\n");
504 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
505 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
506 av_log(avctx, AV_LOG_ERROR,
507 "low delay forcing is only available for mpeg2\n");
510 if (s->max_b_frames != 0) {
511 av_log(avctx, AV_LOG_ERROR,
512 "B-frames cannot be used with low delay\n");
517 if (s->q_scale_type == 1) {
518 if (avctx->qmax > 12) {
519 av_log(avctx, AV_LOG_ERROR,
520 "non linear quant only supports qmax <= 12 currently\n");
525 if (avctx->slices > 1 &&
526 (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
527 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
528 return AVERROR(EINVAL);
531 if (s->avctx->thread_count > 1 &&
532 s->codec_id != AV_CODEC_ID_MPEG4 &&
533 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
534 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
535 (s->codec_id != AV_CODEC_ID_H263P)) {
536 av_log(avctx, AV_LOG_ERROR,
537 "multi threaded encoding not supported by codec\n");
541 if (s->avctx->thread_count < 1) {
542 av_log(avctx, AV_LOG_ERROR,
543 "automatic thread number detection not supported by codec,"
548 if (!avctx->time_base.den || !avctx->time_base.num) {
549 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
553 #if FF_API_PRIVATE_OPT
554 FF_DISABLE_DEPRECATION_WARNINGS
555 if (avctx->b_frame_strategy)
556 s->b_frame_strategy = avctx->b_frame_strategy;
557 if (avctx->b_sensitivity != 40)
558 s->b_sensitivity = avctx->b_sensitivity;
559 FF_ENABLE_DEPRECATION_WARNINGS
562 if (s->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
563 av_log(avctx, AV_LOG_INFO,
564 "notice: b_frame_strategy only affects the first pass\n");
565 s->b_frame_strategy = 0;
568 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
570 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
571 avctx->time_base.den /= i;
572 avctx->time_base.num /= i;
576 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
577 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
578 // (a + x * 3 / 8) / x
579 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
580 s->inter_quant_bias = 0;
582 s->intra_quant_bias = 0;
584 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
587 #if FF_API_QUANT_BIAS
588 FF_DISABLE_DEPRECATION_WARNINGS
589 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
590 s->intra_quant_bias = avctx->intra_quant_bias;
591 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
592 s->inter_quant_bias = avctx->inter_quant_bias;
593 FF_ENABLE_DEPRECATION_WARNINGS
596 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
597 s->avctx->time_base.den > (1 << 16) - 1) {
598 av_log(avctx, AV_LOG_ERROR,
599 "timebase %d/%d not supported by MPEG 4 standard, "
600 "the maximum admitted value for the timebase denominator "
601 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
605 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
607 switch (avctx->codec->id) {
608 case AV_CODEC_ID_MPEG1VIDEO:
609 s->out_format = FMT_MPEG1;
610 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
611 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
613 case AV_CODEC_ID_MPEG2VIDEO:
614 s->out_format = FMT_MPEG1;
615 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
616 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
619 case AV_CODEC_ID_MJPEG:
620 s->out_format = FMT_MJPEG;
621 s->intra_only = 1; /* force intra only for jpeg */
622 if (!CONFIG_MJPEG_ENCODER ||
623 ff_mjpeg_encode_init(s) < 0)
628 case AV_CODEC_ID_H261:
629 if (!CONFIG_H261_ENCODER)
631 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
632 av_log(avctx, AV_LOG_ERROR,
633 "The specified picture size of %dx%d is not valid for the "
634 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
635 s->width, s->height);
638 s->out_format = FMT_H261;
641 s->rtp_mode = 0; /* Sliced encoding not supported */
643 case AV_CODEC_ID_H263:
644 if (!CONFIG_H263_ENCODER)
646 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
647 s->width, s->height) == 8) {
648 av_log(avctx, AV_LOG_INFO,
649 "The specified picture size of %dx%d is not valid for "
650 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
651 "352x288, 704x576, and 1408x1152."
652 "Try H.263+.\n", s->width, s->height);
655 s->out_format = FMT_H263;
659 case AV_CODEC_ID_H263P:
660 s->out_format = FMT_H263;
663 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
664 s->modified_quant = s->h263_aic;
665 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
666 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
669 /* These are just to be sure */
673 case AV_CODEC_ID_FLV1:
674 s->out_format = FMT_H263;
675 s->h263_flv = 2; /* format = 1; 11-bit codes */
676 s->unrestricted_mv = 1;
677 s->rtp_mode = 0; /* don't allow GOB */
681 case AV_CODEC_ID_RV10:
682 s->out_format = FMT_H263;
686 case AV_CODEC_ID_RV20:
687 s->out_format = FMT_H263;
690 s->modified_quant = 1;
694 s->unrestricted_mv = 0;
696 case AV_CODEC_ID_MPEG4:
697 s->out_format = FMT_H263;
699 s->unrestricted_mv = 1;
700 s->low_delay = s->max_b_frames ? 0 : 1;
701 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
703 case AV_CODEC_ID_MSMPEG4V2:
704 s->out_format = FMT_H263;
706 s->unrestricted_mv = 1;
707 s->msmpeg4_version = 2;
711 case AV_CODEC_ID_MSMPEG4V3:
712 s->out_format = FMT_H263;
714 s->unrestricted_mv = 1;
715 s->msmpeg4_version = 3;
716 s->flipflop_rounding = 1;
720 case AV_CODEC_ID_WMV1:
721 s->out_format = FMT_H263;
723 s->unrestricted_mv = 1;
724 s->msmpeg4_version = 4;
725 s->flipflop_rounding = 1;
729 case AV_CODEC_ID_WMV2:
730 s->out_format = FMT_H263;
732 s->unrestricted_mv = 1;
733 s->msmpeg4_version = 5;
734 s->flipflop_rounding = 1;
742 #if FF_API_PRIVATE_OPT
743 FF_DISABLE_DEPRECATION_WARNINGS
744 if (avctx->noise_reduction)
745 s->noise_reduction = avctx->noise_reduction;
746 FF_ENABLE_DEPRECATION_WARNINGS
749 avctx->has_b_frames = !s->low_delay;
753 s->progressive_frame =
754 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
755 AV_CODEC_FLAG_INTERLACED_ME) ||
760 if (ff_mpv_common_init(s) < 0)
764 ff_mpv_encode_init_x86(s);
766 ff_fdctdsp_init(&s->fdsp, avctx);
767 ff_me_cmp_init(&s->mecc, avctx);
768 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
769 ff_pixblockdsp_init(&s->pdsp, avctx);
770 ff_qpeldsp_init(&s->qdsp);
772 if (s->msmpeg4_version) {
773 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
774 2 * 2 * (MAX_LEVEL + 1) *
775 (MAX_RUN + 1) * 2 * sizeof(int), fail);
777 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
779 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
780 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
781 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
782 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
783 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
784 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
785 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
786 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
789 if (s->noise_reduction) {
790 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
791 2 * 64 * sizeof(uint16_t), fail);
794 if (CONFIG_H263_ENCODER)
795 ff_h263dsp_init(&s->h263dsp);
796 if (!s->dct_quantize)
797 s->dct_quantize = ff_dct_quantize_c;
799 s->denoise_dct = denoise_dct_c;
800 s->fast_dct_quantize = s->dct_quantize;
802 s->dct_quantize = dct_quantize_trellis_c;
804 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
805 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
807 if (s->slice_context_count > 1) {
810 if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P)
811 s->h263_slice_structured = 1;
814 s->quant_precision = 5;
816 #if FF_API_PRIVATE_OPT
817 FF_DISABLE_DEPRECATION_WARNINGS
818 if (avctx->frame_skip_threshold)
819 s->frame_skip_threshold = avctx->frame_skip_threshold;
820 if (avctx->frame_skip_factor)
821 s->frame_skip_factor = avctx->frame_skip_factor;
822 if (avctx->frame_skip_exp)
823 s->frame_skip_exp = avctx->frame_skip_exp;
824 if (avctx->frame_skip_cmp != FF_CMP_DCTMAX)
825 s->frame_skip_cmp = avctx->frame_skip_cmp;
826 FF_ENABLE_DEPRECATION_WARNINGS
829 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
830 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->frame_skip_cmp);
832 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
833 ff_h261_encode_init(s);
834 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
835 ff_h263_encode_init(s);
836 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
837 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
839 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
840 && s->out_format == FMT_MPEG1)
841 ff_mpeg1_encode_init(s);
844 for (i = 0; i < 64; i++) {
845 int j = s->idsp.idct_permutation[i];
846 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
848 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
849 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
850 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
852 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
855 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
856 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
858 if (s->avctx->intra_matrix)
859 s->intra_matrix[j] = s->avctx->intra_matrix[i];
860 if (s->avctx->inter_matrix)
861 s->inter_matrix[j] = s->avctx->inter_matrix[i];
864 /* precompute matrix */
865 /* for mjpeg, we do include qscale in the matrix */
866 if (s->out_format != FMT_MJPEG) {
867 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
868 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
870 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
871 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
875 #if FF_API_RC_STRATEGY
876 FF_DISABLE_DEPRECATION_WARNINGS
878 s->rc_strategy = s->avctx->rc_strategy;
879 FF_ENABLE_DEPRECATION_WARNINGS
882 if (ff_rate_control_init(s) < 0)
885 if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == 1) {
887 ret = ff_xvid_rate_control_init(s);
889 ret = AVERROR(ENOSYS);
890 av_log(s->avctx, AV_LOG_ERROR,
891 "Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
897 #if FF_API_ERROR_RATE
898 FF_DISABLE_DEPRECATION_WARNINGS
899 if (avctx->error_rate)
900 s->error_rate = avctx->error_rate;
901 FF_ENABLE_DEPRECATION_WARNINGS;
904 #if FF_API_NORMALIZE_AQP
905 FF_DISABLE_DEPRECATION_WARNINGS
906 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
907 s->mpv_flags |= FF_MPV_FLAG_NAQ;
908 FF_ENABLE_DEPRECATION_WARNINGS;
912 FF_DISABLE_DEPRECATION_WARNINGS
913 if (avctx->flags & CODEC_FLAG_MV0)
914 s->mpv_flags |= FF_MPV_FLAG_MV0;
915 FF_ENABLE_DEPRECATION_WARNINGS
919 FF_DISABLE_DEPRECATION_WARNINGS
920 if (avctx->rc_qsquish != 0.0)
921 s->rc_qsquish = avctx->rc_qsquish;
922 if (avctx->rc_qmod_amp != 0.0)
923 s->rc_qmod_amp = avctx->rc_qmod_amp;
924 if (avctx->rc_qmod_freq)
925 s->rc_qmod_freq = avctx->rc_qmod_freq;
926 if (avctx->rc_buffer_aggressivity != 1.0)
927 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
928 if (avctx->rc_initial_cplx != 0.0)
929 s->rc_initial_cplx = avctx->rc_initial_cplx;
931 s->lmin = avctx->lmin;
933 s->lmax = avctx->lmax;
937 s->rc_eq = av_strdup(avctx->rc_eq);
939 return AVERROR(ENOMEM);
941 FF_ENABLE_DEPRECATION_WARNINGS
944 #if FF_API_PRIVATE_OPT
945 FF_DISABLE_DEPRECATION_WARNINGS
946 if (avctx->brd_scale)
947 s->brd_scale = avctx->brd_scale;
949 if (avctx->prediction_method)
950 s->pred = avctx->prediction_method + 1;
951 FF_ENABLE_DEPRECATION_WARNINGS
954 if (s->b_frame_strategy == 2) {
955 for (i = 0; i < s->max_b_frames + 2; i++) {
956 s->tmp_frames[i] = av_frame_alloc();
957 if (!s->tmp_frames[i])
958 return AVERROR(ENOMEM);
960 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
961 s->tmp_frames[i]->width = s->width >> s->brd_scale;
962 s->tmp_frames[i]->height = s->height >> s->brd_scale;
964 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
970 cpb_props = ff_add_cpb_side_data(avctx);
972 return AVERROR(ENOMEM);
973 cpb_props->max_bitrate = avctx->rc_max_rate;
974 cpb_props->min_bitrate = avctx->rc_min_rate;
975 cpb_props->avg_bitrate = avctx->bit_rate;
976 cpb_props->buffer_size = avctx->rc_buffer_size;
980 ff_mpv_encode_end(avctx);
981 return AVERROR_UNKNOWN;
984 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
986 MpegEncContext *s = avctx->priv_data;
989 ff_rate_control_uninit(s);
991 if ((avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == 1)
992 ff_xvid_rate_control_uninit(s);
995 ff_mpv_common_end(s);
996 if (CONFIG_MJPEG_ENCODER &&
997 s->out_format == FMT_MJPEG)
998 ff_mjpeg_encode_close(s);
1000 av_freep(&avctx->extradata);
1002 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
1003 av_frame_free(&s->tmp_frames[i]);
1005 ff_free_picture_tables(&s->new_picture);
1006 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1008 av_freep(&s->avctx->stats_out);
1009 av_freep(&s->ac_stats);
1011 av_freep(&s->q_intra_matrix);
1012 av_freep(&s->q_inter_matrix);
1013 av_freep(&s->q_intra_matrix16);
1014 av_freep(&s->q_inter_matrix16);
1015 av_freep(&s->input_picture);
1016 av_freep(&s->reordered_input_picture);
1017 av_freep(&s->dct_offset);
1022 static int get_sae(uint8_t *src, int ref, int stride)
1027 for (y = 0; y < 16; y++) {
1028 for (x = 0; x < 16; x++) {
1029 acc += FFABS(src[x + y * stride] - ref);
1036 static int get_intra_count(MpegEncContext *s, uint8_t *src,
1037 uint8_t *ref, int stride)
1043 h = s->height & ~15;
1045 for (y = 0; y < h; y += 16) {
1046 for (x = 0; x < w; x += 16) {
1047 int offset = x + y * stride;
1048 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
1050 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
1051 int sae = get_sae(src + offset, mean, stride);
1053 acc += sae + 500 < sad;
1059 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
1061 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
1062 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
1063 s->mb_stride, s->mb_height, s->b8_stride,
1064 &s->linesize, &s->uvlinesize);
1067 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
1069 Picture *pic = NULL;
1071 int i, display_picture_number = 0, ret;
1072 int encoding_delay = s->max_b_frames ? s->max_b_frames
1073 : (s->low_delay ? 0 : 1);
1074 int flush_offset = 1;
1079 display_picture_number = s->input_picture_number++;
1081 if (pts != AV_NOPTS_VALUE) {
1082 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1084 int64_t last = s->user_specified_pts;
1087 av_log(s->avctx, AV_LOG_ERROR,
1088 "Error, Invalid timestamp=%"PRId64", "
1089 "last=%"PRId64"\n", pts, s->user_specified_pts);
1093 if (!s->low_delay && display_picture_number == 1)
1094 s->dts_delta = time - last;
1096 s->user_specified_pts = pts;
1098 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1099 s->user_specified_pts =
1100 pts = s->user_specified_pts + 1;
1101 av_log(s->avctx, AV_LOG_INFO,
1102 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1105 pts = display_picture_number;
1109 if (!pic_arg->buf[0] ||
1110 pic_arg->linesize[0] != s->linesize ||
1111 pic_arg->linesize[1] != s->uvlinesize ||
1112 pic_arg->linesize[2] != s->uvlinesize)
1114 if ((s->width & 15) || (s->height & 15))
1117 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1118 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1120 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1124 pic = &s->picture[i];
1128 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1131 ret = alloc_picture(s, pic, direct);
1136 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1137 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1138 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1141 int h_chroma_shift, v_chroma_shift;
1142 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1146 for (i = 0; i < 3; i++) {
1147 int src_stride = pic_arg->linesize[i];
1148 int dst_stride = i ? s->uvlinesize : s->linesize;
1149 int h_shift = i ? h_chroma_shift : 0;
1150 int v_shift = i ? v_chroma_shift : 0;
1151 int w = s->width >> h_shift;
1152 int h = s->height >> v_shift;
1153 uint8_t *src = pic_arg->data[i];
1154 uint8_t *dst = pic->f->data[i];
1156 if (!s->avctx->rc_buffer_size)
1157 dst += INPLACE_OFFSET;
1159 if (src_stride == dst_stride)
1160 memcpy(dst, src, src_stride * h);
1163 uint8_t *dst2 = dst;
1165 memcpy(dst2, src, w);
1170 if ((s->width & 15) || (s->height & 15)) {
1171 s->mpvencdsp.draw_edges(dst, dst_stride,
1180 ret = av_frame_copy_props(pic->f, pic_arg);
1184 pic->f->display_picture_number = display_picture_number;
1185 pic->f->pts = pts; // we set this here to avoid modifying pic_arg
1187 /* Flushing: When we have not received enough input frames,
1188 * ensure s->input_picture[0] contains the first picture */
1189 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1190 if (s->input_picture[flush_offset])
1193 if (flush_offset <= 1)
1196 encoding_delay = encoding_delay - flush_offset + 1;
1199 /* shift buffer entries */
1200 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1201 s->input_picture[i - flush_offset] = s->input_picture[i];
1203 s->input_picture[encoding_delay] = (Picture*) pic;
1208 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1212 int64_t score64 = 0;
1214 for (plane = 0; plane < 3; plane++) {
1215 const int stride = p->f->linesize[plane];
1216 const int bw = plane ? 1 : 2;
1217 for (y = 0; y < s->mb_height * bw; y++) {
1218 for (x = 0; x < s->mb_width * bw; x++) {
1219 int off = p->shared ? 0 : 16;
1220 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1221 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1222 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1224 switch (s->frame_skip_exp) {
1225 case 0: score = FFMAX(score, v); break;
1226 case 1: score += FFABS(v); break;
1227 case 2: score += v * v; break;
1228 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1229 case 4: score64 += v * v * (int64_t)(v * v); break;
1238 if (score64 < s->frame_skip_threshold)
1240 if (score64 < ((s->frame_skip_factor * (int64_t) s->lambda) >> 8))
1245 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1247 AVPacket pkt = { 0 };
1251 av_init_packet(&pkt);
1253 ret = avcodec_send_frame(c, frame);
1258 ret = avcodec_receive_packet(c, &pkt);
1261 av_packet_unref(&pkt);
1262 } else if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
1269 static int estimate_best_b_count(MpegEncContext *s)
1271 const AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1272 const int scale = s->brd_scale;
1273 int width = s->width >> scale;
1274 int height = s->height >> scale;
1275 int i, j, out_size, p_lambda, b_lambda, lambda2;
1276 int64_t best_rd = INT64_MAX;
1277 int best_b_count = -1;
1280 assert(scale >= 0 && scale <= 3);
1283 //s->next_picture_ptr->quality;
1284 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1285 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1286 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1287 if (!b_lambda) // FIXME we should do this somewhere else
1288 b_lambda = p_lambda;
1289 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1292 for (i = 0; i < s->max_b_frames + 2; i++) {
1293 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1294 s->next_picture_ptr;
1296 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1297 pre_input = *pre_input_ptr;
1299 if (!pre_input.shared && i) {
1300 pre_input.f->data[0] += INPLACE_OFFSET;
1301 pre_input.f->data[1] += INPLACE_OFFSET;
1302 pre_input.f->data[2] += INPLACE_OFFSET;
1305 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1306 s->tmp_frames[i]->linesize[0],
1307 pre_input.f->data[0],
1308 pre_input.f->linesize[0],
1310 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1311 s->tmp_frames[i]->linesize[1],
1312 pre_input.f->data[1],
1313 pre_input.f->linesize[1],
1314 width >> 1, height >> 1);
1315 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1316 s->tmp_frames[i]->linesize[2],
1317 pre_input.f->data[2],
1318 pre_input.f->linesize[2],
1319 width >> 1, height >> 1);
1323 for (j = 0; j < s->max_b_frames + 1; j++) {
1327 if (!s->input_picture[j])
1330 c = avcodec_alloc_context3(NULL);
1332 return AVERROR(ENOMEM);
1336 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1337 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1338 c->mb_decision = s->avctx->mb_decision;
1339 c->me_cmp = s->avctx->me_cmp;
1340 c->mb_cmp = s->avctx->mb_cmp;
1341 c->me_sub_cmp = s->avctx->me_sub_cmp;
1342 c->pix_fmt = AV_PIX_FMT_YUV420P;
1343 c->time_base = s->avctx->time_base;
1344 c->max_b_frames = s->max_b_frames;
1346 ret = avcodec_open2(c, codec, NULL);
1350 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1351 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1353 out_size = encode_frame(c, s->tmp_frames[0]);
1359 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1361 for (i = 0; i < s->max_b_frames + 1; i++) {
1362 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1364 s->tmp_frames[i + 1]->pict_type = is_p ?
1365 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1366 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1368 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1374 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1377 /* get the delayed frames */
1378 out_size = encode_frame(c, NULL);
1383 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1385 rd += c->error[0] + c->error[1] + c->error[2];
1393 avcodec_free_context(&c);
1398 return best_b_count;
1401 static int select_input_picture(MpegEncContext *s)
1405 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1406 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1407 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1409 /* set next picture type & ordering */
1410 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1411 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1412 !s->next_picture_ptr || s->intra_only) {
1413 s->reordered_input_picture[0] = s->input_picture[0];
1414 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1415 s->reordered_input_picture[0]->f->coded_picture_number =
1416 s->coded_picture_number++;
1420 if (s->frame_skip_threshold || s->frame_skip_factor) {
1421 if (s->picture_in_gop_number < s->gop_size &&
1422 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1423 // FIXME check that the gop check above is +-1 correct
1424 av_frame_unref(s->input_picture[0]->f);
1427 ff_vbv_update(s, 0);
1433 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1434 for (i = 0; i < s->max_b_frames + 1; i++) {
1435 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1437 if (pict_num >= s->rc_context.num_entries)
1439 if (!s->input_picture[i]) {
1440 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1444 s->input_picture[i]->f->pict_type =
1445 s->rc_context.entry[pict_num].new_pict_type;
1449 if (s->b_frame_strategy == 0) {
1450 b_frames = s->max_b_frames;
1451 while (b_frames && !s->input_picture[b_frames])
1453 } else if (s->b_frame_strategy == 1) {
1454 for (i = 1; i < s->max_b_frames + 1; i++) {
1455 if (s->input_picture[i] &&
1456 s->input_picture[i]->b_frame_score == 0) {
1457 s->input_picture[i]->b_frame_score =
1459 s->input_picture[i ]->f->data[0],
1460 s->input_picture[i - 1]->f->data[0],
1464 for (i = 0; i < s->max_b_frames + 1; i++) {
1465 if (!s->input_picture[i] ||
1466 s->input_picture[i]->b_frame_score - 1 >
1467 s->mb_num / s->b_sensitivity)
1471 b_frames = FFMAX(0, i - 1);
1474 for (i = 0; i < b_frames + 1; i++) {
1475 s->input_picture[i]->b_frame_score = 0;
1477 } else if (s->b_frame_strategy == 2) {
1478 b_frames = estimate_best_b_count(s);
1485 for (i = b_frames - 1; i >= 0; i--) {
1486 int type = s->input_picture[i]->f->pict_type;
1487 if (type && type != AV_PICTURE_TYPE_B)
1490 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1491 b_frames == s->max_b_frames) {
1492 av_log(s->avctx, AV_LOG_ERROR,
1493 "warning, too many B-frames in a row\n");
1496 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1497 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1498 s->gop_size > s->picture_in_gop_number) {
1499 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1501 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1503 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1507 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1508 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1511 s->reordered_input_picture[0] = s->input_picture[b_frames];
1512 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1513 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1514 s->reordered_input_picture[0]->f->coded_picture_number =
1515 s->coded_picture_number++;
1516 for (i = 0; i < b_frames; i++) {
1517 s->reordered_input_picture[i + 1] = s->input_picture[i];
1518 s->reordered_input_picture[i + 1]->f->pict_type =
1520 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1521 s->coded_picture_number++;
1526 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1528 if (s->reordered_input_picture[0]) {
1529 s->reordered_input_picture[0]->reference =
1530 s->reordered_input_picture[0]->f->pict_type !=
1531 AV_PICTURE_TYPE_B ? 3 : 0;
1533 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1536 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1537 // input is a shared pix, so we can't modify it -> allocate a new
1538 // one & ensure that the shared one is reuseable
1541 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1544 pic = &s->picture[i];
1546 pic->reference = s->reordered_input_picture[0]->reference;
1547 if (alloc_picture(s, pic, 0) < 0) {
1551 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1555 /* mark us unused / free shared pic */
1556 av_frame_unref(s->reordered_input_picture[0]->f);
1557 s->reordered_input_picture[0]->shared = 0;
1559 s->current_picture_ptr = pic;
1561 // input is not a shared pix -> reuse buffer for current_pix
1562 s->current_picture_ptr = s->reordered_input_picture[0];
1563 for (i = 0; i < 4; i++) {
1564 s->new_picture.f->data[i] += INPLACE_OFFSET;
1567 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1568 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1569 s->current_picture_ptr)) < 0)
1572 s->picture_number = s->new_picture.f->display_picture_number;
1577 static void frame_end(MpegEncContext *s)
1581 if (s->unrestricted_mv &&
1582 s->current_picture.reference &&
1584 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1585 int hshift = desc->log2_chroma_w;
1586 int vshift = desc->log2_chroma_h;
1587 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1588 s->h_edge_pos, s->v_edge_pos,
1589 EDGE_WIDTH, EDGE_WIDTH,
1590 EDGE_TOP | EDGE_BOTTOM);
1591 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1592 s->h_edge_pos >> hshift,
1593 s->v_edge_pos >> vshift,
1594 EDGE_WIDTH >> hshift,
1595 EDGE_WIDTH >> vshift,
1596 EDGE_TOP | EDGE_BOTTOM);
1597 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1598 s->h_edge_pos >> hshift,
1599 s->v_edge_pos >> vshift,
1600 EDGE_WIDTH >> hshift,
1601 EDGE_WIDTH >> vshift,
1602 EDGE_TOP | EDGE_BOTTOM);
1607 s->last_pict_type = s->pict_type;
1608 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1609 if (s->pict_type!= AV_PICTURE_TYPE_B)
1610 s->last_non_b_pict_type = s->pict_type;
1613 /* release non-reference frames */
1614 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1615 if (!s->picture[i].reference)
1616 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1620 #if FF_API_CODED_FRAME
1621 FF_DISABLE_DEPRECATION_WARNINGS
1622 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1623 FF_ENABLE_DEPRECATION_WARNINGS
1625 #if FF_API_ERROR_FRAME
1626 FF_DISABLE_DEPRECATION_WARNINGS
1627 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1628 sizeof(s->current_picture.encoding_error));
1629 FF_ENABLE_DEPRECATION_WARNINGS
1633 static void update_noise_reduction(MpegEncContext *s)
1637 for (intra = 0; intra < 2; intra++) {
1638 if (s->dct_count[intra] > (1 << 16)) {
1639 for (i = 0; i < 64; i++) {
1640 s->dct_error_sum[intra][i] >>= 1;
1642 s->dct_count[intra] >>= 1;
1645 for (i = 0; i < 64; i++) {
1646 s->dct_offset[intra][i] = (s->noise_reduction *
1647 s->dct_count[intra] +
1648 s->dct_error_sum[intra][i] / 2) /
1649 (s->dct_error_sum[intra][i] + 1);
1654 static int frame_start(MpegEncContext *s)
1658 /* mark & release old frames */
1659 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1660 s->last_picture_ptr != s->next_picture_ptr &&
1661 s->last_picture_ptr->f->buf[0]) {
1662 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1665 s->current_picture_ptr->f->pict_type = s->pict_type;
1666 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1668 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1669 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1670 s->current_picture_ptr)) < 0)
1673 if (s->pict_type != AV_PICTURE_TYPE_B) {
1674 s->last_picture_ptr = s->next_picture_ptr;
1676 s->next_picture_ptr = s->current_picture_ptr;
1679 if (s->last_picture_ptr) {
1680 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1681 if (s->last_picture_ptr->f->buf[0] &&
1682 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1683 s->last_picture_ptr)) < 0)
1686 if (s->next_picture_ptr) {
1687 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1688 if (s->next_picture_ptr->f->buf[0] &&
1689 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1690 s->next_picture_ptr)) < 0)
1694 if (s->picture_structure!= PICT_FRAME) {
1696 for (i = 0; i < 4; i++) {
1697 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1698 s->current_picture.f->data[i] +=
1699 s->current_picture.f->linesize[i];
1701 s->current_picture.f->linesize[i] *= 2;
1702 s->last_picture.f->linesize[i] *= 2;
1703 s->next_picture.f->linesize[i] *= 2;
1707 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1708 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1709 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1710 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1711 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1712 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1714 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1715 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1718 if (s->dct_error_sum) {
1719 assert(s->noise_reduction && s->encoding);
1720 update_noise_reduction(s);
1726 static void write_pass1_stats(MpegEncContext *s)
1728 snprintf(s->avctx->stats_out, 256,
1729 "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d "
1730 "fcode:%d bcode:%d mc-var:%d var:%d icount:%d skipcount:%d "
1732 s->current_picture_ptr->f->display_picture_number,
1733 s->current_picture_ptr->f->coded_picture_number,
1735 s->current_picture.f->quality,
1742 s->current_picture.mc_mb_var_sum,
1743 s->current_picture.mb_var_sum,
1744 s->i_count, s->skip_count,
1748 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1749 const AVFrame *pic_arg, int *got_packet)
1751 MpegEncContext *s = avctx->priv_data;
1752 int i, stuffing_count, ret;
1753 int context_count = s->slice_context_count;
1755 s->picture_in_gop_number++;
1757 if (load_input_picture(s, pic_arg) < 0)
1760 if (select_input_picture(s) < 0) {
1765 if (s->new_picture.f->data[0]) {
1768 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1771 s->mb_info_ptr = av_packet_new_side_data(pkt,
1772 AV_PKT_DATA_H263_MB_INFO,
1773 s->mb_width*s->mb_height*12);
1774 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1777 for (i = 0; i < context_count; i++) {
1778 int start_y = s->thread_context[i]->start_mb_y;
1779 int end_y = s->thread_context[i]-> end_mb_y;
1780 int h = s->mb_height;
1781 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1782 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1784 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1787 s->pict_type = s->new_picture.f->pict_type;
1789 ret = frame_start(s);
1793 if (encode_picture(s, s->picture_number) < 0)
1796 #if FF_API_STAT_BITS
1797 FF_DISABLE_DEPRECATION_WARNINGS
1798 avctx->header_bits = s->header_bits;
1799 avctx->mv_bits = s->mv_bits;
1800 avctx->misc_bits = s->misc_bits;
1801 avctx->i_tex_bits = s->i_tex_bits;
1802 avctx->p_tex_bits = s->p_tex_bits;
1803 avctx->i_count = s->i_count;
1804 // FIXME f/b_count in avctx
1805 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1806 avctx->skip_count = s->skip_count;
1807 FF_ENABLE_DEPRECATION_WARNINGS
1812 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1815 return AVERROR(ENOMEM);
1816 *(int *)sd = s->current_picture.f->quality;
1818 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1819 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1821 if (avctx->rc_buffer_size) {
1822 RateControlContext *rcc = &s->rc_context;
1823 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1825 if (put_bits_count(&s->pb) > max_size &&
1826 s->lambda < s->lmax) {
1827 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1828 (s->qscale + 1) / s->qscale);
1829 if (s->adaptive_quant) {
1831 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1832 s->lambda_table[i] =
1833 FFMAX(s->lambda_table[i] + 1,
1834 s->lambda_table[i] * (s->qscale + 1) /
1837 s->mb_skipped = 0; // done in frame_start()
1838 // done in encode_picture() so we must undo it
1839 if (s->pict_type == AV_PICTURE_TYPE_P) {
1840 if (s->flipflop_rounding ||
1841 s->codec_id == AV_CODEC_ID_H263P ||
1842 s->codec_id == AV_CODEC_ID_MPEG4)
1843 s->no_rounding ^= 1;
1845 if (s->pict_type != AV_PICTURE_TYPE_B) {
1846 s->time_base = s->last_time_base;
1847 s->last_non_b_time = s->time - s->pp_time;
1849 for (i = 0; i < context_count; i++) {
1850 PutBitContext *pb = &s->thread_context[i]->pb;
1851 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1856 assert(s->avctx->rc_max_rate);
1859 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1860 write_pass1_stats(s);
1862 for (i = 0; i < 4; i++) {
1863 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1864 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1867 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1868 assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits +
1869 s->misc_bits + s->i_tex_bits +
1871 flush_put_bits(&s->pb);
1872 s->frame_bits = put_bits_count(&s->pb);
1874 stuffing_count = ff_vbv_update(s, s->frame_bits);
1875 if (stuffing_count) {
1876 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1877 stuffing_count + 50) {
1878 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1882 switch (s->codec_id) {
1883 case AV_CODEC_ID_MPEG1VIDEO:
1884 case AV_CODEC_ID_MPEG2VIDEO:
1885 while (stuffing_count--) {
1886 put_bits(&s->pb, 8, 0);
1889 case AV_CODEC_ID_MPEG4:
1890 put_bits(&s->pb, 16, 0);
1891 put_bits(&s->pb, 16, 0x1C3);
1892 stuffing_count -= 4;
1893 while (stuffing_count--) {
1894 put_bits(&s->pb, 8, 0xFF);
1898 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1900 flush_put_bits(&s->pb);
1901 s->frame_bits = put_bits_count(&s->pb);
1904 /* update MPEG-1/2 vbv_delay for CBR */
1905 if (s->avctx->rc_max_rate &&
1906 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1907 s->out_format == FMT_MPEG1 &&
1908 90000LL * (avctx->rc_buffer_size - 1) <=
1909 s->avctx->rc_max_rate * 0xFFFFLL) {
1910 AVCPBProperties *props;
1913 int vbv_delay, min_delay;
1914 double inbits = s->avctx->rc_max_rate *
1915 av_q2d(s->avctx->time_base);
1916 int minbits = s->frame_bits - 8 *
1917 (s->vbv_delay_ptr - s->pb.buf - 1);
1918 double bits = s->rc_context.buffer_index + minbits - inbits;
1921 av_log(s->avctx, AV_LOG_ERROR,
1922 "Internal error, negative bits\n");
1924 assert(s->repeat_first_field == 0);
1926 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1927 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1928 s->avctx->rc_max_rate;
1930 vbv_delay = FFMAX(vbv_delay, min_delay);
1932 assert(vbv_delay < 0xFFFF);
1934 s->vbv_delay_ptr[0] &= 0xF8;
1935 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1936 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1937 s->vbv_delay_ptr[2] &= 0x07;
1938 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1940 props = av_cpb_properties_alloc(&props_size);
1942 return AVERROR(ENOMEM);
1943 props->vbv_delay = vbv_delay * 300;
1945 ret = av_packet_add_side_data(pkt, AV_PKT_DATA_CPB_PROPERTIES,
1946 (uint8_t*)props, props_size);
1952 #if FF_API_VBV_DELAY
1953 FF_DISABLE_DEPRECATION_WARNINGS
1954 avctx->vbv_delay = vbv_delay * 300;
1955 FF_ENABLE_DEPRECATION_WARNINGS
1958 s->total_bits += s->frame_bits;
1959 #if FF_API_STAT_BITS
1960 FF_DISABLE_DEPRECATION_WARNINGS
1961 avctx->frame_bits = s->frame_bits;
1962 FF_ENABLE_DEPRECATION_WARNINGS
1966 pkt->pts = s->current_picture.f->pts;
1967 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1968 if (!s->current_picture.f->coded_picture_number)
1969 pkt->dts = pkt->pts - s->dts_delta;
1971 pkt->dts = s->reordered_pts;
1972 s->reordered_pts = pkt->pts;
1974 pkt->dts = pkt->pts;
1975 if (s->current_picture.f->key_frame)
1976 pkt->flags |= AV_PKT_FLAG_KEY;
1978 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1982 assert((s->frame_bits & 7) == 0);
1984 pkt->size = s->frame_bits / 8;
1985 *got_packet = !!pkt->size;
1989 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1990 int n, int threshold)
1992 static const char tab[64] = {
1993 3, 2, 2, 1, 1, 1, 1, 1,
1994 1, 1, 1, 1, 1, 1, 1, 1,
1995 1, 1, 1, 1, 1, 1, 1, 1,
1996 0, 0, 0, 0, 0, 0, 0, 0,
1997 0, 0, 0, 0, 0, 0, 0, 0,
1998 0, 0, 0, 0, 0, 0, 0, 0,
1999 0, 0, 0, 0, 0, 0, 0, 0,
2000 0, 0, 0, 0, 0, 0, 0, 0
2005 int16_t *block = s->block[n];
2006 const int last_index = s->block_last_index[n];
2009 if (threshold < 0) {
2011 threshold = -threshold;
2015 /* Are all we could set to zero already zero? */
2016 if (last_index <= skip_dc - 1)
2019 for (i = 0; i <= last_index; i++) {
2020 const int j = s->intra_scantable.permutated[i];
2021 const int level = FFABS(block[j]);
2023 if (skip_dc && i == 0)
2027 } else if (level > 1) {
2033 if (score >= threshold)
2035 for (i = skip_dc; i <= last_index; i++) {
2036 const int j = s->intra_scantable.permutated[i];
2040 s->block_last_index[n] = 0;
2042 s->block_last_index[n] = -1;
2045 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
2049 const int maxlevel = s->max_qcoeff;
2050 const int minlevel = s->min_qcoeff;
2054 i = 1; // skip clipping of intra dc
2058 for (; i <= last_index; i++) {
2059 const int j = s->intra_scantable.permutated[i];
2060 int level = block[j];
2062 if (level > maxlevel) {
2065 } else if (level < minlevel) {
2073 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
2074 av_log(s->avctx, AV_LOG_INFO,
2075 "warning, clipping %d dct coefficients to %d..%d\n",
2076 overflow, minlevel, maxlevel);
2079 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
2083 for (y = 0; y < 8; y++) {
2084 for (x = 0; x < 8; x++) {
2090 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
2091 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
2092 int v = ptr[x2 + y2 * stride];
2098 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2103 static av_always_inline void encode_mb_internal(MpegEncContext *s,
2104 int motion_x, int motion_y,
2105 int mb_block_height,
2108 int16_t weight[8][64];
2109 int16_t orig[8][64];
2110 const int mb_x = s->mb_x;
2111 const int mb_y = s->mb_y;
2114 int dct_offset = s->linesize * 8; // default for progressive frames
2115 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2116 ptrdiff_t wrap_y, wrap_c;
2118 for (i = 0; i < mb_block_count; i++)
2119 skip_dct[i] = s->skipdct;
2121 if (s->adaptive_quant) {
2122 const int last_qp = s->qscale;
2123 const int mb_xy = mb_x + mb_y * s->mb_stride;
2125 s->lambda = s->lambda_table[mb_xy];
2128 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2129 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
2130 s->dquant = s->qscale - last_qp;
2132 if (s->out_format == FMT_H263) {
2133 s->dquant = av_clip(s->dquant, -2, 2);
2135 if (s->codec_id == AV_CODEC_ID_MPEG4) {
2137 if (s->pict_type == AV_PICTURE_TYPE_B) {
2138 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
2141 if (s->mv_type == MV_TYPE_8X8)
2147 ff_set_qscale(s, last_qp + s->dquant);
2148 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2149 ff_set_qscale(s, s->qscale + s->dquant);
2151 wrap_y = s->linesize;
2152 wrap_c = s->uvlinesize;
2153 ptr_y = s->new_picture.f->data[0] +
2154 (mb_y * 16 * wrap_y) + mb_x * 16;
2155 ptr_cb = s->new_picture.f->data[1] +
2156 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2157 ptr_cr = s->new_picture.f->data[2] +
2158 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2160 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
2161 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
2162 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2164 16, 16, mb_x * 16, mb_y * 16,
2165 s->width, s->height);
2167 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
2169 8, mb_block_height, mb_x * 8, mb_y * 8,
2170 s->width >> 1, s->height >> 1);
2171 ptr_cb = ebuf + 18 * wrap_y;
2172 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
2174 8, mb_block_height, mb_x * 8, mb_y * 8,
2175 s->width >> 1, s->height >> 1);
2176 ptr_cr = ebuf + 18 * wrap_y + 8;
2180 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2181 int progressive_score, interlaced_score;
2183 s->interlaced_dct = 0;
2184 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2185 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2186 NULL, wrap_y, 8) - 400;
2188 if (progressive_score > 0) {
2189 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2190 NULL, wrap_y * 2, 8) +
2191 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2192 NULL, wrap_y * 2, 8);
2193 if (progressive_score > interlaced_score) {
2194 s->interlaced_dct = 1;
2196 dct_offset = wrap_y;
2198 if (s->chroma_format == CHROMA_422)
2204 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2205 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2206 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2207 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2209 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2213 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2214 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2215 if (!s->chroma_y_shift) { /* 422 */
2216 s->pdsp.get_pixels(s->block[6],
2217 ptr_cb + (dct_offset >> 1), wrap_c);
2218 s->pdsp.get_pixels(s->block[7],
2219 ptr_cr + (dct_offset >> 1), wrap_c);
2223 op_pixels_func (*op_pix)[4];
2224 qpel_mc_func (*op_qpix)[16];
2225 uint8_t *dest_y, *dest_cb, *dest_cr;
2227 dest_y = s->dest[0];
2228 dest_cb = s->dest[1];
2229 dest_cr = s->dest[2];
2231 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2232 op_pix = s->hdsp.put_pixels_tab;
2233 op_qpix = s->qdsp.put_qpel_pixels_tab;
2235 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2236 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2239 if (s->mv_dir & MV_DIR_FORWARD) {
2240 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2241 s->last_picture.f->data,
2243 op_pix = s->hdsp.avg_pixels_tab;
2244 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2246 if (s->mv_dir & MV_DIR_BACKWARD) {
2247 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2248 s->next_picture.f->data,
2252 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2253 int progressive_score, interlaced_score;
2255 s->interlaced_dct = 0;
2256 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2257 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2261 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2262 progressive_score -= 400;
2264 if (progressive_score > 0) {
2265 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2267 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2271 if (progressive_score > interlaced_score) {
2272 s->interlaced_dct = 1;
2274 dct_offset = wrap_y;
2276 if (s->chroma_format == CHROMA_422)
2282 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2283 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2284 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2285 dest_y + dct_offset, wrap_y);
2286 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2287 dest_y + dct_offset + 8, wrap_y);
2289 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2293 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2294 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2295 if (!s->chroma_y_shift) { /* 422 */
2296 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2297 dest_cb + (dct_offset >> 1), wrap_c);
2298 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2299 dest_cr + (dct_offset >> 1), wrap_c);
2302 /* pre quantization */
2303 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2304 2 * s->qscale * s->qscale) {
2306 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2308 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2310 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2311 wrap_y, 8) < 20 * s->qscale)
2313 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2314 wrap_y, 8) < 20 * s->qscale)
2316 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2318 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2320 if (!s->chroma_y_shift) { /* 422 */
2321 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2322 dest_cb + (dct_offset >> 1),
2323 wrap_c, 8) < 20 * s->qscale)
2325 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2326 dest_cr + (dct_offset >> 1),
2327 wrap_c, 8) < 20 * s->qscale)
2333 if (s->quantizer_noise_shaping) {
2335 get_visual_weight(weight[0], ptr_y , wrap_y);
2337 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2339 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2341 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2343 get_visual_weight(weight[4], ptr_cb , wrap_c);
2345 get_visual_weight(weight[5], ptr_cr , wrap_c);
2346 if (!s->chroma_y_shift) { /* 422 */
2348 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2351 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2354 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2357 /* DCT & quantize */
2358 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2360 for (i = 0; i < mb_block_count; i++) {
2363 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2364 // FIXME we could decide to change to quantizer instead of
2366 // JS: I don't think that would be a good idea it could lower
2367 // quality instead of improve it. Just INTRADC clipping
2368 // deserves changes in quantizer
2370 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2372 s->block_last_index[i] = -1;
2374 if (s->quantizer_noise_shaping) {
2375 for (i = 0; i < mb_block_count; i++) {
2377 s->block_last_index[i] =
2378 dct_quantize_refine(s, s->block[i], weight[i],
2379 orig[i], i, s->qscale);
2384 if (s->luma_elim_threshold && !s->mb_intra)
2385 for (i = 0; i < 4; i++)
2386 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2387 if (s->chroma_elim_threshold && !s->mb_intra)
2388 for (i = 4; i < mb_block_count; i++)
2389 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2391 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2392 for (i = 0; i < mb_block_count; i++) {
2393 if (s->block_last_index[i] == -1)
2394 s->coded_score[i] = INT_MAX / 256;
2399 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2400 s->block_last_index[4] =
2401 s->block_last_index[5] = 0;
2403 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2406 // non c quantize code returns incorrect block_last_index FIXME
2407 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2408 for (i = 0; i < mb_block_count; i++) {
2410 if (s->block_last_index[i] > 0) {
2411 for (j = 63; j > 0; j--) {
2412 if (s->block[i][s->intra_scantable.permutated[j]])
2415 s->block_last_index[i] = j;
2420 /* huffman encode */
2421 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2422 case AV_CODEC_ID_MPEG1VIDEO:
2423 case AV_CODEC_ID_MPEG2VIDEO:
2424 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2425 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2427 case AV_CODEC_ID_MPEG4:
2428 if (CONFIG_MPEG4_ENCODER)
2429 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2431 case AV_CODEC_ID_MSMPEG4V2:
2432 case AV_CODEC_ID_MSMPEG4V3:
2433 case AV_CODEC_ID_WMV1:
2434 if (CONFIG_MSMPEG4_ENCODER)
2435 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2437 case AV_CODEC_ID_WMV2:
2438 if (CONFIG_WMV2_ENCODER)
2439 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2441 case AV_CODEC_ID_H261:
2442 if (CONFIG_H261_ENCODER)
2443 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2445 case AV_CODEC_ID_H263:
2446 case AV_CODEC_ID_H263P:
2447 case AV_CODEC_ID_FLV1:
2448 case AV_CODEC_ID_RV10:
2449 case AV_CODEC_ID_RV20:
2450 if (CONFIG_H263_ENCODER)
2451 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2453 case AV_CODEC_ID_MJPEG:
2454 if (CONFIG_MJPEG_ENCODER)
2455 ff_mjpeg_encode_mb(s, s->block);
2462 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2464 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2465 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2468 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2471 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2474 d->mb_skip_run= s->mb_skip_run;
2476 d->last_dc[i] = s->last_dc[i];
2479 d->mv_bits= s->mv_bits;
2480 d->i_tex_bits= s->i_tex_bits;
2481 d->p_tex_bits= s->p_tex_bits;
2482 d->i_count= s->i_count;
2483 d->f_count= s->f_count;
2484 d->b_count= s->b_count;
2485 d->skip_count= s->skip_count;
2486 d->misc_bits= s->misc_bits;
2490 d->qscale= s->qscale;
2491 d->dquant= s->dquant;
2493 d->esc3_level_length= s->esc3_level_length;
2496 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2499 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2500 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2503 d->mb_skip_run= s->mb_skip_run;
2505 d->last_dc[i] = s->last_dc[i];
2508 d->mv_bits= s->mv_bits;
2509 d->i_tex_bits= s->i_tex_bits;
2510 d->p_tex_bits= s->p_tex_bits;
2511 d->i_count= s->i_count;
2512 d->f_count= s->f_count;
2513 d->b_count= s->b_count;
2514 d->skip_count= s->skip_count;
2515 d->misc_bits= s->misc_bits;
2517 d->mb_intra= s->mb_intra;
2518 d->mb_skipped= s->mb_skipped;
2519 d->mv_type= s->mv_type;
2520 d->mv_dir= s->mv_dir;
2522 if(s->data_partitioning){
2524 d->tex_pb= s->tex_pb;
2528 d->block_last_index[i]= s->block_last_index[i];
2529 d->interlaced_dct= s->interlaced_dct;
2530 d->qscale= s->qscale;
2532 d->esc3_level_length= s->esc3_level_length;
2535 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2536 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2537 int *dmin, int *next_block, int motion_x, int motion_y)
2540 uint8_t *dest_backup[3];
2542 copy_context_before_encode(s, backup, type);
2544 s->block= s->blocks[*next_block];
2545 s->pb= pb[*next_block];
2546 if(s->data_partitioning){
2547 s->pb2 = pb2 [*next_block];
2548 s->tex_pb= tex_pb[*next_block];
2552 memcpy(dest_backup, s->dest, sizeof(s->dest));
2553 s->dest[0] = s->sc.rd_scratchpad;
2554 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2555 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2556 assert(s->linesize >= 32); //FIXME
2559 encode_mb(s, motion_x, motion_y);
2561 score= put_bits_count(&s->pb);
2562 if(s->data_partitioning){
2563 score+= put_bits_count(&s->pb2);
2564 score+= put_bits_count(&s->tex_pb);
2567 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2568 ff_mpv_decode_mb(s, s->block);
2570 score *= s->lambda2;
2571 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2575 memcpy(s->dest, dest_backup, sizeof(s->dest));
2582 copy_context_after_encode(best, s, type);
2586 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2587 uint32_t *sq = ff_square_tab + 256;
2592 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2593 else if(w==8 && h==8)
2594 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2598 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2607 static int sse_mb(MpegEncContext *s){
2611 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2612 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2615 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2616 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) +
2617 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) +
2618 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);
2620 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) +
2621 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) +
2622 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);
2625 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)
2626 +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)
2627 +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);
2630 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2631 MpegEncContext *s= *(void**)arg;
2635 s->me.dia_size= s->avctx->pre_dia_size;
2636 s->first_slice_line=1;
2637 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2638 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2639 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2641 s->first_slice_line=0;
2649 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2650 MpegEncContext *s= *(void**)arg;
2652 s->me.dia_size= s->avctx->dia_size;
2653 s->first_slice_line=1;
2654 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2655 s->mb_x=0; //for block init below
2656 ff_init_block_index(s);
2657 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2658 s->block_index[0]+=2;
2659 s->block_index[1]+=2;
2660 s->block_index[2]+=2;
2661 s->block_index[3]+=2;
2663 /* compute motion vector & mb_type and store in context */
2664 if(s->pict_type==AV_PICTURE_TYPE_B)
2665 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2667 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2669 s->first_slice_line=0;
2674 static int mb_var_thread(AVCodecContext *c, void *arg){
2675 MpegEncContext *s= *(void**)arg;
2678 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2679 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2682 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2684 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2686 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2687 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2689 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2690 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2691 s->me.mb_var_sum_temp += varc;
2697 static void write_slice_end(MpegEncContext *s){
2698 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2699 if(s->partitioned_frame){
2700 ff_mpeg4_merge_partitions(s);
2703 ff_mpeg4_stuffing(&s->pb);
2704 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2705 ff_mjpeg_encode_stuffing(&s->pb);
2708 avpriv_align_put_bits(&s->pb);
2709 flush_put_bits(&s->pb);
2711 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2712 s->misc_bits+= get_bits_diff(s);
2715 static void write_mb_info(MpegEncContext *s)
2717 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2718 int offset = put_bits_count(&s->pb);
2719 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2720 int gobn = s->mb_y / s->gob_index;
2722 if (CONFIG_H263_ENCODER)
2723 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2724 bytestream_put_le32(&ptr, offset);
2725 bytestream_put_byte(&ptr, s->qscale);
2726 bytestream_put_byte(&ptr, gobn);
2727 bytestream_put_le16(&ptr, mba);
2728 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2729 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2730 /* 4MV not implemented */
2731 bytestream_put_byte(&ptr, 0); /* hmv2 */
2732 bytestream_put_byte(&ptr, 0); /* vmv2 */
2735 static void update_mb_info(MpegEncContext *s, int startcode)
2739 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2740 s->mb_info_size += 12;
2741 s->prev_mb_info = s->last_mb_info;
2744 s->prev_mb_info = put_bits_count(&s->pb)/8;
2745 /* This might have incremented mb_info_size above, and we return without
2746 * actually writing any info into that slot yet. But in that case,
2747 * this will be called again at the start of the after writing the
2748 * start code, actually writing the mb info. */
2752 s->last_mb_info = put_bits_count(&s->pb)/8;
2753 if (!s->mb_info_size)
2754 s->mb_info_size += 12;
2758 static int encode_thread(AVCodecContext *c, void *arg){
2759 MpegEncContext *s= *(void**)arg;
2761 int chr_h= 16>>s->chroma_y_shift;
2763 MpegEncContext best_s = { 0 }, backup_s;
2764 uint8_t bit_buf[2][MAX_MB_BYTES];
2765 uint8_t bit_buf2[2][MAX_MB_BYTES];
2766 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2767 PutBitContext pb[2], pb2[2], tex_pb[2];
2770 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2771 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2772 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2775 s->last_bits= put_bits_count(&s->pb);
2786 /* init last dc values */
2787 /* note: quant matrix value (8) is implied here */
2788 s->last_dc[i] = 128 << s->intra_dc_precision;
2790 s->current_picture.encoding_error[i] = 0;
2793 memset(s->last_mv, 0, sizeof(s->last_mv));
2797 switch(s->codec_id){
2798 case AV_CODEC_ID_H263:
2799 case AV_CODEC_ID_H263P:
2800 case AV_CODEC_ID_FLV1:
2801 if (CONFIG_H263_ENCODER)
2802 s->gob_index = H263_GOB_HEIGHT(s->height);
2804 case AV_CODEC_ID_MPEG4:
2805 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2806 ff_mpeg4_init_partitions(s);
2812 s->first_slice_line = 1;
2813 s->ptr_lastgob = s->pb.buf;
2814 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2818 ff_set_qscale(s, s->qscale);
2819 ff_init_block_index(s);
2821 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2822 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2823 int mb_type= s->mb_type[xy];
2828 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2829 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2832 if(s->data_partitioning){
2833 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2834 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2835 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2841 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2842 ff_update_block_index(s);
2844 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2845 ff_h261_reorder_mb_index(s);
2846 xy= s->mb_y*s->mb_stride + s->mb_x;
2847 mb_type= s->mb_type[xy];
2850 /* write gob / video packet header */
2852 int current_packet_size, is_gob_start;
2854 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2856 is_gob_start = s->rtp_payload_size &&
2857 current_packet_size >= s->rtp_payload_size &&
2860 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2862 switch(s->codec_id){
2863 case AV_CODEC_ID_H263:
2864 case AV_CODEC_ID_H263P:
2865 if(!s->h263_slice_structured)
2866 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2868 case AV_CODEC_ID_MPEG2VIDEO:
2869 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2870 case AV_CODEC_ID_MPEG1VIDEO:
2871 if(s->mb_skip_run) is_gob_start=0;
2876 if(s->start_mb_y != mb_y || mb_x!=0){
2879 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2880 ff_mpeg4_init_partitions(s);
2884 assert((put_bits_count(&s->pb)&7) == 0);
2885 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2887 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2888 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2889 int d = 100 / s->error_rate;
2891 current_packet_size=0;
2892 s->pb.buf_ptr= s->ptr_lastgob;
2893 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2897 #if FF_API_RTP_CALLBACK
2898 FF_DISABLE_DEPRECATION_WARNINGS
2899 if (s->avctx->rtp_callback){
2900 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2901 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2903 FF_ENABLE_DEPRECATION_WARNINGS
2905 update_mb_info(s, 1);
2907 switch(s->codec_id){
2908 case AV_CODEC_ID_MPEG4:
2909 if (CONFIG_MPEG4_ENCODER) {
2910 ff_mpeg4_encode_video_packet_header(s);
2911 ff_mpeg4_clean_buffers(s);
2914 case AV_CODEC_ID_MPEG1VIDEO:
2915 case AV_CODEC_ID_MPEG2VIDEO:
2916 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2917 ff_mpeg1_encode_slice_header(s);
2918 ff_mpeg1_clean_buffers(s);
2921 case AV_CODEC_ID_H263:
2922 case AV_CODEC_ID_H263P:
2923 if (CONFIG_H263_ENCODER)
2924 ff_h263_encode_gob_header(s, mb_y);
2928 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2929 int bits= put_bits_count(&s->pb);
2930 s->misc_bits+= bits - s->last_bits;
2934 s->ptr_lastgob += current_packet_size;
2935 s->first_slice_line=1;
2936 s->resync_mb_x=mb_x;
2937 s->resync_mb_y=mb_y;
2941 if( (s->resync_mb_x == s->mb_x)
2942 && s->resync_mb_y+1 == s->mb_y){
2943 s->first_slice_line=0;
2947 s->dquant=0; //only for QP_RD
2949 update_mb_info(s, 0);
2951 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
2953 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2955 copy_context_before_encode(&backup_s, s, -1);
2957 best_s.data_partitioning= s->data_partitioning;
2958 best_s.partitioned_frame= s->partitioned_frame;
2959 if(s->data_partitioning){
2960 backup_s.pb2= s->pb2;
2961 backup_s.tex_pb= s->tex_pb;
2964 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2965 s->mv_dir = MV_DIR_FORWARD;
2966 s->mv_type = MV_TYPE_16X16;
2968 s->mv[0][0][0] = s->p_mv_table[xy][0];
2969 s->mv[0][0][1] = s->p_mv_table[xy][1];
2970 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2971 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2973 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2974 s->mv_dir = MV_DIR_FORWARD;
2975 s->mv_type = MV_TYPE_FIELD;
2978 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2979 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2980 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2982 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2983 &dmin, &next_block, 0, 0);
2985 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2986 s->mv_dir = MV_DIR_FORWARD;
2987 s->mv_type = MV_TYPE_16X16;
2991 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2992 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2994 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2995 s->mv_dir = MV_DIR_FORWARD;
2996 s->mv_type = MV_TYPE_8X8;
2999 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3000 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3002 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
3003 &dmin, &next_block, 0, 0);
3005 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
3006 s->mv_dir = MV_DIR_FORWARD;
3007 s->mv_type = MV_TYPE_16X16;
3009 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3010 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3011 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
3012 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3014 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
3015 s->mv_dir = MV_DIR_BACKWARD;
3016 s->mv_type = MV_TYPE_16X16;
3018 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3019 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3020 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
3021 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
3023 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
3024 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3025 s->mv_type = MV_TYPE_16X16;
3027 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3028 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3029 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3030 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3031 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
3032 &dmin, &next_block, 0, 0);
3034 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
3035 s->mv_dir = MV_DIR_FORWARD;
3036 s->mv_type = MV_TYPE_FIELD;
3039 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3040 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3041 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3043 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
3044 &dmin, &next_block, 0, 0);
3046 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
3047 s->mv_dir = MV_DIR_BACKWARD;
3048 s->mv_type = MV_TYPE_FIELD;
3051 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3052 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3053 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3055 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
3056 &dmin, &next_block, 0, 0);
3058 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
3059 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3060 s->mv_type = MV_TYPE_FIELD;
3062 for(dir=0; dir<2; dir++){
3064 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3065 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3066 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3069 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
3070 &dmin, &next_block, 0, 0);
3072 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
3074 s->mv_type = MV_TYPE_16X16;
3078 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
3079 &dmin, &next_block, 0, 0);
3080 if(s->h263_pred || s->h263_aic){
3082 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
3084 ff_clean_intra_table_entries(s); //old mode?
3088 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
3089 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
3090 const int last_qp= backup_s.qscale;
3093 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
3094 static const int dquant_tab[4]={-1,1,-2,2};
3096 assert(backup_s.dquant == 0);
3099 s->mv_dir= best_s.mv_dir;
3100 s->mv_type = MV_TYPE_16X16;
3101 s->mb_intra= best_s.mb_intra;
3102 s->mv[0][0][0] = best_s.mv[0][0][0];
3103 s->mv[0][0][1] = best_s.mv[0][0][1];
3104 s->mv[1][0][0] = best_s.mv[1][0][0];
3105 s->mv[1][0][1] = best_s.mv[1][0][1];
3107 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3108 for(; qpi<4; qpi++){
3109 int dquant= dquant_tab[qpi];
3110 qp= last_qp + dquant;
3111 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
3113 backup_s.dquant= dquant;
3114 if(s->mb_intra && s->dc_val[0]){
3116 dc[i]= s->dc_val[0][ s->block_index[i] ];
3117 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
3121 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3122 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
3123 if(best_s.qscale != qp){
3124 if(s->mb_intra && s->dc_val[0]){
3126 s->dc_val[0][ s->block_index[i] ]= dc[i];
3127 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
3134 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3135 int mx= s->b_direct_mv_table[xy][0];
3136 int my= s->b_direct_mv_table[xy][1];
3138 backup_s.dquant = 0;
3139 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3141 ff_mpeg4_set_direct_mv(s, mx, my);
3142 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3143 &dmin, &next_block, mx, my);
3145 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3146 backup_s.dquant = 0;
3147 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3149 ff_mpeg4_set_direct_mv(s, 0, 0);
3150 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3151 &dmin, &next_block, 0, 0);
3153 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3156 coded |= s->block_last_index[i];
3159 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3160 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3161 mx=my=0; //FIXME find the one we actually used
3162 ff_mpeg4_set_direct_mv(s, mx, my);
3163 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3171 s->mv_dir= best_s.mv_dir;
3172 s->mv_type = best_s.mv_type;
3174 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3175 s->mv[0][0][1] = best_s.mv[0][0][1];
3176 s->mv[1][0][0] = best_s.mv[1][0][0];
3177 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3180 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3181 &dmin, &next_block, mx, my);
3186 s->current_picture.qscale_table[xy] = best_s.qscale;
3188 copy_context_after_encode(s, &best_s, -1);
3190 pb_bits_count= put_bits_count(&s->pb);
3191 flush_put_bits(&s->pb);
3192 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3195 if(s->data_partitioning){
3196 pb2_bits_count= put_bits_count(&s->pb2);
3197 flush_put_bits(&s->pb2);
3198 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3199 s->pb2= backup_s.pb2;
3201 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3202 flush_put_bits(&s->tex_pb);
3203 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3204 s->tex_pb= backup_s.tex_pb;
3206 s->last_bits= put_bits_count(&s->pb);
3208 if (CONFIG_H263_ENCODER &&
3209 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3210 ff_h263_update_motion_val(s);
3212 if(next_block==0){ //FIXME 16 vs linesize16
3213 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3214 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3215 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3218 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3219 ff_mpv_decode_mb(s, s->block);
3221 int motion_x = 0, motion_y = 0;
3222 s->mv_type=MV_TYPE_16X16;
3223 // only one MB-Type possible
3226 case CANDIDATE_MB_TYPE_INTRA:
3229 motion_x= s->mv[0][0][0] = 0;
3230 motion_y= s->mv[0][0][1] = 0;
3232 case CANDIDATE_MB_TYPE_INTER:
3233 s->mv_dir = MV_DIR_FORWARD;
3235 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3236 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3238 case CANDIDATE_MB_TYPE_INTER_I:
3239 s->mv_dir = MV_DIR_FORWARD;
3240 s->mv_type = MV_TYPE_FIELD;
3243 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3244 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3245 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3248 case CANDIDATE_MB_TYPE_INTER4V:
3249 s->mv_dir = MV_DIR_FORWARD;
3250 s->mv_type = MV_TYPE_8X8;
3253 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3254 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3257 case CANDIDATE_MB_TYPE_DIRECT:
3258 if (CONFIG_MPEG4_ENCODER) {
3259 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3261 motion_x=s->b_direct_mv_table[xy][0];
3262 motion_y=s->b_direct_mv_table[xy][1];
3263 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3266 case CANDIDATE_MB_TYPE_DIRECT0:
3267 if (CONFIG_MPEG4_ENCODER) {
3268 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3270 ff_mpeg4_set_direct_mv(s, 0, 0);
3273 case CANDIDATE_MB_TYPE_BIDIR:
3274 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3276 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3277 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3278 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3279 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3281 case CANDIDATE_MB_TYPE_BACKWARD:
3282 s->mv_dir = MV_DIR_BACKWARD;
3284 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3285 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3287 case CANDIDATE_MB_TYPE_FORWARD:
3288 s->mv_dir = MV_DIR_FORWARD;
3290 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3291 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3293 case CANDIDATE_MB_TYPE_FORWARD_I:
3294 s->mv_dir = MV_DIR_FORWARD;
3295 s->mv_type = MV_TYPE_FIELD;
3298 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3299 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3300 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3303 case CANDIDATE_MB_TYPE_BACKWARD_I:
3304 s->mv_dir = MV_DIR_BACKWARD;
3305 s->mv_type = MV_TYPE_FIELD;
3308 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3309 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3310 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3313 case CANDIDATE_MB_TYPE_BIDIR_I:
3314 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3315 s->mv_type = MV_TYPE_FIELD;
3317 for(dir=0; dir<2; dir++){
3319 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3320 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3321 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3326 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3329 encode_mb(s, motion_x, motion_y);
3331 // RAL: Update last macroblock type
3332 s->last_mv_dir = s->mv_dir;
3334 if (CONFIG_H263_ENCODER &&
3335 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3336 ff_h263_update_motion_val(s);
3338 ff_mpv_decode_mb(s, s->block);
3341 /* clean the MV table in IPS frames for direct mode in B-frames */
3342 if(s->mb_intra /* && I,P,S_TYPE */){
3343 s->p_mv_table[xy][0]=0;
3344 s->p_mv_table[xy][1]=0;
3347 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3351 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3352 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3354 s->current_picture.encoding_error[0] += sse(
3355 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3356 s->dest[0], w, h, s->linesize);
3357 s->current_picture.encoding_error[1] += sse(
3358 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3359 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3360 s->current_picture.encoding_error[2] += sse(
3361 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3362 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3365 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3366 ff_h263_loop_filter(s);
3368 ff_dlog(s->avctx, "MB %d %d bits\n",
3369 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3373 //not beautiful here but we must write it before flushing so it has to be here
3374 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3375 ff_msmpeg4_encode_ext_header(s);
3379 #if FF_API_RTP_CALLBACK
3380 FF_DISABLE_DEPRECATION_WARNINGS
3381 /* Send the last GOB if RTP */
3382 if (s->avctx->rtp_callback) {
3383 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3384 int pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3385 /* Call the RTP callback to send the last GOB */
3387 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3389 FF_ENABLE_DEPRECATION_WARNINGS
3395 #define MERGE(field) dst->field += src->field; src->field=0
3396 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3397 MERGE(me.scene_change_score);
3398 MERGE(me.mc_mb_var_sum_temp);
3399 MERGE(me.mb_var_sum_temp);
3402 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3405 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3406 MERGE(dct_count[1]);
3415 MERGE(er.error_count);
3416 MERGE(padding_bug_score);
3417 MERGE(current_picture.encoding_error[0]);
3418 MERGE(current_picture.encoding_error[1]);
3419 MERGE(current_picture.encoding_error[2]);
3421 if (dst->noise_reduction){
3422 for(i=0; i<64; i++){
3423 MERGE(dct_error_sum[0][i]);
3424 MERGE(dct_error_sum[1][i]);
3428 assert(put_bits_count(&src->pb) % 8 ==0);
3429 assert(put_bits_count(&dst->pb) % 8 ==0);
3430 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3431 flush_put_bits(&dst->pb);
3434 static int estimate_qp(MpegEncContext *s, int dry_run){
3435 if (s->next_lambda){
3436 s->current_picture_ptr->f->quality =
3437 s->current_picture.f->quality = s->next_lambda;
3438 if(!dry_run) s->next_lambda= 0;
3439 } else if (!s->fixed_qscale) {
3442 if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == 1)
3443 quality = ff_xvid_rate_estimate_qscale(s, dry_run);
3446 quality = ff_rate_estimate_qscale(s, dry_run);
3447 s->current_picture_ptr->f->quality =
3448 s->current_picture.f->quality = quality;
3449 if (s->current_picture.f->quality < 0)
3453 if(s->adaptive_quant){
3454 switch(s->codec_id){
3455 case AV_CODEC_ID_MPEG4:
3456 if (CONFIG_MPEG4_ENCODER)
3457 ff_clean_mpeg4_qscales(s);
3459 case AV_CODEC_ID_H263:
3460 case AV_CODEC_ID_H263P:
3461 case AV_CODEC_ID_FLV1:
3462 if (CONFIG_H263_ENCODER)
3463 ff_clean_h263_qscales(s);
3466 ff_init_qscale_tab(s);
3469 s->lambda= s->lambda_table[0];
3472 s->lambda = s->current_picture.f->quality;
3477 /* must be called before writing the header */
3478 static void set_frame_distances(MpegEncContext * s){
3479 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3480 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3482 if(s->pict_type==AV_PICTURE_TYPE_B){
3483 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3484 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3486 s->pp_time= s->time - s->last_non_b_time;
3487 s->last_non_b_time= s->time;
3488 assert(s->picture_number==0 || s->pp_time > 0);
3492 static int encode_picture(MpegEncContext *s, int picture_number)
3496 int context_count = s->slice_context_count;
3498 s->picture_number = picture_number;
3500 /* Reset the average MB variance */
3501 s->me.mb_var_sum_temp =
3502 s->me.mc_mb_var_sum_temp = 0;
3504 /* we need to initialize some time vars before we can encode B-frames */
3505 // RAL: Condition added for MPEG1VIDEO
3506 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3507 set_frame_distances(s);
3508 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3509 ff_set_mpeg4_time(s);
3511 s->me.scene_change_score=0;
3513 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3515 if(s->pict_type==AV_PICTURE_TYPE_I){
3516 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3517 else s->no_rounding=0;
3518 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3519 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3520 s->no_rounding ^= 1;
3523 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3524 if (estimate_qp(s,1) < 0)
3526 ff_get_2pass_fcode(s);
3527 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3528 if(s->pict_type==AV_PICTURE_TYPE_B)
3529 s->lambda= s->last_lambda_for[s->pict_type];
3531 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3535 s->mb_intra=0; //for the rate distortion & bit compare functions
3536 for(i=1; i<context_count; i++){
3537 ret = ff_update_duplicate_context(s->thread_context[i], s);
3545 /* Estimate motion for every MB */
3546 if(s->pict_type != AV_PICTURE_TYPE_I){
3547 s->lambda = (s->lambda * s->me_penalty_compensation + 128) >> 8;
3548 s->lambda2 = (s->lambda2 * (int64_t) s->me_penalty_compensation + 128) >> 8;
3549 if (s->pict_type != AV_PICTURE_TYPE_B) {
3550 if ((s->me_pre && s->last_non_b_pict_type == AV_PICTURE_TYPE_I) ||
3552 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3556 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3557 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3559 for(i=0; i<s->mb_stride*s->mb_height; i++)
3560 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3562 if(!s->fixed_qscale){
3563 /* finding spatial complexity for I-frame rate control */
3564 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3567 for(i=1; i<context_count; i++){
3568 merge_context_after_me(s, s->thread_context[i]);
3570 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3571 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3574 if (s->me.scene_change_score > s->scenechange_threshold &&
3575 s->pict_type == AV_PICTURE_TYPE_P) {
3576 s->pict_type= AV_PICTURE_TYPE_I;
3577 for(i=0; i<s->mb_stride*s->mb_height; i++)
3578 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3579 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3580 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3584 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3585 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3587 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3589 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3590 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3591 s->f_code= FFMAX3(s->f_code, a, b);
3594 ff_fix_long_p_mvs(s);
3595 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3596 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3600 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3601 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3606 if(s->pict_type==AV_PICTURE_TYPE_B){
3609 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3610 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3611 s->f_code = FFMAX(a, b);
3613 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3614 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3615 s->b_code = FFMAX(a, b);
3617 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3618 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3619 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3620 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3621 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3623 for(dir=0; dir<2; dir++){
3626 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3627 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3628 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3629 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3637 if (estimate_qp(s, 0) < 0)
3640 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3641 s->pict_type == AV_PICTURE_TYPE_I &&
3642 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3643 s->qscale= 3; //reduce clipping problems
3645 if (s->out_format == FMT_MJPEG) {
3646 /* for mjpeg, we do include qscale in the matrix */
3648 int j = s->idsp.idct_permutation[i];
3650 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3652 s->y_dc_scale_table=
3653 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3654 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3655 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3656 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3660 //FIXME var duplication
3661 s->current_picture_ptr->f->key_frame =
3662 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3663 s->current_picture_ptr->f->pict_type =
3664 s->current_picture.f->pict_type = s->pict_type;
3666 if (s->current_picture.f->key_frame)
3667 s->picture_in_gop_number=0;
3669 s->last_bits= put_bits_count(&s->pb);
3670 switch(s->out_format) {
3672 if (CONFIG_MJPEG_ENCODER)
3673 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3674 s->pred, s->intra_matrix);
3677 if (CONFIG_H261_ENCODER)
3678 ff_h261_encode_picture_header(s, picture_number);
3681 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3682 ff_wmv2_encode_picture_header(s, picture_number);
3683 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3684 ff_msmpeg4_encode_picture_header(s, picture_number);
3685 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3686 ff_mpeg4_encode_picture_header(s, picture_number);
3687 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3688 ret = ff_rv10_encode_picture_header(s, picture_number);
3692 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3693 ff_rv20_encode_picture_header(s, picture_number);
3694 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3695 ff_flv_encode_picture_header(s, picture_number);
3696 else if (CONFIG_H263_ENCODER)
3697 ff_h263_encode_picture_header(s, picture_number);
3700 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3701 ff_mpeg1_encode_picture_header(s, picture_number);
3706 bits= put_bits_count(&s->pb);
3707 s->header_bits= bits - s->last_bits;
3709 for(i=1; i<context_count; i++){
3710 update_duplicate_context_after_me(s->thread_context[i], s);
3712 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3713 for(i=1; i<context_count; i++){
3714 merge_context_after_encode(s, s->thread_context[i]);
3720 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3721 const int intra= s->mb_intra;
3724 s->dct_count[intra]++;
3726 for(i=0; i<64; i++){
3727 int level= block[i];
3731 s->dct_error_sum[intra][i] += level;
3732 level -= s->dct_offset[intra][i];
3733 if(level<0) level=0;
3735 s->dct_error_sum[intra][i] -= level;
3736 level += s->dct_offset[intra][i];
3737 if(level>0) level=0;
3744 static int dct_quantize_trellis_c(MpegEncContext *s,
3745 int16_t *block, int n,
3746 int qscale, int *overflow){
3748 const uint8_t *scantable= s->intra_scantable.scantable;
3749 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3751 unsigned int threshold1, threshold2;
3763 int coeff_count[64];
3764 int qmul, qadd, start_i, last_non_zero, i, dc;
3765 const int esc_length= s->ac_esc_length;
3767 uint8_t * last_length;
3768 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3770 s->fdsp.fdct(block);
3772 if(s->dct_error_sum)
3773 s->denoise_dct(s, block);
3775 qadd= ((qscale-1)|1)*8;
3786 /* For AIC we skip quant/dequant of INTRADC */
3791 /* note: block[0] is assumed to be positive */
3792 block[0] = (block[0] + (q >> 1)) / q;
3795 qmat = s->q_intra_matrix[qscale];
3796 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3797 bias= 1<<(QMAT_SHIFT-1);
3798 length = s->intra_ac_vlc_length;
3799 last_length= s->intra_ac_vlc_last_length;
3803 qmat = s->q_inter_matrix[qscale];
3804 length = s->inter_ac_vlc_length;
3805 last_length= s->inter_ac_vlc_last_length;
3809 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3810 threshold2= (threshold1<<1);
3812 for(i=63; i>=start_i; i--) {
3813 const int j = scantable[i];
3814 int level = block[j] * qmat[j];
3816 if(((unsigned)(level+threshold1))>threshold2){
3822 for(i=start_i; i<=last_non_zero; i++) {
3823 const int j = scantable[i];
3824 int level = block[j] * qmat[j];
3826 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3827 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3828 if(((unsigned)(level+threshold1))>threshold2){
3830 level= (bias + level)>>QMAT_SHIFT;
3832 coeff[1][i]= level-1;
3833 // coeff[2][k]= level-2;
3835 level= (bias - level)>>QMAT_SHIFT;
3836 coeff[0][i]= -level;
3837 coeff[1][i]= -level+1;
3838 // coeff[2][k]= -level+2;
3840 coeff_count[i]= FFMIN(level, 2);
3841 assert(coeff_count[i]);
3844 coeff[0][i]= (level>>31)|1;
3849 *overflow= s->max_qcoeff < max; //overflow might have happened
3851 if(last_non_zero < start_i){
3852 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3853 return last_non_zero;
3856 score_tab[start_i]= 0;
3857 survivor[0]= start_i;
3860 for(i=start_i; i<=last_non_zero; i++){
3861 int level_index, j, zero_distortion;
3862 int dct_coeff= FFABS(block[ scantable[i] ]);
3863 int best_score=256*256*256*120;
3865 if (s->fdsp.fdct == ff_fdct_ifast)
3866 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3867 zero_distortion= dct_coeff*dct_coeff;
3869 for(level_index=0; level_index < coeff_count[i]; level_index++){
3871 int level= coeff[level_index][i];
3872 const int alevel= FFABS(level);
3877 if(s->out_format == FMT_H263){
3878 unquant_coeff= alevel*qmul + qadd;
3880 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3882 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3883 unquant_coeff = (unquant_coeff - 1) | 1;
3885 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3886 unquant_coeff = (unquant_coeff - 1) | 1;
3891 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3893 if((level&(~127)) == 0){
3894 for(j=survivor_count-1; j>=0; j--){
3895 int run= i - survivor[j];
3896 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3897 score += score_tab[i-run];
3899 if(score < best_score){
3902 level_tab[i+1]= level-64;
3906 if(s->out_format == FMT_H263){
3907 for(j=survivor_count-1; j>=0; j--){
3908 int run= i - survivor[j];
3909 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3910 score += score_tab[i-run];
3911 if(score < last_score){
3914 last_level= level-64;
3920 distortion += esc_length*lambda;
3921 for(j=survivor_count-1; j>=0; j--){
3922 int run= i - survivor[j];
3923 int score= distortion + score_tab[i-run];
3925 if(score < best_score){
3928 level_tab[i+1]= level-64;
3932 if(s->out_format == FMT_H263){
3933 for(j=survivor_count-1; j>=0; j--){
3934 int run= i - survivor[j];
3935 int score= distortion + score_tab[i-run];
3936 if(score < last_score){
3939 last_level= level-64;
3947 score_tab[i+1]= best_score;
3949 // Note: there is a vlc code in MPEG-4 which is 1 bit shorter then another one with a shorter run and the same level
3950 if(last_non_zero <= 27){
3951 for(; survivor_count; survivor_count--){
3952 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3956 for(; survivor_count; survivor_count--){
3957 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3962 survivor[ survivor_count++ ]= i+1;
3965 if(s->out_format != FMT_H263){
3966 last_score= 256*256*256*120;
3967 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3968 int score= score_tab[i];
3970 score += lambda * 2; // FIXME more exact?
3972 if(score < last_score){
3975 last_level= level_tab[i];
3976 last_run= run_tab[i];
3981 s->coded_score[n] = last_score;
3983 dc= FFABS(block[0]);
3984 last_non_zero= last_i - 1;
3985 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3987 if(last_non_zero < start_i)
3988 return last_non_zero;
3990 if(last_non_zero == 0 && start_i == 0){
3992 int best_score= dc * dc;
3994 for(i=0; i<coeff_count[0]; i++){
3995 int level= coeff[i][0];
3996 int alevel= FFABS(level);
3997 int unquant_coeff, score, distortion;
3999 if(s->out_format == FMT_H263){
4000 unquant_coeff= (alevel*qmul + qadd)>>3;
4002 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
4003 unquant_coeff = (unquant_coeff - 1) | 1;
4005 unquant_coeff = (unquant_coeff + 4) >> 3;
4006 unquant_coeff<<= 3 + 3;
4008 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
4010 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
4011 else score= distortion + esc_length*lambda;
4013 if(score < best_score){
4015 best_level= level - 64;
4018 block[0]= best_level;
4019 s->coded_score[n] = best_score - dc*dc;
4020 if(best_level == 0) return -1;
4021 else return last_non_zero;
4027 block[ perm_scantable[last_non_zero] ]= last_level;
4030 for(; i>start_i; i -= run_tab[i] + 1){
4031 block[ perm_scantable[i-1] ]= level_tab[i];
4034 return last_non_zero;
4037 //#define REFINE_STATS 1
4038 static int16_t basis[64][64];
4040 static void build_basis(uint8_t *perm){
4047 double s= 0.25*(1<<BASIS_SHIFT);
4049 int perm_index= perm[index];
4050 if(i==0) s*= sqrt(0.5);
4051 if(j==0) s*= sqrt(0.5);
4052 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)));
4059 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
4060 int16_t *block, int16_t *weight, int16_t *orig,
4063 LOCAL_ALIGNED_16(int16_t, d1, [64]);
4064 const uint8_t *scantable= s->intra_scantable.scantable;
4065 const uint8_t *perm_scantable= s->intra_scantable.permutated;
4066 // unsigned int threshold1, threshold2;
4071 int qmul, qadd, start_i, last_non_zero, i, dc;
4073 uint8_t * last_length;
4075 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
4078 static int after_last=0;
4079 static int to_zero=0;
4080 static int from_zero=0;
4083 static int messed_sign=0;
4086 if(basis[0][0] == 0)
4087 build_basis(s->idsp.idct_permutation);
4098 /* For AIC we skip quant/dequant of INTRADC */
4102 q <<= RECON_SHIFT-3;
4103 /* note: block[0] is assumed to be positive */
4105 // block[0] = (block[0] + (q >> 1)) / q;
4107 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4108 // bias= 1<<(QMAT_SHIFT-1);
4109 length = s->intra_ac_vlc_length;
4110 last_length= s->intra_ac_vlc_last_length;
4114 length = s->inter_ac_vlc_length;
4115 last_length= s->inter_ac_vlc_last_length;
4117 last_non_zero = s->block_last_index[n];
4122 dc += (1<<(RECON_SHIFT-1));
4123 for(i=0; i<64; i++){
4124 rem[i] = dc - (orig[i] << RECON_SHIFT); // FIXME use orig directly instead of copying to rem[]
4127 STOP_TIMER("memset rem[]")}
4130 for(i=0; i<64; i++){
4135 w= FFABS(weight[i]) + qns*one;
4136 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4139 // w=weight[i] = (63*qns + (w/2)) / w;
4145 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4151 for(i=start_i; i<=last_non_zero; i++){
4152 int j= perm_scantable[i];
4153 const int level= block[j];
4157 if(level<0) coeff= qmul*level - qadd;
4158 else coeff= qmul*level + qadd;
4159 run_tab[rle_index++]=run;
4162 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4168 if(last_non_zero>0){
4169 STOP_TIMER("init rem[]")
4176 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4179 int run2, best_unquant_change=0, analyze_gradient;
4183 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4185 if(analyze_gradient){
4189 for(i=0; i<64; i++){
4192 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4195 STOP_TIMER("rem*w*w")}
4205 const int level= block[0];
4206 int change, old_coeff;
4208 assert(s->mb_intra);
4212 for(change=-1; change<=1; change+=2){
4213 int new_level= level + change;
4214 int score, new_coeff;
4216 new_coeff= q*new_level;
4217 if(new_coeff >= 2048 || new_coeff < 0)
4220 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4221 new_coeff - old_coeff);
4222 if(score<best_score){
4225 best_change= change;
4226 best_unquant_change= new_coeff - old_coeff;
4233 run2= run_tab[rle_index++];
4237 for(i=start_i; i<64; i++){
4238 int j= perm_scantable[i];
4239 const int level= block[j];
4240 int change, old_coeff;
4242 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4246 if(level<0) old_coeff= qmul*level - qadd;
4247 else old_coeff= qmul*level + qadd;
4248 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4252 assert(run2>=0 || i >= last_non_zero );
4255 for(change=-1; change<=1; change+=2){
4256 int new_level= level + change;
4257 int score, new_coeff, unquant_change;
4260 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4264 if(new_level<0) new_coeff= qmul*new_level - qadd;
4265 else new_coeff= qmul*new_level + qadd;
4266 if(new_coeff >= 2048 || new_coeff <= -2048)
4268 //FIXME check for overflow
4271 if(level < 63 && level > -63){
4272 if(i < last_non_zero)
4273 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4274 - length[UNI_AC_ENC_INDEX(run, level+64)];
4276 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4277 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4280 assert(FFABS(new_level)==1);
4282 if(analyze_gradient){
4283 int g= d1[ scantable[i] ];
4284 if(g && (g^new_level) >= 0)
4288 if(i < last_non_zero){
4289 int next_i= i + run2 + 1;
4290 int next_level= block[ perm_scantable[next_i] ] + 64;
4292 if(next_level&(~127))
4295 if(next_i < last_non_zero)
4296 score += length[UNI_AC_ENC_INDEX(run, 65)]
4297 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4298 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4300 score += length[UNI_AC_ENC_INDEX(run, 65)]
4301 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4302 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4304 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4306 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4307 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4313 assert(FFABS(level)==1);
4315 if(i < last_non_zero){
4316 int next_i= i + run2 + 1;
4317 int next_level= block[ perm_scantable[next_i] ] + 64;
4319 if(next_level&(~127))
4322 if(next_i < last_non_zero)
4323 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4324 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4325 - length[UNI_AC_ENC_INDEX(run, 65)];
4327 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4328 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4329 - length[UNI_AC_ENC_INDEX(run, 65)];
4331 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4333 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4334 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4341 unquant_change= new_coeff - old_coeff;
4342 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4344 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4346 if(score<best_score){
4349 best_change= change;
4350 best_unquant_change= unquant_change;
4354 prev_level= level + 64;
4355 if(prev_level&(~127))
4364 STOP_TIMER("iterative step")}
4368 int j= perm_scantable[ best_coeff ];
4370 block[j] += best_change;
4372 if(best_coeff > last_non_zero){
4373 last_non_zero= best_coeff;
4381 if(block[j] - best_change){
4382 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4394 for(; last_non_zero>=start_i; last_non_zero--){
4395 if(block[perm_scantable[last_non_zero]])
4401 if(256*256*256*64 % count == 0){
4402 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);
4407 for(i=start_i; i<=last_non_zero; i++){
4408 int j= perm_scantable[i];
4409 const int level= block[j];
4412 run_tab[rle_index++]=run;
4419 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4425 if(last_non_zero>0){
4426 STOP_TIMER("iterative search")
4431 return last_non_zero;
4435 * Permute an 8x8 block according to permutation.
4436 * @param block the block which will be permuted according to
4437 * the given permutation vector
4438 * @param permutation the permutation vector
4439 * @param last the last non zero coefficient in scantable order, used to
4440 * speed the permutation up
4441 * @param scantable the used scantable, this is only used to speed the
4442 * permutation up, the block is not (inverse) permutated
4443 * to scantable order!
4445 static void block_permute(int16_t *block, uint8_t *permutation,
4446 const uint8_t *scantable, int last)
4453 //FIXME it is ok but not clean and might fail for some permutations
4454 // if (permutation[1] == 1)
4457 for (i = 0; i <= last; i++) {
4458 const int j = scantable[i];
4463 for (i = 0; i <= last; i++) {
4464 const int j = scantable[i];
4465 const int perm_j = permutation[j];
4466 block[perm_j] = temp[j];
4470 int ff_dct_quantize_c(MpegEncContext *s,
4471 int16_t *block, int n,
4472 int qscale, int *overflow)
4474 int i, j, level, last_non_zero, q, start_i;
4476 const uint8_t *scantable= s->intra_scantable.scantable;
4479 unsigned int threshold1, threshold2;
4481 s->fdsp.fdct(block);
4483 if(s->dct_error_sum)
4484 s->denoise_dct(s, block);
4494 /* For AIC we skip quant/dequant of INTRADC */
4497 /* note: block[0] is assumed to be positive */
4498 block[0] = (block[0] + (q >> 1)) / q;
4501 qmat = s->q_intra_matrix[qscale];
4502 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4506 qmat = s->q_inter_matrix[qscale];
4507 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4509 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4510 threshold2= (threshold1<<1);
4511 for(i=63;i>=start_i;i--) {
4513 level = block[j] * qmat[j];
4515 if(((unsigned)(level+threshold1))>threshold2){
4522 for(i=start_i; i<=last_non_zero; i++) {
4524 level = block[j] * qmat[j];
4526 // if( bias+level >= (1<<QMAT_SHIFT)
4527 // || bias-level >= (1<<QMAT_SHIFT)){
4528 if(((unsigned)(level+threshold1))>threshold2){
4530 level= (bias + level)>>QMAT_SHIFT;
4533 level= (bias - level)>>QMAT_SHIFT;
4541 *overflow= s->max_qcoeff < max; //overflow might have happened
4543 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4544 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4545 block_permute(block, s->idsp.idct_permutation,
4546 scantable, last_non_zero);
4548 return last_non_zero;
4551 #define OFFSET(x) offsetof(MpegEncContext, x)
4552 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4553 static const AVOption h263_options[] = {
4554 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4555 { "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},
4556 { "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 },
4561 static const AVClass h263_class = {
4562 .class_name = "H.263 encoder",
4563 .item_name = av_default_item_name,
4564 .option = h263_options,
4565 .version = LIBAVUTIL_VERSION_INT,
4568 AVCodec ff_h263_encoder = {
4570 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4571 .type = AVMEDIA_TYPE_VIDEO,
4572 .id = AV_CODEC_ID_H263,
4573 .priv_data_size = sizeof(MpegEncContext),
4574 .init = ff_mpv_encode_init,
4575 .encode2 = ff_mpv_encode_picture,
4576 .close = ff_mpv_encode_end,
4577 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4578 .priv_class = &h263_class,
4581 static const AVOption h263p_options[] = {
4582 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4583 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4584 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4585 { "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},
4589 static const AVClass h263p_class = {
4590 .class_name = "H.263p encoder",
4591 .item_name = av_default_item_name,
4592 .option = h263p_options,
4593 .version = LIBAVUTIL_VERSION_INT,
4596 AVCodec ff_h263p_encoder = {
4598 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4599 .type = AVMEDIA_TYPE_VIDEO,
4600 .id = AV_CODEC_ID_H263P,
4601 .priv_data_size = sizeof(MpegEncContext),
4602 .init = ff_mpv_encode_init,
4603 .encode2 = ff_mpv_encode_picture,
4604 .close = ff_mpv_encode_end,
4605 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4606 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4607 .priv_class = &h263p_class,
4610 static const AVClass msmpeg4v2_class = {
4611 .class_name = "msmpeg4v2 encoder",
4612 .item_name = av_default_item_name,
4613 .option = ff_mpv_generic_options,
4614 .version = LIBAVUTIL_VERSION_INT,
4617 AVCodec ff_msmpeg4v2_encoder = {
4618 .name = "msmpeg4v2",
4619 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4620 .type = AVMEDIA_TYPE_VIDEO,
4621 .id = AV_CODEC_ID_MSMPEG4V2,
4622 .priv_data_size = sizeof(MpegEncContext),
4623 .init = ff_mpv_encode_init,
4624 .encode2 = ff_mpv_encode_picture,
4625 .close = ff_mpv_encode_end,
4626 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4627 .priv_class = &msmpeg4v2_class,
4630 static const AVClass msmpeg4v3_class = {
4631 .class_name = "msmpeg4v3 encoder",
4632 .item_name = av_default_item_name,
4633 .option = ff_mpv_generic_options,
4634 .version = LIBAVUTIL_VERSION_INT,
4637 AVCodec ff_msmpeg4v3_encoder = {
4639 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4640 .type = AVMEDIA_TYPE_VIDEO,
4641 .id = AV_CODEC_ID_MSMPEG4V3,
4642 .priv_data_size = sizeof(MpegEncContext),
4643 .init = ff_mpv_encode_init,
4644 .encode2 = ff_mpv_encode_picture,
4645 .close = ff_mpv_encode_end,
4646 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4647 .priv_class = &msmpeg4v3_class,
4650 static const AVClass wmv1_class = {
4651 .class_name = "wmv1 encoder",
4652 .item_name = av_default_item_name,
4653 .option = ff_mpv_generic_options,
4654 .version = LIBAVUTIL_VERSION_INT,
4657 AVCodec ff_wmv1_encoder = {
4659 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4660 .type = AVMEDIA_TYPE_VIDEO,
4661 .id = AV_CODEC_ID_WMV1,
4662 .priv_data_size = sizeof(MpegEncContext),
4663 .init = ff_mpv_encode_init,
4664 .encode2 = ff_mpv_encode_picture,
4665 .close = ff_mpv_encode_end,
4666 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4667 .priv_class = &wmv1_class,