2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of Libav.
10 * Libav is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * Libav is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "libavutil/internal.h"
33 #include "libavutil/intmath.h"
34 #include "libavutil/mathematics.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/timer.h"
42 #include "mpegvideo.h"
43 #include "mpegvideodata.h"
47 #include "mjpegenc_common.h"
49 #include "mpegutils.h"
52 #include "pixblockdsp.h"
56 #include "aandcttab.h"
58 #include "mpeg4video.h"
60 #include "bytestream.h"
65 #define QUANT_BIAS_SHIFT 8
67 #define QMAT_SHIFT_MMX 16
70 static int encode_picture(MpegEncContext *s, int picture_number);
71 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
72 static int sse_mb(MpegEncContext *s);
73 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
74 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
76 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
77 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
79 const AVOption ff_mpv_generic_options[] = {
84 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
85 uint16_t (*qmat16)[2][64],
86 const uint16_t *quant_matrix,
87 int bias, int qmin, int qmax, int intra)
89 FDCTDSPContext *fdsp = &s->fdsp;
93 for (qscale = qmin; qscale <= qmax; qscale++) {
95 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
97 fdsp->fdct == ff_faandct ||
98 #endif /* CONFIG_FAANDCT */
99 fdsp->fdct == ff_jpeg_fdct_islow_10) {
100 for (i = 0; i < 64; i++) {
101 const int j = s->idsp.idct_permutation[i];
102 int64_t den = (int64_t) qscale * quant_matrix[j];
103 /* 16 <= qscale * quant_matrix[i] <= 7905
104 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
105 * 19952 <= x <= 249205026
106 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
107 * 3444240 >= (1 << 36) / (x) >= 275 */
109 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
111 } else if (fdsp->fdct == ff_fdct_ifast) {
112 for (i = 0; i < 64; i++) {
113 const int j = s->idsp.idct_permutation[i];
114 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
115 /* 16 <= qscale * quant_matrix[i] <= 7905
116 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
117 * 19952 <= x <= 249205026
118 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
119 * 3444240 >= (1 << 36) / (x) >= 275 */
121 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
124 for (i = 0; i < 64; i++) {
125 const int j = s->idsp.idct_permutation[i];
126 int64_t den = (int64_t) qscale * quant_matrix[j];
127 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
128 * Assume x = qscale * quant_matrix[i]
130 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
131 * so 32768 >= (1 << 19) / (x) >= 67 */
132 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
133 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
134 // (qscale * quant_matrix[i]);
135 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
137 if (qmat16[qscale][0][i] == 0 ||
138 qmat16[qscale][0][i] == 128 * 256)
139 qmat16[qscale][0][i] = 128 * 256 - 1;
140 qmat16[qscale][1][i] =
141 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
142 qmat16[qscale][0][i]);
146 for (i = intra; i < 64; i++) {
148 if (fdsp->fdct == ff_fdct_ifast) {
149 max = (8191LL * ff_aanscales[i]) >> 14;
151 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
157 av_log(NULL, AV_LOG_INFO,
158 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
163 static inline void update_qscale(MpegEncContext *s)
165 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
166 (FF_LAMBDA_SHIFT + 7);
167 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
169 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
173 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
179 for (i = 0; i < 64; i++) {
180 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
187 * init s->current_picture.qscale_table from s->lambda_table
189 void ff_init_qscale_tab(MpegEncContext *s)
191 int8_t * const qscale_table = s->current_picture.qscale_table;
194 for (i = 0; i < s->mb_num; i++) {
195 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
196 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
197 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
202 static void update_duplicate_context_after_me(MpegEncContext *dst,
205 #define COPY(a) dst->a= src->a
207 COPY(current_picture);
213 COPY(picture_in_gop_number);
214 COPY(gop_picture_number);
215 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
216 COPY(progressive_frame); // FIXME don't set in encode_header
217 COPY(partitioned_frame); // FIXME don't set in encode_header
222 * Set the given MpegEncContext to defaults for encoding.
223 * the changed fields will not depend upon the prior state of the MpegEncContext.
225 static void mpv_encode_defaults(MpegEncContext *s)
228 ff_mpv_common_defaults(s);
230 for (i = -16; i < 16; i++) {
231 default_fcode_tab[i + MAX_MV] = 1;
233 s->me.mv_penalty = default_mv_penalty;
234 s->fcode_tab = default_fcode_tab;
236 s->input_picture_number = 0;
237 s->picture_in_gop_number = 0;
240 /* init video encoder */
241 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
243 MpegEncContext *s = avctx->priv_data;
244 int i, ret, format_supported;
246 mpv_encode_defaults(s);
248 switch (avctx->codec_id) {
249 case AV_CODEC_ID_MPEG2VIDEO:
250 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
251 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
252 av_log(avctx, AV_LOG_ERROR,
253 "only YUV420 and YUV422 are supported\n");
257 case AV_CODEC_ID_MJPEG:
258 format_supported = 0;
259 /* JPEG color space */
260 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
261 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
262 (avctx->color_range == AVCOL_RANGE_JPEG &&
263 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
264 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
265 format_supported = 1;
266 /* MPEG color space */
267 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
268 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
269 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
270 format_supported = 1;
272 if (!format_supported) {
273 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
278 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
279 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
284 switch (avctx->pix_fmt) {
285 case AV_PIX_FMT_YUVJ422P:
286 case AV_PIX_FMT_YUV422P:
287 s->chroma_format = CHROMA_422;
289 case AV_PIX_FMT_YUVJ420P:
290 case AV_PIX_FMT_YUV420P:
292 s->chroma_format = CHROMA_420;
296 s->bit_rate = avctx->bit_rate;
297 s->width = avctx->width;
298 s->height = avctx->height;
299 if (avctx->gop_size > 600 &&
300 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
301 av_log(avctx, AV_LOG_ERROR,
302 "Warning keyframe interval too large! reducing it ...\n");
303 avctx->gop_size = 600;
305 s->gop_size = avctx->gop_size;
307 if (avctx->max_b_frames > MAX_B_FRAMES) {
308 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
309 "is %d.\n", MAX_B_FRAMES);
311 s->max_b_frames = avctx->max_b_frames;
312 s->codec_id = avctx->codec->id;
313 s->strict_std_compliance = avctx->strict_std_compliance;
314 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
315 s->mpeg_quant = avctx->mpeg_quant;
316 s->rtp_mode = !!avctx->rtp_payload_size;
317 s->intra_dc_precision = avctx->intra_dc_precision;
318 s->user_specified_pts = AV_NOPTS_VALUE;
320 if (s->gop_size <= 1) {
327 #if FF_API_MOTION_EST
328 FF_DISABLE_DEPRECATION_WARNINGS
329 s->me_method = avctx->me_method;
330 FF_ENABLE_DEPRECATION_WARNINGS
334 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
337 FF_DISABLE_DEPRECATION_WARNINGS
338 if (avctx->border_masking != 0.0)
339 s->border_masking = avctx->border_masking;
340 FF_ENABLE_DEPRECATION_WARNINGS
343 s->adaptive_quant = (s->avctx->lumi_masking ||
344 s->avctx->dark_masking ||
345 s->avctx->temporal_cplx_masking ||
346 s->avctx->spatial_cplx_masking ||
347 s->avctx->p_masking ||
349 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
352 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
354 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
355 av_log(avctx, AV_LOG_ERROR,
356 "a vbv buffer size is needed, "
357 "for encoding with a maximum bitrate\n");
361 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
362 av_log(avctx, AV_LOG_INFO,
363 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
366 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
367 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
371 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
372 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
376 if (avctx->rc_max_rate &&
377 avctx->rc_max_rate == avctx->bit_rate &&
378 avctx->rc_max_rate != avctx->rc_min_rate) {
379 av_log(avctx, AV_LOG_INFO,
380 "impossible bitrate constraints, this will fail\n");
383 if (avctx->rc_buffer_size &&
384 avctx->bit_rate * (int64_t)avctx->time_base.num >
385 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
386 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
390 if (!s->fixed_qscale &&
391 avctx->bit_rate * av_q2d(avctx->time_base) >
392 avctx->bit_rate_tolerance) {
393 av_log(avctx, AV_LOG_ERROR,
394 "bitrate tolerance too small for bitrate\n");
398 if (s->avctx->rc_max_rate &&
399 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
400 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
401 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
402 90000LL * (avctx->rc_buffer_size - 1) >
403 s->avctx->rc_max_rate * 0xFFFFLL) {
404 av_log(avctx, AV_LOG_INFO,
405 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
406 "specified vbv buffer is too large for the given bitrate!\n");
409 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
410 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
411 s->codec_id != AV_CODEC_ID_FLV1) {
412 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
416 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
417 av_log(avctx, AV_LOG_ERROR,
418 "OBMC is only supported with simple mb decision\n");
422 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
423 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
427 if (s->max_b_frames &&
428 s->codec_id != AV_CODEC_ID_MPEG4 &&
429 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
430 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
431 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
435 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
436 s->codec_id == AV_CODEC_ID_H263 ||
437 s->codec_id == AV_CODEC_ID_H263P) &&
438 (avctx->sample_aspect_ratio.num > 255 ||
439 avctx->sample_aspect_ratio.den > 255)) {
440 av_log(avctx, AV_LOG_ERROR,
441 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
442 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
446 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
447 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
448 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
452 // FIXME mpeg2 uses that too
453 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
454 av_log(avctx, AV_LOG_ERROR,
455 "mpeg2 style quantization not supported by codec\n");
459 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
460 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
464 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
465 s->avctx->mb_decision != FF_MB_DECISION_RD) {
466 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
470 if (s->avctx->scenechange_threshold < 1000000000 &&
471 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
472 av_log(avctx, AV_LOG_ERROR,
473 "closed gop with scene change detection are not supported yet, "
474 "set threshold to 1000000000\n");
478 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
479 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
480 av_log(avctx, AV_LOG_ERROR,
481 "low delay forcing is only available for mpeg2\n");
484 if (s->max_b_frames != 0) {
485 av_log(avctx, AV_LOG_ERROR,
486 "b frames cannot be used with low delay\n");
491 if (s->q_scale_type == 1) {
492 if (avctx->qmax > 12) {
493 av_log(avctx, AV_LOG_ERROR,
494 "non linear quant only supports qmax <= 12 currently\n");
499 if (s->avctx->thread_count > 1 &&
500 s->codec_id != AV_CODEC_ID_MPEG4 &&
501 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
502 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
503 (s->codec_id != AV_CODEC_ID_H263P)) {
504 av_log(avctx, AV_LOG_ERROR,
505 "multi threaded encoding not supported by codec\n");
509 if (s->avctx->thread_count < 1) {
510 av_log(avctx, AV_LOG_ERROR,
511 "automatic thread number detection not supported by codec,"
516 if (s->avctx->thread_count > 1)
519 if (!avctx->time_base.den || !avctx->time_base.num) {
520 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
524 if (avctx->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
525 av_log(avctx, AV_LOG_INFO,
526 "notice: b_frame_strategy only affects the first pass\n");
527 avctx->b_frame_strategy = 0;
530 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
532 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
533 avctx->time_base.den /= i;
534 avctx->time_base.num /= i;
538 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
539 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
540 // (a + x * 3 / 8) / x
541 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
542 s->inter_quant_bias = 0;
544 s->intra_quant_bias = 0;
546 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
549 #if FF_API_QUANT_BIAS
550 FF_DISABLE_DEPRECATION_WARNINGS
551 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
552 s->intra_quant_bias = avctx->intra_quant_bias;
553 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
554 s->inter_quant_bias = avctx->inter_quant_bias;
555 FF_ENABLE_DEPRECATION_WARNINGS
558 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
559 s->avctx->time_base.den > (1 << 16) - 1) {
560 av_log(avctx, AV_LOG_ERROR,
561 "timebase %d/%d not supported by MPEG 4 standard, "
562 "the maximum admitted value for the timebase denominator "
563 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
567 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
569 switch (avctx->codec->id) {
570 case AV_CODEC_ID_MPEG1VIDEO:
571 s->out_format = FMT_MPEG1;
572 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
573 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
575 case AV_CODEC_ID_MPEG2VIDEO:
576 s->out_format = FMT_MPEG1;
577 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
578 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
581 case AV_CODEC_ID_MJPEG:
582 s->out_format = FMT_MJPEG;
583 s->intra_only = 1; /* force intra only for jpeg */
584 if (!CONFIG_MJPEG_ENCODER ||
585 ff_mjpeg_encode_init(s) < 0)
590 case AV_CODEC_ID_H261:
591 if (!CONFIG_H261_ENCODER)
593 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
594 av_log(avctx, AV_LOG_ERROR,
595 "The specified picture size of %dx%d is not valid for the "
596 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
597 s->width, s->height);
600 s->out_format = FMT_H261;
603 s->rtp_mode = 0; /* Sliced encoding not supported */
605 case AV_CODEC_ID_H263:
606 if (!CONFIG_H263_ENCODER)
608 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
609 s->width, s->height) == 8) {
610 av_log(avctx, AV_LOG_INFO,
611 "The specified picture size of %dx%d is not valid for "
612 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
613 "352x288, 704x576, and 1408x1152."
614 "Try H.263+.\n", s->width, s->height);
617 s->out_format = FMT_H263;
621 case AV_CODEC_ID_H263P:
622 s->out_format = FMT_H263;
625 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
626 s->modified_quant = s->h263_aic;
627 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
628 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
631 /* These are just to be sure */
635 case AV_CODEC_ID_FLV1:
636 s->out_format = FMT_H263;
637 s->h263_flv = 2; /* format = 1; 11-bit codes */
638 s->unrestricted_mv = 1;
639 s->rtp_mode = 0; /* don't allow GOB */
643 case AV_CODEC_ID_RV10:
644 s->out_format = FMT_H263;
648 case AV_CODEC_ID_RV20:
649 s->out_format = FMT_H263;
652 s->modified_quant = 1;
656 s->unrestricted_mv = 0;
658 case AV_CODEC_ID_MPEG4:
659 s->out_format = FMT_H263;
661 s->unrestricted_mv = 1;
662 s->low_delay = s->max_b_frames ? 0 : 1;
663 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
665 case AV_CODEC_ID_MSMPEG4V2:
666 s->out_format = FMT_H263;
668 s->unrestricted_mv = 1;
669 s->msmpeg4_version = 2;
673 case AV_CODEC_ID_MSMPEG4V3:
674 s->out_format = FMT_H263;
676 s->unrestricted_mv = 1;
677 s->msmpeg4_version = 3;
678 s->flipflop_rounding = 1;
682 case AV_CODEC_ID_WMV1:
683 s->out_format = FMT_H263;
685 s->unrestricted_mv = 1;
686 s->msmpeg4_version = 4;
687 s->flipflop_rounding = 1;
691 case AV_CODEC_ID_WMV2:
692 s->out_format = FMT_H263;
694 s->unrestricted_mv = 1;
695 s->msmpeg4_version = 5;
696 s->flipflop_rounding = 1;
704 avctx->has_b_frames = !s->low_delay;
708 s->progressive_frame =
709 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
710 AV_CODEC_FLAG_INTERLACED_ME) ||
715 if (ff_mpv_common_init(s) < 0)
719 ff_mpv_encode_init_x86(s);
721 ff_fdctdsp_init(&s->fdsp, avctx);
722 ff_me_cmp_init(&s->mecc, avctx);
723 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
724 ff_pixblockdsp_init(&s->pdsp, avctx);
725 ff_qpeldsp_init(&s->qdsp);
727 if (s->msmpeg4_version) {
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
729 2 * 2 * (MAX_LEVEL + 1) *
730 (MAX_RUN + 1) * 2 * sizeof(int), fail);
732 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
735 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
737 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
738 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
739 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
740 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
741 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
743 if (s->avctx->noise_reduction) {
744 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
745 2 * 64 * sizeof(uint16_t), fail);
748 if (CONFIG_H263_ENCODER)
749 ff_h263dsp_init(&s->h263dsp);
750 if (!s->dct_quantize)
751 s->dct_quantize = ff_dct_quantize_c;
753 s->denoise_dct = denoise_dct_c;
754 s->fast_dct_quantize = s->dct_quantize;
756 s->dct_quantize = dct_quantize_trellis_c;
758 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
759 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
761 s->quant_precision = 5;
763 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
764 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
766 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
767 ff_h261_encode_init(s);
768 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
769 ff_h263_encode_init(s);
770 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
771 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
773 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
774 && s->out_format == FMT_MPEG1)
775 ff_mpeg1_encode_init(s);
778 for (i = 0; i < 64; i++) {
779 int j = s->idsp.idct_permutation[i];
780 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
782 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
783 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
784 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
786 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
789 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
790 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
792 if (s->avctx->intra_matrix)
793 s->intra_matrix[j] = s->avctx->intra_matrix[i];
794 if (s->avctx->inter_matrix)
795 s->inter_matrix[j] = s->avctx->inter_matrix[i];
798 /* precompute matrix */
799 /* for mjpeg, we do include qscale in the matrix */
800 if (s->out_format != FMT_MJPEG) {
801 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
802 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
804 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
805 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
809 if (ff_rate_control_init(s) < 0)
812 #if FF_API_ERROR_RATE
813 FF_DISABLE_DEPRECATION_WARNINGS
814 if (avctx->error_rate)
815 s->error_rate = avctx->error_rate;
816 FF_ENABLE_DEPRECATION_WARNINGS;
819 #if FF_API_NORMALIZE_AQP
820 FF_DISABLE_DEPRECATION_WARNINGS
821 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
822 s->mpv_flags |= FF_MPV_FLAG_NAQ;
823 FF_ENABLE_DEPRECATION_WARNINGS;
827 FF_DISABLE_DEPRECATION_WARNINGS
828 if (avctx->flags & CODEC_FLAG_MV0)
829 s->mpv_flags |= FF_MPV_FLAG_MV0;
830 FF_ENABLE_DEPRECATION_WARNINGS
834 FF_DISABLE_DEPRECATION_WARNINGS
835 if (avctx->rc_qsquish != 0.0)
836 s->rc_qsquish = avctx->rc_qsquish;
837 if (avctx->rc_qmod_amp != 0.0)
838 s->rc_qmod_amp = avctx->rc_qmod_amp;
839 if (avctx->rc_qmod_freq)
840 s->rc_qmod_freq = avctx->rc_qmod_freq;
841 if (avctx->rc_buffer_aggressivity != 1.0)
842 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
843 if (avctx->rc_initial_cplx != 0.0)
844 s->rc_initial_cplx = avctx->rc_initial_cplx;
846 s->lmin = avctx->lmin;
848 s->lmax = avctx->lmax;
852 s->rc_eq = av_strdup(avctx->rc_eq);
854 return AVERROR(ENOMEM);
856 FF_ENABLE_DEPRECATION_WARNINGS
859 if (avctx->b_frame_strategy == 2) {
860 for (i = 0; i < s->max_b_frames + 2; i++) {
861 s->tmp_frames[i] = av_frame_alloc();
862 if (!s->tmp_frames[i])
863 return AVERROR(ENOMEM);
865 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
866 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
867 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
869 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
877 ff_mpv_encode_end(avctx);
878 return AVERROR_UNKNOWN;
881 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
883 MpegEncContext *s = avctx->priv_data;
886 ff_rate_control_uninit(s);
888 ff_mpv_common_end(s);
889 if (CONFIG_MJPEG_ENCODER &&
890 s->out_format == FMT_MJPEG)
891 ff_mjpeg_encode_close(s);
893 av_freep(&avctx->extradata);
895 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
896 av_frame_free(&s->tmp_frames[i]);
898 ff_free_picture_tables(&s->new_picture);
899 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
901 av_freep(&s->avctx->stats_out);
902 av_freep(&s->ac_stats);
904 av_freep(&s->q_intra_matrix);
905 av_freep(&s->q_inter_matrix);
906 av_freep(&s->q_intra_matrix16);
907 av_freep(&s->q_inter_matrix16);
908 av_freep(&s->input_picture);
909 av_freep(&s->reordered_input_picture);
910 av_freep(&s->dct_offset);
915 static int get_sae(uint8_t *src, int ref, int stride)
920 for (y = 0; y < 16; y++) {
921 for (x = 0; x < 16; x++) {
922 acc += FFABS(src[x + y * stride] - ref);
929 static int get_intra_count(MpegEncContext *s, uint8_t *src,
930 uint8_t *ref, int stride)
938 for (y = 0; y < h; y += 16) {
939 for (x = 0; x < w; x += 16) {
940 int offset = x + y * stride;
941 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
943 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
944 int sae = get_sae(src + offset, mean, stride);
946 acc += sae + 500 < sad;
952 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
954 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
955 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
956 s->mb_stride, s->mb_height, s->b8_stride,
957 &s->linesize, &s->uvlinesize);
960 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
964 int i, display_picture_number = 0, ret;
965 int encoding_delay = s->max_b_frames ? s->max_b_frames
966 : (s->low_delay ? 0 : 1);
967 int flush_offset = 1;
972 display_picture_number = s->input_picture_number++;
974 if (pts != AV_NOPTS_VALUE) {
975 if (s->user_specified_pts != AV_NOPTS_VALUE) {
977 int64_t last = s->user_specified_pts;
980 av_log(s->avctx, AV_LOG_ERROR,
981 "Error, Invalid timestamp=%"PRId64", "
982 "last=%"PRId64"\n", pts, s->user_specified_pts);
986 if (!s->low_delay && display_picture_number == 1)
987 s->dts_delta = time - last;
989 s->user_specified_pts = pts;
991 if (s->user_specified_pts != AV_NOPTS_VALUE) {
992 s->user_specified_pts =
993 pts = s->user_specified_pts + 1;
994 av_log(s->avctx, AV_LOG_INFO,
995 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
998 pts = display_picture_number;
1002 if (!pic_arg->buf[0] ||
1003 pic_arg->linesize[0] != s->linesize ||
1004 pic_arg->linesize[1] != s->uvlinesize ||
1005 pic_arg->linesize[2] != s->uvlinesize)
1007 if ((s->width & 15) || (s->height & 15))
1010 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1011 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1013 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1017 pic = &s->picture[i];
1021 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1024 ret = alloc_picture(s, pic, direct);
1029 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1030 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1031 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1034 int h_chroma_shift, v_chroma_shift;
1035 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1039 for (i = 0; i < 3; i++) {
1040 int src_stride = pic_arg->linesize[i];
1041 int dst_stride = i ? s->uvlinesize : s->linesize;
1042 int h_shift = i ? h_chroma_shift : 0;
1043 int v_shift = i ? v_chroma_shift : 0;
1044 int w = s->width >> h_shift;
1045 int h = s->height >> v_shift;
1046 uint8_t *src = pic_arg->data[i];
1047 uint8_t *dst = pic->f->data[i];
1049 if (!s->avctx->rc_buffer_size)
1050 dst += INPLACE_OFFSET;
1052 if (src_stride == dst_stride)
1053 memcpy(dst, src, src_stride * h);
1056 uint8_t *dst2 = dst;
1058 memcpy(dst2, src, w);
1063 if ((s->width & 15) || (s->height & 15)) {
1064 s->mpvencdsp.draw_edges(dst, dst_stride,
1073 ret = av_frame_copy_props(pic->f, pic_arg);
1077 pic->f->display_picture_number = display_picture_number;
1078 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1080 /* Flushing: When we have not received enough input frames,
1081 * ensure s->input_picture[0] contains the first picture */
1082 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1083 if (s->input_picture[flush_offset])
1086 if (flush_offset <= 1)
1089 encoding_delay = encoding_delay - flush_offset + 1;
1092 /* shift buffer entries */
1093 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1094 s->input_picture[i - flush_offset] = s->input_picture[i];
1096 s->input_picture[encoding_delay] = (Picture*) pic;
1101 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1105 int64_t score64 = 0;
1107 for (plane = 0; plane < 3; plane++) {
1108 const int stride = p->f->linesize[plane];
1109 const int bw = plane ? 1 : 2;
1110 for (y = 0; y < s->mb_height * bw; y++) {
1111 for (x = 0; x < s->mb_width * bw; x++) {
1112 int off = p->shared ? 0 : 16;
1113 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1114 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1115 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1117 switch (s->avctx->frame_skip_exp) {
1118 case 0: score = FFMAX(score, v); break;
1119 case 1: score += FFABS(v); break;
1120 case 2: score += v * v; break;
1121 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1122 case 4: score64 += v * v * (int64_t)(v * v); break;
1131 if (score64 < s->avctx->frame_skip_threshold)
1133 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1138 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1140 AVPacket pkt = { 0 };
1141 int ret, got_output;
1143 av_init_packet(&pkt);
1144 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1149 av_packet_unref(&pkt);
1153 static int estimate_best_b_count(MpegEncContext *s)
1155 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1156 AVCodecContext *c = avcodec_alloc_context3(NULL);
1157 const int scale = s->avctx->brd_scale;
1158 int i, j, out_size, p_lambda, b_lambda, lambda2;
1159 int64_t best_rd = INT64_MAX;
1160 int best_b_count = -1;
1163 return AVERROR(ENOMEM);
1164 assert(scale >= 0 && scale <= 3);
1167 //s->next_picture_ptr->quality;
1168 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1169 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1170 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1171 if (!b_lambda) // FIXME we should do this somewhere else
1172 b_lambda = p_lambda;
1173 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1176 c->width = s->width >> scale;
1177 c->height = s->height >> scale;
1178 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1179 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1180 c->mb_decision = s->avctx->mb_decision;
1181 c->me_cmp = s->avctx->me_cmp;
1182 c->mb_cmp = s->avctx->mb_cmp;
1183 c->me_sub_cmp = s->avctx->me_sub_cmp;
1184 c->pix_fmt = AV_PIX_FMT_YUV420P;
1185 c->time_base = s->avctx->time_base;
1186 c->max_b_frames = s->max_b_frames;
1188 if (avcodec_open2(c, codec, NULL) < 0)
1191 for (i = 0; i < s->max_b_frames + 2; i++) {
1192 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1193 s->next_picture_ptr;
1195 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1196 pre_input = *pre_input_ptr;
1198 if (!pre_input.shared && i) {
1199 pre_input.f->data[0] += INPLACE_OFFSET;
1200 pre_input.f->data[1] += INPLACE_OFFSET;
1201 pre_input.f->data[2] += INPLACE_OFFSET;
1204 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1205 s->tmp_frames[i]->linesize[0],
1206 pre_input.f->data[0],
1207 pre_input.f->linesize[0],
1208 c->width, c->height);
1209 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1210 s->tmp_frames[i]->linesize[1],
1211 pre_input.f->data[1],
1212 pre_input.f->linesize[1],
1213 c->width >> 1, c->height >> 1);
1214 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1215 s->tmp_frames[i]->linesize[2],
1216 pre_input.f->data[2],
1217 pre_input.f->linesize[2],
1218 c->width >> 1, c->height >> 1);
1222 for (j = 0; j < s->max_b_frames + 1; j++) {
1225 if (!s->input_picture[j])
1228 c->error[0] = c->error[1] = c->error[2] = 0;
1230 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1231 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1233 out_size = encode_frame(c, s->tmp_frames[0]);
1235 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1237 for (i = 0; i < s->max_b_frames + 1; i++) {
1238 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1240 s->tmp_frames[i + 1]->pict_type = is_p ?
1241 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1242 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1244 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1246 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1249 /* get the delayed frames */
1251 out_size = encode_frame(c, NULL);
1252 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1255 rd += c->error[0] + c->error[1] + c->error[2];
1266 return best_b_count;
1269 static int select_input_picture(MpegEncContext *s)
1273 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1274 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1275 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1277 /* set next picture type & ordering */
1278 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1279 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1280 !s->next_picture_ptr || s->intra_only) {
1281 s->reordered_input_picture[0] = s->input_picture[0];
1282 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1283 s->reordered_input_picture[0]->f->coded_picture_number =
1284 s->coded_picture_number++;
1288 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1289 if (s->picture_in_gop_number < s->gop_size &&
1290 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1291 // FIXME check that te gop check above is +-1 correct
1292 av_frame_unref(s->input_picture[0]->f);
1295 ff_vbv_update(s, 0);
1301 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1302 for (i = 0; i < s->max_b_frames + 1; i++) {
1303 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1305 if (pict_num >= s->rc_context.num_entries)
1307 if (!s->input_picture[i]) {
1308 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1312 s->input_picture[i]->f->pict_type =
1313 s->rc_context.entry[pict_num].new_pict_type;
1317 if (s->avctx->b_frame_strategy == 0) {
1318 b_frames = s->max_b_frames;
1319 while (b_frames && !s->input_picture[b_frames])
1321 } else if (s->avctx->b_frame_strategy == 1) {
1322 for (i = 1; i < s->max_b_frames + 1; i++) {
1323 if (s->input_picture[i] &&
1324 s->input_picture[i]->b_frame_score == 0) {
1325 s->input_picture[i]->b_frame_score =
1327 s->input_picture[i ]->f->data[0],
1328 s->input_picture[i - 1]->f->data[0],
1332 for (i = 0; i < s->max_b_frames + 1; i++) {
1333 if (!s->input_picture[i] ||
1334 s->input_picture[i]->b_frame_score - 1 >
1335 s->mb_num / s->avctx->b_sensitivity)
1339 b_frames = FFMAX(0, i - 1);
1342 for (i = 0; i < b_frames + 1; i++) {
1343 s->input_picture[i]->b_frame_score = 0;
1345 } else if (s->avctx->b_frame_strategy == 2) {
1346 b_frames = estimate_best_b_count(s);
1348 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1354 for (i = b_frames - 1; i >= 0; i--) {
1355 int type = s->input_picture[i]->f->pict_type;
1356 if (type && type != AV_PICTURE_TYPE_B)
1359 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1360 b_frames == s->max_b_frames) {
1361 av_log(s->avctx, AV_LOG_ERROR,
1362 "warning, too many b frames in a row\n");
1365 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1366 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1367 s->gop_size > s->picture_in_gop_number) {
1368 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1370 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1372 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1376 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1377 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1380 s->reordered_input_picture[0] = s->input_picture[b_frames];
1381 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1382 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1383 s->reordered_input_picture[0]->f->coded_picture_number =
1384 s->coded_picture_number++;
1385 for (i = 0; i < b_frames; i++) {
1386 s->reordered_input_picture[i + 1] = s->input_picture[i];
1387 s->reordered_input_picture[i + 1]->f->pict_type =
1389 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1390 s->coded_picture_number++;
1395 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1397 if (s->reordered_input_picture[0]) {
1398 s->reordered_input_picture[0]->reference =
1399 s->reordered_input_picture[0]->f->pict_type !=
1400 AV_PICTURE_TYPE_B ? 3 : 0;
1402 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1405 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1406 // input is a shared pix, so we can't modifiy it -> alloc a new
1407 // one & ensure that the shared one is reuseable
1410 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1413 pic = &s->picture[i];
1415 pic->reference = s->reordered_input_picture[0]->reference;
1416 if (alloc_picture(s, pic, 0) < 0) {
1420 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1424 /* mark us unused / free shared pic */
1425 av_frame_unref(s->reordered_input_picture[0]->f);
1426 s->reordered_input_picture[0]->shared = 0;
1428 s->current_picture_ptr = pic;
1430 // input is not a shared pix -> reuse buffer for current_pix
1431 s->current_picture_ptr = s->reordered_input_picture[0];
1432 for (i = 0; i < 4; i++) {
1433 s->new_picture.f->data[i] += INPLACE_OFFSET;
1436 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1437 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1438 s->current_picture_ptr)) < 0)
1441 s->picture_number = s->new_picture.f->display_picture_number;
1446 static void frame_end(MpegEncContext *s)
1450 if (s->unrestricted_mv &&
1451 s->current_picture.reference &&
1453 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1454 int hshift = desc->log2_chroma_w;
1455 int vshift = desc->log2_chroma_h;
1456 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1457 s->h_edge_pos, s->v_edge_pos,
1458 EDGE_WIDTH, EDGE_WIDTH,
1459 EDGE_TOP | EDGE_BOTTOM);
1460 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1461 s->h_edge_pos >> hshift,
1462 s->v_edge_pos >> vshift,
1463 EDGE_WIDTH >> hshift,
1464 EDGE_WIDTH >> vshift,
1465 EDGE_TOP | EDGE_BOTTOM);
1466 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1467 s->h_edge_pos >> hshift,
1468 s->v_edge_pos >> vshift,
1469 EDGE_WIDTH >> hshift,
1470 EDGE_WIDTH >> vshift,
1471 EDGE_TOP | EDGE_BOTTOM);
1476 s->last_pict_type = s->pict_type;
1477 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1478 if (s->pict_type!= AV_PICTURE_TYPE_B)
1479 s->last_non_b_pict_type = s->pict_type;
1482 /* release non-reference frames */
1483 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1484 if (!s->picture[i].reference)
1485 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1489 #if FF_API_CODED_FRAME
1490 FF_DISABLE_DEPRECATION_WARNINGS
1491 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1492 FF_ENABLE_DEPRECATION_WARNINGS
1494 #if FF_API_ERROR_FRAME
1495 FF_DISABLE_DEPRECATION_WARNINGS
1496 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1497 sizeof(s->current_picture.encoding_error));
1498 FF_ENABLE_DEPRECATION_WARNINGS
1502 static void update_noise_reduction(MpegEncContext *s)
1506 for (intra = 0; intra < 2; intra++) {
1507 if (s->dct_count[intra] > (1 << 16)) {
1508 for (i = 0; i < 64; i++) {
1509 s->dct_error_sum[intra][i] >>= 1;
1511 s->dct_count[intra] >>= 1;
1514 for (i = 0; i < 64; i++) {
1515 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1516 s->dct_count[intra] +
1517 s->dct_error_sum[intra][i] / 2) /
1518 (s->dct_error_sum[intra][i] + 1);
1523 static int frame_start(MpegEncContext *s)
1527 /* mark & release old frames */
1528 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1529 s->last_picture_ptr != s->next_picture_ptr &&
1530 s->last_picture_ptr->f->buf[0]) {
1531 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1534 s->current_picture_ptr->f->pict_type = s->pict_type;
1535 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1537 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1538 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1539 s->current_picture_ptr)) < 0)
1542 if (s->pict_type != AV_PICTURE_TYPE_B) {
1543 s->last_picture_ptr = s->next_picture_ptr;
1545 s->next_picture_ptr = s->current_picture_ptr;
1548 if (s->last_picture_ptr) {
1549 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1550 if (s->last_picture_ptr->f->buf[0] &&
1551 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1552 s->last_picture_ptr)) < 0)
1555 if (s->next_picture_ptr) {
1556 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1557 if (s->next_picture_ptr->f->buf[0] &&
1558 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1559 s->next_picture_ptr)) < 0)
1563 if (s->picture_structure!= PICT_FRAME) {
1565 for (i = 0; i < 4; i++) {
1566 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1567 s->current_picture.f->data[i] +=
1568 s->current_picture.f->linesize[i];
1570 s->current_picture.f->linesize[i] *= 2;
1571 s->last_picture.f->linesize[i] *= 2;
1572 s->next_picture.f->linesize[i] *= 2;
1576 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1577 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1578 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1579 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1580 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1581 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1583 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1584 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1587 if (s->dct_error_sum) {
1588 assert(s->avctx->noise_reduction && s->encoding);
1589 update_noise_reduction(s);
1595 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1596 const AVFrame *pic_arg, int *got_packet)
1598 MpegEncContext *s = avctx->priv_data;
1599 int i, stuffing_count, ret;
1600 int context_count = s->slice_context_count;
1602 s->picture_in_gop_number++;
1604 if (load_input_picture(s, pic_arg) < 0)
1607 if (select_input_picture(s) < 0) {
1612 if (s->new_picture.f->data[0]) {
1615 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1618 s->mb_info_ptr = av_packet_new_side_data(pkt,
1619 AV_PKT_DATA_H263_MB_INFO,
1620 s->mb_width*s->mb_height*12);
1621 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1624 for (i = 0; i < context_count; i++) {
1625 int start_y = s->thread_context[i]->start_mb_y;
1626 int end_y = s->thread_context[i]-> end_mb_y;
1627 int h = s->mb_height;
1628 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1629 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1631 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1634 s->pict_type = s->new_picture.f->pict_type;
1636 ret = frame_start(s);
1640 if (encode_picture(s, s->picture_number) < 0)
1643 avctx->header_bits = s->header_bits;
1644 avctx->mv_bits = s->mv_bits;
1645 avctx->misc_bits = s->misc_bits;
1646 avctx->i_tex_bits = s->i_tex_bits;
1647 avctx->p_tex_bits = s->p_tex_bits;
1648 avctx->i_count = s->i_count;
1649 // FIXME f/b_count in avctx
1650 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1651 avctx->skip_count = s->skip_count;
1655 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1658 return AVERROR(ENOMEM);
1659 *(int *)sd = s->current_picture.f->quality;
1661 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1662 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1664 if (avctx->rc_buffer_size) {
1665 RateControlContext *rcc = &s->rc_context;
1666 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1668 if (put_bits_count(&s->pb) > max_size &&
1669 s->lambda < s->lmax) {
1670 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1671 (s->qscale + 1) / s->qscale);
1672 if (s->adaptive_quant) {
1674 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1675 s->lambda_table[i] =
1676 FFMAX(s->lambda_table[i] + 1,
1677 s->lambda_table[i] * (s->qscale + 1) /
1680 s->mb_skipped = 0; // done in frame_start()
1681 // done in encode_picture() so we must undo it
1682 if (s->pict_type == AV_PICTURE_TYPE_P) {
1683 if (s->flipflop_rounding ||
1684 s->codec_id == AV_CODEC_ID_H263P ||
1685 s->codec_id == AV_CODEC_ID_MPEG4)
1686 s->no_rounding ^= 1;
1688 if (s->pict_type != AV_PICTURE_TYPE_B) {
1689 s->time_base = s->last_time_base;
1690 s->last_non_b_time = s->time - s->pp_time;
1692 for (i = 0; i < context_count; i++) {
1693 PutBitContext *pb = &s->thread_context[i]->pb;
1694 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1699 assert(s->avctx->rc_max_rate);
1702 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1703 ff_write_pass1_stats(s);
1705 for (i = 0; i < 4; i++) {
1706 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1707 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1710 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1711 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1712 avctx->i_tex_bits + avctx->p_tex_bits ==
1713 put_bits_count(&s->pb));
1714 flush_put_bits(&s->pb);
1715 s->frame_bits = put_bits_count(&s->pb);
1717 stuffing_count = ff_vbv_update(s, s->frame_bits);
1718 if (stuffing_count) {
1719 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1720 stuffing_count + 50) {
1721 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1725 switch (s->codec_id) {
1726 case AV_CODEC_ID_MPEG1VIDEO:
1727 case AV_CODEC_ID_MPEG2VIDEO:
1728 while (stuffing_count--) {
1729 put_bits(&s->pb, 8, 0);
1732 case AV_CODEC_ID_MPEG4:
1733 put_bits(&s->pb, 16, 0);
1734 put_bits(&s->pb, 16, 0x1C3);
1735 stuffing_count -= 4;
1736 while (stuffing_count--) {
1737 put_bits(&s->pb, 8, 0xFF);
1741 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1743 flush_put_bits(&s->pb);
1744 s->frame_bits = put_bits_count(&s->pb);
1747 /* update mpeg1/2 vbv_delay for CBR */
1748 if (s->avctx->rc_max_rate &&
1749 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1750 s->out_format == FMT_MPEG1 &&
1751 90000LL * (avctx->rc_buffer_size - 1) <=
1752 s->avctx->rc_max_rate * 0xFFFFLL) {
1753 int vbv_delay, min_delay;
1754 double inbits = s->avctx->rc_max_rate *
1755 av_q2d(s->avctx->time_base);
1756 int minbits = s->frame_bits - 8 *
1757 (s->vbv_delay_ptr - s->pb.buf - 1);
1758 double bits = s->rc_context.buffer_index + minbits - inbits;
1761 av_log(s->avctx, AV_LOG_ERROR,
1762 "Internal error, negative bits\n");
1764 assert(s->repeat_first_field == 0);
1766 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1767 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1768 s->avctx->rc_max_rate;
1770 vbv_delay = FFMAX(vbv_delay, min_delay);
1772 assert(vbv_delay < 0xFFFF);
1774 s->vbv_delay_ptr[0] &= 0xF8;
1775 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1776 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1777 s->vbv_delay_ptr[2] &= 0x07;
1778 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1779 avctx->vbv_delay = vbv_delay * 300;
1781 s->total_bits += s->frame_bits;
1782 avctx->frame_bits = s->frame_bits;
1784 pkt->pts = s->current_picture.f->pts;
1785 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1786 if (!s->current_picture.f->coded_picture_number)
1787 pkt->dts = pkt->pts - s->dts_delta;
1789 pkt->dts = s->reordered_pts;
1790 s->reordered_pts = pkt->pts;
1792 pkt->dts = pkt->pts;
1793 if (s->current_picture.f->key_frame)
1794 pkt->flags |= AV_PKT_FLAG_KEY;
1796 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1800 assert((s->frame_bits & 7) == 0);
1802 pkt->size = s->frame_bits / 8;
1803 *got_packet = !!pkt->size;
1807 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1808 int n, int threshold)
1810 static const char tab[64] = {
1811 3, 2, 2, 1, 1, 1, 1, 1,
1812 1, 1, 1, 1, 1, 1, 1, 1,
1813 1, 1, 1, 1, 1, 1, 1, 1,
1814 0, 0, 0, 0, 0, 0, 0, 0,
1815 0, 0, 0, 0, 0, 0, 0, 0,
1816 0, 0, 0, 0, 0, 0, 0, 0,
1817 0, 0, 0, 0, 0, 0, 0, 0,
1818 0, 0, 0, 0, 0, 0, 0, 0
1823 int16_t *block = s->block[n];
1824 const int last_index = s->block_last_index[n];
1827 if (threshold < 0) {
1829 threshold = -threshold;
1833 /* Are all we could set to zero already zero? */
1834 if (last_index <= skip_dc - 1)
1837 for (i = 0; i <= last_index; i++) {
1838 const int j = s->intra_scantable.permutated[i];
1839 const int level = FFABS(block[j]);
1841 if (skip_dc && i == 0)
1845 } else if (level > 1) {
1851 if (score >= threshold)
1853 for (i = skip_dc; i <= last_index; i++) {
1854 const int j = s->intra_scantable.permutated[i];
1858 s->block_last_index[n] = 0;
1860 s->block_last_index[n] = -1;
1863 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1867 const int maxlevel = s->max_qcoeff;
1868 const int minlevel = s->min_qcoeff;
1872 i = 1; // skip clipping of intra dc
1876 for (; i <= last_index; i++) {
1877 const int j = s->intra_scantable.permutated[i];
1878 int level = block[j];
1880 if (level > maxlevel) {
1883 } else if (level < minlevel) {
1891 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1892 av_log(s->avctx, AV_LOG_INFO,
1893 "warning, clipping %d dct coefficients to %d..%d\n",
1894 overflow, minlevel, maxlevel);
1897 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1901 for (y = 0; y < 8; y++) {
1902 for (x = 0; x < 8; x++) {
1908 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1909 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1910 int v = ptr[x2 + y2 * stride];
1916 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1921 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1922 int motion_x, int motion_y,
1923 int mb_block_height,
1926 int16_t weight[8][64];
1927 int16_t orig[8][64];
1928 const int mb_x = s->mb_x;
1929 const int mb_y = s->mb_y;
1932 int dct_offset = s->linesize * 8; // default for progressive frames
1933 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1934 ptrdiff_t wrap_y, wrap_c;
1936 for (i = 0; i < mb_block_count; i++)
1937 skip_dct[i] = s->skipdct;
1939 if (s->adaptive_quant) {
1940 const int last_qp = s->qscale;
1941 const int mb_xy = mb_x + mb_y * s->mb_stride;
1943 s->lambda = s->lambda_table[mb_xy];
1946 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1947 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1948 s->dquant = s->qscale - last_qp;
1950 if (s->out_format == FMT_H263) {
1951 s->dquant = av_clip(s->dquant, -2, 2);
1953 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1955 if (s->pict_type == AV_PICTURE_TYPE_B) {
1956 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1959 if (s->mv_type == MV_TYPE_8X8)
1965 ff_set_qscale(s, last_qp + s->dquant);
1966 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1967 ff_set_qscale(s, s->qscale + s->dquant);
1969 wrap_y = s->linesize;
1970 wrap_c = s->uvlinesize;
1971 ptr_y = s->new_picture.f->data[0] +
1972 (mb_y * 16 * wrap_y) + mb_x * 16;
1973 ptr_cb = s->new_picture.f->data[1] +
1974 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1975 ptr_cr = s->new_picture.f->data[2] +
1976 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1978 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1979 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1980 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1982 16, 16, mb_x * 16, mb_y * 16,
1983 s->width, s->height);
1985 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1987 8, mb_block_height, mb_x * 8, mb_y * 8,
1988 s->width >> 1, s->height >> 1);
1989 ptr_cb = ebuf + 18 * wrap_y;
1990 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1992 8, mb_block_height, mb_x * 8, mb_y * 8,
1993 s->width >> 1, s->height >> 1);
1994 ptr_cr = ebuf + 18 * wrap_y + 8;
1998 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
1999 int progressive_score, interlaced_score;
2001 s->interlaced_dct = 0;
2002 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2003 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2004 NULL, wrap_y, 8) - 400;
2006 if (progressive_score > 0) {
2007 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2008 NULL, wrap_y * 2, 8) +
2009 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2010 NULL, wrap_y * 2, 8);
2011 if (progressive_score > interlaced_score) {
2012 s->interlaced_dct = 1;
2014 dct_offset = wrap_y;
2016 if (s->chroma_format == CHROMA_422)
2022 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2023 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2024 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2025 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2027 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2031 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2032 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2033 if (!s->chroma_y_shift) { /* 422 */
2034 s->pdsp.get_pixels(s->block[6],
2035 ptr_cb + (dct_offset >> 1), wrap_c);
2036 s->pdsp.get_pixels(s->block[7],
2037 ptr_cr + (dct_offset >> 1), wrap_c);
2041 op_pixels_func (*op_pix)[4];
2042 qpel_mc_func (*op_qpix)[16];
2043 uint8_t *dest_y, *dest_cb, *dest_cr;
2045 dest_y = s->dest[0];
2046 dest_cb = s->dest[1];
2047 dest_cr = s->dest[2];
2049 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2050 op_pix = s->hdsp.put_pixels_tab;
2051 op_qpix = s->qdsp.put_qpel_pixels_tab;
2053 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2054 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2057 if (s->mv_dir & MV_DIR_FORWARD) {
2058 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2059 s->last_picture.f->data,
2061 op_pix = s->hdsp.avg_pixels_tab;
2062 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2064 if (s->mv_dir & MV_DIR_BACKWARD) {
2065 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2066 s->next_picture.f->data,
2070 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2071 int progressive_score, interlaced_score;
2073 s->interlaced_dct = 0;
2074 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2075 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2079 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2080 progressive_score -= 400;
2082 if (progressive_score > 0) {
2083 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2085 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2089 if (progressive_score > interlaced_score) {
2090 s->interlaced_dct = 1;
2092 dct_offset = wrap_y;
2094 if (s->chroma_format == CHROMA_422)
2100 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2101 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2102 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2103 dest_y + dct_offset, wrap_y);
2104 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2105 dest_y + dct_offset + 8, wrap_y);
2107 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2111 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2112 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2113 if (!s->chroma_y_shift) { /* 422 */
2114 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2115 dest_cb + (dct_offset >> 1), wrap_c);
2116 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2117 dest_cr + (dct_offset >> 1), wrap_c);
2120 /* pre quantization */
2121 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2122 2 * s->qscale * s->qscale) {
2124 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2126 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2128 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2129 wrap_y, 8) < 20 * s->qscale)
2131 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2132 wrap_y, 8) < 20 * s->qscale)
2134 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2136 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2138 if (!s->chroma_y_shift) { /* 422 */
2139 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2140 dest_cb + (dct_offset >> 1),
2141 wrap_c, 8) < 20 * s->qscale)
2143 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2144 dest_cr + (dct_offset >> 1),
2145 wrap_c, 8) < 20 * s->qscale)
2151 if (s->quantizer_noise_shaping) {
2153 get_visual_weight(weight[0], ptr_y , wrap_y);
2155 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2157 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2159 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2161 get_visual_weight(weight[4], ptr_cb , wrap_c);
2163 get_visual_weight(weight[5], ptr_cr , wrap_c);
2164 if (!s->chroma_y_shift) { /* 422 */
2166 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2169 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2172 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2175 /* DCT & quantize */
2176 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2178 for (i = 0; i < mb_block_count; i++) {
2181 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2182 // FIXME we could decide to change to quantizer instead of
2184 // JS: I don't think that would be a good idea it could lower
2185 // quality instead of improve it. Just INTRADC clipping
2186 // deserves changes in quantizer
2188 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2190 s->block_last_index[i] = -1;
2192 if (s->quantizer_noise_shaping) {
2193 for (i = 0; i < mb_block_count; i++) {
2195 s->block_last_index[i] =
2196 dct_quantize_refine(s, s->block[i], weight[i],
2197 orig[i], i, s->qscale);
2202 if (s->luma_elim_threshold && !s->mb_intra)
2203 for (i = 0; i < 4; i++)
2204 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2205 if (s->chroma_elim_threshold && !s->mb_intra)
2206 for (i = 4; i < mb_block_count; i++)
2207 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2209 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2210 for (i = 0; i < mb_block_count; i++) {
2211 if (s->block_last_index[i] == -1)
2212 s->coded_score[i] = INT_MAX / 256;
2217 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2218 s->block_last_index[4] =
2219 s->block_last_index[5] = 0;
2221 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2224 // non c quantize code returns incorrect block_last_index FIXME
2225 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2226 for (i = 0; i < mb_block_count; i++) {
2228 if (s->block_last_index[i] > 0) {
2229 for (j = 63; j > 0; j--) {
2230 if (s->block[i][s->intra_scantable.permutated[j]])
2233 s->block_last_index[i] = j;
2238 /* huffman encode */
2239 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2240 case AV_CODEC_ID_MPEG1VIDEO:
2241 case AV_CODEC_ID_MPEG2VIDEO:
2242 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2243 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2245 case AV_CODEC_ID_MPEG4:
2246 if (CONFIG_MPEG4_ENCODER)
2247 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2249 case AV_CODEC_ID_MSMPEG4V2:
2250 case AV_CODEC_ID_MSMPEG4V3:
2251 case AV_CODEC_ID_WMV1:
2252 if (CONFIG_MSMPEG4_ENCODER)
2253 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2255 case AV_CODEC_ID_WMV2:
2256 if (CONFIG_WMV2_ENCODER)
2257 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2259 case AV_CODEC_ID_H261:
2260 if (CONFIG_H261_ENCODER)
2261 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2263 case AV_CODEC_ID_H263:
2264 case AV_CODEC_ID_H263P:
2265 case AV_CODEC_ID_FLV1:
2266 case AV_CODEC_ID_RV10:
2267 case AV_CODEC_ID_RV20:
2268 if (CONFIG_H263_ENCODER)
2269 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2271 case AV_CODEC_ID_MJPEG:
2272 if (CONFIG_MJPEG_ENCODER)
2273 ff_mjpeg_encode_mb(s, s->block);
2280 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2282 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2283 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2286 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2289 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2292 d->mb_skip_run= s->mb_skip_run;
2294 d->last_dc[i] = s->last_dc[i];
2297 d->mv_bits= s->mv_bits;
2298 d->i_tex_bits= s->i_tex_bits;
2299 d->p_tex_bits= s->p_tex_bits;
2300 d->i_count= s->i_count;
2301 d->f_count= s->f_count;
2302 d->b_count= s->b_count;
2303 d->skip_count= s->skip_count;
2304 d->misc_bits= s->misc_bits;
2308 d->qscale= s->qscale;
2309 d->dquant= s->dquant;
2311 d->esc3_level_length= s->esc3_level_length;
2314 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2317 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2318 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2321 d->mb_skip_run= s->mb_skip_run;
2323 d->last_dc[i] = s->last_dc[i];
2326 d->mv_bits= s->mv_bits;
2327 d->i_tex_bits= s->i_tex_bits;
2328 d->p_tex_bits= s->p_tex_bits;
2329 d->i_count= s->i_count;
2330 d->f_count= s->f_count;
2331 d->b_count= s->b_count;
2332 d->skip_count= s->skip_count;
2333 d->misc_bits= s->misc_bits;
2335 d->mb_intra= s->mb_intra;
2336 d->mb_skipped= s->mb_skipped;
2337 d->mv_type= s->mv_type;
2338 d->mv_dir= s->mv_dir;
2340 if(s->data_partitioning){
2342 d->tex_pb= s->tex_pb;
2346 d->block_last_index[i]= s->block_last_index[i];
2347 d->interlaced_dct= s->interlaced_dct;
2348 d->qscale= s->qscale;
2350 d->esc3_level_length= s->esc3_level_length;
2353 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2354 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2355 int *dmin, int *next_block, int motion_x, int motion_y)
2358 uint8_t *dest_backup[3];
2360 copy_context_before_encode(s, backup, type);
2362 s->block= s->blocks[*next_block];
2363 s->pb= pb[*next_block];
2364 if(s->data_partitioning){
2365 s->pb2 = pb2 [*next_block];
2366 s->tex_pb= tex_pb[*next_block];
2370 memcpy(dest_backup, s->dest, sizeof(s->dest));
2371 s->dest[0] = s->sc.rd_scratchpad;
2372 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2373 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2374 assert(s->linesize >= 32); //FIXME
2377 encode_mb(s, motion_x, motion_y);
2379 score= put_bits_count(&s->pb);
2380 if(s->data_partitioning){
2381 score+= put_bits_count(&s->pb2);
2382 score+= put_bits_count(&s->tex_pb);
2385 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2386 ff_mpv_decode_mb(s, s->block);
2388 score *= s->lambda2;
2389 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2393 memcpy(s->dest, dest_backup, sizeof(s->dest));
2400 copy_context_after_encode(best, s, type);
2404 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2405 uint32_t *sq = ff_square_tab + 256;
2410 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2411 else if(w==8 && h==8)
2412 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2416 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2425 static int sse_mb(MpegEncContext *s){
2429 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2430 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2433 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2434 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) +
2435 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) +
2436 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);
2438 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) +
2439 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) +
2440 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);
2443 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)
2444 +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)
2445 +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);
2448 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2449 MpegEncContext *s= *(void**)arg;
2453 s->me.dia_size= s->avctx->pre_dia_size;
2454 s->first_slice_line=1;
2455 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2456 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2457 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2459 s->first_slice_line=0;
2467 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2468 MpegEncContext *s= *(void**)arg;
2470 s->me.dia_size= s->avctx->dia_size;
2471 s->first_slice_line=1;
2472 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2473 s->mb_x=0; //for block init below
2474 ff_init_block_index(s);
2475 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2476 s->block_index[0]+=2;
2477 s->block_index[1]+=2;
2478 s->block_index[2]+=2;
2479 s->block_index[3]+=2;
2481 /* compute motion vector & mb_type and store in context */
2482 if(s->pict_type==AV_PICTURE_TYPE_B)
2483 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2485 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2487 s->first_slice_line=0;
2492 static int mb_var_thread(AVCodecContext *c, void *arg){
2493 MpegEncContext *s= *(void**)arg;
2496 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2497 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2500 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2502 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2504 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2505 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2507 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2508 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2509 s->me.mb_var_sum_temp += varc;
2515 static void write_slice_end(MpegEncContext *s){
2516 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2517 if(s->partitioned_frame){
2518 ff_mpeg4_merge_partitions(s);
2521 ff_mpeg4_stuffing(&s->pb);
2522 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2523 ff_mjpeg_encode_stuffing(&s->pb);
2526 avpriv_align_put_bits(&s->pb);
2527 flush_put_bits(&s->pb);
2529 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2530 s->misc_bits+= get_bits_diff(s);
2533 static void write_mb_info(MpegEncContext *s)
2535 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2536 int offset = put_bits_count(&s->pb);
2537 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2538 int gobn = s->mb_y / s->gob_index;
2540 if (CONFIG_H263_ENCODER)
2541 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2542 bytestream_put_le32(&ptr, offset);
2543 bytestream_put_byte(&ptr, s->qscale);
2544 bytestream_put_byte(&ptr, gobn);
2545 bytestream_put_le16(&ptr, mba);
2546 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2547 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2548 /* 4MV not implemented */
2549 bytestream_put_byte(&ptr, 0); /* hmv2 */
2550 bytestream_put_byte(&ptr, 0); /* vmv2 */
2553 static void update_mb_info(MpegEncContext *s, int startcode)
2557 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2558 s->mb_info_size += 12;
2559 s->prev_mb_info = s->last_mb_info;
2562 s->prev_mb_info = put_bits_count(&s->pb)/8;
2563 /* This might have incremented mb_info_size above, and we return without
2564 * actually writing any info into that slot yet. But in that case,
2565 * this will be called again at the start of the after writing the
2566 * start code, actually writing the mb info. */
2570 s->last_mb_info = put_bits_count(&s->pb)/8;
2571 if (!s->mb_info_size)
2572 s->mb_info_size += 12;
2576 static int encode_thread(AVCodecContext *c, void *arg){
2577 MpegEncContext *s= *(void**)arg;
2578 int mb_x, mb_y, pdif = 0;
2579 int chr_h= 16>>s->chroma_y_shift;
2581 MpegEncContext best_s = { 0 }, backup_s;
2582 uint8_t bit_buf[2][MAX_MB_BYTES];
2583 uint8_t bit_buf2[2][MAX_MB_BYTES];
2584 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2585 PutBitContext pb[2], pb2[2], tex_pb[2];
2588 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2589 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2590 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2593 s->last_bits= put_bits_count(&s->pb);
2604 /* init last dc values */
2605 /* note: quant matrix value (8) is implied here */
2606 s->last_dc[i] = 128 << s->intra_dc_precision;
2608 s->current_picture.encoding_error[i] = 0;
2611 memset(s->last_mv, 0, sizeof(s->last_mv));
2615 switch(s->codec_id){
2616 case AV_CODEC_ID_H263:
2617 case AV_CODEC_ID_H263P:
2618 case AV_CODEC_ID_FLV1:
2619 if (CONFIG_H263_ENCODER)
2620 s->gob_index = H263_GOB_HEIGHT(s->height);
2622 case AV_CODEC_ID_MPEG4:
2623 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2624 ff_mpeg4_init_partitions(s);
2630 s->first_slice_line = 1;
2631 s->ptr_lastgob = s->pb.buf;
2632 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2636 ff_set_qscale(s, s->qscale);
2637 ff_init_block_index(s);
2639 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2640 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2641 int mb_type= s->mb_type[xy];
2646 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2647 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2650 if(s->data_partitioning){
2651 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2652 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2653 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2659 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2660 ff_update_block_index(s);
2662 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2663 ff_h261_reorder_mb_index(s);
2664 xy= s->mb_y*s->mb_stride + s->mb_x;
2665 mb_type= s->mb_type[xy];
2668 /* write gob / video packet header */
2670 int current_packet_size, is_gob_start;
2672 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2674 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2676 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2678 switch(s->codec_id){
2679 case AV_CODEC_ID_H263:
2680 case AV_CODEC_ID_H263P:
2681 if(!s->h263_slice_structured)
2682 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2684 case AV_CODEC_ID_MPEG2VIDEO:
2685 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2686 case AV_CODEC_ID_MPEG1VIDEO:
2687 if(s->mb_skip_run) is_gob_start=0;
2692 if(s->start_mb_y != mb_y || mb_x!=0){
2695 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2696 ff_mpeg4_init_partitions(s);
2700 assert((put_bits_count(&s->pb)&7) == 0);
2701 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2703 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2704 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2705 int d = 100 / s->error_rate;
2707 current_packet_size=0;
2708 s->pb.buf_ptr= s->ptr_lastgob;
2709 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2713 if (s->avctx->rtp_callback){
2714 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2715 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2717 update_mb_info(s, 1);
2719 switch(s->codec_id){
2720 case AV_CODEC_ID_MPEG4:
2721 if (CONFIG_MPEG4_ENCODER) {
2722 ff_mpeg4_encode_video_packet_header(s);
2723 ff_mpeg4_clean_buffers(s);
2726 case AV_CODEC_ID_MPEG1VIDEO:
2727 case AV_CODEC_ID_MPEG2VIDEO:
2728 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2729 ff_mpeg1_encode_slice_header(s);
2730 ff_mpeg1_clean_buffers(s);
2733 case AV_CODEC_ID_H263:
2734 case AV_CODEC_ID_H263P:
2735 if (CONFIG_H263_ENCODER)
2736 ff_h263_encode_gob_header(s, mb_y);
2740 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2741 int bits= put_bits_count(&s->pb);
2742 s->misc_bits+= bits - s->last_bits;
2746 s->ptr_lastgob += current_packet_size;
2747 s->first_slice_line=1;
2748 s->resync_mb_x=mb_x;
2749 s->resync_mb_y=mb_y;
2753 if( (s->resync_mb_x == s->mb_x)
2754 && s->resync_mb_y+1 == s->mb_y){
2755 s->first_slice_line=0;
2759 s->dquant=0; //only for QP_RD
2761 update_mb_info(s, 0);
2763 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
2765 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2767 copy_context_before_encode(&backup_s, s, -1);
2769 best_s.data_partitioning= s->data_partitioning;
2770 best_s.partitioned_frame= s->partitioned_frame;
2771 if(s->data_partitioning){
2772 backup_s.pb2= s->pb2;
2773 backup_s.tex_pb= s->tex_pb;
2776 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2777 s->mv_dir = MV_DIR_FORWARD;
2778 s->mv_type = MV_TYPE_16X16;
2780 s->mv[0][0][0] = s->p_mv_table[xy][0];
2781 s->mv[0][0][1] = s->p_mv_table[xy][1];
2782 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2783 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2785 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2786 s->mv_dir = MV_DIR_FORWARD;
2787 s->mv_type = MV_TYPE_FIELD;
2790 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2791 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2792 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2794 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2795 &dmin, &next_block, 0, 0);
2797 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2798 s->mv_dir = MV_DIR_FORWARD;
2799 s->mv_type = MV_TYPE_16X16;
2803 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2804 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2806 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2807 s->mv_dir = MV_DIR_FORWARD;
2808 s->mv_type = MV_TYPE_8X8;
2811 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2812 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2814 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2815 &dmin, &next_block, 0, 0);
2817 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2818 s->mv_dir = MV_DIR_FORWARD;
2819 s->mv_type = MV_TYPE_16X16;
2821 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2822 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2823 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2824 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2826 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2827 s->mv_dir = MV_DIR_BACKWARD;
2828 s->mv_type = MV_TYPE_16X16;
2830 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2831 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2832 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2833 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2835 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2836 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2837 s->mv_type = MV_TYPE_16X16;
2839 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2840 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2841 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2842 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2843 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2844 &dmin, &next_block, 0, 0);
2846 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2847 s->mv_dir = MV_DIR_FORWARD;
2848 s->mv_type = MV_TYPE_FIELD;
2851 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2852 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2853 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2855 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2856 &dmin, &next_block, 0, 0);
2858 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2859 s->mv_dir = MV_DIR_BACKWARD;
2860 s->mv_type = MV_TYPE_FIELD;
2863 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2864 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2865 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2867 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2868 &dmin, &next_block, 0, 0);
2870 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2871 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2872 s->mv_type = MV_TYPE_FIELD;
2874 for(dir=0; dir<2; dir++){
2876 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2877 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2878 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2881 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2882 &dmin, &next_block, 0, 0);
2884 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2886 s->mv_type = MV_TYPE_16X16;
2890 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2891 &dmin, &next_block, 0, 0);
2892 if(s->h263_pred || s->h263_aic){
2894 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2896 ff_clean_intra_table_entries(s); //old mode?
2900 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2901 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2902 const int last_qp= backup_s.qscale;
2905 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2906 static const int dquant_tab[4]={-1,1,-2,2};
2908 assert(backup_s.dquant == 0);
2911 s->mv_dir= best_s.mv_dir;
2912 s->mv_type = MV_TYPE_16X16;
2913 s->mb_intra= best_s.mb_intra;
2914 s->mv[0][0][0] = best_s.mv[0][0][0];
2915 s->mv[0][0][1] = best_s.mv[0][0][1];
2916 s->mv[1][0][0] = best_s.mv[1][0][0];
2917 s->mv[1][0][1] = best_s.mv[1][0][1];
2919 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2920 for(; qpi<4; qpi++){
2921 int dquant= dquant_tab[qpi];
2922 qp= last_qp + dquant;
2923 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2925 backup_s.dquant= dquant;
2926 if(s->mb_intra && s->dc_val[0]){
2928 dc[i]= s->dc_val[0][ s->block_index[i] ];
2929 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2933 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2934 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2935 if(best_s.qscale != qp){
2936 if(s->mb_intra && s->dc_val[0]){
2938 s->dc_val[0][ s->block_index[i] ]= dc[i];
2939 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2946 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2947 int mx= s->b_direct_mv_table[xy][0];
2948 int my= s->b_direct_mv_table[xy][1];
2950 backup_s.dquant = 0;
2951 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2953 ff_mpeg4_set_direct_mv(s, mx, my);
2954 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2955 &dmin, &next_block, mx, my);
2957 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2958 backup_s.dquant = 0;
2959 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2961 ff_mpeg4_set_direct_mv(s, 0, 0);
2962 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2963 &dmin, &next_block, 0, 0);
2965 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2968 coded |= s->block_last_index[i];
2971 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2972 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2973 mx=my=0; //FIXME find the one we actually used
2974 ff_mpeg4_set_direct_mv(s, mx, my);
2975 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2983 s->mv_dir= best_s.mv_dir;
2984 s->mv_type = best_s.mv_type;
2986 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2987 s->mv[0][0][1] = best_s.mv[0][0][1];
2988 s->mv[1][0][0] = best_s.mv[1][0][0];
2989 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2992 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2993 &dmin, &next_block, mx, my);
2998 s->current_picture.qscale_table[xy] = best_s.qscale;
3000 copy_context_after_encode(s, &best_s, -1);
3002 pb_bits_count= put_bits_count(&s->pb);
3003 flush_put_bits(&s->pb);
3004 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3007 if(s->data_partitioning){
3008 pb2_bits_count= put_bits_count(&s->pb2);
3009 flush_put_bits(&s->pb2);
3010 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3011 s->pb2= backup_s.pb2;
3013 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3014 flush_put_bits(&s->tex_pb);
3015 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3016 s->tex_pb= backup_s.tex_pb;
3018 s->last_bits= put_bits_count(&s->pb);
3020 if (CONFIG_H263_ENCODER &&
3021 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3022 ff_h263_update_motion_val(s);
3024 if(next_block==0){ //FIXME 16 vs linesize16
3025 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3026 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3027 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3030 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3031 ff_mpv_decode_mb(s, s->block);
3033 int motion_x = 0, motion_y = 0;
3034 s->mv_type=MV_TYPE_16X16;
3035 // only one MB-Type possible
3038 case CANDIDATE_MB_TYPE_INTRA:
3041 motion_x= s->mv[0][0][0] = 0;
3042 motion_y= s->mv[0][0][1] = 0;
3044 case CANDIDATE_MB_TYPE_INTER:
3045 s->mv_dir = MV_DIR_FORWARD;
3047 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3048 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3050 case CANDIDATE_MB_TYPE_INTER_I:
3051 s->mv_dir = MV_DIR_FORWARD;
3052 s->mv_type = MV_TYPE_FIELD;
3055 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3056 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3057 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3060 case CANDIDATE_MB_TYPE_INTER4V:
3061 s->mv_dir = MV_DIR_FORWARD;
3062 s->mv_type = MV_TYPE_8X8;
3065 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3066 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3069 case CANDIDATE_MB_TYPE_DIRECT:
3070 if (CONFIG_MPEG4_ENCODER) {
3071 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3073 motion_x=s->b_direct_mv_table[xy][0];
3074 motion_y=s->b_direct_mv_table[xy][1];
3075 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3078 case CANDIDATE_MB_TYPE_DIRECT0:
3079 if (CONFIG_MPEG4_ENCODER) {
3080 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3082 ff_mpeg4_set_direct_mv(s, 0, 0);
3085 case CANDIDATE_MB_TYPE_BIDIR:
3086 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3088 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3089 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3090 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3091 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3093 case CANDIDATE_MB_TYPE_BACKWARD:
3094 s->mv_dir = MV_DIR_BACKWARD;
3096 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3097 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3099 case CANDIDATE_MB_TYPE_FORWARD:
3100 s->mv_dir = MV_DIR_FORWARD;
3102 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3103 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3105 case CANDIDATE_MB_TYPE_FORWARD_I:
3106 s->mv_dir = MV_DIR_FORWARD;
3107 s->mv_type = MV_TYPE_FIELD;
3110 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3111 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3112 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3115 case CANDIDATE_MB_TYPE_BACKWARD_I:
3116 s->mv_dir = MV_DIR_BACKWARD;
3117 s->mv_type = MV_TYPE_FIELD;
3120 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3121 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3122 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3125 case CANDIDATE_MB_TYPE_BIDIR_I:
3126 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3127 s->mv_type = MV_TYPE_FIELD;
3129 for(dir=0; dir<2; dir++){
3131 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3132 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3133 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3138 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3141 encode_mb(s, motion_x, motion_y);
3143 // RAL: Update last macroblock type
3144 s->last_mv_dir = s->mv_dir;
3146 if (CONFIG_H263_ENCODER &&
3147 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3148 ff_h263_update_motion_val(s);
3150 ff_mpv_decode_mb(s, s->block);
3153 /* clean the MV table in IPS frames for direct mode in B frames */
3154 if(s->mb_intra /* && I,P,S_TYPE */){
3155 s->p_mv_table[xy][0]=0;
3156 s->p_mv_table[xy][1]=0;
3159 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3163 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3164 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3166 s->current_picture.encoding_error[0] += sse(
3167 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3168 s->dest[0], w, h, s->linesize);
3169 s->current_picture.encoding_error[1] += sse(
3170 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3171 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3172 s->current_picture.encoding_error[2] += sse(
3173 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3174 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3177 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3178 ff_h263_loop_filter(s);
3180 ff_dlog(s->avctx, "MB %d %d bits\n",
3181 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3185 //not beautiful here but we must write it before flushing so it has to be here
3186 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3187 ff_msmpeg4_encode_ext_header(s);
3191 /* Send the last GOB if RTP */
3192 if (s->avctx->rtp_callback) {
3193 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3194 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3195 /* Call the RTP callback to send the last GOB */
3197 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3203 #define MERGE(field) dst->field += src->field; src->field=0
3204 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3205 MERGE(me.scene_change_score);
3206 MERGE(me.mc_mb_var_sum_temp);
3207 MERGE(me.mb_var_sum_temp);
3210 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3213 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3214 MERGE(dct_count[1]);
3223 MERGE(er.error_count);
3224 MERGE(padding_bug_score);
3225 MERGE(current_picture.encoding_error[0]);
3226 MERGE(current_picture.encoding_error[1]);
3227 MERGE(current_picture.encoding_error[2]);
3229 if(dst->avctx->noise_reduction){
3230 for(i=0; i<64; i++){
3231 MERGE(dct_error_sum[0][i]);
3232 MERGE(dct_error_sum[1][i]);
3236 assert(put_bits_count(&src->pb) % 8 ==0);
3237 assert(put_bits_count(&dst->pb) % 8 ==0);
3238 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3239 flush_put_bits(&dst->pb);
3242 static int estimate_qp(MpegEncContext *s, int dry_run){
3243 if (s->next_lambda){
3244 s->current_picture_ptr->f->quality =
3245 s->current_picture.f->quality = s->next_lambda;
3246 if(!dry_run) s->next_lambda= 0;
3247 } else if (!s->fixed_qscale) {
3248 s->current_picture_ptr->f->quality =
3249 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3250 if (s->current_picture.f->quality < 0)
3254 if(s->adaptive_quant){
3255 switch(s->codec_id){
3256 case AV_CODEC_ID_MPEG4:
3257 if (CONFIG_MPEG4_ENCODER)
3258 ff_clean_mpeg4_qscales(s);
3260 case AV_CODEC_ID_H263:
3261 case AV_CODEC_ID_H263P:
3262 case AV_CODEC_ID_FLV1:
3263 if (CONFIG_H263_ENCODER)
3264 ff_clean_h263_qscales(s);
3267 ff_init_qscale_tab(s);
3270 s->lambda= s->lambda_table[0];
3273 s->lambda = s->current_picture.f->quality;
3278 /* must be called before writing the header */
3279 static void set_frame_distances(MpegEncContext * s){
3280 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3281 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3283 if(s->pict_type==AV_PICTURE_TYPE_B){
3284 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3285 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3287 s->pp_time= s->time - s->last_non_b_time;
3288 s->last_non_b_time= s->time;
3289 assert(s->picture_number==0 || s->pp_time > 0);
3293 static int encode_picture(MpegEncContext *s, int picture_number)
3297 int context_count = s->slice_context_count;
3299 s->picture_number = picture_number;
3301 /* Reset the average MB variance */
3302 s->me.mb_var_sum_temp =
3303 s->me.mc_mb_var_sum_temp = 0;
3305 /* we need to initialize some time vars before we can encode b-frames */
3306 // RAL: Condition added for MPEG1VIDEO
3307 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3308 set_frame_distances(s);
3309 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3310 ff_set_mpeg4_time(s);
3312 s->me.scene_change_score=0;
3314 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3316 if(s->pict_type==AV_PICTURE_TYPE_I){
3317 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3318 else s->no_rounding=0;
3319 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3320 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3321 s->no_rounding ^= 1;
3324 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3325 if (estimate_qp(s,1) < 0)
3327 ff_get_2pass_fcode(s);
3328 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3329 if(s->pict_type==AV_PICTURE_TYPE_B)
3330 s->lambda= s->last_lambda_for[s->pict_type];
3332 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3336 s->mb_intra=0; //for the rate distortion & bit compare functions
3337 for(i=1; i<context_count; i++){
3338 ret = ff_update_duplicate_context(s->thread_context[i], s);
3346 /* Estimate motion for every MB */
3347 if(s->pict_type != AV_PICTURE_TYPE_I){
3348 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3349 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3350 if (s->pict_type != AV_PICTURE_TYPE_B) {
3351 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3352 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3356 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3357 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3359 for(i=0; i<s->mb_stride*s->mb_height; i++)
3360 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3362 if(!s->fixed_qscale){
3363 /* finding spatial complexity for I-frame rate control */
3364 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3367 for(i=1; i<context_count; i++){
3368 merge_context_after_me(s, s->thread_context[i]);
3370 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3371 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3374 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3375 s->pict_type= AV_PICTURE_TYPE_I;
3376 for(i=0; i<s->mb_stride*s->mb_height; i++)
3377 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3378 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3379 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3383 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3384 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3386 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3388 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3389 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3390 s->f_code= FFMAX3(s->f_code, a, b);
3393 ff_fix_long_p_mvs(s);
3394 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3395 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3399 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3400 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3405 if(s->pict_type==AV_PICTURE_TYPE_B){
3408 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3409 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3410 s->f_code = FFMAX(a, b);
3412 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3413 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3414 s->b_code = FFMAX(a, b);
3416 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3417 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3418 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3419 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3420 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3422 for(dir=0; dir<2; dir++){
3425 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3426 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3427 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3428 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3436 if (estimate_qp(s, 0) < 0)
3439 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3440 s->pict_type == AV_PICTURE_TYPE_I &&
3441 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3442 s->qscale= 3; //reduce clipping problems
3444 if (s->out_format == FMT_MJPEG) {
3445 /* for mjpeg, we do include qscale in the matrix */
3447 int j = s->idsp.idct_permutation[i];
3449 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3451 s->y_dc_scale_table=
3452 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3453 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3454 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3455 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3459 //FIXME var duplication
3460 s->current_picture_ptr->f->key_frame =
3461 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3462 s->current_picture_ptr->f->pict_type =
3463 s->current_picture.f->pict_type = s->pict_type;
3465 if (s->current_picture.f->key_frame)
3466 s->picture_in_gop_number=0;
3468 s->last_bits= put_bits_count(&s->pb);
3469 switch(s->out_format) {
3471 if (CONFIG_MJPEG_ENCODER)
3472 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3476 if (CONFIG_H261_ENCODER)
3477 ff_h261_encode_picture_header(s, picture_number);
3480 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3481 ff_wmv2_encode_picture_header(s, picture_number);
3482 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3483 ff_msmpeg4_encode_picture_header(s, picture_number);
3484 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3485 ff_mpeg4_encode_picture_header(s, picture_number);
3486 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3487 ret = ff_rv10_encode_picture_header(s, picture_number);
3491 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3492 ff_rv20_encode_picture_header(s, picture_number);
3493 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3494 ff_flv_encode_picture_header(s, picture_number);
3495 else if (CONFIG_H263_ENCODER)
3496 ff_h263_encode_picture_header(s, picture_number);
3499 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3500 ff_mpeg1_encode_picture_header(s, picture_number);
3505 bits= put_bits_count(&s->pb);
3506 s->header_bits= bits - s->last_bits;
3508 for(i=1; i<context_count; i++){
3509 update_duplicate_context_after_me(s->thread_context[i], s);
3511 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3512 for(i=1; i<context_count; i++){
3513 merge_context_after_encode(s, s->thread_context[i]);
3519 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3520 const int intra= s->mb_intra;
3523 s->dct_count[intra]++;
3525 for(i=0; i<64; i++){
3526 int level= block[i];
3530 s->dct_error_sum[intra][i] += level;
3531 level -= s->dct_offset[intra][i];
3532 if(level<0) level=0;
3534 s->dct_error_sum[intra][i] -= level;
3535 level += s->dct_offset[intra][i];
3536 if(level>0) level=0;
3543 static int dct_quantize_trellis_c(MpegEncContext *s,
3544 int16_t *block, int n,
3545 int qscale, int *overflow){
3547 const uint8_t *scantable= s->intra_scantable.scantable;
3548 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3550 unsigned int threshold1, threshold2;
3562 int coeff_count[64];
3563 int qmul, qadd, start_i, last_non_zero, i, dc;
3564 const int esc_length= s->ac_esc_length;
3566 uint8_t * last_length;
3567 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3569 s->fdsp.fdct(block);
3571 if(s->dct_error_sum)
3572 s->denoise_dct(s, block);
3574 qadd= ((qscale-1)|1)*8;
3585 /* For AIC we skip quant/dequant of INTRADC */
3590 /* note: block[0] is assumed to be positive */
3591 block[0] = (block[0] + (q >> 1)) / q;
3594 qmat = s->q_intra_matrix[qscale];
3595 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3596 bias= 1<<(QMAT_SHIFT-1);
3597 length = s->intra_ac_vlc_length;
3598 last_length= s->intra_ac_vlc_last_length;
3602 qmat = s->q_inter_matrix[qscale];
3603 length = s->inter_ac_vlc_length;
3604 last_length= s->inter_ac_vlc_last_length;
3608 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3609 threshold2= (threshold1<<1);
3611 for(i=63; i>=start_i; i--) {
3612 const int j = scantable[i];
3613 int level = block[j] * qmat[j];
3615 if(((unsigned)(level+threshold1))>threshold2){
3621 for(i=start_i; i<=last_non_zero; i++) {
3622 const int j = scantable[i];
3623 int level = block[j] * qmat[j];
3625 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3626 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3627 if(((unsigned)(level+threshold1))>threshold2){
3629 level= (bias + level)>>QMAT_SHIFT;
3631 coeff[1][i]= level-1;
3632 // coeff[2][k]= level-2;
3634 level= (bias - level)>>QMAT_SHIFT;
3635 coeff[0][i]= -level;
3636 coeff[1][i]= -level+1;
3637 // coeff[2][k]= -level+2;
3639 coeff_count[i]= FFMIN(level, 2);
3640 assert(coeff_count[i]);
3643 coeff[0][i]= (level>>31)|1;
3648 *overflow= s->max_qcoeff < max; //overflow might have happened
3650 if(last_non_zero < start_i){
3651 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3652 return last_non_zero;
3655 score_tab[start_i]= 0;
3656 survivor[0]= start_i;
3659 for(i=start_i; i<=last_non_zero; i++){
3660 int level_index, j, zero_distortion;
3661 int dct_coeff= FFABS(block[ scantable[i] ]);
3662 int best_score=256*256*256*120;
3664 if (s->fdsp.fdct == ff_fdct_ifast)
3665 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3666 zero_distortion= dct_coeff*dct_coeff;
3668 for(level_index=0; level_index < coeff_count[i]; level_index++){
3670 int level= coeff[level_index][i];
3671 const int alevel= FFABS(level);
3676 if(s->out_format == FMT_H263){
3677 unquant_coeff= alevel*qmul + qadd;
3679 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3681 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3682 unquant_coeff = (unquant_coeff - 1) | 1;
3684 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3685 unquant_coeff = (unquant_coeff - 1) | 1;
3690 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3692 if((level&(~127)) == 0){
3693 for(j=survivor_count-1; j>=0; j--){
3694 int run= i - survivor[j];
3695 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3696 score += score_tab[i-run];
3698 if(score < best_score){
3701 level_tab[i+1]= level-64;
3705 if(s->out_format == FMT_H263){
3706 for(j=survivor_count-1; j>=0; j--){
3707 int run= i - survivor[j];
3708 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3709 score += score_tab[i-run];
3710 if(score < last_score){
3713 last_level= level-64;
3719 distortion += esc_length*lambda;
3720 for(j=survivor_count-1; j>=0; j--){
3721 int run= i - survivor[j];
3722 int score= distortion + score_tab[i-run];
3724 if(score < best_score){
3727 level_tab[i+1]= level-64;
3731 if(s->out_format == FMT_H263){
3732 for(j=survivor_count-1; j>=0; j--){
3733 int run= i - survivor[j];
3734 int score= distortion + score_tab[i-run];
3735 if(score < last_score){
3738 last_level= level-64;
3746 score_tab[i+1]= best_score;
3748 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3749 if(last_non_zero <= 27){
3750 for(; survivor_count; survivor_count--){
3751 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3755 for(; survivor_count; survivor_count--){
3756 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3761 survivor[ survivor_count++ ]= i+1;
3764 if(s->out_format != FMT_H263){
3765 last_score= 256*256*256*120;
3766 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3767 int score= score_tab[i];
3768 if(i) score += lambda*2; //FIXME exacter?
3770 if(score < last_score){
3773 last_level= level_tab[i];
3774 last_run= run_tab[i];
3779 s->coded_score[n] = last_score;
3781 dc= FFABS(block[0]);
3782 last_non_zero= last_i - 1;
3783 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3785 if(last_non_zero < start_i)
3786 return last_non_zero;
3788 if(last_non_zero == 0 && start_i == 0){
3790 int best_score= dc * dc;
3792 for(i=0; i<coeff_count[0]; i++){
3793 int level= coeff[i][0];
3794 int alevel= FFABS(level);
3795 int unquant_coeff, score, distortion;
3797 if(s->out_format == FMT_H263){
3798 unquant_coeff= (alevel*qmul + qadd)>>3;
3800 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3801 unquant_coeff = (unquant_coeff - 1) | 1;
3803 unquant_coeff = (unquant_coeff + 4) >> 3;
3804 unquant_coeff<<= 3 + 3;
3806 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3808 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3809 else score= distortion + esc_length*lambda;
3811 if(score < best_score){
3813 best_level= level - 64;
3816 block[0]= best_level;
3817 s->coded_score[n] = best_score - dc*dc;
3818 if(best_level == 0) return -1;
3819 else return last_non_zero;
3825 block[ perm_scantable[last_non_zero] ]= last_level;
3828 for(; i>start_i; i -= run_tab[i] + 1){
3829 block[ perm_scantable[i-1] ]= level_tab[i];
3832 return last_non_zero;
3835 //#define REFINE_STATS 1
3836 static int16_t basis[64][64];
3838 static void build_basis(uint8_t *perm){
3845 double s= 0.25*(1<<BASIS_SHIFT);
3847 int perm_index= perm[index];
3848 if(i==0) s*= sqrt(0.5);
3849 if(j==0) s*= sqrt(0.5);
3850 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)));
3857 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3858 int16_t *block, int16_t *weight, int16_t *orig,
3861 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3862 const uint8_t *scantable= s->intra_scantable.scantable;
3863 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3864 // unsigned int threshold1, threshold2;
3869 int qmul, qadd, start_i, last_non_zero, i, dc;
3871 uint8_t * last_length;
3873 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3876 static int after_last=0;
3877 static int to_zero=0;
3878 static int from_zero=0;
3881 static int messed_sign=0;
3884 if(basis[0][0] == 0)
3885 build_basis(s->idsp.idct_permutation);
3896 /* For AIC we skip quant/dequant of INTRADC */
3900 q <<= RECON_SHIFT-3;
3901 /* note: block[0] is assumed to be positive */
3903 // block[0] = (block[0] + (q >> 1)) / q;
3905 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3906 // bias= 1<<(QMAT_SHIFT-1);
3907 length = s->intra_ac_vlc_length;
3908 last_length= s->intra_ac_vlc_last_length;
3912 length = s->inter_ac_vlc_length;
3913 last_length= s->inter_ac_vlc_last_length;
3915 last_non_zero = s->block_last_index[n];
3920 dc += (1<<(RECON_SHIFT-1));
3921 for(i=0; i<64; i++){
3922 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3925 STOP_TIMER("memset rem[]")}
3928 for(i=0; i<64; i++){
3933 w= FFABS(weight[i]) + qns*one;
3934 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3937 // w=weight[i] = (63*qns + (w/2)) / w;
3943 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3949 for(i=start_i; i<=last_non_zero; i++){
3950 int j= perm_scantable[i];
3951 const int level= block[j];
3955 if(level<0) coeff= qmul*level - qadd;
3956 else coeff= qmul*level + qadd;
3957 run_tab[rle_index++]=run;
3960 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3966 if(last_non_zero>0){
3967 STOP_TIMER("init rem[]")
3974 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3977 int run2, best_unquant_change=0, analyze_gradient;
3981 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3983 if(analyze_gradient){
3987 for(i=0; i<64; i++){
3990 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3993 STOP_TIMER("rem*w*w")}
4003 const int level= block[0];
4004 int change, old_coeff;
4006 assert(s->mb_intra);
4010 for(change=-1; change<=1; change+=2){
4011 int new_level= level + change;
4012 int score, new_coeff;
4014 new_coeff= q*new_level;
4015 if(new_coeff >= 2048 || new_coeff < 0)
4018 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4019 new_coeff - old_coeff);
4020 if(score<best_score){
4023 best_change= change;
4024 best_unquant_change= new_coeff - old_coeff;
4031 run2= run_tab[rle_index++];
4035 for(i=start_i; i<64; i++){
4036 int j= perm_scantable[i];
4037 const int level= block[j];
4038 int change, old_coeff;
4040 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4044 if(level<0) old_coeff= qmul*level - qadd;
4045 else old_coeff= qmul*level + qadd;
4046 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4050 assert(run2>=0 || i >= last_non_zero );
4053 for(change=-1; change<=1; change+=2){
4054 int new_level= level + change;
4055 int score, new_coeff, unquant_change;
4058 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4062 if(new_level<0) new_coeff= qmul*new_level - qadd;
4063 else new_coeff= qmul*new_level + qadd;
4064 if(new_coeff >= 2048 || new_coeff <= -2048)
4066 //FIXME check for overflow
4069 if(level < 63 && level > -63){
4070 if(i < last_non_zero)
4071 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4072 - length[UNI_AC_ENC_INDEX(run, level+64)];
4074 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4075 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4078 assert(FFABS(new_level)==1);
4080 if(analyze_gradient){
4081 int g= d1[ scantable[i] ];
4082 if(g && (g^new_level) >= 0)
4086 if(i < last_non_zero){
4087 int next_i= i + run2 + 1;
4088 int next_level= block[ perm_scantable[next_i] ] + 64;
4090 if(next_level&(~127))
4093 if(next_i < last_non_zero)
4094 score += length[UNI_AC_ENC_INDEX(run, 65)]
4095 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4096 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4098 score += length[UNI_AC_ENC_INDEX(run, 65)]
4099 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4100 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4102 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4104 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4105 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4111 assert(FFABS(level)==1);
4113 if(i < last_non_zero){
4114 int next_i= i + run2 + 1;
4115 int next_level= block[ perm_scantable[next_i] ] + 64;
4117 if(next_level&(~127))
4120 if(next_i < last_non_zero)
4121 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4122 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4123 - length[UNI_AC_ENC_INDEX(run, 65)];
4125 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4126 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4127 - length[UNI_AC_ENC_INDEX(run, 65)];
4129 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4131 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4132 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4139 unquant_change= new_coeff - old_coeff;
4140 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4142 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4144 if(score<best_score){
4147 best_change= change;
4148 best_unquant_change= unquant_change;
4152 prev_level= level + 64;
4153 if(prev_level&(~127))
4162 STOP_TIMER("iterative step")}
4166 int j= perm_scantable[ best_coeff ];
4168 block[j] += best_change;
4170 if(best_coeff > last_non_zero){
4171 last_non_zero= best_coeff;
4179 if(block[j] - best_change){
4180 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4192 for(; last_non_zero>=start_i; last_non_zero--){
4193 if(block[perm_scantable[last_non_zero]])
4199 if(256*256*256*64 % count == 0){
4200 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);
4205 for(i=start_i; i<=last_non_zero; i++){
4206 int j= perm_scantable[i];
4207 const int level= block[j];
4210 run_tab[rle_index++]=run;
4217 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4223 if(last_non_zero>0){
4224 STOP_TIMER("iterative search")
4229 return last_non_zero;
4233 * Permute an 8x8 block according to permuatation.
4234 * @param block the block which will be permuted according to
4235 * the given permutation vector
4236 * @param permutation the permutation vector
4237 * @param last the last non zero coefficient in scantable order, used to
4238 * speed the permutation up
4239 * @param scantable the used scantable, this is only used to speed the
4240 * permutation up, the block is not (inverse) permutated
4241 * to scantable order!
4243 static void block_permute(int16_t *block, uint8_t *permutation,
4244 const uint8_t *scantable, int last)
4251 //FIXME it is ok but not clean and might fail for some permutations
4252 // if (permutation[1] == 1)
4255 for (i = 0; i <= last; i++) {
4256 const int j = scantable[i];
4261 for (i = 0; i <= last; i++) {
4262 const int j = scantable[i];
4263 const int perm_j = permutation[j];
4264 block[perm_j] = temp[j];
4268 int ff_dct_quantize_c(MpegEncContext *s,
4269 int16_t *block, int n,
4270 int qscale, int *overflow)
4272 int i, j, level, last_non_zero, q, start_i;
4274 const uint8_t *scantable= s->intra_scantable.scantable;
4277 unsigned int threshold1, threshold2;
4279 s->fdsp.fdct(block);
4281 if(s->dct_error_sum)
4282 s->denoise_dct(s, block);
4292 /* For AIC we skip quant/dequant of INTRADC */
4295 /* note: block[0] is assumed to be positive */
4296 block[0] = (block[0] + (q >> 1)) / q;
4299 qmat = s->q_intra_matrix[qscale];
4300 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4304 qmat = s->q_inter_matrix[qscale];
4305 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4307 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4308 threshold2= (threshold1<<1);
4309 for(i=63;i>=start_i;i--) {
4311 level = block[j] * qmat[j];
4313 if(((unsigned)(level+threshold1))>threshold2){
4320 for(i=start_i; i<=last_non_zero; i++) {
4322 level = block[j] * qmat[j];
4324 // if( bias+level >= (1<<QMAT_SHIFT)
4325 // || bias-level >= (1<<QMAT_SHIFT)){
4326 if(((unsigned)(level+threshold1))>threshold2){
4328 level= (bias + level)>>QMAT_SHIFT;
4331 level= (bias - level)>>QMAT_SHIFT;
4339 *overflow= s->max_qcoeff < max; //overflow might have happened
4341 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4342 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4343 block_permute(block, s->idsp.idct_permutation,
4344 scantable, last_non_zero);
4346 return last_non_zero;
4349 #define OFFSET(x) offsetof(MpegEncContext, x)
4350 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4351 static const AVOption h263_options[] = {
4352 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4353 { "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},
4354 { "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 },
4359 static const AVClass h263_class = {
4360 .class_name = "H.263 encoder",
4361 .item_name = av_default_item_name,
4362 .option = h263_options,
4363 .version = LIBAVUTIL_VERSION_INT,
4366 AVCodec ff_h263_encoder = {
4368 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4369 .type = AVMEDIA_TYPE_VIDEO,
4370 .id = AV_CODEC_ID_H263,
4371 .priv_data_size = sizeof(MpegEncContext),
4372 .init = ff_mpv_encode_init,
4373 .encode2 = ff_mpv_encode_picture,
4374 .close = ff_mpv_encode_end,
4375 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4376 .priv_class = &h263_class,
4379 static const AVOption h263p_options[] = {
4380 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4381 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4382 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4383 { "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},
4387 static const AVClass h263p_class = {
4388 .class_name = "H.263p encoder",
4389 .item_name = av_default_item_name,
4390 .option = h263p_options,
4391 .version = LIBAVUTIL_VERSION_INT,
4394 AVCodec ff_h263p_encoder = {
4396 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4397 .type = AVMEDIA_TYPE_VIDEO,
4398 .id = AV_CODEC_ID_H263P,
4399 .priv_data_size = sizeof(MpegEncContext),
4400 .init = ff_mpv_encode_init,
4401 .encode2 = ff_mpv_encode_picture,
4402 .close = ff_mpv_encode_end,
4403 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4404 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4405 .priv_class = &h263p_class,
4408 static const AVClass msmpeg4v2_class = {
4409 .class_name = "msmpeg4v2 encoder",
4410 .item_name = av_default_item_name,
4411 .option = ff_mpv_generic_options,
4412 .version = LIBAVUTIL_VERSION_INT,
4415 AVCodec ff_msmpeg4v2_encoder = {
4416 .name = "msmpeg4v2",
4417 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4418 .type = AVMEDIA_TYPE_VIDEO,
4419 .id = AV_CODEC_ID_MSMPEG4V2,
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 = &msmpeg4v2_class,
4428 static const AVClass msmpeg4v3_class = {
4429 .class_name = "msmpeg4v3 encoder",
4430 .item_name = av_default_item_name,
4431 .option = ff_mpv_generic_options,
4432 .version = LIBAVUTIL_VERSION_INT,
4435 AVCodec ff_msmpeg4v3_encoder = {
4437 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4438 .type = AVMEDIA_TYPE_VIDEO,
4439 .id = AV_CODEC_ID_MSMPEG4V3,
4440 .priv_data_size = sizeof(MpegEncContext),
4441 .init = ff_mpv_encode_init,
4442 .encode2 = ff_mpv_encode_picture,
4443 .close = ff_mpv_encode_end,
4444 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4445 .priv_class = &msmpeg4v3_class,
4448 static const AVClass wmv1_class = {
4449 .class_name = "wmv1 encoder",
4450 .item_name = av_default_item_name,
4451 .option = ff_mpv_generic_options,
4452 .version = LIBAVUTIL_VERSION_INT,
4455 AVCodec ff_wmv1_encoder = {
4457 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4458 .type = AVMEDIA_TYPE_VIDEO,
4459 .id = AV_CODEC_ID_WMV1,
4460 .priv_data_size = sizeof(MpegEncContext),
4461 .init = ff_mpv_encode_init,
4462 .encode2 = ff_mpv_encode_picture,
4463 .close = ff_mpv_encode_end,
4464 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4465 .priv_class = &wmv1_class,