2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of Libav.
10 * Libav is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * Libav is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "libavutil/internal.h"
33 #include "libavutil/intmath.h"
34 #include "libavutil/mathematics.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/timer.h"
42 #include "mpegvideo.h"
43 #include "mpegvideodata.h"
47 #include "mjpegenc_common.h"
49 #include "mpegutils.h"
52 #include "pixblockdsp.h"
56 #include "aandcttab.h"
58 #include "mpeg4video.h"
60 #include "bytestream.h"
65 #define QUANT_BIAS_SHIFT 8
67 #define QMAT_SHIFT_MMX 16
70 static int encode_picture(MpegEncContext *s, int picture_number);
71 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
72 static int sse_mb(MpegEncContext *s);
73 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
74 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
76 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
77 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
79 const AVOption ff_mpv_generic_options[] = {
84 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
85 uint16_t (*qmat16)[2][64],
86 const uint16_t *quant_matrix,
87 int bias, int qmin, int qmax, int intra)
89 FDCTDSPContext *fdsp = &s->fdsp;
93 for (qscale = qmin; qscale <= qmax; qscale++) {
95 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
97 fdsp->fdct == ff_faandct ||
98 #endif /* CONFIG_FAANDCT */
99 fdsp->fdct == ff_jpeg_fdct_islow_10) {
100 for (i = 0; i < 64; i++) {
101 const int j = s->idsp.idct_permutation[i];
102 int64_t den = (int64_t) qscale * quant_matrix[j];
103 /* 16 <= qscale * quant_matrix[i] <= 7905
104 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
105 * 19952 <= x <= 249205026
106 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
107 * 3444240 >= (1 << 36) / (x) >= 275 */
109 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
111 } else if (fdsp->fdct == ff_fdct_ifast) {
112 for (i = 0; i < 64; i++) {
113 const int j = s->idsp.idct_permutation[i];
114 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
115 /* 16 <= qscale * quant_matrix[i] <= 7905
116 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
117 * 19952 <= x <= 249205026
118 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
119 * 3444240 >= (1 << 36) / (x) >= 275 */
121 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
124 for (i = 0; i < 64; i++) {
125 const int j = s->idsp.idct_permutation[i];
126 int64_t den = (int64_t) qscale * quant_matrix[j];
127 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
128 * Assume x = qscale * quant_matrix[i]
130 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
131 * so 32768 >= (1 << 19) / (x) >= 67 */
132 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
133 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
134 // (qscale * quant_matrix[i]);
135 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
137 if (qmat16[qscale][0][i] == 0 ||
138 qmat16[qscale][0][i] == 128 * 256)
139 qmat16[qscale][0][i] = 128 * 256 - 1;
140 qmat16[qscale][1][i] =
141 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
142 qmat16[qscale][0][i]);
146 for (i = intra; i < 64; i++) {
148 if (fdsp->fdct == ff_fdct_ifast) {
149 max = (8191LL * ff_aanscales[i]) >> 14;
151 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
157 av_log(NULL, AV_LOG_INFO,
158 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
163 static inline void update_qscale(MpegEncContext *s)
165 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
166 (FF_LAMBDA_SHIFT + 7);
167 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
169 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
173 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
179 for (i = 0; i < 64; i++) {
180 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
187 * init s->current_picture.qscale_table from s->lambda_table
189 void ff_init_qscale_tab(MpegEncContext *s)
191 int8_t * const qscale_table = s->current_picture.qscale_table;
194 for (i = 0; i < s->mb_num; i++) {
195 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
196 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
197 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
202 static void update_duplicate_context_after_me(MpegEncContext *dst,
205 #define COPY(a) dst->a= src->a
207 COPY(current_picture);
213 COPY(picture_in_gop_number);
214 COPY(gop_picture_number);
215 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
216 COPY(progressive_frame); // FIXME don't set in encode_header
217 COPY(partitioned_frame); // FIXME don't set in encode_header
222 * Set the given MpegEncContext to defaults for encoding.
223 * the changed fields will not depend upon the prior state of the MpegEncContext.
225 static void mpv_encode_defaults(MpegEncContext *s)
228 ff_mpv_common_defaults(s);
230 for (i = -16; i < 16; i++) {
231 default_fcode_tab[i + MAX_MV] = 1;
233 s->me.mv_penalty = default_mv_penalty;
234 s->fcode_tab = default_fcode_tab;
236 s->input_picture_number = 0;
237 s->picture_in_gop_number = 0;
240 /* init video encoder */
241 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
243 MpegEncContext *s = avctx->priv_data;
244 AVCPBProperties *cpb_props;
245 int i, ret, format_supported;
247 mpv_encode_defaults(s);
249 switch (avctx->codec_id) {
250 case AV_CODEC_ID_MPEG2VIDEO:
251 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
252 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
253 av_log(avctx, AV_LOG_ERROR,
254 "only YUV420 and YUV422 are supported\n");
258 case AV_CODEC_ID_MJPEG:
259 format_supported = 0;
260 /* JPEG color space */
261 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
262 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
263 (avctx->color_range == AVCOL_RANGE_JPEG &&
264 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
265 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
266 format_supported = 1;
267 /* MPEG color space */
268 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
269 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
270 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
271 format_supported = 1;
273 if (!format_supported) {
274 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
279 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
280 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
285 switch (avctx->pix_fmt) {
286 case AV_PIX_FMT_YUVJ422P:
287 case AV_PIX_FMT_YUV422P:
288 s->chroma_format = CHROMA_422;
290 case AV_PIX_FMT_YUVJ420P:
291 case AV_PIX_FMT_YUV420P:
293 s->chroma_format = CHROMA_420;
297 s->bit_rate = avctx->bit_rate;
298 s->width = avctx->width;
299 s->height = avctx->height;
300 if (avctx->gop_size > 600 &&
301 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
302 av_log(avctx, AV_LOG_ERROR,
303 "Warning keyframe interval too large! reducing it ...\n");
304 avctx->gop_size = 600;
306 s->gop_size = avctx->gop_size;
308 if (avctx->max_b_frames > MAX_B_FRAMES) {
309 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
310 "is %d.\n", MAX_B_FRAMES);
312 s->max_b_frames = avctx->max_b_frames;
313 s->codec_id = avctx->codec->id;
314 s->strict_std_compliance = avctx->strict_std_compliance;
315 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
316 s->mpeg_quant = avctx->mpeg_quant;
317 s->rtp_mode = !!avctx->rtp_payload_size;
318 s->intra_dc_precision = avctx->intra_dc_precision;
319 s->user_specified_pts = AV_NOPTS_VALUE;
321 if (s->gop_size <= 1) {
328 #if FF_API_MOTION_EST
329 FF_DISABLE_DEPRECATION_WARNINGS
330 s->me_method = avctx->me_method;
331 FF_ENABLE_DEPRECATION_WARNINGS
335 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
338 FF_DISABLE_DEPRECATION_WARNINGS
339 if (avctx->border_masking != 0.0)
340 s->border_masking = avctx->border_masking;
341 FF_ENABLE_DEPRECATION_WARNINGS
344 s->adaptive_quant = (s->avctx->lumi_masking ||
345 s->avctx->dark_masking ||
346 s->avctx->temporal_cplx_masking ||
347 s->avctx->spatial_cplx_masking ||
348 s->avctx->p_masking ||
350 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
353 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
355 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
356 av_log(avctx, AV_LOG_ERROR,
357 "a vbv buffer size is needed, "
358 "for encoding with a maximum bitrate\n");
362 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
363 av_log(avctx, AV_LOG_INFO,
364 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
367 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
368 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
372 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
373 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
377 if (avctx->rc_max_rate &&
378 avctx->rc_max_rate == avctx->bit_rate &&
379 avctx->rc_max_rate != avctx->rc_min_rate) {
380 av_log(avctx, AV_LOG_INFO,
381 "impossible bitrate constraints, this will fail\n");
384 if (avctx->rc_buffer_size &&
385 avctx->bit_rate * (int64_t)avctx->time_base.num >
386 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
387 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
391 if (!s->fixed_qscale &&
392 avctx->bit_rate * av_q2d(avctx->time_base) >
393 avctx->bit_rate_tolerance) {
394 av_log(avctx, AV_LOG_ERROR,
395 "bitrate tolerance too small for bitrate\n");
399 if (s->avctx->rc_max_rate &&
400 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
401 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
402 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
403 90000LL * (avctx->rc_buffer_size - 1) >
404 s->avctx->rc_max_rate * 0xFFFFLL) {
405 av_log(avctx, AV_LOG_INFO,
406 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
407 "specified vbv buffer is too large for the given bitrate!\n");
410 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
411 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
412 s->codec_id != AV_CODEC_ID_FLV1) {
413 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
417 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
418 av_log(avctx, AV_LOG_ERROR,
419 "OBMC is only supported with simple mb decision\n");
423 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
424 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
428 if (s->max_b_frames &&
429 s->codec_id != AV_CODEC_ID_MPEG4 &&
430 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
431 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
432 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
436 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
437 s->codec_id == AV_CODEC_ID_H263 ||
438 s->codec_id == AV_CODEC_ID_H263P) &&
439 (avctx->sample_aspect_ratio.num > 255 ||
440 avctx->sample_aspect_ratio.den > 255)) {
441 av_log(avctx, AV_LOG_ERROR,
442 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
443 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
447 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
448 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
449 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
453 // FIXME mpeg2 uses that too
454 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
455 av_log(avctx, AV_LOG_ERROR,
456 "mpeg2 style quantization not supported by codec\n");
460 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
461 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
465 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
466 s->avctx->mb_decision != FF_MB_DECISION_RD) {
467 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
471 if (s->avctx->scenechange_threshold < 1000000000 &&
472 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
473 av_log(avctx, AV_LOG_ERROR,
474 "closed gop with scene change detection are not supported yet, "
475 "set threshold to 1000000000\n");
479 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
480 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
481 av_log(avctx, AV_LOG_ERROR,
482 "low delay forcing is only available for mpeg2\n");
485 if (s->max_b_frames != 0) {
486 av_log(avctx, AV_LOG_ERROR,
487 "b frames cannot be used with low delay\n");
492 if (s->q_scale_type == 1) {
493 if (avctx->qmax > 12) {
494 av_log(avctx, AV_LOG_ERROR,
495 "non linear quant only supports qmax <= 12 currently\n");
500 if (avctx->slices > 1 &&
501 (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
502 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
503 return AVERROR(EINVAL);
506 if (s->avctx->thread_count > 1 &&
507 s->codec_id != AV_CODEC_ID_MPEG4 &&
508 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
509 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
510 (s->codec_id != AV_CODEC_ID_H263P)) {
511 av_log(avctx, AV_LOG_ERROR,
512 "multi threaded encoding not supported by codec\n");
516 if (s->avctx->thread_count < 1) {
517 av_log(avctx, AV_LOG_ERROR,
518 "automatic thread number detection not supported by codec,"
523 if (!avctx->time_base.den || !avctx->time_base.num) {
524 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
528 if (avctx->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
529 av_log(avctx, AV_LOG_INFO,
530 "notice: b_frame_strategy only affects the first pass\n");
531 avctx->b_frame_strategy = 0;
534 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
536 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
537 avctx->time_base.den /= i;
538 avctx->time_base.num /= i;
542 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
543 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
544 // (a + x * 3 / 8) / x
545 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
546 s->inter_quant_bias = 0;
548 s->intra_quant_bias = 0;
550 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
553 #if FF_API_QUANT_BIAS
554 FF_DISABLE_DEPRECATION_WARNINGS
555 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
556 s->intra_quant_bias = avctx->intra_quant_bias;
557 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
558 s->inter_quant_bias = avctx->inter_quant_bias;
559 FF_ENABLE_DEPRECATION_WARNINGS
562 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
563 s->avctx->time_base.den > (1 << 16) - 1) {
564 av_log(avctx, AV_LOG_ERROR,
565 "timebase %d/%d not supported by MPEG 4 standard, "
566 "the maximum admitted value for the timebase denominator "
567 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
571 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
573 switch (avctx->codec->id) {
574 case AV_CODEC_ID_MPEG1VIDEO:
575 s->out_format = FMT_MPEG1;
576 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
577 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
579 case AV_CODEC_ID_MPEG2VIDEO:
580 s->out_format = FMT_MPEG1;
581 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
582 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
585 case AV_CODEC_ID_MJPEG:
586 s->out_format = FMT_MJPEG;
587 s->intra_only = 1; /* force intra only for jpeg */
588 if (!CONFIG_MJPEG_ENCODER ||
589 ff_mjpeg_encode_init(s) < 0)
594 case AV_CODEC_ID_H261:
595 if (!CONFIG_H261_ENCODER)
597 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
598 av_log(avctx, AV_LOG_ERROR,
599 "The specified picture size of %dx%d is not valid for the "
600 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
601 s->width, s->height);
604 s->out_format = FMT_H261;
607 s->rtp_mode = 0; /* Sliced encoding not supported */
609 case AV_CODEC_ID_H263:
610 if (!CONFIG_H263_ENCODER)
612 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
613 s->width, s->height) == 8) {
614 av_log(avctx, AV_LOG_INFO,
615 "The specified picture size of %dx%d is not valid for "
616 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
617 "352x288, 704x576, and 1408x1152."
618 "Try H.263+.\n", s->width, s->height);
621 s->out_format = FMT_H263;
625 case AV_CODEC_ID_H263P:
626 s->out_format = FMT_H263;
629 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
630 s->modified_quant = s->h263_aic;
631 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
632 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
635 /* These are just to be sure */
639 case AV_CODEC_ID_FLV1:
640 s->out_format = FMT_H263;
641 s->h263_flv = 2; /* format = 1; 11-bit codes */
642 s->unrestricted_mv = 1;
643 s->rtp_mode = 0; /* don't allow GOB */
647 case AV_CODEC_ID_RV10:
648 s->out_format = FMT_H263;
652 case AV_CODEC_ID_RV20:
653 s->out_format = FMT_H263;
656 s->modified_quant = 1;
660 s->unrestricted_mv = 0;
662 case AV_CODEC_ID_MPEG4:
663 s->out_format = FMT_H263;
665 s->unrestricted_mv = 1;
666 s->low_delay = s->max_b_frames ? 0 : 1;
667 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
669 case AV_CODEC_ID_MSMPEG4V2:
670 s->out_format = FMT_H263;
672 s->unrestricted_mv = 1;
673 s->msmpeg4_version = 2;
677 case AV_CODEC_ID_MSMPEG4V3:
678 s->out_format = FMT_H263;
680 s->unrestricted_mv = 1;
681 s->msmpeg4_version = 3;
682 s->flipflop_rounding = 1;
686 case AV_CODEC_ID_WMV1:
687 s->out_format = FMT_H263;
689 s->unrestricted_mv = 1;
690 s->msmpeg4_version = 4;
691 s->flipflop_rounding = 1;
695 case AV_CODEC_ID_WMV2:
696 s->out_format = FMT_H263;
698 s->unrestricted_mv = 1;
699 s->msmpeg4_version = 5;
700 s->flipflop_rounding = 1;
708 avctx->has_b_frames = !s->low_delay;
712 s->progressive_frame =
713 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
714 AV_CODEC_FLAG_INTERLACED_ME) ||
719 if (ff_mpv_common_init(s) < 0)
723 ff_mpv_encode_init_x86(s);
725 ff_fdctdsp_init(&s->fdsp, avctx);
726 ff_me_cmp_init(&s->mecc, avctx);
727 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
728 ff_pixblockdsp_init(&s->pdsp, avctx);
729 ff_qpeldsp_init(&s->qdsp);
731 if (s->msmpeg4_version) {
732 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
733 2 * 2 * (MAX_LEVEL + 1) *
734 (MAX_RUN + 1) * 2 * sizeof(int), fail);
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
738 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
739 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
740 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
741 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
742 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
743 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
744 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
745 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
747 if (s->avctx->noise_reduction) {
748 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
749 2 * 64 * sizeof(uint16_t), fail);
752 if (CONFIG_H263_ENCODER)
753 ff_h263dsp_init(&s->h263dsp);
754 if (!s->dct_quantize)
755 s->dct_quantize = ff_dct_quantize_c;
757 s->denoise_dct = denoise_dct_c;
758 s->fast_dct_quantize = s->dct_quantize;
760 s->dct_quantize = dct_quantize_trellis_c;
762 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
763 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
765 if (s->slice_context_count > 1) {
768 if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P)
769 s->h263_slice_structured = 1;
772 s->quant_precision = 5;
774 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
775 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
777 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
778 ff_h261_encode_init(s);
779 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
780 ff_h263_encode_init(s);
781 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
782 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
784 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
785 && s->out_format == FMT_MPEG1)
786 ff_mpeg1_encode_init(s);
789 for (i = 0; i < 64; i++) {
790 int j = s->idsp.idct_permutation[i];
791 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
793 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
794 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
795 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
797 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
800 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
801 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
803 if (s->avctx->intra_matrix)
804 s->intra_matrix[j] = s->avctx->intra_matrix[i];
805 if (s->avctx->inter_matrix)
806 s->inter_matrix[j] = s->avctx->inter_matrix[i];
809 /* precompute matrix */
810 /* for mjpeg, we do include qscale in the matrix */
811 if (s->out_format != FMT_MJPEG) {
812 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
813 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
815 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
816 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
820 if (ff_rate_control_init(s) < 0)
823 #if FF_API_ERROR_RATE
824 FF_DISABLE_DEPRECATION_WARNINGS
825 if (avctx->error_rate)
826 s->error_rate = avctx->error_rate;
827 FF_ENABLE_DEPRECATION_WARNINGS;
830 #if FF_API_NORMALIZE_AQP
831 FF_DISABLE_DEPRECATION_WARNINGS
832 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
833 s->mpv_flags |= FF_MPV_FLAG_NAQ;
834 FF_ENABLE_DEPRECATION_WARNINGS;
838 FF_DISABLE_DEPRECATION_WARNINGS
839 if (avctx->flags & CODEC_FLAG_MV0)
840 s->mpv_flags |= FF_MPV_FLAG_MV0;
841 FF_ENABLE_DEPRECATION_WARNINGS
845 FF_DISABLE_DEPRECATION_WARNINGS
846 if (avctx->rc_qsquish != 0.0)
847 s->rc_qsquish = avctx->rc_qsquish;
848 if (avctx->rc_qmod_amp != 0.0)
849 s->rc_qmod_amp = avctx->rc_qmod_amp;
850 if (avctx->rc_qmod_freq)
851 s->rc_qmod_freq = avctx->rc_qmod_freq;
852 if (avctx->rc_buffer_aggressivity != 1.0)
853 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
854 if (avctx->rc_initial_cplx != 0.0)
855 s->rc_initial_cplx = avctx->rc_initial_cplx;
857 s->lmin = avctx->lmin;
859 s->lmax = avctx->lmax;
863 s->rc_eq = av_strdup(avctx->rc_eq);
865 return AVERROR(ENOMEM);
867 FF_ENABLE_DEPRECATION_WARNINGS
870 if (avctx->b_frame_strategy == 2) {
871 for (i = 0; i < s->max_b_frames + 2; i++) {
872 s->tmp_frames[i] = av_frame_alloc();
873 if (!s->tmp_frames[i])
874 return AVERROR(ENOMEM);
876 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
877 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
878 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
880 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
886 cpb_props = ff_add_cpb_side_data(avctx);
888 return AVERROR(ENOMEM);
889 cpb_props->max_bitrate = avctx->rc_max_rate;
890 cpb_props->min_bitrate = avctx->rc_min_rate;
891 cpb_props->avg_bitrate = avctx->bit_rate;
892 cpb_props->buffer_size = avctx->rc_buffer_size;
896 ff_mpv_encode_end(avctx);
897 return AVERROR_UNKNOWN;
900 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
902 MpegEncContext *s = avctx->priv_data;
905 ff_rate_control_uninit(s);
907 ff_mpv_common_end(s);
908 if (CONFIG_MJPEG_ENCODER &&
909 s->out_format == FMT_MJPEG)
910 ff_mjpeg_encode_close(s);
912 av_freep(&avctx->extradata);
914 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
915 av_frame_free(&s->tmp_frames[i]);
917 ff_free_picture_tables(&s->new_picture);
918 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
920 av_freep(&s->avctx->stats_out);
921 av_freep(&s->ac_stats);
923 av_freep(&s->q_intra_matrix);
924 av_freep(&s->q_inter_matrix);
925 av_freep(&s->q_intra_matrix16);
926 av_freep(&s->q_inter_matrix16);
927 av_freep(&s->input_picture);
928 av_freep(&s->reordered_input_picture);
929 av_freep(&s->dct_offset);
934 static int get_sae(uint8_t *src, int ref, int stride)
939 for (y = 0; y < 16; y++) {
940 for (x = 0; x < 16; x++) {
941 acc += FFABS(src[x + y * stride] - ref);
948 static int get_intra_count(MpegEncContext *s, uint8_t *src,
949 uint8_t *ref, int stride)
957 for (y = 0; y < h; y += 16) {
958 for (x = 0; x < w; x += 16) {
959 int offset = x + y * stride;
960 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
962 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
963 int sae = get_sae(src + offset, mean, stride);
965 acc += sae + 500 < sad;
971 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
973 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
974 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
975 s->mb_stride, s->mb_height, s->b8_stride,
976 &s->linesize, &s->uvlinesize);
979 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
983 int i, display_picture_number = 0, ret;
984 int encoding_delay = s->max_b_frames ? s->max_b_frames
985 : (s->low_delay ? 0 : 1);
986 int flush_offset = 1;
991 display_picture_number = s->input_picture_number++;
993 if (pts != AV_NOPTS_VALUE) {
994 if (s->user_specified_pts != AV_NOPTS_VALUE) {
996 int64_t last = s->user_specified_pts;
999 av_log(s->avctx, AV_LOG_ERROR,
1000 "Error, Invalid timestamp=%"PRId64", "
1001 "last=%"PRId64"\n", pts, s->user_specified_pts);
1005 if (!s->low_delay && display_picture_number == 1)
1006 s->dts_delta = time - last;
1008 s->user_specified_pts = pts;
1010 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1011 s->user_specified_pts =
1012 pts = s->user_specified_pts + 1;
1013 av_log(s->avctx, AV_LOG_INFO,
1014 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1017 pts = display_picture_number;
1021 if (!pic_arg->buf[0] ||
1022 pic_arg->linesize[0] != s->linesize ||
1023 pic_arg->linesize[1] != s->uvlinesize ||
1024 pic_arg->linesize[2] != s->uvlinesize)
1026 if ((s->width & 15) || (s->height & 15))
1029 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1030 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1032 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1036 pic = &s->picture[i];
1040 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1043 ret = alloc_picture(s, pic, direct);
1048 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1049 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1050 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1053 int h_chroma_shift, v_chroma_shift;
1054 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1058 for (i = 0; i < 3; i++) {
1059 int src_stride = pic_arg->linesize[i];
1060 int dst_stride = i ? s->uvlinesize : s->linesize;
1061 int h_shift = i ? h_chroma_shift : 0;
1062 int v_shift = i ? v_chroma_shift : 0;
1063 int w = s->width >> h_shift;
1064 int h = s->height >> v_shift;
1065 uint8_t *src = pic_arg->data[i];
1066 uint8_t *dst = pic->f->data[i];
1068 if (!s->avctx->rc_buffer_size)
1069 dst += INPLACE_OFFSET;
1071 if (src_stride == dst_stride)
1072 memcpy(dst, src, src_stride * h);
1075 uint8_t *dst2 = dst;
1077 memcpy(dst2, src, w);
1082 if ((s->width & 15) || (s->height & 15)) {
1083 s->mpvencdsp.draw_edges(dst, dst_stride,
1092 ret = av_frame_copy_props(pic->f, pic_arg);
1096 pic->f->display_picture_number = display_picture_number;
1097 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1099 /* Flushing: When we have not received enough input frames,
1100 * ensure s->input_picture[0] contains the first picture */
1101 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1102 if (s->input_picture[flush_offset])
1105 if (flush_offset <= 1)
1108 encoding_delay = encoding_delay - flush_offset + 1;
1111 /* shift buffer entries */
1112 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1113 s->input_picture[i - flush_offset] = s->input_picture[i];
1115 s->input_picture[encoding_delay] = (Picture*) pic;
1120 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1124 int64_t score64 = 0;
1126 for (plane = 0; plane < 3; plane++) {
1127 const int stride = p->f->linesize[plane];
1128 const int bw = plane ? 1 : 2;
1129 for (y = 0; y < s->mb_height * bw; y++) {
1130 for (x = 0; x < s->mb_width * bw; x++) {
1131 int off = p->shared ? 0 : 16;
1132 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1133 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1134 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1136 switch (s->avctx->frame_skip_exp) {
1137 case 0: score = FFMAX(score, v); break;
1138 case 1: score += FFABS(v); break;
1139 case 2: score += v * v; break;
1140 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1141 case 4: score64 += v * v * (int64_t)(v * v); break;
1150 if (score64 < s->avctx->frame_skip_threshold)
1152 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1157 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1159 AVPacket pkt = { 0 };
1160 int ret, got_output;
1162 av_init_packet(&pkt);
1163 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1168 av_packet_unref(&pkt);
1172 static int estimate_best_b_count(MpegEncContext *s)
1174 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1175 AVCodecContext *c = avcodec_alloc_context3(NULL);
1176 const int scale = s->avctx->brd_scale;
1177 int i, j, out_size, p_lambda, b_lambda, lambda2;
1178 int64_t best_rd = INT64_MAX;
1179 int best_b_count = -1;
1182 return AVERROR(ENOMEM);
1183 assert(scale >= 0 && scale <= 3);
1186 //s->next_picture_ptr->quality;
1187 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1188 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1189 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1190 if (!b_lambda) // FIXME we should do this somewhere else
1191 b_lambda = p_lambda;
1192 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1195 c->width = s->width >> scale;
1196 c->height = s->height >> scale;
1197 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1198 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1199 c->mb_decision = s->avctx->mb_decision;
1200 c->me_cmp = s->avctx->me_cmp;
1201 c->mb_cmp = s->avctx->mb_cmp;
1202 c->me_sub_cmp = s->avctx->me_sub_cmp;
1203 c->pix_fmt = AV_PIX_FMT_YUV420P;
1204 c->time_base = s->avctx->time_base;
1205 c->max_b_frames = s->max_b_frames;
1207 if (avcodec_open2(c, codec, NULL) < 0)
1210 for (i = 0; i < s->max_b_frames + 2; i++) {
1211 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1212 s->next_picture_ptr;
1214 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1215 pre_input = *pre_input_ptr;
1217 if (!pre_input.shared && i) {
1218 pre_input.f->data[0] += INPLACE_OFFSET;
1219 pre_input.f->data[1] += INPLACE_OFFSET;
1220 pre_input.f->data[2] += INPLACE_OFFSET;
1223 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1224 s->tmp_frames[i]->linesize[0],
1225 pre_input.f->data[0],
1226 pre_input.f->linesize[0],
1227 c->width, c->height);
1228 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1229 s->tmp_frames[i]->linesize[1],
1230 pre_input.f->data[1],
1231 pre_input.f->linesize[1],
1232 c->width >> 1, c->height >> 1);
1233 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1234 s->tmp_frames[i]->linesize[2],
1235 pre_input.f->data[2],
1236 pre_input.f->linesize[2],
1237 c->width >> 1, c->height >> 1);
1241 for (j = 0; j < s->max_b_frames + 1; j++) {
1244 if (!s->input_picture[j])
1247 c->error[0] = c->error[1] = c->error[2] = 0;
1249 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1250 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1252 out_size = encode_frame(c, s->tmp_frames[0]);
1254 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1256 for (i = 0; i < s->max_b_frames + 1; i++) {
1257 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1259 s->tmp_frames[i + 1]->pict_type = is_p ?
1260 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1261 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1263 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1265 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1268 /* get the delayed frames */
1270 out_size = encode_frame(c, NULL);
1271 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1274 rd += c->error[0] + c->error[1] + c->error[2];
1285 return best_b_count;
1288 static int select_input_picture(MpegEncContext *s)
1292 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1293 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1294 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1296 /* set next picture type & ordering */
1297 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1298 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1299 !s->next_picture_ptr || s->intra_only) {
1300 s->reordered_input_picture[0] = s->input_picture[0];
1301 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1302 s->reordered_input_picture[0]->f->coded_picture_number =
1303 s->coded_picture_number++;
1307 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1308 if (s->picture_in_gop_number < s->gop_size &&
1309 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1310 // FIXME check that te gop check above is +-1 correct
1311 av_frame_unref(s->input_picture[0]->f);
1314 ff_vbv_update(s, 0);
1320 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1321 for (i = 0; i < s->max_b_frames + 1; i++) {
1322 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1324 if (pict_num >= s->rc_context.num_entries)
1326 if (!s->input_picture[i]) {
1327 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1331 s->input_picture[i]->f->pict_type =
1332 s->rc_context.entry[pict_num].new_pict_type;
1336 if (s->avctx->b_frame_strategy == 0) {
1337 b_frames = s->max_b_frames;
1338 while (b_frames && !s->input_picture[b_frames])
1340 } else if (s->avctx->b_frame_strategy == 1) {
1341 for (i = 1; i < s->max_b_frames + 1; i++) {
1342 if (s->input_picture[i] &&
1343 s->input_picture[i]->b_frame_score == 0) {
1344 s->input_picture[i]->b_frame_score =
1346 s->input_picture[i ]->f->data[0],
1347 s->input_picture[i - 1]->f->data[0],
1351 for (i = 0; i < s->max_b_frames + 1; i++) {
1352 if (!s->input_picture[i] ||
1353 s->input_picture[i]->b_frame_score - 1 >
1354 s->mb_num / s->avctx->b_sensitivity)
1358 b_frames = FFMAX(0, i - 1);
1361 for (i = 0; i < b_frames + 1; i++) {
1362 s->input_picture[i]->b_frame_score = 0;
1364 } else if (s->avctx->b_frame_strategy == 2) {
1365 b_frames = estimate_best_b_count(s);
1367 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1373 for (i = b_frames - 1; i >= 0; i--) {
1374 int type = s->input_picture[i]->f->pict_type;
1375 if (type && type != AV_PICTURE_TYPE_B)
1378 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1379 b_frames == s->max_b_frames) {
1380 av_log(s->avctx, AV_LOG_ERROR,
1381 "warning, too many b frames in a row\n");
1384 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1385 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1386 s->gop_size > s->picture_in_gop_number) {
1387 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1389 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1391 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1395 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1396 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1399 s->reordered_input_picture[0] = s->input_picture[b_frames];
1400 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1401 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1402 s->reordered_input_picture[0]->f->coded_picture_number =
1403 s->coded_picture_number++;
1404 for (i = 0; i < b_frames; i++) {
1405 s->reordered_input_picture[i + 1] = s->input_picture[i];
1406 s->reordered_input_picture[i + 1]->f->pict_type =
1408 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1409 s->coded_picture_number++;
1414 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1416 if (s->reordered_input_picture[0]) {
1417 s->reordered_input_picture[0]->reference =
1418 s->reordered_input_picture[0]->f->pict_type !=
1419 AV_PICTURE_TYPE_B ? 3 : 0;
1421 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1424 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1425 // input is a shared pix, so we can't modifiy it -> alloc a new
1426 // one & ensure that the shared one is reuseable
1429 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1432 pic = &s->picture[i];
1434 pic->reference = s->reordered_input_picture[0]->reference;
1435 if (alloc_picture(s, pic, 0) < 0) {
1439 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1443 /* mark us unused / free shared pic */
1444 av_frame_unref(s->reordered_input_picture[0]->f);
1445 s->reordered_input_picture[0]->shared = 0;
1447 s->current_picture_ptr = pic;
1449 // input is not a shared pix -> reuse buffer for current_pix
1450 s->current_picture_ptr = s->reordered_input_picture[0];
1451 for (i = 0; i < 4; i++) {
1452 s->new_picture.f->data[i] += INPLACE_OFFSET;
1455 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1456 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1457 s->current_picture_ptr)) < 0)
1460 s->picture_number = s->new_picture.f->display_picture_number;
1465 static void frame_end(MpegEncContext *s)
1469 if (s->unrestricted_mv &&
1470 s->current_picture.reference &&
1472 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1473 int hshift = desc->log2_chroma_w;
1474 int vshift = desc->log2_chroma_h;
1475 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1476 s->h_edge_pos, s->v_edge_pos,
1477 EDGE_WIDTH, EDGE_WIDTH,
1478 EDGE_TOP | EDGE_BOTTOM);
1479 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1480 s->h_edge_pos >> hshift,
1481 s->v_edge_pos >> vshift,
1482 EDGE_WIDTH >> hshift,
1483 EDGE_WIDTH >> vshift,
1484 EDGE_TOP | EDGE_BOTTOM);
1485 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1486 s->h_edge_pos >> hshift,
1487 s->v_edge_pos >> vshift,
1488 EDGE_WIDTH >> hshift,
1489 EDGE_WIDTH >> vshift,
1490 EDGE_TOP | EDGE_BOTTOM);
1495 s->last_pict_type = s->pict_type;
1496 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1497 if (s->pict_type!= AV_PICTURE_TYPE_B)
1498 s->last_non_b_pict_type = s->pict_type;
1501 /* release non-reference frames */
1502 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1503 if (!s->picture[i].reference)
1504 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1508 #if FF_API_CODED_FRAME
1509 FF_DISABLE_DEPRECATION_WARNINGS
1510 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1511 FF_ENABLE_DEPRECATION_WARNINGS
1513 #if FF_API_ERROR_FRAME
1514 FF_DISABLE_DEPRECATION_WARNINGS
1515 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1516 sizeof(s->current_picture.encoding_error));
1517 FF_ENABLE_DEPRECATION_WARNINGS
1521 static void update_noise_reduction(MpegEncContext *s)
1525 for (intra = 0; intra < 2; intra++) {
1526 if (s->dct_count[intra] > (1 << 16)) {
1527 for (i = 0; i < 64; i++) {
1528 s->dct_error_sum[intra][i] >>= 1;
1530 s->dct_count[intra] >>= 1;
1533 for (i = 0; i < 64; i++) {
1534 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1535 s->dct_count[intra] +
1536 s->dct_error_sum[intra][i] / 2) /
1537 (s->dct_error_sum[intra][i] + 1);
1542 static int frame_start(MpegEncContext *s)
1546 /* mark & release old frames */
1547 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1548 s->last_picture_ptr != s->next_picture_ptr &&
1549 s->last_picture_ptr->f->buf[0]) {
1550 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1553 s->current_picture_ptr->f->pict_type = s->pict_type;
1554 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1556 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1557 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1558 s->current_picture_ptr)) < 0)
1561 if (s->pict_type != AV_PICTURE_TYPE_B) {
1562 s->last_picture_ptr = s->next_picture_ptr;
1564 s->next_picture_ptr = s->current_picture_ptr;
1567 if (s->last_picture_ptr) {
1568 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1569 if (s->last_picture_ptr->f->buf[0] &&
1570 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1571 s->last_picture_ptr)) < 0)
1574 if (s->next_picture_ptr) {
1575 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1576 if (s->next_picture_ptr->f->buf[0] &&
1577 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1578 s->next_picture_ptr)) < 0)
1582 if (s->picture_structure!= PICT_FRAME) {
1584 for (i = 0; i < 4; i++) {
1585 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1586 s->current_picture.f->data[i] +=
1587 s->current_picture.f->linesize[i];
1589 s->current_picture.f->linesize[i] *= 2;
1590 s->last_picture.f->linesize[i] *= 2;
1591 s->next_picture.f->linesize[i] *= 2;
1595 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1596 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1597 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1598 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1599 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1600 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1602 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1603 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1606 if (s->dct_error_sum) {
1607 assert(s->avctx->noise_reduction && s->encoding);
1608 update_noise_reduction(s);
1614 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1615 const AVFrame *pic_arg, int *got_packet)
1617 MpegEncContext *s = avctx->priv_data;
1618 int i, stuffing_count, ret;
1619 int context_count = s->slice_context_count;
1621 s->picture_in_gop_number++;
1623 if (load_input_picture(s, pic_arg) < 0)
1626 if (select_input_picture(s) < 0) {
1631 if (s->new_picture.f->data[0]) {
1634 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1637 s->mb_info_ptr = av_packet_new_side_data(pkt,
1638 AV_PKT_DATA_H263_MB_INFO,
1639 s->mb_width*s->mb_height*12);
1640 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1643 for (i = 0; i < context_count; i++) {
1644 int start_y = s->thread_context[i]->start_mb_y;
1645 int end_y = s->thread_context[i]-> end_mb_y;
1646 int h = s->mb_height;
1647 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1648 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1650 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1653 s->pict_type = s->new_picture.f->pict_type;
1655 ret = frame_start(s);
1659 if (encode_picture(s, s->picture_number) < 0)
1662 #if FF_API_STAT_BITS
1663 FF_DISABLE_DEPRECATION_WARNINGS
1664 avctx->header_bits = s->header_bits;
1665 avctx->mv_bits = s->mv_bits;
1666 avctx->misc_bits = s->misc_bits;
1667 avctx->i_tex_bits = s->i_tex_bits;
1668 avctx->p_tex_bits = s->p_tex_bits;
1669 avctx->i_count = s->i_count;
1670 // FIXME f/b_count in avctx
1671 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1672 avctx->skip_count = s->skip_count;
1673 FF_ENABLE_DEPRECATION_WARNINGS
1678 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1681 return AVERROR(ENOMEM);
1682 *(int *)sd = s->current_picture.f->quality;
1684 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1685 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1687 if (avctx->rc_buffer_size) {
1688 RateControlContext *rcc = &s->rc_context;
1689 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1691 if (put_bits_count(&s->pb) > max_size &&
1692 s->lambda < s->lmax) {
1693 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1694 (s->qscale + 1) / s->qscale);
1695 if (s->adaptive_quant) {
1697 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1698 s->lambda_table[i] =
1699 FFMAX(s->lambda_table[i] + 1,
1700 s->lambda_table[i] * (s->qscale + 1) /
1703 s->mb_skipped = 0; // done in frame_start()
1704 // done in encode_picture() so we must undo it
1705 if (s->pict_type == AV_PICTURE_TYPE_P) {
1706 if (s->flipflop_rounding ||
1707 s->codec_id == AV_CODEC_ID_H263P ||
1708 s->codec_id == AV_CODEC_ID_MPEG4)
1709 s->no_rounding ^= 1;
1711 if (s->pict_type != AV_PICTURE_TYPE_B) {
1712 s->time_base = s->last_time_base;
1713 s->last_non_b_time = s->time - s->pp_time;
1715 for (i = 0; i < context_count; i++) {
1716 PutBitContext *pb = &s->thread_context[i]->pb;
1717 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1722 assert(s->avctx->rc_max_rate);
1725 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1726 ff_write_pass1_stats(s);
1728 for (i = 0; i < 4; i++) {
1729 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1730 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1733 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1734 assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits +
1735 s->misc_bits + s->i_tex_bits +
1737 flush_put_bits(&s->pb);
1738 s->frame_bits = put_bits_count(&s->pb);
1740 stuffing_count = ff_vbv_update(s, s->frame_bits);
1741 if (stuffing_count) {
1742 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1743 stuffing_count + 50) {
1744 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1748 switch (s->codec_id) {
1749 case AV_CODEC_ID_MPEG1VIDEO:
1750 case AV_CODEC_ID_MPEG2VIDEO:
1751 while (stuffing_count--) {
1752 put_bits(&s->pb, 8, 0);
1755 case AV_CODEC_ID_MPEG4:
1756 put_bits(&s->pb, 16, 0);
1757 put_bits(&s->pb, 16, 0x1C3);
1758 stuffing_count -= 4;
1759 while (stuffing_count--) {
1760 put_bits(&s->pb, 8, 0xFF);
1764 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1766 flush_put_bits(&s->pb);
1767 s->frame_bits = put_bits_count(&s->pb);
1770 /* update mpeg1/2 vbv_delay for CBR */
1771 if (s->avctx->rc_max_rate &&
1772 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1773 s->out_format == FMT_MPEG1 &&
1774 90000LL * (avctx->rc_buffer_size - 1) <=
1775 s->avctx->rc_max_rate * 0xFFFFLL) {
1776 AVCPBProperties *props;
1779 int vbv_delay, min_delay;
1780 double inbits = s->avctx->rc_max_rate *
1781 av_q2d(s->avctx->time_base);
1782 int minbits = s->frame_bits - 8 *
1783 (s->vbv_delay_ptr - s->pb.buf - 1);
1784 double bits = s->rc_context.buffer_index + minbits - inbits;
1787 av_log(s->avctx, AV_LOG_ERROR,
1788 "Internal error, negative bits\n");
1790 assert(s->repeat_first_field == 0);
1792 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1793 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1794 s->avctx->rc_max_rate;
1796 vbv_delay = FFMAX(vbv_delay, min_delay);
1798 assert(vbv_delay < 0xFFFF);
1800 s->vbv_delay_ptr[0] &= 0xF8;
1801 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1802 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1803 s->vbv_delay_ptr[2] &= 0x07;
1804 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1806 props = av_cpb_properties_alloc(&props_size);
1808 return AVERROR(ENOMEM);
1809 props->vbv_delay = vbv_delay * 300;
1811 #if FF_API_VBV_DELAY
1812 FF_DISABLE_DEPRECATION_WARNINGS
1813 avctx->vbv_delay = vbv_delay * 300;
1814 FF_ENABLE_DEPRECATION_WARNINGS
1817 s->total_bits += s->frame_bits;
1818 #if FF_API_STAT_BITS
1819 FF_DISABLE_DEPRECATION_WARNINGS
1820 avctx->frame_bits = s->frame_bits;
1821 FF_ENABLE_DEPRECATION_WARNINGS
1825 pkt->pts = s->current_picture.f->pts;
1826 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1827 if (!s->current_picture.f->coded_picture_number)
1828 pkt->dts = pkt->pts - s->dts_delta;
1830 pkt->dts = s->reordered_pts;
1831 s->reordered_pts = pkt->pts;
1833 pkt->dts = pkt->pts;
1834 if (s->current_picture.f->key_frame)
1835 pkt->flags |= AV_PKT_FLAG_KEY;
1837 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1841 assert((s->frame_bits & 7) == 0);
1843 pkt->size = s->frame_bits / 8;
1844 *got_packet = !!pkt->size;
1848 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1849 int n, int threshold)
1851 static const char tab[64] = {
1852 3, 2, 2, 1, 1, 1, 1, 1,
1853 1, 1, 1, 1, 1, 1, 1, 1,
1854 1, 1, 1, 1, 1, 1, 1, 1,
1855 0, 0, 0, 0, 0, 0, 0, 0,
1856 0, 0, 0, 0, 0, 0, 0, 0,
1857 0, 0, 0, 0, 0, 0, 0, 0,
1858 0, 0, 0, 0, 0, 0, 0, 0,
1859 0, 0, 0, 0, 0, 0, 0, 0
1864 int16_t *block = s->block[n];
1865 const int last_index = s->block_last_index[n];
1868 if (threshold < 0) {
1870 threshold = -threshold;
1874 /* Are all we could set to zero already zero? */
1875 if (last_index <= skip_dc - 1)
1878 for (i = 0; i <= last_index; i++) {
1879 const int j = s->intra_scantable.permutated[i];
1880 const int level = FFABS(block[j]);
1882 if (skip_dc && i == 0)
1886 } else if (level > 1) {
1892 if (score >= threshold)
1894 for (i = skip_dc; i <= last_index; i++) {
1895 const int j = s->intra_scantable.permutated[i];
1899 s->block_last_index[n] = 0;
1901 s->block_last_index[n] = -1;
1904 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1908 const int maxlevel = s->max_qcoeff;
1909 const int minlevel = s->min_qcoeff;
1913 i = 1; // skip clipping of intra dc
1917 for (; i <= last_index; i++) {
1918 const int j = s->intra_scantable.permutated[i];
1919 int level = block[j];
1921 if (level > maxlevel) {
1924 } else if (level < minlevel) {
1932 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1933 av_log(s->avctx, AV_LOG_INFO,
1934 "warning, clipping %d dct coefficients to %d..%d\n",
1935 overflow, minlevel, maxlevel);
1938 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1942 for (y = 0; y < 8; y++) {
1943 for (x = 0; x < 8; x++) {
1949 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1950 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1951 int v = ptr[x2 + y2 * stride];
1957 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1962 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1963 int motion_x, int motion_y,
1964 int mb_block_height,
1967 int16_t weight[8][64];
1968 int16_t orig[8][64];
1969 const int mb_x = s->mb_x;
1970 const int mb_y = s->mb_y;
1973 int dct_offset = s->linesize * 8; // default for progressive frames
1974 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1975 ptrdiff_t wrap_y, wrap_c;
1977 for (i = 0; i < mb_block_count; i++)
1978 skip_dct[i] = s->skipdct;
1980 if (s->adaptive_quant) {
1981 const int last_qp = s->qscale;
1982 const int mb_xy = mb_x + mb_y * s->mb_stride;
1984 s->lambda = s->lambda_table[mb_xy];
1987 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1988 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1989 s->dquant = s->qscale - last_qp;
1991 if (s->out_format == FMT_H263) {
1992 s->dquant = av_clip(s->dquant, -2, 2);
1994 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1996 if (s->pict_type == AV_PICTURE_TYPE_B) {
1997 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
2000 if (s->mv_type == MV_TYPE_8X8)
2006 ff_set_qscale(s, last_qp + s->dquant);
2007 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2008 ff_set_qscale(s, s->qscale + s->dquant);
2010 wrap_y = s->linesize;
2011 wrap_c = s->uvlinesize;
2012 ptr_y = s->new_picture.f->data[0] +
2013 (mb_y * 16 * wrap_y) + mb_x * 16;
2014 ptr_cb = s->new_picture.f->data[1] +
2015 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2016 ptr_cr = s->new_picture.f->data[2] +
2017 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2019 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
2020 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
2021 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2023 16, 16, mb_x * 16, mb_y * 16,
2024 s->width, s->height);
2026 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
2028 8, mb_block_height, mb_x * 8, mb_y * 8,
2029 s->width >> 1, s->height >> 1);
2030 ptr_cb = ebuf + 18 * wrap_y;
2031 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
2033 8, mb_block_height, mb_x * 8, mb_y * 8,
2034 s->width >> 1, s->height >> 1);
2035 ptr_cr = ebuf + 18 * wrap_y + 8;
2039 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2040 int progressive_score, interlaced_score;
2042 s->interlaced_dct = 0;
2043 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2044 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2045 NULL, wrap_y, 8) - 400;
2047 if (progressive_score > 0) {
2048 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2049 NULL, wrap_y * 2, 8) +
2050 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2051 NULL, wrap_y * 2, 8);
2052 if (progressive_score > interlaced_score) {
2053 s->interlaced_dct = 1;
2055 dct_offset = wrap_y;
2057 if (s->chroma_format == CHROMA_422)
2063 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2064 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2065 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2066 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2068 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2072 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2073 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2074 if (!s->chroma_y_shift) { /* 422 */
2075 s->pdsp.get_pixels(s->block[6],
2076 ptr_cb + (dct_offset >> 1), wrap_c);
2077 s->pdsp.get_pixels(s->block[7],
2078 ptr_cr + (dct_offset >> 1), wrap_c);
2082 op_pixels_func (*op_pix)[4];
2083 qpel_mc_func (*op_qpix)[16];
2084 uint8_t *dest_y, *dest_cb, *dest_cr;
2086 dest_y = s->dest[0];
2087 dest_cb = s->dest[1];
2088 dest_cr = s->dest[2];
2090 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2091 op_pix = s->hdsp.put_pixels_tab;
2092 op_qpix = s->qdsp.put_qpel_pixels_tab;
2094 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2095 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2098 if (s->mv_dir & MV_DIR_FORWARD) {
2099 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2100 s->last_picture.f->data,
2102 op_pix = s->hdsp.avg_pixels_tab;
2103 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2105 if (s->mv_dir & MV_DIR_BACKWARD) {
2106 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2107 s->next_picture.f->data,
2111 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2112 int progressive_score, interlaced_score;
2114 s->interlaced_dct = 0;
2115 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2116 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2120 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2121 progressive_score -= 400;
2123 if (progressive_score > 0) {
2124 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2126 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2130 if (progressive_score > interlaced_score) {
2131 s->interlaced_dct = 1;
2133 dct_offset = wrap_y;
2135 if (s->chroma_format == CHROMA_422)
2141 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2142 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2143 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2144 dest_y + dct_offset, wrap_y);
2145 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2146 dest_y + dct_offset + 8, wrap_y);
2148 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2152 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2153 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2154 if (!s->chroma_y_shift) { /* 422 */
2155 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2156 dest_cb + (dct_offset >> 1), wrap_c);
2157 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2158 dest_cr + (dct_offset >> 1), wrap_c);
2161 /* pre quantization */
2162 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2163 2 * s->qscale * s->qscale) {
2165 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2167 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2169 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2170 wrap_y, 8) < 20 * s->qscale)
2172 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2173 wrap_y, 8) < 20 * s->qscale)
2175 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2177 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2179 if (!s->chroma_y_shift) { /* 422 */
2180 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2181 dest_cb + (dct_offset >> 1),
2182 wrap_c, 8) < 20 * s->qscale)
2184 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2185 dest_cr + (dct_offset >> 1),
2186 wrap_c, 8) < 20 * s->qscale)
2192 if (s->quantizer_noise_shaping) {
2194 get_visual_weight(weight[0], ptr_y , wrap_y);
2196 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2198 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2200 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2202 get_visual_weight(weight[4], ptr_cb , wrap_c);
2204 get_visual_weight(weight[5], ptr_cr , wrap_c);
2205 if (!s->chroma_y_shift) { /* 422 */
2207 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2210 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2213 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2216 /* DCT & quantize */
2217 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2219 for (i = 0; i < mb_block_count; i++) {
2222 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2223 // FIXME we could decide to change to quantizer instead of
2225 // JS: I don't think that would be a good idea it could lower
2226 // quality instead of improve it. Just INTRADC clipping
2227 // deserves changes in quantizer
2229 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2231 s->block_last_index[i] = -1;
2233 if (s->quantizer_noise_shaping) {
2234 for (i = 0; i < mb_block_count; i++) {
2236 s->block_last_index[i] =
2237 dct_quantize_refine(s, s->block[i], weight[i],
2238 orig[i], i, s->qscale);
2243 if (s->luma_elim_threshold && !s->mb_intra)
2244 for (i = 0; i < 4; i++)
2245 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2246 if (s->chroma_elim_threshold && !s->mb_intra)
2247 for (i = 4; i < mb_block_count; i++)
2248 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2250 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2251 for (i = 0; i < mb_block_count; i++) {
2252 if (s->block_last_index[i] == -1)
2253 s->coded_score[i] = INT_MAX / 256;
2258 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2259 s->block_last_index[4] =
2260 s->block_last_index[5] = 0;
2262 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2265 // non c quantize code returns incorrect block_last_index FIXME
2266 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2267 for (i = 0; i < mb_block_count; i++) {
2269 if (s->block_last_index[i] > 0) {
2270 for (j = 63; j > 0; j--) {
2271 if (s->block[i][s->intra_scantable.permutated[j]])
2274 s->block_last_index[i] = j;
2279 /* huffman encode */
2280 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2281 case AV_CODEC_ID_MPEG1VIDEO:
2282 case AV_CODEC_ID_MPEG2VIDEO:
2283 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2284 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2286 case AV_CODEC_ID_MPEG4:
2287 if (CONFIG_MPEG4_ENCODER)
2288 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2290 case AV_CODEC_ID_MSMPEG4V2:
2291 case AV_CODEC_ID_MSMPEG4V3:
2292 case AV_CODEC_ID_WMV1:
2293 if (CONFIG_MSMPEG4_ENCODER)
2294 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2296 case AV_CODEC_ID_WMV2:
2297 if (CONFIG_WMV2_ENCODER)
2298 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2300 case AV_CODEC_ID_H261:
2301 if (CONFIG_H261_ENCODER)
2302 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2304 case AV_CODEC_ID_H263:
2305 case AV_CODEC_ID_H263P:
2306 case AV_CODEC_ID_FLV1:
2307 case AV_CODEC_ID_RV10:
2308 case AV_CODEC_ID_RV20:
2309 if (CONFIG_H263_ENCODER)
2310 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2312 case AV_CODEC_ID_MJPEG:
2313 if (CONFIG_MJPEG_ENCODER)
2314 ff_mjpeg_encode_mb(s, s->block);
2321 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2323 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2324 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2327 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2330 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2333 d->mb_skip_run= s->mb_skip_run;
2335 d->last_dc[i] = s->last_dc[i];
2338 d->mv_bits= s->mv_bits;
2339 d->i_tex_bits= s->i_tex_bits;
2340 d->p_tex_bits= s->p_tex_bits;
2341 d->i_count= s->i_count;
2342 d->f_count= s->f_count;
2343 d->b_count= s->b_count;
2344 d->skip_count= s->skip_count;
2345 d->misc_bits= s->misc_bits;
2349 d->qscale= s->qscale;
2350 d->dquant= s->dquant;
2352 d->esc3_level_length= s->esc3_level_length;
2355 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2358 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2359 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2362 d->mb_skip_run= s->mb_skip_run;
2364 d->last_dc[i] = s->last_dc[i];
2367 d->mv_bits= s->mv_bits;
2368 d->i_tex_bits= s->i_tex_bits;
2369 d->p_tex_bits= s->p_tex_bits;
2370 d->i_count= s->i_count;
2371 d->f_count= s->f_count;
2372 d->b_count= s->b_count;
2373 d->skip_count= s->skip_count;
2374 d->misc_bits= s->misc_bits;
2376 d->mb_intra= s->mb_intra;
2377 d->mb_skipped= s->mb_skipped;
2378 d->mv_type= s->mv_type;
2379 d->mv_dir= s->mv_dir;
2381 if(s->data_partitioning){
2383 d->tex_pb= s->tex_pb;
2387 d->block_last_index[i]= s->block_last_index[i];
2388 d->interlaced_dct= s->interlaced_dct;
2389 d->qscale= s->qscale;
2391 d->esc3_level_length= s->esc3_level_length;
2394 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2395 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2396 int *dmin, int *next_block, int motion_x, int motion_y)
2399 uint8_t *dest_backup[3];
2401 copy_context_before_encode(s, backup, type);
2403 s->block= s->blocks[*next_block];
2404 s->pb= pb[*next_block];
2405 if(s->data_partitioning){
2406 s->pb2 = pb2 [*next_block];
2407 s->tex_pb= tex_pb[*next_block];
2411 memcpy(dest_backup, s->dest, sizeof(s->dest));
2412 s->dest[0] = s->sc.rd_scratchpad;
2413 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2414 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2415 assert(s->linesize >= 32); //FIXME
2418 encode_mb(s, motion_x, motion_y);
2420 score= put_bits_count(&s->pb);
2421 if(s->data_partitioning){
2422 score+= put_bits_count(&s->pb2);
2423 score+= put_bits_count(&s->tex_pb);
2426 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2427 ff_mpv_decode_mb(s, s->block);
2429 score *= s->lambda2;
2430 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2434 memcpy(s->dest, dest_backup, sizeof(s->dest));
2441 copy_context_after_encode(best, s, type);
2445 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2446 uint32_t *sq = ff_square_tab + 256;
2451 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2452 else if(w==8 && h==8)
2453 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2457 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2466 static int sse_mb(MpegEncContext *s){
2470 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2471 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2474 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2475 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) +
2476 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) +
2477 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);
2479 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) +
2480 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) +
2481 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);
2484 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)
2485 +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)
2486 +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);
2489 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2490 MpegEncContext *s= *(void**)arg;
2494 s->me.dia_size= s->avctx->pre_dia_size;
2495 s->first_slice_line=1;
2496 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2497 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2498 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2500 s->first_slice_line=0;
2508 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2509 MpegEncContext *s= *(void**)arg;
2511 s->me.dia_size= s->avctx->dia_size;
2512 s->first_slice_line=1;
2513 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2514 s->mb_x=0; //for block init below
2515 ff_init_block_index(s);
2516 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2517 s->block_index[0]+=2;
2518 s->block_index[1]+=2;
2519 s->block_index[2]+=2;
2520 s->block_index[3]+=2;
2522 /* compute motion vector & mb_type and store in context */
2523 if(s->pict_type==AV_PICTURE_TYPE_B)
2524 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2526 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2528 s->first_slice_line=0;
2533 static int mb_var_thread(AVCodecContext *c, void *arg){
2534 MpegEncContext *s= *(void**)arg;
2537 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2538 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2541 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2543 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2545 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2546 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2548 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2549 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2550 s->me.mb_var_sum_temp += varc;
2556 static void write_slice_end(MpegEncContext *s){
2557 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2558 if(s->partitioned_frame){
2559 ff_mpeg4_merge_partitions(s);
2562 ff_mpeg4_stuffing(&s->pb);
2563 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2564 ff_mjpeg_encode_stuffing(&s->pb);
2567 avpriv_align_put_bits(&s->pb);
2568 flush_put_bits(&s->pb);
2570 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2571 s->misc_bits+= get_bits_diff(s);
2574 static void write_mb_info(MpegEncContext *s)
2576 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2577 int offset = put_bits_count(&s->pb);
2578 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2579 int gobn = s->mb_y / s->gob_index;
2581 if (CONFIG_H263_ENCODER)
2582 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2583 bytestream_put_le32(&ptr, offset);
2584 bytestream_put_byte(&ptr, s->qscale);
2585 bytestream_put_byte(&ptr, gobn);
2586 bytestream_put_le16(&ptr, mba);
2587 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2588 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2589 /* 4MV not implemented */
2590 bytestream_put_byte(&ptr, 0); /* hmv2 */
2591 bytestream_put_byte(&ptr, 0); /* vmv2 */
2594 static void update_mb_info(MpegEncContext *s, int startcode)
2598 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2599 s->mb_info_size += 12;
2600 s->prev_mb_info = s->last_mb_info;
2603 s->prev_mb_info = put_bits_count(&s->pb)/8;
2604 /* This might have incremented mb_info_size above, and we return without
2605 * actually writing any info into that slot yet. But in that case,
2606 * this will be called again at the start of the after writing the
2607 * start code, actually writing the mb info. */
2611 s->last_mb_info = put_bits_count(&s->pb)/8;
2612 if (!s->mb_info_size)
2613 s->mb_info_size += 12;
2617 static int encode_thread(AVCodecContext *c, void *arg){
2618 MpegEncContext *s= *(void**)arg;
2619 int mb_x, mb_y, pdif = 0;
2620 int chr_h= 16>>s->chroma_y_shift;
2622 MpegEncContext best_s = { 0 }, backup_s;
2623 uint8_t bit_buf[2][MAX_MB_BYTES];
2624 uint8_t bit_buf2[2][MAX_MB_BYTES];
2625 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2626 PutBitContext pb[2], pb2[2], tex_pb[2];
2629 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2630 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2631 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2634 s->last_bits= put_bits_count(&s->pb);
2645 /* init last dc values */
2646 /* note: quant matrix value (8) is implied here */
2647 s->last_dc[i] = 128 << s->intra_dc_precision;
2649 s->current_picture.encoding_error[i] = 0;
2652 memset(s->last_mv, 0, sizeof(s->last_mv));
2656 switch(s->codec_id){
2657 case AV_CODEC_ID_H263:
2658 case AV_CODEC_ID_H263P:
2659 case AV_CODEC_ID_FLV1:
2660 if (CONFIG_H263_ENCODER)
2661 s->gob_index = H263_GOB_HEIGHT(s->height);
2663 case AV_CODEC_ID_MPEG4:
2664 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2665 ff_mpeg4_init_partitions(s);
2671 s->first_slice_line = 1;
2672 s->ptr_lastgob = s->pb.buf;
2673 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2677 ff_set_qscale(s, s->qscale);
2678 ff_init_block_index(s);
2680 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2681 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2682 int mb_type= s->mb_type[xy];
2687 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2688 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2691 if(s->data_partitioning){
2692 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2693 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2694 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2700 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2701 ff_update_block_index(s);
2703 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2704 ff_h261_reorder_mb_index(s);
2705 xy= s->mb_y*s->mb_stride + s->mb_x;
2706 mb_type= s->mb_type[xy];
2709 /* write gob / video packet header */
2711 int current_packet_size, is_gob_start;
2713 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2715 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2717 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2719 switch(s->codec_id){
2720 case AV_CODEC_ID_H263:
2721 case AV_CODEC_ID_H263P:
2722 if(!s->h263_slice_structured)
2723 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2725 case AV_CODEC_ID_MPEG2VIDEO:
2726 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2727 case AV_CODEC_ID_MPEG1VIDEO:
2728 if(s->mb_skip_run) is_gob_start=0;
2733 if(s->start_mb_y != mb_y || mb_x!=0){
2736 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2737 ff_mpeg4_init_partitions(s);
2741 assert((put_bits_count(&s->pb)&7) == 0);
2742 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2744 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2745 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2746 int d = 100 / s->error_rate;
2748 current_packet_size=0;
2749 s->pb.buf_ptr= s->ptr_lastgob;
2750 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2754 #if FF_API_RTP_CALLBACK
2755 FF_DISABLE_DEPRECATION_WARNINGS
2756 if (s->avctx->rtp_callback){
2757 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2758 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2760 FF_ENABLE_DEPRECATION_WARNINGS
2762 update_mb_info(s, 1);
2764 switch(s->codec_id){
2765 case AV_CODEC_ID_MPEG4:
2766 if (CONFIG_MPEG4_ENCODER) {
2767 ff_mpeg4_encode_video_packet_header(s);
2768 ff_mpeg4_clean_buffers(s);
2771 case AV_CODEC_ID_MPEG1VIDEO:
2772 case AV_CODEC_ID_MPEG2VIDEO:
2773 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2774 ff_mpeg1_encode_slice_header(s);
2775 ff_mpeg1_clean_buffers(s);
2778 case AV_CODEC_ID_H263:
2779 case AV_CODEC_ID_H263P:
2780 if (CONFIG_H263_ENCODER)
2781 ff_h263_encode_gob_header(s, mb_y);
2785 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2786 int bits= put_bits_count(&s->pb);
2787 s->misc_bits+= bits - s->last_bits;
2791 s->ptr_lastgob += current_packet_size;
2792 s->first_slice_line=1;
2793 s->resync_mb_x=mb_x;
2794 s->resync_mb_y=mb_y;
2798 if( (s->resync_mb_x == s->mb_x)
2799 && s->resync_mb_y+1 == s->mb_y){
2800 s->first_slice_line=0;
2804 s->dquant=0; //only for QP_RD
2806 update_mb_info(s, 0);
2808 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
2810 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2812 copy_context_before_encode(&backup_s, s, -1);
2814 best_s.data_partitioning= s->data_partitioning;
2815 best_s.partitioned_frame= s->partitioned_frame;
2816 if(s->data_partitioning){
2817 backup_s.pb2= s->pb2;
2818 backup_s.tex_pb= s->tex_pb;
2821 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2822 s->mv_dir = MV_DIR_FORWARD;
2823 s->mv_type = MV_TYPE_16X16;
2825 s->mv[0][0][0] = s->p_mv_table[xy][0];
2826 s->mv[0][0][1] = s->p_mv_table[xy][1];
2827 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2828 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2830 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2831 s->mv_dir = MV_DIR_FORWARD;
2832 s->mv_type = MV_TYPE_FIELD;
2835 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2836 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2837 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2839 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2840 &dmin, &next_block, 0, 0);
2842 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2843 s->mv_dir = MV_DIR_FORWARD;
2844 s->mv_type = MV_TYPE_16X16;
2848 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2849 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2851 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2852 s->mv_dir = MV_DIR_FORWARD;
2853 s->mv_type = MV_TYPE_8X8;
2856 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2857 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2859 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2860 &dmin, &next_block, 0, 0);
2862 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2863 s->mv_dir = MV_DIR_FORWARD;
2864 s->mv_type = MV_TYPE_16X16;
2866 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2867 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2868 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2869 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2871 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2872 s->mv_dir = MV_DIR_BACKWARD;
2873 s->mv_type = MV_TYPE_16X16;
2875 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2876 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2877 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2878 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2880 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2881 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2882 s->mv_type = MV_TYPE_16X16;
2884 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2885 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2886 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2887 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2888 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2889 &dmin, &next_block, 0, 0);
2891 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2892 s->mv_dir = MV_DIR_FORWARD;
2893 s->mv_type = MV_TYPE_FIELD;
2896 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2897 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2898 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2900 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2901 &dmin, &next_block, 0, 0);
2903 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2904 s->mv_dir = MV_DIR_BACKWARD;
2905 s->mv_type = MV_TYPE_FIELD;
2908 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2909 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2910 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2912 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2913 &dmin, &next_block, 0, 0);
2915 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2916 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2917 s->mv_type = MV_TYPE_FIELD;
2919 for(dir=0; dir<2; dir++){
2921 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2922 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2923 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2926 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2927 &dmin, &next_block, 0, 0);
2929 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2931 s->mv_type = MV_TYPE_16X16;
2935 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2936 &dmin, &next_block, 0, 0);
2937 if(s->h263_pred || s->h263_aic){
2939 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2941 ff_clean_intra_table_entries(s); //old mode?
2945 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2946 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2947 const int last_qp= backup_s.qscale;
2950 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2951 static const int dquant_tab[4]={-1,1,-2,2};
2953 assert(backup_s.dquant == 0);
2956 s->mv_dir= best_s.mv_dir;
2957 s->mv_type = MV_TYPE_16X16;
2958 s->mb_intra= best_s.mb_intra;
2959 s->mv[0][0][0] = best_s.mv[0][0][0];
2960 s->mv[0][0][1] = best_s.mv[0][0][1];
2961 s->mv[1][0][0] = best_s.mv[1][0][0];
2962 s->mv[1][0][1] = best_s.mv[1][0][1];
2964 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2965 for(; qpi<4; qpi++){
2966 int dquant= dquant_tab[qpi];
2967 qp= last_qp + dquant;
2968 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2970 backup_s.dquant= dquant;
2971 if(s->mb_intra && s->dc_val[0]){
2973 dc[i]= s->dc_val[0][ s->block_index[i] ];
2974 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2978 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2979 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2980 if(best_s.qscale != qp){
2981 if(s->mb_intra && s->dc_val[0]){
2983 s->dc_val[0][ s->block_index[i] ]= dc[i];
2984 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2991 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2992 int mx= s->b_direct_mv_table[xy][0];
2993 int my= s->b_direct_mv_table[xy][1];
2995 backup_s.dquant = 0;
2996 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2998 ff_mpeg4_set_direct_mv(s, mx, my);
2999 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3000 &dmin, &next_block, mx, my);
3002 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3003 backup_s.dquant = 0;
3004 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3006 ff_mpeg4_set_direct_mv(s, 0, 0);
3007 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3008 &dmin, &next_block, 0, 0);
3010 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3013 coded |= s->block_last_index[i];
3016 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3017 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3018 mx=my=0; //FIXME find the one we actually used
3019 ff_mpeg4_set_direct_mv(s, mx, my);
3020 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3028 s->mv_dir= best_s.mv_dir;
3029 s->mv_type = best_s.mv_type;
3031 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3032 s->mv[0][0][1] = best_s.mv[0][0][1];
3033 s->mv[1][0][0] = best_s.mv[1][0][0];
3034 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3037 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3038 &dmin, &next_block, mx, my);
3043 s->current_picture.qscale_table[xy] = best_s.qscale;
3045 copy_context_after_encode(s, &best_s, -1);
3047 pb_bits_count= put_bits_count(&s->pb);
3048 flush_put_bits(&s->pb);
3049 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3052 if(s->data_partitioning){
3053 pb2_bits_count= put_bits_count(&s->pb2);
3054 flush_put_bits(&s->pb2);
3055 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3056 s->pb2= backup_s.pb2;
3058 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3059 flush_put_bits(&s->tex_pb);
3060 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3061 s->tex_pb= backup_s.tex_pb;
3063 s->last_bits= put_bits_count(&s->pb);
3065 if (CONFIG_H263_ENCODER &&
3066 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3067 ff_h263_update_motion_val(s);
3069 if(next_block==0){ //FIXME 16 vs linesize16
3070 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3071 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3072 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3075 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3076 ff_mpv_decode_mb(s, s->block);
3078 int motion_x = 0, motion_y = 0;
3079 s->mv_type=MV_TYPE_16X16;
3080 // only one MB-Type possible
3083 case CANDIDATE_MB_TYPE_INTRA:
3086 motion_x= s->mv[0][0][0] = 0;
3087 motion_y= s->mv[0][0][1] = 0;
3089 case CANDIDATE_MB_TYPE_INTER:
3090 s->mv_dir = MV_DIR_FORWARD;
3092 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3093 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3095 case CANDIDATE_MB_TYPE_INTER_I:
3096 s->mv_dir = MV_DIR_FORWARD;
3097 s->mv_type = MV_TYPE_FIELD;
3100 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3101 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3102 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3105 case CANDIDATE_MB_TYPE_INTER4V:
3106 s->mv_dir = MV_DIR_FORWARD;
3107 s->mv_type = MV_TYPE_8X8;
3110 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3111 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3114 case CANDIDATE_MB_TYPE_DIRECT:
3115 if (CONFIG_MPEG4_ENCODER) {
3116 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3118 motion_x=s->b_direct_mv_table[xy][0];
3119 motion_y=s->b_direct_mv_table[xy][1];
3120 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3123 case CANDIDATE_MB_TYPE_DIRECT0:
3124 if (CONFIG_MPEG4_ENCODER) {
3125 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3127 ff_mpeg4_set_direct_mv(s, 0, 0);
3130 case CANDIDATE_MB_TYPE_BIDIR:
3131 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3133 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3134 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3135 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3136 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3138 case CANDIDATE_MB_TYPE_BACKWARD:
3139 s->mv_dir = MV_DIR_BACKWARD;
3141 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3142 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3144 case CANDIDATE_MB_TYPE_FORWARD:
3145 s->mv_dir = MV_DIR_FORWARD;
3147 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3148 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3150 case CANDIDATE_MB_TYPE_FORWARD_I:
3151 s->mv_dir = MV_DIR_FORWARD;
3152 s->mv_type = MV_TYPE_FIELD;
3155 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3156 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3157 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3160 case CANDIDATE_MB_TYPE_BACKWARD_I:
3161 s->mv_dir = MV_DIR_BACKWARD;
3162 s->mv_type = MV_TYPE_FIELD;
3165 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3166 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3167 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3170 case CANDIDATE_MB_TYPE_BIDIR_I:
3171 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3172 s->mv_type = MV_TYPE_FIELD;
3174 for(dir=0; dir<2; dir++){
3176 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3177 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3178 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3183 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3186 encode_mb(s, motion_x, motion_y);
3188 // RAL: Update last macroblock type
3189 s->last_mv_dir = s->mv_dir;
3191 if (CONFIG_H263_ENCODER &&
3192 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3193 ff_h263_update_motion_val(s);
3195 ff_mpv_decode_mb(s, s->block);
3198 /* clean the MV table in IPS frames for direct mode in B frames */
3199 if(s->mb_intra /* && I,P,S_TYPE */){
3200 s->p_mv_table[xy][0]=0;
3201 s->p_mv_table[xy][1]=0;
3204 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3208 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3209 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3211 s->current_picture.encoding_error[0] += sse(
3212 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3213 s->dest[0], w, h, s->linesize);
3214 s->current_picture.encoding_error[1] += sse(
3215 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3216 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3217 s->current_picture.encoding_error[2] += sse(
3218 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3219 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3222 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3223 ff_h263_loop_filter(s);
3225 ff_dlog(s->avctx, "MB %d %d bits\n",
3226 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3230 //not beautiful here but we must write it before flushing so it has to be here
3231 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3232 ff_msmpeg4_encode_ext_header(s);
3236 #if FF_API_RTP_CALLBACK
3237 FF_DISABLE_DEPRECATION_WARNINGS
3238 /* Send the last GOB if RTP */
3239 if (s->avctx->rtp_callback) {
3240 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3241 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3242 /* Call the RTP callback to send the last GOB */
3244 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3246 FF_ENABLE_DEPRECATION_WARNINGS
3252 #define MERGE(field) dst->field += src->field; src->field=0
3253 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3254 MERGE(me.scene_change_score);
3255 MERGE(me.mc_mb_var_sum_temp);
3256 MERGE(me.mb_var_sum_temp);
3259 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3262 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3263 MERGE(dct_count[1]);
3272 MERGE(er.error_count);
3273 MERGE(padding_bug_score);
3274 MERGE(current_picture.encoding_error[0]);
3275 MERGE(current_picture.encoding_error[1]);
3276 MERGE(current_picture.encoding_error[2]);
3278 if(dst->avctx->noise_reduction){
3279 for(i=0; i<64; i++){
3280 MERGE(dct_error_sum[0][i]);
3281 MERGE(dct_error_sum[1][i]);
3285 assert(put_bits_count(&src->pb) % 8 ==0);
3286 assert(put_bits_count(&dst->pb) % 8 ==0);
3287 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3288 flush_put_bits(&dst->pb);
3291 static int estimate_qp(MpegEncContext *s, int dry_run){
3292 if (s->next_lambda){
3293 s->current_picture_ptr->f->quality =
3294 s->current_picture.f->quality = s->next_lambda;
3295 if(!dry_run) s->next_lambda= 0;
3296 } else if (!s->fixed_qscale) {
3297 s->current_picture_ptr->f->quality =
3298 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3299 if (s->current_picture.f->quality < 0)
3303 if(s->adaptive_quant){
3304 switch(s->codec_id){
3305 case AV_CODEC_ID_MPEG4:
3306 if (CONFIG_MPEG4_ENCODER)
3307 ff_clean_mpeg4_qscales(s);
3309 case AV_CODEC_ID_H263:
3310 case AV_CODEC_ID_H263P:
3311 case AV_CODEC_ID_FLV1:
3312 if (CONFIG_H263_ENCODER)
3313 ff_clean_h263_qscales(s);
3316 ff_init_qscale_tab(s);
3319 s->lambda= s->lambda_table[0];
3322 s->lambda = s->current_picture.f->quality;
3327 /* must be called before writing the header */
3328 static void set_frame_distances(MpegEncContext * s){
3329 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3330 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3332 if(s->pict_type==AV_PICTURE_TYPE_B){
3333 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3334 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3336 s->pp_time= s->time - s->last_non_b_time;
3337 s->last_non_b_time= s->time;
3338 assert(s->picture_number==0 || s->pp_time > 0);
3342 static int encode_picture(MpegEncContext *s, int picture_number)
3346 int context_count = s->slice_context_count;
3348 s->picture_number = picture_number;
3350 /* Reset the average MB variance */
3351 s->me.mb_var_sum_temp =
3352 s->me.mc_mb_var_sum_temp = 0;
3354 /* we need to initialize some time vars before we can encode b-frames */
3355 // RAL: Condition added for MPEG1VIDEO
3356 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3357 set_frame_distances(s);
3358 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3359 ff_set_mpeg4_time(s);
3361 s->me.scene_change_score=0;
3363 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3365 if(s->pict_type==AV_PICTURE_TYPE_I){
3366 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3367 else s->no_rounding=0;
3368 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3369 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3370 s->no_rounding ^= 1;
3373 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3374 if (estimate_qp(s,1) < 0)
3376 ff_get_2pass_fcode(s);
3377 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3378 if(s->pict_type==AV_PICTURE_TYPE_B)
3379 s->lambda= s->last_lambda_for[s->pict_type];
3381 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3385 s->mb_intra=0; //for the rate distortion & bit compare functions
3386 for(i=1; i<context_count; i++){
3387 ret = ff_update_duplicate_context(s->thread_context[i], s);
3395 /* Estimate motion for every MB */
3396 if(s->pict_type != AV_PICTURE_TYPE_I){
3397 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3398 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3399 if (s->pict_type != AV_PICTURE_TYPE_B) {
3400 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3401 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3405 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3406 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3408 for(i=0; i<s->mb_stride*s->mb_height; i++)
3409 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3411 if(!s->fixed_qscale){
3412 /* finding spatial complexity for I-frame rate control */
3413 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3416 for(i=1; i<context_count; i++){
3417 merge_context_after_me(s, s->thread_context[i]);
3419 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3420 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3423 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3424 s->pict_type= AV_PICTURE_TYPE_I;
3425 for(i=0; i<s->mb_stride*s->mb_height; i++)
3426 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3427 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3428 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3432 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3433 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3435 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3437 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3438 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3439 s->f_code= FFMAX3(s->f_code, a, b);
3442 ff_fix_long_p_mvs(s);
3443 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3444 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3448 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3449 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3454 if(s->pict_type==AV_PICTURE_TYPE_B){
3457 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3458 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3459 s->f_code = FFMAX(a, b);
3461 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3462 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3463 s->b_code = FFMAX(a, b);
3465 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3466 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3467 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3468 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3469 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3471 for(dir=0; dir<2; dir++){
3474 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3475 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3476 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3477 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3485 if (estimate_qp(s, 0) < 0)
3488 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3489 s->pict_type == AV_PICTURE_TYPE_I &&
3490 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3491 s->qscale= 3; //reduce clipping problems
3493 if (s->out_format == FMT_MJPEG) {
3494 /* for mjpeg, we do include qscale in the matrix */
3496 int j = s->idsp.idct_permutation[i];
3498 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3500 s->y_dc_scale_table=
3501 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3502 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3503 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3504 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3508 //FIXME var duplication
3509 s->current_picture_ptr->f->key_frame =
3510 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3511 s->current_picture_ptr->f->pict_type =
3512 s->current_picture.f->pict_type = s->pict_type;
3514 if (s->current_picture.f->key_frame)
3515 s->picture_in_gop_number=0;
3517 s->last_bits= put_bits_count(&s->pb);
3518 switch(s->out_format) {
3520 if (CONFIG_MJPEG_ENCODER)
3521 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3525 if (CONFIG_H261_ENCODER)
3526 ff_h261_encode_picture_header(s, picture_number);
3529 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3530 ff_wmv2_encode_picture_header(s, picture_number);
3531 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3532 ff_msmpeg4_encode_picture_header(s, picture_number);
3533 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3534 ff_mpeg4_encode_picture_header(s, picture_number);
3535 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3536 ret = ff_rv10_encode_picture_header(s, picture_number);
3540 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3541 ff_rv20_encode_picture_header(s, picture_number);
3542 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3543 ff_flv_encode_picture_header(s, picture_number);
3544 else if (CONFIG_H263_ENCODER)
3545 ff_h263_encode_picture_header(s, picture_number);
3548 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3549 ff_mpeg1_encode_picture_header(s, picture_number);
3554 bits= put_bits_count(&s->pb);
3555 s->header_bits= bits - s->last_bits;
3557 for(i=1; i<context_count; i++){
3558 update_duplicate_context_after_me(s->thread_context[i], s);
3560 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3561 for(i=1; i<context_count; i++){
3562 merge_context_after_encode(s, s->thread_context[i]);
3568 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3569 const int intra= s->mb_intra;
3572 s->dct_count[intra]++;
3574 for(i=0; i<64; i++){
3575 int level= block[i];
3579 s->dct_error_sum[intra][i] += level;
3580 level -= s->dct_offset[intra][i];
3581 if(level<0) level=0;
3583 s->dct_error_sum[intra][i] -= level;
3584 level += s->dct_offset[intra][i];
3585 if(level>0) level=0;
3592 static int dct_quantize_trellis_c(MpegEncContext *s,
3593 int16_t *block, int n,
3594 int qscale, int *overflow){
3596 const uint8_t *scantable= s->intra_scantable.scantable;
3597 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3599 unsigned int threshold1, threshold2;
3611 int coeff_count[64];
3612 int qmul, qadd, start_i, last_non_zero, i, dc;
3613 const int esc_length= s->ac_esc_length;
3615 uint8_t * last_length;
3616 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3618 s->fdsp.fdct(block);
3620 if(s->dct_error_sum)
3621 s->denoise_dct(s, block);
3623 qadd= ((qscale-1)|1)*8;
3634 /* For AIC we skip quant/dequant of INTRADC */
3639 /* note: block[0] is assumed to be positive */
3640 block[0] = (block[0] + (q >> 1)) / q;
3643 qmat = s->q_intra_matrix[qscale];
3644 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3645 bias= 1<<(QMAT_SHIFT-1);
3646 length = s->intra_ac_vlc_length;
3647 last_length= s->intra_ac_vlc_last_length;
3651 qmat = s->q_inter_matrix[qscale];
3652 length = s->inter_ac_vlc_length;
3653 last_length= s->inter_ac_vlc_last_length;
3657 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3658 threshold2= (threshold1<<1);
3660 for(i=63; i>=start_i; i--) {
3661 const int j = scantable[i];
3662 int level = block[j] * qmat[j];
3664 if(((unsigned)(level+threshold1))>threshold2){
3670 for(i=start_i; i<=last_non_zero; i++) {
3671 const int j = scantable[i];
3672 int level = block[j] * qmat[j];
3674 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3675 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3676 if(((unsigned)(level+threshold1))>threshold2){
3678 level= (bias + level)>>QMAT_SHIFT;
3680 coeff[1][i]= level-1;
3681 // coeff[2][k]= level-2;
3683 level= (bias - level)>>QMAT_SHIFT;
3684 coeff[0][i]= -level;
3685 coeff[1][i]= -level+1;
3686 // coeff[2][k]= -level+2;
3688 coeff_count[i]= FFMIN(level, 2);
3689 assert(coeff_count[i]);
3692 coeff[0][i]= (level>>31)|1;
3697 *overflow= s->max_qcoeff < max; //overflow might have happened
3699 if(last_non_zero < start_i){
3700 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3701 return last_non_zero;
3704 score_tab[start_i]= 0;
3705 survivor[0]= start_i;
3708 for(i=start_i; i<=last_non_zero; i++){
3709 int level_index, j, zero_distortion;
3710 int dct_coeff= FFABS(block[ scantable[i] ]);
3711 int best_score=256*256*256*120;
3713 if (s->fdsp.fdct == ff_fdct_ifast)
3714 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3715 zero_distortion= dct_coeff*dct_coeff;
3717 for(level_index=0; level_index < coeff_count[i]; level_index++){
3719 int level= coeff[level_index][i];
3720 const int alevel= FFABS(level);
3725 if(s->out_format == FMT_H263){
3726 unquant_coeff= alevel*qmul + qadd;
3728 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3730 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3731 unquant_coeff = (unquant_coeff - 1) | 1;
3733 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3734 unquant_coeff = (unquant_coeff - 1) | 1;
3739 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3741 if((level&(~127)) == 0){
3742 for(j=survivor_count-1; j>=0; j--){
3743 int run= i - survivor[j];
3744 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3745 score += score_tab[i-run];
3747 if(score < best_score){
3750 level_tab[i+1]= level-64;
3754 if(s->out_format == FMT_H263){
3755 for(j=survivor_count-1; j>=0; j--){
3756 int run= i - survivor[j];
3757 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3758 score += score_tab[i-run];
3759 if(score < last_score){
3762 last_level= level-64;
3768 distortion += esc_length*lambda;
3769 for(j=survivor_count-1; j>=0; j--){
3770 int run= i - survivor[j];
3771 int score= distortion + score_tab[i-run];
3773 if(score < best_score){
3776 level_tab[i+1]= level-64;
3780 if(s->out_format == FMT_H263){
3781 for(j=survivor_count-1; j>=0; j--){
3782 int run= i - survivor[j];
3783 int score= distortion + score_tab[i-run];
3784 if(score < last_score){
3787 last_level= level-64;
3795 score_tab[i+1]= best_score;
3797 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3798 if(last_non_zero <= 27){
3799 for(; survivor_count; survivor_count--){
3800 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3804 for(; survivor_count; survivor_count--){
3805 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3810 survivor[ survivor_count++ ]= i+1;
3813 if(s->out_format != FMT_H263){
3814 last_score= 256*256*256*120;
3815 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3816 int score= score_tab[i];
3817 if(i) score += lambda*2; //FIXME exacter?
3819 if(score < last_score){
3822 last_level= level_tab[i];
3823 last_run= run_tab[i];
3828 s->coded_score[n] = last_score;
3830 dc= FFABS(block[0]);
3831 last_non_zero= last_i - 1;
3832 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3834 if(last_non_zero < start_i)
3835 return last_non_zero;
3837 if(last_non_zero == 0 && start_i == 0){
3839 int best_score= dc * dc;
3841 for(i=0; i<coeff_count[0]; i++){
3842 int level= coeff[i][0];
3843 int alevel= FFABS(level);
3844 int unquant_coeff, score, distortion;
3846 if(s->out_format == FMT_H263){
3847 unquant_coeff= (alevel*qmul + qadd)>>3;
3849 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3850 unquant_coeff = (unquant_coeff - 1) | 1;
3852 unquant_coeff = (unquant_coeff + 4) >> 3;
3853 unquant_coeff<<= 3 + 3;
3855 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3857 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3858 else score= distortion + esc_length*lambda;
3860 if(score < best_score){
3862 best_level= level - 64;
3865 block[0]= best_level;
3866 s->coded_score[n] = best_score - dc*dc;
3867 if(best_level == 0) return -1;
3868 else return last_non_zero;
3874 block[ perm_scantable[last_non_zero] ]= last_level;
3877 for(; i>start_i; i -= run_tab[i] + 1){
3878 block[ perm_scantable[i-1] ]= level_tab[i];
3881 return last_non_zero;
3884 //#define REFINE_STATS 1
3885 static int16_t basis[64][64];
3887 static void build_basis(uint8_t *perm){
3894 double s= 0.25*(1<<BASIS_SHIFT);
3896 int perm_index= perm[index];
3897 if(i==0) s*= sqrt(0.5);
3898 if(j==0) s*= sqrt(0.5);
3899 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)));
3906 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3907 int16_t *block, int16_t *weight, int16_t *orig,
3910 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3911 const uint8_t *scantable= s->intra_scantable.scantable;
3912 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3913 // unsigned int threshold1, threshold2;
3918 int qmul, qadd, start_i, last_non_zero, i, dc;
3920 uint8_t * last_length;
3922 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3925 static int after_last=0;
3926 static int to_zero=0;
3927 static int from_zero=0;
3930 static int messed_sign=0;
3933 if(basis[0][0] == 0)
3934 build_basis(s->idsp.idct_permutation);
3945 /* For AIC we skip quant/dequant of INTRADC */
3949 q <<= RECON_SHIFT-3;
3950 /* note: block[0] is assumed to be positive */
3952 // block[0] = (block[0] + (q >> 1)) / q;
3954 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3955 // bias= 1<<(QMAT_SHIFT-1);
3956 length = s->intra_ac_vlc_length;
3957 last_length= s->intra_ac_vlc_last_length;
3961 length = s->inter_ac_vlc_length;
3962 last_length= s->inter_ac_vlc_last_length;
3964 last_non_zero = s->block_last_index[n];
3969 dc += (1<<(RECON_SHIFT-1));
3970 for(i=0; i<64; i++){
3971 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3974 STOP_TIMER("memset rem[]")}
3977 for(i=0; i<64; i++){
3982 w= FFABS(weight[i]) + qns*one;
3983 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3986 // w=weight[i] = (63*qns + (w/2)) / w;
3992 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3998 for(i=start_i; i<=last_non_zero; i++){
3999 int j= perm_scantable[i];
4000 const int level= block[j];
4004 if(level<0) coeff= qmul*level - qadd;
4005 else coeff= qmul*level + qadd;
4006 run_tab[rle_index++]=run;
4009 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4015 if(last_non_zero>0){
4016 STOP_TIMER("init rem[]")
4023 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4026 int run2, best_unquant_change=0, analyze_gradient;
4030 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4032 if(analyze_gradient){
4036 for(i=0; i<64; i++){
4039 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4042 STOP_TIMER("rem*w*w")}
4052 const int level= block[0];
4053 int change, old_coeff;
4055 assert(s->mb_intra);
4059 for(change=-1; change<=1; change+=2){
4060 int new_level= level + change;
4061 int score, new_coeff;
4063 new_coeff= q*new_level;
4064 if(new_coeff >= 2048 || new_coeff < 0)
4067 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4068 new_coeff - old_coeff);
4069 if(score<best_score){
4072 best_change= change;
4073 best_unquant_change= new_coeff - old_coeff;
4080 run2= run_tab[rle_index++];
4084 for(i=start_i; i<64; i++){
4085 int j= perm_scantable[i];
4086 const int level= block[j];
4087 int change, old_coeff;
4089 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4093 if(level<0) old_coeff= qmul*level - qadd;
4094 else old_coeff= qmul*level + qadd;
4095 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4099 assert(run2>=0 || i >= last_non_zero );
4102 for(change=-1; change<=1; change+=2){
4103 int new_level= level + change;
4104 int score, new_coeff, unquant_change;
4107 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4111 if(new_level<0) new_coeff= qmul*new_level - qadd;
4112 else new_coeff= qmul*new_level + qadd;
4113 if(new_coeff >= 2048 || new_coeff <= -2048)
4115 //FIXME check for overflow
4118 if(level < 63 && level > -63){
4119 if(i < last_non_zero)
4120 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4121 - length[UNI_AC_ENC_INDEX(run, level+64)];
4123 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4124 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4127 assert(FFABS(new_level)==1);
4129 if(analyze_gradient){
4130 int g= d1[ scantable[i] ];
4131 if(g && (g^new_level) >= 0)
4135 if(i < last_non_zero){
4136 int next_i= i + run2 + 1;
4137 int next_level= block[ perm_scantable[next_i] ] + 64;
4139 if(next_level&(~127))
4142 if(next_i < last_non_zero)
4143 score += length[UNI_AC_ENC_INDEX(run, 65)]
4144 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4145 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4147 score += length[UNI_AC_ENC_INDEX(run, 65)]
4148 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4149 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4151 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4153 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4154 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4160 assert(FFABS(level)==1);
4162 if(i < last_non_zero){
4163 int next_i= i + run2 + 1;
4164 int next_level= block[ perm_scantable[next_i] ] + 64;
4166 if(next_level&(~127))
4169 if(next_i < last_non_zero)
4170 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4171 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4172 - length[UNI_AC_ENC_INDEX(run, 65)];
4174 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4175 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4176 - length[UNI_AC_ENC_INDEX(run, 65)];
4178 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4180 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4181 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4188 unquant_change= new_coeff - old_coeff;
4189 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4191 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4193 if(score<best_score){
4196 best_change= change;
4197 best_unquant_change= unquant_change;
4201 prev_level= level + 64;
4202 if(prev_level&(~127))
4211 STOP_TIMER("iterative step")}
4215 int j= perm_scantable[ best_coeff ];
4217 block[j] += best_change;
4219 if(best_coeff > last_non_zero){
4220 last_non_zero= best_coeff;
4228 if(block[j] - best_change){
4229 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4241 for(; last_non_zero>=start_i; last_non_zero--){
4242 if(block[perm_scantable[last_non_zero]])
4248 if(256*256*256*64 % count == 0){
4249 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);
4254 for(i=start_i; i<=last_non_zero; i++){
4255 int j= perm_scantable[i];
4256 const int level= block[j];
4259 run_tab[rle_index++]=run;
4266 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4272 if(last_non_zero>0){
4273 STOP_TIMER("iterative search")
4278 return last_non_zero;
4282 * Permute an 8x8 block according to permuatation.
4283 * @param block the block which will be permuted according to
4284 * the given permutation vector
4285 * @param permutation the permutation vector
4286 * @param last the last non zero coefficient in scantable order, used to
4287 * speed the permutation up
4288 * @param scantable the used scantable, this is only used to speed the
4289 * permutation up, the block is not (inverse) permutated
4290 * to scantable order!
4292 static void block_permute(int16_t *block, uint8_t *permutation,
4293 const uint8_t *scantable, int last)
4300 //FIXME it is ok but not clean and might fail for some permutations
4301 // if (permutation[1] == 1)
4304 for (i = 0; i <= last; i++) {
4305 const int j = scantable[i];
4310 for (i = 0; i <= last; i++) {
4311 const int j = scantable[i];
4312 const int perm_j = permutation[j];
4313 block[perm_j] = temp[j];
4317 int ff_dct_quantize_c(MpegEncContext *s,
4318 int16_t *block, int n,
4319 int qscale, int *overflow)
4321 int i, j, level, last_non_zero, q, start_i;
4323 const uint8_t *scantable= s->intra_scantable.scantable;
4326 unsigned int threshold1, threshold2;
4328 s->fdsp.fdct(block);
4330 if(s->dct_error_sum)
4331 s->denoise_dct(s, block);
4341 /* For AIC we skip quant/dequant of INTRADC */
4344 /* note: block[0] is assumed to be positive */
4345 block[0] = (block[0] + (q >> 1)) / q;
4348 qmat = s->q_intra_matrix[qscale];
4349 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4353 qmat = s->q_inter_matrix[qscale];
4354 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4356 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4357 threshold2= (threshold1<<1);
4358 for(i=63;i>=start_i;i--) {
4360 level = block[j] * qmat[j];
4362 if(((unsigned)(level+threshold1))>threshold2){
4369 for(i=start_i; i<=last_non_zero; i++) {
4371 level = block[j] * qmat[j];
4373 // if( bias+level >= (1<<QMAT_SHIFT)
4374 // || bias-level >= (1<<QMAT_SHIFT)){
4375 if(((unsigned)(level+threshold1))>threshold2){
4377 level= (bias + level)>>QMAT_SHIFT;
4380 level= (bias - level)>>QMAT_SHIFT;
4388 *overflow= s->max_qcoeff < max; //overflow might have happened
4390 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4391 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4392 block_permute(block, s->idsp.idct_permutation,
4393 scantable, last_non_zero);
4395 return last_non_zero;
4398 #define OFFSET(x) offsetof(MpegEncContext, x)
4399 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4400 static const AVOption h263_options[] = {
4401 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4402 { "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},
4403 { "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 },
4408 static const AVClass h263_class = {
4409 .class_name = "H.263 encoder",
4410 .item_name = av_default_item_name,
4411 .option = h263_options,
4412 .version = LIBAVUTIL_VERSION_INT,
4415 AVCodec ff_h263_encoder = {
4417 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4418 .type = AVMEDIA_TYPE_VIDEO,
4419 .id = AV_CODEC_ID_H263,
4420 .priv_data_size = sizeof(MpegEncContext),
4421 .init = ff_mpv_encode_init,
4422 .encode2 = ff_mpv_encode_picture,
4423 .close = ff_mpv_encode_end,
4424 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4425 .priv_class = &h263_class,
4428 static const AVOption h263p_options[] = {
4429 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4430 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4431 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4432 { "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},
4436 static const AVClass h263p_class = {
4437 .class_name = "H.263p encoder",
4438 .item_name = av_default_item_name,
4439 .option = h263p_options,
4440 .version = LIBAVUTIL_VERSION_INT,
4443 AVCodec ff_h263p_encoder = {
4445 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4446 .type = AVMEDIA_TYPE_VIDEO,
4447 .id = AV_CODEC_ID_H263P,
4448 .priv_data_size = sizeof(MpegEncContext),
4449 .init = ff_mpv_encode_init,
4450 .encode2 = ff_mpv_encode_picture,
4451 .close = ff_mpv_encode_end,
4452 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4453 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4454 .priv_class = &h263p_class,
4457 static const AVClass msmpeg4v2_class = {
4458 .class_name = "msmpeg4v2 encoder",
4459 .item_name = av_default_item_name,
4460 .option = ff_mpv_generic_options,
4461 .version = LIBAVUTIL_VERSION_INT,
4464 AVCodec ff_msmpeg4v2_encoder = {
4465 .name = "msmpeg4v2",
4466 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4467 .type = AVMEDIA_TYPE_VIDEO,
4468 .id = AV_CODEC_ID_MSMPEG4V2,
4469 .priv_data_size = sizeof(MpegEncContext),
4470 .init = ff_mpv_encode_init,
4471 .encode2 = ff_mpv_encode_picture,
4472 .close = ff_mpv_encode_end,
4473 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4474 .priv_class = &msmpeg4v2_class,
4477 static const AVClass msmpeg4v3_class = {
4478 .class_name = "msmpeg4v3 encoder",
4479 .item_name = av_default_item_name,
4480 .option = ff_mpv_generic_options,
4481 .version = LIBAVUTIL_VERSION_INT,
4484 AVCodec ff_msmpeg4v3_encoder = {
4486 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4487 .type = AVMEDIA_TYPE_VIDEO,
4488 .id = AV_CODEC_ID_MSMPEG4V3,
4489 .priv_data_size = sizeof(MpegEncContext),
4490 .init = ff_mpv_encode_init,
4491 .encode2 = ff_mpv_encode_picture,
4492 .close = ff_mpv_encode_end,
4493 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4494 .priv_class = &msmpeg4v3_class,
4497 static const AVClass wmv1_class = {
4498 .class_name = "wmv1 encoder",
4499 .item_name = av_default_item_name,
4500 .option = ff_mpv_generic_options,
4501 .version = LIBAVUTIL_VERSION_INT,
4504 AVCodec ff_wmv1_encoder = {
4506 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4507 .type = AVMEDIA_TYPE_VIDEO,
4508 .id = AV_CODEC_ID_WMV1,
4509 .priv_data_size = sizeof(MpegEncContext),
4510 .init = ff_mpv_encode_init,
4511 .encode2 = ff_mpv_encode_picture,
4512 .close = ff_mpv_encode_end,
4513 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4514 .priv_class = &wmv1_class,