2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of Libav.
10 * Libav is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * Libav is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "libavutil/internal.h"
33 #include "libavutil/intmath.h"
34 #include "libavutil/mathematics.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/timer.h"
42 #include "mpegvideo.h"
45 #include "mjpegenc_common.h"
47 #include "mpegutils.h"
50 #include "pixblockdsp.h"
54 #include "aandcttab.h"
56 #include "mpeg4video.h"
58 #include "bytestream.h"
61 #define QUANT_BIAS_SHIFT 8
63 #define QMAT_SHIFT_MMX 16
66 static int encode_picture(MpegEncContext *s, int picture_number);
67 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
68 static int sse_mb(MpegEncContext *s);
69 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
70 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
72 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
73 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
75 const AVOption ff_mpv_generic_options[] = {
80 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
81 uint16_t (*qmat16)[2][64],
82 const uint16_t *quant_matrix,
83 int bias, int qmin, int qmax, int intra)
85 FDCTDSPContext *fdsp = &s->fdsp;
89 for (qscale = qmin; qscale <= qmax; qscale++) {
91 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
93 fdsp->fdct == ff_faandct ||
94 #endif /* CONFIG_FAANDCT */
95 fdsp->fdct == ff_jpeg_fdct_islow_10) {
96 for (i = 0; i < 64; i++) {
97 const int j = s->idsp.idct_permutation[i];
98 /* 16 <= qscale * quant_matrix[i] <= 7905
99 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
100 * 19952 <= x <= 249205026
101 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
102 * 3444240 >= (1 << 36) / (x) >= 275 */
104 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
105 (qscale * quant_matrix[j]));
107 } else if (fdsp->fdct == ff_fdct_ifast) {
108 for (i = 0; i < 64; i++) {
109 const int j = s->idsp.idct_permutation[i];
110 /* 16 <= qscale * quant_matrix[i] <= 7905
111 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
112 * 19952 <= x <= 249205026
113 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
114 * 3444240 >= (1 << 36) / (x) >= 275 */
116 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
117 (ff_aanscales[i] * qscale *
121 for (i = 0; i < 64; i++) {
122 const int j = s->idsp.idct_permutation[i];
123 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
124 * Assume x = qscale * quant_matrix[i]
126 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
127 * so 32768 >= (1 << 19) / (x) >= 67 */
128 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
129 (qscale * quant_matrix[j]));
130 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
131 // (qscale * quant_matrix[i]);
132 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
133 (qscale * quant_matrix[j]);
135 if (qmat16[qscale][0][i] == 0 ||
136 qmat16[qscale][0][i] == 128 * 256)
137 qmat16[qscale][0][i] = 128 * 256 - 1;
138 qmat16[qscale][1][i] =
139 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
140 qmat16[qscale][0][i]);
144 for (i = intra; i < 64; i++) {
146 if (fdsp->fdct == ff_fdct_ifast) {
147 max = (8191LL * ff_aanscales[i]) >> 14;
149 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
155 av_log(NULL, AV_LOG_INFO,
156 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
161 static inline void update_qscale(MpegEncContext *s)
163 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
164 (FF_LAMBDA_SHIFT + 7);
165 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
167 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
171 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
177 for (i = 0; i < 64; i++) {
178 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
185 * init s->current_picture.qscale_table from s->lambda_table
187 void ff_init_qscale_tab(MpegEncContext *s)
189 int8_t * const qscale_table = s->current_picture.qscale_table;
192 for (i = 0; i < s->mb_num; i++) {
193 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
194 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
195 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
200 static void update_duplicate_context_after_me(MpegEncContext *dst,
203 #define COPY(a) dst->a= src->a
205 COPY(current_picture);
211 COPY(picture_in_gop_number);
212 COPY(gop_picture_number);
213 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
214 COPY(progressive_frame); // FIXME don't set in encode_header
215 COPY(partitioned_frame); // FIXME don't set in encode_header
220 * Set the given MpegEncContext to defaults for encoding.
221 * the changed fields will not depend upon the prior state of the MpegEncContext.
223 static void mpv_encode_defaults(MpegEncContext *s)
226 ff_mpv_common_defaults(s);
228 for (i = -16; i < 16; i++) {
229 default_fcode_tab[i + MAX_MV] = 1;
231 s->me.mv_penalty = default_mv_penalty;
232 s->fcode_tab = default_fcode_tab;
234 s->input_picture_number = 0;
235 s->picture_in_gop_number = 0;
238 /* init video encoder */
239 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
241 MpegEncContext *s = avctx->priv_data;
242 int i, ret, format_supported;
244 mpv_encode_defaults(s);
246 switch (avctx->codec_id) {
247 case AV_CODEC_ID_MPEG2VIDEO:
248 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
249 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
250 av_log(avctx, AV_LOG_ERROR,
251 "only YUV420 and YUV422 are supported\n");
255 case AV_CODEC_ID_MJPEG:
256 format_supported = 0;
257 /* JPEG color space */
258 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
259 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
260 (avctx->color_range == AVCOL_RANGE_JPEG &&
261 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
262 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
263 format_supported = 1;
264 /* MPEG color space */
265 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
266 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
267 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
268 format_supported = 1;
270 if (!format_supported) {
271 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
276 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
277 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
282 switch (avctx->pix_fmt) {
283 case AV_PIX_FMT_YUVJ422P:
284 case AV_PIX_FMT_YUV422P:
285 s->chroma_format = CHROMA_422;
287 case AV_PIX_FMT_YUVJ420P:
288 case AV_PIX_FMT_YUV420P:
290 s->chroma_format = CHROMA_420;
294 s->bit_rate = avctx->bit_rate;
295 s->width = avctx->width;
296 s->height = avctx->height;
297 if (avctx->gop_size > 600 &&
298 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
299 av_log(avctx, AV_LOG_ERROR,
300 "Warning keyframe interval too large! reducing it ...\n");
301 avctx->gop_size = 600;
303 s->gop_size = avctx->gop_size;
305 s->flags = avctx->flags;
306 s->flags2 = avctx->flags2;
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 & 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 s->me_method = avctx->me_method;
330 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
332 s->adaptive_quant = (s->avctx->lumi_masking ||
333 s->avctx->dark_masking ||
334 s->avctx->temporal_cplx_masking ||
335 s->avctx->spatial_cplx_masking ||
336 s->avctx->p_masking ||
337 s->avctx->border_masking ||
338 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
341 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
343 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
344 av_log(avctx, AV_LOG_ERROR,
345 "a vbv buffer size is needed, "
346 "for encoding with a maximum bitrate\n");
350 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
351 av_log(avctx, AV_LOG_INFO,
352 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
355 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
356 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
360 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
361 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
365 if (avctx->rc_max_rate &&
366 avctx->rc_max_rate == avctx->bit_rate &&
367 avctx->rc_max_rate != avctx->rc_min_rate) {
368 av_log(avctx, AV_LOG_INFO,
369 "impossible bitrate constraints, this will fail\n");
372 if (avctx->rc_buffer_size &&
373 avctx->bit_rate * (int64_t)avctx->time_base.num >
374 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
375 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
379 if (!s->fixed_qscale &&
380 avctx->bit_rate * av_q2d(avctx->time_base) >
381 avctx->bit_rate_tolerance) {
382 av_log(avctx, AV_LOG_ERROR,
383 "bitrate tolerance too small for bitrate\n");
387 if (s->avctx->rc_max_rate &&
388 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
389 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
390 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
391 90000LL * (avctx->rc_buffer_size - 1) >
392 s->avctx->rc_max_rate * 0xFFFFLL) {
393 av_log(avctx, AV_LOG_INFO,
394 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
395 "specified vbv buffer is too large for the given bitrate!\n");
398 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
399 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
400 s->codec_id != AV_CODEC_ID_FLV1) {
401 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
405 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
406 av_log(avctx, AV_LOG_ERROR,
407 "OBMC is only supported with simple mb decision\n");
411 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
412 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
416 if (s->max_b_frames &&
417 s->codec_id != AV_CODEC_ID_MPEG4 &&
418 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
419 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
420 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
424 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
425 s->codec_id == AV_CODEC_ID_H263 ||
426 s->codec_id == AV_CODEC_ID_H263P) &&
427 (avctx->sample_aspect_ratio.num > 255 ||
428 avctx->sample_aspect_ratio.den > 255)) {
429 av_log(avctx, AV_LOG_ERROR,
430 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
431 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
435 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
436 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
437 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
441 // FIXME mpeg2 uses that too
442 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
443 av_log(avctx, AV_LOG_ERROR,
444 "mpeg2 style quantization not supported by codec\n");
448 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
449 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
453 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
454 s->avctx->mb_decision != FF_MB_DECISION_RD) {
455 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
459 if (s->avctx->scenechange_threshold < 1000000000 &&
460 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
461 av_log(avctx, AV_LOG_ERROR,
462 "closed gop with scene change detection are not supported yet, "
463 "set threshold to 1000000000\n");
467 if (s->flags & CODEC_FLAG_LOW_DELAY) {
468 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
469 av_log(avctx, AV_LOG_ERROR,
470 "low delay forcing is only available for mpeg2\n");
473 if (s->max_b_frames != 0) {
474 av_log(avctx, AV_LOG_ERROR,
475 "b frames cannot be used with low delay\n");
480 if (s->q_scale_type == 1) {
481 if (avctx->qmax > 12) {
482 av_log(avctx, AV_LOG_ERROR,
483 "non linear quant only supports qmax <= 12 currently\n");
488 if (s->avctx->thread_count > 1 &&
489 s->codec_id != AV_CODEC_ID_MPEG4 &&
490 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
491 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
492 (s->codec_id != AV_CODEC_ID_H263P)) {
493 av_log(avctx, AV_LOG_ERROR,
494 "multi threaded encoding not supported by codec\n");
498 if (s->avctx->thread_count < 1) {
499 av_log(avctx, AV_LOG_ERROR,
500 "automatic thread number detection not supported by codec,"
505 if (s->avctx->thread_count > 1)
508 if (!avctx->time_base.den || !avctx->time_base.num) {
509 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
513 i = (INT_MAX / 2 + 128) >> 8;
514 if (avctx->mb_threshold >= i) {
515 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
520 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
521 av_log(avctx, AV_LOG_INFO,
522 "notice: b_frame_strategy only affects the first pass\n");
523 avctx->b_frame_strategy = 0;
526 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
528 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
529 avctx->time_base.den /= i;
530 avctx->time_base.num /= i;
534 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
535 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
536 // (a + x * 3 / 8) / x
537 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
538 s->inter_quant_bias = 0;
540 s->intra_quant_bias = 0;
542 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
545 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
546 s->intra_quant_bias = avctx->intra_quant_bias;
547 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
548 s->inter_quant_bias = avctx->inter_quant_bias;
550 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
551 s->avctx->time_base.den > (1 << 16) - 1) {
552 av_log(avctx, AV_LOG_ERROR,
553 "timebase %d/%d not supported by MPEG 4 standard, "
554 "the maximum admitted value for the timebase denominator "
555 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
559 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
561 switch (avctx->codec->id) {
562 case AV_CODEC_ID_MPEG1VIDEO:
563 s->out_format = FMT_MPEG1;
564 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
565 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
567 case AV_CODEC_ID_MPEG2VIDEO:
568 s->out_format = FMT_MPEG1;
569 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
570 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
573 case AV_CODEC_ID_MJPEG:
574 s->out_format = FMT_MJPEG;
575 s->intra_only = 1; /* force intra only for jpeg */
576 if (!CONFIG_MJPEG_ENCODER ||
577 ff_mjpeg_encode_init(s) < 0)
582 case AV_CODEC_ID_H261:
583 if (!CONFIG_H261_ENCODER)
585 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
586 av_log(avctx, AV_LOG_ERROR,
587 "The specified picture size of %dx%d is not valid for the "
588 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
589 s->width, s->height);
592 s->out_format = FMT_H261;
596 case AV_CODEC_ID_H263:
597 if (!CONFIG_H263_ENCODER)
599 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
600 s->width, s->height) == 8) {
601 av_log(avctx, AV_LOG_INFO,
602 "The specified picture size of %dx%d is not valid for "
603 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
604 "352x288, 704x576, and 1408x1152."
605 "Try H.263+.\n", s->width, s->height);
608 s->out_format = FMT_H263;
612 case AV_CODEC_ID_H263P:
613 s->out_format = FMT_H263;
616 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
617 s->modified_quant = s->h263_aic;
618 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
619 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
622 /* These are just to be sure */
626 case AV_CODEC_ID_FLV1:
627 s->out_format = FMT_H263;
628 s->h263_flv = 2; /* format = 1; 11-bit codes */
629 s->unrestricted_mv = 1;
630 s->rtp_mode = 0; /* don't allow GOB */
634 case AV_CODEC_ID_RV10:
635 s->out_format = FMT_H263;
639 case AV_CODEC_ID_RV20:
640 s->out_format = FMT_H263;
643 s->modified_quant = 1;
647 s->unrestricted_mv = 0;
649 case AV_CODEC_ID_MPEG4:
650 s->out_format = FMT_H263;
652 s->unrestricted_mv = 1;
653 s->low_delay = s->max_b_frames ? 0 : 1;
654 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
656 case AV_CODEC_ID_MSMPEG4V2:
657 s->out_format = FMT_H263;
659 s->unrestricted_mv = 1;
660 s->msmpeg4_version = 2;
664 case AV_CODEC_ID_MSMPEG4V3:
665 s->out_format = FMT_H263;
667 s->unrestricted_mv = 1;
668 s->msmpeg4_version = 3;
669 s->flipflop_rounding = 1;
673 case AV_CODEC_ID_WMV1:
674 s->out_format = FMT_H263;
676 s->unrestricted_mv = 1;
677 s->msmpeg4_version = 4;
678 s->flipflop_rounding = 1;
682 case AV_CODEC_ID_WMV2:
683 s->out_format = FMT_H263;
685 s->unrestricted_mv = 1;
686 s->msmpeg4_version = 5;
687 s->flipflop_rounding = 1;
695 avctx->has_b_frames = !s->low_delay;
699 s->progressive_frame =
700 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
701 CODEC_FLAG_INTERLACED_ME) ||
706 if (ff_mpv_common_init(s) < 0)
710 ff_mpv_encode_init_x86(s);
712 ff_fdctdsp_init(&s->fdsp, avctx);
713 ff_me_cmp_init(&s->mecc, avctx);
714 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
715 ff_pixblockdsp_init(&s->pdsp, avctx);
716 ff_qpeldsp_init(&s->qdsp);
718 s->avctx->coded_frame = s->current_picture.f;
720 if (s->msmpeg4_version) {
721 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
722 2 * 2 * (MAX_LEVEL + 1) *
723 (MAX_RUN + 1) * 2 * sizeof(int), fail);
725 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
727 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
729 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
731 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
732 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
733 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
734 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
736 if (s->avctx->noise_reduction) {
737 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
738 2 * 64 * sizeof(uint16_t), fail);
741 if (CONFIG_H263_ENCODER)
742 ff_h263dsp_init(&s->h263dsp);
743 if (!s->dct_quantize)
744 s->dct_quantize = ff_dct_quantize_c;
746 s->denoise_dct = denoise_dct_c;
747 s->fast_dct_quantize = s->dct_quantize;
749 s->dct_quantize = dct_quantize_trellis_c;
751 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
752 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
754 s->quant_precision = 5;
756 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
757 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
759 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
760 ff_h261_encode_init(s);
761 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
762 ff_h263_encode_init(s);
763 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
764 ff_msmpeg4_encode_init(s);
765 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
766 && s->out_format == FMT_MPEG1)
767 ff_mpeg1_encode_init(s);
770 for (i = 0; i < 64; i++) {
771 int j = s->idsp.idct_permutation[i];
772 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
774 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
775 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
776 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
778 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
781 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
782 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
784 if (s->avctx->intra_matrix)
785 s->intra_matrix[j] = s->avctx->intra_matrix[i];
786 if (s->avctx->inter_matrix)
787 s->inter_matrix[j] = s->avctx->inter_matrix[i];
790 /* precompute matrix */
791 /* for mjpeg, we do include qscale in the matrix */
792 if (s->out_format != FMT_MJPEG) {
793 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
794 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
796 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
797 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
801 if (ff_rate_control_init(s) < 0)
804 #if FF_API_ERROR_RATE
805 FF_DISABLE_DEPRECATION_WARNINGS
806 if (avctx->error_rate)
807 s->error_rate = avctx->error_rate;
808 FF_ENABLE_DEPRECATION_WARNINGS;
811 #if FF_API_NORMALIZE_AQP
812 FF_DISABLE_DEPRECATION_WARNINGS
813 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
814 s->mpv_flags |= FF_MPV_FLAG_NAQ;
815 FF_ENABLE_DEPRECATION_WARNINGS;
819 FF_DISABLE_DEPRECATION_WARNINGS
820 if (avctx->flags & CODEC_FLAG_MV0)
821 s->mpv_flags |= FF_MPV_FLAG_MV0;
822 FF_ENABLE_DEPRECATION_WARNINGS
826 FF_DISABLE_DEPRECATION_WARNINGS
827 if (avctx->rc_qsquish != 0.0)
828 s->rc_qsquish = avctx->rc_qsquish;
829 if (avctx->rc_qmod_amp != 0.0)
830 s->rc_qmod_amp = avctx->rc_qmod_amp;
831 if (avctx->rc_qmod_freq)
832 s->rc_qmod_freq = avctx->rc_qmod_freq;
833 if (avctx->rc_buffer_aggressivity != 1.0)
834 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
835 if (avctx->rc_initial_cplx != 0.0)
836 s->rc_initial_cplx = avctx->rc_initial_cplx;
840 s->rc_eq = av_strdup(avctx->rc_eq);
842 return AVERROR(ENOMEM);
844 FF_ENABLE_DEPRECATION_WARNINGS
847 if (avctx->b_frame_strategy == 2) {
848 for (i = 0; i < s->max_b_frames + 2; i++) {
849 s->tmp_frames[i] = av_frame_alloc();
850 if (!s->tmp_frames[i])
851 return AVERROR(ENOMEM);
853 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
854 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
855 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
857 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
865 ff_mpv_encode_end(avctx);
866 return AVERROR_UNKNOWN;
869 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
871 MpegEncContext *s = avctx->priv_data;
874 ff_rate_control_uninit(s);
876 ff_mpv_common_end(s);
877 if (CONFIG_MJPEG_ENCODER &&
878 s->out_format == FMT_MJPEG)
879 ff_mjpeg_encode_close(s);
881 av_freep(&avctx->extradata);
883 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
884 av_frame_free(&s->tmp_frames[i]);
886 ff_free_picture_tables(&s->new_picture);
887 ff_mpeg_unref_picture(s, &s->new_picture);
889 av_freep(&s->avctx->stats_out);
890 av_freep(&s->ac_stats);
892 av_freep(&s->q_intra_matrix);
893 av_freep(&s->q_inter_matrix);
894 av_freep(&s->q_intra_matrix16);
895 av_freep(&s->q_inter_matrix16);
896 av_freep(&s->input_picture);
897 av_freep(&s->reordered_input_picture);
898 av_freep(&s->dct_offset);
903 static int get_sae(uint8_t *src, int ref, int stride)
908 for (y = 0; y < 16; y++) {
909 for (x = 0; x < 16; x++) {
910 acc += FFABS(src[x + y * stride] - ref);
917 static int get_intra_count(MpegEncContext *s, uint8_t *src,
918 uint8_t *ref, int stride)
926 for (y = 0; y < h; y += 16) {
927 for (x = 0; x < w; x += 16) {
928 int offset = x + y * stride;
929 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
931 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
932 int sae = get_sae(src + offset, mean, stride);
934 acc += sae + 500 < sad;
941 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
945 int i, display_picture_number = 0, ret;
946 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
947 (s->low_delay ? 0 : 1);
952 display_picture_number = s->input_picture_number++;
954 if (pts != AV_NOPTS_VALUE) {
955 if (s->user_specified_pts != AV_NOPTS_VALUE) {
957 int64_t last = s->user_specified_pts;
960 av_log(s->avctx, AV_LOG_ERROR,
961 "Error, Invalid timestamp=%"PRId64", "
962 "last=%"PRId64"\n", pts, s->user_specified_pts);
966 if (!s->low_delay && display_picture_number == 1)
967 s->dts_delta = time - last;
969 s->user_specified_pts = pts;
971 if (s->user_specified_pts != AV_NOPTS_VALUE) {
972 s->user_specified_pts =
973 pts = s->user_specified_pts + 1;
974 av_log(s->avctx, AV_LOG_INFO,
975 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
978 pts = display_picture_number;
984 if (!pic_arg->buf[0]);
986 if (pic_arg->linesize[0] != s->linesize)
988 if (pic_arg->linesize[1] != s->uvlinesize)
990 if (pic_arg->linesize[2] != s->uvlinesize)
993 av_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
994 pic_arg->linesize[1], s->linesize, s->uvlinesize);
997 i = ff_find_unused_picture(s, 1);
1001 pic = &s->picture[i];
1004 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1006 if (ff_alloc_picture(s, pic, 1) < 0) {
1010 i = ff_find_unused_picture(s, 0);
1014 pic = &s->picture[i];
1017 if (ff_alloc_picture(s, pic, 0) < 0) {
1021 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1022 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1023 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1026 int h_chroma_shift, v_chroma_shift;
1027 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1031 for (i = 0; i < 3; i++) {
1032 int src_stride = pic_arg->linesize[i];
1033 int dst_stride = i ? s->uvlinesize : s->linesize;
1034 int h_shift = i ? h_chroma_shift : 0;
1035 int v_shift = i ? v_chroma_shift : 0;
1036 int w = s->width >> h_shift;
1037 int h = s->height >> v_shift;
1038 uint8_t *src = pic_arg->data[i];
1039 uint8_t *dst = pic->f->data[i];
1041 if (!s->avctx->rc_buffer_size)
1042 dst += INPLACE_OFFSET;
1044 if (src_stride == dst_stride)
1045 memcpy(dst, src, src_stride * h);
1048 memcpy(dst, src, w);
1056 ret = av_frame_copy_props(pic->f, pic_arg);
1060 pic->f->display_picture_number = display_picture_number;
1061 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1064 /* shift buffer entries */
1065 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1066 s->input_picture[i - 1] = s->input_picture[i];
1068 s->input_picture[encoding_delay] = (Picture*) pic;
1073 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1077 int64_t score64 = 0;
1079 for (plane = 0; plane < 3; plane++) {
1080 const int stride = p->f->linesize[plane];
1081 const int bw = plane ? 1 : 2;
1082 for (y = 0; y < s->mb_height * bw; y++) {
1083 for (x = 0; x < s->mb_width * bw; x++) {
1084 int off = p->shared ? 0 : 16;
1085 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1086 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1087 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1089 switch (s->avctx->frame_skip_exp) {
1090 case 0: score = FFMAX(score, v); break;
1091 case 1: score += FFABS(v); break;
1092 case 2: score += v * v; break;
1093 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1094 case 4: score64 += v * v * (int64_t)(v * v); break;
1103 if (score64 < s->avctx->frame_skip_threshold)
1105 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1110 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1112 AVPacket pkt = { 0 };
1113 int ret, got_output;
1115 av_init_packet(&pkt);
1116 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1121 av_free_packet(&pkt);
1125 static int estimate_best_b_count(MpegEncContext *s)
1127 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1128 AVCodecContext *c = avcodec_alloc_context3(NULL);
1129 const int scale = s->avctx->brd_scale;
1130 int i, j, out_size, p_lambda, b_lambda, lambda2;
1131 int64_t best_rd = INT64_MAX;
1132 int best_b_count = -1;
1134 assert(scale >= 0 && scale <= 3);
1137 //s->next_picture_ptr->quality;
1138 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1139 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1140 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1141 if (!b_lambda) // FIXME we should do this somewhere else
1142 b_lambda = p_lambda;
1143 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1146 c->width = s->width >> scale;
1147 c->height = s->height >> scale;
1148 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1149 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1150 c->mb_decision = s->avctx->mb_decision;
1151 c->me_cmp = s->avctx->me_cmp;
1152 c->mb_cmp = s->avctx->mb_cmp;
1153 c->me_sub_cmp = s->avctx->me_sub_cmp;
1154 c->pix_fmt = AV_PIX_FMT_YUV420P;
1155 c->time_base = s->avctx->time_base;
1156 c->max_b_frames = s->max_b_frames;
1158 if (avcodec_open2(c, codec, NULL) < 0)
1161 for (i = 0; i < s->max_b_frames + 2; i++) {
1162 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1163 s->next_picture_ptr;
1165 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1166 pre_input = *pre_input_ptr;
1168 if (!pre_input.shared && i) {
1169 pre_input.f->data[0] += INPLACE_OFFSET;
1170 pre_input.f->data[1] += INPLACE_OFFSET;
1171 pre_input.f->data[2] += INPLACE_OFFSET;
1174 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1175 s->tmp_frames[i]->linesize[0],
1176 pre_input.f->data[0],
1177 pre_input.f->linesize[0],
1178 c->width, c->height);
1179 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1180 s->tmp_frames[i]->linesize[1],
1181 pre_input.f->data[1],
1182 pre_input.f->linesize[1],
1183 c->width >> 1, c->height >> 1);
1184 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1185 s->tmp_frames[i]->linesize[2],
1186 pre_input.f->data[2],
1187 pre_input.f->linesize[2],
1188 c->width >> 1, c->height >> 1);
1192 for (j = 0; j < s->max_b_frames + 1; j++) {
1195 if (!s->input_picture[j])
1198 c->error[0] = c->error[1] = c->error[2] = 0;
1200 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1201 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1203 out_size = encode_frame(c, s->tmp_frames[0]);
1205 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1207 for (i = 0; i < s->max_b_frames + 1; i++) {
1208 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1210 s->tmp_frames[i + 1]->pict_type = is_p ?
1211 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1212 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1214 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1216 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1219 /* get the delayed frames */
1221 out_size = encode_frame(c, NULL);
1222 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1225 rd += c->error[0] + c->error[1] + c->error[2];
1236 return best_b_count;
1239 static int select_input_picture(MpegEncContext *s)
1243 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1244 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1245 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1247 /* set next picture type & ordering */
1248 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1249 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1250 !s->next_picture_ptr || s->intra_only) {
1251 s->reordered_input_picture[0] = s->input_picture[0];
1252 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1253 s->reordered_input_picture[0]->f->coded_picture_number =
1254 s->coded_picture_number++;
1258 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1259 if (s->picture_in_gop_number < s->gop_size &&
1260 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1261 // FIXME check that te gop check above is +-1 correct
1262 av_frame_unref(s->input_picture[0]->f);
1265 ff_vbv_update(s, 0);
1271 if (s->flags & CODEC_FLAG_PASS2) {
1272 for (i = 0; i < s->max_b_frames + 1; i++) {
1273 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1275 if (pict_num >= s->rc_context.num_entries)
1277 if (!s->input_picture[i]) {
1278 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1282 s->input_picture[i]->f->pict_type =
1283 s->rc_context.entry[pict_num].new_pict_type;
1287 if (s->avctx->b_frame_strategy == 0) {
1288 b_frames = s->max_b_frames;
1289 while (b_frames && !s->input_picture[b_frames])
1291 } else if (s->avctx->b_frame_strategy == 1) {
1292 for (i = 1; i < s->max_b_frames + 1; i++) {
1293 if (s->input_picture[i] &&
1294 s->input_picture[i]->b_frame_score == 0) {
1295 s->input_picture[i]->b_frame_score =
1297 s->input_picture[i ]->f->data[0],
1298 s->input_picture[i - 1]->f->data[0],
1302 for (i = 0; i < s->max_b_frames + 1; i++) {
1303 if (!s->input_picture[i] ||
1304 s->input_picture[i]->b_frame_score - 1 >
1305 s->mb_num / s->avctx->b_sensitivity)
1309 b_frames = FFMAX(0, i - 1);
1312 for (i = 0; i < b_frames + 1; i++) {
1313 s->input_picture[i]->b_frame_score = 0;
1315 } else if (s->avctx->b_frame_strategy == 2) {
1316 b_frames = estimate_best_b_count(s);
1318 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1324 for (i = b_frames - 1; i >= 0; i--) {
1325 int type = s->input_picture[i]->f->pict_type;
1326 if (type && type != AV_PICTURE_TYPE_B)
1329 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1330 b_frames == s->max_b_frames) {
1331 av_log(s->avctx, AV_LOG_ERROR,
1332 "warning, too many b frames in a row\n");
1335 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1336 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1337 s->gop_size > s->picture_in_gop_number) {
1338 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1340 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1342 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1346 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1347 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1350 s->reordered_input_picture[0] = s->input_picture[b_frames];
1351 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1352 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1353 s->reordered_input_picture[0]->f->coded_picture_number =
1354 s->coded_picture_number++;
1355 for (i = 0; i < b_frames; i++) {
1356 s->reordered_input_picture[i + 1] = s->input_picture[i];
1357 s->reordered_input_picture[i + 1]->f->pict_type =
1359 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1360 s->coded_picture_number++;
1365 if (s->reordered_input_picture[0]) {
1366 s->reordered_input_picture[0]->reference =
1367 s->reordered_input_picture[0]->f->pict_type !=
1368 AV_PICTURE_TYPE_B ? 3 : 0;
1370 ff_mpeg_unref_picture(s, &s->new_picture);
1371 if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1374 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1375 // input is a shared pix, so we can't modifiy it -> alloc a new
1376 // one & ensure that the shared one is reuseable
1379 int i = ff_find_unused_picture(s, 0);
1382 pic = &s->picture[i];
1384 pic->reference = s->reordered_input_picture[0]->reference;
1385 if (ff_alloc_picture(s, pic, 0) < 0) {
1389 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1393 /* mark us unused / free shared pic */
1394 av_frame_unref(s->reordered_input_picture[0]->f);
1395 s->reordered_input_picture[0]->shared = 0;
1397 s->current_picture_ptr = pic;
1399 // input is not a shared pix -> reuse buffer for current_pix
1400 s->current_picture_ptr = s->reordered_input_picture[0];
1401 for (i = 0; i < 4; i++) {
1402 s->new_picture.f->data[i] += INPLACE_OFFSET;
1405 ff_mpeg_unref_picture(s, &s->current_picture);
1406 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1407 s->current_picture_ptr)) < 0)
1410 s->picture_number = s->new_picture.f->display_picture_number;
1412 ff_mpeg_unref_picture(s, &s->new_picture);
1417 static void frame_end(MpegEncContext *s)
1421 if (s->unrestricted_mv &&
1422 s->current_picture.reference &&
1424 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1425 int hshift = desc->log2_chroma_w;
1426 int vshift = desc->log2_chroma_h;
1427 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1428 s->h_edge_pos, s->v_edge_pos,
1429 EDGE_WIDTH, EDGE_WIDTH,
1430 EDGE_TOP | EDGE_BOTTOM);
1431 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1432 s->h_edge_pos >> hshift,
1433 s->v_edge_pos >> vshift,
1434 EDGE_WIDTH >> hshift,
1435 EDGE_WIDTH >> vshift,
1436 EDGE_TOP | EDGE_BOTTOM);
1437 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1438 s->h_edge_pos >> hshift,
1439 s->v_edge_pos >> vshift,
1440 EDGE_WIDTH >> hshift,
1441 EDGE_WIDTH >> vshift,
1442 EDGE_TOP | EDGE_BOTTOM);
1447 s->last_pict_type = s->pict_type;
1448 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1449 if (s->pict_type!= AV_PICTURE_TYPE_B)
1450 s->last_non_b_pict_type = s->pict_type;
1453 /* release non-reference frames */
1454 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1455 if (!s->picture[i].reference)
1456 ff_mpeg_unref_picture(s, &s->picture[i]);
1460 s->avctx->coded_frame = s->current_picture_ptr->f;
1464 static void update_noise_reduction(MpegEncContext *s)
1468 for (intra = 0; intra < 2; intra++) {
1469 if (s->dct_count[intra] > (1 << 16)) {
1470 for (i = 0; i < 64; i++) {
1471 s->dct_error_sum[intra][i] >>= 1;
1473 s->dct_count[intra] >>= 1;
1476 for (i = 0; i < 64; i++) {
1477 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1478 s->dct_count[intra] +
1479 s->dct_error_sum[intra][i] / 2) /
1480 (s->dct_error_sum[intra][i] + 1);
1485 static int frame_start(MpegEncContext *s)
1489 /* mark & release old frames */
1490 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1491 s->last_picture_ptr != s->next_picture_ptr &&
1492 s->last_picture_ptr->f->buf[0]) {
1493 ff_mpeg_unref_picture(s, s->last_picture_ptr);
1496 s->current_picture_ptr->f->pict_type = s->pict_type;
1497 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1499 ff_mpeg_unref_picture(s, &s->current_picture);
1500 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1501 s->current_picture_ptr)) < 0)
1504 if (s->pict_type != AV_PICTURE_TYPE_B) {
1505 s->last_picture_ptr = s->next_picture_ptr;
1507 s->next_picture_ptr = s->current_picture_ptr;
1510 if (s->last_picture_ptr) {
1511 ff_mpeg_unref_picture(s, &s->last_picture);
1512 if (s->last_picture_ptr->f->buf[0] &&
1513 (ret = ff_mpeg_ref_picture(s, &s->last_picture,
1514 s->last_picture_ptr)) < 0)
1517 if (s->next_picture_ptr) {
1518 ff_mpeg_unref_picture(s, &s->next_picture);
1519 if (s->next_picture_ptr->f->buf[0] &&
1520 (ret = ff_mpeg_ref_picture(s, &s->next_picture,
1521 s->next_picture_ptr)) < 0)
1525 if (s->picture_structure!= PICT_FRAME) {
1527 for (i = 0; i < 4; i++) {
1528 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1529 s->current_picture.f->data[i] +=
1530 s->current_picture.f->linesize[i];
1532 s->current_picture.f->linesize[i] *= 2;
1533 s->last_picture.f->linesize[i] *= 2;
1534 s->next_picture.f->linesize[i] *= 2;
1538 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1539 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1540 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1541 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1542 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1543 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1545 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1546 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1549 if (s->dct_error_sum) {
1550 assert(s->avctx->noise_reduction && s->encoding);
1551 update_noise_reduction(s);
1557 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1558 const AVFrame *pic_arg, int *got_packet)
1560 MpegEncContext *s = avctx->priv_data;
1561 int i, stuffing_count, ret;
1562 int context_count = s->slice_context_count;
1564 s->picture_in_gop_number++;
1566 if (load_input_picture(s, pic_arg) < 0)
1569 if (select_input_picture(s) < 0) {
1574 if (s->new_picture.f->data[0]) {
1576 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1579 s->mb_info_ptr = av_packet_new_side_data(pkt,
1580 AV_PKT_DATA_H263_MB_INFO,
1581 s->mb_width*s->mb_height*12);
1582 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1585 for (i = 0; i < context_count; i++) {
1586 int start_y = s->thread_context[i]->start_mb_y;
1587 int end_y = s->thread_context[i]-> end_mb_y;
1588 int h = s->mb_height;
1589 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1590 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1592 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1595 s->pict_type = s->new_picture.f->pict_type;
1597 ret = frame_start(s);
1601 if (encode_picture(s, s->picture_number) < 0)
1604 avctx->header_bits = s->header_bits;
1605 avctx->mv_bits = s->mv_bits;
1606 avctx->misc_bits = s->misc_bits;
1607 avctx->i_tex_bits = s->i_tex_bits;
1608 avctx->p_tex_bits = s->p_tex_bits;
1609 avctx->i_count = s->i_count;
1610 // FIXME f/b_count in avctx
1611 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1612 avctx->skip_count = s->skip_count;
1616 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1617 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1619 if (avctx->rc_buffer_size) {
1620 RateControlContext *rcc = &s->rc_context;
1621 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1623 if (put_bits_count(&s->pb) > max_size &&
1624 s->lambda < s->avctx->lmax) {
1625 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1626 (s->qscale + 1) / s->qscale);
1627 if (s->adaptive_quant) {
1629 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1630 s->lambda_table[i] =
1631 FFMAX(s->lambda_table[i] + 1,
1632 s->lambda_table[i] * (s->qscale + 1) /
1635 s->mb_skipped = 0; // done in frame_start()
1636 // done in encode_picture() so we must undo it
1637 if (s->pict_type == AV_PICTURE_TYPE_P) {
1638 if (s->flipflop_rounding ||
1639 s->codec_id == AV_CODEC_ID_H263P ||
1640 s->codec_id == AV_CODEC_ID_MPEG4)
1641 s->no_rounding ^= 1;
1643 if (s->pict_type != AV_PICTURE_TYPE_B) {
1644 s->time_base = s->last_time_base;
1645 s->last_non_b_time = s->time - s->pp_time;
1647 for (i = 0; i < context_count; i++) {
1648 PutBitContext *pb = &s->thread_context[i]->pb;
1649 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1654 assert(s->avctx->rc_max_rate);
1657 if (s->flags & CODEC_FLAG_PASS1)
1658 ff_write_pass1_stats(s);
1660 for (i = 0; i < 4; i++) {
1661 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1662 avctx->error[i] += s->current_picture_ptr->f->error[i];
1665 if (s->flags & CODEC_FLAG_PASS1)
1666 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1667 avctx->i_tex_bits + avctx->p_tex_bits ==
1668 put_bits_count(&s->pb));
1669 flush_put_bits(&s->pb);
1670 s->frame_bits = put_bits_count(&s->pb);
1672 stuffing_count = ff_vbv_update(s, s->frame_bits);
1673 if (stuffing_count) {
1674 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1675 stuffing_count + 50) {
1676 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1680 switch (s->codec_id) {
1681 case AV_CODEC_ID_MPEG1VIDEO:
1682 case AV_CODEC_ID_MPEG2VIDEO:
1683 while (stuffing_count--) {
1684 put_bits(&s->pb, 8, 0);
1687 case AV_CODEC_ID_MPEG4:
1688 put_bits(&s->pb, 16, 0);
1689 put_bits(&s->pb, 16, 0x1C3);
1690 stuffing_count -= 4;
1691 while (stuffing_count--) {
1692 put_bits(&s->pb, 8, 0xFF);
1696 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1698 flush_put_bits(&s->pb);
1699 s->frame_bits = put_bits_count(&s->pb);
1702 /* update mpeg1/2 vbv_delay for CBR */
1703 if (s->avctx->rc_max_rate &&
1704 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1705 s->out_format == FMT_MPEG1 &&
1706 90000LL * (avctx->rc_buffer_size - 1) <=
1707 s->avctx->rc_max_rate * 0xFFFFLL) {
1708 int vbv_delay, min_delay;
1709 double inbits = s->avctx->rc_max_rate *
1710 av_q2d(s->avctx->time_base);
1711 int minbits = s->frame_bits - 8 *
1712 (s->vbv_delay_ptr - s->pb.buf - 1);
1713 double bits = s->rc_context.buffer_index + minbits - inbits;
1716 av_log(s->avctx, AV_LOG_ERROR,
1717 "Internal error, negative bits\n");
1719 assert(s->repeat_first_field == 0);
1721 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1722 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1723 s->avctx->rc_max_rate;
1725 vbv_delay = FFMAX(vbv_delay, min_delay);
1727 assert(vbv_delay < 0xFFFF);
1729 s->vbv_delay_ptr[0] &= 0xF8;
1730 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1731 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1732 s->vbv_delay_ptr[2] &= 0x07;
1733 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1734 avctx->vbv_delay = vbv_delay * 300;
1736 s->total_bits += s->frame_bits;
1737 avctx->frame_bits = s->frame_bits;
1739 pkt->pts = s->current_picture.f->pts;
1740 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1741 if (!s->current_picture.f->coded_picture_number)
1742 pkt->dts = pkt->pts - s->dts_delta;
1744 pkt->dts = s->reordered_pts;
1745 s->reordered_pts = pkt->pts;
1747 pkt->dts = pkt->pts;
1748 if (s->current_picture.f->key_frame)
1749 pkt->flags |= AV_PKT_FLAG_KEY;
1751 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1755 assert((s->frame_bits & 7) == 0);
1757 pkt->size = s->frame_bits / 8;
1758 *got_packet = !!pkt->size;
1762 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1763 int n, int threshold)
1765 static const char tab[64] = {
1766 3, 2, 2, 1, 1, 1, 1, 1,
1767 1, 1, 1, 1, 1, 1, 1, 1,
1768 1, 1, 1, 1, 1, 1, 1, 1,
1769 0, 0, 0, 0, 0, 0, 0, 0,
1770 0, 0, 0, 0, 0, 0, 0, 0,
1771 0, 0, 0, 0, 0, 0, 0, 0,
1772 0, 0, 0, 0, 0, 0, 0, 0,
1773 0, 0, 0, 0, 0, 0, 0, 0
1778 int16_t *block = s->block[n];
1779 const int last_index = s->block_last_index[n];
1782 if (threshold < 0) {
1784 threshold = -threshold;
1788 /* Are all we could set to zero already zero? */
1789 if (last_index <= skip_dc - 1)
1792 for (i = 0; i <= last_index; i++) {
1793 const int j = s->intra_scantable.permutated[i];
1794 const int level = FFABS(block[j]);
1796 if (skip_dc && i == 0)
1800 } else if (level > 1) {
1806 if (score >= threshold)
1808 for (i = skip_dc; i <= last_index; i++) {
1809 const int j = s->intra_scantable.permutated[i];
1813 s->block_last_index[n] = 0;
1815 s->block_last_index[n] = -1;
1818 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1822 const int maxlevel = s->max_qcoeff;
1823 const int minlevel = s->min_qcoeff;
1827 i = 1; // skip clipping of intra dc
1831 for (; i <= last_index; i++) {
1832 const int j = s->intra_scantable.permutated[i];
1833 int level = block[j];
1835 if (level > maxlevel) {
1838 } else if (level < minlevel) {
1846 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1847 av_log(s->avctx, AV_LOG_INFO,
1848 "warning, clipping %d dct coefficients to %d..%d\n",
1849 overflow, minlevel, maxlevel);
1852 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1856 for (y = 0; y < 8; y++) {
1857 for (x = 0; x < 8; x++) {
1863 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1864 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1865 int v = ptr[x2 + y2 * stride];
1871 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1876 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1877 int motion_x, int motion_y,
1878 int mb_block_height,
1881 int16_t weight[8][64];
1882 int16_t orig[8][64];
1883 const int mb_x = s->mb_x;
1884 const int mb_y = s->mb_y;
1887 int dct_offset = s->linesize * 8; // default for progressive frames
1888 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1889 ptrdiff_t wrap_y, wrap_c;
1891 for (i = 0; i < mb_block_count; i++)
1892 skip_dct[i] = s->skipdct;
1894 if (s->adaptive_quant) {
1895 const int last_qp = s->qscale;
1896 const int mb_xy = mb_x + mb_y * s->mb_stride;
1898 s->lambda = s->lambda_table[mb_xy];
1901 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1902 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1903 s->dquant = s->qscale - last_qp;
1905 if (s->out_format == FMT_H263) {
1906 s->dquant = av_clip(s->dquant, -2, 2);
1908 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1910 if (s->pict_type == AV_PICTURE_TYPE_B) {
1911 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1914 if (s->mv_type == MV_TYPE_8X8)
1920 ff_set_qscale(s, last_qp + s->dquant);
1921 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1922 ff_set_qscale(s, s->qscale + s->dquant);
1924 wrap_y = s->linesize;
1925 wrap_c = s->uvlinesize;
1926 ptr_y = s->new_picture.f->data[0] +
1927 (mb_y * 16 * wrap_y) + mb_x * 16;
1928 ptr_cb = s->new_picture.f->data[1] +
1929 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1930 ptr_cr = s->new_picture.f->data[2] +
1931 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1933 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1934 uint8_t *ebuf = s->edge_emu_buffer + 32;
1935 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1937 16, 16, mb_x * 16, mb_y * 16,
1938 s->width, s->height);
1940 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1942 8, mb_block_height, mb_x * 8, mb_y * 8,
1943 s->width >> 1, s->height >> 1);
1944 ptr_cb = ebuf + 18 * wrap_y;
1945 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1947 8, mb_block_height, mb_x * 8, mb_y * 8,
1948 s->width >> 1, s->height >> 1);
1949 ptr_cr = ebuf + 18 * wrap_y + 8;
1953 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1954 int progressive_score, interlaced_score;
1956 s->interlaced_dct = 0;
1957 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1958 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1959 NULL, wrap_y, 8) - 400;
1961 if (progressive_score > 0) {
1962 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1963 NULL, wrap_y * 2, 8) +
1964 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1965 NULL, wrap_y * 2, 8);
1966 if (progressive_score > interlaced_score) {
1967 s->interlaced_dct = 1;
1969 dct_offset = wrap_y;
1971 if (s->chroma_format == CHROMA_422)
1977 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1978 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1979 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
1980 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
1982 if (s->flags & CODEC_FLAG_GRAY) {
1986 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1987 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1988 if (!s->chroma_y_shift) { /* 422 */
1989 s->pdsp.get_pixels(s->block[6],
1990 ptr_cb + (dct_offset >> 1), wrap_c);
1991 s->pdsp.get_pixels(s->block[7],
1992 ptr_cr + (dct_offset >> 1), wrap_c);
1996 op_pixels_func (*op_pix)[4];
1997 qpel_mc_func (*op_qpix)[16];
1998 uint8_t *dest_y, *dest_cb, *dest_cr;
2000 dest_y = s->dest[0];
2001 dest_cb = s->dest[1];
2002 dest_cr = s->dest[2];
2004 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2005 op_pix = s->hdsp.put_pixels_tab;
2006 op_qpix = s->qdsp.put_qpel_pixels_tab;
2008 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2009 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2012 if (s->mv_dir & MV_DIR_FORWARD) {
2013 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2014 s->last_picture.f->data,
2016 op_pix = s->hdsp.avg_pixels_tab;
2017 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2019 if (s->mv_dir & MV_DIR_BACKWARD) {
2020 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2021 s->next_picture.f->data,
2025 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
2026 int progressive_score, interlaced_score;
2028 s->interlaced_dct = 0;
2029 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2030 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2034 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2035 progressive_score -= 400;
2037 if (progressive_score > 0) {
2038 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2040 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2044 if (progressive_score > interlaced_score) {
2045 s->interlaced_dct = 1;
2047 dct_offset = wrap_y;
2049 if (s->chroma_format == CHROMA_422)
2055 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2056 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2057 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2058 dest_y + dct_offset, wrap_y);
2059 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2060 dest_y + dct_offset + 8, wrap_y);
2062 if (s->flags & CODEC_FLAG_GRAY) {
2066 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2067 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2068 if (!s->chroma_y_shift) { /* 422 */
2069 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2070 dest_cb + (dct_offset >> 1), wrap_c);
2071 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2072 dest_cr + (dct_offset >> 1), wrap_c);
2075 /* pre quantization */
2076 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2077 2 * s->qscale * s->qscale) {
2079 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2081 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2083 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2084 wrap_y, 8) < 20 * s->qscale)
2086 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2087 wrap_y, 8) < 20 * s->qscale)
2089 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2091 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2093 if (!s->chroma_y_shift) { /* 422 */
2094 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2095 dest_cb + (dct_offset >> 1),
2096 wrap_c, 8) < 20 * s->qscale)
2098 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2099 dest_cr + (dct_offset >> 1),
2100 wrap_c, 8) < 20 * s->qscale)
2106 if (s->quantizer_noise_shaping) {
2108 get_visual_weight(weight[0], ptr_y , wrap_y);
2110 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2112 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2114 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2116 get_visual_weight(weight[4], ptr_cb , wrap_c);
2118 get_visual_weight(weight[5], ptr_cr , wrap_c);
2119 if (!s->chroma_y_shift) { /* 422 */
2121 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2124 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2127 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2130 /* DCT & quantize */
2131 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2133 for (i = 0; i < mb_block_count; i++) {
2136 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2137 // FIXME we could decide to change to quantizer instead of
2139 // JS: I don't think that would be a good idea it could lower
2140 // quality instead of improve it. Just INTRADC clipping
2141 // deserves changes in quantizer
2143 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2145 s->block_last_index[i] = -1;
2147 if (s->quantizer_noise_shaping) {
2148 for (i = 0; i < mb_block_count; i++) {
2150 s->block_last_index[i] =
2151 dct_quantize_refine(s, s->block[i], weight[i],
2152 orig[i], i, s->qscale);
2157 if (s->luma_elim_threshold && !s->mb_intra)
2158 for (i = 0; i < 4; i++)
2159 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2160 if (s->chroma_elim_threshold && !s->mb_intra)
2161 for (i = 4; i < mb_block_count; i++)
2162 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2164 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2165 for (i = 0; i < mb_block_count; i++) {
2166 if (s->block_last_index[i] == -1)
2167 s->coded_score[i] = INT_MAX / 256;
2172 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2173 s->block_last_index[4] =
2174 s->block_last_index[5] = 0;
2176 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2179 // non c quantize code returns incorrect block_last_index FIXME
2180 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2181 for (i = 0; i < mb_block_count; i++) {
2183 if (s->block_last_index[i] > 0) {
2184 for (j = 63; j > 0; j--) {
2185 if (s->block[i][s->intra_scantable.permutated[j]])
2188 s->block_last_index[i] = j;
2193 /* huffman encode */
2194 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2195 case AV_CODEC_ID_MPEG1VIDEO:
2196 case AV_CODEC_ID_MPEG2VIDEO:
2197 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2198 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2200 case AV_CODEC_ID_MPEG4:
2201 if (CONFIG_MPEG4_ENCODER)
2202 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2204 case AV_CODEC_ID_MSMPEG4V2:
2205 case AV_CODEC_ID_MSMPEG4V3:
2206 case AV_CODEC_ID_WMV1:
2207 if (CONFIG_MSMPEG4_ENCODER)
2208 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2210 case AV_CODEC_ID_WMV2:
2211 if (CONFIG_WMV2_ENCODER)
2212 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2214 case AV_CODEC_ID_H261:
2215 if (CONFIG_H261_ENCODER)
2216 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2218 case AV_CODEC_ID_H263:
2219 case AV_CODEC_ID_H263P:
2220 case AV_CODEC_ID_FLV1:
2221 case AV_CODEC_ID_RV10:
2222 case AV_CODEC_ID_RV20:
2223 if (CONFIG_H263_ENCODER)
2224 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2226 case AV_CODEC_ID_MJPEG:
2227 if (CONFIG_MJPEG_ENCODER)
2228 ff_mjpeg_encode_mb(s, s->block);
2235 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2237 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2238 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2241 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2244 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2247 d->mb_skip_run= s->mb_skip_run;
2249 d->last_dc[i] = s->last_dc[i];
2252 d->mv_bits= s->mv_bits;
2253 d->i_tex_bits= s->i_tex_bits;
2254 d->p_tex_bits= s->p_tex_bits;
2255 d->i_count= s->i_count;
2256 d->f_count= s->f_count;
2257 d->b_count= s->b_count;
2258 d->skip_count= s->skip_count;
2259 d->misc_bits= s->misc_bits;
2263 d->qscale= s->qscale;
2264 d->dquant= s->dquant;
2266 d->esc3_level_length= s->esc3_level_length;
2269 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2272 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2273 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2276 d->mb_skip_run= s->mb_skip_run;
2278 d->last_dc[i] = s->last_dc[i];
2281 d->mv_bits= s->mv_bits;
2282 d->i_tex_bits= s->i_tex_bits;
2283 d->p_tex_bits= s->p_tex_bits;
2284 d->i_count= s->i_count;
2285 d->f_count= s->f_count;
2286 d->b_count= s->b_count;
2287 d->skip_count= s->skip_count;
2288 d->misc_bits= s->misc_bits;
2290 d->mb_intra= s->mb_intra;
2291 d->mb_skipped= s->mb_skipped;
2292 d->mv_type= s->mv_type;
2293 d->mv_dir= s->mv_dir;
2295 if(s->data_partitioning){
2297 d->tex_pb= s->tex_pb;
2301 d->block_last_index[i]= s->block_last_index[i];
2302 d->interlaced_dct= s->interlaced_dct;
2303 d->qscale= s->qscale;
2305 d->esc3_level_length= s->esc3_level_length;
2308 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2309 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2310 int *dmin, int *next_block, int motion_x, int motion_y)
2313 uint8_t *dest_backup[3];
2315 copy_context_before_encode(s, backup, type);
2317 s->block= s->blocks[*next_block];
2318 s->pb= pb[*next_block];
2319 if(s->data_partitioning){
2320 s->pb2 = pb2 [*next_block];
2321 s->tex_pb= tex_pb[*next_block];
2325 memcpy(dest_backup, s->dest, sizeof(s->dest));
2326 s->dest[0] = s->rd_scratchpad;
2327 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2328 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2329 assert(s->linesize >= 32); //FIXME
2332 encode_mb(s, motion_x, motion_y);
2334 score= put_bits_count(&s->pb);
2335 if(s->data_partitioning){
2336 score+= put_bits_count(&s->pb2);
2337 score+= put_bits_count(&s->tex_pb);
2340 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2341 ff_mpv_decode_mb(s, s->block);
2343 score *= s->lambda2;
2344 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2348 memcpy(s->dest, dest_backup, sizeof(s->dest));
2355 copy_context_after_encode(best, s, type);
2359 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2360 uint32_t *sq = ff_square_tab + 256;
2365 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2366 else if(w==8 && h==8)
2367 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2371 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2380 static int sse_mb(MpegEncContext *s){
2384 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2385 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2388 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2389 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) +
2390 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) +
2391 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);
2393 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) +
2394 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) +
2395 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);
2398 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)
2399 +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)
2400 +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);
2403 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2404 MpegEncContext *s= *(void**)arg;
2408 s->me.dia_size= s->avctx->pre_dia_size;
2409 s->first_slice_line=1;
2410 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2411 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2412 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2414 s->first_slice_line=0;
2422 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2423 MpegEncContext *s= *(void**)arg;
2425 s->me.dia_size= s->avctx->dia_size;
2426 s->first_slice_line=1;
2427 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2428 s->mb_x=0; //for block init below
2429 ff_init_block_index(s);
2430 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2431 s->block_index[0]+=2;
2432 s->block_index[1]+=2;
2433 s->block_index[2]+=2;
2434 s->block_index[3]+=2;
2436 /* compute motion vector & mb_type and store in context */
2437 if(s->pict_type==AV_PICTURE_TYPE_B)
2438 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2440 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2442 s->first_slice_line=0;
2447 static int mb_var_thread(AVCodecContext *c, void *arg){
2448 MpegEncContext *s= *(void**)arg;
2451 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2452 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2455 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2457 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2459 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2460 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2462 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2463 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2464 s->me.mb_var_sum_temp += varc;
2470 static void write_slice_end(MpegEncContext *s){
2471 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2472 if(s->partitioned_frame){
2473 ff_mpeg4_merge_partitions(s);
2476 ff_mpeg4_stuffing(&s->pb);
2477 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2478 ff_mjpeg_encode_stuffing(&s->pb);
2481 avpriv_align_put_bits(&s->pb);
2482 flush_put_bits(&s->pb);
2484 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2485 s->misc_bits+= get_bits_diff(s);
2488 static void write_mb_info(MpegEncContext *s)
2490 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2491 int offset = put_bits_count(&s->pb);
2492 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2493 int gobn = s->mb_y / s->gob_index;
2495 if (CONFIG_H263_ENCODER)
2496 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2497 bytestream_put_le32(&ptr, offset);
2498 bytestream_put_byte(&ptr, s->qscale);
2499 bytestream_put_byte(&ptr, gobn);
2500 bytestream_put_le16(&ptr, mba);
2501 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2502 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2503 /* 4MV not implemented */
2504 bytestream_put_byte(&ptr, 0); /* hmv2 */
2505 bytestream_put_byte(&ptr, 0); /* vmv2 */
2508 static void update_mb_info(MpegEncContext *s, int startcode)
2512 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2513 s->mb_info_size += 12;
2514 s->prev_mb_info = s->last_mb_info;
2517 s->prev_mb_info = put_bits_count(&s->pb)/8;
2518 /* This might have incremented mb_info_size above, and we return without
2519 * actually writing any info into that slot yet. But in that case,
2520 * this will be called again at the start of the after writing the
2521 * start code, actually writing the mb info. */
2525 s->last_mb_info = put_bits_count(&s->pb)/8;
2526 if (!s->mb_info_size)
2527 s->mb_info_size += 12;
2531 static int encode_thread(AVCodecContext *c, void *arg){
2532 MpegEncContext *s= *(void**)arg;
2533 int mb_x, mb_y, pdif = 0;
2534 int chr_h= 16>>s->chroma_y_shift;
2536 MpegEncContext best_s, backup_s;
2537 uint8_t bit_buf[2][MAX_MB_BYTES];
2538 uint8_t bit_buf2[2][MAX_MB_BYTES];
2539 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2540 PutBitContext pb[2], pb2[2], tex_pb[2];
2543 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2544 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2545 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2548 s->last_bits= put_bits_count(&s->pb);
2559 /* init last dc values */
2560 /* note: quant matrix value (8) is implied here */
2561 s->last_dc[i] = 128 << s->intra_dc_precision;
2563 s->current_picture.f->error[i] = 0;
2566 memset(s->last_mv, 0, sizeof(s->last_mv));
2570 switch(s->codec_id){
2571 case AV_CODEC_ID_H263:
2572 case AV_CODEC_ID_H263P:
2573 case AV_CODEC_ID_FLV1:
2574 if (CONFIG_H263_ENCODER)
2575 s->gob_index = ff_h263_get_gob_height(s);
2577 case AV_CODEC_ID_MPEG4:
2578 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2579 ff_mpeg4_init_partitions(s);
2585 s->first_slice_line = 1;
2586 s->ptr_lastgob = s->pb.buf;
2587 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2591 ff_set_qscale(s, s->qscale);
2592 ff_init_block_index(s);
2594 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2595 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2596 int mb_type= s->mb_type[xy];
2601 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2602 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2605 if(s->data_partitioning){
2606 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2607 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2608 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2614 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2615 ff_update_block_index(s);
2617 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2618 ff_h261_reorder_mb_index(s);
2619 xy= s->mb_y*s->mb_stride + s->mb_x;
2620 mb_type= s->mb_type[xy];
2623 /* write gob / video packet header */
2625 int current_packet_size, is_gob_start;
2627 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2629 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2631 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2633 switch(s->codec_id){
2634 case AV_CODEC_ID_H263:
2635 case AV_CODEC_ID_H263P:
2636 if(!s->h263_slice_structured)
2637 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2639 case AV_CODEC_ID_MPEG2VIDEO:
2640 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2641 case AV_CODEC_ID_MPEG1VIDEO:
2642 if(s->mb_skip_run) is_gob_start=0;
2647 if(s->start_mb_y != mb_y || mb_x!=0){
2650 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2651 ff_mpeg4_init_partitions(s);
2655 assert((put_bits_count(&s->pb)&7) == 0);
2656 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2658 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2659 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2660 int d = 100 / s->error_rate;
2662 current_packet_size=0;
2663 s->pb.buf_ptr= s->ptr_lastgob;
2664 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2668 if (s->avctx->rtp_callback){
2669 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2670 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2672 update_mb_info(s, 1);
2674 switch(s->codec_id){
2675 case AV_CODEC_ID_MPEG4:
2676 if (CONFIG_MPEG4_ENCODER) {
2677 ff_mpeg4_encode_video_packet_header(s);
2678 ff_mpeg4_clean_buffers(s);
2681 case AV_CODEC_ID_MPEG1VIDEO:
2682 case AV_CODEC_ID_MPEG2VIDEO:
2683 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2684 ff_mpeg1_encode_slice_header(s);
2685 ff_mpeg1_clean_buffers(s);
2688 case AV_CODEC_ID_H263:
2689 case AV_CODEC_ID_H263P:
2690 if (CONFIG_H263_ENCODER)
2691 ff_h263_encode_gob_header(s, mb_y);
2695 if(s->flags&CODEC_FLAG_PASS1){
2696 int bits= put_bits_count(&s->pb);
2697 s->misc_bits+= bits - s->last_bits;
2701 s->ptr_lastgob += current_packet_size;
2702 s->first_slice_line=1;
2703 s->resync_mb_x=mb_x;
2704 s->resync_mb_y=mb_y;
2708 if( (s->resync_mb_x == s->mb_x)
2709 && s->resync_mb_y+1 == s->mb_y){
2710 s->first_slice_line=0;
2714 s->dquant=0; //only for QP_RD
2716 update_mb_info(s, 0);
2718 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
2720 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2722 copy_context_before_encode(&backup_s, s, -1);
2724 best_s.data_partitioning= s->data_partitioning;
2725 best_s.partitioned_frame= s->partitioned_frame;
2726 if(s->data_partitioning){
2727 backup_s.pb2= s->pb2;
2728 backup_s.tex_pb= s->tex_pb;
2731 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2732 s->mv_dir = MV_DIR_FORWARD;
2733 s->mv_type = MV_TYPE_16X16;
2735 s->mv[0][0][0] = s->p_mv_table[xy][0];
2736 s->mv[0][0][1] = s->p_mv_table[xy][1];
2737 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2738 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2740 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2741 s->mv_dir = MV_DIR_FORWARD;
2742 s->mv_type = MV_TYPE_FIELD;
2745 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2746 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2747 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2749 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2750 &dmin, &next_block, 0, 0);
2752 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2753 s->mv_dir = MV_DIR_FORWARD;
2754 s->mv_type = MV_TYPE_16X16;
2758 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2759 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2761 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2762 s->mv_dir = MV_DIR_FORWARD;
2763 s->mv_type = MV_TYPE_8X8;
2766 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2767 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2769 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2770 &dmin, &next_block, 0, 0);
2772 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2773 s->mv_dir = MV_DIR_FORWARD;
2774 s->mv_type = MV_TYPE_16X16;
2776 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2777 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2778 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2779 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2781 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2782 s->mv_dir = MV_DIR_BACKWARD;
2783 s->mv_type = MV_TYPE_16X16;
2785 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2786 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2787 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2788 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2790 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2791 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2792 s->mv_type = MV_TYPE_16X16;
2794 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2795 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2796 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2797 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2798 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2799 &dmin, &next_block, 0, 0);
2801 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2802 s->mv_dir = MV_DIR_FORWARD;
2803 s->mv_type = MV_TYPE_FIELD;
2806 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2807 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2808 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2810 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2811 &dmin, &next_block, 0, 0);
2813 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2814 s->mv_dir = MV_DIR_BACKWARD;
2815 s->mv_type = MV_TYPE_FIELD;
2818 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2819 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2820 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2822 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2823 &dmin, &next_block, 0, 0);
2825 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2826 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2827 s->mv_type = MV_TYPE_FIELD;
2829 for(dir=0; dir<2; dir++){
2831 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2832 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2833 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2836 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2837 &dmin, &next_block, 0, 0);
2839 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2841 s->mv_type = MV_TYPE_16X16;
2845 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2846 &dmin, &next_block, 0, 0);
2847 if(s->h263_pred || s->h263_aic){
2849 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2851 ff_clean_intra_table_entries(s); //old mode?
2855 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2856 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2857 const int last_qp= backup_s.qscale;
2860 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2861 static const int dquant_tab[4]={-1,1,-2,2};
2863 assert(backup_s.dquant == 0);
2866 s->mv_dir= best_s.mv_dir;
2867 s->mv_type = MV_TYPE_16X16;
2868 s->mb_intra= best_s.mb_intra;
2869 s->mv[0][0][0] = best_s.mv[0][0][0];
2870 s->mv[0][0][1] = best_s.mv[0][0][1];
2871 s->mv[1][0][0] = best_s.mv[1][0][0];
2872 s->mv[1][0][1] = best_s.mv[1][0][1];
2874 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2875 for(; qpi<4; qpi++){
2876 int dquant= dquant_tab[qpi];
2877 qp= last_qp + dquant;
2878 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2880 backup_s.dquant= dquant;
2881 if(s->mb_intra && s->dc_val[0]){
2883 dc[i]= s->dc_val[0][ s->block_index[i] ];
2884 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2888 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2889 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2890 if(best_s.qscale != qp){
2891 if(s->mb_intra && s->dc_val[0]){
2893 s->dc_val[0][ s->block_index[i] ]= dc[i];
2894 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2901 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2902 int mx= s->b_direct_mv_table[xy][0];
2903 int my= s->b_direct_mv_table[xy][1];
2905 backup_s.dquant = 0;
2906 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2908 ff_mpeg4_set_direct_mv(s, mx, my);
2909 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2910 &dmin, &next_block, mx, my);
2912 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2913 backup_s.dquant = 0;
2914 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2916 ff_mpeg4_set_direct_mv(s, 0, 0);
2917 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2918 &dmin, &next_block, 0, 0);
2920 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2923 coded |= s->block_last_index[i];
2926 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2927 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2928 mx=my=0; //FIXME find the one we actually used
2929 ff_mpeg4_set_direct_mv(s, mx, my);
2930 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2938 s->mv_dir= best_s.mv_dir;
2939 s->mv_type = best_s.mv_type;
2941 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2942 s->mv[0][0][1] = best_s.mv[0][0][1];
2943 s->mv[1][0][0] = best_s.mv[1][0][0];
2944 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2947 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2948 &dmin, &next_block, mx, my);
2953 s->current_picture.qscale_table[xy] = best_s.qscale;
2955 copy_context_after_encode(s, &best_s, -1);
2957 pb_bits_count= put_bits_count(&s->pb);
2958 flush_put_bits(&s->pb);
2959 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2962 if(s->data_partitioning){
2963 pb2_bits_count= put_bits_count(&s->pb2);
2964 flush_put_bits(&s->pb2);
2965 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2966 s->pb2= backup_s.pb2;
2968 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2969 flush_put_bits(&s->tex_pb);
2970 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2971 s->tex_pb= backup_s.tex_pb;
2973 s->last_bits= put_bits_count(&s->pb);
2975 if (CONFIG_H263_ENCODER &&
2976 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2977 ff_h263_update_motion_val(s);
2979 if(next_block==0){ //FIXME 16 vs linesize16
2980 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2981 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2982 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2985 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2986 ff_mpv_decode_mb(s, s->block);
2988 int motion_x = 0, motion_y = 0;
2989 s->mv_type=MV_TYPE_16X16;
2990 // only one MB-Type possible
2993 case CANDIDATE_MB_TYPE_INTRA:
2996 motion_x= s->mv[0][0][0] = 0;
2997 motion_y= s->mv[0][0][1] = 0;
2999 case CANDIDATE_MB_TYPE_INTER:
3000 s->mv_dir = MV_DIR_FORWARD;
3002 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3003 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3005 case CANDIDATE_MB_TYPE_INTER_I:
3006 s->mv_dir = MV_DIR_FORWARD;
3007 s->mv_type = MV_TYPE_FIELD;
3010 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3011 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3012 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3015 case CANDIDATE_MB_TYPE_INTER4V:
3016 s->mv_dir = MV_DIR_FORWARD;
3017 s->mv_type = MV_TYPE_8X8;
3020 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3021 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3024 case CANDIDATE_MB_TYPE_DIRECT:
3025 if (CONFIG_MPEG4_ENCODER) {
3026 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3028 motion_x=s->b_direct_mv_table[xy][0];
3029 motion_y=s->b_direct_mv_table[xy][1];
3030 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3033 case CANDIDATE_MB_TYPE_DIRECT0:
3034 if (CONFIG_MPEG4_ENCODER) {
3035 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3037 ff_mpeg4_set_direct_mv(s, 0, 0);
3040 case CANDIDATE_MB_TYPE_BIDIR:
3041 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3043 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3044 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3045 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3046 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3048 case CANDIDATE_MB_TYPE_BACKWARD:
3049 s->mv_dir = MV_DIR_BACKWARD;
3051 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3052 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3054 case CANDIDATE_MB_TYPE_FORWARD:
3055 s->mv_dir = MV_DIR_FORWARD;
3057 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3058 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3060 case CANDIDATE_MB_TYPE_FORWARD_I:
3061 s->mv_dir = MV_DIR_FORWARD;
3062 s->mv_type = MV_TYPE_FIELD;
3065 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3066 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3067 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3070 case CANDIDATE_MB_TYPE_BACKWARD_I:
3071 s->mv_dir = MV_DIR_BACKWARD;
3072 s->mv_type = MV_TYPE_FIELD;
3075 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3076 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3077 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3080 case CANDIDATE_MB_TYPE_BIDIR_I:
3081 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3082 s->mv_type = MV_TYPE_FIELD;
3084 for(dir=0; dir<2; dir++){
3086 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3087 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3088 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3093 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3096 encode_mb(s, motion_x, motion_y);
3098 // RAL: Update last macroblock type
3099 s->last_mv_dir = s->mv_dir;
3101 if (CONFIG_H263_ENCODER &&
3102 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3103 ff_h263_update_motion_val(s);
3105 ff_mpv_decode_mb(s, s->block);
3108 /* clean the MV table in IPS frames for direct mode in B frames */
3109 if(s->mb_intra /* && I,P,S_TYPE */){
3110 s->p_mv_table[xy][0]=0;
3111 s->p_mv_table[xy][1]=0;
3114 if(s->flags&CODEC_FLAG_PSNR){
3118 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3119 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3121 s->current_picture.f->error[0] += sse(
3122 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3123 s->dest[0], w, h, s->linesize);
3124 s->current_picture.f->error[1] += sse(
3125 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3126 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3127 s->current_picture.f->error[2] += sse(
3128 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3129 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3132 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3133 ff_h263_loop_filter(s);
3135 av_dlog(s->avctx, "MB %d %d bits\n",
3136 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3140 //not beautiful here but we must write it before flushing so it has to be here
3141 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3142 ff_msmpeg4_encode_ext_header(s);
3146 /* Send the last GOB if RTP */
3147 if (s->avctx->rtp_callback) {
3148 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3149 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3150 /* Call the RTP callback to send the last GOB */
3152 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3158 #define MERGE(field) dst->field += src->field; src->field=0
3159 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3160 MERGE(me.scene_change_score);
3161 MERGE(me.mc_mb_var_sum_temp);
3162 MERGE(me.mb_var_sum_temp);
3165 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3168 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3169 MERGE(dct_count[1]);
3178 MERGE(er.error_count);
3179 MERGE(padding_bug_score);
3180 MERGE(current_picture.f->error[0]);
3181 MERGE(current_picture.f->error[1]);
3182 MERGE(current_picture.f->error[2]);
3184 if(dst->avctx->noise_reduction){
3185 for(i=0; i<64; i++){
3186 MERGE(dct_error_sum[0][i]);
3187 MERGE(dct_error_sum[1][i]);
3191 assert(put_bits_count(&src->pb) % 8 ==0);
3192 assert(put_bits_count(&dst->pb) % 8 ==0);
3193 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3194 flush_put_bits(&dst->pb);
3197 static int estimate_qp(MpegEncContext *s, int dry_run){
3198 if (s->next_lambda){
3199 s->current_picture_ptr->f->quality =
3200 s->current_picture.f->quality = s->next_lambda;
3201 if(!dry_run) s->next_lambda= 0;
3202 } else if (!s->fixed_qscale) {
3203 s->current_picture_ptr->f->quality =
3204 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3205 if (s->current_picture.f->quality < 0)
3209 if(s->adaptive_quant){
3210 switch(s->codec_id){
3211 case AV_CODEC_ID_MPEG4:
3212 if (CONFIG_MPEG4_ENCODER)
3213 ff_clean_mpeg4_qscales(s);
3215 case AV_CODEC_ID_H263:
3216 case AV_CODEC_ID_H263P:
3217 case AV_CODEC_ID_FLV1:
3218 if (CONFIG_H263_ENCODER)
3219 ff_clean_h263_qscales(s);
3222 ff_init_qscale_tab(s);
3225 s->lambda= s->lambda_table[0];
3228 s->lambda = s->current_picture.f->quality;
3233 /* must be called before writing the header */
3234 static void set_frame_distances(MpegEncContext * s){
3235 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3236 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3238 if(s->pict_type==AV_PICTURE_TYPE_B){
3239 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3240 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3242 s->pp_time= s->time - s->last_non_b_time;
3243 s->last_non_b_time= s->time;
3244 assert(s->picture_number==0 || s->pp_time > 0);
3248 static int encode_picture(MpegEncContext *s, int picture_number)
3252 int context_count = s->slice_context_count;
3254 s->picture_number = picture_number;
3256 /* Reset the average MB variance */
3257 s->me.mb_var_sum_temp =
3258 s->me.mc_mb_var_sum_temp = 0;
3260 /* we need to initialize some time vars before we can encode b-frames */
3261 // RAL: Condition added for MPEG1VIDEO
3262 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3263 set_frame_distances(s);
3264 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3265 ff_set_mpeg4_time(s);
3267 s->me.scene_change_score=0;
3269 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3271 if(s->pict_type==AV_PICTURE_TYPE_I){
3272 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3273 else s->no_rounding=0;
3274 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3275 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3276 s->no_rounding ^= 1;
3279 if(s->flags & CODEC_FLAG_PASS2){
3280 if (estimate_qp(s,1) < 0)
3282 ff_get_2pass_fcode(s);
3283 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3284 if(s->pict_type==AV_PICTURE_TYPE_B)
3285 s->lambda= s->last_lambda_for[s->pict_type];
3287 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3291 s->mb_intra=0; //for the rate distortion & bit compare functions
3292 for(i=1; i<context_count; i++){
3293 ret = ff_update_duplicate_context(s->thread_context[i], s);
3301 /* Estimate motion for every MB */
3302 if(s->pict_type != AV_PICTURE_TYPE_I){
3303 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3304 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3305 if (s->pict_type != AV_PICTURE_TYPE_B) {
3306 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3307 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3311 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3312 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3314 for(i=0; i<s->mb_stride*s->mb_height; i++)
3315 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3317 if(!s->fixed_qscale){
3318 /* finding spatial complexity for I-frame rate control */
3319 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3322 for(i=1; i<context_count; i++){
3323 merge_context_after_me(s, s->thread_context[i]);
3325 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3326 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3329 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3330 s->pict_type= AV_PICTURE_TYPE_I;
3331 for(i=0; i<s->mb_stride*s->mb_height; i++)
3332 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3333 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3334 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3338 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3339 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3341 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3343 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3344 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3345 s->f_code= FFMAX3(s->f_code, a, b);
3348 ff_fix_long_p_mvs(s);
3349 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3350 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3354 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3355 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3360 if(s->pict_type==AV_PICTURE_TYPE_B){
3363 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3364 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3365 s->f_code = FFMAX(a, b);
3367 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3368 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3369 s->b_code = FFMAX(a, b);
3371 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3372 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3373 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3374 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3375 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3377 for(dir=0; dir<2; dir++){
3380 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3381 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3382 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3383 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3391 if (estimate_qp(s, 0) < 0)
3394 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3395 s->qscale= 3; //reduce clipping problems
3397 if (s->out_format == FMT_MJPEG) {
3398 /* for mjpeg, we do include qscale in the matrix */
3400 int j = s->idsp.idct_permutation[i];
3402 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3404 s->y_dc_scale_table=
3405 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3406 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3407 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3408 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3412 //FIXME var duplication
3413 s->current_picture_ptr->f->key_frame =
3414 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3415 s->current_picture_ptr->f->pict_type =
3416 s->current_picture.f->pict_type = s->pict_type;
3418 if (s->current_picture.f->key_frame)
3419 s->picture_in_gop_number=0;
3421 s->last_bits= put_bits_count(&s->pb);
3422 switch(s->out_format) {
3424 if (CONFIG_MJPEG_ENCODER)
3425 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3429 if (CONFIG_H261_ENCODER)
3430 ff_h261_encode_picture_header(s, picture_number);
3433 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3434 ff_wmv2_encode_picture_header(s, picture_number);
3435 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3436 ff_msmpeg4_encode_picture_header(s, picture_number);
3437 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3438 ff_mpeg4_encode_picture_header(s, picture_number);
3439 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3440 ff_rv10_encode_picture_header(s, picture_number);
3441 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3442 ff_rv20_encode_picture_header(s, picture_number);
3443 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3444 ff_flv_encode_picture_header(s, picture_number);
3445 else if (CONFIG_H263_ENCODER)
3446 ff_h263_encode_picture_header(s, picture_number);
3449 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3450 ff_mpeg1_encode_picture_header(s, picture_number);
3455 bits= put_bits_count(&s->pb);
3456 s->header_bits= bits - s->last_bits;
3458 for(i=1; i<context_count; i++){
3459 update_duplicate_context_after_me(s->thread_context[i], s);
3461 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3462 for(i=1; i<context_count; i++){
3463 merge_context_after_encode(s, s->thread_context[i]);
3469 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3470 const int intra= s->mb_intra;
3473 s->dct_count[intra]++;
3475 for(i=0; i<64; i++){
3476 int level= block[i];
3480 s->dct_error_sum[intra][i] += level;
3481 level -= s->dct_offset[intra][i];
3482 if(level<0) level=0;
3484 s->dct_error_sum[intra][i] -= level;
3485 level += s->dct_offset[intra][i];
3486 if(level>0) level=0;
3493 static int dct_quantize_trellis_c(MpegEncContext *s,
3494 int16_t *block, int n,
3495 int qscale, int *overflow){
3497 const uint8_t *scantable= s->intra_scantable.scantable;
3498 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3500 unsigned int threshold1, threshold2;
3512 int coeff_count[64];
3513 int qmul, qadd, start_i, last_non_zero, i, dc;
3514 const int esc_length= s->ac_esc_length;
3516 uint8_t * last_length;
3517 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3519 s->fdsp.fdct(block);
3521 if(s->dct_error_sum)
3522 s->denoise_dct(s, block);
3524 qadd= ((qscale-1)|1)*8;
3535 /* For AIC we skip quant/dequant of INTRADC */
3540 /* note: block[0] is assumed to be positive */
3541 block[0] = (block[0] + (q >> 1)) / q;
3544 qmat = s->q_intra_matrix[qscale];
3545 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3546 bias= 1<<(QMAT_SHIFT-1);
3547 length = s->intra_ac_vlc_length;
3548 last_length= s->intra_ac_vlc_last_length;
3552 qmat = s->q_inter_matrix[qscale];
3553 length = s->inter_ac_vlc_length;
3554 last_length= s->inter_ac_vlc_last_length;
3558 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3559 threshold2= (threshold1<<1);
3561 for(i=63; i>=start_i; i--) {
3562 const int j = scantable[i];
3563 int level = block[j] * qmat[j];
3565 if(((unsigned)(level+threshold1))>threshold2){
3571 for(i=start_i; i<=last_non_zero; i++) {
3572 const int j = scantable[i];
3573 int level = block[j] * qmat[j];
3575 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3576 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3577 if(((unsigned)(level+threshold1))>threshold2){
3579 level= (bias + level)>>QMAT_SHIFT;
3581 coeff[1][i]= level-1;
3582 // coeff[2][k]= level-2;
3584 level= (bias - level)>>QMAT_SHIFT;
3585 coeff[0][i]= -level;
3586 coeff[1][i]= -level+1;
3587 // coeff[2][k]= -level+2;
3589 coeff_count[i]= FFMIN(level, 2);
3590 assert(coeff_count[i]);
3593 coeff[0][i]= (level>>31)|1;
3598 *overflow= s->max_qcoeff < max; //overflow might have happened
3600 if(last_non_zero < start_i){
3601 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3602 return last_non_zero;
3605 score_tab[start_i]= 0;
3606 survivor[0]= start_i;
3609 for(i=start_i; i<=last_non_zero; i++){
3610 int level_index, j, zero_distortion;
3611 int dct_coeff= FFABS(block[ scantable[i] ]);
3612 int best_score=256*256*256*120;
3614 if (s->fdsp.fdct == ff_fdct_ifast)
3615 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3616 zero_distortion= dct_coeff*dct_coeff;
3618 for(level_index=0; level_index < coeff_count[i]; level_index++){
3620 int level= coeff[level_index][i];
3621 const int alevel= FFABS(level);
3626 if(s->out_format == FMT_H263){
3627 unquant_coeff= alevel*qmul + qadd;
3629 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3631 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3632 unquant_coeff = (unquant_coeff - 1) | 1;
3634 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3635 unquant_coeff = (unquant_coeff - 1) | 1;
3640 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3642 if((level&(~127)) == 0){
3643 for(j=survivor_count-1; j>=0; j--){
3644 int run= i - survivor[j];
3645 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3646 score += score_tab[i-run];
3648 if(score < best_score){
3651 level_tab[i+1]= level-64;
3655 if(s->out_format == FMT_H263){
3656 for(j=survivor_count-1; j>=0; j--){
3657 int run= i - survivor[j];
3658 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3659 score += score_tab[i-run];
3660 if(score < last_score){
3663 last_level= level-64;
3669 distortion += esc_length*lambda;
3670 for(j=survivor_count-1; j>=0; j--){
3671 int run= i - survivor[j];
3672 int score= distortion + score_tab[i-run];
3674 if(score < best_score){
3677 level_tab[i+1]= level-64;
3681 if(s->out_format == FMT_H263){
3682 for(j=survivor_count-1; j>=0; j--){
3683 int run= i - survivor[j];
3684 int score= distortion + score_tab[i-run];
3685 if(score < last_score){
3688 last_level= level-64;
3696 score_tab[i+1]= best_score;
3698 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3699 if(last_non_zero <= 27){
3700 for(; survivor_count; survivor_count--){
3701 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3705 for(; survivor_count; survivor_count--){
3706 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3711 survivor[ survivor_count++ ]= i+1;
3714 if(s->out_format != FMT_H263){
3715 last_score= 256*256*256*120;
3716 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3717 int score= score_tab[i];
3718 if(i) score += lambda*2; //FIXME exacter?
3720 if(score < last_score){
3723 last_level= level_tab[i];
3724 last_run= run_tab[i];
3729 s->coded_score[n] = last_score;
3731 dc= FFABS(block[0]);
3732 last_non_zero= last_i - 1;
3733 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3735 if(last_non_zero < start_i)
3736 return last_non_zero;
3738 if(last_non_zero == 0 && start_i == 0){
3740 int best_score= dc * dc;
3742 for(i=0; i<coeff_count[0]; i++){
3743 int level= coeff[i][0];
3744 int alevel= FFABS(level);
3745 int unquant_coeff, score, distortion;
3747 if(s->out_format == FMT_H263){
3748 unquant_coeff= (alevel*qmul + qadd)>>3;
3750 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3751 unquant_coeff = (unquant_coeff - 1) | 1;
3753 unquant_coeff = (unquant_coeff + 4) >> 3;
3754 unquant_coeff<<= 3 + 3;
3756 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3758 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3759 else score= distortion + esc_length*lambda;
3761 if(score < best_score){
3763 best_level= level - 64;
3766 block[0]= best_level;
3767 s->coded_score[n] = best_score - dc*dc;
3768 if(best_level == 0) return -1;
3769 else return last_non_zero;
3775 block[ perm_scantable[last_non_zero] ]= last_level;
3778 for(; i>start_i; i -= run_tab[i] + 1){
3779 block[ perm_scantable[i-1] ]= level_tab[i];
3782 return last_non_zero;
3785 //#define REFINE_STATS 1
3786 static int16_t basis[64][64];
3788 static void build_basis(uint8_t *perm){
3795 double s= 0.25*(1<<BASIS_SHIFT);
3797 int perm_index= perm[index];
3798 if(i==0) s*= sqrt(0.5);
3799 if(j==0) s*= sqrt(0.5);
3800 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)));
3807 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3808 int16_t *block, int16_t *weight, int16_t *orig,
3811 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3812 const uint8_t *scantable= s->intra_scantable.scantable;
3813 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3814 // unsigned int threshold1, threshold2;
3819 int qmul, qadd, start_i, last_non_zero, i, dc;
3821 uint8_t * last_length;
3823 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3826 static int after_last=0;
3827 static int to_zero=0;
3828 static int from_zero=0;
3831 static int messed_sign=0;
3834 if(basis[0][0] == 0)
3835 build_basis(s->idsp.idct_permutation);
3846 /* For AIC we skip quant/dequant of INTRADC */
3850 q <<= RECON_SHIFT-3;
3851 /* note: block[0] is assumed to be positive */
3853 // block[0] = (block[0] + (q >> 1)) / q;
3855 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3856 // bias= 1<<(QMAT_SHIFT-1);
3857 length = s->intra_ac_vlc_length;
3858 last_length= s->intra_ac_vlc_last_length;
3862 length = s->inter_ac_vlc_length;
3863 last_length= s->inter_ac_vlc_last_length;
3865 last_non_zero = s->block_last_index[n];
3870 dc += (1<<(RECON_SHIFT-1));
3871 for(i=0; i<64; i++){
3872 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3875 STOP_TIMER("memset rem[]")}
3878 for(i=0; i<64; i++){
3883 w= FFABS(weight[i]) + qns*one;
3884 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3887 // w=weight[i] = (63*qns + (w/2)) / w;
3893 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3899 for(i=start_i; i<=last_non_zero; i++){
3900 int j= perm_scantable[i];
3901 const int level= block[j];
3905 if(level<0) coeff= qmul*level - qadd;
3906 else coeff= qmul*level + qadd;
3907 run_tab[rle_index++]=run;
3910 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3916 if(last_non_zero>0){
3917 STOP_TIMER("init rem[]")
3924 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3927 int run2, best_unquant_change=0, analyze_gradient;
3931 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3933 if(analyze_gradient){
3937 for(i=0; i<64; i++){
3940 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3943 STOP_TIMER("rem*w*w")}
3953 const int level= block[0];
3954 int change, old_coeff;
3956 assert(s->mb_intra);
3960 for(change=-1; change<=1; change+=2){
3961 int new_level= level + change;
3962 int score, new_coeff;
3964 new_coeff= q*new_level;
3965 if(new_coeff >= 2048 || new_coeff < 0)
3968 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3969 new_coeff - old_coeff);
3970 if(score<best_score){
3973 best_change= change;
3974 best_unquant_change= new_coeff - old_coeff;
3981 run2= run_tab[rle_index++];
3985 for(i=start_i; i<64; i++){
3986 int j= perm_scantable[i];
3987 const int level= block[j];
3988 int change, old_coeff;
3990 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3994 if(level<0) old_coeff= qmul*level - qadd;
3995 else old_coeff= qmul*level + qadd;
3996 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4000 assert(run2>=0 || i >= last_non_zero );
4003 for(change=-1; change<=1; change+=2){
4004 int new_level= level + change;
4005 int score, new_coeff, unquant_change;
4008 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4012 if(new_level<0) new_coeff= qmul*new_level - qadd;
4013 else new_coeff= qmul*new_level + qadd;
4014 if(new_coeff >= 2048 || new_coeff <= -2048)
4016 //FIXME check for overflow
4019 if(level < 63 && level > -63){
4020 if(i < last_non_zero)
4021 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4022 - length[UNI_AC_ENC_INDEX(run, level+64)];
4024 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4025 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4028 assert(FFABS(new_level)==1);
4030 if(analyze_gradient){
4031 int g= d1[ scantable[i] ];
4032 if(g && (g^new_level) >= 0)
4036 if(i < last_non_zero){
4037 int next_i= i + run2 + 1;
4038 int next_level= block[ perm_scantable[next_i] ] + 64;
4040 if(next_level&(~127))
4043 if(next_i < last_non_zero)
4044 score += length[UNI_AC_ENC_INDEX(run, 65)]
4045 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4046 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4048 score += length[UNI_AC_ENC_INDEX(run, 65)]
4049 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4050 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4052 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4054 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4055 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4061 assert(FFABS(level)==1);
4063 if(i < last_non_zero){
4064 int next_i= i + run2 + 1;
4065 int next_level= block[ perm_scantable[next_i] ] + 64;
4067 if(next_level&(~127))
4070 if(next_i < last_non_zero)
4071 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4072 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4073 - length[UNI_AC_ENC_INDEX(run, 65)];
4075 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4076 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4077 - length[UNI_AC_ENC_INDEX(run, 65)];
4079 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4081 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4082 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4089 unquant_change= new_coeff - old_coeff;
4090 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4092 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4094 if(score<best_score){
4097 best_change= change;
4098 best_unquant_change= unquant_change;
4102 prev_level= level + 64;
4103 if(prev_level&(~127))
4112 STOP_TIMER("iterative step")}
4116 int j= perm_scantable[ best_coeff ];
4118 block[j] += best_change;
4120 if(best_coeff > last_non_zero){
4121 last_non_zero= best_coeff;
4129 if(block[j] - best_change){
4130 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4142 for(; last_non_zero>=start_i; last_non_zero--){
4143 if(block[perm_scantable[last_non_zero]])
4149 if(256*256*256*64 % count == 0){
4150 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);
4155 for(i=start_i; i<=last_non_zero; i++){
4156 int j= perm_scantable[i];
4157 const int level= block[j];
4160 run_tab[rle_index++]=run;
4167 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4173 if(last_non_zero>0){
4174 STOP_TIMER("iterative search")
4179 return last_non_zero;
4182 int ff_dct_quantize_c(MpegEncContext *s,
4183 int16_t *block, int n,
4184 int qscale, int *overflow)
4186 int i, j, level, last_non_zero, q, start_i;
4188 const uint8_t *scantable= s->intra_scantable.scantable;
4191 unsigned int threshold1, threshold2;
4193 s->fdsp.fdct(block);
4195 if(s->dct_error_sum)
4196 s->denoise_dct(s, block);
4206 /* For AIC we skip quant/dequant of INTRADC */
4209 /* note: block[0] is assumed to be positive */
4210 block[0] = (block[0] + (q >> 1)) / q;
4213 qmat = s->q_intra_matrix[qscale];
4214 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4218 qmat = s->q_inter_matrix[qscale];
4219 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4221 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4222 threshold2= (threshold1<<1);
4223 for(i=63;i>=start_i;i--) {
4225 level = block[j] * qmat[j];
4227 if(((unsigned)(level+threshold1))>threshold2){
4234 for(i=start_i; i<=last_non_zero; i++) {
4236 level = block[j] * qmat[j];
4238 // if( bias+level >= (1<<QMAT_SHIFT)
4239 // || bias-level >= (1<<QMAT_SHIFT)){
4240 if(((unsigned)(level+threshold1))>threshold2){
4242 level= (bias + level)>>QMAT_SHIFT;
4245 level= (bias - level)>>QMAT_SHIFT;
4253 *overflow= s->max_qcoeff < max; //overflow might have happened
4255 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4256 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4257 ff_block_permute(block, s->idsp.idct_permutation,
4258 scantable, last_non_zero);
4260 return last_non_zero;
4263 #define OFFSET(x) offsetof(MpegEncContext, x)
4264 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4265 static const AVOption h263_options[] = {
4266 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4267 { "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},
4268 { "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 },
4273 static const AVClass h263_class = {
4274 .class_name = "H.263 encoder",
4275 .item_name = av_default_item_name,
4276 .option = h263_options,
4277 .version = LIBAVUTIL_VERSION_INT,
4280 AVCodec ff_h263_encoder = {
4282 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4283 .type = AVMEDIA_TYPE_VIDEO,
4284 .id = AV_CODEC_ID_H263,
4285 .priv_data_size = sizeof(MpegEncContext),
4286 .init = ff_mpv_encode_init,
4287 .encode2 = ff_mpv_encode_picture,
4288 .close = ff_mpv_encode_end,
4289 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4290 .priv_class = &h263_class,
4293 static const AVOption h263p_options[] = {
4294 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4295 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4296 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4297 { "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},
4301 static const AVClass h263p_class = {
4302 .class_name = "H.263p encoder",
4303 .item_name = av_default_item_name,
4304 .option = h263p_options,
4305 .version = LIBAVUTIL_VERSION_INT,
4308 AVCodec ff_h263p_encoder = {
4310 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4311 .type = AVMEDIA_TYPE_VIDEO,
4312 .id = AV_CODEC_ID_H263P,
4313 .priv_data_size = sizeof(MpegEncContext),
4314 .init = ff_mpv_encode_init,
4315 .encode2 = ff_mpv_encode_picture,
4316 .close = ff_mpv_encode_end,
4317 .capabilities = CODEC_CAP_SLICE_THREADS,
4318 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4319 .priv_class = &h263p_class,
4322 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4324 AVCodec ff_msmpeg4v2_encoder = {
4325 .name = "msmpeg4v2",
4326 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4327 .type = AVMEDIA_TYPE_VIDEO,
4328 .id = AV_CODEC_ID_MSMPEG4V2,
4329 .priv_data_size = sizeof(MpegEncContext),
4330 .init = ff_mpv_encode_init,
4331 .encode2 = ff_mpv_encode_picture,
4332 .close = ff_mpv_encode_end,
4333 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4334 .priv_class = &msmpeg4v2_class,
4337 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4339 AVCodec ff_msmpeg4v3_encoder = {
4341 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4342 .type = AVMEDIA_TYPE_VIDEO,
4343 .id = AV_CODEC_ID_MSMPEG4V3,
4344 .priv_data_size = sizeof(MpegEncContext),
4345 .init = ff_mpv_encode_init,
4346 .encode2 = ff_mpv_encode_picture,
4347 .close = ff_mpv_encode_end,
4348 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4349 .priv_class = &msmpeg4v3_class,
4352 FF_MPV_GENERIC_CLASS(wmv1)
4354 AVCodec ff_wmv1_encoder = {
4356 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4357 .type = AVMEDIA_TYPE_VIDEO,
4358 .id = AV_CODEC_ID_WMV1,
4359 .priv_data_size = sizeof(MpegEncContext),
4360 .init = ff_mpv_encode_init,
4361 .encode2 = ff_mpv_encode_picture,
4362 .close = ff_mpv_encode_end,
4363 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4364 .priv_class = &wmv1_class,