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 int i, ret, format_supported;
246 mpv_encode_defaults(s);
248 switch (avctx->codec_id) {
249 case AV_CODEC_ID_MPEG2VIDEO:
250 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
251 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
252 av_log(avctx, AV_LOG_ERROR,
253 "only YUV420 and YUV422 are supported\n");
257 case AV_CODEC_ID_MJPEG:
258 format_supported = 0;
259 /* JPEG color space */
260 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
261 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
262 (avctx->color_range == AVCOL_RANGE_JPEG &&
263 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
264 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
265 format_supported = 1;
266 /* MPEG color space */
267 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
268 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
269 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
270 format_supported = 1;
272 if (!format_supported) {
273 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
278 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
279 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
284 switch (avctx->pix_fmt) {
285 case AV_PIX_FMT_YUVJ422P:
286 case AV_PIX_FMT_YUV422P:
287 s->chroma_format = CHROMA_422;
289 case AV_PIX_FMT_YUVJ420P:
290 case AV_PIX_FMT_YUV420P:
292 s->chroma_format = CHROMA_420;
296 s->bit_rate = avctx->bit_rate;
297 s->width = avctx->width;
298 s->height = avctx->height;
299 if (avctx->gop_size > 600 &&
300 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
301 av_log(avctx, AV_LOG_ERROR,
302 "Warning keyframe interval too large! reducing it ...\n");
303 avctx->gop_size = 600;
305 s->gop_size = avctx->gop_size;
307 if (avctx->max_b_frames > MAX_B_FRAMES) {
308 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
309 "is %d.\n", MAX_B_FRAMES);
311 s->max_b_frames = avctx->max_b_frames;
312 s->codec_id = avctx->codec->id;
313 s->strict_std_compliance = avctx->strict_std_compliance;
314 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
315 s->mpeg_quant = avctx->mpeg_quant;
316 s->rtp_mode = !!avctx->rtp_payload_size;
317 s->intra_dc_precision = avctx->intra_dc_precision;
318 s->user_specified_pts = AV_NOPTS_VALUE;
320 if (s->gop_size <= 1) {
327 #if FF_API_MOTION_EST
328 FF_DISABLE_DEPRECATION_WARNINGS
329 s->me_method = avctx->me_method;
330 FF_ENABLE_DEPRECATION_WARNINGS
334 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
337 FF_DISABLE_DEPRECATION_WARNINGS
338 if (avctx->border_masking != 0.0)
339 s->border_masking = avctx->border_masking;
340 FF_ENABLE_DEPRECATION_WARNINGS
343 s->adaptive_quant = (s->avctx->lumi_masking ||
344 s->avctx->dark_masking ||
345 s->avctx->temporal_cplx_masking ||
346 s->avctx->spatial_cplx_masking ||
347 s->avctx->p_masking ||
349 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
352 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
354 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
355 av_log(avctx, AV_LOG_ERROR,
356 "a vbv buffer size is needed, "
357 "for encoding with a maximum bitrate\n");
361 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
362 av_log(avctx, AV_LOG_INFO,
363 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
366 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
367 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
371 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
372 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
376 if (avctx->rc_max_rate &&
377 avctx->rc_max_rate == avctx->bit_rate &&
378 avctx->rc_max_rate != avctx->rc_min_rate) {
379 av_log(avctx, AV_LOG_INFO,
380 "impossible bitrate constraints, this will fail\n");
383 if (avctx->rc_buffer_size &&
384 avctx->bit_rate * (int64_t)avctx->time_base.num >
385 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
386 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
390 if (!s->fixed_qscale &&
391 avctx->bit_rate * av_q2d(avctx->time_base) >
392 avctx->bit_rate_tolerance) {
393 av_log(avctx, AV_LOG_ERROR,
394 "bitrate tolerance too small for bitrate\n");
398 if (s->avctx->rc_max_rate &&
399 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
400 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
401 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
402 90000LL * (avctx->rc_buffer_size - 1) >
403 s->avctx->rc_max_rate * 0xFFFFLL) {
404 av_log(avctx, AV_LOG_INFO,
405 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
406 "specified vbv buffer is too large for the given bitrate!\n");
409 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
410 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
411 s->codec_id != AV_CODEC_ID_FLV1) {
412 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
416 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
417 av_log(avctx, AV_LOG_ERROR,
418 "OBMC is only supported with simple mb decision\n");
422 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
423 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
427 if (s->max_b_frames &&
428 s->codec_id != AV_CODEC_ID_MPEG4 &&
429 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
430 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
431 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
435 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
436 s->codec_id == AV_CODEC_ID_H263 ||
437 s->codec_id == AV_CODEC_ID_H263P) &&
438 (avctx->sample_aspect_ratio.num > 255 ||
439 avctx->sample_aspect_ratio.den > 255)) {
440 av_log(avctx, AV_LOG_ERROR,
441 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
442 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
446 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
447 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
448 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
452 // FIXME mpeg2 uses that too
453 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
454 av_log(avctx, AV_LOG_ERROR,
455 "mpeg2 style quantization not supported by codec\n");
459 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
460 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
464 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
465 s->avctx->mb_decision != FF_MB_DECISION_RD) {
466 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
470 if (s->avctx->scenechange_threshold < 1000000000 &&
471 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
472 av_log(avctx, AV_LOG_ERROR,
473 "closed gop with scene change detection are not supported yet, "
474 "set threshold to 1000000000\n");
478 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
479 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
480 av_log(avctx, AV_LOG_ERROR,
481 "low delay forcing is only available for mpeg2\n");
484 if (s->max_b_frames != 0) {
485 av_log(avctx, AV_LOG_ERROR,
486 "b frames cannot be used with low delay\n");
491 if (s->q_scale_type == 1) {
492 if (avctx->qmax > 12) {
493 av_log(avctx, AV_LOG_ERROR,
494 "non linear quant only supports qmax <= 12 currently\n");
499 if (s->avctx->thread_count > 1 &&
500 s->codec_id != AV_CODEC_ID_MPEG4 &&
501 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
502 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
503 (s->codec_id != AV_CODEC_ID_H263P)) {
504 av_log(avctx, AV_LOG_ERROR,
505 "multi threaded encoding not supported by codec\n");
509 if (s->avctx->thread_count < 1) {
510 av_log(avctx, AV_LOG_ERROR,
511 "automatic thread number detection not supported by codec,"
516 if (s->avctx->thread_count > 1)
519 if (!avctx->time_base.den || !avctx->time_base.num) {
520 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
524 if (avctx->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
525 av_log(avctx, AV_LOG_INFO,
526 "notice: b_frame_strategy only affects the first pass\n");
527 avctx->b_frame_strategy = 0;
530 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
532 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
533 avctx->time_base.den /= i;
534 avctx->time_base.num /= i;
538 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
539 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
540 // (a + x * 3 / 8) / x
541 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
542 s->inter_quant_bias = 0;
544 s->intra_quant_bias = 0;
546 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
549 #if FF_API_QUANT_BIAS
550 FF_DISABLE_DEPRECATION_WARNINGS
551 if (s->intra_quant_bias == FF_DEFAULT_QUANT_BIAS &&
552 avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
553 s->intra_quant_bias = avctx->intra_quant_bias;
554 if (s->inter_quant_bias == FF_DEFAULT_QUANT_BIAS &&
555 avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
556 s->inter_quant_bias = avctx->inter_quant_bias;
557 FF_ENABLE_DEPRECATION_WARNINGS
560 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
561 s->avctx->time_base.den > (1 << 16) - 1) {
562 av_log(avctx, AV_LOG_ERROR,
563 "timebase %d/%d not supported by MPEG 4 standard, "
564 "the maximum admitted value for the timebase denominator "
565 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
569 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
571 switch (avctx->codec->id) {
572 case AV_CODEC_ID_MPEG1VIDEO:
573 s->out_format = FMT_MPEG1;
574 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
575 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
577 case AV_CODEC_ID_MPEG2VIDEO:
578 s->out_format = FMT_MPEG1;
579 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
580 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
583 case AV_CODEC_ID_MJPEG:
584 s->out_format = FMT_MJPEG;
585 s->intra_only = 1; /* force intra only for jpeg */
586 if (!CONFIG_MJPEG_ENCODER ||
587 ff_mjpeg_encode_init(s) < 0)
592 case AV_CODEC_ID_H261:
593 if (!CONFIG_H261_ENCODER)
595 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
596 av_log(avctx, AV_LOG_ERROR,
597 "The specified picture size of %dx%d is not valid for the "
598 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
599 s->width, s->height);
602 s->out_format = FMT_H261;
605 s->rtp_mode = 0; /* Sliced encoding not supported */
607 case AV_CODEC_ID_H263:
608 if (!CONFIG_H263_ENCODER)
610 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
611 s->width, s->height) == 8) {
612 av_log(avctx, AV_LOG_INFO,
613 "The specified picture size of %dx%d is not valid for "
614 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
615 "352x288, 704x576, and 1408x1152."
616 "Try H.263+.\n", s->width, s->height);
619 s->out_format = FMT_H263;
623 case AV_CODEC_ID_H263P:
624 s->out_format = FMT_H263;
627 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
628 s->modified_quant = s->h263_aic;
629 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
630 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
633 /* These are just to be sure */
637 case AV_CODEC_ID_FLV1:
638 s->out_format = FMT_H263;
639 s->h263_flv = 2; /* format = 1; 11-bit codes */
640 s->unrestricted_mv = 1;
641 s->rtp_mode = 0; /* don't allow GOB */
645 case AV_CODEC_ID_RV10:
646 s->out_format = FMT_H263;
650 case AV_CODEC_ID_RV20:
651 s->out_format = FMT_H263;
654 s->modified_quant = 1;
658 s->unrestricted_mv = 0;
660 case AV_CODEC_ID_MPEG4:
661 s->out_format = FMT_H263;
663 s->unrestricted_mv = 1;
664 s->low_delay = s->max_b_frames ? 0 : 1;
665 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
667 case AV_CODEC_ID_MSMPEG4V2:
668 s->out_format = FMT_H263;
670 s->unrestricted_mv = 1;
671 s->msmpeg4_version = 2;
675 case AV_CODEC_ID_MSMPEG4V3:
676 s->out_format = FMT_H263;
678 s->unrestricted_mv = 1;
679 s->msmpeg4_version = 3;
680 s->flipflop_rounding = 1;
684 case AV_CODEC_ID_WMV1:
685 s->out_format = FMT_H263;
687 s->unrestricted_mv = 1;
688 s->msmpeg4_version = 4;
689 s->flipflop_rounding = 1;
693 case AV_CODEC_ID_WMV2:
694 s->out_format = FMT_H263;
696 s->unrestricted_mv = 1;
697 s->msmpeg4_version = 5;
698 s->flipflop_rounding = 1;
706 avctx->has_b_frames = !s->low_delay;
710 s->progressive_frame =
711 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
712 AV_CODEC_FLAG_INTERLACED_ME) ||
717 if (ff_mpv_common_init(s) < 0)
721 ff_mpv_encode_init_x86(s);
723 ff_fdctdsp_init(&s->fdsp, avctx);
724 ff_me_cmp_init(&s->mecc, avctx);
725 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
726 ff_pixblockdsp_init(&s->pdsp, avctx);
727 ff_qpeldsp_init(&s->qdsp);
729 if (s->msmpeg4_version) {
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
731 2 * 2 * (MAX_LEVEL + 1) *
732 (MAX_RUN + 1) * 2 * sizeof(int), fail);
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
737 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
738 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
739 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
740 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
741 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
742 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
743 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
745 if (s->avctx->noise_reduction) {
746 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
747 2 * 64 * sizeof(uint16_t), fail);
750 if (CONFIG_H263_ENCODER)
751 ff_h263dsp_init(&s->h263dsp);
752 if (!s->dct_quantize)
753 s->dct_quantize = ff_dct_quantize_c;
755 s->denoise_dct = denoise_dct_c;
756 s->fast_dct_quantize = s->dct_quantize;
758 s->dct_quantize = dct_quantize_trellis_c;
760 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
761 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
763 s->quant_precision = 5;
765 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
766 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
768 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
769 ff_h261_encode_init(s);
770 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
771 ff_h263_encode_init(s);
772 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
773 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
775 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
776 && s->out_format == FMT_MPEG1)
777 ff_mpeg1_encode_init(s);
780 for (i = 0; i < 64; i++) {
781 int j = s->idsp.idct_permutation[i];
782 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
784 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
785 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
786 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
788 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
791 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
792 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
794 if (s->avctx->intra_matrix)
795 s->intra_matrix[j] = s->avctx->intra_matrix[i];
796 if (s->avctx->inter_matrix)
797 s->inter_matrix[j] = s->avctx->inter_matrix[i];
800 /* precompute matrix */
801 /* for mjpeg, we do include qscale in the matrix */
802 if (s->out_format != FMT_MJPEG) {
803 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
804 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
806 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
807 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
811 if (ff_rate_control_init(s) < 0)
814 #if FF_API_ERROR_RATE
815 FF_DISABLE_DEPRECATION_WARNINGS
816 if (avctx->error_rate)
817 s->error_rate = avctx->error_rate;
818 FF_ENABLE_DEPRECATION_WARNINGS;
821 #if FF_API_NORMALIZE_AQP
822 FF_DISABLE_DEPRECATION_WARNINGS
823 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
824 s->mpv_flags |= FF_MPV_FLAG_NAQ;
825 FF_ENABLE_DEPRECATION_WARNINGS;
829 FF_DISABLE_DEPRECATION_WARNINGS
830 if (avctx->flags & CODEC_FLAG_MV0)
831 s->mpv_flags |= FF_MPV_FLAG_MV0;
832 FF_ENABLE_DEPRECATION_WARNINGS
836 FF_DISABLE_DEPRECATION_WARNINGS
837 if (avctx->rc_qsquish != 0.0)
838 s->rc_qsquish = avctx->rc_qsquish;
839 if (avctx->rc_qmod_amp != 0.0)
840 s->rc_qmod_amp = avctx->rc_qmod_amp;
841 if (avctx->rc_qmod_freq)
842 s->rc_qmod_freq = avctx->rc_qmod_freq;
843 if (avctx->rc_buffer_aggressivity != 1.0)
844 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
845 if (avctx->rc_initial_cplx != 0.0)
846 s->rc_initial_cplx = avctx->rc_initial_cplx;
848 s->lmin = avctx->lmin;
850 s->lmax = avctx->lmax;
854 s->rc_eq = av_strdup(avctx->rc_eq);
856 return AVERROR(ENOMEM);
858 FF_ENABLE_DEPRECATION_WARNINGS
861 if (avctx->b_frame_strategy == 2) {
862 for (i = 0; i < s->max_b_frames + 2; i++) {
863 s->tmp_frames[i] = av_frame_alloc();
864 if (!s->tmp_frames[i])
865 return AVERROR(ENOMEM);
867 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
868 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
869 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
871 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
879 ff_mpv_encode_end(avctx);
880 return AVERROR_UNKNOWN;
883 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
885 MpegEncContext *s = avctx->priv_data;
888 ff_rate_control_uninit(s);
890 ff_mpv_common_end(s);
891 if (CONFIG_MJPEG_ENCODER &&
892 s->out_format == FMT_MJPEG)
893 ff_mjpeg_encode_close(s);
895 av_freep(&avctx->extradata);
897 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
898 av_frame_free(&s->tmp_frames[i]);
900 ff_free_picture_tables(&s->new_picture);
901 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
903 av_freep(&s->avctx->stats_out);
904 av_freep(&s->ac_stats);
906 av_freep(&s->q_intra_matrix);
907 av_freep(&s->q_inter_matrix);
908 av_freep(&s->q_intra_matrix16);
909 av_freep(&s->q_inter_matrix16);
910 av_freep(&s->input_picture);
911 av_freep(&s->reordered_input_picture);
912 av_freep(&s->dct_offset);
917 static int get_sae(uint8_t *src, int ref, int stride)
922 for (y = 0; y < 16; y++) {
923 for (x = 0; x < 16; x++) {
924 acc += FFABS(src[x + y * stride] - ref);
931 static int get_intra_count(MpegEncContext *s, uint8_t *src,
932 uint8_t *ref, int stride)
940 for (y = 0; y < h; y += 16) {
941 for (x = 0; x < w; x += 16) {
942 int offset = x + y * stride;
943 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
945 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
946 int sae = get_sae(src + offset, mean, stride);
948 acc += sae + 500 < sad;
954 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
956 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
957 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
958 s->mb_stride, s->mb_height, s->b8_stride,
959 &s->linesize, &s->uvlinesize);
962 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
966 int i, display_picture_number = 0, ret;
967 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
968 (s->low_delay ? 0 : 1);
973 display_picture_number = s->input_picture_number++;
975 if (pts != AV_NOPTS_VALUE) {
976 if (s->user_specified_pts != AV_NOPTS_VALUE) {
978 int64_t last = s->user_specified_pts;
981 av_log(s->avctx, AV_LOG_ERROR,
982 "Error, Invalid timestamp=%"PRId64", "
983 "last=%"PRId64"\n", pts, s->user_specified_pts);
987 if (!s->low_delay && display_picture_number == 1)
988 s->dts_delta = time - last;
990 s->user_specified_pts = pts;
992 if (s->user_specified_pts != AV_NOPTS_VALUE) {
993 s->user_specified_pts =
994 pts = s->user_specified_pts + 1;
995 av_log(s->avctx, AV_LOG_INFO,
996 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
999 pts = display_picture_number;
1005 if (!pic_arg->buf[0] ||
1006 pic_arg->linesize[0] != s->linesize ||
1007 pic_arg->linesize[1] != s->uvlinesize ||
1008 pic_arg->linesize[2] != s->uvlinesize)
1010 if ((s->width & 15) || (s->height & 15))
1013 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1014 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1016 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1020 pic = &s->picture[i];
1024 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1027 ret = alloc_picture(s, pic, direct);
1032 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1033 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1034 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1037 int h_chroma_shift, v_chroma_shift;
1038 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1042 for (i = 0; i < 3; i++) {
1043 int src_stride = pic_arg->linesize[i];
1044 int dst_stride = i ? s->uvlinesize : s->linesize;
1045 int h_shift = i ? h_chroma_shift : 0;
1046 int v_shift = i ? v_chroma_shift : 0;
1047 int w = s->width >> h_shift;
1048 int h = s->height >> v_shift;
1049 uint8_t *src = pic_arg->data[i];
1050 uint8_t *dst = pic->f->data[i];
1052 if (!s->avctx->rc_buffer_size)
1053 dst += INPLACE_OFFSET;
1055 if (src_stride == dst_stride)
1056 memcpy(dst, src, src_stride * h);
1059 uint8_t *dst2 = dst;
1061 memcpy(dst2, src, w);
1066 if ((s->width & 15) || (s->height & 15)) {
1067 s->mpvencdsp.draw_edges(dst, dst_stride,
1076 ret = av_frame_copy_props(pic->f, pic_arg);
1080 pic->f->display_picture_number = display_picture_number;
1081 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1084 /* shift buffer entries */
1085 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1086 s->input_picture[i - 1] = s->input_picture[i];
1088 s->input_picture[encoding_delay] = (Picture*) pic;
1093 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1097 int64_t score64 = 0;
1099 for (plane = 0; plane < 3; plane++) {
1100 const int stride = p->f->linesize[plane];
1101 const int bw = plane ? 1 : 2;
1102 for (y = 0; y < s->mb_height * bw; y++) {
1103 for (x = 0; x < s->mb_width * bw; x++) {
1104 int off = p->shared ? 0 : 16;
1105 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1106 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1107 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1109 switch (s->avctx->frame_skip_exp) {
1110 case 0: score = FFMAX(score, v); break;
1111 case 1: score += FFABS(v); break;
1112 case 2: score += v * v; break;
1113 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1114 case 4: score64 += v * v * (int64_t)(v * v); break;
1123 if (score64 < s->avctx->frame_skip_threshold)
1125 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1130 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1132 AVPacket pkt = { 0 };
1133 int ret, got_output;
1135 av_init_packet(&pkt);
1136 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1141 av_free_packet(&pkt);
1145 static int estimate_best_b_count(MpegEncContext *s)
1147 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1148 AVCodecContext *c = avcodec_alloc_context3(NULL);
1149 const int scale = s->avctx->brd_scale;
1150 int i, j, out_size, p_lambda, b_lambda, lambda2;
1151 int64_t best_rd = INT64_MAX;
1152 int best_b_count = -1;
1155 return AVERROR(ENOMEM);
1156 assert(scale >= 0 && scale <= 3);
1159 //s->next_picture_ptr->quality;
1160 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1161 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1162 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1163 if (!b_lambda) // FIXME we should do this somewhere else
1164 b_lambda = p_lambda;
1165 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1168 c->width = s->width >> scale;
1169 c->height = s->height >> scale;
1170 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1171 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1172 c->mb_decision = s->avctx->mb_decision;
1173 c->me_cmp = s->avctx->me_cmp;
1174 c->mb_cmp = s->avctx->mb_cmp;
1175 c->me_sub_cmp = s->avctx->me_sub_cmp;
1176 c->pix_fmt = AV_PIX_FMT_YUV420P;
1177 c->time_base = s->avctx->time_base;
1178 c->max_b_frames = s->max_b_frames;
1180 if (avcodec_open2(c, codec, NULL) < 0)
1183 for (i = 0; i < s->max_b_frames + 2; i++) {
1184 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1185 s->next_picture_ptr;
1187 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1188 pre_input = *pre_input_ptr;
1190 if (!pre_input.shared && i) {
1191 pre_input.f->data[0] += INPLACE_OFFSET;
1192 pre_input.f->data[1] += INPLACE_OFFSET;
1193 pre_input.f->data[2] += INPLACE_OFFSET;
1196 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1197 s->tmp_frames[i]->linesize[0],
1198 pre_input.f->data[0],
1199 pre_input.f->linesize[0],
1200 c->width, c->height);
1201 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1202 s->tmp_frames[i]->linesize[1],
1203 pre_input.f->data[1],
1204 pre_input.f->linesize[1],
1205 c->width >> 1, c->height >> 1);
1206 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1207 s->tmp_frames[i]->linesize[2],
1208 pre_input.f->data[2],
1209 pre_input.f->linesize[2],
1210 c->width >> 1, c->height >> 1);
1214 for (j = 0; j < s->max_b_frames + 1; j++) {
1217 if (!s->input_picture[j])
1220 c->error[0] = c->error[1] = c->error[2] = 0;
1222 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1223 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1225 out_size = encode_frame(c, s->tmp_frames[0]);
1227 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1229 for (i = 0; i < s->max_b_frames + 1; i++) {
1230 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1232 s->tmp_frames[i + 1]->pict_type = is_p ?
1233 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1234 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1236 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1238 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1241 /* get the delayed frames */
1243 out_size = encode_frame(c, NULL);
1244 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1247 rd += c->error[0] + c->error[1] + c->error[2];
1258 return best_b_count;
1261 static int select_input_picture(MpegEncContext *s)
1265 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1266 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1267 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1269 /* set next picture type & ordering */
1270 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1271 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1272 !s->next_picture_ptr || s->intra_only) {
1273 s->reordered_input_picture[0] = s->input_picture[0];
1274 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1275 s->reordered_input_picture[0]->f->coded_picture_number =
1276 s->coded_picture_number++;
1280 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1281 if (s->picture_in_gop_number < s->gop_size &&
1282 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1283 // FIXME check that te gop check above is +-1 correct
1284 av_frame_unref(s->input_picture[0]->f);
1287 ff_vbv_update(s, 0);
1293 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1294 for (i = 0; i < s->max_b_frames + 1; i++) {
1295 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1297 if (pict_num >= s->rc_context.num_entries)
1299 if (!s->input_picture[i]) {
1300 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1304 s->input_picture[i]->f->pict_type =
1305 s->rc_context.entry[pict_num].new_pict_type;
1309 if (s->avctx->b_frame_strategy == 0) {
1310 b_frames = s->max_b_frames;
1311 while (b_frames && !s->input_picture[b_frames])
1313 } else if (s->avctx->b_frame_strategy == 1) {
1314 for (i = 1; i < s->max_b_frames + 1; i++) {
1315 if (s->input_picture[i] &&
1316 s->input_picture[i]->b_frame_score == 0) {
1317 s->input_picture[i]->b_frame_score =
1319 s->input_picture[i ]->f->data[0],
1320 s->input_picture[i - 1]->f->data[0],
1324 for (i = 0; i < s->max_b_frames + 1; i++) {
1325 if (!s->input_picture[i] ||
1326 s->input_picture[i]->b_frame_score - 1 >
1327 s->mb_num / s->avctx->b_sensitivity)
1331 b_frames = FFMAX(0, i - 1);
1334 for (i = 0; i < b_frames + 1; i++) {
1335 s->input_picture[i]->b_frame_score = 0;
1337 } else if (s->avctx->b_frame_strategy == 2) {
1338 b_frames = estimate_best_b_count(s);
1340 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1346 for (i = b_frames - 1; i >= 0; i--) {
1347 int type = s->input_picture[i]->f->pict_type;
1348 if (type && type != AV_PICTURE_TYPE_B)
1351 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1352 b_frames == s->max_b_frames) {
1353 av_log(s->avctx, AV_LOG_ERROR,
1354 "warning, too many b frames in a row\n");
1357 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1358 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1359 s->gop_size > s->picture_in_gop_number) {
1360 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1362 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1364 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1368 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1369 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1372 s->reordered_input_picture[0] = s->input_picture[b_frames];
1373 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1374 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1375 s->reordered_input_picture[0]->f->coded_picture_number =
1376 s->coded_picture_number++;
1377 for (i = 0; i < b_frames; i++) {
1378 s->reordered_input_picture[i + 1] = s->input_picture[i];
1379 s->reordered_input_picture[i + 1]->f->pict_type =
1381 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1382 s->coded_picture_number++;
1387 if (s->reordered_input_picture[0]) {
1388 s->reordered_input_picture[0]->reference =
1389 s->reordered_input_picture[0]->f->pict_type !=
1390 AV_PICTURE_TYPE_B ? 3 : 0;
1392 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1393 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1396 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1397 // input is a shared pix, so we can't modifiy it -> alloc a new
1398 // one & ensure that the shared one is reuseable
1401 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1404 pic = &s->picture[i];
1406 pic->reference = s->reordered_input_picture[0]->reference;
1407 if (alloc_picture(s, pic, 0) < 0) {
1411 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1415 /* mark us unused / free shared pic */
1416 av_frame_unref(s->reordered_input_picture[0]->f);
1417 s->reordered_input_picture[0]->shared = 0;
1419 s->current_picture_ptr = pic;
1421 // input is not a shared pix -> reuse buffer for current_pix
1422 s->current_picture_ptr = s->reordered_input_picture[0];
1423 for (i = 0; i < 4; i++) {
1424 s->new_picture.f->data[i] += INPLACE_OFFSET;
1427 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1428 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1429 s->current_picture_ptr)) < 0)
1432 s->picture_number = s->new_picture.f->display_picture_number;
1434 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1439 static void frame_end(MpegEncContext *s)
1443 if (s->unrestricted_mv &&
1444 s->current_picture.reference &&
1446 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1447 int hshift = desc->log2_chroma_w;
1448 int vshift = desc->log2_chroma_h;
1449 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1450 s->h_edge_pos, s->v_edge_pos,
1451 EDGE_WIDTH, EDGE_WIDTH,
1452 EDGE_TOP | EDGE_BOTTOM);
1453 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1454 s->h_edge_pos >> hshift,
1455 s->v_edge_pos >> vshift,
1456 EDGE_WIDTH >> hshift,
1457 EDGE_WIDTH >> vshift,
1458 EDGE_TOP | EDGE_BOTTOM);
1459 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1460 s->h_edge_pos >> hshift,
1461 s->v_edge_pos >> vshift,
1462 EDGE_WIDTH >> hshift,
1463 EDGE_WIDTH >> vshift,
1464 EDGE_TOP | EDGE_BOTTOM);
1469 s->last_pict_type = s->pict_type;
1470 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1471 if (s->pict_type!= AV_PICTURE_TYPE_B)
1472 s->last_non_b_pict_type = s->pict_type;
1475 /* release non-reference frames */
1476 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1477 if (!s->picture[i].reference)
1478 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1482 #if FF_API_CODED_FRAME
1483 FF_DISABLE_DEPRECATION_WARNINGS
1484 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1485 FF_ENABLE_DEPRECATION_WARNINGS
1489 static void update_noise_reduction(MpegEncContext *s)
1493 for (intra = 0; intra < 2; intra++) {
1494 if (s->dct_count[intra] > (1 << 16)) {
1495 for (i = 0; i < 64; i++) {
1496 s->dct_error_sum[intra][i] >>= 1;
1498 s->dct_count[intra] >>= 1;
1501 for (i = 0; i < 64; i++) {
1502 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1503 s->dct_count[intra] +
1504 s->dct_error_sum[intra][i] / 2) /
1505 (s->dct_error_sum[intra][i] + 1);
1510 static int frame_start(MpegEncContext *s)
1514 /* mark & release old frames */
1515 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1516 s->last_picture_ptr != s->next_picture_ptr &&
1517 s->last_picture_ptr->f->buf[0]) {
1518 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1521 s->current_picture_ptr->f->pict_type = s->pict_type;
1522 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1524 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1525 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1526 s->current_picture_ptr)) < 0)
1529 if (s->pict_type != AV_PICTURE_TYPE_B) {
1530 s->last_picture_ptr = s->next_picture_ptr;
1532 s->next_picture_ptr = s->current_picture_ptr;
1535 if (s->last_picture_ptr) {
1536 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1537 if (s->last_picture_ptr->f->buf[0] &&
1538 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1539 s->last_picture_ptr)) < 0)
1542 if (s->next_picture_ptr) {
1543 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1544 if (s->next_picture_ptr->f->buf[0] &&
1545 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1546 s->next_picture_ptr)) < 0)
1550 if (s->picture_structure!= PICT_FRAME) {
1552 for (i = 0; i < 4; i++) {
1553 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1554 s->current_picture.f->data[i] +=
1555 s->current_picture.f->linesize[i];
1557 s->current_picture.f->linesize[i] *= 2;
1558 s->last_picture.f->linesize[i] *= 2;
1559 s->next_picture.f->linesize[i] *= 2;
1563 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1564 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1565 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1566 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1567 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1568 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1570 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1571 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1574 if (s->dct_error_sum) {
1575 assert(s->avctx->noise_reduction && s->encoding);
1576 update_noise_reduction(s);
1582 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1583 const AVFrame *pic_arg, int *got_packet)
1585 MpegEncContext *s = avctx->priv_data;
1586 int i, stuffing_count, ret;
1587 int context_count = s->slice_context_count;
1589 s->picture_in_gop_number++;
1591 if (load_input_picture(s, pic_arg) < 0)
1594 if (select_input_picture(s) < 0) {
1599 if (s->new_picture.f->data[0]) {
1602 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1605 s->mb_info_ptr = av_packet_new_side_data(pkt,
1606 AV_PKT_DATA_H263_MB_INFO,
1607 s->mb_width*s->mb_height*12);
1608 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1611 for (i = 0; i < context_count; i++) {
1612 int start_y = s->thread_context[i]->start_mb_y;
1613 int end_y = s->thread_context[i]-> end_mb_y;
1614 int h = s->mb_height;
1615 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1616 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1618 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1621 s->pict_type = s->new_picture.f->pict_type;
1623 ret = frame_start(s);
1627 if (encode_picture(s, s->picture_number) < 0)
1630 avctx->header_bits = s->header_bits;
1631 avctx->mv_bits = s->mv_bits;
1632 avctx->misc_bits = s->misc_bits;
1633 avctx->i_tex_bits = s->i_tex_bits;
1634 avctx->p_tex_bits = s->p_tex_bits;
1635 avctx->i_count = s->i_count;
1636 // FIXME f/b_count in avctx
1637 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1638 avctx->skip_count = s->skip_count;
1642 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1645 return AVERROR(ENOMEM);
1646 *(int *)sd = s->current_picture.f->quality;
1648 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1649 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1651 if (avctx->rc_buffer_size) {
1652 RateControlContext *rcc = &s->rc_context;
1653 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1655 if (put_bits_count(&s->pb) > max_size &&
1656 s->lambda < s->lmax) {
1657 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1658 (s->qscale + 1) / s->qscale);
1659 if (s->adaptive_quant) {
1661 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1662 s->lambda_table[i] =
1663 FFMAX(s->lambda_table[i] + 1,
1664 s->lambda_table[i] * (s->qscale + 1) /
1667 s->mb_skipped = 0; // done in frame_start()
1668 // done in encode_picture() so we must undo it
1669 if (s->pict_type == AV_PICTURE_TYPE_P) {
1670 if (s->flipflop_rounding ||
1671 s->codec_id == AV_CODEC_ID_H263P ||
1672 s->codec_id == AV_CODEC_ID_MPEG4)
1673 s->no_rounding ^= 1;
1675 if (s->pict_type != AV_PICTURE_TYPE_B) {
1676 s->time_base = s->last_time_base;
1677 s->last_non_b_time = s->time - s->pp_time;
1679 for (i = 0; i < context_count; i++) {
1680 PutBitContext *pb = &s->thread_context[i]->pb;
1681 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1686 assert(s->avctx->rc_max_rate);
1689 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1690 ff_write_pass1_stats(s);
1692 for (i = 0; i < 4; i++) {
1693 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1694 avctx->error[i] += s->current_picture_ptr->f->error[i];
1697 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1698 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1699 avctx->i_tex_bits + avctx->p_tex_bits ==
1700 put_bits_count(&s->pb));
1701 flush_put_bits(&s->pb);
1702 s->frame_bits = put_bits_count(&s->pb);
1704 stuffing_count = ff_vbv_update(s, s->frame_bits);
1705 if (stuffing_count) {
1706 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1707 stuffing_count + 50) {
1708 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1712 switch (s->codec_id) {
1713 case AV_CODEC_ID_MPEG1VIDEO:
1714 case AV_CODEC_ID_MPEG2VIDEO:
1715 while (stuffing_count--) {
1716 put_bits(&s->pb, 8, 0);
1719 case AV_CODEC_ID_MPEG4:
1720 put_bits(&s->pb, 16, 0);
1721 put_bits(&s->pb, 16, 0x1C3);
1722 stuffing_count -= 4;
1723 while (stuffing_count--) {
1724 put_bits(&s->pb, 8, 0xFF);
1728 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1730 flush_put_bits(&s->pb);
1731 s->frame_bits = put_bits_count(&s->pb);
1734 /* update mpeg1/2 vbv_delay for CBR */
1735 if (s->avctx->rc_max_rate &&
1736 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1737 s->out_format == FMT_MPEG1 &&
1738 90000LL * (avctx->rc_buffer_size - 1) <=
1739 s->avctx->rc_max_rate * 0xFFFFLL) {
1740 int vbv_delay, min_delay;
1741 double inbits = s->avctx->rc_max_rate *
1742 av_q2d(s->avctx->time_base);
1743 int minbits = s->frame_bits - 8 *
1744 (s->vbv_delay_ptr - s->pb.buf - 1);
1745 double bits = s->rc_context.buffer_index + minbits - inbits;
1748 av_log(s->avctx, AV_LOG_ERROR,
1749 "Internal error, negative bits\n");
1751 assert(s->repeat_first_field == 0);
1753 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1754 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1755 s->avctx->rc_max_rate;
1757 vbv_delay = FFMAX(vbv_delay, min_delay);
1759 assert(vbv_delay < 0xFFFF);
1761 s->vbv_delay_ptr[0] &= 0xF8;
1762 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1763 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1764 s->vbv_delay_ptr[2] &= 0x07;
1765 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1766 avctx->vbv_delay = vbv_delay * 300;
1768 s->total_bits += s->frame_bits;
1769 avctx->frame_bits = s->frame_bits;
1771 pkt->pts = s->current_picture.f->pts;
1772 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1773 if (!s->current_picture.f->coded_picture_number)
1774 pkt->dts = pkt->pts - s->dts_delta;
1776 pkt->dts = s->reordered_pts;
1777 s->reordered_pts = pkt->pts;
1779 pkt->dts = pkt->pts;
1780 if (s->current_picture.f->key_frame)
1781 pkt->flags |= AV_PKT_FLAG_KEY;
1783 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1787 assert((s->frame_bits & 7) == 0);
1789 pkt->size = s->frame_bits / 8;
1790 *got_packet = !!pkt->size;
1794 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1795 int n, int threshold)
1797 static const char tab[64] = {
1798 3, 2, 2, 1, 1, 1, 1, 1,
1799 1, 1, 1, 1, 1, 1, 1, 1,
1800 1, 1, 1, 1, 1, 1, 1, 1,
1801 0, 0, 0, 0, 0, 0, 0, 0,
1802 0, 0, 0, 0, 0, 0, 0, 0,
1803 0, 0, 0, 0, 0, 0, 0, 0,
1804 0, 0, 0, 0, 0, 0, 0, 0,
1805 0, 0, 0, 0, 0, 0, 0, 0
1810 int16_t *block = s->block[n];
1811 const int last_index = s->block_last_index[n];
1814 if (threshold < 0) {
1816 threshold = -threshold;
1820 /* Are all we could set to zero already zero? */
1821 if (last_index <= skip_dc - 1)
1824 for (i = 0; i <= last_index; i++) {
1825 const int j = s->intra_scantable.permutated[i];
1826 const int level = FFABS(block[j]);
1828 if (skip_dc && i == 0)
1832 } else if (level > 1) {
1838 if (score >= threshold)
1840 for (i = skip_dc; i <= last_index; i++) {
1841 const int j = s->intra_scantable.permutated[i];
1845 s->block_last_index[n] = 0;
1847 s->block_last_index[n] = -1;
1850 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1854 const int maxlevel = s->max_qcoeff;
1855 const int minlevel = s->min_qcoeff;
1859 i = 1; // skip clipping of intra dc
1863 for (; i <= last_index; i++) {
1864 const int j = s->intra_scantable.permutated[i];
1865 int level = block[j];
1867 if (level > maxlevel) {
1870 } else if (level < minlevel) {
1878 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1879 av_log(s->avctx, AV_LOG_INFO,
1880 "warning, clipping %d dct coefficients to %d..%d\n",
1881 overflow, minlevel, maxlevel);
1884 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1888 for (y = 0; y < 8; y++) {
1889 for (x = 0; x < 8; x++) {
1895 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1896 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1897 int v = ptr[x2 + y2 * stride];
1903 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1908 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1909 int motion_x, int motion_y,
1910 int mb_block_height,
1913 int16_t weight[8][64];
1914 int16_t orig[8][64];
1915 const int mb_x = s->mb_x;
1916 const int mb_y = s->mb_y;
1919 int dct_offset = s->linesize * 8; // default for progressive frames
1920 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1921 ptrdiff_t wrap_y, wrap_c;
1923 for (i = 0; i < mb_block_count; i++)
1924 skip_dct[i] = s->skipdct;
1926 if (s->adaptive_quant) {
1927 const int last_qp = s->qscale;
1928 const int mb_xy = mb_x + mb_y * s->mb_stride;
1930 s->lambda = s->lambda_table[mb_xy];
1933 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1934 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1935 s->dquant = s->qscale - last_qp;
1937 if (s->out_format == FMT_H263) {
1938 s->dquant = av_clip(s->dquant, -2, 2);
1940 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1942 if (s->pict_type == AV_PICTURE_TYPE_B) {
1943 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1946 if (s->mv_type == MV_TYPE_8X8)
1952 ff_set_qscale(s, last_qp + s->dquant);
1953 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1954 ff_set_qscale(s, s->qscale + s->dquant);
1956 wrap_y = s->linesize;
1957 wrap_c = s->uvlinesize;
1958 ptr_y = s->new_picture.f->data[0] +
1959 (mb_y * 16 * wrap_y) + mb_x * 16;
1960 ptr_cb = s->new_picture.f->data[1] +
1961 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1962 ptr_cr = s->new_picture.f->data[2] +
1963 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1965 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1966 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1967 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1969 16, 16, mb_x * 16, mb_y * 16,
1970 s->width, s->height);
1972 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1974 8, mb_block_height, mb_x * 8, mb_y * 8,
1975 s->width >> 1, s->height >> 1);
1976 ptr_cb = ebuf + 18 * wrap_y;
1977 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1979 8, mb_block_height, mb_x * 8, mb_y * 8,
1980 s->width >> 1, s->height >> 1);
1981 ptr_cr = ebuf + 18 * wrap_y + 8;
1985 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
1986 int progressive_score, interlaced_score;
1988 s->interlaced_dct = 0;
1989 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1990 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1991 NULL, wrap_y, 8) - 400;
1993 if (progressive_score > 0) {
1994 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1995 NULL, wrap_y * 2, 8) +
1996 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1997 NULL, wrap_y * 2, 8);
1998 if (progressive_score > interlaced_score) {
1999 s->interlaced_dct = 1;
2001 dct_offset = wrap_y;
2003 if (s->chroma_format == CHROMA_422)
2009 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2010 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2011 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2012 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2014 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2018 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2019 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2020 if (!s->chroma_y_shift) { /* 422 */
2021 s->pdsp.get_pixels(s->block[6],
2022 ptr_cb + (dct_offset >> 1), wrap_c);
2023 s->pdsp.get_pixels(s->block[7],
2024 ptr_cr + (dct_offset >> 1), wrap_c);
2028 op_pixels_func (*op_pix)[4];
2029 qpel_mc_func (*op_qpix)[16];
2030 uint8_t *dest_y, *dest_cb, *dest_cr;
2032 dest_y = s->dest[0];
2033 dest_cb = s->dest[1];
2034 dest_cr = s->dest[2];
2036 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2037 op_pix = s->hdsp.put_pixels_tab;
2038 op_qpix = s->qdsp.put_qpel_pixels_tab;
2040 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2041 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2044 if (s->mv_dir & MV_DIR_FORWARD) {
2045 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2046 s->last_picture.f->data,
2048 op_pix = s->hdsp.avg_pixels_tab;
2049 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2051 if (s->mv_dir & MV_DIR_BACKWARD) {
2052 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2053 s->next_picture.f->data,
2057 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2058 int progressive_score, interlaced_score;
2060 s->interlaced_dct = 0;
2061 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2062 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2066 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2067 progressive_score -= 400;
2069 if (progressive_score > 0) {
2070 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2072 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2076 if (progressive_score > interlaced_score) {
2077 s->interlaced_dct = 1;
2079 dct_offset = wrap_y;
2081 if (s->chroma_format == CHROMA_422)
2087 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2088 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2089 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2090 dest_y + dct_offset, wrap_y);
2091 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2092 dest_y + dct_offset + 8, wrap_y);
2094 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2098 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2099 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2100 if (!s->chroma_y_shift) { /* 422 */
2101 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2102 dest_cb + (dct_offset >> 1), wrap_c);
2103 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2104 dest_cr + (dct_offset >> 1), wrap_c);
2107 /* pre quantization */
2108 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2109 2 * s->qscale * s->qscale) {
2111 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2113 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2115 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2116 wrap_y, 8) < 20 * s->qscale)
2118 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2119 wrap_y, 8) < 20 * s->qscale)
2121 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2123 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2125 if (!s->chroma_y_shift) { /* 422 */
2126 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2127 dest_cb + (dct_offset >> 1),
2128 wrap_c, 8) < 20 * s->qscale)
2130 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2131 dest_cr + (dct_offset >> 1),
2132 wrap_c, 8) < 20 * s->qscale)
2138 if (s->quantizer_noise_shaping) {
2140 get_visual_weight(weight[0], ptr_y , wrap_y);
2142 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2144 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2146 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2148 get_visual_weight(weight[4], ptr_cb , wrap_c);
2150 get_visual_weight(weight[5], ptr_cr , wrap_c);
2151 if (!s->chroma_y_shift) { /* 422 */
2153 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2156 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2159 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2162 /* DCT & quantize */
2163 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2165 for (i = 0; i < mb_block_count; i++) {
2168 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2169 // FIXME we could decide to change to quantizer instead of
2171 // JS: I don't think that would be a good idea it could lower
2172 // quality instead of improve it. Just INTRADC clipping
2173 // deserves changes in quantizer
2175 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2177 s->block_last_index[i] = -1;
2179 if (s->quantizer_noise_shaping) {
2180 for (i = 0; i < mb_block_count; i++) {
2182 s->block_last_index[i] =
2183 dct_quantize_refine(s, s->block[i], weight[i],
2184 orig[i], i, s->qscale);
2189 if (s->luma_elim_threshold && !s->mb_intra)
2190 for (i = 0; i < 4; i++)
2191 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2192 if (s->chroma_elim_threshold && !s->mb_intra)
2193 for (i = 4; i < mb_block_count; i++)
2194 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2196 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2197 for (i = 0; i < mb_block_count; i++) {
2198 if (s->block_last_index[i] == -1)
2199 s->coded_score[i] = INT_MAX / 256;
2204 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2205 s->block_last_index[4] =
2206 s->block_last_index[5] = 0;
2208 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2211 // non c quantize code returns incorrect block_last_index FIXME
2212 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2213 for (i = 0; i < mb_block_count; i++) {
2215 if (s->block_last_index[i] > 0) {
2216 for (j = 63; j > 0; j--) {
2217 if (s->block[i][s->intra_scantable.permutated[j]])
2220 s->block_last_index[i] = j;
2225 /* huffman encode */
2226 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2227 case AV_CODEC_ID_MPEG1VIDEO:
2228 case AV_CODEC_ID_MPEG2VIDEO:
2229 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2230 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2232 case AV_CODEC_ID_MPEG4:
2233 if (CONFIG_MPEG4_ENCODER)
2234 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2236 case AV_CODEC_ID_MSMPEG4V2:
2237 case AV_CODEC_ID_MSMPEG4V3:
2238 case AV_CODEC_ID_WMV1:
2239 if (CONFIG_MSMPEG4_ENCODER)
2240 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2242 case AV_CODEC_ID_WMV2:
2243 if (CONFIG_WMV2_ENCODER)
2244 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2246 case AV_CODEC_ID_H261:
2247 if (CONFIG_H261_ENCODER)
2248 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2250 case AV_CODEC_ID_H263:
2251 case AV_CODEC_ID_H263P:
2252 case AV_CODEC_ID_FLV1:
2253 case AV_CODEC_ID_RV10:
2254 case AV_CODEC_ID_RV20:
2255 if (CONFIG_H263_ENCODER)
2256 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2258 case AV_CODEC_ID_MJPEG:
2259 if (CONFIG_MJPEG_ENCODER)
2260 ff_mjpeg_encode_mb(s, s->block);
2267 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2269 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2270 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2273 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2276 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2279 d->mb_skip_run= s->mb_skip_run;
2281 d->last_dc[i] = s->last_dc[i];
2284 d->mv_bits= s->mv_bits;
2285 d->i_tex_bits= s->i_tex_bits;
2286 d->p_tex_bits= s->p_tex_bits;
2287 d->i_count= s->i_count;
2288 d->f_count= s->f_count;
2289 d->b_count= s->b_count;
2290 d->skip_count= s->skip_count;
2291 d->misc_bits= s->misc_bits;
2295 d->qscale= s->qscale;
2296 d->dquant= s->dquant;
2298 d->esc3_level_length= s->esc3_level_length;
2301 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2304 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2305 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2308 d->mb_skip_run= s->mb_skip_run;
2310 d->last_dc[i] = s->last_dc[i];
2313 d->mv_bits= s->mv_bits;
2314 d->i_tex_bits= s->i_tex_bits;
2315 d->p_tex_bits= s->p_tex_bits;
2316 d->i_count= s->i_count;
2317 d->f_count= s->f_count;
2318 d->b_count= s->b_count;
2319 d->skip_count= s->skip_count;
2320 d->misc_bits= s->misc_bits;
2322 d->mb_intra= s->mb_intra;
2323 d->mb_skipped= s->mb_skipped;
2324 d->mv_type= s->mv_type;
2325 d->mv_dir= s->mv_dir;
2327 if(s->data_partitioning){
2329 d->tex_pb= s->tex_pb;
2333 d->block_last_index[i]= s->block_last_index[i];
2334 d->interlaced_dct= s->interlaced_dct;
2335 d->qscale= s->qscale;
2337 d->esc3_level_length= s->esc3_level_length;
2340 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2341 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2342 int *dmin, int *next_block, int motion_x, int motion_y)
2345 uint8_t *dest_backup[3];
2347 copy_context_before_encode(s, backup, type);
2349 s->block= s->blocks[*next_block];
2350 s->pb= pb[*next_block];
2351 if(s->data_partitioning){
2352 s->pb2 = pb2 [*next_block];
2353 s->tex_pb= tex_pb[*next_block];
2357 memcpy(dest_backup, s->dest, sizeof(s->dest));
2358 s->dest[0] = s->sc.rd_scratchpad;
2359 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2360 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2361 assert(s->linesize >= 32); //FIXME
2364 encode_mb(s, motion_x, motion_y);
2366 score= put_bits_count(&s->pb);
2367 if(s->data_partitioning){
2368 score+= put_bits_count(&s->pb2);
2369 score+= put_bits_count(&s->tex_pb);
2372 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2373 ff_mpv_decode_mb(s, s->block);
2375 score *= s->lambda2;
2376 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2380 memcpy(s->dest, dest_backup, sizeof(s->dest));
2387 copy_context_after_encode(best, s, type);
2391 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2392 uint32_t *sq = ff_square_tab + 256;
2397 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2398 else if(w==8 && h==8)
2399 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2403 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2412 static int sse_mb(MpegEncContext *s){
2416 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2417 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2420 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2421 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) +
2422 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) +
2423 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);
2425 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) +
2426 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) +
2427 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);
2430 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)
2431 +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)
2432 +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);
2435 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2436 MpegEncContext *s= *(void**)arg;
2440 s->me.dia_size= s->avctx->pre_dia_size;
2441 s->first_slice_line=1;
2442 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2443 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2444 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2446 s->first_slice_line=0;
2454 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2455 MpegEncContext *s= *(void**)arg;
2457 s->me.dia_size= s->avctx->dia_size;
2458 s->first_slice_line=1;
2459 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2460 s->mb_x=0; //for block init below
2461 ff_init_block_index(s);
2462 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2463 s->block_index[0]+=2;
2464 s->block_index[1]+=2;
2465 s->block_index[2]+=2;
2466 s->block_index[3]+=2;
2468 /* compute motion vector & mb_type and store in context */
2469 if(s->pict_type==AV_PICTURE_TYPE_B)
2470 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2472 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2474 s->first_slice_line=0;
2479 static int mb_var_thread(AVCodecContext *c, void *arg){
2480 MpegEncContext *s= *(void**)arg;
2483 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2484 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2487 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2489 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2491 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2492 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2494 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2495 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2496 s->me.mb_var_sum_temp += varc;
2502 static void write_slice_end(MpegEncContext *s){
2503 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2504 if(s->partitioned_frame){
2505 ff_mpeg4_merge_partitions(s);
2508 ff_mpeg4_stuffing(&s->pb);
2509 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2510 ff_mjpeg_encode_stuffing(&s->pb);
2513 avpriv_align_put_bits(&s->pb);
2514 flush_put_bits(&s->pb);
2516 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2517 s->misc_bits+= get_bits_diff(s);
2520 static void write_mb_info(MpegEncContext *s)
2522 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2523 int offset = put_bits_count(&s->pb);
2524 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2525 int gobn = s->mb_y / s->gob_index;
2527 if (CONFIG_H263_ENCODER)
2528 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2529 bytestream_put_le32(&ptr, offset);
2530 bytestream_put_byte(&ptr, s->qscale);
2531 bytestream_put_byte(&ptr, gobn);
2532 bytestream_put_le16(&ptr, mba);
2533 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2534 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2535 /* 4MV not implemented */
2536 bytestream_put_byte(&ptr, 0); /* hmv2 */
2537 bytestream_put_byte(&ptr, 0); /* vmv2 */
2540 static void update_mb_info(MpegEncContext *s, int startcode)
2544 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2545 s->mb_info_size += 12;
2546 s->prev_mb_info = s->last_mb_info;
2549 s->prev_mb_info = put_bits_count(&s->pb)/8;
2550 /* This might have incremented mb_info_size above, and we return without
2551 * actually writing any info into that slot yet. But in that case,
2552 * this will be called again at the start of the after writing the
2553 * start code, actually writing the mb info. */
2557 s->last_mb_info = put_bits_count(&s->pb)/8;
2558 if (!s->mb_info_size)
2559 s->mb_info_size += 12;
2563 static int encode_thread(AVCodecContext *c, void *arg){
2564 MpegEncContext *s= *(void**)arg;
2565 int mb_x, mb_y, pdif = 0;
2566 int chr_h= 16>>s->chroma_y_shift;
2568 MpegEncContext best_s = { 0 }, backup_s;
2569 uint8_t bit_buf[2][MAX_MB_BYTES];
2570 uint8_t bit_buf2[2][MAX_MB_BYTES];
2571 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2572 PutBitContext pb[2], pb2[2], tex_pb[2];
2575 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2576 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2577 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2580 s->last_bits= put_bits_count(&s->pb);
2591 /* init last dc values */
2592 /* note: quant matrix value (8) is implied here */
2593 s->last_dc[i] = 128 << s->intra_dc_precision;
2595 s->current_picture.f->error[i] = 0;
2598 memset(s->last_mv, 0, sizeof(s->last_mv));
2602 switch(s->codec_id){
2603 case AV_CODEC_ID_H263:
2604 case AV_CODEC_ID_H263P:
2605 case AV_CODEC_ID_FLV1:
2606 if (CONFIG_H263_ENCODER)
2607 s->gob_index = H263_GOB_HEIGHT(s->height);
2609 case AV_CODEC_ID_MPEG4:
2610 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2611 ff_mpeg4_init_partitions(s);
2617 s->first_slice_line = 1;
2618 s->ptr_lastgob = s->pb.buf;
2619 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2623 ff_set_qscale(s, s->qscale);
2624 ff_init_block_index(s);
2626 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2627 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2628 int mb_type= s->mb_type[xy];
2633 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2634 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2637 if(s->data_partitioning){
2638 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2639 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2640 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2646 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2647 ff_update_block_index(s);
2649 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2650 ff_h261_reorder_mb_index(s);
2651 xy= s->mb_y*s->mb_stride + s->mb_x;
2652 mb_type= s->mb_type[xy];
2655 /* write gob / video packet header */
2657 int current_packet_size, is_gob_start;
2659 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2661 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2663 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2665 switch(s->codec_id){
2666 case AV_CODEC_ID_H263:
2667 case AV_CODEC_ID_H263P:
2668 if(!s->h263_slice_structured)
2669 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2671 case AV_CODEC_ID_MPEG2VIDEO:
2672 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2673 case AV_CODEC_ID_MPEG1VIDEO:
2674 if(s->mb_skip_run) is_gob_start=0;
2679 if(s->start_mb_y != mb_y || mb_x!=0){
2682 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2683 ff_mpeg4_init_partitions(s);
2687 assert((put_bits_count(&s->pb)&7) == 0);
2688 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2690 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2691 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2692 int d = 100 / s->error_rate;
2694 current_packet_size=0;
2695 s->pb.buf_ptr= s->ptr_lastgob;
2696 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2700 if (s->avctx->rtp_callback){
2701 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2702 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2704 update_mb_info(s, 1);
2706 switch(s->codec_id){
2707 case AV_CODEC_ID_MPEG4:
2708 if (CONFIG_MPEG4_ENCODER) {
2709 ff_mpeg4_encode_video_packet_header(s);
2710 ff_mpeg4_clean_buffers(s);
2713 case AV_CODEC_ID_MPEG1VIDEO:
2714 case AV_CODEC_ID_MPEG2VIDEO:
2715 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2716 ff_mpeg1_encode_slice_header(s);
2717 ff_mpeg1_clean_buffers(s);
2720 case AV_CODEC_ID_H263:
2721 case AV_CODEC_ID_H263P:
2722 if (CONFIG_H263_ENCODER)
2723 ff_h263_encode_gob_header(s, mb_y);
2727 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2728 int bits= put_bits_count(&s->pb);
2729 s->misc_bits+= bits - s->last_bits;
2733 s->ptr_lastgob += current_packet_size;
2734 s->first_slice_line=1;
2735 s->resync_mb_x=mb_x;
2736 s->resync_mb_y=mb_y;
2740 if( (s->resync_mb_x == s->mb_x)
2741 && s->resync_mb_y+1 == s->mb_y){
2742 s->first_slice_line=0;
2746 s->dquant=0; //only for QP_RD
2748 update_mb_info(s, 0);
2750 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
2752 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2754 copy_context_before_encode(&backup_s, s, -1);
2756 best_s.data_partitioning= s->data_partitioning;
2757 best_s.partitioned_frame= s->partitioned_frame;
2758 if(s->data_partitioning){
2759 backup_s.pb2= s->pb2;
2760 backup_s.tex_pb= s->tex_pb;
2763 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2764 s->mv_dir = MV_DIR_FORWARD;
2765 s->mv_type = MV_TYPE_16X16;
2767 s->mv[0][0][0] = s->p_mv_table[xy][0];
2768 s->mv[0][0][1] = s->p_mv_table[xy][1];
2769 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2770 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2772 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2773 s->mv_dir = MV_DIR_FORWARD;
2774 s->mv_type = MV_TYPE_FIELD;
2777 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2778 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2779 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2781 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2782 &dmin, &next_block, 0, 0);
2784 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2785 s->mv_dir = MV_DIR_FORWARD;
2786 s->mv_type = MV_TYPE_16X16;
2790 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2791 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2793 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2794 s->mv_dir = MV_DIR_FORWARD;
2795 s->mv_type = MV_TYPE_8X8;
2798 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2799 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2801 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2802 &dmin, &next_block, 0, 0);
2804 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2805 s->mv_dir = MV_DIR_FORWARD;
2806 s->mv_type = MV_TYPE_16X16;
2808 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2809 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2810 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2811 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2813 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2814 s->mv_dir = MV_DIR_BACKWARD;
2815 s->mv_type = MV_TYPE_16X16;
2817 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2818 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2819 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2820 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2822 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2823 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2824 s->mv_type = MV_TYPE_16X16;
2826 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2827 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2828 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2829 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2830 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2831 &dmin, &next_block, 0, 0);
2833 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2834 s->mv_dir = MV_DIR_FORWARD;
2835 s->mv_type = MV_TYPE_FIELD;
2838 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2839 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2840 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2842 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2843 &dmin, &next_block, 0, 0);
2845 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2846 s->mv_dir = MV_DIR_BACKWARD;
2847 s->mv_type = MV_TYPE_FIELD;
2850 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2851 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2852 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2854 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2855 &dmin, &next_block, 0, 0);
2857 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2858 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2859 s->mv_type = MV_TYPE_FIELD;
2861 for(dir=0; dir<2; dir++){
2863 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2864 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2865 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2868 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2869 &dmin, &next_block, 0, 0);
2871 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2873 s->mv_type = MV_TYPE_16X16;
2877 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2878 &dmin, &next_block, 0, 0);
2879 if(s->h263_pred || s->h263_aic){
2881 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2883 ff_clean_intra_table_entries(s); //old mode?
2887 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2888 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2889 const int last_qp= backup_s.qscale;
2892 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2893 static const int dquant_tab[4]={-1,1,-2,2};
2895 assert(backup_s.dquant == 0);
2898 s->mv_dir= best_s.mv_dir;
2899 s->mv_type = MV_TYPE_16X16;
2900 s->mb_intra= best_s.mb_intra;
2901 s->mv[0][0][0] = best_s.mv[0][0][0];
2902 s->mv[0][0][1] = best_s.mv[0][0][1];
2903 s->mv[1][0][0] = best_s.mv[1][0][0];
2904 s->mv[1][0][1] = best_s.mv[1][0][1];
2906 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2907 for(; qpi<4; qpi++){
2908 int dquant= dquant_tab[qpi];
2909 qp= last_qp + dquant;
2910 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2912 backup_s.dquant= dquant;
2913 if(s->mb_intra && s->dc_val[0]){
2915 dc[i]= s->dc_val[0][ s->block_index[i] ];
2916 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2920 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2921 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2922 if(best_s.qscale != qp){
2923 if(s->mb_intra && s->dc_val[0]){
2925 s->dc_val[0][ s->block_index[i] ]= dc[i];
2926 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2933 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2934 int mx= s->b_direct_mv_table[xy][0];
2935 int my= s->b_direct_mv_table[xy][1];
2937 backup_s.dquant = 0;
2938 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2940 ff_mpeg4_set_direct_mv(s, mx, my);
2941 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2942 &dmin, &next_block, mx, my);
2944 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2945 backup_s.dquant = 0;
2946 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2948 ff_mpeg4_set_direct_mv(s, 0, 0);
2949 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2950 &dmin, &next_block, 0, 0);
2952 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2955 coded |= s->block_last_index[i];
2958 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2959 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2960 mx=my=0; //FIXME find the one we actually used
2961 ff_mpeg4_set_direct_mv(s, mx, my);
2962 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2970 s->mv_dir= best_s.mv_dir;
2971 s->mv_type = best_s.mv_type;
2973 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2974 s->mv[0][0][1] = best_s.mv[0][0][1];
2975 s->mv[1][0][0] = best_s.mv[1][0][0];
2976 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2979 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2980 &dmin, &next_block, mx, my);
2985 s->current_picture.qscale_table[xy] = best_s.qscale;
2987 copy_context_after_encode(s, &best_s, -1);
2989 pb_bits_count= put_bits_count(&s->pb);
2990 flush_put_bits(&s->pb);
2991 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2994 if(s->data_partitioning){
2995 pb2_bits_count= put_bits_count(&s->pb2);
2996 flush_put_bits(&s->pb2);
2997 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2998 s->pb2= backup_s.pb2;
3000 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3001 flush_put_bits(&s->tex_pb);
3002 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3003 s->tex_pb= backup_s.tex_pb;
3005 s->last_bits= put_bits_count(&s->pb);
3007 if (CONFIG_H263_ENCODER &&
3008 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3009 ff_h263_update_motion_val(s);
3011 if(next_block==0){ //FIXME 16 vs linesize16
3012 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3013 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3014 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3017 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3018 ff_mpv_decode_mb(s, s->block);
3020 int motion_x = 0, motion_y = 0;
3021 s->mv_type=MV_TYPE_16X16;
3022 // only one MB-Type possible
3025 case CANDIDATE_MB_TYPE_INTRA:
3028 motion_x= s->mv[0][0][0] = 0;
3029 motion_y= s->mv[0][0][1] = 0;
3031 case CANDIDATE_MB_TYPE_INTER:
3032 s->mv_dir = MV_DIR_FORWARD;
3034 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3035 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3037 case CANDIDATE_MB_TYPE_INTER_I:
3038 s->mv_dir = MV_DIR_FORWARD;
3039 s->mv_type = MV_TYPE_FIELD;
3042 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3043 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3044 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3047 case CANDIDATE_MB_TYPE_INTER4V:
3048 s->mv_dir = MV_DIR_FORWARD;
3049 s->mv_type = MV_TYPE_8X8;
3052 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3053 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3056 case CANDIDATE_MB_TYPE_DIRECT:
3057 if (CONFIG_MPEG4_ENCODER) {
3058 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3060 motion_x=s->b_direct_mv_table[xy][0];
3061 motion_y=s->b_direct_mv_table[xy][1];
3062 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3065 case CANDIDATE_MB_TYPE_DIRECT0:
3066 if (CONFIG_MPEG4_ENCODER) {
3067 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3069 ff_mpeg4_set_direct_mv(s, 0, 0);
3072 case CANDIDATE_MB_TYPE_BIDIR:
3073 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3075 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3076 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3077 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3078 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3080 case CANDIDATE_MB_TYPE_BACKWARD:
3081 s->mv_dir = MV_DIR_BACKWARD;
3083 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3084 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3086 case CANDIDATE_MB_TYPE_FORWARD:
3087 s->mv_dir = MV_DIR_FORWARD;
3089 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3090 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3092 case CANDIDATE_MB_TYPE_FORWARD_I:
3093 s->mv_dir = MV_DIR_FORWARD;
3094 s->mv_type = MV_TYPE_FIELD;
3097 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3098 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3099 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3102 case CANDIDATE_MB_TYPE_BACKWARD_I:
3103 s->mv_dir = MV_DIR_BACKWARD;
3104 s->mv_type = MV_TYPE_FIELD;
3107 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3108 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3109 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3112 case CANDIDATE_MB_TYPE_BIDIR_I:
3113 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3114 s->mv_type = MV_TYPE_FIELD;
3116 for(dir=0; dir<2; dir++){
3118 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3119 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3120 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3125 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3128 encode_mb(s, motion_x, motion_y);
3130 // RAL: Update last macroblock type
3131 s->last_mv_dir = s->mv_dir;
3133 if (CONFIG_H263_ENCODER &&
3134 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3135 ff_h263_update_motion_val(s);
3137 ff_mpv_decode_mb(s, s->block);
3140 /* clean the MV table in IPS frames for direct mode in B frames */
3141 if(s->mb_intra /* && I,P,S_TYPE */){
3142 s->p_mv_table[xy][0]=0;
3143 s->p_mv_table[xy][1]=0;
3146 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3150 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3151 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3153 s->current_picture.f->error[0] += sse(
3154 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3155 s->dest[0], w, h, s->linesize);
3156 s->current_picture.f->error[1] += sse(
3157 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3158 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3159 s->current_picture.f->error[2] += sse(
3160 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3161 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3164 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3165 ff_h263_loop_filter(s);
3167 ff_dlog(s->avctx, "MB %d %d bits\n",
3168 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3172 //not beautiful here but we must write it before flushing so it has to be here
3173 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3174 ff_msmpeg4_encode_ext_header(s);
3178 /* Send the last GOB if RTP */
3179 if (s->avctx->rtp_callback) {
3180 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3181 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3182 /* Call the RTP callback to send the last GOB */
3184 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3190 #define MERGE(field) dst->field += src->field; src->field=0
3191 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3192 MERGE(me.scene_change_score);
3193 MERGE(me.mc_mb_var_sum_temp);
3194 MERGE(me.mb_var_sum_temp);
3197 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3200 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3201 MERGE(dct_count[1]);
3210 MERGE(er.error_count);
3211 MERGE(padding_bug_score);
3212 MERGE(current_picture.f->error[0]);
3213 MERGE(current_picture.f->error[1]);
3214 MERGE(current_picture.f->error[2]);
3216 if(dst->avctx->noise_reduction){
3217 for(i=0; i<64; i++){
3218 MERGE(dct_error_sum[0][i]);
3219 MERGE(dct_error_sum[1][i]);
3223 assert(put_bits_count(&src->pb) % 8 ==0);
3224 assert(put_bits_count(&dst->pb) % 8 ==0);
3225 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3226 flush_put_bits(&dst->pb);
3229 static int estimate_qp(MpegEncContext *s, int dry_run){
3230 if (s->next_lambda){
3231 s->current_picture_ptr->f->quality =
3232 s->current_picture.f->quality = s->next_lambda;
3233 if(!dry_run) s->next_lambda= 0;
3234 } else if (!s->fixed_qscale) {
3235 s->current_picture_ptr->f->quality =
3236 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3237 if (s->current_picture.f->quality < 0)
3241 if(s->adaptive_quant){
3242 switch(s->codec_id){
3243 case AV_CODEC_ID_MPEG4:
3244 if (CONFIG_MPEG4_ENCODER)
3245 ff_clean_mpeg4_qscales(s);
3247 case AV_CODEC_ID_H263:
3248 case AV_CODEC_ID_H263P:
3249 case AV_CODEC_ID_FLV1:
3250 if (CONFIG_H263_ENCODER)
3251 ff_clean_h263_qscales(s);
3254 ff_init_qscale_tab(s);
3257 s->lambda= s->lambda_table[0];
3260 s->lambda = s->current_picture.f->quality;
3265 /* must be called before writing the header */
3266 static void set_frame_distances(MpegEncContext * s){
3267 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3268 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3270 if(s->pict_type==AV_PICTURE_TYPE_B){
3271 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3272 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3274 s->pp_time= s->time - s->last_non_b_time;
3275 s->last_non_b_time= s->time;
3276 assert(s->picture_number==0 || s->pp_time > 0);
3280 static int encode_picture(MpegEncContext *s, int picture_number)
3284 int context_count = s->slice_context_count;
3286 s->picture_number = picture_number;
3288 /* Reset the average MB variance */
3289 s->me.mb_var_sum_temp =
3290 s->me.mc_mb_var_sum_temp = 0;
3292 /* we need to initialize some time vars before we can encode b-frames */
3293 // RAL: Condition added for MPEG1VIDEO
3294 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3295 set_frame_distances(s);
3296 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3297 ff_set_mpeg4_time(s);
3299 s->me.scene_change_score=0;
3301 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3303 if(s->pict_type==AV_PICTURE_TYPE_I){
3304 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3305 else s->no_rounding=0;
3306 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3307 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3308 s->no_rounding ^= 1;
3311 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3312 if (estimate_qp(s,1) < 0)
3314 ff_get_2pass_fcode(s);
3315 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3316 if(s->pict_type==AV_PICTURE_TYPE_B)
3317 s->lambda= s->last_lambda_for[s->pict_type];
3319 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3323 s->mb_intra=0; //for the rate distortion & bit compare functions
3324 for(i=1; i<context_count; i++){
3325 ret = ff_update_duplicate_context(s->thread_context[i], s);
3333 /* Estimate motion for every MB */
3334 if(s->pict_type != AV_PICTURE_TYPE_I){
3335 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3336 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3337 if (s->pict_type != AV_PICTURE_TYPE_B) {
3338 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3339 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3343 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3344 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3346 for(i=0; i<s->mb_stride*s->mb_height; i++)
3347 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3349 if(!s->fixed_qscale){
3350 /* finding spatial complexity for I-frame rate control */
3351 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3354 for(i=1; i<context_count; i++){
3355 merge_context_after_me(s, s->thread_context[i]);
3357 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3358 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3361 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3362 s->pict_type= AV_PICTURE_TYPE_I;
3363 for(i=0; i<s->mb_stride*s->mb_height; i++)
3364 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3365 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3366 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3370 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3371 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3373 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3375 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3376 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3377 s->f_code= FFMAX3(s->f_code, a, b);
3380 ff_fix_long_p_mvs(s);
3381 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3382 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3386 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3387 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3392 if(s->pict_type==AV_PICTURE_TYPE_B){
3395 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3396 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3397 s->f_code = FFMAX(a, b);
3399 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3400 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3401 s->b_code = FFMAX(a, b);
3403 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3404 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3405 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3406 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3407 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3409 for(dir=0; dir<2; dir++){
3412 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3413 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3414 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3415 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3423 if (estimate_qp(s, 0) < 0)
3426 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3427 s->pict_type == AV_PICTURE_TYPE_I &&
3428 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3429 s->qscale= 3; //reduce clipping problems
3431 if (s->out_format == FMT_MJPEG) {
3432 /* for mjpeg, we do include qscale in the matrix */
3434 int j = s->idsp.idct_permutation[i];
3436 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3438 s->y_dc_scale_table=
3439 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3440 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3441 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3442 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3446 //FIXME var duplication
3447 s->current_picture_ptr->f->key_frame =
3448 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3449 s->current_picture_ptr->f->pict_type =
3450 s->current_picture.f->pict_type = s->pict_type;
3452 if (s->current_picture.f->key_frame)
3453 s->picture_in_gop_number=0;
3455 s->last_bits= put_bits_count(&s->pb);
3456 switch(s->out_format) {
3458 if (CONFIG_MJPEG_ENCODER)
3459 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3463 if (CONFIG_H261_ENCODER)
3464 ff_h261_encode_picture_header(s, picture_number);
3467 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3468 ff_wmv2_encode_picture_header(s, picture_number);
3469 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3470 ff_msmpeg4_encode_picture_header(s, picture_number);
3471 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3472 ff_mpeg4_encode_picture_header(s, picture_number);
3473 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3474 ret = ff_rv10_encode_picture_header(s, picture_number);
3478 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3479 ff_rv20_encode_picture_header(s, picture_number);
3480 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3481 ff_flv_encode_picture_header(s, picture_number);
3482 else if (CONFIG_H263_ENCODER)
3483 ff_h263_encode_picture_header(s, picture_number);
3486 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3487 ff_mpeg1_encode_picture_header(s, picture_number);
3492 bits= put_bits_count(&s->pb);
3493 s->header_bits= bits - s->last_bits;
3495 for(i=1; i<context_count; i++){
3496 update_duplicate_context_after_me(s->thread_context[i], s);
3498 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3499 for(i=1; i<context_count; i++){
3500 merge_context_after_encode(s, s->thread_context[i]);
3506 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3507 const int intra= s->mb_intra;
3510 s->dct_count[intra]++;
3512 for(i=0; i<64; i++){
3513 int level= block[i];
3517 s->dct_error_sum[intra][i] += level;
3518 level -= s->dct_offset[intra][i];
3519 if(level<0) level=0;
3521 s->dct_error_sum[intra][i] -= level;
3522 level += s->dct_offset[intra][i];
3523 if(level>0) level=0;
3530 static int dct_quantize_trellis_c(MpegEncContext *s,
3531 int16_t *block, int n,
3532 int qscale, int *overflow){
3534 const uint8_t *scantable= s->intra_scantable.scantable;
3535 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3537 unsigned int threshold1, threshold2;
3549 int coeff_count[64];
3550 int qmul, qadd, start_i, last_non_zero, i, dc;
3551 const int esc_length= s->ac_esc_length;
3553 uint8_t * last_length;
3554 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3556 s->fdsp.fdct(block);
3558 if(s->dct_error_sum)
3559 s->denoise_dct(s, block);
3561 qadd= ((qscale-1)|1)*8;
3572 /* For AIC we skip quant/dequant of INTRADC */
3577 /* note: block[0] is assumed to be positive */
3578 block[0] = (block[0] + (q >> 1)) / q;
3581 qmat = s->q_intra_matrix[qscale];
3582 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3583 bias= 1<<(QMAT_SHIFT-1);
3584 length = s->intra_ac_vlc_length;
3585 last_length= s->intra_ac_vlc_last_length;
3589 qmat = s->q_inter_matrix[qscale];
3590 length = s->inter_ac_vlc_length;
3591 last_length= s->inter_ac_vlc_last_length;
3595 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3596 threshold2= (threshold1<<1);
3598 for(i=63; i>=start_i; i--) {
3599 const int j = scantable[i];
3600 int level = block[j] * qmat[j];
3602 if(((unsigned)(level+threshold1))>threshold2){
3608 for(i=start_i; i<=last_non_zero; i++) {
3609 const int j = scantable[i];
3610 int level = block[j] * qmat[j];
3612 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3613 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3614 if(((unsigned)(level+threshold1))>threshold2){
3616 level= (bias + level)>>QMAT_SHIFT;
3618 coeff[1][i]= level-1;
3619 // coeff[2][k]= level-2;
3621 level= (bias - level)>>QMAT_SHIFT;
3622 coeff[0][i]= -level;
3623 coeff[1][i]= -level+1;
3624 // coeff[2][k]= -level+2;
3626 coeff_count[i]= FFMIN(level, 2);
3627 assert(coeff_count[i]);
3630 coeff[0][i]= (level>>31)|1;
3635 *overflow= s->max_qcoeff < max; //overflow might have happened
3637 if(last_non_zero < start_i){
3638 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3639 return last_non_zero;
3642 score_tab[start_i]= 0;
3643 survivor[0]= start_i;
3646 for(i=start_i; i<=last_non_zero; i++){
3647 int level_index, j, zero_distortion;
3648 int dct_coeff= FFABS(block[ scantable[i] ]);
3649 int best_score=256*256*256*120;
3651 if (s->fdsp.fdct == ff_fdct_ifast)
3652 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3653 zero_distortion= dct_coeff*dct_coeff;
3655 for(level_index=0; level_index < coeff_count[i]; level_index++){
3657 int level= coeff[level_index][i];
3658 const int alevel= FFABS(level);
3663 if(s->out_format == FMT_H263){
3664 unquant_coeff= alevel*qmul + qadd;
3666 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3668 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3669 unquant_coeff = (unquant_coeff - 1) | 1;
3671 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3672 unquant_coeff = (unquant_coeff - 1) | 1;
3677 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3679 if((level&(~127)) == 0){
3680 for(j=survivor_count-1; j>=0; j--){
3681 int run= i - survivor[j];
3682 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3683 score += score_tab[i-run];
3685 if(score < best_score){
3688 level_tab[i+1]= level-64;
3692 if(s->out_format == FMT_H263){
3693 for(j=survivor_count-1; j>=0; j--){
3694 int run= i - survivor[j];
3695 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3696 score += score_tab[i-run];
3697 if(score < last_score){
3700 last_level= level-64;
3706 distortion += esc_length*lambda;
3707 for(j=survivor_count-1; j>=0; j--){
3708 int run= i - survivor[j];
3709 int score= distortion + score_tab[i-run];
3711 if(score < best_score){
3714 level_tab[i+1]= level-64;
3718 if(s->out_format == FMT_H263){
3719 for(j=survivor_count-1; j>=0; j--){
3720 int run= i - survivor[j];
3721 int score= distortion + score_tab[i-run];
3722 if(score < last_score){
3725 last_level= level-64;
3733 score_tab[i+1]= best_score;
3735 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3736 if(last_non_zero <= 27){
3737 for(; survivor_count; survivor_count--){
3738 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3742 for(; survivor_count; survivor_count--){
3743 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3748 survivor[ survivor_count++ ]= i+1;
3751 if(s->out_format != FMT_H263){
3752 last_score= 256*256*256*120;
3753 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3754 int score= score_tab[i];
3755 if(i) score += lambda*2; //FIXME exacter?
3757 if(score < last_score){
3760 last_level= level_tab[i];
3761 last_run= run_tab[i];
3766 s->coded_score[n] = last_score;
3768 dc= FFABS(block[0]);
3769 last_non_zero= last_i - 1;
3770 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3772 if(last_non_zero < start_i)
3773 return last_non_zero;
3775 if(last_non_zero == 0 && start_i == 0){
3777 int best_score= dc * dc;
3779 for(i=0; i<coeff_count[0]; i++){
3780 int level= coeff[i][0];
3781 int alevel= FFABS(level);
3782 int unquant_coeff, score, distortion;
3784 if(s->out_format == FMT_H263){
3785 unquant_coeff= (alevel*qmul + qadd)>>3;
3787 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3788 unquant_coeff = (unquant_coeff - 1) | 1;
3790 unquant_coeff = (unquant_coeff + 4) >> 3;
3791 unquant_coeff<<= 3 + 3;
3793 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3795 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3796 else score= distortion + esc_length*lambda;
3798 if(score < best_score){
3800 best_level= level - 64;
3803 block[0]= best_level;
3804 s->coded_score[n] = best_score - dc*dc;
3805 if(best_level == 0) return -1;
3806 else return last_non_zero;
3812 block[ perm_scantable[last_non_zero] ]= last_level;
3815 for(; i>start_i; i -= run_tab[i] + 1){
3816 block[ perm_scantable[i-1] ]= level_tab[i];
3819 return last_non_zero;
3822 //#define REFINE_STATS 1
3823 static int16_t basis[64][64];
3825 static void build_basis(uint8_t *perm){
3832 double s= 0.25*(1<<BASIS_SHIFT);
3834 int perm_index= perm[index];
3835 if(i==0) s*= sqrt(0.5);
3836 if(j==0) s*= sqrt(0.5);
3837 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)));
3844 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3845 int16_t *block, int16_t *weight, int16_t *orig,
3848 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3849 const uint8_t *scantable= s->intra_scantable.scantable;
3850 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3851 // unsigned int threshold1, threshold2;
3856 int qmul, qadd, start_i, last_non_zero, i, dc;
3858 uint8_t * last_length;
3860 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3863 static int after_last=0;
3864 static int to_zero=0;
3865 static int from_zero=0;
3868 static int messed_sign=0;
3871 if(basis[0][0] == 0)
3872 build_basis(s->idsp.idct_permutation);
3883 /* For AIC we skip quant/dequant of INTRADC */
3887 q <<= RECON_SHIFT-3;
3888 /* note: block[0] is assumed to be positive */
3890 // block[0] = (block[0] + (q >> 1)) / q;
3892 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3893 // bias= 1<<(QMAT_SHIFT-1);
3894 length = s->intra_ac_vlc_length;
3895 last_length= s->intra_ac_vlc_last_length;
3899 length = s->inter_ac_vlc_length;
3900 last_length= s->inter_ac_vlc_last_length;
3902 last_non_zero = s->block_last_index[n];
3907 dc += (1<<(RECON_SHIFT-1));
3908 for(i=0; i<64; i++){
3909 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3912 STOP_TIMER("memset rem[]")}
3915 for(i=0; i<64; i++){
3920 w= FFABS(weight[i]) + qns*one;
3921 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3924 // w=weight[i] = (63*qns + (w/2)) / w;
3930 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3936 for(i=start_i; i<=last_non_zero; i++){
3937 int j= perm_scantable[i];
3938 const int level= block[j];
3942 if(level<0) coeff= qmul*level - qadd;
3943 else coeff= qmul*level + qadd;
3944 run_tab[rle_index++]=run;
3947 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3953 if(last_non_zero>0){
3954 STOP_TIMER("init rem[]")
3961 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3964 int run2, best_unquant_change=0, analyze_gradient;
3968 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3970 if(analyze_gradient){
3974 for(i=0; i<64; i++){
3977 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3980 STOP_TIMER("rem*w*w")}
3990 const int level= block[0];
3991 int change, old_coeff;
3993 assert(s->mb_intra);
3997 for(change=-1; change<=1; change+=2){
3998 int new_level= level + change;
3999 int score, new_coeff;
4001 new_coeff= q*new_level;
4002 if(new_coeff >= 2048 || new_coeff < 0)
4005 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4006 new_coeff - old_coeff);
4007 if(score<best_score){
4010 best_change= change;
4011 best_unquant_change= new_coeff - old_coeff;
4018 run2= run_tab[rle_index++];
4022 for(i=start_i; i<64; i++){
4023 int j= perm_scantable[i];
4024 const int level= block[j];
4025 int change, old_coeff;
4027 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4031 if(level<0) old_coeff= qmul*level - qadd;
4032 else old_coeff= qmul*level + qadd;
4033 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4037 assert(run2>=0 || i >= last_non_zero );
4040 for(change=-1; change<=1; change+=2){
4041 int new_level= level + change;
4042 int score, new_coeff, unquant_change;
4045 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4049 if(new_level<0) new_coeff= qmul*new_level - qadd;
4050 else new_coeff= qmul*new_level + qadd;
4051 if(new_coeff >= 2048 || new_coeff <= -2048)
4053 //FIXME check for overflow
4056 if(level < 63 && level > -63){
4057 if(i < last_non_zero)
4058 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4059 - length[UNI_AC_ENC_INDEX(run, level+64)];
4061 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4062 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4065 assert(FFABS(new_level)==1);
4067 if(analyze_gradient){
4068 int g= d1[ scantable[i] ];
4069 if(g && (g^new_level) >= 0)
4073 if(i < last_non_zero){
4074 int next_i= i + run2 + 1;
4075 int next_level= block[ perm_scantable[next_i] ] + 64;
4077 if(next_level&(~127))
4080 if(next_i < last_non_zero)
4081 score += length[UNI_AC_ENC_INDEX(run, 65)]
4082 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4083 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4085 score += length[UNI_AC_ENC_INDEX(run, 65)]
4086 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4087 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4089 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4091 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4092 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4098 assert(FFABS(level)==1);
4100 if(i < last_non_zero){
4101 int next_i= i + run2 + 1;
4102 int next_level= block[ perm_scantable[next_i] ] + 64;
4104 if(next_level&(~127))
4107 if(next_i < last_non_zero)
4108 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4109 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4110 - length[UNI_AC_ENC_INDEX(run, 65)];
4112 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4113 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4114 - length[UNI_AC_ENC_INDEX(run, 65)];
4116 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4118 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4119 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4126 unquant_change= new_coeff - old_coeff;
4127 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4129 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4131 if(score<best_score){
4134 best_change= change;
4135 best_unquant_change= unquant_change;
4139 prev_level= level + 64;
4140 if(prev_level&(~127))
4149 STOP_TIMER("iterative step")}
4153 int j= perm_scantable[ best_coeff ];
4155 block[j] += best_change;
4157 if(best_coeff > last_non_zero){
4158 last_non_zero= best_coeff;
4166 if(block[j] - best_change){
4167 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4179 for(; last_non_zero>=start_i; last_non_zero--){
4180 if(block[perm_scantable[last_non_zero]])
4186 if(256*256*256*64 % count == 0){
4187 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);
4192 for(i=start_i; i<=last_non_zero; i++){
4193 int j= perm_scantable[i];
4194 const int level= block[j];
4197 run_tab[rle_index++]=run;
4204 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4210 if(last_non_zero>0){
4211 STOP_TIMER("iterative search")
4216 return last_non_zero;
4220 * Permute an 8x8 block according to permuatation.
4221 * @param block the block which will be permuted according to
4222 * the given permutation vector
4223 * @param permutation the permutation vector
4224 * @param last the last non zero coefficient in scantable order, used to
4225 * speed the permutation up
4226 * @param scantable the used scantable, this is only used to speed the
4227 * permutation up, the block is not (inverse) permutated
4228 * to scantable order!
4230 static void block_permute(int16_t *block, uint8_t *permutation,
4231 const uint8_t *scantable, int last)
4238 //FIXME it is ok but not clean and might fail for some permutations
4239 // if (permutation[1] == 1)
4242 for (i = 0; i <= last; i++) {
4243 const int j = scantable[i];
4248 for (i = 0; i <= last; i++) {
4249 const int j = scantable[i];
4250 const int perm_j = permutation[j];
4251 block[perm_j] = temp[j];
4255 int ff_dct_quantize_c(MpegEncContext *s,
4256 int16_t *block, int n,
4257 int qscale, int *overflow)
4259 int i, j, level, last_non_zero, q, start_i;
4261 const uint8_t *scantable= s->intra_scantable.scantable;
4264 unsigned int threshold1, threshold2;
4266 s->fdsp.fdct(block);
4268 if(s->dct_error_sum)
4269 s->denoise_dct(s, block);
4279 /* For AIC we skip quant/dequant of INTRADC */
4282 /* note: block[0] is assumed to be positive */
4283 block[0] = (block[0] + (q >> 1)) / q;
4286 qmat = s->q_intra_matrix[qscale];
4287 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4291 qmat = s->q_inter_matrix[qscale];
4292 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4294 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4295 threshold2= (threshold1<<1);
4296 for(i=63;i>=start_i;i--) {
4298 level = block[j] * qmat[j];
4300 if(((unsigned)(level+threshold1))>threshold2){
4307 for(i=start_i; i<=last_non_zero; i++) {
4309 level = block[j] * qmat[j];
4311 // if( bias+level >= (1<<QMAT_SHIFT)
4312 // || bias-level >= (1<<QMAT_SHIFT)){
4313 if(((unsigned)(level+threshold1))>threshold2){
4315 level= (bias + level)>>QMAT_SHIFT;
4318 level= (bias - level)>>QMAT_SHIFT;
4326 *overflow= s->max_qcoeff < max; //overflow might have happened
4328 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4329 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4330 block_permute(block, s->idsp.idct_permutation,
4331 scantable, last_non_zero);
4333 return last_non_zero;
4336 #define OFFSET(x) offsetof(MpegEncContext, x)
4337 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4338 static const AVOption h263_options[] = {
4339 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4340 { "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},
4341 { "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 },
4346 static const AVClass h263_class = {
4347 .class_name = "H.263 encoder",
4348 .item_name = av_default_item_name,
4349 .option = h263_options,
4350 .version = LIBAVUTIL_VERSION_INT,
4353 AVCodec ff_h263_encoder = {
4355 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4356 .type = AVMEDIA_TYPE_VIDEO,
4357 .id = AV_CODEC_ID_H263,
4358 .priv_data_size = sizeof(MpegEncContext),
4359 .init = ff_mpv_encode_init,
4360 .encode2 = ff_mpv_encode_picture,
4361 .close = ff_mpv_encode_end,
4362 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4363 .priv_class = &h263_class,
4366 static const AVOption h263p_options[] = {
4367 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4368 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4369 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4370 { "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},
4374 static const AVClass h263p_class = {
4375 .class_name = "H.263p encoder",
4376 .item_name = av_default_item_name,
4377 .option = h263p_options,
4378 .version = LIBAVUTIL_VERSION_INT,
4381 AVCodec ff_h263p_encoder = {
4383 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4384 .type = AVMEDIA_TYPE_VIDEO,
4385 .id = AV_CODEC_ID_H263P,
4386 .priv_data_size = sizeof(MpegEncContext),
4387 .init = ff_mpv_encode_init,
4388 .encode2 = ff_mpv_encode_picture,
4389 .close = ff_mpv_encode_end,
4390 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4391 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4392 .priv_class = &h263p_class,
4395 static const AVClass msmpeg4v2_class = {
4396 .class_name = "msmpeg4v2 encoder",
4397 .item_name = av_default_item_name,
4398 .option = ff_mpv_generic_options,
4399 .version = LIBAVUTIL_VERSION_INT,
4402 AVCodec ff_msmpeg4v2_encoder = {
4403 .name = "msmpeg4v2",
4404 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4405 .type = AVMEDIA_TYPE_VIDEO,
4406 .id = AV_CODEC_ID_MSMPEG4V2,
4407 .priv_data_size = sizeof(MpegEncContext),
4408 .init = ff_mpv_encode_init,
4409 .encode2 = ff_mpv_encode_picture,
4410 .close = ff_mpv_encode_end,
4411 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4412 .priv_class = &msmpeg4v2_class,
4415 static const AVClass msmpeg4v3_class = {
4416 .class_name = "msmpeg4v3 encoder",
4417 .item_name = av_default_item_name,
4418 .option = ff_mpv_generic_options,
4419 .version = LIBAVUTIL_VERSION_INT,
4422 AVCodec ff_msmpeg4v3_encoder = {
4424 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4425 .type = AVMEDIA_TYPE_VIDEO,
4426 .id = AV_CODEC_ID_MSMPEG4V3,
4427 .priv_data_size = sizeof(MpegEncContext),
4428 .init = ff_mpv_encode_init,
4429 .encode2 = ff_mpv_encode_picture,
4430 .close = ff_mpv_encode_end,
4431 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4432 .priv_class = &msmpeg4v3_class,
4435 static const AVClass wmv1_class = {
4436 .class_name = "wmv1 encoder",
4437 .item_name = av_default_item_name,
4438 .option = ff_mpv_generic_options,
4439 .version = LIBAVUTIL_VERSION_INT,
4442 AVCodec ff_wmv1_encoder = {
4444 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4445 .type = AVMEDIA_TYPE_VIDEO,
4446 .id = AV_CODEC_ID_WMV1,
4447 .priv_data_size = sizeof(MpegEncContext),
4448 .init = ff_mpv_encode_init,
4449 .encode2 = ff_mpv_encode_picture,
4450 .close = ff_mpv_encode_end,
4451 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4452 .priv_class = &wmv1_class,