2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of Libav.
10 * Libav is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * Libav is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "libavutil/internal.h"
33 #include "libavutil/intmath.h"
34 #include "libavutil/mathematics.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/timer.h"
42 #include "mpegvideo.h"
43 #include "mpegvideodata.h"
47 #include "mjpegenc_common.h"
49 #include "mpegutils.h"
52 #include "pixblockdsp.h"
56 #include "aandcttab.h"
58 #include "mpeg4video.h"
60 #include "bytestream.h"
65 #define QUANT_BIAS_SHIFT 8
67 #define QMAT_SHIFT_MMX 16
70 static int encode_picture(MpegEncContext *s, int picture_number);
71 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
72 static int sse_mb(MpegEncContext *s);
73 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
74 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
76 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
77 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
79 const AVOption ff_mpv_generic_options[] = {
84 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
85 uint16_t (*qmat16)[2][64],
86 const uint16_t *quant_matrix,
87 int bias, int qmin, int qmax, int intra)
89 FDCTDSPContext *fdsp = &s->fdsp;
93 for (qscale = qmin; qscale <= qmax; qscale++) {
95 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
97 fdsp->fdct == ff_faandct ||
98 #endif /* CONFIG_FAANDCT */
99 fdsp->fdct == ff_jpeg_fdct_islow_10) {
100 for (i = 0; i < 64; i++) {
101 const int j = s->idsp.idct_permutation[i];
102 int64_t den = (int64_t) qscale * quant_matrix[j];
103 /* 16 <= qscale * quant_matrix[i] <= 7905
104 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
105 * 19952 <= x <= 249205026
106 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
107 * 3444240 >= (1 << 36) / (x) >= 275 */
109 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
111 } else if (fdsp->fdct == ff_fdct_ifast) {
112 for (i = 0; i < 64; i++) {
113 const int j = s->idsp.idct_permutation[i];
114 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
115 /* 16 <= qscale * quant_matrix[i] <= 7905
116 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
117 * 19952 <= x <= 249205026
118 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
119 * 3444240 >= (1 << 36) / (x) >= 275 */
121 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
124 for (i = 0; i < 64; i++) {
125 const int j = s->idsp.idct_permutation[i];
126 int64_t den = (int64_t) qscale * quant_matrix[j];
127 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
128 * Assume x = qscale * quant_matrix[i]
130 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
131 * so 32768 >= (1 << 19) / (x) >= 67 */
132 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
133 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
134 // (qscale * quant_matrix[i]);
135 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
137 if (qmat16[qscale][0][i] == 0 ||
138 qmat16[qscale][0][i] == 128 * 256)
139 qmat16[qscale][0][i] = 128 * 256 - 1;
140 qmat16[qscale][1][i] =
141 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
142 qmat16[qscale][0][i]);
146 for (i = intra; i < 64; i++) {
148 if (fdsp->fdct == ff_fdct_ifast) {
149 max = (8191LL * ff_aanscales[i]) >> 14;
151 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
157 av_log(NULL, AV_LOG_INFO,
158 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
163 static inline void update_qscale(MpegEncContext *s)
165 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
166 (FF_LAMBDA_SHIFT + 7);
167 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
169 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
173 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
179 for (i = 0; i < 64; i++) {
180 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
187 * init s->current_picture.qscale_table from s->lambda_table
189 void ff_init_qscale_tab(MpegEncContext *s)
191 int8_t * const qscale_table = s->current_picture.qscale_table;
194 for (i = 0; i < s->mb_num; i++) {
195 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
196 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
197 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
202 static void update_duplicate_context_after_me(MpegEncContext *dst,
205 #define COPY(a) dst->a= src->a
207 COPY(current_picture);
213 COPY(picture_in_gop_number);
214 COPY(gop_picture_number);
215 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
216 COPY(progressive_frame); // FIXME don't set in encode_header
217 COPY(partitioned_frame); // FIXME don't set in encode_header
222 * Set the given MpegEncContext to defaults for encoding.
223 * the changed fields will not depend upon the prior state of the MpegEncContext.
225 static void mpv_encode_defaults(MpegEncContext *s)
228 ff_mpv_common_defaults(s);
230 for (i = -16; i < 16; i++) {
231 default_fcode_tab[i + MAX_MV] = 1;
233 s->me.mv_penalty = default_mv_penalty;
234 s->fcode_tab = default_fcode_tab;
236 s->input_picture_number = 0;
237 s->picture_in_gop_number = 0;
240 /* init video encoder */
241 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
243 MpegEncContext *s = avctx->priv_data;
244 int i, ret, format_supported;
246 mpv_encode_defaults(s);
248 switch (avctx->codec_id) {
249 case AV_CODEC_ID_MPEG2VIDEO:
250 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
251 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
252 av_log(avctx, AV_LOG_ERROR,
253 "only YUV420 and YUV422 are supported\n");
257 case AV_CODEC_ID_MJPEG:
258 format_supported = 0;
259 /* JPEG color space */
260 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
261 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
262 (avctx->color_range == AVCOL_RANGE_JPEG &&
263 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
264 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
265 format_supported = 1;
266 /* MPEG color space */
267 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
268 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
269 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
270 format_supported = 1;
272 if (!format_supported) {
273 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
278 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
279 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
284 switch (avctx->pix_fmt) {
285 case AV_PIX_FMT_YUVJ422P:
286 case AV_PIX_FMT_YUV422P:
287 s->chroma_format = CHROMA_422;
289 case AV_PIX_FMT_YUVJ420P:
290 case AV_PIX_FMT_YUV420P:
292 s->chroma_format = CHROMA_420;
296 s->bit_rate = avctx->bit_rate;
297 s->width = avctx->width;
298 s->height = avctx->height;
299 if (avctx->gop_size > 600 &&
300 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
301 av_log(avctx, AV_LOG_ERROR,
302 "Warning keyframe interval too large! reducing it ...\n");
303 avctx->gop_size = 600;
305 s->gop_size = avctx->gop_size;
307 if (avctx->max_b_frames > MAX_B_FRAMES) {
308 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
309 "is %d.\n", MAX_B_FRAMES);
311 s->max_b_frames = avctx->max_b_frames;
312 s->codec_id = avctx->codec->id;
313 s->strict_std_compliance = avctx->strict_std_compliance;
314 s->quarter_sample = (avctx->flags & 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);
333 FF_DISABLE_DEPRECATION_WARNINGS
334 if (avctx->border_masking != 0.0)
335 s->border_masking = avctx->border_masking;
336 FF_ENABLE_DEPRECATION_WARNINGS
339 s->adaptive_quant = (s->avctx->lumi_masking ||
340 s->avctx->dark_masking ||
341 s->avctx->temporal_cplx_masking ||
342 s->avctx->spatial_cplx_masking ||
343 s->avctx->p_masking ||
345 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
348 s->loop_filter = !!(s->avctx->flags & CODEC_FLAG_LOOP_FILTER);
350 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
351 av_log(avctx, AV_LOG_ERROR,
352 "a vbv buffer size is needed, "
353 "for encoding with a maximum bitrate\n");
357 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
358 av_log(avctx, AV_LOG_INFO,
359 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
362 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
363 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
367 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
368 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
372 if (avctx->rc_max_rate &&
373 avctx->rc_max_rate == avctx->bit_rate &&
374 avctx->rc_max_rate != avctx->rc_min_rate) {
375 av_log(avctx, AV_LOG_INFO,
376 "impossible bitrate constraints, this will fail\n");
379 if (avctx->rc_buffer_size &&
380 avctx->bit_rate * (int64_t)avctx->time_base.num >
381 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
382 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
386 if (!s->fixed_qscale &&
387 avctx->bit_rate * av_q2d(avctx->time_base) >
388 avctx->bit_rate_tolerance) {
389 av_log(avctx, AV_LOG_ERROR,
390 "bitrate tolerance too small for bitrate\n");
394 if (s->avctx->rc_max_rate &&
395 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
396 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
397 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
398 90000LL * (avctx->rc_buffer_size - 1) >
399 s->avctx->rc_max_rate * 0xFFFFLL) {
400 av_log(avctx, AV_LOG_INFO,
401 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
402 "specified vbv buffer is too large for the given bitrate!\n");
405 if ((s->avctx->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
406 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
407 s->codec_id != AV_CODEC_ID_FLV1) {
408 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
412 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
413 av_log(avctx, AV_LOG_ERROR,
414 "OBMC is only supported with simple mb decision\n");
418 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
419 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
423 if (s->max_b_frames &&
424 s->codec_id != AV_CODEC_ID_MPEG4 &&
425 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
426 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
427 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
431 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
432 s->codec_id == AV_CODEC_ID_H263 ||
433 s->codec_id == AV_CODEC_ID_H263P) &&
434 (avctx->sample_aspect_ratio.num > 255 ||
435 avctx->sample_aspect_ratio.den > 255)) {
436 av_log(avctx, AV_LOG_ERROR,
437 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
438 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
442 if ((s->avctx->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
443 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
444 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
448 // FIXME mpeg2 uses that too
449 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
450 av_log(avctx, AV_LOG_ERROR,
451 "mpeg2 style quantization not supported by codec\n");
455 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
456 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
460 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
461 s->avctx->mb_decision != FF_MB_DECISION_RD) {
462 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
466 if (s->avctx->scenechange_threshold < 1000000000 &&
467 (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)) {
468 av_log(avctx, AV_LOG_ERROR,
469 "closed gop with scene change detection are not supported yet, "
470 "set threshold to 1000000000\n");
474 if (s->avctx->flags & CODEC_FLAG_LOW_DELAY) {
475 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
476 av_log(avctx, AV_LOG_ERROR,
477 "low delay forcing is only available for mpeg2\n");
480 if (s->max_b_frames != 0) {
481 av_log(avctx, AV_LOG_ERROR,
482 "b frames cannot be used with low delay\n");
487 if (s->q_scale_type == 1) {
488 if (avctx->qmax > 12) {
489 av_log(avctx, AV_LOG_ERROR,
490 "non linear quant only supports qmax <= 12 currently\n");
495 if (s->avctx->thread_count > 1 &&
496 s->codec_id != AV_CODEC_ID_MPEG4 &&
497 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
498 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
499 (s->codec_id != AV_CODEC_ID_H263P)) {
500 av_log(avctx, AV_LOG_ERROR,
501 "multi threaded encoding not supported by codec\n");
505 if (s->avctx->thread_count < 1) {
506 av_log(avctx, AV_LOG_ERROR,
507 "automatic thread number detection not supported by codec,"
512 if (s->avctx->thread_count > 1)
515 if (!avctx->time_base.den || !avctx->time_base.num) {
516 av_log(avctx, AV_LOG_ERROR, "framerate not set\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 FF_API_QUANT_BIAS
546 FF_DISABLE_DEPRECATION_WARNINGS
547 if (s->intra_quant_bias == FF_DEFAULT_QUANT_BIAS &&
548 avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
549 s->intra_quant_bias = avctx->intra_quant_bias;
550 if (s->inter_quant_bias == FF_DEFAULT_QUANT_BIAS &&
551 avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
552 s->inter_quant_bias = avctx->inter_quant_bias;
553 FF_ENABLE_DEPRECATION_WARNINGS
556 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
557 s->avctx->time_base.den > (1 << 16) - 1) {
558 av_log(avctx, AV_LOG_ERROR,
559 "timebase %d/%d not supported by MPEG 4 standard, "
560 "the maximum admitted value for the timebase denominator "
561 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
565 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
567 switch (avctx->codec->id) {
568 case AV_CODEC_ID_MPEG1VIDEO:
569 s->out_format = FMT_MPEG1;
570 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
571 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
573 case AV_CODEC_ID_MPEG2VIDEO:
574 s->out_format = FMT_MPEG1;
575 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
576 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
579 case AV_CODEC_ID_MJPEG:
580 s->out_format = FMT_MJPEG;
581 s->intra_only = 1; /* force intra only for jpeg */
582 if (!CONFIG_MJPEG_ENCODER ||
583 ff_mjpeg_encode_init(s) < 0)
588 case AV_CODEC_ID_H261:
589 if (!CONFIG_H261_ENCODER)
591 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
592 av_log(avctx, AV_LOG_ERROR,
593 "The specified picture size of %dx%d is not valid for the "
594 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
595 s->width, s->height);
598 s->out_format = FMT_H261;
601 s->rtp_mode = 0; /* Sliced encoding not supported */
603 case AV_CODEC_ID_H263:
604 if (!CONFIG_H263_ENCODER)
606 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
607 s->width, s->height) == 8) {
608 av_log(avctx, AV_LOG_INFO,
609 "The specified picture size of %dx%d is not valid for "
610 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
611 "352x288, 704x576, and 1408x1152."
612 "Try H.263+.\n", s->width, s->height);
615 s->out_format = FMT_H263;
619 case AV_CODEC_ID_H263P:
620 s->out_format = FMT_H263;
623 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
624 s->modified_quant = s->h263_aic;
625 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
626 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
629 /* These are just to be sure */
633 case AV_CODEC_ID_FLV1:
634 s->out_format = FMT_H263;
635 s->h263_flv = 2; /* format = 1; 11-bit codes */
636 s->unrestricted_mv = 1;
637 s->rtp_mode = 0; /* don't allow GOB */
641 case AV_CODEC_ID_RV10:
642 s->out_format = FMT_H263;
646 case AV_CODEC_ID_RV20:
647 s->out_format = FMT_H263;
650 s->modified_quant = 1;
654 s->unrestricted_mv = 0;
656 case AV_CODEC_ID_MPEG4:
657 s->out_format = FMT_H263;
659 s->unrestricted_mv = 1;
660 s->low_delay = s->max_b_frames ? 0 : 1;
661 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
663 case AV_CODEC_ID_MSMPEG4V2:
664 s->out_format = FMT_H263;
666 s->unrestricted_mv = 1;
667 s->msmpeg4_version = 2;
671 case AV_CODEC_ID_MSMPEG4V3:
672 s->out_format = FMT_H263;
674 s->unrestricted_mv = 1;
675 s->msmpeg4_version = 3;
676 s->flipflop_rounding = 1;
680 case AV_CODEC_ID_WMV1:
681 s->out_format = FMT_H263;
683 s->unrestricted_mv = 1;
684 s->msmpeg4_version = 4;
685 s->flipflop_rounding = 1;
689 case AV_CODEC_ID_WMV2:
690 s->out_format = FMT_H263;
692 s->unrestricted_mv = 1;
693 s->msmpeg4_version = 5;
694 s->flipflop_rounding = 1;
702 avctx->has_b_frames = !s->low_delay;
706 s->progressive_frame =
707 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
708 CODEC_FLAG_INTERLACED_ME) ||
713 if (ff_mpv_common_init(s) < 0)
717 ff_mpv_encode_init_x86(s);
719 ff_fdctdsp_init(&s->fdsp, avctx);
720 ff_me_cmp_init(&s->mecc, avctx);
721 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
722 ff_pixblockdsp_init(&s->pdsp, avctx);
723 ff_qpeldsp_init(&s->qdsp);
725 if (s->msmpeg4_version) {
726 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
727 2 * 2 * (MAX_LEVEL + 1) *
728 (MAX_RUN + 1) * 2 * sizeof(int), fail);
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
732 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
733 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
735 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
737 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
738 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
739 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
741 if (s->avctx->noise_reduction) {
742 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
743 2 * 64 * sizeof(uint16_t), fail);
746 if (CONFIG_H263_ENCODER)
747 ff_h263dsp_init(&s->h263dsp);
748 if (!s->dct_quantize)
749 s->dct_quantize = ff_dct_quantize_c;
751 s->denoise_dct = denoise_dct_c;
752 s->fast_dct_quantize = s->dct_quantize;
754 s->dct_quantize = dct_quantize_trellis_c;
756 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
757 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
759 s->quant_precision = 5;
761 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
762 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
764 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
765 ff_h261_encode_init(s);
766 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
767 ff_h263_encode_init(s);
768 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
769 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
771 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
772 && s->out_format == FMT_MPEG1)
773 ff_mpeg1_encode_init(s);
776 for (i = 0; i < 64; i++) {
777 int j = s->idsp.idct_permutation[i];
778 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
780 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
781 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
782 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
784 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
787 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
788 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
790 if (s->avctx->intra_matrix)
791 s->intra_matrix[j] = s->avctx->intra_matrix[i];
792 if (s->avctx->inter_matrix)
793 s->inter_matrix[j] = s->avctx->inter_matrix[i];
796 /* precompute matrix */
797 /* for mjpeg, we do include qscale in the matrix */
798 if (s->out_format != FMT_MJPEG) {
799 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
800 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
802 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
803 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
807 if (ff_rate_control_init(s) < 0)
810 #if FF_API_ERROR_RATE
811 FF_DISABLE_DEPRECATION_WARNINGS
812 if (avctx->error_rate)
813 s->error_rate = avctx->error_rate;
814 FF_ENABLE_DEPRECATION_WARNINGS;
817 #if FF_API_NORMALIZE_AQP
818 FF_DISABLE_DEPRECATION_WARNINGS
819 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
820 s->mpv_flags |= FF_MPV_FLAG_NAQ;
821 FF_ENABLE_DEPRECATION_WARNINGS;
825 FF_DISABLE_DEPRECATION_WARNINGS
826 if (avctx->flags & CODEC_FLAG_MV0)
827 s->mpv_flags |= FF_MPV_FLAG_MV0;
828 FF_ENABLE_DEPRECATION_WARNINGS
832 FF_DISABLE_DEPRECATION_WARNINGS
833 if (avctx->rc_qsquish != 0.0)
834 s->rc_qsquish = avctx->rc_qsquish;
835 if (avctx->rc_qmod_amp != 0.0)
836 s->rc_qmod_amp = avctx->rc_qmod_amp;
837 if (avctx->rc_qmod_freq)
838 s->rc_qmod_freq = avctx->rc_qmod_freq;
839 if (avctx->rc_buffer_aggressivity != 1.0)
840 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
841 if (avctx->rc_initial_cplx != 0.0)
842 s->rc_initial_cplx = avctx->rc_initial_cplx;
844 s->lmin = avctx->lmin;
846 s->lmax = avctx->lmax;
850 s->rc_eq = av_strdup(avctx->rc_eq);
852 return AVERROR(ENOMEM);
854 FF_ENABLE_DEPRECATION_WARNINGS
857 if (avctx->b_frame_strategy == 2) {
858 for (i = 0; i < s->max_b_frames + 2; i++) {
859 s->tmp_frames[i] = av_frame_alloc();
860 if (!s->tmp_frames[i])
861 return AVERROR(ENOMEM);
863 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
864 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
865 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
867 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
875 ff_mpv_encode_end(avctx);
876 return AVERROR_UNKNOWN;
879 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
881 MpegEncContext *s = avctx->priv_data;
884 ff_rate_control_uninit(s);
886 ff_mpv_common_end(s);
887 if (CONFIG_MJPEG_ENCODER &&
888 s->out_format == FMT_MJPEG)
889 ff_mjpeg_encode_close(s);
891 av_freep(&avctx->extradata);
893 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
894 av_frame_free(&s->tmp_frames[i]);
896 ff_free_picture_tables(&s->new_picture);
897 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
899 av_freep(&s->avctx->stats_out);
900 av_freep(&s->ac_stats);
902 av_freep(&s->q_intra_matrix);
903 av_freep(&s->q_inter_matrix);
904 av_freep(&s->q_intra_matrix16);
905 av_freep(&s->q_inter_matrix16);
906 av_freep(&s->input_picture);
907 av_freep(&s->reordered_input_picture);
908 av_freep(&s->dct_offset);
913 static int get_sae(uint8_t *src, int ref, int stride)
918 for (y = 0; y < 16; y++) {
919 for (x = 0; x < 16; x++) {
920 acc += FFABS(src[x + y * stride] - ref);
927 static int get_intra_count(MpegEncContext *s, uint8_t *src,
928 uint8_t *ref, int stride)
936 for (y = 0; y < h; y += 16) {
937 for (x = 0; x < w; x += 16) {
938 int offset = x + y * stride;
939 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
941 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
942 int sae = get_sae(src + offset, mean, stride);
944 acc += sae + 500 < sad;
950 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
952 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
953 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
954 s->mb_stride, s->mb_height, s->b8_stride,
955 &s->linesize, &s->uvlinesize);
958 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
962 int i, display_picture_number = 0, ret;
963 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
964 (s->low_delay ? 0 : 1);
969 display_picture_number = s->input_picture_number++;
971 if (pts != AV_NOPTS_VALUE) {
972 if (s->user_specified_pts != AV_NOPTS_VALUE) {
974 int64_t last = s->user_specified_pts;
977 av_log(s->avctx, AV_LOG_ERROR,
978 "Error, Invalid timestamp=%"PRId64", "
979 "last=%"PRId64"\n", pts, s->user_specified_pts);
983 if (!s->low_delay && display_picture_number == 1)
984 s->dts_delta = time - last;
986 s->user_specified_pts = pts;
988 if (s->user_specified_pts != AV_NOPTS_VALUE) {
989 s->user_specified_pts =
990 pts = s->user_specified_pts + 1;
991 av_log(s->avctx, AV_LOG_INFO,
992 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
995 pts = display_picture_number;
1001 if (!pic_arg->buf[0] ||
1002 pic_arg->linesize[0] != s->linesize ||
1003 pic_arg->linesize[1] != s->uvlinesize ||
1004 pic_arg->linesize[2] != s->uvlinesize)
1006 if ((s->width & 15) || (s->height & 15))
1009 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1010 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1012 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1016 pic = &s->picture[i];
1020 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1023 ret = alloc_picture(s, pic, direct);
1028 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1029 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1030 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1033 int h_chroma_shift, v_chroma_shift;
1034 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1038 for (i = 0; i < 3; i++) {
1039 int src_stride = pic_arg->linesize[i];
1040 int dst_stride = i ? s->uvlinesize : s->linesize;
1041 int h_shift = i ? h_chroma_shift : 0;
1042 int v_shift = i ? v_chroma_shift : 0;
1043 int w = s->width >> h_shift;
1044 int h = s->height >> v_shift;
1045 uint8_t *src = pic_arg->data[i];
1046 uint8_t *dst = pic->f->data[i];
1048 if (!s->avctx->rc_buffer_size)
1049 dst += INPLACE_OFFSET;
1051 if (src_stride == dst_stride)
1052 memcpy(dst, src, src_stride * h);
1055 uint8_t *dst2 = dst;
1057 memcpy(dst2, src, w);
1062 if ((s->width & 15) || (s->height & 15)) {
1063 s->mpvencdsp.draw_edges(dst, dst_stride,
1072 ret = av_frame_copy_props(pic->f, pic_arg);
1076 pic->f->display_picture_number = display_picture_number;
1077 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1080 /* shift buffer entries */
1081 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1082 s->input_picture[i - 1] = s->input_picture[i];
1084 s->input_picture[encoding_delay] = (Picture*) pic;
1089 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1093 int64_t score64 = 0;
1095 for (plane = 0; plane < 3; plane++) {
1096 const int stride = p->f->linesize[plane];
1097 const int bw = plane ? 1 : 2;
1098 for (y = 0; y < s->mb_height * bw; y++) {
1099 for (x = 0; x < s->mb_width * bw; x++) {
1100 int off = p->shared ? 0 : 16;
1101 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1102 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1103 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1105 switch (s->avctx->frame_skip_exp) {
1106 case 0: score = FFMAX(score, v); break;
1107 case 1: score += FFABS(v); break;
1108 case 2: score += v * v; break;
1109 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1110 case 4: score64 += v * v * (int64_t)(v * v); break;
1119 if (score64 < s->avctx->frame_skip_threshold)
1121 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1126 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1128 AVPacket pkt = { 0 };
1129 int ret, got_output;
1131 av_init_packet(&pkt);
1132 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1137 av_free_packet(&pkt);
1141 static int estimate_best_b_count(MpegEncContext *s)
1143 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1144 AVCodecContext *c = avcodec_alloc_context3(NULL);
1145 const int scale = s->avctx->brd_scale;
1146 int i, j, out_size, p_lambda, b_lambda, lambda2;
1147 int64_t best_rd = INT64_MAX;
1148 int best_b_count = -1;
1151 return AVERROR(ENOMEM);
1152 assert(scale >= 0 && scale <= 3);
1155 //s->next_picture_ptr->quality;
1156 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1157 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1158 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1159 if (!b_lambda) // FIXME we should do this somewhere else
1160 b_lambda = p_lambda;
1161 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1164 c->width = s->width >> scale;
1165 c->height = s->height >> scale;
1166 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1167 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1168 c->mb_decision = s->avctx->mb_decision;
1169 c->me_cmp = s->avctx->me_cmp;
1170 c->mb_cmp = s->avctx->mb_cmp;
1171 c->me_sub_cmp = s->avctx->me_sub_cmp;
1172 c->pix_fmt = AV_PIX_FMT_YUV420P;
1173 c->time_base = s->avctx->time_base;
1174 c->max_b_frames = s->max_b_frames;
1176 if (avcodec_open2(c, codec, NULL) < 0)
1179 for (i = 0; i < s->max_b_frames + 2; i++) {
1180 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1181 s->next_picture_ptr;
1183 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1184 pre_input = *pre_input_ptr;
1186 if (!pre_input.shared && i) {
1187 pre_input.f->data[0] += INPLACE_OFFSET;
1188 pre_input.f->data[1] += INPLACE_OFFSET;
1189 pre_input.f->data[2] += INPLACE_OFFSET;
1192 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1193 s->tmp_frames[i]->linesize[0],
1194 pre_input.f->data[0],
1195 pre_input.f->linesize[0],
1196 c->width, c->height);
1197 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1198 s->tmp_frames[i]->linesize[1],
1199 pre_input.f->data[1],
1200 pre_input.f->linesize[1],
1201 c->width >> 1, c->height >> 1);
1202 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1203 s->tmp_frames[i]->linesize[2],
1204 pre_input.f->data[2],
1205 pre_input.f->linesize[2],
1206 c->width >> 1, c->height >> 1);
1210 for (j = 0; j < s->max_b_frames + 1; j++) {
1213 if (!s->input_picture[j])
1216 c->error[0] = c->error[1] = c->error[2] = 0;
1218 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1219 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1221 out_size = encode_frame(c, s->tmp_frames[0]);
1223 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1225 for (i = 0; i < s->max_b_frames + 1; i++) {
1226 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1228 s->tmp_frames[i + 1]->pict_type = is_p ?
1229 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1230 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1232 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1234 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1237 /* get the delayed frames */
1239 out_size = encode_frame(c, NULL);
1240 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1243 rd += c->error[0] + c->error[1] + c->error[2];
1254 return best_b_count;
1257 static int select_input_picture(MpegEncContext *s)
1261 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1262 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1263 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1265 /* set next picture type & ordering */
1266 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1267 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1268 !s->next_picture_ptr || s->intra_only) {
1269 s->reordered_input_picture[0] = s->input_picture[0];
1270 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1271 s->reordered_input_picture[0]->f->coded_picture_number =
1272 s->coded_picture_number++;
1276 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1277 if (s->picture_in_gop_number < s->gop_size &&
1278 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1279 // FIXME check that te gop check above is +-1 correct
1280 av_frame_unref(s->input_picture[0]->f);
1283 ff_vbv_update(s, 0);
1289 if (s->avctx->flags & CODEC_FLAG_PASS2) {
1290 for (i = 0; i < s->max_b_frames + 1; i++) {
1291 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1293 if (pict_num >= s->rc_context.num_entries)
1295 if (!s->input_picture[i]) {
1296 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1300 s->input_picture[i]->f->pict_type =
1301 s->rc_context.entry[pict_num].new_pict_type;
1305 if (s->avctx->b_frame_strategy == 0) {
1306 b_frames = s->max_b_frames;
1307 while (b_frames && !s->input_picture[b_frames])
1309 } else if (s->avctx->b_frame_strategy == 1) {
1310 for (i = 1; i < s->max_b_frames + 1; i++) {
1311 if (s->input_picture[i] &&
1312 s->input_picture[i]->b_frame_score == 0) {
1313 s->input_picture[i]->b_frame_score =
1315 s->input_picture[i ]->f->data[0],
1316 s->input_picture[i - 1]->f->data[0],
1320 for (i = 0; i < s->max_b_frames + 1; i++) {
1321 if (!s->input_picture[i] ||
1322 s->input_picture[i]->b_frame_score - 1 >
1323 s->mb_num / s->avctx->b_sensitivity)
1327 b_frames = FFMAX(0, i - 1);
1330 for (i = 0; i < b_frames + 1; i++) {
1331 s->input_picture[i]->b_frame_score = 0;
1333 } else if (s->avctx->b_frame_strategy == 2) {
1334 b_frames = estimate_best_b_count(s);
1336 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1342 for (i = b_frames - 1; i >= 0; i--) {
1343 int type = s->input_picture[i]->f->pict_type;
1344 if (type && type != AV_PICTURE_TYPE_B)
1347 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1348 b_frames == s->max_b_frames) {
1349 av_log(s->avctx, AV_LOG_ERROR,
1350 "warning, too many b frames in a row\n");
1353 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1354 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1355 s->gop_size > s->picture_in_gop_number) {
1356 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1358 if (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)
1360 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1364 if ((s->avctx->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1365 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1368 s->reordered_input_picture[0] = s->input_picture[b_frames];
1369 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1370 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1371 s->reordered_input_picture[0]->f->coded_picture_number =
1372 s->coded_picture_number++;
1373 for (i = 0; i < b_frames; i++) {
1374 s->reordered_input_picture[i + 1] = s->input_picture[i];
1375 s->reordered_input_picture[i + 1]->f->pict_type =
1377 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1378 s->coded_picture_number++;
1383 if (s->reordered_input_picture[0]) {
1384 s->reordered_input_picture[0]->reference =
1385 s->reordered_input_picture[0]->f->pict_type !=
1386 AV_PICTURE_TYPE_B ? 3 : 0;
1388 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1389 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1392 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1393 // input is a shared pix, so we can't modifiy it -> alloc a new
1394 // one & ensure that the shared one is reuseable
1397 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1400 pic = &s->picture[i];
1402 pic->reference = s->reordered_input_picture[0]->reference;
1403 if (alloc_picture(s, pic, 0) < 0) {
1407 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1411 /* mark us unused / free shared pic */
1412 av_frame_unref(s->reordered_input_picture[0]->f);
1413 s->reordered_input_picture[0]->shared = 0;
1415 s->current_picture_ptr = pic;
1417 // input is not a shared pix -> reuse buffer for current_pix
1418 s->current_picture_ptr = s->reordered_input_picture[0];
1419 for (i = 0; i < 4; i++) {
1420 s->new_picture.f->data[i] += INPLACE_OFFSET;
1423 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1424 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1425 s->current_picture_ptr)) < 0)
1428 s->picture_number = s->new_picture.f->display_picture_number;
1430 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1435 static void frame_end(MpegEncContext *s)
1439 if (s->unrestricted_mv &&
1440 s->current_picture.reference &&
1442 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1443 int hshift = desc->log2_chroma_w;
1444 int vshift = desc->log2_chroma_h;
1445 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1446 s->h_edge_pos, s->v_edge_pos,
1447 EDGE_WIDTH, EDGE_WIDTH,
1448 EDGE_TOP | EDGE_BOTTOM);
1449 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1450 s->h_edge_pos >> hshift,
1451 s->v_edge_pos >> vshift,
1452 EDGE_WIDTH >> hshift,
1453 EDGE_WIDTH >> vshift,
1454 EDGE_TOP | EDGE_BOTTOM);
1455 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1456 s->h_edge_pos >> hshift,
1457 s->v_edge_pos >> vshift,
1458 EDGE_WIDTH >> hshift,
1459 EDGE_WIDTH >> vshift,
1460 EDGE_TOP | EDGE_BOTTOM);
1465 s->last_pict_type = s->pict_type;
1466 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1467 if (s->pict_type!= AV_PICTURE_TYPE_B)
1468 s->last_non_b_pict_type = s->pict_type;
1471 /* release non-reference frames */
1472 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1473 if (!s->picture[i].reference)
1474 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1478 #if FF_API_CODED_FRAME
1479 FF_DISABLE_DEPRECATION_WARNINGS
1480 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1481 FF_ENABLE_DEPRECATION_WARNINGS
1485 static void update_noise_reduction(MpegEncContext *s)
1489 for (intra = 0; intra < 2; intra++) {
1490 if (s->dct_count[intra] > (1 << 16)) {
1491 for (i = 0; i < 64; i++) {
1492 s->dct_error_sum[intra][i] >>= 1;
1494 s->dct_count[intra] >>= 1;
1497 for (i = 0; i < 64; i++) {
1498 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1499 s->dct_count[intra] +
1500 s->dct_error_sum[intra][i] / 2) /
1501 (s->dct_error_sum[intra][i] + 1);
1506 static int frame_start(MpegEncContext *s)
1510 /* mark & release old frames */
1511 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1512 s->last_picture_ptr != s->next_picture_ptr &&
1513 s->last_picture_ptr->f->buf[0]) {
1514 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1517 s->current_picture_ptr->f->pict_type = s->pict_type;
1518 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1520 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1521 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1522 s->current_picture_ptr)) < 0)
1525 if (s->pict_type != AV_PICTURE_TYPE_B) {
1526 s->last_picture_ptr = s->next_picture_ptr;
1528 s->next_picture_ptr = s->current_picture_ptr;
1531 if (s->last_picture_ptr) {
1532 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1533 if (s->last_picture_ptr->f->buf[0] &&
1534 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1535 s->last_picture_ptr)) < 0)
1538 if (s->next_picture_ptr) {
1539 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1540 if (s->next_picture_ptr->f->buf[0] &&
1541 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1542 s->next_picture_ptr)) < 0)
1546 if (s->picture_structure!= PICT_FRAME) {
1548 for (i = 0; i < 4; i++) {
1549 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1550 s->current_picture.f->data[i] +=
1551 s->current_picture.f->linesize[i];
1553 s->current_picture.f->linesize[i] *= 2;
1554 s->last_picture.f->linesize[i] *= 2;
1555 s->next_picture.f->linesize[i] *= 2;
1559 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1560 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1561 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1562 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1563 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1564 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1566 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1567 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1570 if (s->dct_error_sum) {
1571 assert(s->avctx->noise_reduction && s->encoding);
1572 update_noise_reduction(s);
1578 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1579 const AVFrame *pic_arg, int *got_packet)
1581 MpegEncContext *s = avctx->priv_data;
1582 int i, stuffing_count, ret;
1583 int context_count = s->slice_context_count;
1585 s->picture_in_gop_number++;
1587 if (load_input_picture(s, pic_arg) < 0)
1590 if (select_input_picture(s) < 0) {
1595 if (s->new_picture.f->data[0]) {
1598 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1601 s->mb_info_ptr = av_packet_new_side_data(pkt,
1602 AV_PKT_DATA_H263_MB_INFO,
1603 s->mb_width*s->mb_height*12);
1604 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1607 for (i = 0; i < context_count; i++) {
1608 int start_y = s->thread_context[i]->start_mb_y;
1609 int end_y = s->thread_context[i]-> end_mb_y;
1610 int h = s->mb_height;
1611 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1612 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1614 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1617 s->pict_type = s->new_picture.f->pict_type;
1619 ret = frame_start(s);
1623 if (encode_picture(s, s->picture_number) < 0)
1626 avctx->header_bits = s->header_bits;
1627 avctx->mv_bits = s->mv_bits;
1628 avctx->misc_bits = s->misc_bits;
1629 avctx->i_tex_bits = s->i_tex_bits;
1630 avctx->p_tex_bits = s->p_tex_bits;
1631 avctx->i_count = s->i_count;
1632 // FIXME f/b_count in avctx
1633 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1634 avctx->skip_count = s->skip_count;
1638 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1641 return AVERROR(ENOMEM);
1642 *(int *)sd = s->current_picture.f->quality;
1644 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1645 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1647 if (avctx->rc_buffer_size) {
1648 RateControlContext *rcc = &s->rc_context;
1649 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1651 if (put_bits_count(&s->pb) > max_size &&
1652 s->lambda < s->lmax) {
1653 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1654 (s->qscale + 1) / s->qscale);
1655 if (s->adaptive_quant) {
1657 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1658 s->lambda_table[i] =
1659 FFMAX(s->lambda_table[i] + 1,
1660 s->lambda_table[i] * (s->qscale + 1) /
1663 s->mb_skipped = 0; // done in frame_start()
1664 // done in encode_picture() so we must undo it
1665 if (s->pict_type == AV_PICTURE_TYPE_P) {
1666 if (s->flipflop_rounding ||
1667 s->codec_id == AV_CODEC_ID_H263P ||
1668 s->codec_id == AV_CODEC_ID_MPEG4)
1669 s->no_rounding ^= 1;
1671 if (s->pict_type != AV_PICTURE_TYPE_B) {
1672 s->time_base = s->last_time_base;
1673 s->last_non_b_time = s->time - s->pp_time;
1675 for (i = 0; i < context_count; i++) {
1676 PutBitContext *pb = &s->thread_context[i]->pb;
1677 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1682 assert(s->avctx->rc_max_rate);
1685 if (s->avctx->flags & CODEC_FLAG_PASS1)
1686 ff_write_pass1_stats(s);
1688 for (i = 0; i < 4; i++) {
1689 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1690 avctx->error[i] += s->current_picture_ptr->f->error[i];
1693 if (s->avctx->flags & CODEC_FLAG_PASS1)
1694 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1695 avctx->i_tex_bits + avctx->p_tex_bits ==
1696 put_bits_count(&s->pb));
1697 flush_put_bits(&s->pb);
1698 s->frame_bits = put_bits_count(&s->pb);
1700 stuffing_count = ff_vbv_update(s, s->frame_bits);
1701 if (stuffing_count) {
1702 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1703 stuffing_count + 50) {
1704 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1708 switch (s->codec_id) {
1709 case AV_CODEC_ID_MPEG1VIDEO:
1710 case AV_CODEC_ID_MPEG2VIDEO:
1711 while (stuffing_count--) {
1712 put_bits(&s->pb, 8, 0);
1715 case AV_CODEC_ID_MPEG4:
1716 put_bits(&s->pb, 16, 0);
1717 put_bits(&s->pb, 16, 0x1C3);
1718 stuffing_count -= 4;
1719 while (stuffing_count--) {
1720 put_bits(&s->pb, 8, 0xFF);
1724 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1726 flush_put_bits(&s->pb);
1727 s->frame_bits = put_bits_count(&s->pb);
1730 /* update mpeg1/2 vbv_delay for CBR */
1731 if (s->avctx->rc_max_rate &&
1732 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1733 s->out_format == FMT_MPEG1 &&
1734 90000LL * (avctx->rc_buffer_size - 1) <=
1735 s->avctx->rc_max_rate * 0xFFFFLL) {
1736 int vbv_delay, min_delay;
1737 double inbits = s->avctx->rc_max_rate *
1738 av_q2d(s->avctx->time_base);
1739 int minbits = s->frame_bits - 8 *
1740 (s->vbv_delay_ptr - s->pb.buf - 1);
1741 double bits = s->rc_context.buffer_index + minbits - inbits;
1744 av_log(s->avctx, AV_LOG_ERROR,
1745 "Internal error, negative bits\n");
1747 assert(s->repeat_first_field == 0);
1749 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1750 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1751 s->avctx->rc_max_rate;
1753 vbv_delay = FFMAX(vbv_delay, min_delay);
1755 assert(vbv_delay < 0xFFFF);
1757 s->vbv_delay_ptr[0] &= 0xF8;
1758 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1759 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1760 s->vbv_delay_ptr[2] &= 0x07;
1761 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1762 avctx->vbv_delay = vbv_delay * 300;
1764 s->total_bits += s->frame_bits;
1765 avctx->frame_bits = s->frame_bits;
1767 pkt->pts = s->current_picture.f->pts;
1768 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1769 if (!s->current_picture.f->coded_picture_number)
1770 pkt->dts = pkt->pts - s->dts_delta;
1772 pkt->dts = s->reordered_pts;
1773 s->reordered_pts = pkt->pts;
1775 pkt->dts = pkt->pts;
1776 if (s->current_picture.f->key_frame)
1777 pkt->flags |= AV_PKT_FLAG_KEY;
1779 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1783 assert((s->frame_bits & 7) == 0);
1785 pkt->size = s->frame_bits / 8;
1786 *got_packet = !!pkt->size;
1790 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1791 int n, int threshold)
1793 static const char tab[64] = {
1794 3, 2, 2, 1, 1, 1, 1, 1,
1795 1, 1, 1, 1, 1, 1, 1, 1,
1796 1, 1, 1, 1, 1, 1, 1, 1,
1797 0, 0, 0, 0, 0, 0, 0, 0,
1798 0, 0, 0, 0, 0, 0, 0, 0,
1799 0, 0, 0, 0, 0, 0, 0, 0,
1800 0, 0, 0, 0, 0, 0, 0, 0,
1801 0, 0, 0, 0, 0, 0, 0, 0
1806 int16_t *block = s->block[n];
1807 const int last_index = s->block_last_index[n];
1810 if (threshold < 0) {
1812 threshold = -threshold;
1816 /* Are all we could set to zero already zero? */
1817 if (last_index <= skip_dc - 1)
1820 for (i = 0; i <= last_index; i++) {
1821 const int j = s->intra_scantable.permutated[i];
1822 const int level = FFABS(block[j]);
1824 if (skip_dc && i == 0)
1828 } else if (level > 1) {
1834 if (score >= threshold)
1836 for (i = skip_dc; i <= last_index; i++) {
1837 const int j = s->intra_scantable.permutated[i];
1841 s->block_last_index[n] = 0;
1843 s->block_last_index[n] = -1;
1846 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1850 const int maxlevel = s->max_qcoeff;
1851 const int minlevel = s->min_qcoeff;
1855 i = 1; // skip clipping of intra dc
1859 for (; i <= last_index; i++) {
1860 const int j = s->intra_scantable.permutated[i];
1861 int level = block[j];
1863 if (level > maxlevel) {
1866 } else if (level < minlevel) {
1874 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1875 av_log(s->avctx, AV_LOG_INFO,
1876 "warning, clipping %d dct coefficients to %d..%d\n",
1877 overflow, minlevel, maxlevel);
1880 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1884 for (y = 0; y < 8; y++) {
1885 for (x = 0; x < 8; x++) {
1891 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1892 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1893 int v = ptr[x2 + y2 * stride];
1899 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1904 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1905 int motion_x, int motion_y,
1906 int mb_block_height,
1909 int16_t weight[8][64];
1910 int16_t orig[8][64];
1911 const int mb_x = s->mb_x;
1912 const int mb_y = s->mb_y;
1915 int dct_offset = s->linesize * 8; // default for progressive frames
1916 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1917 ptrdiff_t wrap_y, wrap_c;
1919 for (i = 0; i < mb_block_count; i++)
1920 skip_dct[i] = s->skipdct;
1922 if (s->adaptive_quant) {
1923 const int last_qp = s->qscale;
1924 const int mb_xy = mb_x + mb_y * s->mb_stride;
1926 s->lambda = s->lambda_table[mb_xy];
1929 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1930 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1931 s->dquant = s->qscale - last_qp;
1933 if (s->out_format == FMT_H263) {
1934 s->dquant = av_clip(s->dquant, -2, 2);
1936 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1938 if (s->pict_type == AV_PICTURE_TYPE_B) {
1939 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1942 if (s->mv_type == MV_TYPE_8X8)
1948 ff_set_qscale(s, last_qp + s->dquant);
1949 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1950 ff_set_qscale(s, s->qscale + s->dquant);
1952 wrap_y = s->linesize;
1953 wrap_c = s->uvlinesize;
1954 ptr_y = s->new_picture.f->data[0] +
1955 (mb_y * 16 * wrap_y) + mb_x * 16;
1956 ptr_cb = s->new_picture.f->data[1] +
1957 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1958 ptr_cr = s->new_picture.f->data[2] +
1959 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1961 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1962 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1963 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1965 16, 16, mb_x * 16, mb_y * 16,
1966 s->width, s->height);
1968 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1970 8, mb_block_height, mb_x * 8, mb_y * 8,
1971 s->width >> 1, s->height >> 1);
1972 ptr_cb = ebuf + 18 * wrap_y;
1973 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1975 8, mb_block_height, mb_x * 8, mb_y * 8,
1976 s->width >> 1, s->height >> 1);
1977 ptr_cr = ebuf + 18 * wrap_y + 8;
1981 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
1982 int progressive_score, interlaced_score;
1984 s->interlaced_dct = 0;
1985 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1986 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1987 NULL, wrap_y, 8) - 400;
1989 if (progressive_score > 0) {
1990 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1991 NULL, wrap_y * 2, 8) +
1992 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1993 NULL, wrap_y * 2, 8);
1994 if (progressive_score > interlaced_score) {
1995 s->interlaced_dct = 1;
1997 dct_offset = wrap_y;
1999 if (s->chroma_format == CHROMA_422)
2005 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2006 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2007 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2008 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2010 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2014 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2015 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2016 if (!s->chroma_y_shift) { /* 422 */
2017 s->pdsp.get_pixels(s->block[6],
2018 ptr_cb + (dct_offset >> 1), wrap_c);
2019 s->pdsp.get_pixels(s->block[7],
2020 ptr_cr + (dct_offset >> 1), wrap_c);
2024 op_pixels_func (*op_pix)[4];
2025 qpel_mc_func (*op_qpix)[16];
2026 uint8_t *dest_y, *dest_cb, *dest_cr;
2028 dest_y = s->dest[0];
2029 dest_cb = s->dest[1];
2030 dest_cr = s->dest[2];
2032 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2033 op_pix = s->hdsp.put_pixels_tab;
2034 op_qpix = s->qdsp.put_qpel_pixels_tab;
2036 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2037 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2040 if (s->mv_dir & MV_DIR_FORWARD) {
2041 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2042 s->last_picture.f->data,
2044 op_pix = s->hdsp.avg_pixels_tab;
2045 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2047 if (s->mv_dir & MV_DIR_BACKWARD) {
2048 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2049 s->next_picture.f->data,
2053 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
2054 int progressive_score, interlaced_score;
2056 s->interlaced_dct = 0;
2057 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2058 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2062 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2063 progressive_score -= 400;
2065 if (progressive_score > 0) {
2066 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2068 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2072 if (progressive_score > interlaced_score) {
2073 s->interlaced_dct = 1;
2075 dct_offset = wrap_y;
2077 if (s->chroma_format == CHROMA_422)
2083 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2084 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2085 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2086 dest_y + dct_offset, wrap_y);
2087 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2088 dest_y + dct_offset + 8, wrap_y);
2090 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2094 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2095 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2096 if (!s->chroma_y_shift) { /* 422 */
2097 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2098 dest_cb + (dct_offset >> 1), wrap_c);
2099 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2100 dest_cr + (dct_offset >> 1), wrap_c);
2103 /* pre quantization */
2104 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2105 2 * s->qscale * s->qscale) {
2107 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2109 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2111 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2112 wrap_y, 8) < 20 * s->qscale)
2114 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2115 wrap_y, 8) < 20 * s->qscale)
2117 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2119 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2121 if (!s->chroma_y_shift) { /* 422 */
2122 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2123 dest_cb + (dct_offset >> 1),
2124 wrap_c, 8) < 20 * s->qscale)
2126 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2127 dest_cr + (dct_offset >> 1),
2128 wrap_c, 8) < 20 * s->qscale)
2134 if (s->quantizer_noise_shaping) {
2136 get_visual_weight(weight[0], ptr_y , wrap_y);
2138 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2140 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2142 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2144 get_visual_weight(weight[4], ptr_cb , wrap_c);
2146 get_visual_weight(weight[5], ptr_cr , wrap_c);
2147 if (!s->chroma_y_shift) { /* 422 */
2149 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2152 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2155 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2158 /* DCT & quantize */
2159 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2161 for (i = 0; i < mb_block_count; i++) {
2164 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2165 // FIXME we could decide to change to quantizer instead of
2167 // JS: I don't think that would be a good idea it could lower
2168 // quality instead of improve it. Just INTRADC clipping
2169 // deserves changes in quantizer
2171 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2173 s->block_last_index[i] = -1;
2175 if (s->quantizer_noise_shaping) {
2176 for (i = 0; i < mb_block_count; i++) {
2178 s->block_last_index[i] =
2179 dct_quantize_refine(s, s->block[i], weight[i],
2180 orig[i], i, s->qscale);
2185 if (s->luma_elim_threshold && !s->mb_intra)
2186 for (i = 0; i < 4; i++)
2187 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2188 if (s->chroma_elim_threshold && !s->mb_intra)
2189 for (i = 4; i < mb_block_count; i++)
2190 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2192 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2193 for (i = 0; i < mb_block_count; i++) {
2194 if (s->block_last_index[i] == -1)
2195 s->coded_score[i] = INT_MAX / 256;
2200 if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2201 s->block_last_index[4] =
2202 s->block_last_index[5] = 0;
2204 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2207 // non c quantize code returns incorrect block_last_index FIXME
2208 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2209 for (i = 0; i < mb_block_count; i++) {
2211 if (s->block_last_index[i] > 0) {
2212 for (j = 63; j > 0; j--) {
2213 if (s->block[i][s->intra_scantable.permutated[j]])
2216 s->block_last_index[i] = j;
2221 /* huffman encode */
2222 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2223 case AV_CODEC_ID_MPEG1VIDEO:
2224 case AV_CODEC_ID_MPEG2VIDEO:
2225 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2226 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2228 case AV_CODEC_ID_MPEG4:
2229 if (CONFIG_MPEG4_ENCODER)
2230 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2232 case AV_CODEC_ID_MSMPEG4V2:
2233 case AV_CODEC_ID_MSMPEG4V3:
2234 case AV_CODEC_ID_WMV1:
2235 if (CONFIG_MSMPEG4_ENCODER)
2236 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2238 case AV_CODEC_ID_WMV2:
2239 if (CONFIG_WMV2_ENCODER)
2240 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2242 case AV_CODEC_ID_H261:
2243 if (CONFIG_H261_ENCODER)
2244 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2246 case AV_CODEC_ID_H263:
2247 case AV_CODEC_ID_H263P:
2248 case AV_CODEC_ID_FLV1:
2249 case AV_CODEC_ID_RV10:
2250 case AV_CODEC_ID_RV20:
2251 if (CONFIG_H263_ENCODER)
2252 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2254 case AV_CODEC_ID_MJPEG:
2255 if (CONFIG_MJPEG_ENCODER)
2256 ff_mjpeg_encode_mb(s, s->block);
2263 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2265 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2266 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2269 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2272 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2275 d->mb_skip_run= s->mb_skip_run;
2277 d->last_dc[i] = s->last_dc[i];
2280 d->mv_bits= s->mv_bits;
2281 d->i_tex_bits= s->i_tex_bits;
2282 d->p_tex_bits= s->p_tex_bits;
2283 d->i_count= s->i_count;
2284 d->f_count= s->f_count;
2285 d->b_count= s->b_count;
2286 d->skip_count= s->skip_count;
2287 d->misc_bits= s->misc_bits;
2291 d->qscale= s->qscale;
2292 d->dquant= s->dquant;
2294 d->esc3_level_length= s->esc3_level_length;
2297 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2300 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2301 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2304 d->mb_skip_run= s->mb_skip_run;
2306 d->last_dc[i] = s->last_dc[i];
2309 d->mv_bits= s->mv_bits;
2310 d->i_tex_bits= s->i_tex_bits;
2311 d->p_tex_bits= s->p_tex_bits;
2312 d->i_count= s->i_count;
2313 d->f_count= s->f_count;
2314 d->b_count= s->b_count;
2315 d->skip_count= s->skip_count;
2316 d->misc_bits= s->misc_bits;
2318 d->mb_intra= s->mb_intra;
2319 d->mb_skipped= s->mb_skipped;
2320 d->mv_type= s->mv_type;
2321 d->mv_dir= s->mv_dir;
2323 if(s->data_partitioning){
2325 d->tex_pb= s->tex_pb;
2329 d->block_last_index[i]= s->block_last_index[i];
2330 d->interlaced_dct= s->interlaced_dct;
2331 d->qscale= s->qscale;
2333 d->esc3_level_length= s->esc3_level_length;
2336 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2337 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2338 int *dmin, int *next_block, int motion_x, int motion_y)
2341 uint8_t *dest_backup[3];
2343 copy_context_before_encode(s, backup, type);
2345 s->block= s->blocks[*next_block];
2346 s->pb= pb[*next_block];
2347 if(s->data_partitioning){
2348 s->pb2 = pb2 [*next_block];
2349 s->tex_pb= tex_pb[*next_block];
2353 memcpy(dest_backup, s->dest, sizeof(s->dest));
2354 s->dest[0] = s->sc.rd_scratchpad;
2355 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2356 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2357 assert(s->linesize >= 32); //FIXME
2360 encode_mb(s, motion_x, motion_y);
2362 score= put_bits_count(&s->pb);
2363 if(s->data_partitioning){
2364 score+= put_bits_count(&s->pb2);
2365 score+= put_bits_count(&s->tex_pb);
2368 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2369 ff_mpv_decode_mb(s, s->block);
2371 score *= s->lambda2;
2372 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2376 memcpy(s->dest, dest_backup, sizeof(s->dest));
2383 copy_context_after_encode(best, s, type);
2387 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2388 uint32_t *sq = ff_square_tab + 256;
2393 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2394 else if(w==8 && h==8)
2395 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2399 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2408 static int sse_mb(MpegEncContext *s){
2412 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2413 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2416 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2417 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) +
2418 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) +
2419 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);
2421 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) +
2422 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) +
2423 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);
2426 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)
2427 +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)
2428 +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);
2431 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2432 MpegEncContext *s= *(void**)arg;
2436 s->me.dia_size= s->avctx->pre_dia_size;
2437 s->first_slice_line=1;
2438 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2439 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2440 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2442 s->first_slice_line=0;
2450 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2451 MpegEncContext *s= *(void**)arg;
2453 s->me.dia_size= s->avctx->dia_size;
2454 s->first_slice_line=1;
2455 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2456 s->mb_x=0; //for block init below
2457 ff_init_block_index(s);
2458 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2459 s->block_index[0]+=2;
2460 s->block_index[1]+=2;
2461 s->block_index[2]+=2;
2462 s->block_index[3]+=2;
2464 /* compute motion vector & mb_type and store in context */
2465 if(s->pict_type==AV_PICTURE_TYPE_B)
2466 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2468 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2470 s->first_slice_line=0;
2475 static int mb_var_thread(AVCodecContext *c, void *arg){
2476 MpegEncContext *s= *(void**)arg;
2479 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2480 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2483 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2485 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2487 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2488 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2490 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2491 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2492 s->me.mb_var_sum_temp += varc;
2498 static void write_slice_end(MpegEncContext *s){
2499 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2500 if(s->partitioned_frame){
2501 ff_mpeg4_merge_partitions(s);
2504 ff_mpeg4_stuffing(&s->pb);
2505 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2506 ff_mjpeg_encode_stuffing(&s->pb);
2509 avpriv_align_put_bits(&s->pb);
2510 flush_put_bits(&s->pb);
2512 if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
2513 s->misc_bits+= get_bits_diff(s);
2516 static void write_mb_info(MpegEncContext *s)
2518 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2519 int offset = put_bits_count(&s->pb);
2520 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2521 int gobn = s->mb_y / s->gob_index;
2523 if (CONFIG_H263_ENCODER)
2524 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2525 bytestream_put_le32(&ptr, offset);
2526 bytestream_put_byte(&ptr, s->qscale);
2527 bytestream_put_byte(&ptr, gobn);
2528 bytestream_put_le16(&ptr, mba);
2529 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2530 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2531 /* 4MV not implemented */
2532 bytestream_put_byte(&ptr, 0); /* hmv2 */
2533 bytestream_put_byte(&ptr, 0); /* vmv2 */
2536 static void update_mb_info(MpegEncContext *s, int startcode)
2540 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2541 s->mb_info_size += 12;
2542 s->prev_mb_info = s->last_mb_info;
2545 s->prev_mb_info = put_bits_count(&s->pb)/8;
2546 /* This might have incremented mb_info_size above, and we return without
2547 * actually writing any info into that slot yet. But in that case,
2548 * this will be called again at the start of the after writing the
2549 * start code, actually writing the mb info. */
2553 s->last_mb_info = put_bits_count(&s->pb)/8;
2554 if (!s->mb_info_size)
2555 s->mb_info_size += 12;
2559 static int encode_thread(AVCodecContext *c, void *arg){
2560 MpegEncContext *s= *(void**)arg;
2561 int mb_x, mb_y, pdif = 0;
2562 int chr_h= 16>>s->chroma_y_shift;
2564 MpegEncContext best_s = { 0 }, backup_s;
2565 uint8_t bit_buf[2][MAX_MB_BYTES];
2566 uint8_t bit_buf2[2][MAX_MB_BYTES];
2567 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2568 PutBitContext pb[2], pb2[2], tex_pb[2];
2571 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2572 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2573 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2576 s->last_bits= put_bits_count(&s->pb);
2587 /* init last dc values */
2588 /* note: quant matrix value (8) is implied here */
2589 s->last_dc[i] = 128 << s->intra_dc_precision;
2591 s->current_picture.f->error[i] = 0;
2594 memset(s->last_mv, 0, sizeof(s->last_mv));
2598 switch(s->codec_id){
2599 case AV_CODEC_ID_H263:
2600 case AV_CODEC_ID_H263P:
2601 case AV_CODEC_ID_FLV1:
2602 if (CONFIG_H263_ENCODER)
2603 s->gob_index = H263_GOB_HEIGHT(s->height);
2605 case AV_CODEC_ID_MPEG4:
2606 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2607 ff_mpeg4_init_partitions(s);
2613 s->first_slice_line = 1;
2614 s->ptr_lastgob = s->pb.buf;
2615 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2619 ff_set_qscale(s, s->qscale);
2620 ff_init_block_index(s);
2622 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2623 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2624 int mb_type= s->mb_type[xy];
2629 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2630 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2633 if(s->data_partitioning){
2634 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2635 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2636 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2642 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2643 ff_update_block_index(s);
2645 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2646 ff_h261_reorder_mb_index(s);
2647 xy= s->mb_y*s->mb_stride + s->mb_x;
2648 mb_type= s->mb_type[xy];
2651 /* write gob / video packet header */
2653 int current_packet_size, is_gob_start;
2655 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2657 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2659 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2661 switch(s->codec_id){
2662 case AV_CODEC_ID_H263:
2663 case AV_CODEC_ID_H263P:
2664 if(!s->h263_slice_structured)
2665 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2667 case AV_CODEC_ID_MPEG2VIDEO:
2668 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2669 case AV_CODEC_ID_MPEG1VIDEO:
2670 if(s->mb_skip_run) is_gob_start=0;
2675 if(s->start_mb_y != mb_y || mb_x!=0){
2678 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2679 ff_mpeg4_init_partitions(s);
2683 assert((put_bits_count(&s->pb)&7) == 0);
2684 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2686 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2687 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2688 int d = 100 / s->error_rate;
2690 current_packet_size=0;
2691 s->pb.buf_ptr= s->ptr_lastgob;
2692 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2696 if (s->avctx->rtp_callback){
2697 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2698 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2700 update_mb_info(s, 1);
2702 switch(s->codec_id){
2703 case AV_CODEC_ID_MPEG4:
2704 if (CONFIG_MPEG4_ENCODER) {
2705 ff_mpeg4_encode_video_packet_header(s);
2706 ff_mpeg4_clean_buffers(s);
2709 case AV_CODEC_ID_MPEG1VIDEO:
2710 case AV_CODEC_ID_MPEG2VIDEO:
2711 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2712 ff_mpeg1_encode_slice_header(s);
2713 ff_mpeg1_clean_buffers(s);
2716 case AV_CODEC_ID_H263:
2717 case AV_CODEC_ID_H263P:
2718 if (CONFIG_H263_ENCODER)
2719 ff_h263_encode_gob_header(s, mb_y);
2723 if (s->avctx->flags & CODEC_FLAG_PASS1) {
2724 int bits= put_bits_count(&s->pb);
2725 s->misc_bits+= bits - s->last_bits;
2729 s->ptr_lastgob += current_packet_size;
2730 s->first_slice_line=1;
2731 s->resync_mb_x=mb_x;
2732 s->resync_mb_y=mb_y;
2736 if( (s->resync_mb_x == s->mb_x)
2737 && s->resync_mb_y+1 == s->mb_y){
2738 s->first_slice_line=0;
2742 s->dquant=0; //only for QP_RD
2744 update_mb_info(s, 0);
2746 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
2748 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2750 copy_context_before_encode(&backup_s, s, -1);
2752 best_s.data_partitioning= s->data_partitioning;
2753 best_s.partitioned_frame= s->partitioned_frame;
2754 if(s->data_partitioning){
2755 backup_s.pb2= s->pb2;
2756 backup_s.tex_pb= s->tex_pb;
2759 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2760 s->mv_dir = MV_DIR_FORWARD;
2761 s->mv_type = MV_TYPE_16X16;
2763 s->mv[0][0][0] = s->p_mv_table[xy][0];
2764 s->mv[0][0][1] = s->p_mv_table[xy][1];
2765 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2766 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2768 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2769 s->mv_dir = MV_DIR_FORWARD;
2770 s->mv_type = MV_TYPE_FIELD;
2773 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2774 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2775 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2777 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2778 &dmin, &next_block, 0, 0);
2780 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2781 s->mv_dir = MV_DIR_FORWARD;
2782 s->mv_type = MV_TYPE_16X16;
2786 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2787 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2789 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2790 s->mv_dir = MV_DIR_FORWARD;
2791 s->mv_type = MV_TYPE_8X8;
2794 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2795 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2797 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2798 &dmin, &next_block, 0, 0);
2800 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2801 s->mv_dir = MV_DIR_FORWARD;
2802 s->mv_type = MV_TYPE_16X16;
2804 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2805 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2806 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2807 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2809 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2810 s->mv_dir = MV_DIR_BACKWARD;
2811 s->mv_type = MV_TYPE_16X16;
2813 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2814 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2815 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2816 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2818 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2819 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2820 s->mv_type = MV_TYPE_16X16;
2822 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2823 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2824 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2825 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2826 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2827 &dmin, &next_block, 0, 0);
2829 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2830 s->mv_dir = MV_DIR_FORWARD;
2831 s->mv_type = MV_TYPE_FIELD;
2834 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2835 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2836 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2838 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2839 &dmin, &next_block, 0, 0);
2841 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2842 s->mv_dir = MV_DIR_BACKWARD;
2843 s->mv_type = MV_TYPE_FIELD;
2846 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2847 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2848 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2850 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2851 &dmin, &next_block, 0, 0);
2853 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2854 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2855 s->mv_type = MV_TYPE_FIELD;
2857 for(dir=0; dir<2; dir++){
2859 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2860 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2861 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2864 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2865 &dmin, &next_block, 0, 0);
2867 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2869 s->mv_type = MV_TYPE_16X16;
2873 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2874 &dmin, &next_block, 0, 0);
2875 if(s->h263_pred || s->h263_aic){
2877 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2879 ff_clean_intra_table_entries(s); //old mode?
2883 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2884 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2885 const int last_qp= backup_s.qscale;
2888 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2889 static const int dquant_tab[4]={-1,1,-2,2};
2891 assert(backup_s.dquant == 0);
2894 s->mv_dir= best_s.mv_dir;
2895 s->mv_type = MV_TYPE_16X16;
2896 s->mb_intra= best_s.mb_intra;
2897 s->mv[0][0][0] = best_s.mv[0][0][0];
2898 s->mv[0][0][1] = best_s.mv[0][0][1];
2899 s->mv[1][0][0] = best_s.mv[1][0][0];
2900 s->mv[1][0][1] = best_s.mv[1][0][1];
2902 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2903 for(; qpi<4; qpi++){
2904 int dquant= dquant_tab[qpi];
2905 qp= last_qp + dquant;
2906 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2908 backup_s.dquant= dquant;
2909 if(s->mb_intra && s->dc_val[0]){
2911 dc[i]= s->dc_val[0][ s->block_index[i] ];
2912 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2916 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2917 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2918 if(best_s.qscale != qp){
2919 if(s->mb_intra && s->dc_val[0]){
2921 s->dc_val[0][ s->block_index[i] ]= dc[i];
2922 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2929 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2930 int mx= s->b_direct_mv_table[xy][0];
2931 int my= s->b_direct_mv_table[xy][1];
2933 backup_s.dquant = 0;
2934 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2936 ff_mpeg4_set_direct_mv(s, mx, my);
2937 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2938 &dmin, &next_block, mx, my);
2940 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2941 backup_s.dquant = 0;
2942 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2944 ff_mpeg4_set_direct_mv(s, 0, 0);
2945 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2946 &dmin, &next_block, 0, 0);
2948 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2951 coded |= s->block_last_index[i];
2954 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2955 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2956 mx=my=0; //FIXME find the one we actually used
2957 ff_mpeg4_set_direct_mv(s, mx, my);
2958 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2966 s->mv_dir= best_s.mv_dir;
2967 s->mv_type = best_s.mv_type;
2969 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2970 s->mv[0][0][1] = best_s.mv[0][0][1];
2971 s->mv[1][0][0] = best_s.mv[1][0][0];
2972 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2975 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2976 &dmin, &next_block, mx, my);
2981 s->current_picture.qscale_table[xy] = best_s.qscale;
2983 copy_context_after_encode(s, &best_s, -1);
2985 pb_bits_count= put_bits_count(&s->pb);
2986 flush_put_bits(&s->pb);
2987 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2990 if(s->data_partitioning){
2991 pb2_bits_count= put_bits_count(&s->pb2);
2992 flush_put_bits(&s->pb2);
2993 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2994 s->pb2= backup_s.pb2;
2996 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2997 flush_put_bits(&s->tex_pb);
2998 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2999 s->tex_pb= backup_s.tex_pb;
3001 s->last_bits= put_bits_count(&s->pb);
3003 if (CONFIG_H263_ENCODER &&
3004 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3005 ff_h263_update_motion_val(s);
3007 if(next_block==0){ //FIXME 16 vs linesize16
3008 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3009 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3010 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3013 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3014 ff_mpv_decode_mb(s, s->block);
3016 int motion_x = 0, motion_y = 0;
3017 s->mv_type=MV_TYPE_16X16;
3018 // only one MB-Type possible
3021 case CANDIDATE_MB_TYPE_INTRA:
3024 motion_x= s->mv[0][0][0] = 0;
3025 motion_y= s->mv[0][0][1] = 0;
3027 case CANDIDATE_MB_TYPE_INTER:
3028 s->mv_dir = MV_DIR_FORWARD;
3030 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3031 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3033 case CANDIDATE_MB_TYPE_INTER_I:
3034 s->mv_dir = MV_DIR_FORWARD;
3035 s->mv_type = MV_TYPE_FIELD;
3038 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3039 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3040 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3043 case CANDIDATE_MB_TYPE_INTER4V:
3044 s->mv_dir = MV_DIR_FORWARD;
3045 s->mv_type = MV_TYPE_8X8;
3048 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3049 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3052 case CANDIDATE_MB_TYPE_DIRECT:
3053 if (CONFIG_MPEG4_ENCODER) {
3054 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3056 motion_x=s->b_direct_mv_table[xy][0];
3057 motion_y=s->b_direct_mv_table[xy][1];
3058 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3061 case CANDIDATE_MB_TYPE_DIRECT0:
3062 if (CONFIG_MPEG4_ENCODER) {
3063 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3065 ff_mpeg4_set_direct_mv(s, 0, 0);
3068 case CANDIDATE_MB_TYPE_BIDIR:
3069 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3071 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3072 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3073 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3074 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3076 case CANDIDATE_MB_TYPE_BACKWARD:
3077 s->mv_dir = MV_DIR_BACKWARD;
3079 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3080 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3082 case CANDIDATE_MB_TYPE_FORWARD:
3083 s->mv_dir = MV_DIR_FORWARD;
3085 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3086 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3088 case CANDIDATE_MB_TYPE_FORWARD_I:
3089 s->mv_dir = MV_DIR_FORWARD;
3090 s->mv_type = MV_TYPE_FIELD;
3093 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3094 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3095 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3098 case CANDIDATE_MB_TYPE_BACKWARD_I:
3099 s->mv_dir = MV_DIR_BACKWARD;
3100 s->mv_type = MV_TYPE_FIELD;
3103 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3104 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3105 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3108 case CANDIDATE_MB_TYPE_BIDIR_I:
3109 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3110 s->mv_type = MV_TYPE_FIELD;
3112 for(dir=0; dir<2; dir++){
3114 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3115 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3116 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3121 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3124 encode_mb(s, motion_x, motion_y);
3126 // RAL: Update last macroblock type
3127 s->last_mv_dir = s->mv_dir;
3129 if (CONFIG_H263_ENCODER &&
3130 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3131 ff_h263_update_motion_val(s);
3133 ff_mpv_decode_mb(s, s->block);
3136 /* clean the MV table in IPS frames for direct mode in B frames */
3137 if(s->mb_intra /* && I,P,S_TYPE */){
3138 s->p_mv_table[xy][0]=0;
3139 s->p_mv_table[xy][1]=0;
3142 if (s->avctx->flags & CODEC_FLAG_PSNR) {
3146 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3147 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3149 s->current_picture.f->error[0] += sse(
3150 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3151 s->dest[0], w, h, s->linesize);
3152 s->current_picture.f->error[1] += sse(
3153 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3154 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3155 s->current_picture.f->error[2] += sse(
3156 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3157 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3160 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3161 ff_h263_loop_filter(s);
3163 ff_dlog(s->avctx, "MB %d %d bits\n",
3164 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3168 //not beautiful here but we must write it before flushing so it has to be here
3169 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3170 ff_msmpeg4_encode_ext_header(s);
3174 /* Send the last GOB if RTP */
3175 if (s->avctx->rtp_callback) {
3176 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3177 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3178 /* Call the RTP callback to send the last GOB */
3180 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3186 #define MERGE(field) dst->field += src->field; src->field=0
3187 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3188 MERGE(me.scene_change_score);
3189 MERGE(me.mc_mb_var_sum_temp);
3190 MERGE(me.mb_var_sum_temp);
3193 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3196 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3197 MERGE(dct_count[1]);
3206 MERGE(er.error_count);
3207 MERGE(padding_bug_score);
3208 MERGE(current_picture.f->error[0]);
3209 MERGE(current_picture.f->error[1]);
3210 MERGE(current_picture.f->error[2]);
3212 if(dst->avctx->noise_reduction){
3213 for(i=0; i<64; i++){
3214 MERGE(dct_error_sum[0][i]);
3215 MERGE(dct_error_sum[1][i]);
3219 assert(put_bits_count(&src->pb) % 8 ==0);
3220 assert(put_bits_count(&dst->pb) % 8 ==0);
3221 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3222 flush_put_bits(&dst->pb);
3225 static int estimate_qp(MpegEncContext *s, int dry_run){
3226 if (s->next_lambda){
3227 s->current_picture_ptr->f->quality =
3228 s->current_picture.f->quality = s->next_lambda;
3229 if(!dry_run) s->next_lambda= 0;
3230 } else if (!s->fixed_qscale) {
3231 s->current_picture_ptr->f->quality =
3232 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3233 if (s->current_picture.f->quality < 0)
3237 if(s->adaptive_quant){
3238 switch(s->codec_id){
3239 case AV_CODEC_ID_MPEG4:
3240 if (CONFIG_MPEG4_ENCODER)
3241 ff_clean_mpeg4_qscales(s);
3243 case AV_CODEC_ID_H263:
3244 case AV_CODEC_ID_H263P:
3245 case AV_CODEC_ID_FLV1:
3246 if (CONFIG_H263_ENCODER)
3247 ff_clean_h263_qscales(s);
3250 ff_init_qscale_tab(s);
3253 s->lambda= s->lambda_table[0];
3256 s->lambda = s->current_picture.f->quality;
3261 /* must be called before writing the header */
3262 static void set_frame_distances(MpegEncContext * s){
3263 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3264 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3266 if(s->pict_type==AV_PICTURE_TYPE_B){
3267 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3268 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3270 s->pp_time= s->time - s->last_non_b_time;
3271 s->last_non_b_time= s->time;
3272 assert(s->picture_number==0 || s->pp_time > 0);
3276 static int encode_picture(MpegEncContext *s, int picture_number)
3280 int context_count = s->slice_context_count;
3282 s->picture_number = picture_number;
3284 /* Reset the average MB variance */
3285 s->me.mb_var_sum_temp =
3286 s->me.mc_mb_var_sum_temp = 0;
3288 /* we need to initialize some time vars before we can encode b-frames */
3289 // RAL: Condition added for MPEG1VIDEO
3290 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3291 set_frame_distances(s);
3292 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3293 ff_set_mpeg4_time(s);
3295 s->me.scene_change_score=0;
3297 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3299 if(s->pict_type==AV_PICTURE_TYPE_I){
3300 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3301 else s->no_rounding=0;
3302 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3303 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3304 s->no_rounding ^= 1;
3307 if (s->avctx->flags & CODEC_FLAG_PASS2) {
3308 if (estimate_qp(s,1) < 0)
3310 ff_get_2pass_fcode(s);
3311 } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
3312 if(s->pict_type==AV_PICTURE_TYPE_B)
3313 s->lambda= s->last_lambda_for[s->pict_type];
3315 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3319 s->mb_intra=0; //for the rate distortion & bit compare functions
3320 for(i=1; i<context_count; i++){
3321 ret = ff_update_duplicate_context(s->thread_context[i], s);
3329 /* Estimate motion for every MB */
3330 if(s->pict_type != AV_PICTURE_TYPE_I){
3331 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3332 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3333 if (s->pict_type != AV_PICTURE_TYPE_B) {
3334 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3335 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3339 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3340 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3342 for(i=0; i<s->mb_stride*s->mb_height; i++)
3343 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3345 if(!s->fixed_qscale){
3346 /* finding spatial complexity for I-frame rate control */
3347 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3350 for(i=1; i<context_count; i++){
3351 merge_context_after_me(s, s->thread_context[i]);
3353 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3354 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3357 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3358 s->pict_type= AV_PICTURE_TYPE_I;
3359 for(i=0; i<s->mb_stride*s->mb_height; i++)
3360 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3361 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3362 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3366 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3367 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3369 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3371 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3372 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3373 s->f_code= FFMAX3(s->f_code, a, b);
3376 ff_fix_long_p_mvs(s);
3377 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3378 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3382 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3383 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3388 if(s->pict_type==AV_PICTURE_TYPE_B){
3391 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3392 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3393 s->f_code = FFMAX(a, b);
3395 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3396 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3397 s->b_code = FFMAX(a, b);
3399 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3400 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3401 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3402 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3403 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3405 for(dir=0; dir<2; dir++){
3408 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3409 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3410 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3411 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3419 if (estimate_qp(s, 0) < 0)
3422 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3423 s->pict_type == AV_PICTURE_TYPE_I &&
3424 !(s->avctx->flags & CODEC_FLAG_QSCALE))
3425 s->qscale= 3; //reduce clipping problems
3427 if (s->out_format == FMT_MJPEG) {
3428 /* for mjpeg, we do include qscale in the matrix */
3430 int j = s->idsp.idct_permutation[i];
3432 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3434 s->y_dc_scale_table=
3435 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3436 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3437 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3438 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3442 //FIXME var duplication
3443 s->current_picture_ptr->f->key_frame =
3444 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3445 s->current_picture_ptr->f->pict_type =
3446 s->current_picture.f->pict_type = s->pict_type;
3448 if (s->current_picture.f->key_frame)
3449 s->picture_in_gop_number=0;
3451 s->last_bits= put_bits_count(&s->pb);
3452 switch(s->out_format) {
3454 if (CONFIG_MJPEG_ENCODER)
3455 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3459 if (CONFIG_H261_ENCODER)
3460 ff_h261_encode_picture_header(s, picture_number);
3463 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3464 ff_wmv2_encode_picture_header(s, picture_number);
3465 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3466 ff_msmpeg4_encode_picture_header(s, picture_number);
3467 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3468 ff_mpeg4_encode_picture_header(s, picture_number);
3469 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3470 ret = ff_rv10_encode_picture_header(s, picture_number);
3474 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3475 ff_rv20_encode_picture_header(s, picture_number);
3476 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3477 ff_flv_encode_picture_header(s, picture_number);
3478 else if (CONFIG_H263_ENCODER)
3479 ff_h263_encode_picture_header(s, picture_number);
3482 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3483 ff_mpeg1_encode_picture_header(s, picture_number);
3488 bits= put_bits_count(&s->pb);
3489 s->header_bits= bits - s->last_bits;
3491 for(i=1; i<context_count; i++){
3492 update_duplicate_context_after_me(s->thread_context[i], s);
3494 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3495 for(i=1; i<context_count; i++){
3496 merge_context_after_encode(s, s->thread_context[i]);
3502 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3503 const int intra= s->mb_intra;
3506 s->dct_count[intra]++;
3508 for(i=0; i<64; i++){
3509 int level= block[i];
3513 s->dct_error_sum[intra][i] += level;
3514 level -= s->dct_offset[intra][i];
3515 if(level<0) level=0;
3517 s->dct_error_sum[intra][i] -= level;
3518 level += s->dct_offset[intra][i];
3519 if(level>0) level=0;
3526 static int dct_quantize_trellis_c(MpegEncContext *s,
3527 int16_t *block, int n,
3528 int qscale, int *overflow){
3530 const uint8_t *scantable= s->intra_scantable.scantable;
3531 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3533 unsigned int threshold1, threshold2;
3545 int coeff_count[64];
3546 int qmul, qadd, start_i, last_non_zero, i, dc;
3547 const int esc_length= s->ac_esc_length;
3549 uint8_t * last_length;
3550 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3552 s->fdsp.fdct(block);
3554 if(s->dct_error_sum)
3555 s->denoise_dct(s, block);
3557 qadd= ((qscale-1)|1)*8;
3568 /* For AIC we skip quant/dequant of INTRADC */
3573 /* note: block[0] is assumed to be positive */
3574 block[0] = (block[0] + (q >> 1)) / q;
3577 qmat = s->q_intra_matrix[qscale];
3578 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3579 bias= 1<<(QMAT_SHIFT-1);
3580 length = s->intra_ac_vlc_length;
3581 last_length= s->intra_ac_vlc_last_length;
3585 qmat = s->q_inter_matrix[qscale];
3586 length = s->inter_ac_vlc_length;
3587 last_length= s->inter_ac_vlc_last_length;
3591 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3592 threshold2= (threshold1<<1);
3594 for(i=63; i>=start_i; i--) {
3595 const int j = scantable[i];
3596 int level = block[j] * qmat[j];
3598 if(((unsigned)(level+threshold1))>threshold2){
3604 for(i=start_i; i<=last_non_zero; i++) {
3605 const int j = scantable[i];
3606 int level = block[j] * qmat[j];
3608 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3609 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3610 if(((unsigned)(level+threshold1))>threshold2){
3612 level= (bias + level)>>QMAT_SHIFT;
3614 coeff[1][i]= level-1;
3615 // coeff[2][k]= level-2;
3617 level= (bias - level)>>QMAT_SHIFT;
3618 coeff[0][i]= -level;
3619 coeff[1][i]= -level+1;
3620 // coeff[2][k]= -level+2;
3622 coeff_count[i]= FFMIN(level, 2);
3623 assert(coeff_count[i]);
3626 coeff[0][i]= (level>>31)|1;
3631 *overflow= s->max_qcoeff < max; //overflow might have happened
3633 if(last_non_zero < start_i){
3634 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3635 return last_non_zero;
3638 score_tab[start_i]= 0;
3639 survivor[0]= start_i;
3642 for(i=start_i; i<=last_non_zero; i++){
3643 int level_index, j, zero_distortion;
3644 int dct_coeff= FFABS(block[ scantable[i] ]);
3645 int best_score=256*256*256*120;
3647 if (s->fdsp.fdct == ff_fdct_ifast)
3648 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3649 zero_distortion= dct_coeff*dct_coeff;
3651 for(level_index=0; level_index < coeff_count[i]; level_index++){
3653 int level= coeff[level_index][i];
3654 const int alevel= FFABS(level);
3659 if(s->out_format == FMT_H263){
3660 unquant_coeff= alevel*qmul + qadd;
3662 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3664 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3665 unquant_coeff = (unquant_coeff - 1) | 1;
3667 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3668 unquant_coeff = (unquant_coeff - 1) | 1;
3673 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3675 if((level&(~127)) == 0){
3676 for(j=survivor_count-1; j>=0; j--){
3677 int run= i - survivor[j];
3678 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3679 score += score_tab[i-run];
3681 if(score < best_score){
3684 level_tab[i+1]= level-64;
3688 if(s->out_format == FMT_H263){
3689 for(j=survivor_count-1; j>=0; j--){
3690 int run= i - survivor[j];
3691 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3692 score += score_tab[i-run];
3693 if(score < last_score){
3696 last_level= level-64;
3702 distortion += esc_length*lambda;
3703 for(j=survivor_count-1; j>=0; j--){
3704 int run= i - survivor[j];
3705 int score= distortion + score_tab[i-run];
3707 if(score < best_score){
3710 level_tab[i+1]= level-64;
3714 if(s->out_format == FMT_H263){
3715 for(j=survivor_count-1; j>=0; j--){
3716 int run= i - survivor[j];
3717 int score= distortion + score_tab[i-run];
3718 if(score < last_score){
3721 last_level= level-64;
3729 score_tab[i+1]= best_score;
3731 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3732 if(last_non_zero <= 27){
3733 for(; survivor_count; survivor_count--){
3734 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3738 for(; survivor_count; survivor_count--){
3739 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3744 survivor[ survivor_count++ ]= i+1;
3747 if(s->out_format != FMT_H263){
3748 last_score= 256*256*256*120;
3749 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3750 int score= score_tab[i];
3751 if(i) score += lambda*2; //FIXME exacter?
3753 if(score < last_score){
3756 last_level= level_tab[i];
3757 last_run= run_tab[i];
3762 s->coded_score[n] = last_score;
3764 dc= FFABS(block[0]);
3765 last_non_zero= last_i - 1;
3766 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3768 if(last_non_zero < start_i)
3769 return last_non_zero;
3771 if(last_non_zero == 0 && start_i == 0){
3773 int best_score= dc * dc;
3775 for(i=0; i<coeff_count[0]; i++){
3776 int level= coeff[i][0];
3777 int alevel= FFABS(level);
3778 int unquant_coeff, score, distortion;
3780 if(s->out_format == FMT_H263){
3781 unquant_coeff= (alevel*qmul + qadd)>>3;
3783 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3784 unquant_coeff = (unquant_coeff - 1) | 1;
3786 unquant_coeff = (unquant_coeff + 4) >> 3;
3787 unquant_coeff<<= 3 + 3;
3789 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3791 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3792 else score= distortion + esc_length*lambda;
3794 if(score < best_score){
3796 best_level= level - 64;
3799 block[0]= best_level;
3800 s->coded_score[n] = best_score - dc*dc;
3801 if(best_level == 0) return -1;
3802 else return last_non_zero;
3808 block[ perm_scantable[last_non_zero] ]= last_level;
3811 for(; i>start_i; i -= run_tab[i] + 1){
3812 block[ perm_scantable[i-1] ]= level_tab[i];
3815 return last_non_zero;
3818 //#define REFINE_STATS 1
3819 static int16_t basis[64][64];
3821 static void build_basis(uint8_t *perm){
3828 double s= 0.25*(1<<BASIS_SHIFT);
3830 int perm_index= perm[index];
3831 if(i==0) s*= sqrt(0.5);
3832 if(j==0) s*= sqrt(0.5);
3833 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)));
3840 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3841 int16_t *block, int16_t *weight, int16_t *orig,
3844 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3845 const uint8_t *scantable= s->intra_scantable.scantable;
3846 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3847 // unsigned int threshold1, threshold2;
3852 int qmul, qadd, start_i, last_non_zero, i, dc;
3854 uint8_t * last_length;
3856 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3859 static int after_last=0;
3860 static int to_zero=0;
3861 static int from_zero=0;
3864 static int messed_sign=0;
3867 if(basis[0][0] == 0)
3868 build_basis(s->idsp.idct_permutation);
3879 /* For AIC we skip quant/dequant of INTRADC */
3883 q <<= RECON_SHIFT-3;
3884 /* note: block[0] is assumed to be positive */
3886 // block[0] = (block[0] + (q >> 1)) / q;
3888 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3889 // bias= 1<<(QMAT_SHIFT-1);
3890 length = s->intra_ac_vlc_length;
3891 last_length= s->intra_ac_vlc_last_length;
3895 length = s->inter_ac_vlc_length;
3896 last_length= s->inter_ac_vlc_last_length;
3898 last_non_zero = s->block_last_index[n];
3903 dc += (1<<(RECON_SHIFT-1));
3904 for(i=0; i<64; i++){
3905 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3908 STOP_TIMER("memset rem[]")}
3911 for(i=0; i<64; i++){
3916 w= FFABS(weight[i]) + qns*one;
3917 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3920 // w=weight[i] = (63*qns + (w/2)) / w;
3926 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3932 for(i=start_i; i<=last_non_zero; i++){
3933 int j= perm_scantable[i];
3934 const int level= block[j];
3938 if(level<0) coeff= qmul*level - qadd;
3939 else coeff= qmul*level + qadd;
3940 run_tab[rle_index++]=run;
3943 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3949 if(last_non_zero>0){
3950 STOP_TIMER("init rem[]")
3957 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3960 int run2, best_unquant_change=0, analyze_gradient;
3964 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3966 if(analyze_gradient){
3970 for(i=0; i<64; i++){
3973 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3976 STOP_TIMER("rem*w*w")}
3986 const int level= block[0];
3987 int change, old_coeff;
3989 assert(s->mb_intra);
3993 for(change=-1; change<=1; change+=2){
3994 int new_level= level + change;
3995 int score, new_coeff;
3997 new_coeff= q*new_level;
3998 if(new_coeff >= 2048 || new_coeff < 0)
4001 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4002 new_coeff - old_coeff);
4003 if(score<best_score){
4006 best_change= change;
4007 best_unquant_change= new_coeff - old_coeff;
4014 run2= run_tab[rle_index++];
4018 for(i=start_i; i<64; i++){
4019 int j= perm_scantable[i];
4020 const int level= block[j];
4021 int change, old_coeff;
4023 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4027 if(level<0) old_coeff= qmul*level - qadd;
4028 else old_coeff= qmul*level + qadd;
4029 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4033 assert(run2>=0 || i >= last_non_zero );
4036 for(change=-1; change<=1; change+=2){
4037 int new_level= level + change;
4038 int score, new_coeff, unquant_change;
4041 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4045 if(new_level<0) new_coeff= qmul*new_level - qadd;
4046 else new_coeff= qmul*new_level + qadd;
4047 if(new_coeff >= 2048 || new_coeff <= -2048)
4049 //FIXME check for overflow
4052 if(level < 63 && level > -63){
4053 if(i < last_non_zero)
4054 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4055 - length[UNI_AC_ENC_INDEX(run, level+64)];
4057 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4058 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4061 assert(FFABS(new_level)==1);
4063 if(analyze_gradient){
4064 int g= d1[ scantable[i] ];
4065 if(g && (g^new_level) >= 0)
4069 if(i < last_non_zero){
4070 int next_i= i + run2 + 1;
4071 int next_level= block[ perm_scantable[next_i] ] + 64;
4073 if(next_level&(~127))
4076 if(next_i < last_non_zero)
4077 score += length[UNI_AC_ENC_INDEX(run, 65)]
4078 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4079 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4081 score += length[UNI_AC_ENC_INDEX(run, 65)]
4082 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4083 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4085 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4087 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4088 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4094 assert(FFABS(level)==1);
4096 if(i < last_non_zero){
4097 int next_i= i + run2 + 1;
4098 int next_level= block[ perm_scantable[next_i] ] + 64;
4100 if(next_level&(~127))
4103 if(next_i < last_non_zero)
4104 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4105 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4106 - length[UNI_AC_ENC_INDEX(run, 65)];
4108 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4109 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4110 - length[UNI_AC_ENC_INDEX(run, 65)];
4112 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4114 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4115 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4122 unquant_change= new_coeff - old_coeff;
4123 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4125 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4127 if(score<best_score){
4130 best_change= change;
4131 best_unquant_change= unquant_change;
4135 prev_level= level + 64;
4136 if(prev_level&(~127))
4145 STOP_TIMER("iterative step")}
4149 int j= perm_scantable[ best_coeff ];
4151 block[j] += best_change;
4153 if(best_coeff > last_non_zero){
4154 last_non_zero= best_coeff;
4162 if(block[j] - best_change){
4163 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4175 for(; last_non_zero>=start_i; last_non_zero--){
4176 if(block[perm_scantable[last_non_zero]])
4182 if(256*256*256*64 % count == 0){
4183 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);
4188 for(i=start_i; i<=last_non_zero; i++){
4189 int j= perm_scantable[i];
4190 const int level= block[j];
4193 run_tab[rle_index++]=run;
4200 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4206 if(last_non_zero>0){
4207 STOP_TIMER("iterative search")
4212 return last_non_zero;
4216 * Permute an 8x8 block according to permuatation.
4217 * @param block the block which will be permuted according to
4218 * the given permutation vector
4219 * @param permutation the permutation vector
4220 * @param last the last non zero coefficient in scantable order, used to
4221 * speed the permutation up
4222 * @param scantable the used scantable, this is only used to speed the
4223 * permutation up, the block is not (inverse) permutated
4224 * to scantable order!
4226 static void block_permute(int16_t *block, uint8_t *permutation,
4227 const uint8_t *scantable, int last)
4234 //FIXME it is ok but not clean and might fail for some permutations
4235 // if (permutation[1] == 1)
4238 for (i = 0; i <= last; i++) {
4239 const int j = scantable[i];
4244 for (i = 0; i <= last; i++) {
4245 const int j = scantable[i];
4246 const int perm_j = permutation[j];
4247 block[perm_j] = temp[j];
4251 int ff_dct_quantize_c(MpegEncContext *s,
4252 int16_t *block, int n,
4253 int qscale, int *overflow)
4255 int i, j, level, last_non_zero, q, start_i;
4257 const uint8_t *scantable= s->intra_scantable.scantable;
4260 unsigned int threshold1, threshold2;
4262 s->fdsp.fdct(block);
4264 if(s->dct_error_sum)
4265 s->denoise_dct(s, block);
4275 /* For AIC we skip quant/dequant of INTRADC */
4278 /* note: block[0] is assumed to be positive */
4279 block[0] = (block[0] + (q >> 1)) / q;
4282 qmat = s->q_intra_matrix[qscale];
4283 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4287 qmat = s->q_inter_matrix[qscale];
4288 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4290 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4291 threshold2= (threshold1<<1);
4292 for(i=63;i>=start_i;i--) {
4294 level = block[j] * qmat[j];
4296 if(((unsigned)(level+threshold1))>threshold2){
4303 for(i=start_i; i<=last_non_zero; i++) {
4305 level = block[j] * qmat[j];
4307 // if( bias+level >= (1<<QMAT_SHIFT)
4308 // || bias-level >= (1<<QMAT_SHIFT)){
4309 if(((unsigned)(level+threshold1))>threshold2){
4311 level= (bias + level)>>QMAT_SHIFT;
4314 level= (bias - level)>>QMAT_SHIFT;
4322 *overflow= s->max_qcoeff < max; //overflow might have happened
4324 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4325 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4326 block_permute(block, s->idsp.idct_permutation,
4327 scantable, last_non_zero);
4329 return last_non_zero;
4332 #define OFFSET(x) offsetof(MpegEncContext, x)
4333 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4334 static const AVOption h263_options[] = {
4335 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4336 { "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},
4337 { "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 },
4342 static const AVClass h263_class = {
4343 .class_name = "H.263 encoder",
4344 .item_name = av_default_item_name,
4345 .option = h263_options,
4346 .version = LIBAVUTIL_VERSION_INT,
4349 AVCodec ff_h263_encoder = {
4351 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4352 .type = AVMEDIA_TYPE_VIDEO,
4353 .id = AV_CODEC_ID_H263,
4354 .priv_data_size = sizeof(MpegEncContext),
4355 .init = ff_mpv_encode_init,
4356 .encode2 = ff_mpv_encode_picture,
4357 .close = ff_mpv_encode_end,
4358 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4359 .priv_class = &h263_class,
4362 static const AVOption h263p_options[] = {
4363 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4364 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4365 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4366 { "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},
4370 static const AVClass h263p_class = {
4371 .class_name = "H.263p encoder",
4372 .item_name = av_default_item_name,
4373 .option = h263p_options,
4374 .version = LIBAVUTIL_VERSION_INT,
4377 AVCodec ff_h263p_encoder = {
4379 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4380 .type = AVMEDIA_TYPE_VIDEO,
4381 .id = AV_CODEC_ID_H263P,
4382 .priv_data_size = sizeof(MpegEncContext),
4383 .init = ff_mpv_encode_init,
4384 .encode2 = ff_mpv_encode_picture,
4385 .close = ff_mpv_encode_end,
4386 .capabilities = CODEC_CAP_SLICE_THREADS,
4387 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4388 .priv_class = &h263p_class,
4391 static const AVClass msmpeg4v2_class = {
4392 .class_name = "msmpeg4v2 encoder",
4393 .item_name = av_default_item_name,
4394 .option = ff_mpv_generic_options,
4395 .version = LIBAVUTIL_VERSION_INT,
4398 AVCodec ff_msmpeg4v2_encoder = {
4399 .name = "msmpeg4v2",
4400 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4401 .type = AVMEDIA_TYPE_VIDEO,
4402 .id = AV_CODEC_ID_MSMPEG4V2,
4403 .priv_data_size = sizeof(MpegEncContext),
4404 .init = ff_mpv_encode_init,
4405 .encode2 = ff_mpv_encode_picture,
4406 .close = ff_mpv_encode_end,
4407 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4408 .priv_class = &msmpeg4v2_class,
4411 static const AVClass msmpeg4v3_class = {
4412 .class_name = "msmpeg4v3 encoder",
4413 .item_name = av_default_item_name,
4414 .option = ff_mpv_generic_options,
4415 .version = LIBAVUTIL_VERSION_INT,
4418 AVCodec ff_msmpeg4v3_encoder = {
4420 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4421 .type = AVMEDIA_TYPE_VIDEO,
4422 .id = AV_CODEC_ID_MSMPEG4V3,
4423 .priv_data_size = sizeof(MpegEncContext),
4424 .init = ff_mpv_encode_init,
4425 .encode2 = ff_mpv_encode_picture,
4426 .close = ff_mpv_encode_end,
4427 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4428 .priv_class = &msmpeg4v3_class,
4431 static const AVClass wmv1_class = {
4432 .class_name = "wmv1 encoder",
4433 .item_name = av_default_item_name,
4434 .option = ff_mpv_generic_options,
4435 .version = LIBAVUTIL_VERSION_INT,
4438 AVCodec ff_wmv1_encoder = {
4440 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4441 .type = AVMEDIA_TYPE_VIDEO,
4442 .id = AV_CODEC_ID_WMV1,
4443 .priv_data_size = sizeof(MpegEncContext),
4444 .init = ff_mpv_encode_init,
4445 .encode2 = ff_mpv_encode_picture,
4446 .close = ff_mpv_encode_end,
4447 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4448 .priv_class = &wmv1_class,