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"
65 #define QUANT_BIAS_SHIFT 8
67 #define QMAT_SHIFT_MMX 16
70 static int encode_picture(MpegEncContext *s, int picture_number);
71 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
72 static int sse_mb(MpegEncContext *s);
73 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
74 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
76 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
77 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
79 const AVOption ff_mpv_generic_options[] = {
84 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
85 uint16_t (*qmat16)[2][64],
86 const uint16_t *quant_matrix,
87 int bias, int qmin, int qmax, int intra)
89 FDCTDSPContext *fdsp = &s->fdsp;
93 for (qscale = qmin; qscale <= qmax; qscale++) {
95 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
97 fdsp->fdct == ff_faandct ||
98 #endif /* CONFIG_FAANDCT */
99 fdsp->fdct == ff_jpeg_fdct_islow_10) {
100 for (i = 0; i < 64; i++) {
101 const int j = s->idsp.idct_permutation[i];
102 int64_t den = (int64_t) qscale * quant_matrix[j];
103 /* 16 <= qscale * quant_matrix[i] <= 7905
104 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
105 * 19952 <= x <= 249205026
106 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
107 * 3444240 >= (1 << 36) / (x) >= 275 */
109 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
111 } else if (fdsp->fdct == ff_fdct_ifast) {
112 for (i = 0; i < 64; i++) {
113 const int j = s->idsp.idct_permutation[i];
114 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
115 /* 16 <= qscale * quant_matrix[i] <= 7905
116 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
117 * 19952 <= x <= 249205026
118 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
119 * 3444240 >= (1 << 36) / (x) >= 275 */
121 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
124 for (i = 0; i < 64; i++) {
125 const int j = s->idsp.idct_permutation[i];
126 int64_t den = (int64_t) qscale * quant_matrix[j];
127 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
128 * Assume x = qscale * quant_matrix[i]
130 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
131 * so 32768 >= (1 << 19) / (x) >= 67 */
132 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
133 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
134 // (qscale * quant_matrix[i]);
135 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
137 if (qmat16[qscale][0][i] == 0 ||
138 qmat16[qscale][0][i] == 128 * 256)
139 qmat16[qscale][0][i] = 128 * 256 - 1;
140 qmat16[qscale][1][i] =
141 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
142 qmat16[qscale][0][i]);
146 for (i = intra; i < 64; i++) {
148 if (fdsp->fdct == ff_fdct_ifast) {
149 max = (8191LL * ff_aanscales[i]) >> 14;
151 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
157 av_log(NULL, AV_LOG_INFO,
158 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
163 static inline void update_qscale(MpegEncContext *s)
165 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
166 (FF_LAMBDA_SHIFT + 7);
167 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
169 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
173 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
179 for (i = 0; i < 64; i++) {
180 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
187 * init s->current_picture.qscale_table from s->lambda_table
189 void ff_init_qscale_tab(MpegEncContext *s)
191 int8_t * const qscale_table = s->current_picture.qscale_table;
194 for (i = 0; i < s->mb_num; i++) {
195 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
196 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
197 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
202 static void update_duplicate_context_after_me(MpegEncContext *dst,
205 #define COPY(a) dst->a= src->a
207 COPY(current_picture);
213 COPY(picture_in_gop_number);
214 COPY(gop_picture_number);
215 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
216 COPY(progressive_frame); // FIXME don't set in encode_header
217 COPY(partitioned_frame); // FIXME don't set in encode_header
222 * Set the given MpegEncContext to defaults for encoding.
223 * the changed fields will not depend upon the prior state of the MpegEncContext.
225 static void mpv_encode_defaults(MpegEncContext *s)
228 ff_mpv_common_defaults(s);
230 for (i = -16; i < 16; i++) {
231 default_fcode_tab[i + MAX_MV] = 1;
233 s->me.mv_penalty = default_mv_penalty;
234 s->fcode_tab = default_fcode_tab;
236 s->input_picture_number = 0;
237 s->picture_in_gop_number = 0;
240 /* init video encoder */
241 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
243 MpegEncContext *s = avctx->priv_data;
244 AVCPBProperties *cpb_props;
245 int i, ret, format_supported;
247 mpv_encode_defaults(s);
249 switch (avctx->codec_id) {
250 case AV_CODEC_ID_MPEG2VIDEO:
251 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
252 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
253 av_log(avctx, AV_LOG_ERROR,
254 "only YUV420 and YUV422 are supported\n");
258 case AV_CODEC_ID_MJPEG:
259 format_supported = 0;
260 /* JPEG color space */
261 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
262 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
263 (avctx->color_range == AVCOL_RANGE_JPEG &&
264 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
265 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
266 format_supported = 1;
267 /* MPEG color space */
268 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
269 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
270 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
271 format_supported = 1;
273 if (!format_supported) {
274 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
279 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
280 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
285 switch (avctx->pix_fmt) {
286 case AV_PIX_FMT_YUVJ422P:
287 case AV_PIX_FMT_YUV422P:
288 s->chroma_format = CHROMA_422;
290 case AV_PIX_FMT_YUVJ420P:
291 case AV_PIX_FMT_YUV420P:
293 s->chroma_format = CHROMA_420;
297 s->bit_rate = avctx->bit_rate;
298 s->width = avctx->width;
299 s->height = avctx->height;
300 if (avctx->gop_size > 600 &&
301 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
302 av_log(avctx, AV_LOG_ERROR,
303 "Warning keyframe interval too large! reducing it ...\n");
304 avctx->gop_size = 600;
306 s->gop_size = avctx->gop_size;
308 if (avctx->max_b_frames > MAX_B_FRAMES) {
309 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
310 "is %d.\n", MAX_B_FRAMES);
312 s->max_b_frames = avctx->max_b_frames;
313 s->codec_id = avctx->codec->id;
314 s->strict_std_compliance = avctx->strict_std_compliance;
315 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
316 s->mpeg_quant = avctx->mpeg_quant;
317 s->rtp_mode = !!avctx->rtp_payload_size;
318 s->intra_dc_precision = avctx->intra_dc_precision;
319 s->user_specified_pts = AV_NOPTS_VALUE;
321 if (s->gop_size <= 1) {
328 #if FF_API_MOTION_EST
329 FF_DISABLE_DEPRECATION_WARNINGS
330 s->me_method = avctx->me_method;
331 FF_ENABLE_DEPRECATION_WARNINGS
335 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
338 FF_DISABLE_DEPRECATION_WARNINGS
339 if (avctx->border_masking != 0.0)
340 s->border_masking = avctx->border_masking;
341 FF_ENABLE_DEPRECATION_WARNINGS
344 s->adaptive_quant = (s->avctx->lumi_masking ||
345 s->avctx->dark_masking ||
346 s->avctx->temporal_cplx_masking ||
347 s->avctx->spatial_cplx_masking ||
348 s->avctx->p_masking ||
350 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
353 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
355 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
356 av_log(avctx, AV_LOG_ERROR,
357 "a vbv buffer size is needed, "
358 "for encoding with a maximum bitrate\n");
362 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
363 av_log(avctx, AV_LOG_INFO,
364 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
367 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
368 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
372 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
373 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
377 if (avctx->rc_max_rate &&
378 avctx->rc_max_rate == avctx->bit_rate &&
379 avctx->rc_max_rate != avctx->rc_min_rate) {
380 av_log(avctx, AV_LOG_INFO,
381 "impossible bitrate constraints, this will fail\n");
384 if (avctx->rc_buffer_size &&
385 avctx->bit_rate * (int64_t)avctx->time_base.num >
386 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
387 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
391 if (!s->fixed_qscale &&
392 avctx->bit_rate * av_q2d(avctx->time_base) >
393 avctx->bit_rate_tolerance) {
394 av_log(avctx, AV_LOG_ERROR,
395 "bitrate tolerance too small for bitrate\n");
399 if (s->avctx->rc_max_rate &&
400 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
401 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
402 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
403 90000LL * (avctx->rc_buffer_size - 1) >
404 s->avctx->rc_max_rate * 0xFFFFLL) {
405 av_log(avctx, AV_LOG_INFO,
406 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
407 "specified vbv buffer is too large for the given bitrate!\n");
410 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
411 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
412 s->codec_id != AV_CODEC_ID_FLV1) {
413 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
417 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
418 av_log(avctx, AV_LOG_ERROR,
419 "OBMC is only supported with simple mb decision\n");
423 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
424 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
428 if (s->max_b_frames &&
429 s->codec_id != AV_CODEC_ID_MPEG4 &&
430 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
431 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
432 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
436 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
437 s->codec_id == AV_CODEC_ID_H263 ||
438 s->codec_id == AV_CODEC_ID_H263P) &&
439 (avctx->sample_aspect_ratio.num > 255 ||
440 avctx->sample_aspect_ratio.den > 255)) {
441 av_log(avctx, AV_LOG_ERROR,
442 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
443 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
447 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
448 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
449 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
453 // FIXME mpeg2 uses that too
454 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
455 av_log(avctx, AV_LOG_ERROR,
456 "mpeg2 style quantization not supported by codec\n");
460 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
461 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
465 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
466 s->avctx->mb_decision != FF_MB_DECISION_RD) {
467 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
471 if (s->avctx->scenechange_threshold < 1000000000 &&
472 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
473 av_log(avctx, AV_LOG_ERROR,
474 "closed gop with scene change detection are not supported yet, "
475 "set threshold to 1000000000\n");
479 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
480 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
481 av_log(avctx, AV_LOG_ERROR,
482 "low delay forcing is only available for mpeg2\n");
485 if (s->max_b_frames != 0) {
486 av_log(avctx, AV_LOG_ERROR,
487 "b frames cannot be used with low delay\n");
492 if (s->q_scale_type == 1) {
493 if (avctx->qmax > 12) {
494 av_log(avctx, AV_LOG_ERROR,
495 "non linear quant only supports qmax <= 12 currently\n");
500 if (avctx->slices > 1 &&
501 (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
502 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
503 return AVERROR(EINVAL);
506 if (s->avctx->thread_count > 1 &&
507 s->codec_id != AV_CODEC_ID_MPEG4 &&
508 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
509 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
510 (s->codec_id != AV_CODEC_ID_H263P)) {
511 av_log(avctx, AV_LOG_ERROR,
512 "multi threaded encoding not supported by codec\n");
516 if (s->avctx->thread_count < 1) {
517 av_log(avctx, AV_LOG_ERROR,
518 "automatic thread number detection not supported by codec,"
523 if (!avctx->time_base.den || !avctx->time_base.num) {
524 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
528 #if FF_API_PRIVATE_OPT
529 FF_DISABLE_DEPRECATION_WARNINGS
530 if (avctx->b_frame_strategy)
531 s->b_frame_strategy = avctx->b_frame_strategy;
532 if (avctx->b_sensitivity != 40)
533 s->b_sensitivity = avctx->b_sensitivity;
534 FF_ENABLE_DEPRECATION_WARNINGS
537 if (s->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
538 av_log(avctx, AV_LOG_INFO,
539 "notice: b_frame_strategy only affects the first pass\n");
540 s->b_frame_strategy = 0;
543 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
545 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
546 avctx->time_base.den /= i;
547 avctx->time_base.num /= i;
551 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
552 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
553 // (a + x * 3 / 8) / x
554 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
555 s->inter_quant_bias = 0;
557 s->intra_quant_bias = 0;
559 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
562 #if FF_API_QUANT_BIAS
563 FF_DISABLE_DEPRECATION_WARNINGS
564 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
565 s->intra_quant_bias = avctx->intra_quant_bias;
566 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
567 s->inter_quant_bias = avctx->inter_quant_bias;
568 FF_ENABLE_DEPRECATION_WARNINGS
571 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
572 s->avctx->time_base.den > (1 << 16) - 1) {
573 av_log(avctx, AV_LOG_ERROR,
574 "timebase %d/%d not supported by MPEG 4 standard, "
575 "the maximum admitted value for the timebase denominator "
576 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
580 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
582 switch (avctx->codec->id) {
583 case AV_CODEC_ID_MPEG1VIDEO:
584 s->out_format = FMT_MPEG1;
585 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
586 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
588 case AV_CODEC_ID_MPEG2VIDEO:
589 s->out_format = FMT_MPEG1;
590 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
591 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
594 case AV_CODEC_ID_MJPEG:
595 s->out_format = FMT_MJPEG;
596 s->intra_only = 1; /* force intra only for jpeg */
597 if (!CONFIG_MJPEG_ENCODER ||
598 ff_mjpeg_encode_init(s) < 0)
603 case AV_CODEC_ID_H261:
604 if (!CONFIG_H261_ENCODER)
606 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
607 av_log(avctx, AV_LOG_ERROR,
608 "The specified picture size of %dx%d is not valid for the "
609 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
610 s->width, s->height);
613 s->out_format = FMT_H261;
616 s->rtp_mode = 0; /* Sliced encoding not supported */
618 case AV_CODEC_ID_H263:
619 if (!CONFIG_H263_ENCODER)
621 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
622 s->width, s->height) == 8) {
623 av_log(avctx, AV_LOG_INFO,
624 "The specified picture size of %dx%d is not valid for "
625 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
626 "352x288, 704x576, and 1408x1152."
627 "Try H.263+.\n", s->width, s->height);
630 s->out_format = FMT_H263;
634 case AV_CODEC_ID_H263P:
635 s->out_format = FMT_H263;
638 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
639 s->modified_quant = s->h263_aic;
640 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
641 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
644 /* These are just to be sure */
648 case AV_CODEC_ID_FLV1:
649 s->out_format = FMT_H263;
650 s->h263_flv = 2; /* format = 1; 11-bit codes */
651 s->unrestricted_mv = 1;
652 s->rtp_mode = 0; /* don't allow GOB */
656 case AV_CODEC_ID_RV10:
657 s->out_format = FMT_H263;
661 case AV_CODEC_ID_RV20:
662 s->out_format = FMT_H263;
665 s->modified_quant = 1;
669 s->unrestricted_mv = 0;
671 case AV_CODEC_ID_MPEG4:
672 s->out_format = FMT_H263;
674 s->unrestricted_mv = 1;
675 s->low_delay = s->max_b_frames ? 0 : 1;
676 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
678 case AV_CODEC_ID_MSMPEG4V2:
679 s->out_format = FMT_H263;
681 s->unrestricted_mv = 1;
682 s->msmpeg4_version = 2;
686 case AV_CODEC_ID_MSMPEG4V3:
687 s->out_format = FMT_H263;
689 s->unrestricted_mv = 1;
690 s->msmpeg4_version = 3;
691 s->flipflop_rounding = 1;
695 case AV_CODEC_ID_WMV1:
696 s->out_format = FMT_H263;
698 s->unrestricted_mv = 1;
699 s->msmpeg4_version = 4;
700 s->flipflop_rounding = 1;
704 case AV_CODEC_ID_WMV2:
705 s->out_format = FMT_H263;
707 s->unrestricted_mv = 1;
708 s->msmpeg4_version = 5;
709 s->flipflop_rounding = 1;
717 avctx->has_b_frames = !s->low_delay;
721 s->progressive_frame =
722 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
723 AV_CODEC_FLAG_INTERLACED_ME) ||
728 if (ff_mpv_common_init(s) < 0)
732 ff_mpv_encode_init_x86(s);
734 ff_fdctdsp_init(&s->fdsp, avctx);
735 ff_me_cmp_init(&s->mecc, avctx);
736 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
737 ff_pixblockdsp_init(&s->pdsp, avctx);
738 ff_qpeldsp_init(&s->qdsp);
740 if (s->msmpeg4_version) {
741 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
742 2 * 2 * (MAX_LEVEL + 1) *
743 (MAX_RUN + 1) * 2 * sizeof(int), fail);
745 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
747 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
748 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
749 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
750 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
751 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
752 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
753 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
754 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
756 if (s->avctx->noise_reduction) {
757 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
758 2 * 64 * sizeof(uint16_t), fail);
761 if (CONFIG_H263_ENCODER)
762 ff_h263dsp_init(&s->h263dsp);
763 if (!s->dct_quantize)
764 s->dct_quantize = ff_dct_quantize_c;
766 s->denoise_dct = denoise_dct_c;
767 s->fast_dct_quantize = s->dct_quantize;
769 s->dct_quantize = dct_quantize_trellis_c;
771 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
772 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
774 if (s->slice_context_count > 1) {
777 if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P)
778 s->h263_slice_structured = 1;
781 s->quant_precision = 5;
783 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
784 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
786 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
787 ff_h261_encode_init(s);
788 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
789 ff_h263_encode_init(s);
790 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
791 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
793 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
794 && s->out_format == FMT_MPEG1)
795 ff_mpeg1_encode_init(s);
798 for (i = 0; i < 64; i++) {
799 int j = s->idsp.idct_permutation[i];
800 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
802 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
803 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
804 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
806 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
809 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
810 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
812 if (s->avctx->intra_matrix)
813 s->intra_matrix[j] = s->avctx->intra_matrix[i];
814 if (s->avctx->inter_matrix)
815 s->inter_matrix[j] = s->avctx->inter_matrix[i];
818 /* precompute matrix */
819 /* for mjpeg, we do include qscale in the matrix */
820 if (s->out_format != FMT_MJPEG) {
821 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
822 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
824 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
825 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
829 if (ff_rate_control_init(s) < 0)
832 #if FF_API_ERROR_RATE
833 FF_DISABLE_DEPRECATION_WARNINGS
834 if (avctx->error_rate)
835 s->error_rate = avctx->error_rate;
836 FF_ENABLE_DEPRECATION_WARNINGS;
839 #if FF_API_NORMALIZE_AQP
840 FF_DISABLE_DEPRECATION_WARNINGS
841 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
842 s->mpv_flags |= FF_MPV_FLAG_NAQ;
843 FF_ENABLE_DEPRECATION_WARNINGS;
847 FF_DISABLE_DEPRECATION_WARNINGS
848 if (avctx->flags & CODEC_FLAG_MV0)
849 s->mpv_flags |= FF_MPV_FLAG_MV0;
850 FF_ENABLE_DEPRECATION_WARNINGS
854 FF_DISABLE_DEPRECATION_WARNINGS
855 if (avctx->rc_qsquish != 0.0)
856 s->rc_qsquish = avctx->rc_qsquish;
857 if (avctx->rc_qmod_amp != 0.0)
858 s->rc_qmod_amp = avctx->rc_qmod_amp;
859 if (avctx->rc_qmod_freq)
860 s->rc_qmod_freq = avctx->rc_qmod_freq;
861 if (avctx->rc_buffer_aggressivity != 1.0)
862 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
863 if (avctx->rc_initial_cplx != 0.0)
864 s->rc_initial_cplx = avctx->rc_initial_cplx;
866 s->lmin = avctx->lmin;
868 s->lmax = avctx->lmax;
872 s->rc_eq = av_strdup(avctx->rc_eq);
874 return AVERROR(ENOMEM);
876 FF_ENABLE_DEPRECATION_WARNINGS
879 if (s->b_frame_strategy == 2) {
880 for (i = 0; i < s->max_b_frames + 2; i++) {
881 s->tmp_frames[i] = av_frame_alloc();
882 if (!s->tmp_frames[i])
883 return AVERROR(ENOMEM);
885 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
886 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
887 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
889 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
895 cpb_props = ff_add_cpb_side_data(avctx);
897 return AVERROR(ENOMEM);
898 cpb_props->max_bitrate = avctx->rc_max_rate;
899 cpb_props->min_bitrate = avctx->rc_min_rate;
900 cpb_props->avg_bitrate = avctx->bit_rate;
901 cpb_props->buffer_size = avctx->rc_buffer_size;
905 ff_mpv_encode_end(avctx);
906 return AVERROR_UNKNOWN;
909 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
911 MpegEncContext *s = avctx->priv_data;
914 ff_rate_control_uninit(s);
916 ff_mpv_common_end(s);
917 if (CONFIG_MJPEG_ENCODER &&
918 s->out_format == FMT_MJPEG)
919 ff_mjpeg_encode_close(s);
921 av_freep(&avctx->extradata);
923 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
924 av_frame_free(&s->tmp_frames[i]);
926 ff_free_picture_tables(&s->new_picture);
927 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
929 av_freep(&s->avctx->stats_out);
930 av_freep(&s->ac_stats);
932 av_freep(&s->q_intra_matrix);
933 av_freep(&s->q_inter_matrix);
934 av_freep(&s->q_intra_matrix16);
935 av_freep(&s->q_inter_matrix16);
936 av_freep(&s->input_picture);
937 av_freep(&s->reordered_input_picture);
938 av_freep(&s->dct_offset);
943 static int get_sae(uint8_t *src, int ref, int stride)
948 for (y = 0; y < 16; y++) {
949 for (x = 0; x < 16; x++) {
950 acc += FFABS(src[x + y * stride] - ref);
957 static int get_intra_count(MpegEncContext *s, uint8_t *src,
958 uint8_t *ref, int stride)
966 for (y = 0; y < h; y += 16) {
967 for (x = 0; x < w; x += 16) {
968 int offset = x + y * stride;
969 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
971 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
972 int sae = get_sae(src + offset, mean, stride);
974 acc += sae + 500 < sad;
980 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
982 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
983 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
984 s->mb_stride, s->mb_height, s->b8_stride,
985 &s->linesize, &s->uvlinesize);
988 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
992 int i, display_picture_number = 0, ret;
993 int encoding_delay = s->max_b_frames ? s->max_b_frames
994 : (s->low_delay ? 0 : 1);
995 int flush_offset = 1;
1000 display_picture_number = s->input_picture_number++;
1002 if (pts != AV_NOPTS_VALUE) {
1003 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1005 int64_t last = s->user_specified_pts;
1008 av_log(s->avctx, AV_LOG_ERROR,
1009 "Error, Invalid timestamp=%"PRId64", "
1010 "last=%"PRId64"\n", pts, s->user_specified_pts);
1014 if (!s->low_delay && display_picture_number == 1)
1015 s->dts_delta = time - last;
1017 s->user_specified_pts = pts;
1019 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1020 s->user_specified_pts =
1021 pts = s->user_specified_pts + 1;
1022 av_log(s->avctx, AV_LOG_INFO,
1023 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1026 pts = display_picture_number;
1030 if (!pic_arg->buf[0] ||
1031 pic_arg->linesize[0] != s->linesize ||
1032 pic_arg->linesize[1] != s->uvlinesize ||
1033 pic_arg->linesize[2] != s->uvlinesize)
1035 if ((s->width & 15) || (s->height & 15))
1038 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1039 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1041 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1045 pic = &s->picture[i];
1049 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1052 ret = alloc_picture(s, pic, direct);
1057 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1058 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1059 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1062 int h_chroma_shift, v_chroma_shift;
1063 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1067 for (i = 0; i < 3; i++) {
1068 int src_stride = pic_arg->linesize[i];
1069 int dst_stride = i ? s->uvlinesize : s->linesize;
1070 int h_shift = i ? h_chroma_shift : 0;
1071 int v_shift = i ? v_chroma_shift : 0;
1072 int w = s->width >> h_shift;
1073 int h = s->height >> v_shift;
1074 uint8_t *src = pic_arg->data[i];
1075 uint8_t *dst = pic->f->data[i];
1077 if (!s->avctx->rc_buffer_size)
1078 dst += INPLACE_OFFSET;
1080 if (src_stride == dst_stride)
1081 memcpy(dst, src, src_stride * h);
1084 uint8_t *dst2 = dst;
1086 memcpy(dst2, src, w);
1091 if ((s->width & 15) || (s->height & 15)) {
1092 s->mpvencdsp.draw_edges(dst, dst_stride,
1101 ret = av_frame_copy_props(pic->f, pic_arg);
1105 pic->f->display_picture_number = display_picture_number;
1106 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1108 /* Flushing: When we have not received enough input frames,
1109 * ensure s->input_picture[0] contains the first picture */
1110 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1111 if (s->input_picture[flush_offset])
1114 if (flush_offset <= 1)
1117 encoding_delay = encoding_delay - flush_offset + 1;
1120 /* shift buffer entries */
1121 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1122 s->input_picture[i - flush_offset] = s->input_picture[i];
1124 s->input_picture[encoding_delay] = (Picture*) pic;
1129 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1133 int64_t score64 = 0;
1135 for (plane = 0; plane < 3; plane++) {
1136 const int stride = p->f->linesize[plane];
1137 const int bw = plane ? 1 : 2;
1138 for (y = 0; y < s->mb_height * bw; y++) {
1139 for (x = 0; x < s->mb_width * bw; x++) {
1140 int off = p->shared ? 0 : 16;
1141 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1142 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1143 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1145 switch (s->avctx->frame_skip_exp) {
1146 case 0: score = FFMAX(score, v); break;
1147 case 1: score += FFABS(v); break;
1148 case 2: score += v * v; break;
1149 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1150 case 4: score64 += v * v * (int64_t)(v * v); break;
1159 if (score64 < s->avctx->frame_skip_threshold)
1161 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1166 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1168 AVPacket pkt = { 0 };
1169 int ret, got_output;
1171 av_init_packet(&pkt);
1172 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1177 av_packet_unref(&pkt);
1181 static int estimate_best_b_count(MpegEncContext *s)
1183 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1184 AVCodecContext *c = avcodec_alloc_context3(NULL);
1185 const int scale = s->avctx->brd_scale;
1186 int i, j, out_size, p_lambda, b_lambda, lambda2;
1187 int64_t best_rd = INT64_MAX;
1188 int best_b_count = -1;
1191 return AVERROR(ENOMEM);
1192 assert(scale >= 0 && scale <= 3);
1195 //s->next_picture_ptr->quality;
1196 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1197 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1198 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1199 if (!b_lambda) // FIXME we should do this somewhere else
1200 b_lambda = p_lambda;
1201 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1204 c->width = s->width >> scale;
1205 c->height = s->height >> scale;
1206 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1207 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1208 c->mb_decision = s->avctx->mb_decision;
1209 c->me_cmp = s->avctx->me_cmp;
1210 c->mb_cmp = s->avctx->mb_cmp;
1211 c->me_sub_cmp = s->avctx->me_sub_cmp;
1212 c->pix_fmt = AV_PIX_FMT_YUV420P;
1213 c->time_base = s->avctx->time_base;
1214 c->max_b_frames = s->max_b_frames;
1216 if (avcodec_open2(c, codec, NULL) < 0)
1219 for (i = 0; i < s->max_b_frames + 2; i++) {
1220 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1221 s->next_picture_ptr;
1223 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1224 pre_input = *pre_input_ptr;
1226 if (!pre_input.shared && i) {
1227 pre_input.f->data[0] += INPLACE_OFFSET;
1228 pre_input.f->data[1] += INPLACE_OFFSET;
1229 pre_input.f->data[2] += INPLACE_OFFSET;
1232 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1233 s->tmp_frames[i]->linesize[0],
1234 pre_input.f->data[0],
1235 pre_input.f->linesize[0],
1236 c->width, c->height);
1237 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1238 s->tmp_frames[i]->linesize[1],
1239 pre_input.f->data[1],
1240 pre_input.f->linesize[1],
1241 c->width >> 1, c->height >> 1);
1242 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1243 s->tmp_frames[i]->linesize[2],
1244 pre_input.f->data[2],
1245 pre_input.f->linesize[2],
1246 c->width >> 1, c->height >> 1);
1250 for (j = 0; j < s->max_b_frames + 1; j++) {
1253 if (!s->input_picture[j])
1256 c->error[0] = c->error[1] = c->error[2] = 0;
1258 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1259 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1261 out_size = encode_frame(c, s->tmp_frames[0]);
1263 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1265 for (i = 0; i < s->max_b_frames + 1; i++) {
1266 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1268 s->tmp_frames[i + 1]->pict_type = is_p ?
1269 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1270 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1272 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1274 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1277 /* get the delayed frames */
1279 out_size = encode_frame(c, NULL);
1280 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1283 rd += c->error[0] + c->error[1] + c->error[2];
1294 return best_b_count;
1297 static int select_input_picture(MpegEncContext *s)
1301 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1302 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1303 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1305 /* set next picture type & ordering */
1306 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1307 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1308 !s->next_picture_ptr || s->intra_only) {
1309 s->reordered_input_picture[0] = s->input_picture[0];
1310 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1311 s->reordered_input_picture[0]->f->coded_picture_number =
1312 s->coded_picture_number++;
1316 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1317 if (s->picture_in_gop_number < s->gop_size &&
1318 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1319 // FIXME check that te gop check above is +-1 correct
1320 av_frame_unref(s->input_picture[0]->f);
1323 ff_vbv_update(s, 0);
1329 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1330 for (i = 0; i < s->max_b_frames + 1; i++) {
1331 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1333 if (pict_num >= s->rc_context.num_entries)
1335 if (!s->input_picture[i]) {
1336 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1340 s->input_picture[i]->f->pict_type =
1341 s->rc_context.entry[pict_num].new_pict_type;
1345 if (s->b_frame_strategy == 0) {
1346 b_frames = s->max_b_frames;
1347 while (b_frames && !s->input_picture[b_frames])
1349 } else if (s->b_frame_strategy == 1) {
1350 for (i = 1; i < s->max_b_frames + 1; i++) {
1351 if (s->input_picture[i] &&
1352 s->input_picture[i]->b_frame_score == 0) {
1353 s->input_picture[i]->b_frame_score =
1355 s->input_picture[i ]->f->data[0],
1356 s->input_picture[i - 1]->f->data[0],
1360 for (i = 0; i < s->max_b_frames + 1; i++) {
1361 if (!s->input_picture[i] ||
1362 s->input_picture[i]->b_frame_score - 1 >
1363 s->mb_num / s->b_sensitivity)
1367 b_frames = FFMAX(0, i - 1);
1370 for (i = 0; i < b_frames + 1; i++) {
1371 s->input_picture[i]->b_frame_score = 0;
1373 } else if (s->b_frame_strategy == 2) {
1374 b_frames = estimate_best_b_count(s);
1379 for (i = b_frames - 1; i >= 0; i--) {
1380 int type = s->input_picture[i]->f->pict_type;
1381 if (type && type != AV_PICTURE_TYPE_B)
1384 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1385 b_frames == s->max_b_frames) {
1386 av_log(s->avctx, AV_LOG_ERROR,
1387 "warning, too many b frames in a row\n");
1390 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1391 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1392 s->gop_size > s->picture_in_gop_number) {
1393 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1395 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1397 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1401 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1402 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1405 s->reordered_input_picture[0] = s->input_picture[b_frames];
1406 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1407 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1408 s->reordered_input_picture[0]->f->coded_picture_number =
1409 s->coded_picture_number++;
1410 for (i = 0; i < b_frames; i++) {
1411 s->reordered_input_picture[i + 1] = s->input_picture[i];
1412 s->reordered_input_picture[i + 1]->f->pict_type =
1414 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1415 s->coded_picture_number++;
1420 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1422 if (s->reordered_input_picture[0]) {
1423 s->reordered_input_picture[0]->reference =
1424 s->reordered_input_picture[0]->f->pict_type !=
1425 AV_PICTURE_TYPE_B ? 3 : 0;
1427 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1430 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1431 // input is a shared pix, so we can't modifiy it -> alloc a new
1432 // one & ensure that the shared one is reuseable
1435 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1438 pic = &s->picture[i];
1440 pic->reference = s->reordered_input_picture[0]->reference;
1441 if (alloc_picture(s, pic, 0) < 0) {
1445 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1449 /* mark us unused / free shared pic */
1450 av_frame_unref(s->reordered_input_picture[0]->f);
1451 s->reordered_input_picture[0]->shared = 0;
1453 s->current_picture_ptr = pic;
1455 // input is not a shared pix -> reuse buffer for current_pix
1456 s->current_picture_ptr = s->reordered_input_picture[0];
1457 for (i = 0; i < 4; i++) {
1458 s->new_picture.f->data[i] += INPLACE_OFFSET;
1461 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1462 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1463 s->current_picture_ptr)) < 0)
1466 s->picture_number = s->new_picture.f->display_picture_number;
1471 static void frame_end(MpegEncContext *s)
1475 if (s->unrestricted_mv &&
1476 s->current_picture.reference &&
1478 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1479 int hshift = desc->log2_chroma_w;
1480 int vshift = desc->log2_chroma_h;
1481 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1482 s->h_edge_pos, s->v_edge_pos,
1483 EDGE_WIDTH, EDGE_WIDTH,
1484 EDGE_TOP | EDGE_BOTTOM);
1485 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1486 s->h_edge_pos >> hshift,
1487 s->v_edge_pos >> vshift,
1488 EDGE_WIDTH >> hshift,
1489 EDGE_WIDTH >> vshift,
1490 EDGE_TOP | EDGE_BOTTOM);
1491 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1492 s->h_edge_pos >> hshift,
1493 s->v_edge_pos >> vshift,
1494 EDGE_WIDTH >> hshift,
1495 EDGE_WIDTH >> vshift,
1496 EDGE_TOP | EDGE_BOTTOM);
1501 s->last_pict_type = s->pict_type;
1502 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1503 if (s->pict_type!= AV_PICTURE_TYPE_B)
1504 s->last_non_b_pict_type = s->pict_type;
1507 /* release non-reference frames */
1508 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1509 if (!s->picture[i].reference)
1510 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1514 #if FF_API_CODED_FRAME
1515 FF_DISABLE_DEPRECATION_WARNINGS
1516 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1517 FF_ENABLE_DEPRECATION_WARNINGS
1519 #if FF_API_ERROR_FRAME
1520 FF_DISABLE_DEPRECATION_WARNINGS
1521 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1522 sizeof(s->current_picture.encoding_error));
1523 FF_ENABLE_DEPRECATION_WARNINGS
1527 static void update_noise_reduction(MpegEncContext *s)
1531 for (intra = 0; intra < 2; intra++) {
1532 if (s->dct_count[intra] > (1 << 16)) {
1533 for (i = 0; i < 64; i++) {
1534 s->dct_error_sum[intra][i] >>= 1;
1536 s->dct_count[intra] >>= 1;
1539 for (i = 0; i < 64; i++) {
1540 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1541 s->dct_count[intra] +
1542 s->dct_error_sum[intra][i] / 2) /
1543 (s->dct_error_sum[intra][i] + 1);
1548 static int frame_start(MpegEncContext *s)
1552 /* mark & release old frames */
1553 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1554 s->last_picture_ptr != s->next_picture_ptr &&
1555 s->last_picture_ptr->f->buf[0]) {
1556 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1559 s->current_picture_ptr->f->pict_type = s->pict_type;
1560 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1562 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1563 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1564 s->current_picture_ptr)) < 0)
1567 if (s->pict_type != AV_PICTURE_TYPE_B) {
1568 s->last_picture_ptr = s->next_picture_ptr;
1570 s->next_picture_ptr = s->current_picture_ptr;
1573 if (s->last_picture_ptr) {
1574 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1575 if (s->last_picture_ptr->f->buf[0] &&
1576 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1577 s->last_picture_ptr)) < 0)
1580 if (s->next_picture_ptr) {
1581 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1582 if (s->next_picture_ptr->f->buf[0] &&
1583 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1584 s->next_picture_ptr)) < 0)
1588 if (s->picture_structure!= PICT_FRAME) {
1590 for (i = 0; i < 4; i++) {
1591 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1592 s->current_picture.f->data[i] +=
1593 s->current_picture.f->linesize[i];
1595 s->current_picture.f->linesize[i] *= 2;
1596 s->last_picture.f->linesize[i] *= 2;
1597 s->next_picture.f->linesize[i] *= 2;
1601 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1602 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1603 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1604 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1605 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1606 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1608 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1609 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1612 if (s->dct_error_sum) {
1613 assert(s->avctx->noise_reduction && s->encoding);
1614 update_noise_reduction(s);
1620 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1621 const AVFrame *pic_arg, int *got_packet)
1623 MpegEncContext *s = avctx->priv_data;
1624 int i, stuffing_count, ret;
1625 int context_count = s->slice_context_count;
1627 s->picture_in_gop_number++;
1629 if (load_input_picture(s, pic_arg) < 0)
1632 if (select_input_picture(s) < 0) {
1637 if (s->new_picture.f->data[0]) {
1640 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1643 s->mb_info_ptr = av_packet_new_side_data(pkt,
1644 AV_PKT_DATA_H263_MB_INFO,
1645 s->mb_width*s->mb_height*12);
1646 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1649 for (i = 0; i < context_count; i++) {
1650 int start_y = s->thread_context[i]->start_mb_y;
1651 int end_y = s->thread_context[i]-> end_mb_y;
1652 int h = s->mb_height;
1653 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1654 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1656 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1659 s->pict_type = s->new_picture.f->pict_type;
1661 ret = frame_start(s);
1665 if (encode_picture(s, s->picture_number) < 0)
1668 #if FF_API_STAT_BITS
1669 FF_DISABLE_DEPRECATION_WARNINGS
1670 avctx->header_bits = s->header_bits;
1671 avctx->mv_bits = s->mv_bits;
1672 avctx->misc_bits = s->misc_bits;
1673 avctx->i_tex_bits = s->i_tex_bits;
1674 avctx->p_tex_bits = s->p_tex_bits;
1675 avctx->i_count = s->i_count;
1676 // FIXME f/b_count in avctx
1677 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1678 avctx->skip_count = s->skip_count;
1679 FF_ENABLE_DEPRECATION_WARNINGS
1684 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1687 return AVERROR(ENOMEM);
1688 *(int *)sd = s->current_picture.f->quality;
1690 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1691 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1693 if (avctx->rc_buffer_size) {
1694 RateControlContext *rcc = &s->rc_context;
1695 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1697 if (put_bits_count(&s->pb) > max_size &&
1698 s->lambda < s->lmax) {
1699 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1700 (s->qscale + 1) / s->qscale);
1701 if (s->adaptive_quant) {
1703 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1704 s->lambda_table[i] =
1705 FFMAX(s->lambda_table[i] + 1,
1706 s->lambda_table[i] * (s->qscale + 1) /
1709 s->mb_skipped = 0; // done in frame_start()
1710 // done in encode_picture() so we must undo it
1711 if (s->pict_type == AV_PICTURE_TYPE_P) {
1712 if (s->flipflop_rounding ||
1713 s->codec_id == AV_CODEC_ID_H263P ||
1714 s->codec_id == AV_CODEC_ID_MPEG4)
1715 s->no_rounding ^= 1;
1717 if (s->pict_type != AV_PICTURE_TYPE_B) {
1718 s->time_base = s->last_time_base;
1719 s->last_non_b_time = s->time - s->pp_time;
1721 for (i = 0; i < context_count; i++) {
1722 PutBitContext *pb = &s->thread_context[i]->pb;
1723 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1728 assert(s->avctx->rc_max_rate);
1731 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1732 ff_write_pass1_stats(s);
1734 for (i = 0; i < 4; i++) {
1735 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1736 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1739 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1740 assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits +
1741 s->misc_bits + s->i_tex_bits +
1743 flush_put_bits(&s->pb);
1744 s->frame_bits = put_bits_count(&s->pb);
1746 stuffing_count = ff_vbv_update(s, s->frame_bits);
1747 if (stuffing_count) {
1748 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1749 stuffing_count + 50) {
1750 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1754 switch (s->codec_id) {
1755 case AV_CODEC_ID_MPEG1VIDEO:
1756 case AV_CODEC_ID_MPEG2VIDEO:
1757 while (stuffing_count--) {
1758 put_bits(&s->pb, 8, 0);
1761 case AV_CODEC_ID_MPEG4:
1762 put_bits(&s->pb, 16, 0);
1763 put_bits(&s->pb, 16, 0x1C3);
1764 stuffing_count -= 4;
1765 while (stuffing_count--) {
1766 put_bits(&s->pb, 8, 0xFF);
1770 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1772 flush_put_bits(&s->pb);
1773 s->frame_bits = put_bits_count(&s->pb);
1776 /* update mpeg1/2 vbv_delay for CBR */
1777 if (s->avctx->rc_max_rate &&
1778 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1779 s->out_format == FMT_MPEG1 &&
1780 90000LL * (avctx->rc_buffer_size - 1) <=
1781 s->avctx->rc_max_rate * 0xFFFFLL) {
1782 AVCPBProperties *props;
1785 int vbv_delay, min_delay;
1786 double inbits = s->avctx->rc_max_rate *
1787 av_q2d(s->avctx->time_base);
1788 int minbits = s->frame_bits - 8 *
1789 (s->vbv_delay_ptr - s->pb.buf - 1);
1790 double bits = s->rc_context.buffer_index + minbits - inbits;
1793 av_log(s->avctx, AV_LOG_ERROR,
1794 "Internal error, negative bits\n");
1796 assert(s->repeat_first_field == 0);
1798 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1799 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1800 s->avctx->rc_max_rate;
1802 vbv_delay = FFMAX(vbv_delay, min_delay);
1804 assert(vbv_delay < 0xFFFF);
1806 s->vbv_delay_ptr[0] &= 0xF8;
1807 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1808 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1809 s->vbv_delay_ptr[2] &= 0x07;
1810 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1812 props = av_cpb_properties_alloc(&props_size);
1814 return AVERROR(ENOMEM);
1815 props->vbv_delay = vbv_delay * 300;
1817 ret = av_packet_add_side_data(pkt, AV_PKT_DATA_CPB_PROPERTIES,
1818 (uint8_t*)props, props_size);
1824 #if FF_API_VBV_DELAY
1825 FF_DISABLE_DEPRECATION_WARNINGS
1826 avctx->vbv_delay = vbv_delay * 300;
1827 FF_ENABLE_DEPRECATION_WARNINGS
1830 s->total_bits += s->frame_bits;
1831 #if FF_API_STAT_BITS
1832 FF_DISABLE_DEPRECATION_WARNINGS
1833 avctx->frame_bits = s->frame_bits;
1834 FF_ENABLE_DEPRECATION_WARNINGS
1838 pkt->pts = s->current_picture.f->pts;
1839 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1840 if (!s->current_picture.f->coded_picture_number)
1841 pkt->dts = pkt->pts - s->dts_delta;
1843 pkt->dts = s->reordered_pts;
1844 s->reordered_pts = pkt->pts;
1846 pkt->dts = pkt->pts;
1847 if (s->current_picture.f->key_frame)
1848 pkt->flags |= AV_PKT_FLAG_KEY;
1850 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1854 assert((s->frame_bits & 7) == 0);
1856 pkt->size = s->frame_bits / 8;
1857 *got_packet = !!pkt->size;
1861 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1862 int n, int threshold)
1864 static const char tab[64] = {
1865 3, 2, 2, 1, 1, 1, 1, 1,
1866 1, 1, 1, 1, 1, 1, 1, 1,
1867 1, 1, 1, 1, 1, 1, 1, 1,
1868 0, 0, 0, 0, 0, 0, 0, 0,
1869 0, 0, 0, 0, 0, 0, 0, 0,
1870 0, 0, 0, 0, 0, 0, 0, 0,
1871 0, 0, 0, 0, 0, 0, 0, 0,
1872 0, 0, 0, 0, 0, 0, 0, 0
1877 int16_t *block = s->block[n];
1878 const int last_index = s->block_last_index[n];
1881 if (threshold < 0) {
1883 threshold = -threshold;
1887 /* Are all we could set to zero already zero? */
1888 if (last_index <= skip_dc - 1)
1891 for (i = 0; i <= last_index; i++) {
1892 const int j = s->intra_scantable.permutated[i];
1893 const int level = FFABS(block[j]);
1895 if (skip_dc && i == 0)
1899 } else if (level > 1) {
1905 if (score >= threshold)
1907 for (i = skip_dc; i <= last_index; i++) {
1908 const int j = s->intra_scantable.permutated[i];
1912 s->block_last_index[n] = 0;
1914 s->block_last_index[n] = -1;
1917 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1921 const int maxlevel = s->max_qcoeff;
1922 const int minlevel = s->min_qcoeff;
1926 i = 1; // skip clipping of intra dc
1930 for (; i <= last_index; i++) {
1931 const int j = s->intra_scantable.permutated[i];
1932 int level = block[j];
1934 if (level > maxlevel) {
1937 } else if (level < minlevel) {
1945 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1946 av_log(s->avctx, AV_LOG_INFO,
1947 "warning, clipping %d dct coefficients to %d..%d\n",
1948 overflow, minlevel, maxlevel);
1951 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1955 for (y = 0; y < 8; y++) {
1956 for (x = 0; x < 8; x++) {
1962 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1963 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1964 int v = ptr[x2 + y2 * stride];
1970 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1975 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1976 int motion_x, int motion_y,
1977 int mb_block_height,
1980 int16_t weight[8][64];
1981 int16_t orig[8][64];
1982 const int mb_x = s->mb_x;
1983 const int mb_y = s->mb_y;
1986 int dct_offset = s->linesize * 8; // default for progressive frames
1987 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1988 ptrdiff_t wrap_y, wrap_c;
1990 for (i = 0; i < mb_block_count; i++)
1991 skip_dct[i] = s->skipdct;
1993 if (s->adaptive_quant) {
1994 const int last_qp = s->qscale;
1995 const int mb_xy = mb_x + mb_y * s->mb_stride;
1997 s->lambda = s->lambda_table[mb_xy];
2000 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2001 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
2002 s->dquant = s->qscale - last_qp;
2004 if (s->out_format == FMT_H263) {
2005 s->dquant = av_clip(s->dquant, -2, 2);
2007 if (s->codec_id == AV_CODEC_ID_MPEG4) {
2009 if (s->pict_type == AV_PICTURE_TYPE_B) {
2010 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
2013 if (s->mv_type == MV_TYPE_8X8)
2019 ff_set_qscale(s, last_qp + s->dquant);
2020 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2021 ff_set_qscale(s, s->qscale + s->dquant);
2023 wrap_y = s->linesize;
2024 wrap_c = s->uvlinesize;
2025 ptr_y = s->new_picture.f->data[0] +
2026 (mb_y * 16 * wrap_y) + mb_x * 16;
2027 ptr_cb = s->new_picture.f->data[1] +
2028 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2029 ptr_cr = s->new_picture.f->data[2] +
2030 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2032 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
2033 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
2034 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2036 16, 16, mb_x * 16, mb_y * 16,
2037 s->width, s->height);
2039 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
2041 8, mb_block_height, mb_x * 8, mb_y * 8,
2042 s->width >> 1, s->height >> 1);
2043 ptr_cb = ebuf + 18 * wrap_y;
2044 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
2046 8, mb_block_height, mb_x * 8, mb_y * 8,
2047 s->width >> 1, s->height >> 1);
2048 ptr_cr = ebuf + 18 * wrap_y + 8;
2052 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2053 int progressive_score, interlaced_score;
2055 s->interlaced_dct = 0;
2056 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2057 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2058 NULL, wrap_y, 8) - 400;
2060 if (progressive_score > 0) {
2061 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2062 NULL, wrap_y * 2, 8) +
2063 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2064 NULL, wrap_y * 2, 8);
2065 if (progressive_score > interlaced_score) {
2066 s->interlaced_dct = 1;
2068 dct_offset = wrap_y;
2070 if (s->chroma_format == CHROMA_422)
2076 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2077 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2078 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2079 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2081 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2085 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2086 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2087 if (!s->chroma_y_shift) { /* 422 */
2088 s->pdsp.get_pixels(s->block[6],
2089 ptr_cb + (dct_offset >> 1), wrap_c);
2090 s->pdsp.get_pixels(s->block[7],
2091 ptr_cr + (dct_offset >> 1), wrap_c);
2095 op_pixels_func (*op_pix)[4];
2096 qpel_mc_func (*op_qpix)[16];
2097 uint8_t *dest_y, *dest_cb, *dest_cr;
2099 dest_y = s->dest[0];
2100 dest_cb = s->dest[1];
2101 dest_cr = s->dest[2];
2103 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2104 op_pix = s->hdsp.put_pixels_tab;
2105 op_qpix = s->qdsp.put_qpel_pixels_tab;
2107 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2108 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2111 if (s->mv_dir & MV_DIR_FORWARD) {
2112 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2113 s->last_picture.f->data,
2115 op_pix = s->hdsp.avg_pixels_tab;
2116 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2118 if (s->mv_dir & MV_DIR_BACKWARD) {
2119 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2120 s->next_picture.f->data,
2124 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2125 int progressive_score, interlaced_score;
2127 s->interlaced_dct = 0;
2128 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2129 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2133 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2134 progressive_score -= 400;
2136 if (progressive_score > 0) {
2137 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2139 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2143 if (progressive_score > interlaced_score) {
2144 s->interlaced_dct = 1;
2146 dct_offset = wrap_y;
2148 if (s->chroma_format == CHROMA_422)
2154 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2155 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2156 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2157 dest_y + dct_offset, wrap_y);
2158 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2159 dest_y + dct_offset + 8, wrap_y);
2161 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2165 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2166 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2167 if (!s->chroma_y_shift) { /* 422 */
2168 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2169 dest_cb + (dct_offset >> 1), wrap_c);
2170 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2171 dest_cr + (dct_offset >> 1), wrap_c);
2174 /* pre quantization */
2175 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2176 2 * s->qscale * s->qscale) {
2178 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2180 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2182 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2183 wrap_y, 8) < 20 * s->qscale)
2185 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2186 wrap_y, 8) < 20 * s->qscale)
2188 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2190 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2192 if (!s->chroma_y_shift) { /* 422 */
2193 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2194 dest_cb + (dct_offset >> 1),
2195 wrap_c, 8) < 20 * s->qscale)
2197 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2198 dest_cr + (dct_offset >> 1),
2199 wrap_c, 8) < 20 * s->qscale)
2205 if (s->quantizer_noise_shaping) {
2207 get_visual_weight(weight[0], ptr_y , wrap_y);
2209 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2211 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2213 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2215 get_visual_weight(weight[4], ptr_cb , wrap_c);
2217 get_visual_weight(weight[5], ptr_cr , wrap_c);
2218 if (!s->chroma_y_shift) { /* 422 */
2220 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2223 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2226 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2229 /* DCT & quantize */
2230 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2232 for (i = 0; i < mb_block_count; i++) {
2235 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2236 // FIXME we could decide to change to quantizer instead of
2238 // JS: I don't think that would be a good idea it could lower
2239 // quality instead of improve it. Just INTRADC clipping
2240 // deserves changes in quantizer
2242 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2244 s->block_last_index[i] = -1;
2246 if (s->quantizer_noise_shaping) {
2247 for (i = 0; i < mb_block_count; i++) {
2249 s->block_last_index[i] =
2250 dct_quantize_refine(s, s->block[i], weight[i],
2251 orig[i], i, s->qscale);
2256 if (s->luma_elim_threshold && !s->mb_intra)
2257 for (i = 0; i < 4; i++)
2258 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2259 if (s->chroma_elim_threshold && !s->mb_intra)
2260 for (i = 4; i < mb_block_count; i++)
2261 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2263 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2264 for (i = 0; i < mb_block_count; i++) {
2265 if (s->block_last_index[i] == -1)
2266 s->coded_score[i] = INT_MAX / 256;
2271 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2272 s->block_last_index[4] =
2273 s->block_last_index[5] = 0;
2275 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2278 // non c quantize code returns incorrect block_last_index FIXME
2279 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2280 for (i = 0; i < mb_block_count; i++) {
2282 if (s->block_last_index[i] > 0) {
2283 for (j = 63; j > 0; j--) {
2284 if (s->block[i][s->intra_scantable.permutated[j]])
2287 s->block_last_index[i] = j;
2292 /* huffman encode */
2293 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2294 case AV_CODEC_ID_MPEG1VIDEO:
2295 case AV_CODEC_ID_MPEG2VIDEO:
2296 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2297 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2299 case AV_CODEC_ID_MPEG4:
2300 if (CONFIG_MPEG4_ENCODER)
2301 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2303 case AV_CODEC_ID_MSMPEG4V2:
2304 case AV_CODEC_ID_MSMPEG4V3:
2305 case AV_CODEC_ID_WMV1:
2306 if (CONFIG_MSMPEG4_ENCODER)
2307 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2309 case AV_CODEC_ID_WMV2:
2310 if (CONFIG_WMV2_ENCODER)
2311 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2313 case AV_CODEC_ID_H261:
2314 if (CONFIG_H261_ENCODER)
2315 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2317 case AV_CODEC_ID_H263:
2318 case AV_CODEC_ID_H263P:
2319 case AV_CODEC_ID_FLV1:
2320 case AV_CODEC_ID_RV10:
2321 case AV_CODEC_ID_RV20:
2322 if (CONFIG_H263_ENCODER)
2323 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2325 case AV_CODEC_ID_MJPEG:
2326 if (CONFIG_MJPEG_ENCODER)
2327 ff_mjpeg_encode_mb(s, s->block);
2334 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2336 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2337 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2340 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2343 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2346 d->mb_skip_run= s->mb_skip_run;
2348 d->last_dc[i] = s->last_dc[i];
2351 d->mv_bits= s->mv_bits;
2352 d->i_tex_bits= s->i_tex_bits;
2353 d->p_tex_bits= s->p_tex_bits;
2354 d->i_count= s->i_count;
2355 d->f_count= s->f_count;
2356 d->b_count= s->b_count;
2357 d->skip_count= s->skip_count;
2358 d->misc_bits= s->misc_bits;
2362 d->qscale= s->qscale;
2363 d->dquant= s->dquant;
2365 d->esc3_level_length= s->esc3_level_length;
2368 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2371 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2372 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2375 d->mb_skip_run= s->mb_skip_run;
2377 d->last_dc[i] = s->last_dc[i];
2380 d->mv_bits= s->mv_bits;
2381 d->i_tex_bits= s->i_tex_bits;
2382 d->p_tex_bits= s->p_tex_bits;
2383 d->i_count= s->i_count;
2384 d->f_count= s->f_count;
2385 d->b_count= s->b_count;
2386 d->skip_count= s->skip_count;
2387 d->misc_bits= s->misc_bits;
2389 d->mb_intra= s->mb_intra;
2390 d->mb_skipped= s->mb_skipped;
2391 d->mv_type= s->mv_type;
2392 d->mv_dir= s->mv_dir;
2394 if(s->data_partitioning){
2396 d->tex_pb= s->tex_pb;
2400 d->block_last_index[i]= s->block_last_index[i];
2401 d->interlaced_dct= s->interlaced_dct;
2402 d->qscale= s->qscale;
2404 d->esc3_level_length= s->esc3_level_length;
2407 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2408 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2409 int *dmin, int *next_block, int motion_x, int motion_y)
2412 uint8_t *dest_backup[3];
2414 copy_context_before_encode(s, backup, type);
2416 s->block= s->blocks[*next_block];
2417 s->pb= pb[*next_block];
2418 if(s->data_partitioning){
2419 s->pb2 = pb2 [*next_block];
2420 s->tex_pb= tex_pb[*next_block];
2424 memcpy(dest_backup, s->dest, sizeof(s->dest));
2425 s->dest[0] = s->sc.rd_scratchpad;
2426 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2427 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2428 assert(s->linesize >= 32); //FIXME
2431 encode_mb(s, motion_x, motion_y);
2433 score= put_bits_count(&s->pb);
2434 if(s->data_partitioning){
2435 score+= put_bits_count(&s->pb2);
2436 score+= put_bits_count(&s->tex_pb);
2439 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2440 ff_mpv_decode_mb(s, s->block);
2442 score *= s->lambda2;
2443 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2447 memcpy(s->dest, dest_backup, sizeof(s->dest));
2454 copy_context_after_encode(best, s, type);
2458 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2459 uint32_t *sq = ff_square_tab + 256;
2464 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2465 else if(w==8 && h==8)
2466 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2470 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2479 static int sse_mb(MpegEncContext *s){
2483 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2484 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2487 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2488 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) +
2489 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) +
2490 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);
2492 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) +
2493 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) +
2494 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);
2497 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)
2498 +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)
2499 +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);
2502 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2503 MpegEncContext *s= *(void**)arg;
2507 s->me.dia_size= s->avctx->pre_dia_size;
2508 s->first_slice_line=1;
2509 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2510 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2511 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2513 s->first_slice_line=0;
2521 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2522 MpegEncContext *s= *(void**)arg;
2524 s->me.dia_size= s->avctx->dia_size;
2525 s->first_slice_line=1;
2526 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2527 s->mb_x=0; //for block init below
2528 ff_init_block_index(s);
2529 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2530 s->block_index[0]+=2;
2531 s->block_index[1]+=2;
2532 s->block_index[2]+=2;
2533 s->block_index[3]+=2;
2535 /* compute motion vector & mb_type and store in context */
2536 if(s->pict_type==AV_PICTURE_TYPE_B)
2537 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2539 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2541 s->first_slice_line=0;
2546 static int mb_var_thread(AVCodecContext *c, void *arg){
2547 MpegEncContext *s= *(void**)arg;
2550 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2551 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2554 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2556 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2558 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2559 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2561 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2562 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2563 s->me.mb_var_sum_temp += varc;
2569 static void write_slice_end(MpegEncContext *s){
2570 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2571 if(s->partitioned_frame){
2572 ff_mpeg4_merge_partitions(s);
2575 ff_mpeg4_stuffing(&s->pb);
2576 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2577 ff_mjpeg_encode_stuffing(&s->pb);
2580 avpriv_align_put_bits(&s->pb);
2581 flush_put_bits(&s->pb);
2583 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2584 s->misc_bits+= get_bits_diff(s);
2587 static void write_mb_info(MpegEncContext *s)
2589 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2590 int offset = put_bits_count(&s->pb);
2591 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2592 int gobn = s->mb_y / s->gob_index;
2594 if (CONFIG_H263_ENCODER)
2595 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2596 bytestream_put_le32(&ptr, offset);
2597 bytestream_put_byte(&ptr, s->qscale);
2598 bytestream_put_byte(&ptr, gobn);
2599 bytestream_put_le16(&ptr, mba);
2600 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2601 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2602 /* 4MV not implemented */
2603 bytestream_put_byte(&ptr, 0); /* hmv2 */
2604 bytestream_put_byte(&ptr, 0); /* vmv2 */
2607 static void update_mb_info(MpegEncContext *s, int startcode)
2611 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2612 s->mb_info_size += 12;
2613 s->prev_mb_info = s->last_mb_info;
2616 s->prev_mb_info = put_bits_count(&s->pb)/8;
2617 /* This might have incremented mb_info_size above, and we return without
2618 * actually writing any info into that slot yet. But in that case,
2619 * this will be called again at the start of the after writing the
2620 * start code, actually writing the mb info. */
2624 s->last_mb_info = put_bits_count(&s->pb)/8;
2625 if (!s->mb_info_size)
2626 s->mb_info_size += 12;
2630 static int encode_thread(AVCodecContext *c, void *arg){
2631 MpegEncContext *s= *(void**)arg;
2632 int mb_x, mb_y, pdif = 0;
2633 int chr_h= 16>>s->chroma_y_shift;
2635 MpegEncContext best_s = { 0 }, backup_s;
2636 uint8_t bit_buf[2][MAX_MB_BYTES];
2637 uint8_t bit_buf2[2][MAX_MB_BYTES];
2638 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2639 PutBitContext pb[2], pb2[2], tex_pb[2];
2642 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2643 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2644 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2647 s->last_bits= put_bits_count(&s->pb);
2658 /* init last dc values */
2659 /* note: quant matrix value (8) is implied here */
2660 s->last_dc[i] = 128 << s->intra_dc_precision;
2662 s->current_picture.encoding_error[i] = 0;
2665 memset(s->last_mv, 0, sizeof(s->last_mv));
2669 switch(s->codec_id){
2670 case AV_CODEC_ID_H263:
2671 case AV_CODEC_ID_H263P:
2672 case AV_CODEC_ID_FLV1:
2673 if (CONFIG_H263_ENCODER)
2674 s->gob_index = H263_GOB_HEIGHT(s->height);
2676 case AV_CODEC_ID_MPEG4:
2677 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2678 ff_mpeg4_init_partitions(s);
2684 s->first_slice_line = 1;
2685 s->ptr_lastgob = s->pb.buf;
2686 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2690 ff_set_qscale(s, s->qscale);
2691 ff_init_block_index(s);
2693 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2694 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2695 int mb_type= s->mb_type[xy];
2700 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2701 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2704 if(s->data_partitioning){
2705 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2706 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2707 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2713 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2714 ff_update_block_index(s);
2716 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2717 ff_h261_reorder_mb_index(s);
2718 xy= s->mb_y*s->mb_stride + s->mb_x;
2719 mb_type= s->mb_type[xy];
2722 /* write gob / video packet header */
2724 int current_packet_size, is_gob_start;
2726 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2728 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2730 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2732 switch(s->codec_id){
2733 case AV_CODEC_ID_H263:
2734 case AV_CODEC_ID_H263P:
2735 if(!s->h263_slice_structured)
2736 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2738 case AV_CODEC_ID_MPEG2VIDEO:
2739 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2740 case AV_CODEC_ID_MPEG1VIDEO:
2741 if(s->mb_skip_run) is_gob_start=0;
2746 if(s->start_mb_y != mb_y || mb_x!=0){
2749 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2750 ff_mpeg4_init_partitions(s);
2754 assert((put_bits_count(&s->pb)&7) == 0);
2755 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2757 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2758 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2759 int d = 100 / s->error_rate;
2761 current_packet_size=0;
2762 s->pb.buf_ptr= s->ptr_lastgob;
2763 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2767 #if FF_API_RTP_CALLBACK
2768 FF_DISABLE_DEPRECATION_WARNINGS
2769 if (s->avctx->rtp_callback){
2770 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2771 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2773 FF_ENABLE_DEPRECATION_WARNINGS
2775 update_mb_info(s, 1);
2777 switch(s->codec_id){
2778 case AV_CODEC_ID_MPEG4:
2779 if (CONFIG_MPEG4_ENCODER) {
2780 ff_mpeg4_encode_video_packet_header(s);
2781 ff_mpeg4_clean_buffers(s);
2784 case AV_CODEC_ID_MPEG1VIDEO:
2785 case AV_CODEC_ID_MPEG2VIDEO:
2786 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2787 ff_mpeg1_encode_slice_header(s);
2788 ff_mpeg1_clean_buffers(s);
2791 case AV_CODEC_ID_H263:
2792 case AV_CODEC_ID_H263P:
2793 if (CONFIG_H263_ENCODER)
2794 ff_h263_encode_gob_header(s, mb_y);
2798 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2799 int bits= put_bits_count(&s->pb);
2800 s->misc_bits+= bits - s->last_bits;
2804 s->ptr_lastgob += current_packet_size;
2805 s->first_slice_line=1;
2806 s->resync_mb_x=mb_x;
2807 s->resync_mb_y=mb_y;
2811 if( (s->resync_mb_x == s->mb_x)
2812 && s->resync_mb_y+1 == s->mb_y){
2813 s->first_slice_line=0;
2817 s->dquant=0; //only for QP_RD
2819 update_mb_info(s, 0);
2821 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
2823 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2825 copy_context_before_encode(&backup_s, s, -1);
2827 best_s.data_partitioning= s->data_partitioning;
2828 best_s.partitioned_frame= s->partitioned_frame;
2829 if(s->data_partitioning){
2830 backup_s.pb2= s->pb2;
2831 backup_s.tex_pb= s->tex_pb;
2834 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2835 s->mv_dir = MV_DIR_FORWARD;
2836 s->mv_type = MV_TYPE_16X16;
2838 s->mv[0][0][0] = s->p_mv_table[xy][0];
2839 s->mv[0][0][1] = s->p_mv_table[xy][1];
2840 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2841 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2843 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2844 s->mv_dir = MV_DIR_FORWARD;
2845 s->mv_type = MV_TYPE_FIELD;
2848 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2849 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2850 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2852 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2853 &dmin, &next_block, 0, 0);
2855 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2856 s->mv_dir = MV_DIR_FORWARD;
2857 s->mv_type = MV_TYPE_16X16;
2861 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2862 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2864 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2865 s->mv_dir = MV_DIR_FORWARD;
2866 s->mv_type = MV_TYPE_8X8;
2869 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2870 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2872 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2873 &dmin, &next_block, 0, 0);
2875 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2876 s->mv_dir = MV_DIR_FORWARD;
2877 s->mv_type = MV_TYPE_16X16;
2879 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2880 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2881 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2882 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2884 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2885 s->mv_dir = MV_DIR_BACKWARD;
2886 s->mv_type = MV_TYPE_16X16;
2888 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2889 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2890 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2891 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2893 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2894 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2895 s->mv_type = MV_TYPE_16X16;
2897 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2898 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2899 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2900 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2901 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2902 &dmin, &next_block, 0, 0);
2904 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2905 s->mv_dir = MV_DIR_FORWARD;
2906 s->mv_type = MV_TYPE_FIELD;
2909 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2910 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2911 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2913 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2914 &dmin, &next_block, 0, 0);
2916 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2917 s->mv_dir = MV_DIR_BACKWARD;
2918 s->mv_type = MV_TYPE_FIELD;
2921 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2922 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2923 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2925 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2926 &dmin, &next_block, 0, 0);
2928 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2929 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2930 s->mv_type = MV_TYPE_FIELD;
2932 for(dir=0; dir<2; dir++){
2934 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2935 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2936 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2939 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2940 &dmin, &next_block, 0, 0);
2942 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2944 s->mv_type = MV_TYPE_16X16;
2948 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2949 &dmin, &next_block, 0, 0);
2950 if(s->h263_pred || s->h263_aic){
2952 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2954 ff_clean_intra_table_entries(s); //old mode?
2958 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2959 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2960 const int last_qp= backup_s.qscale;
2963 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2964 static const int dquant_tab[4]={-1,1,-2,2};
2966 assert(backup_s.dquant == 0);
2969 s->mv_dir= best_s.mv_dir;
2970 s->mv_type = MV_TYPE_16X16;
2971 s->mb_intra= best_s.mb_intra;
2972 s->mv[0][0][0] = best_s.mv[0][0][0];
2973 s->mv[0][0][1] = best_s.mv[0][0][1];
2974 s->mv[1][0][0] = best_s.mv[1][0][0];
2975 s->mv[1][0][1] = best_s.mv[1][0][1];
2977 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2978 for(; qpi<4; qpi++){
2979 int dquant= dquant_tab[qpi];
2980 qp= last_qp + dquant;
2981 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2983 backup_s.dquant= dquant;
2984 if(s->mb_intra && s->dc_val[0]){
2986 dc[i]= s->dc_val[0][ s->block_index[i] ];
2987 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2991 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2992 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2993 if(best_s.qscale != qp){
2994 if(s->mb_intra && s->dc_val[0]){
2996 s->dc_val[0][ s->block_index[i] ]= dc[i];
2997 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
3004 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3005 int mx= s->b_direct_mv_table[xy][0];
3006 int my= s->b_direct_mv_table[xy][1];
3008 backup_s.dquant = 0;
3009 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3011 ff_mpeg4_set_direct_mv(s, mx, my);
3012 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3013 &dmin, &next_block, mx, my);
3015 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3016 backup_s.dquant = 0;
3017 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3019 ff_mpeg4_set_direct_mv(s, 0, 0);
3020 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3021 &dmin, &next_block, 0, 0);
3023 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3026 coded |= s->block_last_index[i];
3029 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3030 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3031 mx=my=0; //FIXME find the one we actually used
3032 ff_mpeg4_set_direct_mv(s, mx, my);
3033 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3041 s->mv_dir= best_s.mv_dir;
3042 s->mv_type = best_s.mv_type;
3044 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3045 s->mv[0][0][1] = best_s.mv[0][0][1];
3046 s->mv[1][0][0] = best_s.mv[1][0][0];
3047 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3050 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3051 &dmin, &next_block, mx, my);
3056 s->current_picture.qscale_table[xy] = best_s.qscale;
3058 copy_context_after_encode(s, &best_s, -1);
3060 pb_bits_count= put_bits_count(&s->pb);
3061 flush_put_bits(&s->pb);
3062 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3065 if(s->data_partitioning){
3066 pb2_bits_count= put_bits_count(&s->pb2);
3067 flush_put_bits(&s->pb2);
3068 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3069 s->pb2= backup_s.pb2;
3071 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3072 flush_put_bits(&s->tex_pb);
3073 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3074 s->tex_pb= backup_s.tex_pb;
3076 s->last_bits= put_bits_count(&s->pb);
3078 if (CONFIG_H263_ENCODER &&
3079 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3080 ff_h263_update_motion_val(s);
3082 if(next_block==0){ //FIXME 16 vs linesize16
3083 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3084 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3085 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3088 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3089 ff_mpv_decode_mb(s, s->block);
3091 int motion_x = 0, motion_y = 0;
3092 s->mv_type=MV_TYPE_16X16;
3093 // only one MB-Type possible
3096 case CANDIDATE_MB_TYPE_INTRA:
3099 motion_x= s->mv[0][0][0] = 0;
3100 motion_y= s->mv[0][0][1] = 0;
3102 case CANDIDATE_MB_TYPE_INTER:
3103 s->mv_dir = MV_DIR_FORWARD;
3105 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3106 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3108 case CANDIDATE_MB_TYPE_INTER_I:
3109 s->mv_dir = MV_DIR_FORWARD;
3110 s->mv_type = MV_TYPE_FIELD;
3113 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3114 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3115 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3118 case CANDIDATE_MB_TYPE_INTER4V:
3119 s->mv_dir = MV_DIR_FORWARD;
3120 s->mv_type = MV_TYPE_8X8;
3123 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3124 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3127 case CANDIDATE_MB_TYPE_DIRECT:
3128 if (CONFIG_MPEG4_ENCODER) {
3129 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3131 motion_x=s->b_direct_mv_table[xy][0];
3132 motion_y=s->b_direct_mv_table[xy][1];
3133 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3136 case CANDIDATE_MB_TYPE_DIRECT0:
3137 if (CONFIG_MPEG4_ENCODER) {
3138 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3140 ff_mpeg4_set_direct_mv(s, 0, 0);
3143 case CANDIDATE_MB_TYPE_BIDIR:
3144 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3146 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3147 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3148 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3149 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3151 case CANDIDATE_MB_TYPE_BACKWARD:
3152 s->mv_dir = MV_DIR_BACKWARD;
3154 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3155 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3157 case CANDIDATE_MB_TYPE_FORWARD:
3158 s->mv_dir = MV_DIR_FORWARD;
3160 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3161 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3163 case CANDIDATE_MB_TYPE_FORWARD_I:
3164 s->mv_dir = MV_DIR_FORWARD;
3165 s->mv_type = MV_TYPE_FIELD;
3168 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3169 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3170 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3173 case CANDIDATE_MB_TYPE_BACKWARD_I:
3174 s->mv_dir = MV_DIR_BACKWARD;
3175 s->mv_type = MV_TYPE_FIELD;
3178 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3179 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3180 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3183 case CANDIDATE_MB_TYPE_BIDIR_I:
3184 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3185 s->mv_type = MV_TYPE_FIELD;
3187 for(dir=0; dir<2; dir++){
3189 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3190 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3191 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3196 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3199 encode_mb(s, motion_x, motion_y);
3201 // RAL: Update last macroblock type
3202 s->last_mv_dir = s->mv_dir;
3204 if (CONFIG_H263_ENCODER &&
3205 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3206 ff_h263_update_motion_val(s);
3208 ff_mpv_decode_mb(s, s->block);
3211 /* clean the MV table in IPS frames for direct mode in B frames */
3212 if(s->mb_intra /* && I,P,S_TYPE */){
3213 s->p_mv_table[xy][0]=0;
3214 s->p_mv_table[xy][1]=0;
3217 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3221 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3222 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3224 s->current_picture.encoding_error[0] += sse(
3225 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3226 s->dest[0], w, h, s->linesize);
3227 s->current_picture.encoding_error[1] += sse(
3228 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3229 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3230 s->current_picture.encoding_error[2] += sse(
3231 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3232 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3235 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3236 ff_h263_loop_filter(s);
3238 ff_dlog(s->avctx, "MB %d %d bits\n",
3239 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3243 //not beautiful here but we must write it before flushing so it has to be here
3244 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3245 ff_msmpeg4_encode_ext_header(s);
3249 #if FF_API_RTP_CALLBACK
3250 FF_DISABLE_DEPRECATION_WARNINGS
3251 /* Send the last GOB if RTP */
3252 if (s->avctx->rtp_callback) {
3253 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3254 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3255 /* Call the RTP callback to send the last GOB */
3257 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3259 FF_ENABLE_DEPRECATION_WARNINGS
3265 #define MERGE(field) dst->field += src->field; src->field=0
3266 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3267 MERGE(me.scene_change_score);
3268 MERGE(me.mc_mb_var_sum_temp);
3269 MERGE(me.mb_var_sum_temp);
3272 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3275 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3276 MERGE(dct_count[1]);
3285 MERGE(er.error_count);
3286 MERGE(padding_bug_score);
3287 MERGE(current_picture.encoding_error[0]);
3288 MERGE(current_picture.encoding_error[1]);
3289 MERGE(current_picture.encoding_error[2]);
3291 if(dst->avctx->noise_reduction){
3292 for(i=0; i<64; i++){
3293 MERGE(dct_error_sum[0][i]);
3294 MERGE(dct_error_sum[1][i]);
3298 assert(put_bits_count(&src->pb) % 8 ==0);
3299 assert(put_bits_count(&dst->pb) % 8 ==0);
3300 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3301 flush_put_bits(&dst->pb);
3304 static int estimate_qp(MpegEncContext *s, int dry_run){
3305 if (s->next_lambda){
3306 s->current_picture_ptr->f->quality =
3307 s->current_picture.f->quality = s->next_lambda;
3308 if(!dry_run) s->next_lambda= 0;
3309 } else if (!s->fixed_qscale) {
3310 s->current_picture_ptr->f->quality =
3311 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3312 if (s->current_picture.f->quality < 0)
3316 if(s->adaptive_quant){
3317 switch(s->codec_id){
3318 case AV_CODEC_ID_MPEG4:
3319 if (CONFIG_MPEG4_ENCODER)
3320 ff_clean_mpeg4_qscales(s);
3322 case AV_CODEC_ID_H263:
3323 case AV_CODEC_ID_H263P:
3324 case AV_CODEC_ID_FLV1:
3325 if (CONFIG_H263_ENCODER)
3326 ff_clean_h263_qscales(s);
3329 ff_init_qscale_tab(s);
3332 s->lambda= s->lambda_table[0];
3335 s->lambda = s->current_picture.f->quality;
3340 /* must be called before writing the header */
3341 static void set_frame_distances(MpegEncContext * s){
3342 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3343 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3345 if(s->pict_type==AV_PICTURE_TYPE_B){
3346 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3347 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3349 s->pp_time= s->time - s->last_non_b_time;
3350 s->last_non_b_time= s->time;
3351 assert(s->picture_number==0 || s->pp_time > 0);
3355 static int encode_picture(MpegEncContext *s, int picture_number)
3359 int context_count = s->slice_context_count;
3361 s->picture_number = picture_number;
3363 /* Reset the average MB variance */
3364 s->me.mb_var_sum_temp =
3365 s->me.mc_mb_var_sum_temp = 0;
3367 /* we need to initialize some time vars before we can encode b-frames */
3368 // RAL: Condition added for MPEG1VIDEO
3369 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3370 set_frame_distances(s);
3371 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3372 ff_set_mpeg4_time(s);
3374 s->me.scene_change_score=0;
3376 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3378 if(s->pict_type==AV_PICTURE_TYPE_I){
3379 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3380 else s->no_rounding=0;
3381 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3382 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3383 s->no_rounding ^= 1;
3386 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3387 if (estimate_qp(s,1) < 0)
3389 ff_get_2pass_fcode(s);
3390 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3391 if(s->pict_type==AV_PICTURE_TYPE_B)
3392 s->lambda= s->last_lambda_for[s->pict_type];
3394 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3398 s->mb_intra=0; //for the rate distortion & bit compare functions
3399 for(i=1; i<context_count; i++){
3400 ret = ff_update_duplicate_context(s->thread_context[i], s);
3408 /* Estimate motion for every MB */
3409 if(s->pict_type != AV_PICTURE_TYPE_I){
3410 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3411 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3412 if (s->pict_type != AV_PICTURE_TYPE_B) {
3413 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3414 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3418 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3419 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3421 for(i=0; i<s->mb_stride*s->mb_height; i++)
3422 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3424 if(!s->fixed_qscale){
3425 /* finding spatial complexity for I-frame rate control */
3426 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3429 for(i=1; i<context_count; i++){
3430 merge_context_after_me(s, s->thread_context[i]);
3432 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3433 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3436 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3437 s->pict_type= AV_PICTURE_TYPE_I;
3438 for(i=0; i<s->mb_stride*s->mb_height; i++)
3439 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3440 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3441 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3445 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3446 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3448 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3450 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3451 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3452 s->f_code= FFMAX3(s->f_code, a, b);
3455 ff_fix_long_p_mvs(s);
3456 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3457 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3461 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3462 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3467 if(s->pict_type==AV_PICTURE_TYPE_B){
3470 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3471 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3472 s->f_code = FFMAX(a, b);
3474 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3475 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3476 s->b_code = FFMAX(a, b);
3478 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3479 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3480 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3481 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3482 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3484 for(dir=0; dir<2; dir++){
3487 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3488 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3489 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3490 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3498 if (estimate_qp(s, 0) < 0)
3501 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3502 s->pict_type == AV_PICTURE_TYPE_I &&
3503 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3504 s->qscale= 3; //reduce clipping problems
3506 if (s->out_format == FMT_MJPEG) {
3507 /* for mjpeg, we do include qscale in the matrix */
3509 int j = s->idsp.idct_permutation[i];
3511 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3513 s->y_dc_scale_table=
3514 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3515 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3516 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3517 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3521 //FIXME var duplication
3522 s->current_picture_ptr->f->key_frame =
3523 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3524 s->current_picture_ptr->f->pict_type =
3525 s->current_picture.f->pict_type = s->pict_type;
3527 if (s->current_picture.f->key_frame)
3528 s->picture_in_gop_number=0;
3530 s->last_bits= put_bits_count(&s->pb);
3531 switch(s->out_format) {
3533 if (CONFIG_MJPEG_ENCODER)
3534 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3538 if (CONFIG_H261_ENCODER)
3539 ff_h261_encode_picture_header(s, picture_number);
3542 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3543 ff_wmv2_encode_picture_header(s, picture_number);
3544 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3545 ff_msmpeg4_encode_picture_header(s, picture_number);
3546 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3547 ff_mpeg4_encode_picture_header(s, picture_number);
3548 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3549 ret = ff_rv10_encode_picture_header(s, picture_number);
3553 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3554 ff_rv20_encode_picture_header(s, picture_number);
3555 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3556 ff_flv_encode_picture_header(s, picture_number);
3557 else if (CONFIG_H263_ENCODER)
3558 ff_h263_encode_picture_header(s, picture_number);
3561 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3562 ff_mpeg1_encode_picture_header(s, picture_number);
3567 bits= put_bits_count(&s->pb);
3568 s->header_bits= bits - s->last_bits;
3570 for(i=1; i<context_count; i++){
3571 update_duplicate_context_after_me(s->thread_context[i], s);
3573 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3574 for(i=1; i<context_count; i++){
3575 merge_context_after_encode(s, s->thread_context[i]);
3581 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3582 const int intra= s->mb_intra;
3585 s->dct_count[intra]++;
3587 for(i=0; i<64; i++){
3588 int level= block[i];
3592 s->dct_error_sum[intra][i] += level;
3593 level -= s->dct_offset[intra][i];
3594 if(level<0) level=0;
3596 s->dct_error_sum[intra][i] -= level;
3597 level += s->dct_offset[intra][i];
3598 if(level>0) level=0;
3605 static int dct_quantize_trellis_c(MpegEncContext *s,
3606 int16_t *block, int n,
3607 int qscale, int *overflow){
3609 const uint8_t *scantable= s->intra_scantable.scantable;
3610 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3612 unsigned int threshold1, threshold2;
3624 int coeff_count[64];
3625 int qmul, qadd, start_i, last_non_zero, i, dc;
3626 const int esc_length= s->ac_esc_length;
3628 uint8_t * last_length;
3629 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3631 s->fdsp.fdct(block);
3633 if(s->dct_error_sum)
3634 s->denoise_dct(s, block);
3636 qadd= ((qscale-1)|1)*8;
3647 /* For AIC we skip quant/dequant of INTRADC */
3652 /* note: block[0] is assumed to be positive */
3653 block[0] = (block[0] + (q >> 1)) / q;
3656 qmat = s->q_intra_matrix[qscale];
3657 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3658 bias= 1<<(QMAT_SHIFT-1);
3659 length = s->intra_ac_vlc_length;
3660 last_length= s->intra_ac_vlc_last_length;
3664 qmat = s->q_inter_matrix[qscale];
3665 length = s->inter_ac_vlc_length;
3666 last_length= s->inter_ac_vlc_last_length;
3670 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3671 threshold2= (threshold1<<1);
3673 for(i=63; i>=start_i; i--) {
3674 const int j = scantable[i];
3675 int level = block[j] * qmat[j];
3677 if(((unsigned)(level+threshold1))>threshold2){
3683 for(i=start_i; i<=last_non_zero; i++) {
3684 const int j = scantable[i];
3685 int level = block[j] * qmat[j];
3687 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3688 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3689 if(((unsigned)(level+threshold1))>threshold2){
3691 level= (bias + level)>>QMAT_SHIFT;
3693 coeff[1][i]= level-1;
3694 // coeff[2][k]= level-2;
3696 level= (bias - level)>>QMAT_SHIFT;
3697 coeff[0][i]= -level;
3698 coeff[1][i]= -level+1;
3699 // coeff[2][k]= -level+2;
3701 coeff_count[i]= FFMIN(level, 2);
3702 assert(coeff_count[i]);
3705 coeff[0][i]= (level>>31)|1;
3710 *overflow= s->max_qcoeff < max; //overflow might have happened
3712 if(last_non_zero < start_i){
3713 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3714 return last_non_zero;
3717 score_tab[start_i]= 0;
3718 survivor[0]= start_i;
3721 for(i=start_i; i<=last_non_zero; i++){
3722 int level_index, j, zero_distortion;
3723 int dct_coeff= FFABS(block[ scantable[i] ]);
3724 int best_score=256*256*256*120;
3726 if (s->fdsp.fdct == ff_fdct_ifast)
3727 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3728 zero_distortion= dct_coeff*dct_coeff;
3730 for(level_index=0; level_index < coeff_count[i]; level_index++){
3732 int level= coeff[level_index][i];
3733 const int alevel= FFABS(level);
3738 if(s->out_format == FMT_H263){
3739 unquant_coeff= alevel*qmul + qadd;
3741 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3743 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3744 unquant_coeff = (unquant_coeff - 1) | 1;
3746 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3747 unquant_coeff = (unquant_coeff - 1) | 1;
3752 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3754 if((level&(~127)) == 0){
3755 for(j=survivor_count-1; j>=0; j--){
3756 int run= i - survivor[j];
3757 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3758 score += score_tab[i-run];
3760 if(score < best_score){
3763 level_tab[i+1]= level-64;
3767 if(s->out_format == FMT_H263){
3768 for(j=survivor_count-1; j>=0; j--){
3769 int run= i - survivor[j];
3770 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3771 score += score_tab[i-run];
3772 if(score < last_score){
3775 last_level= level-64;
3781 distortion += esc_length*lambda;
3782 for(j=survivor_count-1; j>=0; j--){
3783 int run= i - survivor[j];
3784 int score= distortion + score_tab[i-run];
3786 if(score < best_score){
3789 level_tab[i+1]= level-64;
3793 if(s->out_format == FMT_H263){
3794 for(j=survivor_count-1; j>=0; j--){
3795 int run= i - survivor[j];
3796 int score= distortion + score_tab[i-run];
3797 if(score < last_score){
3800 last_level= level-64;
3808 score_tab[i+1]= best_score;
3810 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3811 if(last_non_zero <= 27){
3812 for(; survivor_count; survivor_count--){
3813 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3817 for(; survivor_count; survivor_count--){
3818 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3823 survivor[ survivor_count++ ]= i+1;
3826 if(s->out_format != FMT_H263){
3827 last_score= 256*256*256*120;
3828 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3829 int score= score_tab[i];
3830 if(i) score += lambda*2; //FIXME exacter?
3832 if(score < last_score){
3835 last_level= level_tab[i];
3836 last_run= run_tab[i];
3841 s->coded_score[n] = last_score;
3843 dc= FFABS(block[0]);
3844 last_non_zero= last_i - 1;
3845 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3847 if(last_non_zero < start_i)
3848 return last_non_zero;
3850 if(last_non_zero == 0 && start_i == 0){
3852 int best_score= dc * dc;
3854 for(i=0; i<coeff_count[0]; i++){
3855 int level= coeff[i][0];
3856 int alevel= FFABS(level);
3857 int unquant_coeff, score, distortion;
3859 if(s->out_format == FMT_H263){
3860 unquant_coeff= (alevel*qmul + qadd)>>3;
3862 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3863 unquant_coeff = (unquant_coeff - 1) | 1;
3865 unquant_coeff = (unquant_coeff + 4) >> 3;
3866 unquant_coeff<<= 3 + 3;
3868 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3870 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3871 else score= distortion + esc_length*lambda;
3873 if(score < best_score){
3875 best_level= level - 64;
3878 block[0]= best_level;
3879 s->coded_score[n] = best_score - dc*dc;
3880 if(best_level == 0) return -1;
3881 else return last_non_zero;
3887 block[ perm_scantable[last_non_zero] ]= last_level;
3890 for(; i>start_i; i -= run_tab[i] + 1){
3891 block[ perm_scantable[i-1] ]= level_tab[i];
3894 return last_non_zero;
3897 //#define REFINE_STATS 1
3898 static int16_t basis[64][64];
3900 static void build_basis(uint8_t *perm){
3907 double s= 0.25*(1<<BASIS_SHIFT);
3909 int perm_index= perm[index];
3910 if(i==0) s*= sqrt(0.5);
3911 if(j==0) s*= sqrt(0.5);
3912 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)));
3919 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3920 int16_t *block, int16_t *weight, int16_t *orig,
3923 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3924 const uint8_t *scantable= s->intra_scantable.scantable;
3925 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3926 // unsigned int threshold1, threshold2;
3931 int qmul, qadd, start_i, last_non_zero, i, dc;
3933 uint8_t * last_length;
3935 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3938 static int after_last=0;
3939 static int to_zero=0;
3940 static int from_zero=0;
3943 static int messed_sign=0;
3946 if(basis[0][0] == 0)
3947 build_basis(s->idsp.idct_permutation);
3958 /* For AIC we skip quant/dequant of INTRADC */
3962 q <<= RECON_SHIFT-3;
3963 /* note: block[0] is assumed to be positive */
3965 // block[0] = (block[0] + (q >> 1)) / q;
3967 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3968 // bias= 1<<(QMAT_SHIFT-1);
3969 length = s->intra_ac_vlc_length;
3970 last_length= s->intra_ac_vlc_last_length;
3974 length = s->inter_ac_vlc_length;
3975 last_length= s->inter_ac_vlc_last_length;
3977 last_non_zero = s->block_last_index[n];
3982 dc += (1<<(RECON_SHIFT-1));
3983 for(i=0; i<64; i++){
3984 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3987 STOP_TIMER("memset rem[]")}
3990 for(i=0; i<64; i++){
3995 w= FFABS(weight[i]) + qns*one;
3996 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3999 // w=weight[i] = (63*qns + (w/2)) / w;
4005 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4011 for(i=start_i; i<=last_non_zero; i++){
4012 int j= perm_scantable[i];
4013 const int level= block[j];
4017 if(level<0) coeff= qmul*level - qadd;
4018 else coeff= qmul*level + qadd;
4019 run_tab[rle_index++]=run;
4022 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4028 if(last_non_zero>0){
4029 STOP_TIMER("init rem[]")
4036 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4039 int run2, best_unquant_change=0, analyze_gradient;
4043 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4045 if(analyze_gradient){
4049 for(i=0; i<64; i++){
4052 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4055 STOP_TIMER("rem*w*w")}
4065 const int level= block[0];
4066 int change, old_coeff;
4068 assert(s->mb_intra);
4072 for(change=-1; change<=1; change+=2){
4073 int new_level= level + change;
4074 int score, new_coeff;
4076 new_coeff= q*new_level;
4077 if(new_coeff >= 2048 || new_coeff < 0)
4080 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4081 new_coeff - old_coeff);
4082 if(score<best_score){
4085 best_change= change;
4086 best_unquant_change= new_coeff - old_coeff;
4093 run2= run_tab[rle_index++];
4097 for(i=start_i; i<64; i++){
4098 int j= perm_scantable[i];
4099 const int level= block[j];
4100 int change, old_coeff;
4102 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4106 if(level<0) old_coeff= qmul*level - qadd;
4107 else old_coeff= qmul*level + qadd;
4108 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4112 assert(run2>=0 || i >= last_non_zero );
4115 for(change=-1; change<=1; change+=2){
4116 int new_level= level + change;
4117 int score, new_coeff, unquant_change;
4120 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4124 if(new_level<0) new_coeff= qmul*new_level - qadd;
4125 else new_coeff= qmul*new_level + qadd;
4126 if(new_coeff >= 2048 || new_coeff <= -2048)
4128 //FIXME check for overflow
4131 if(level < 63 && level > -63){
4132 if(i < last_non_zero)
4133 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4134 - length[UNI_AC_ENC_INDEX(run, level+64)];
4136 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4137 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4140 assert(FFABS(new_level)==1);
4142 if(analyze_gradient){
4143 int g= d1[ scantable[i] ];
4144 if(g && (g^new_level) >= 0)
4148 if(i < last_non_zero){
4149 int next_i= i + run2 + 1;
4150 int next_level= block[ perm_scantable[next_i] ] + 64;
4152 if(next_level&(~127))
4155 if(next_i < last_non_zero)
4156 score += length[UNI_AC_ENC_INDEX(run, 65)]
4157 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4158 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4160 score += length[UNI_AC_ENC_INDEX(run, 65)]
4161 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4162 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4164 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4166 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4167 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4173 assert(FFABS(level)==1);
4175 if(i < last_non_zero){
4176 int next_i= i + run2 + 1;
4177 int next_level= block[ perm_scantable[next_i] ] + 64;
4179 if(next_level&(~127))
4182 if(next_i < last_non_zero)
4183 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4184 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4185 - length[UNI_AC_ENC_INDEX(run, 65)];
4187 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4188 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4189 - length[UNI_AC_ENC_INDEX(run, 65)];
4191 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4193 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4194 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4201 unquant_change= new_coeff - old_coeff;
4202 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4204 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4206 if(score<best_score){
4209 best_change= change;
4210 best_unquant_change= unquant_change;
4214 prev_level= level + 64;
4215 if(prev_level&(~127))
4224 STOP_TIMER("iterative step")}
4228 int j= perm_scantable[ best_coeff ];
4230 block[j] += best_change;
4232 if(best_coeff > last_non_zero){
4233 last_non_zero= best_coeff;
4241 if(block[j] - best_change){
4242 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4254 for(; last_non_zero>=start_i; last_non_zero--){
4255 if(block[perm_scantable[last_non_zero]])
4261 if(256*256*256*64 % count == 0){
4262 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);
4267 for(i=start_i; i<=last_non_zero; i++){
4268 int j= perm_scantable[i];
4269 const int level= block[j];
4272 run_tab[rle_index++]=run;
4279 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4285 if(last_non_zero>0){
4286 STOP_TIMER("iterative search")
4291 return last_non_zero;
4295 * Permute an 8x8 block according to permuatation.
4296 * @param block the block which will be permuted according to
4297 * the given permutation vector
4298 * @param permutation the permutation vector
4299 * @param last the last non zero coefficient in scantable order, used to
4300 * speed the permutation up
4301 * @param scantable the used scantable, this is only used to speed the
4302 * permutation up, the block is not (inverse) permutated
4303 * to scantable order!
4305 static void block_permute(int16_t *block, uint8_t *permutation,
4306 const uint8_t *scantable, int last)
4313 //FIXME it is ok but not clean and might fail for some permutations
4314 // if (permutation[1] == 1)
4317 for (i = 0; i <= last; i++) {
4318 const int j = scantable[i];
4323 for (i = 0; i <= last; i++) {
4324 const int j = scantable[i];
4325 const int perm_j = permutation[j];
4326 block[perm_j] = temp[j];
4330 int ff_dct_quantize_c(MpegEncContext *s,
4331 int16_t *block, int n,
4332 int qscale, int *overflow)
4334 int i, j, level, last_non_zero, q, start_i;
4336 const uint8_t *scantable= s->intra_scantable.scantable;
4339 unsigned int threshold1, threshold2;
4341 s->fdsp.fdct(block);
4343 if(s->dct_error_sum)
4344 s->denoise_dct(s, block);
4354 /* For AIC we skip quant/dequant of INTRADC */
4357 /* note: block[0] is assumed to be positive */
4358 block[0] = (block[0] + (q >> 1)) / q;
4361 qmat = s->q_intra_matrix[qscale];
4362 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4366 qmat = s->q_inter_matrix[qscale];
4367 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4369 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4370 threshold2= (threshold1<<1);
4371 for(i=63;i>=start_i;i--) {
4373 level = block[j] * qmat[j];
4375 if(((unsigned)(level+threshold1))>threshold2){
4382 for(i=start_i; i<=last_non_zero; i++) {
4384 level = block[j] * qmat[j];
4386 // if( bias+level >= (1<<QMAT_SHIFT)
4387 // || bias-level >= (1<<QMAT_SHIFT)){
4388 if(((unsigned)(level+threshold1))>threshold2){
4390 level= (bias + level)>>QMAT_SHIFT;
4393 level= (bias - level)>>QMAT_SHIFT;
4401 *overflow= s->max_qcoeff < max; //overflow might have happened
4403 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4404 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4405 block_permute(block, s->idsp.idct_permutation,
4406 scantable, last_non_zero);
4408 return last_non_zero;
4411 #define OFFSET(x) offsetof(MpegEncContext, x)
4412 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4413 static const AVOption h263_options[] = {
4414 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4415 { "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},
4416 { "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 },
4421 static const AVClass h263_class = {
4422 .class_name = "H.263 encoder",
4423 .item_name = av_default_item_name,
4424 .option = h263_options,
4425 .version = LIBAVUTIL_VERSION_INT,
4428 AVCodec ff_h263_encoder = {
4430 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4431 .type = AVMEDIA_TYPE_VIDEO,
4432 .id = AV_CODEC_ID_H263,
4433 .priv_data_size = sizeof(MpegEncContext),
4434 .init = ff_mpv_encode_init,
4435 .encode2 = ff_mpv_encode_picture,
4436 .close = ff_mpv_encode_end,
4437 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4438 .priv_class = &h263_class,
4441 static const AVOption h263p_options[] = {
4442 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4443 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4444 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4445 { "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},
4449 static const AVClass h263p_class = {
4450 .class_name = "H.263p encoder",
4451 .item_name = av_default_item_name,
4452 .option = h263p_options,
4453 .version = LIBAVUTIL_VERSION_INT,
4456 AVCodec ff_h263p_encoder = {
4458 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4459 .type = AVMEDIA_TYPE_VIDEO,
4460 .id = AV_CODEC_ID_H263P,
4461 .priv_data_size = sizeof(MpegEncContext),
4462 .init = ff_mpv_encode_init,
4463 .encode2 = ff_mpv_encode_picture,
4464 .close = ff_mpv_encode_end,
4465 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4466 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4467 .priv_class = &h263p_class,
4470 static const AVClass msmpeg4v2_class = {
4471 .class_name = "msmpeg4v2 encoder",
4472 .item_name = av_default_item_name,
4473 .option = ff_mpv_generic_options,
4474 .version = LIBAVUTIL_VERSION_INT,
4477 AVCodec ff_msmpeg4v2_encoder = {
4478 .name = "msmpeg4v2",
4479 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4480 .type = AVMEDIA_TYPE_VIDEO,
4481 .id = AV_CODEC_ID_MSMPEG4V2,
4482 .priv_data_size = sizeof(MpegEncContext),
4483 .init = ff_mpv_encode_init,
4484 .encode2 = ff_mpv_encode_picture,
4485 .close = ff_mpv_encode_end,
4486 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4487 .priv_class = &msmpeg4v2_class,
4490 static const AVClass msmpeg4v3_class = {
4491 .class_name = "msmpeg4v3 encoder",
4492 .item_name = av_default_item_name,
4493 .option = ff_mpv_generic_options,
4494 .version = LIBAVUTIL_VERSION_INT,
4497 AVCodec ff_msmpeg4v3_encoder = {
4499 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4500 .type = AVMEDIA_TYPE_VIDEO,
4501 .id = AV_CODEC_ID_MSMPEG4V3,
4502 .priv_data_size = sizeof(MpegEncContext),
4503 .init = ff_mpv_encode_init,
4504 .encode2 = ff_mpv_encode_picture,
4505 .close = ff_mpv_encode_end,
4506 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4507 .priv_class = &msmpeg4v3_class,
4510 static const AVClass wmv1_class = {
4511 .class_name = "wmv1 encoder",
4512 .item_name = av_default_item_name,
4513 .option = ff_mpv_generic_options,
4514 .version = LIBAVUTIL_VERSION_INT,
4517 AVCodec ff_wmv1_encoder = {
4519 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4520 .type = AVMEDIA_TYPE_VIDEO,
4521 .id = AV_CODEC_ID_WMV1,
4522 .priv_data_size = sizeof(MpegEncContext),
4523 .init = ff_mpv_encode_init,
4524 .encode2 = ff_mpv_encode_picture,
4525 .close = ff_mpv_encode_end,
4526 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4527 .priv_class = &wmv1_class,