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"
46 #include "mjpegenc_common.h"
48 #include "mpegutils.h"
51 #include "pixblockdsp.h"
55 #include "aandcttab.h"
57 #include "mpeg4video.h"
59 #include "bytestream.h"
63 #define QUANT_BIAS_SHIFT 8
65 #define QMAT_SHIFT_MMX 16
68 static int encode_picture(MpegEncContext *s, int picture_number);
69 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
70 static int sse_mb(MpegEncContext *s);
71 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
72 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
74 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
75 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
77 const AVOption ff_mpv_generic_options[] = {
82 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
83 uint16_t (*qmat16)[2][64],
84 const uint16_t *quant_matrix,
85 int bias, int qmin, int qmax, int intra)
87 FDCTDSPContext *fdsp = &s->fdsp;
91 for (qscale = qmin; qscale <= qmax; qscale++) {
93 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
95 fdsp->fdct == ff_faandct ||
96 #endif /* CONFIG_FAANDCT */
97 fdsp->fdct == ff_jpeg_fdct_islow_10) {
98 for (i = 0; i < 64; i++) {
99 const int j = s->idsp.idct_permutation[i];
100 int64_t den = (int64_t) qscale * quant_matrix[j];
101 /* 16 <= qscale * quant_matrix[i] <= 7905
102 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
103 * 19952 <= x <= 249205026
104 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
105 * 3444240 >= (1 << 36) / (x) >= 275 */
107 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
109 } else if (fdsp->fdct == ff_fdct_ifast) {
110 for (i = 0; i < 64; i++) {
111 const int j = s->idsp.idct_permutation[i];
112 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
113 /* 16 <= qscale * quant_matrix[i] <= 7905
114 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
115 * 19952 <= x <= 249205026
116 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
117 * 3444240 >= (1 << 36) / (x) >= 275 */
119 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
122 for (i = 0; i < 64; i++) {
123 const int j = s->idsp.idct_permutation[i];
124 int64_t den = (int64_t) qscale * quant_matrix[j];
125 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
126 * Assume x = qscale * quant_matrix[i]
128 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
129 * so 32768 >= (1 << 19) / (x) >= 67 */
130 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
131 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
132 // (qscale * quant_matrix[i]);
133 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
135 if (qmat16[qscale][0][i] == 0 ||
136 qmat16[qscale][0][i] == 128 * 256)
137 qmat16[qscale][0][i] = 128 * 256 - 1;
138 qmat16[qscale][1][i] =
139 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
140 qmat16[qscale][0][i]);
144 for (i = intra; i < 64; i++) {
146 if (fdsp->fdct == ff_fdct_ifast) {
147 max = (8191LL * ff_aanscales[i]) >> 14;
149 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
155 av_log(NULL, AV_LOG_INFO,
156 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
161 static inline void update_qscale(MpegEncContext *s)
163 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
164 (FF_LAMBDA_SHIFT + 7);
165 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
167 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
171 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
177 for (i = 0; i < 64; i++) {
178 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
185 * init s->current_picture.qscale_table from s->lambda_table
187 void ff_init_qscale_tab(MpegEncContext *s)
189 int8_t * const qscale_table = s->current_picture.qscale_table;
192 for (i = 0; i < s->mb_num; i++) {
193 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
194 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
195 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
200 static void update_duplicate_context_after_me(MpegEncContext *dst,
203 #define COPY(a) dst->a= src->a
205 COPY(current_picture);
211 COPY(picture_in_gop_number);
212 COPY(gop_picture_number);
213 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
214 COPY(progressive_frame); // FIXME don't set in encode_header
215 COPY(partitioned_frame); // FIXME don't set in encode_header
220 * Set the given MpegEncContext to defaults for encoding.
221 * the changed fields will not depend upon the prior state of the MpegEncContext.
223 static void mpv_encode_defaults(MpegEncContext *s)
226 ff_mpv_common_defaults(s);
228 for (i = -16; i < 16; i++) {
229 default_fcode_tab[i + MAX_MV] = 1;
231 s->me.mv_penalty = default_mv_penalty;
232 s->fcode_tab = default_fcode_tab;
234 s->input_picture_number = 0;
235 s->picture_in_gop_number = 0;
238 /* init video encoder */
239 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
241 MpegEncContext *s = avctx->priv_data;
242 int i, ret, format_supported;
244 mpv_encode_defaults(s);
246 switch (avctx->codec_id) {
247 case AV_CODEC_ID_MPEG2VIDEO:
248 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
249 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
250 av_log(avctx, AV_LOG_ERROR,
251 "only YUV420 and YUV422 are supported\n");
255 case AV_CODEC_ID_MJPEG:
256 format_supported = 0;
257 /* JPEG color space */
258 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
259 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
260 (avctx->color_range == AVCOL_RANGE_JPEG &&
261 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
262 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
263 format_supported = 1;
264 /* MPEG color space */
265 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
266 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
267 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
268 format_supported = 1;
270 if (!format_supported) {
271 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
276 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
277 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
282 switch (avctx->pix_fmt) {
283 case AV_PIX_FMT_YUVJ422P:
284 case AV_PIX_FMT_YUV422P:
285 s->chroma_format = CHROMA_422;
287 case AV_PIX_FMT_YUVJ420P:
288 case AV_PIX_FMT_YUV420P:
290 s->chroma_format = CHROMA_420;
294 s->bit_rate = avctx->bit_rate;
295 s->width = avctx->width;
296 s->height = avctx->height;
297 if (avctx->gop_size > 600 &&
298 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
299 av_log(avctx, AV_LOG_ERROR,
300 "Warning keyframe interval too large! reducing it ...\n");
301 avctx->gop_size = 600;
303 s->gop_size = avctx->gop_size;
305 if (avctx->max_b_frames > MAX_B_FRAMES) {
306 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
307 "is %d.\n", MAX_B_FRAMES);
309 s->max_b_frames = avctx->max_b_frames;
310 s->codec_id = avctx->codec->id;
311 s->strict_std_compliance = avctx->strict_std_compliance;
312 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
313 s->mpeg_quant = avctx->mpeg_quant;
314 s->rtp_mode = !!avctx->rtp_payload_size;
315 s->intra_dc_precision = avctx->intra_dc_precision;
316 s->user_specified_pts = AV_NOPTS_VALUE;
318 if (s->gop_size <= 1) {
325 s->me_method = avctx->me_method;
328 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
331 FF_DISABLE_DEPRECATION_WARNINGS
332 if (avctx->border_masking != 0.0)
333 s->border_masking = avctx->border_masking;
334 FF_ENABLE_DEPRECATION_WARNINGS
337 s->adaptive_quant = (s->avctx->lumi_masking ||
338 s->avctx->dark_masking ||
339 s->avctx->temporal_cplx_masking ||
340 s->avctx->spatial_cplx_masking ||
341 s->avctx->p_masking ||
343 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
346 s->loop_filter = !!(s->avctx->flags & CODEC_FLAG_LOOP_FILTER);
348 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
349 av_log(avctx, AV_LOG_ERROR,
350 "a vbv buffer size is needed, "
351 "for encoding with a maximum bitrate\n");
355 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
356 av_log(avctx, AV_LOG_INFO,
357 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
360 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
361 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
365 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
366 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
370 if (avctx->rc_max_rate &&
371 avctx->rc_max_rate == avctx->bit_rate &&
372 avctx->rc_max_rate != avctx->rc_min_rate) {
373 av_log(avctx, AV_LOG_INFO,
374 "impossible bitrate constraints, this will fail\n");
377 if (avctx->rc_buffer_size &&
378 avctx->bit_rate * (int64_t)avctx->time_base.num >
379 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
380 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
384 if (!s->fixed_qscale &&
385 avctx->bit_rate * av_q2d(avctx->time_base) >
386 avctx->bit_rate_tolerance) {
387 av_log(avctx, AV_LOG_ERROR,
388 "bitrate tolerance too small for bitrate\n");
392 if (s->avctx->rc_max_rate &&
393 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
394 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
395 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
396 90000LL * (avctx->rc_buffer_size - 1) >
397 s->avctx->rc_max_rate * 0xFFFFLL) {
398 av_log(avctx, AV_LOG_INFO,
399 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
400 "specified vbv buffer is too large for the given bitrate!\n");
403 if ((s->avctx->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
404 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
405 s->codec_id != AV_CODEC_ID_FLV1) {
406 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
410 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
411 av_log(avctx, AV_LOG_ERROR,
412 "OBMC is only supported with simple mb decision\n");
416 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
417 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
421 if (s->max_b_frames &&
422 s->codec_id != AV_CODEC_ID_MPEG4 &&
423 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
424 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
425 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
429 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
430 s->codec_id == AV_CODEC_ID_H263 ||
431 s->codec_id == AV_CODEC_ID_H263P) &&
432 (avctx->sample_aspect_ratio.num > 255 ||
433 avctx->sample_aspect_ratio.den > 255)) {
434 av_log(avctx, AV_LOG_ERROR,
435 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
436 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
440 if ((s->avctx->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
441 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
442 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
446 // FIXME mpeg2 uses that too
447 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
448 av_log(avctx, AV_LOG_ERROR,
449 "mpeg2 style quantization not supported by codec\n");
453 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
454 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
458 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
459 s->avctx->mb_decision != FF_MB_DECISION_RD) {
460 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
464 if (s->avctx->scenechange_threshold < 1000000000 &&
465 (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)) {
466 av_log(avctx, AV_LOG_ERROR,
467 "closed gop with scene change detection are not supported yet, "
468 "set threshold to 1000000000\n");
472 if (s->avctx->flags & CODEC_FLAG_LOW_DELAY) {
473 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
474 av_log(avctx, AV_LOG_ERROR,
475 "low delay forcing is only available for mpeg2\n");
478 if (s->max_b_frames != 0) {
479 av_log(avctx, AV_LOG_ERROR,
480 "b frames cannot be used with low delay\n");
485 if (s->q_scale_type == 1) {
486 if (avctx->qmax > 12) {
487 av_log(avctx, AV_LOG_ERROR,
488 "non linear quant only supports qmax <= 12 currently\n");
493 if (s->avctx->thread_count > 1 &&
494 s->codec_id != AV_CODEC_ID_MPEG4 &&
495 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
496 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
497 (s->codec_id != AV_CODEC_ID_H263P)) {
498 av_log(avctx, AV_LOG_ERROR,
499 "multi threaded encoding not supported by codec\n");
503 if (s->avctx->thread_count < 1) {
504 av_log(avctx, AV_LOG_ERROR,
505 "automatic thread number detection not supported by codec,"
510 if (s->avctx->thread_count > 1)
513 if (!avctx->time_base.den || !avctx->time_base.num) {
514 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
518 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
519 av_log(avctx, AV_LOG_INFO,
520 "notice: b_frame_strategy only affects the first pass\n");
521 avctx->b_frame_strategy = 0;
524 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
526 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
527 avctx->time_base.den /= i;
528 avctx->time_base.num /= i;
532 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
533 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
534 // (a + x * 3 / 8) / x
535 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
536 s->inter_quant_bias = 0;
538 s->intra_quant_bias = 0;
540 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
543 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
544 s->intra_quant_bias = avctx->intra_quant_bias;
545 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
546 s->inter_quant_bias = avctx->inter_quant_bias;
548 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
549 s->avctx->time_base.den > (1 << 16) - 1) {
550 av_log(avctx, AV_LOG_ERROR,
551 "timebase %d/%d not supported by MPEG 4 standard, "
552 "the maximum admitted value for the timebase denominator "
553 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
557 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
559 switch (avctx->codec->id) {
560 case AV_CODEC_ID_MPEG1VIDEO:
561 s->out_format = FMT_MPEG1;
562 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
563 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
565 case AV_CODEC_ID_MPEG2VIDEO:
566 s->out_format = FMT_MPEG1;
567 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
568 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
571 case AV_CODEC_ID_MJPEG:
572 s->out_format = FMT_MJPEG;
573 s->intra_only = 1; /* force intra only for jpeg */
574 if (!CONFIG_MJPEG_ENCODER ||
575 ff_mjpeg_encode_init(s) < 0)
580 case AV_CODEC_ID_H261:
581 if (!CONFIG_H261_ENCODER)
583 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
584 av_log(avctx, AV_LOG_ERROR,
585 "The specified picture size of %dx%d is not valid for the "
586 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
587 s->width, s->height);
590 s->out_format = FMT_H261;
593 s->rtp_mode = 0; /* Sliced encoding not supported */
595 case AV_CODEC_ID_H263:
596 if (!CONFIG_H263_ENCODER)
598 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
599 s->width, s->height) == 8) {
600 av_log(avctx, AV_LOG_INFO,
601 "The specified picture size of %dx%d is not valid for "
602 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
603 "352x288, 704x576, and 1408x1152."
604 "Try H.263+.\n", s->width, s->height);
607 s->out_format = FMT_H263;
611 case AV_CODEC_ID_H263P:
612 s->out_format = FMT_H263;
615 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
616 s->modified_quant = s->h263_aic;
617 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
618 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
621 /* These are just to be sure */
625 case AV_CODEC_ID_FLV1:
626 s->out_format = FMT_H263;
627 s->h263_flv = 2; /* format = 1; 11-bit codes */
628 s->unrestricted_mv = 1;
629 s->rtp_mode = 0; /* don't allow GOB */
633 case AV_CODEC_ID_RV10:
634 s->out_format = FMT_H263;
638 case AV_CODEC_ID_RV20:
639 s->out_format = FMT_H263;
642 s->modified_quant = 1;
646 s->unrestricted_mv = 0;
648 case AV_CODEC_ID_MPEG4:
649 s->out_format = FMT_H263;
651 s->unrestricted_mv = 1;
652 s->low_delay = s->max_b_frames ? 0 : 1;
653 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
655 case AV_CODEC_ID_MSMPEG4V2:
656 s->out_format = FMT_H263;
658 s->unrestricted_mv = 1;
659 s->msmpeg4_version = 2;
663 case AV_CODEC_ID_MSMPEG4V3:
664 s->out_format = FMT_H263;
666 s->unrestricted_mv = 1;
667 s->msmpeg4_version = 3;
668 s->flipflop_rounding = 1;
672 case AV_CODEC_ID_WMV1:
673 s->out_format = FMT_H263;
675 s->unrestricted_mv = 1;
676 s->msmpeg4_version = 4;
677 s->flipflop_rounding = 1;
681 case AV_CODEC_ID_WMV2:
682 s->out_format = FMT_H263;
684 s->unrestricted_mv = 1;
685 s->msmpeg4_version = 5;
686 s->flipflop_rounding = 1;
694 avctx->has_b_frames = !s->low_delay;
698 s->progressive_frame =
699 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
700 CODEC_FLAG_INTERLACED_ME) ||
705 if (ff_mpv_common_init(s) < 0)
709 ff_mpv_encode_init_x86(s);
711 ff_fdctdsp_init(&s->fdsp, avctx);
712 ff_me_cmp_init(&s->mecc, avctx);
713 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
714 ff_pixblockdsp_init(&s->pdsp, avctx);
715 ff_qpeldsp_init(&s->qdsp);
717 s->avctx->coded_frame = s->current_picture.f;
719 if (s->msmpeg4_version) {
720 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
721 2 * 2 * (MAX_LEVEL + 1) *
722 (MAX_RUN + 1) * 2 * sizeof(int), fail);
724 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
726 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
727 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
729 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
731 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
732 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
733 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
735 if (s->avctx->noise_reduction) {
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
737 2 * 64 * sizeof(uint16_t), fail);
740 if (CONFIG_H263_ENCODER)
741 ff_h263dsp_init(&s->h263dsp);
742 if (!s->dct_quantize)
743 s->dct_quantize = ff_dct_quantize_c;
745 s->denoise_dct = denoise_dct_c;
746 s->fast_dct_quantize = s->dct_quantize;
748 s->dct_quantize = dct_quantize_trellis_c;
750 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
751 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
753 s->quant_precision = 5;
755 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
756 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
758 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
759 ff_h261_encode_init(s);
760 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
761 ff_h263_encode_init(s);
762 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
763 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
765 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
766 && s->out_format == FMT_MPEG1)
767 ff_mpeg1_encode_init(s);
770 for (i = 0; i < 64; i++) {
771 int j = s->idsp.idct_permutation[i];
772 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
774 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
775 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
776 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
778 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
781 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
782 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
784 if (s->avctx->intra_matrix)
785 s->intra_matrix[j] = s->avctx->intra_matrix[i];
786 if (s->avctx->inter_matrix)
787 s->inter_matrix[j] = s->avctx->inter_matrix[i];
790 /* precompute matrix */
791 /* for mjpeg, we do include qscale in the matrix */
792 if (s->out_format != FMT_MJPEG) {
793 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
794 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
796 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
797 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
801 if (ff_rate_control_init(s) < 0)
804 #if FF_API_ERROR_RATE
805 FF_DISABLE_DEPRECATION_WARNINGS
806 if (avctx->error_rate)
807 s->error_rate = avctx->error_rate;
808 FF_ENABLE_DEPRECATION_WARNINGS;
811 #if FF_API_NORMALIZE_AQP
812 FF_DISABLE_DEPRECATION_WARNINGS
813 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
814 s->mpv_flags |= FF_MPV_FLAG_NAQ;
815 FF_ENABLE_DEPRECATION_WARNINGS;
819 FF_DISABLE_DEPRECATION_WARNINGS
820 if (avctx->flags & CODEC_FLAG_MV0)
821 s->mpv_flags |= FF_MPV_FLAG_MV0;
822 FF_ENABLE_DEPRECATION_WARNINGS
826 FF_DISABLE_DEPRECATION_WARNINGS
827 if (avctx->rc_qsquish != 0.0)
828 s->rc_qsquish = avctx->rc_qsquish;
829 if (avctx->rc_qmod_amp != 0.0)
830 s->rc_qmod_amp = avctx->rc_qmod_amp;
831 if (avctx->rc_qmod_freq)
832 s->rc_qmod_freq = avctx->rc_qmod_freq;
833 if (avctx->rc_buffer_aggressivity != 1.0)
834 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
835 if (avctx->rc_initial_cplx != 0.0)
836 s->rc_initial_cplx = avctx->rc_initial_cplx;
838 s->lmin = avctx->lmin;
840 s->lmax = avctx->lmax;
844 s->rc_eq = av_strdup(avctx->rc_eq);
846 return AVERROR(ENOMEM);
848 FF_ENABLE_DEPRECATION_WARNINGS
851 if (avctx->b_frame_strategy == 2) {
852 for (i = 0; i < s->max_b_frames + 2; i++) {
853 s->tmp_frames[i] = av_frame_alloc();
854 if (!s->tmp_frames[i])
855 return AVERROR(ENOMEM);
857 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
858 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
859 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
861 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
869 ff_mpv_encode_end(avctx);
870 return AVERROR_UNKNOWN;
873 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
875 MpegEncContext *s = avctx->priv_data;
878 ff_rate_control_uninit(s);
880 ff_mpv_common_end(s);
881 if (CONFIG_MJPEG_ENCODER &&
882 s->out_format == FMT_MJPEG)
883 ff_mjpeg_encode_close(s);
885 av_freep(&avctx->extradata);
887 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
888 av_frame_free(&s->tmp_frames[i]);
890 ff_free_picture_tables(&s->new_picture);
891 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
893 av_freep(&s->avctx->stats_out);
894 av_freep(&s->ac_stats);
896 av_freep(&s->q_intra_matrix);
897 av_freep(&s->q_inter_matrix);
898 av_freep(&s->q_intra_matrix16);
899 av_freep(&s->q_inter_matrix16);
900 av_freep(&s->input_picture);
901 av_freep(&s->reordered_input_picture);
902 av_freep(&s->dct_offset);
907 static int get_sae(uint8_t *src, int ref, int stride)
912 for (y = 0; y < 16; y++) {
913 for (x = 0; x < 16; x++) {
914 acc += FFABS(src[x + y * stride] - ref);
921 static int get_intra_count(MpegEncContext *s, uint8_t *src,
922 uint8_t *ref, int stride)
930 for (y = 0; y < h; y += 16) {
931 for (x = 0; x < w; x += 16) {
932 int offset = x + y * stride;
933 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
935 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
936 int sae = get_sae(src + offset, mean, stride);
938 acc += sae + 500 < sad;
944 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
946 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
947 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
948 s->mb_stride, s->mb_height, s->b8_stride,
949 &s->linesize, &s->uvlinesize);
952 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
956 int i, display_picture_number = 0, ret;
957 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
958 (s->low_delay ? 0 : 1);
963 display_picture_number = s->input_picture_number++;
965 if (pts != AV_NOPTS_VALUE) {
966 if (s->user_specified_pts != AV_NOPTS_VALUE) {
968 int64_t last = s->user_specified_pts;
971 av_log(s->avctx, AV_LOG_ERROR,
972 "Error, Invalid timestamp=%"PRId64", "
973 "last=%"PRId64"\n", pts, s->user_specified_pts);
977 if (!s->low_delay && display_picture_number == 1)
978 s->dts_delta = time - last;
980 s->user_specified_pts = pts;
982 if (s->user_specified_pts != AV_NOPTS_VALUE) {
983 s->user_specified_pts =
984 pts = s->user_specified_pts + 1;
985 av_log(s->avctx, AV_LOG_INFO,
986 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
989 pts = display_picture_number;
995 if (!pic_arg->buf[0] ||
996 pic_arg->linesize[0] != s->linesize ||
997 pic_arg->linesize[1] != s->uvlinesize ||
998 pic_arg->linesize[2] != s->uvlinesize)
1000 if ((s->width & 15) || (s->height & 15))
1003 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1004 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1006 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1010 pic = &s->picture[i];
1014 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1017 ret = alloc_picture(s, pic, direct);
1022 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1023 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1024 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1027 int h_chroma_shift, v_chroma_shift;
1028 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1032 for (i = 0; i < 3; i++) {
1033 int src_stride = pic_arg->linesize[i];
1034 int dst_stride = i ? s->uvlinesize : s->linesize;
1035 int h_shift = i ? h_chroma_shift : 0;
1036 int v_shift = i ? v_chroma_shift : 0;
1037 int w = s->width >> h_shift;
1038 int h = s->height >> v_shift;
1039 uint8_t *src = pic_arg->data[i];
1040 uint8_t *dst = pic->f->data[i];
1042 if (!s->avctx->rc_buffer_size)
1043 dst += INPLACE_OFFSET;
1045 if (src_stride == dst_stride)
1046 memcpy(dst, src, src_stride * h);
1049 uint8_t *dst2 = dst;
1051 memcpy(dst2, src, w);
1056 if ((s->width & 15) || (s->height & 15)) {
1057 s->mpvencdsp.draw_edges(dst, dst_stride,
1066 ret = av_frame_copy_props(pic->f, pic_arg);
1070 pic->f->display_picture_number = display_picture_number;
1071 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1074 /* shift buffer entries */
1075 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1076 s->input_picture[i - 1] = s->input_picture[i];
1078 s->input_picture[encoding_delay] = (Picture*) pic;
1083 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1087 int64_t score64 = 0;
1089 for (plane = 0; plane < 3; plane++) {
1090 const int stride = p->f->linesize[plane];
1091 const int bw = plane ? 1 : 2;
1092 for (y = 0; y < s->mb_height * bw; y++) {
1093 for (x = 0; x < s->mb_width * bw; x++) {
1094 int off = p->shared ? 0 : 16;
1095 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1096 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1097 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1099 switch (s->avctx->frame_skip_exp) {
1100 case 0: score = FFMAX(score, v); break;
1101 case 1: score += FFABS(v); break;
1102 case 2: score += v * v; break;
1103 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1104 case 4: score64 += v * v * (int64_t)(v * v); break;
1113 if (score64 < s->avctx->frame_skip_threshold)
1115 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1120 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1122 AVPacket pkt = { 0 };
1123 int ret, got_output;
1125 av_init_packet(&pkt);
1126 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1131 av_free_packet(&pkt);
1135 static int estimate_best_b_count(MpegEncContext *s)
1137 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1138 AVCodecContext *c = avcodec_alloc_context3(NULL);
1139 const int scale = s->avctx->brd_scale;
1140 int i, j, out_size, p_lambda, b_lambda, lambda2;
1141 int64_t best_rd = INT64_MAX;
1142 int best_b_count = -1;
1145 return AVERROR(ENOMEM);
1146 assert(scale >= 0 && scale <= 3);
1149 //s->next_picture_ptr->quality;
1150 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1151 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1152 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1153 if (!b_lambda) // FIXME we should do this somewhere else
1154 b_lambda = p_lambda;
1155 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1158 c->width = s->width >> scale;
1159 c->height = s->height >> scale;
1160 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1161 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1162 c->mb_decision = s->avctx->mb_decision;
1163 c->me_cmp = s->avctx->me_cmp;
1164 c->mb_cmp = s->avctx->mb_cmp;
1165 c->me_sub_cmp = s->avctx->me_sub_cmp;
1166 c->pix_fmt = AV_PIX_FMT_YUV420P;
1167 c->time_base = s->avctx->time_base;
1168 c->max_b_frames = s->max_b_frames;
1170 if (avcodec_open2(c, codec, NULL) < 0)
1173 for (i = 0; i < s->max_b_frames + 2; i++) {
1174 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1175 s->next_picture_ptr;
1177 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1178 pre_input = *pre_input_ptr;
1180 if (!pre_input.shared && i) {
1181 pre_input.f->data[0] += INPLACE_OFFSET;
1182 pre_input.f->data[1] += INPLACE_OFFSET;
1183 pre_input.f->data[2] += INPLACE_OFFSET;
1186 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1187 s->tmp_frames[i]->linesize[0],
1188 pre_input.f->data[0],
1189 pre_input.f->linesize[0],
1190 c->width, c->height);
1191 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1192 s->tmp_frames[i]->linesize[1],
1193 pre_input.f->data[1],
1194 pre_input.f->linesize[1],
1195 c->width >> 1, c->height >> 1);
1196 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1197 s->tmp_frames[i]->linesize[2],
1198 pre_input.f->data[2],
1199 pre_input.f->linesize[2],
1200 c->width >> 1, c->height >> 1);
1204 for (j = 0; j < s->max_b_frames + 1; j++) {
1207 if (!s->input_picture[j])
1210 c->error[0] = c->error[1] = c->error[2] = 0;
1212 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1213 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1215 out_size = encode_frame(c, s->tmp_frames[0]);
1217 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1219 for (i = 0; i < s->max_b_frames + 1; i++) {
1220 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1222 s->tmp_frames[i + 1]->pict_type = is_p ?
1223 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1224 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1226 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1228 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1231 /* get the delayed frames */
1233 out_size = encode_frame(c, NULL);
1234 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1237 rd += c->error[0] + c->error[1] + c->error[2];
1248 return best_b_count;
1251 static int select_input_picture(MpegEncContext *s)
1255 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1256 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1257 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1259 /* set next picture type & ordering */
1260 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1261 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1262 !s->next_picture_ptr || s->intra_only) {
1263 s->reordered_input_picture[0] = s->input_picture[0];
1264 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1265 s->reordered_input_picture[0]->f->coded_picture_number =
1266 s->coded_picture_number++;
1270 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1271 if (s->picture_in_gop_number < s->gop_size &&
1272 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1273 // FIXME check that te gop check above is +-1 correct
1274 av_frame_unref(s->input_picture[0]->f);
1277 ff_vbv_update(s, 0);
1283 if (s->avctx->flags & CODEC_FLAG_PASS2) {
1284 for (i = 0; i < s->max_b_frames + 1; i++) {
1285 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1287 if (pict_num >= s->rc_context.num_entries)
1289 if (!s->input_picture[i]) {
1290 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1294 s->input_picture[i]->f->pict_type =
1295 s->rc_context.entry[pict_num].new_pict_type;
1299 if (s->avctx->b_frame_strategy == 0) {
1300 b_frames = s->max_b_frames;
1301 while (b_frames && !s->input_picture[b_frames])
1303 } else if (s->avctx->b_frame_strategy == 1) {
1304 for (i = 1; i < s->max_b_frames + 1; i++) {
1305 if (s->input_picture[i] &&
1306 s->input_picture[i]->b_frame_score == 0) {
1307 s->input_picture[i]->b_frame_score =
1309 s->input_picture[i ]->f->data[0],
1310 s->input_picture[i - 1]->f->data[0],
1314 for (i = 0; i < s->max_b_frames + 1; i++) {
1315 if (!s->input_picture[i] ||
1316 s->input_picture[i]->b_frame_score - 1 >
1317 s->mb_num / s->avctx->b_sensitivity)
1321 b_frames = FFMAX(0, i - 1);
1324 for (i = 0; i < b_frames + 1; i++) {
1325 s->input_picture[i]->b_frame_score = 0;
1327 } else if (s->avctx->b_frame_strategy == 2) {
1328 b_frames = estimate_best_b_count(s);
1330 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1336 for (i = b_frames - 1; i >= 0; i--) {
1337 int type = s->input_picture[i]->f->pict_type;
1338 if (type && type != AV_PICTURE_TYPE_B)
1341 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1342 b_frames == s->max_b_frames) {
1343 av_log(s->avctx, AV_LOG_ERROR,
1344 "warning, too many b frames in a row\n");
1347 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1348 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1349 s->gop_size > s->picture_in_gop_number) {
1350 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1352 if (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)
1354 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1358 if ((s->avctx->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1359 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1362 s->reordered_input_picture[0] = s->input_picture[b_frames];
1363 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1364 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1365 s->reordered_input_picture[0]->f->coded_picture_number =
1366 s->coded_picture_number++;
1367 for (i = 0; i < b_frames; i++) {
1368 s->reordered_input_picture[i + 1] = s->input_picture[i];
1369 s->reordered_input_picture[i + 1]->f->pict_type =
1371 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1372 s->coded_picture_number++;
1377 if (s->reordered_input_picture[0]) {
1378 s->reordered_input_picture[0]->reference =
1379 s->reordered_input_picture[0]->f->pict_type !=
1380 AV_PICTURE_TYPE_B ? 3 : 0;
1382 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1383 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1386 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1387 // input is a shared pix, so we can't modifiy it -> alloc a new
1388 // one & ensure that the shared one is reuseable
1391 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1394 pic = &s->picture[i];
1396 pic->reference = s->reordered_input_picture[0]->reference;
1397 if (alloc_picture(s, pic, 0) < 0) {
1401 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1405 /* mark us unused / free shared pic */
1406 av_frame_unref(s->reordered_input_picture[0]->f);
1407 s->reordered_input_picture[0]->shared = 0;
1409 s->current_picture_ptr = pic;
1411 // input is not a shared pix -> reuse buffer for current_pix
1412 s->current_picture_ptr = s->reordered_input_picture[0];
1413 for (i = 0; i < 4; i++) {
1414 s->new_picture.f->data[i] += INPLACE_OFFSET;
1417 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1418 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1419 s->current_picture_ptr)) < 0)
1422 s->picture_number = s->new_picture.f->display_picture_number;
1424 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1429 static void frame_end(MpegEncContext *s)
1433 if (s->unrestricted_mv &&
1434 s->current_picture.reference &&
1436 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1437 int hshift = desc->log2_chroma_w;
1438 int vshift = desc->log2_chroma_h;
1439 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1440 s->h_edge_pos, s->v_edge_pos,
1441 EDGE_WIDTH, EDGE_WIDTH,
1442 EDGE_TOP | EDGE_BOTTOM);
1443 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1444 s->h_edge_pos >> hshift,
1445 s->v_edge_pos >> vshift,
1446 EDGE_WIDTH >> hshift,
1447 EDGE_WIDTH >> vshift,
1448 EDGE_TOP | EDGE_BOTTOM);
1449 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1450 s->h_edge_pos >> hshift,
1451 s->v_edge_pos >> vshift,
1452 EDGE_WIDTH >> hshift,
1453 EDGE_WIDTH >> vshift,
1454 EDGE_TOP | EDGE_BOTTOM);
1459 s->last_pict_type = s->pict_type;
1460 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1461 if (s->pict_type!= AV_PICTURE_TYPE_B)
1462 s->last_non_b_pict_type = s->pict_type;
1465 /* release non-reference frames */
1466 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1467 if (!s->picture[i].reference)
1468 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1472 s->avctx->coded_frame = s->current_picture_ptr->f;
1476 static void update_noise_reduction(MpegEncContext *s)
1480 for (intra = 0; intra < 2; intra++) {
1481 if (s->dct_count[intra] > (1 << 16)) {
1482 for (i = 0; i < 64; i++) {
1483 s->dct_error_sum[intra][i] >>= 1;
1485 s->dct_count[intra] >>= 1;
1488 for (i = 0; i < 64; i++) {
1489 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1490 s->dct_count[intra] +
1491 s->dct_error_sum[intra][i] / 2) /
1492 (s->dct_error_sum[intra][i] + 1);
1497 static int frame_start(MpegEncContext *s)
1501 /* mark & release old frames */
1502 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1503 s->last_picture_ptr != s->next_picture_ptr &&
1504 s->last_picture_ptr->f->buf[0]) {
1505 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1508 s->current_picture_ptr->f->pict_type = s->pict_type;
1509 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1511 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1512 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1513 s->current_picture_ptr)) < 0)
1516 if (s->pict_type != AV_PICTURE_TYPE_B) {
1517 s->last_picture_ptr = s->next_picture_ptr;
1519 s->next_picture_ptr = s->current_picture_ptr;
1522 if (s->last_picture_ptr) {
1523 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1524 if (s->last_picture_ptr->f->buf[0] &&
1525 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1526 s->last_picture_ptr)) < 0)
1529 if (s->next_picture_ptr) {
1530 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1531 if (s->next_picture_ptr->f->buf[0] &&
1532 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1533 s->next_picture_ptr)) < 0)
1537 if (s->picture_structure!= PICT_FRAME) {
1539 for (i = 0; i < 4; i++) {
1540 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1541 s->current_picture.f->data[i] +=
1542 s->current_picture.f->linesize[i];
1544 s->current_picture.f->linesize[i] *= 2;
1545 s->last_picture.f->linesize[i] *= 2;
1546 s->next_picture.f->linesize[i] *= 2;
1550 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1551 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1552 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1553 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1554 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1555 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1557 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1558 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1561 if (s->dct_error_sum) {
1562 assert(s->avctx->noise_reduction && s->encoding);
1563 update_noise_reduction(s);
1569 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1570 const AVFrame *pic_arg, int *got_packet)
1572 MpegEncContext *s = avctx->priv_data;
1573 int i, stuffing_count, ret;
1574 int context_count = s->slice_context_count;
1576 s->picture_in_gop_number++;
1578 if (load_input_picture(s, pic_arg) < 0)
1581 if (select_input_picture(s) < 0) {
1586 if (s->new_picture.f->data[0]) {
1588 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1591 s->mb_info_ptr = av_packet_new_side_data(pkt,
1592 AV_PKT_DATA_H263_MB_INFO,
1593 s->mb_width*s->mb_height*12);
1594 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1597 for (i = 0; i < context_count; i++) {
1598 int start_y = s->thread_context[i]->start_mb_y;
1599 int end_y = s->thread_context[i]-> end_mb_y;
1600 int h = s->mb_height;
1601 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1602 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1604 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1607 s->pict_type = s->new_picture.f->pict_type;
1609 ret = frame_start(s);
1613 if (encode_picture(s, s->picture_number) < 0)
1616 avctx->header_bits = s->header_bits;
1617 avctx->mv_bits = s->mv_bits;
1618 avctx->misc_bits = s->misc_bits;
1619 avctx->i_tex_bits = s->i_tex_bits;
1620 avctx->p_tex_bits = s->p_tex_bits;
1621 avctx->i_count = s->i_count;
1622 // FIXME f/b_count in avctx
1623 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1624 avctx->skip_count = s->skip_count;
1628 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1629 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1631 if (avctx->rc_buffer_size) {
1632 RateControlContext *rcc = &s->rc_context;
1633 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1635 if (put_bits_count(&s->pb) > max_size &&
1636 s->lambda < s->lmax) {
1637 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1638 (s->qscale + 1) / s->qscale);
1639 if (s->adaptive_quant) {
1641 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1642 s->lambda_table[i] =
1643 FFMAX(s->lambda_table[i] + 1,
1644 s->lambda_table[i] * (s->qscale + 1) /
1647 s->mb_skipped = 0; // done in frame_start()
1648 // done in encode_picture() so we must undo it
1649 if (s->pict_type == AV_PICTURE_TYPE_P) {
1650 if (s->flipflop_rounding ||
1651 s->codec_id == AV_CODEC_ID_H263P ||
1652 s->codec_id == AV_CODEC_ID_MPEG4)
1653 s->no_rounding ^= 1;
1655 if (s->pict_type != AV_PICTURE_TYPE_B) {
1656 s->time_base = s->last_time_base;
1657 s->last_non_b_time = s->time - s->pp_time;
1659 for (i = 0; i < context_count; i++) {
1660 PutBitContext *pb = &s->thread_context[i]->pb;
1661 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1666 assert(s->avctx->rc_max_rate);
1669 if (s->avctx->flags & CODEC_FLAG_PASS1)
1670 ff_write_pass1_stats(s);
1672 for (i = 0; i < 4; i++) {
1673 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1674 avctx->error[i] += s->current_picture_ptr->f->error[i];
1677 if (s->avctx->flags & CODEC_FLAG_PASS1)
1678 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1679 avctx->i_tex_bits + avctx->p_tex_bits ==
1680 put_bits_count(&s->pb));
1681 flush_put_bits(&s->pb);
1682 s->frame_bits = put_bits_count(&s->pb);
1684 stuffing_count = ff_vbv_update(s, s->frame_bits);
1685 if (stuffing_count) {
1686 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1687 stuffing_count + 50) {
1688 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1692 switch (s->codec_id) {
1693 case AV_CODEC_ID_MPEG1VIDEO:
1694 case AV_CODEC_ID_MPEG2VIDEO:
1695 while (stuffing_count--) {
1696 put_bits(&s->pb, 8, 0);
1699 case AV_CODEC_ID_MPEG4:
1700 put_bits(&s->pb, 16, 0);
1701 put_bits(&s->pb, 16, 0x1C3);
1702 stuffing_count -= 4;
1703 while (stuffing_count--) {
1704 put_bits(&s->pb, 8, 0xFF);
1708 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1710 flush_put_bits(&s->pb);
1711 s->frame_bits = put_bits_count(&s->pb);
1714 /* update mpeg1/2 vbv_delay for CBR */
1715 if (s->avctx->rc_max_rate &&
1716 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1717 s->out_format == FMT_MPEG1 &&
1718 90000LL * (avctx->rc_buffer_size - 1) <=
1719 s->avctx->rc_max_rate * 0xFFFFLL) {
1720 int vbv_delay, min_delay;
1721 double inbits = s->avctx->rc_max_rate *
1722 av_q2d(s->avctx->time_base);
1723 int minbits = s->frame_bits - 8 *
1724 (s->vbv_delay_ptr - s->pb.buf - 1);
1725 double bits = s->rc_context.buffer_index + minbits - inbits;
1728 av_log(s->avctx, AV_LOG_ERROR,
1729 "Internal error, negative bits\n");
1731 assert(s->repeat_first_field == 0);
1733 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1734 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1735 s->avctx->rc_max_rate;
1737 vbv_delay = FFMAX(vbv_delay, min_delay);
1739 assert(vbv_delay < 0xFFFF);
1741 s->vbv_delay_ptr[0] &= 0xF8;
1742 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1743 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1744 s->vbv_delay_ptr[2] &= 0x07;
1745 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1746 avctx->vbv_delay = vbv_delay * 300;
1748 s->total_bits += s->frame_bits;
1749 avctx->frame_bits = s->frame_bits;
1751 pkt->pts = s->current_picture.f->pts;
1752 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1753 if (!s->current_picture.f->coded_picture_number)
1754 pkt->dts = pkt->pts - s->dts_delta;
1756 pkt->dts = s->reordered_pts;
1757 s->reordered_pts = pkt->pts;
1759 pkt->dts = pkt->pts;
1760 if (s->current_picture.f->key_frame)
1761 pkt->flags |= AV_PKT_FLAG_KEY;
1763 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1767 assert((s->frame_bits & 7) == 0);
1769 pkt->size = s->frame_bits / 8;
1770 *got_packet = !!pkt->size;
1774 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1775 int n, int threshold)
1777 static const char tab[64] = {
1778 3, 2, 2, 1, 1, 1, 1, 1,
1779 1, 1, 1, 1, 1, 1, 1, 1,
1780 1, 1, 1, 1, 1, 1, 1, 1,
1781 0, 0, 0, 0, 0, 0, 0, 0,
1782 0, 0, 0, 0, 0, 0, 0, 0,
1783 0, 0, 0, 0, 0, 0, 0, 0,
1784 0, 0, 0, 0, 0, 0, 0, 0,
1785 0, 0, 0, 0, 0, 0, 0, 0
1790 int16_t *block = s->block[n];
1791 const int last_index = s->block_last_index[n];
1794 if (threshold < 0) {
1796 threshold = -threshold;
1800 /* Are all we could set to zero already zero? */
1801 if (last_index <= skip_dc - 1)
1804 for (i = 0; i <= last_index; i++) {
1805 const int j = s->intra_scantable.permutated[i];
1806 const int level = FFABS(block[j]);
1808 if (skip_dc && i == 0)
1812 } else if (level > 1) {
1818 if (score >= threshold)
1820 for (i = skip_dc; i <= last_index; i++) {
1821 const int j = s->intra_scantable.permutated[i];
1825 s->block_last_index[n] = 0;
1827 s->block_last_index[n] = -1;
1830 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1834 const int maxlevel = s->max_qcoeff;
1835 const int minlevel = s->min_qcoeff;
1839 i = 1; // skip clipping of intra dc
1843 for (; i <= last_index; i++) {
1844 const int j = s->intra_scantable.permutated[i];
1845 int level = block[j];
1847 if (level > maxlevel) {
1850 } else if (level < minlevel) {
1858 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1859 av_log(s->avctx, AV_LOG_INFO,
1860 "warning, clipping %d dct coefficients to %d..%d\n",
1861 overflow, minlevel, maxlevel);
1864 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1868 for (y = 0; y < 8; y++) {
1869 for (x = 0; x < 8; x++) {
1875 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1876 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1877 int v = ptr[x2 + y2 * stride];
1883 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1888 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1889 int motion_x, int motion_y,
1890 int mb_block_height,
1893 int16_t weight[8][64];
1894 int16_t orig[8][64];
1895 const int mb_x = s->mb_x;
1896 const int mb_y = s->mb_y;
1899 int dct_offset = s->linesize * 8; // default for progressive frames
1900 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1901 ptrdiff_t wrap_y, wrap_c;
1903 for (i = 0; i < mb_block_count; i++)
1904 skip_dct[i] = s->skipdct;
1906 if (s->adaptive_quant) {
1907 const int last_qp = s->qscale;
1908 const int mb_xy = mb_x + mb_y * s->mb_stride;
1910 s->lambda = s->lambda_table[mb_xy];
1913 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1914 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1915 s->dquant = s->qscale - last_qp;
1917 if (s->out_format == FMT_H263) {
1918 s->dquant = av_clip(s->dquant, -2, 2);
1920 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1922 if (s->pict_type == AV_PICTURE_TYPE_B) {
1923 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1926 if (s->mv_type == MV_TYPE_8X8)
1932 ff_set_qscale(s, last_qp + s->dquant);
1933 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1934 ff_set_qscale(s, s->qscale + s->dquant);
1936 wrap_y = s->linesize;
1937 wrap_c = s->uvlinesize;
1938 ptr_y = s->new_picture.f->data[0] +
1939 (mb_y * 16 * wrap_y) + mb_x * 16;
1940 ptr_cb = s->new_picture.f->data[1] +
1941 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1942 ptr_cr = s->new_picture.f->data[2] +
1943 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1945 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1946 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1947 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1949 16, 16, mb_x * 16, mb_y * 16,
1950 s->width, s->height);
1952 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1954 8, mb_block_height, mb_x * 8, mb_y * 8,
1955 s->width >> 1, s->height >> 1);
1956 ptr_cb = ebuf + 18 * wrap_y;
1957 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1959 8, mb_block_height, mb_x * 8, mb_y * 8,
1960 s->width >> 1, s->height >> 1);
1961 ptr_cr = ebuf + 18 * wrap_y + 8;
1965 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
1966 int progressive_score, interlaced_score;
1968 s->interlaced_dct = 0;
1969 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1970 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1971 NULL, wrap_y, 8) - 400;
1973 if (progressive_score > 0) {
1974 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1975 NULL, wrap_y * 2, 8) +
1976 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1977 NULL, wrap_y * 2, 8);
1978 if (progressive_score > interlaced_score) {
1979 s->interlaced_dct = 1;
1981 dct_offset = wrap_y;
1983 if (s->chroma_format == CHROMA_422)
1989 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1990 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1991 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
1992 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
1994 if (s->avctx->flags & CODEC_FLAG_GRAY) {
1998 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1999 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2000 if (!s->chroma_y_shift) { /* 422 */
2001 s->pdsp.get_pixels(s->block[6],
2002 ptr_cb + (dct_offset >> 1), wrap_c);
2003 s->pdsp.get_pixels(s->block[7],
2004 ptr_cr + (dct_offset >> 1), wrap_c);
2008 op_pixels_func (*op_pix)[4];
2009 qpel_mc_func (*op_qpix)[16];
2010 uint8_t *dest_y, *dest_cb, *dest_cr;
2012 dest_y = s->dest[0];
2013 dest_cb = s->dest[1];
2014 dest_cr = s->dest[2];
2016 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2017 op_pix = s->hdsp.put_pixels_tab;
2018 op_qpix = s->qdsp.put_qpel_pixels_tab;
2020 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2021 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2024 if (s->mv_dir & MV_DIR_FORWARD) {
2025 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2026 s->last_picture.f->data,
2028 op_pix = s->hdsp.avg_pixels_tab;
2029 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2031 if (s->mv_dir & MV_DIR_BACKWARD) {
2032 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2033 s->next_picture.f->data,
2037 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
2038 int progressive_score, interlaced_score;
2040 s->interlaced_dct = 0;
2041 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2042 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2046 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2047 progressive_score -= 400;
2049 if (progressive_score > 0) {
2050 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2052 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2056 if (progressive_score > interlaced_score) {
2057 s->interlaced_dct = 1;
2059 dct_offset = wrap_y;
2061 if (s->chroma_format == CHROMA_422)
2067 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2068 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2069 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2070 dest_y + dct_offset, wrap_y);
2071 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2072 dest_y + dct_offset + 8, wrap_y);
2074 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2078 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2079 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2080 if (!s->chroma_y_shift) { /* 422 */
2081 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2082 dest_cb + (dct_offset >> 1), wrap_c);
2083 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2084 dest_cr + (dct_offset >> 1), wrap_c);
2087 /* pre quantization */
2088 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2089 2 * s->qscale * s->qscale) {
2091 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2093 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2095 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2096 wrap_y, 8) < 20 * s->qscale)
2098 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2099 wrap_y, 8) < 20 * s->qscale)
2101 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2103 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2105 if (!s->chroma_y_shift) { /* 422 */
2106 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2107 dest_cb + (dct_offset >> 1),
2108 wrap_c, 8) < 20 * s->qscale)
2110 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2111 dest_cr + (dct_offset >> 1),
2112 wrap_c, 8) < 20 * s->qscale)
2118 if (s->quantizer_noise_shaping) {
2120 get_visual_weight(weight[0], ptr_y , wrap_y);
2122 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2124 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2126 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2128 get_visual_weight(weight[4], ptr_cb , wrap_c);
2130 get_visual_weight(weight[5], ptr_cr , wrap_c);
2131 if (!s->chroma_y_shift) { /* 422 */
2133 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2136 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2139 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2142 /* DCT & quantize */
2143 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2145 for (i = 0; i < mb_block_count; i++) {
2148 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2149 // FIXME we could decide to change to quantizer instead of
2151 // JS: I don't think that would be a good idea it could lower
2152 // quality instead of improve it. Just INTRADC clipping
2153 // deserves changes in quantizer
2155 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2157 s->block_last_index[i] = -1;
2159 if (s->quantizer_noise_shaping) {
2160 for (i = 0; i < mb_block_count; i++) {
2162 s->block_last_index[i] =
2163 dct_quantize_refine(s, s->block[i], weight[i],
2164 orig[i], i, s->qscale);
2169 if (s->luma_elim_threshold && !s->mb_intra)
2170 for (i = 0; i < 4; i++)
2171 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2172 if (s->chroma_elim_threshold && !s->mb_intra)
2173 for (i = 4; i < mb_block_count; i++)
2174 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2176 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2177 for (i = 0; i < mb_block_count; i++) {
2178 if (s->block_last_index[i] == -1)
2179 s->coded_score[i] = INT_MAX / 256;
2184 if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2185 s->block_last_index[4] =
2186 s->block_last_index[5] = 0;
2188 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2191 // non c quantize code returns incorrect block_last_index FIXME
2192 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2193 for (i = 0; i < mb_block_count; i++) {
2195 if (s->block_last_index[i] > 0) {
2196 for (j = 63; j > 0; j--) {
2197 if (s->block[i][s->intra_scantable.permutated[j]])
2200 s->block_last_index[i] = j;
2205 /* huffman encode */
2206 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2207 case AV_CODEC_ID_MPEG1VIDEO:
2208 case AV_CODEC_ID_MPEG2VIDEO:
2209 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2210 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2212 case AV_CODEC_ID_MPEG4:
2213 if (CONFIG_MPEG4_ENCODER)
2214 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2216 case AV_CODEC_ID_MSMPEG4V2:
2217 case AV_CODEC_ID_MSMPEG4V3:
2218 case AV_CODEC_ID_WMV1:
2219 if (CONFIG_MSMPEG4_ENCODER)
2220 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2222 case AV_CODEC_ID_WMV2:
2223 if (CONFIG_WMV2_ENCODER)
2224 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2226 case AV_CODEC_ID_H261:
2227 if (CONFIG_H261_ENCODER)
2228 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2230 case AV_CODEC_ID_H263:
2231 case AV_CODEC_ID_H263P:
2232 case AV_CODEC_ID_FLV1:
2233 case AV_CODEC_ID_RV10:
2234 case AV_CODEC_ID_RV20:
2235 if (CONFIG_H263_ENCODER)
2236 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2238 case AV_CODEC_ID_MJPEG:
2239 if (CONFIG_MJPEG_ENCODER)
2240 ff_mjpeg_encode_mb(s, s->block);
2247 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2249 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2250 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2253 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2256 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2259 d->mb_skip_run= s->mb_skip_run;
2261 d->last_dc[i] = s->last_dc[i];
2264 d->mv_bits= s->mv_bits;
2265 d->i_tex_bits= s->i_tex_bits;
2266 d->p_tex_bits= s->p_tex_bits;
2267 d->i_count= s->i_count;
2268 d->f_count= s->f_count;
2269 d->b_count= s->b_count;
2270 d->skip_count= s->skip_count;
2271 d->misc_bits= s->misc_bits;
2275 d->qscale= s->qscale;
2276 d->dquant= s->dquant;
2278 d->esc3_level_length= s->esc3_level_length;
2281 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2284 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2285 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2288 d->mb_skip_run= s->mb_skip_run;
2290 d->last_dc[i] = s->last_dc[i];
2293 d->mv_bits= s->mv_bits;
2294 d->i_tex_bits= s->i_tex_bits;
2295 d->p_tex_bits= s->p_tex_bits;
2296 d->i_count= s->i_count;
2297 d->f_count= s->f_count;
2298 d->b_count= s->b_count;
2299 d->skip_count= s->skip_count;
2300 d->misc_bits= s->misc_bits;
2302 d->mb_intra= s->mb_intra;
2303 d->mb_skipped= s->mb_skipped;
2304 d->mv_type= s->mv_type;
2305 d->mv_dir= s->mv_dir;
2307 if(s->data_partitioning){
2309 d->tex_pb= s->tex_pb;
2313 d->block_last_index[i]= s->block_last_index[i];
2314 d->interlaced_dct= s->interlaced_dct;
2315 d->qscale= s->qscale;
2317 d->esc3_level_length= s->esc3_level_length;
2320 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2321 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2322 int *dmin, int *next_block, int motion_x, int motion_y)
2325 uint8_t *dest_backup[3];
2327 copy_context_before_encode(s, backup, type);
2329 s->block= s->blocks[*next_block];
2330 s->pb= pb[*next_block];
2331 if(s->data_partitioning){
2332 s->pb2 = pb2 [*next_block];
2333 s->tex_pb= tex_pb[*next_block];
2337 memcpy(dest_backup, s->dest, sizeof(s->dest));
2338 s->dest[0] = s->sc.rd_scratchpad;
2339 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2340 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2341 assert(s->linesize >= 32); //FIXME
2344 encode_mb(s, motion_x, motion_y);
2346 score= put_bits_count(&s->pb);
2347 if(s->data_partitioning){
2348 score+= put_bits_count(&s->pb2);
2349 score+= put_bits_count(&s->tex_pb);
2352 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2353 ff_mpv_decode_mb(s, s->block);
2355 score *= s->lambda2;
2356 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2360 memcpy(s->dest, dest_backup, sizeof(s->dest));
2367 copy_context_after_encode(best, s, type);
2371 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2372 uint32_t *sq = ff_square_tab + 256;
2377 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2378 else if(w==8 && h==8)
2379 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2383 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2392 static int sse_mb(MpegEncContext *s){
2396 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2397 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2400 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2401 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) +
2402 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) +
2403 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);
2405 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) +
2406 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) +
2407 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);
2410 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)
2411 +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)
2412 +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);
2415 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2416 MpegEncContext *s= *(void**)arg;
2420 s->me.dia_size= s->avctx->pre_dia_size;
2421 s->first_slice_line=1;
2422 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2423 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2424 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2426 s->first_slice_line=0;
2434 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2435 MpegEncContext *s= *(void**)arg;
2437 s->me.dia_size= s->avctx->dia_size;
2438 s->first_slice_line=1;
2439 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2440 s->mb_x=0; //for block init below
2441 ff_init_block_index(s);
2442 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2443 s->block_index[0]+=2;
2444 s->block_index[1]+=2;
2445 s->block_index[2]+=2;
2446 s->block_index[3]+=2;
2448 /* compute motion vector & mb_type and store in context */
2449 if(s->pict_type==AV_PICTURE_TYPE_B)
2450 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2452 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2454 s->first_slice_line=0;
2459 static int mb_var_thread(AVCodecContext *c, void *arg){
2460 MpegEncContext *s= *(void**)arg;
2463 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2464 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2467 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2469 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2471 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2472 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2474 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2475 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2476 s->me.mb_var_sum_temp += varc;
2482 static void write_slice_end(MpegEncContext *s){
2483 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2484 if(s->partitioned_frame){
2485 ff_mpeg4_merge_partitions(s);
2488 ff_mpeg4_stuffing(&s->pb);
2489 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2490 ff_mjpeg_encode_stuffing(&s->pb);
2493 avpriv_align_put_bits(&s->pb);
2494 flush_put_bits(&s->pb);
2496 if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
2497 s->misc_bits+= get_bits_diff(s);
2500 static void write_mb_info(MpegEncContext *s)
2502 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2503 int offset = put_bits_count(&s->pb);
2504 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2505 int gobn = s->mb_y / s->gob_index;
2507 if (CONFIG_H263_ENCODER)
2508 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2509 bytestream_put_le32(&ptr, offset);
2510 bytestream_put_byte(&ptr, s->qscale);
2511 bytestream_put_byte(&ptr, gobn);
2512 bytestream_put_le16(&ptr, mba);
2513 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2514 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2515 /* 4MV not implemented */
2516 bytestream_put_byte(&ptr, 0); /* hmv2 */
2517 bytestream_put_byte(&ptr, 0); /* vmv2 */
2520 static void update_mb_info(MpegEncContext *s, int startcode)
2524 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2525 s->mb_info_size += 12;
2526 s->prev_mb_info = s->last_mb_info;
2529 s->prev_mb_info = put_bits_count(&s->pb)/8;
2530 /* This might have incremented mb_info_size above, and we return without
2531 * actually writing any info into that slot yet. But in that case,
2532 * this will be called again at the start of the after writing the
2533 * start code, actually writing the mb info. */
2537 s->last_mb_info = put_bits_count(&s->pb)/8;
2538 if (!s->mb_info_size)
2539 s->mb_info_size += 12;
2543 static int encode_thread(AVCodecContext *c, void *arg){
2544 MpegEncContext *s= *(void**)arg;
2545 int mb_x, mb_y, pdif = 0;
2546 int chr_h= 16>>s->chroma_y_shift;
2548 MpegEncContext best_s = { 0 }, backup_s;
2549 uint8_t bit_buf[2][MAX_MB_BYTES];
2550 uint8_t bit_buf2[2][MAX_MB_BYTES];
2551 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2552 PutBitContext pb[2], pb2[2], tex_pb[2];
2555 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2556 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2557 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2560 s->last_bits= put_bits_count(&s->pb);
2571 /* init last dc values */
2572 /* note: quant matrix value (8) is implied here */
2573 s->last_dc[i] = 128 << s->intra_dc_precision;
2575 s->current_picture.f->error[i] = 0;
2578 memset(s->last_mv, 0, sizeof(s->last_mv));
2582 switch(s->codec_id){
2583 case AV_CODEC_ID_H263:
2584 case AV_CODEC_ID_H263P:
2585 case AV_CODEC_ID_FLV1:
2586 if (CONFIG_H263_ENCODER)
2587 s->gob_index = H263_GOB_HEIGHT(s->height);
2589 case AV_CODEC_ID_MPEG4:
2590 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2591 ff_mpeg4_init_partitions(s);
2597 s->first_slice_line = 1;
2598 s->ptr_lastgob = s->pb.buf;
2599 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2603 ff_set_qscale(s, s->qscale);
2604 ff_init_block_index(s);
2606 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2607 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2608 int mb_type= s->mb_type[xy];
2613 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2614 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2617 if(s->data_partitioning){
2618 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2619 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2620 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2626 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2627 ff_update_block_index(s);
2629 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2630 ff_h261_reorder_mb_index(s);
2631 xy= s->mb_y*s->mb_stride + s->mb_x;
2632 mb_type= s->mb_type[xy];
2635 /* write gob / video packet header */
2637 int current_packet_size, is_gob_start;
2639 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2641 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2643 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2645 switch(s->codec_id){
2646 case AV_CODEC_ID_H263:
2647 case AV_CODEC_ID_H263P:
2648 if(!s->h263_slice_structured)
2649 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2651 case AV_CODEC_ID_MPEG2VIDEO:
2652 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2653 case AV_CODEC_ID_MPEG1VIDEO:
2654 if(s->mb_skip_run) is_gob_start=0;
2659 if(s->start_mb_y != mb_y || mb_x!=0){
2662 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2663 ff_mpeg4_init_partitions(s);
2667 assert((put_bits_count(&s->pb)&7) == 0);
2668 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2670 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2671 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2672 int d = 100 / s->error_rate;
2674 current_packet_size=0;
2675 s->pb.buf_ptr= s->ptr_lastgob;
2676 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2680 if (s->avctx->rtp_callback){
2681 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2682 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2684 update_mb_info(s, 1);
2686 switch(s->codec_id){
2687 case AV_CODEC_ID_MPEG4:
2688 if (CONFIG_MPEG4_ENCODER) {
2689 ff_mpeg4_encode_video_packet_header(s);
2690 ff_mpeg4_clean_buffers(s);
2693 case AV_CODEC_ID_MPEG1VIDEO:
2694 case AV_CODEC_ID_MPEG2VIDEO:
2695 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2696 ff_mpeg1_encode_slice_header(s);
2697 ff_mpeg1_clean_buffers(s);
2700 case AV_CODEC_ID_H263:
2701 case AV_CODEC_ID_H263P:
2702 if (CONFIG_H263_ENCODER)
2703 ff_h263_encode_gob_header(s, mb_y);
2707 if (s->avctx->flags & CODEC_FLAG_PASS1) {
2708 int bits= put_bits_count(&s->pb);
2709 s->misc_bits+= bits - s->last_bits;
2713 s->ptr_lastgob += current_packet_size;
2714 s->first_slice_line=1;
2715 s->resync_mb_x=mb_x;
2716 s->resync_mb_y=mb_y;
2720 if( (s->resync_mb_x == s->mb_x)
2721 && s->resync_mb_y+1 == s->mb_y){
2722 s->first_slice_line=0;
2726 s->dquant=0; //only for QP_RD
2728 update_mb_info(s, 0);
2730 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
2732 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2734 copy_context_before_encode(&backup_s, s, -1);
2736 best_s.data_partitioning= s->data_partitioning;
2737 best_s.partitioned_frame= s->partitioned_frame;
2738 if(s->data_partitioning){
2739 backup_s.pb2= s->pb2;
2740 backup_s.tex_pb= s->tex_pb;
2743 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2744 s->mv_dir = MV_DIR_FORWARD;
2745 s->mv_type = MV_TYPE_16X16;
2747 s->mv[0][0][0] = s->p_mv_table[xy][0];
2748 s->mv[0][0][1] = s->p_mv_table[xy][1];
2749 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2750 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2752 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2753 s->mv_dir = MV_DIR_FORWARD;
2754 s->mv_type = MV_TYPE_FIELD;
2757 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2758 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2759 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2761 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2762 &dmin, &next_block, 0, 0);
2764 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2765 s->mv_dir = MV_DIR_FORWARD;
2766 s->mv_type = MV_TYPE_16X16;
2770 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2771 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2773 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2774 s->mv_dir = MV_DIR_FORWARD;
2775 s->mv_type = MV_TYPE_8X8;
2778 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2779 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2781 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2782 &dmin, &next_block, 0, 0);
2784 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2785 s->mv_dir = MV_DIR_FORWARD;
2786 s->mv_type = MV_TYPE_16X16;
2788 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2789 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2790 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2791 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2793 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2794 s->mv_dir = MV_DIR_BACKWARD;
2795 s->mv_type = MV_TYPE_16X16;
2797 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2798 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2799 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2800 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2802 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2803 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2804 s->mv_type = MV_TYPE_16X16;
2806 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2807 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2808 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2809 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2810 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2811 &dmin, &next_block, 0, 0);
2813 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2814 s->mv_dir = MV_DIR_FORWARD;
2815 s->mv_type = MV_TYPE_FIELD;
2818 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2819 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2820 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2822 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2823 &dmin, &next_block, 0, 0);
2825 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2826 s->mv_dir = MV_DIR_BACKWARD;
2827 s->mv_type = MV_TYPE_FIELD;
2830 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2831 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2832 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2834 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2835 &dmin, &next_block, 0, 0);
2837 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2838 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2839 s->mv_type = MV_TYPE_FIELD;
2841 for(dir=0; dir<2; dir++){
2843 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2844 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2845 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2848 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2849 &dmin, &next_block, 0, 0);
2851 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2853 s->mv_type = MV_TYPE_16X16;
2857 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2858 &dmin, &next_block, 0, 0);
2859 if(s->h263_pred || s->h263_aic){
2861 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2863 ff_clean_intra_table_entries(s); //old mode?
2867 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2868 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2869 const int last_qp= backup_s.qscale;
2872 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2873 static const int dquant_tab[4]={-1,1,-2,2};
2875 assert(backup_s.dquant == 0);
2878 s->mv_dir= best_s.mv_dir;
2879 s->mv_type = MV_TYPE_16X16;
2880 s->mb_intra= best_s.mb_intra;
2881 s->mv[0][0][0] = best_s.mv[0][0][0];
2882 s->mv[0][0][1] = best_s.mv[0][0][1];
2883 s->mv[1][0][0] = best_s.mv[1][0][0];
2884 s->mv[1][0][1] = best_s.mv[1][0][1];
2886 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2887 for(; qpi<4; qpi++){
2888 int dquant= dquant_tab[qpi];
2889 qp= last_qp + dquant;
2890 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2892 backup_s.dquant= dquant;
2893 if(s->mb_intra && s->dc_val[0]){
2895 dc[i]= s->dc_val[0][ s->block_index[i] ];
2896 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2900 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2901 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2902 if(best_s.qscale != qp){
2903 if(s->mb_intra && s->dc_val[0]){
2905 s->dc_val[0][ s->block_index[i] ]= dc[i];
2906 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2913 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2914 int mx= s->b_direct_mv_table[xy][0];
2915 int my= s->b_direct_mv_table[xy][1];
2917 backup_s.dquant = 0;
2918 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2920 ff_mpeg4_set_direct_mv(s, mx, my);
2921 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2922 &dmin, &next_block, mx, my);
2924 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2925 backup_s.dquant = 0;
2926 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2928 ff_mpeg4_set_direct_mv(s, 0, 0);
2929 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2930 &dmin, &next_block, 0, 0);
2932 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2935 coded |= s->block_last_index[i];
2938 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2939 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2940 mx=my=0; //FIXME find the one we actually used
2941 ff_mpeg4_set_direct_mv(s, mx, my);
2942 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2950 s->mv_dir= best_s.mv_dir;
2951 s->mv_type = best_s.mv_type;
2953 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2954 s->mv[0][0][1] = best_s.mv[0][0][1];
2955 s->mv[1][0][0] = best_s.mv[1][0][0];
2956 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2959 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2960 &dmin, &next_block, mx, my);
2965 s->current_picture.qscale_table[xy] = best_s.qscale;
2967 copy_context_after_encode(s, &best_s, -1);
2969 pb_bits_count= put_bits_count(&s->pb);
2970 flush_put_bits(&s->pb);
2971 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2974 if(s->data_partitioning){
2975 pb2_bits_count= put_bits_count(&s->pb2);
2976 flush_put_bits(&s->pb2);
2977 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2978 s->pb2= backup_s.pb2;
2980 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2981 flush_put_bits(&s->tex_pb);
2982 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2983 s->tex_pb= backup_s.tex_pb;
2985 s->last_bits= put_bits_count(&s->pb);
2987 if (CONFIG_H263_ENCODER &&
2988 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2989 ff_h263_update_motion_val(s);
2991 if(next_block==0){ //FIXME 16 vs linesize16
2992 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
2993 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2994 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2997 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2998 ff_mpv_decode_mb(s, s->block);
3000 int motion_x = 0, motion_y = 0;
3001 s->mv_type=MV_TYPE_16X16;
3002 // only one MB-Type possible
3005 case CANDIDATE_MB_TYPE_INTRA:
3008 motion_x= s->mv[0][0][0] = 0;
3009 motion_y= s->mv[0][0][1] = 0;
3011 case CANDIDATE_MB_TYPE_INTER:
3012 s->mv_dir = MV_DIR_FORWARD;
3014 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3015 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3017 case CANDIDATE_MB_TYPE_INTER_I:
3018 s->mv_dir = MV_DIR_FORWARD;
3019 s->mv_type = MV_TYPE_FIELD;
3022 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3023 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3024 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3027 case CANDIDATE_MB_TYPE_INTER4V:
3028 s->mv_dir = MV_DIR_FORWARD;
3029 s->mv_type = MV_TYPE_8X8;
3032 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3033 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3036 case CANDIDATE_MB_TYPE_DIRECT:
3037 if (CONFIG_MPEG4_ENCODER) {
3038 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3040 motion_x=s->b_direct_mv_table[xy][0];
3041 motion_y=s->b_direct_mv_table[xy][1];
3042 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3045 case CANDIDATE_MB_TYPE_DIRECT0:
3046 if (CONFIG_MPEG4_ENCODER) {
3047 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3049 ff_mpeg4_set_direct_mv(s, 0, 0);
3052 case CANDIDATE_MB_TYPE_BIDIR:
3053 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3055 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3056 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3057 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3058 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3060 case CANDIDATE_MB_TYPE_BACKWARD:
3061 s->mv_dir = MV_DIR_BACKWARD;
3063 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3064 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3066 case CANDIDATE_MB_TYPE_FORWARD:
3067 s->mv_dir = MV_DIR_FORWARD;
3069 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3070 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3072 case CANDIDATE_MB_TYPE_FORWARD_I:
3073 s->mv_dir = MV_DIR_FORWARD;
3074 s->mv_type = MV_TYPE_FIELD;
3077 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3078 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3079 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3082 case CANDIDATE_MB_TYPE_BACKWARD_I:
3083 s->mv_dir = MV_DIR_BACKWARD;
3084 s->mv_type = MV_TYPE_FIELD;
3087 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3088 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3089 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3092 case CANDIDATE_MB_TYPE_BIDIR_I:
3093 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3094 s->mv_type = MV_TYPE_FIELD;
3096 for(dir=0; dir<2; dir++){
3098 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3099 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3100 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3105 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3108 encode_mb(s, motion_x, motion_y);
3110 // RAL: Update last macroblock type
3111 s->last_mv_dir = s->mv_dir;
3113 if (CONFIG_H263_ENCODER &&
3114 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3115 ff_h263_update_motion_val(s);
3117 ff_mpv_decode_mb(s, s->block);
3120 /* clean the MV table in IPS frames for direct mode in B frames */
3121 if(s->mb_intra /* && I,P,S_TYPE */){
3122 s->p_mv_table[xy][0]=0;
3123 s->p_mv_table[xy][1]=0;
3126 if (s->avctx->flags & CODEC_FLAG_PSNR) {
3130 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3131 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3133 s->current_picture.f->error[0] += sse(
3134 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3135 s->dest[0], w, h, s->linesize);
3136 s->current_picture.f->error[1] += sse(
3137 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3138 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3139 s->current_picture.f->error[2] += sse(
3140 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3141 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3144 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3145 ff_h263_loop_filter(s);
3147 ff_dlog(s->avctx, "MB %d %d bits\n",
3148 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3152 //not beautiful here but we must write it before flushing so it has to be here
3153 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3154 ff_msmpeg4_encode_ext_header(s);
3158 /* Send the last GOB if RTP */
3159 if (s->avctx->rtp_callback) {
3160 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3161 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3162 /* Call the RTP callback to send the last GOB */
3164 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3170 #define MERGE(field) dst->field += src->field; src->field=0
3171 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3172 MERGE(me.scene_change_score);
3173 MERGE(me.mc_mb_var_sum_temp);
3174 MERGE(me.mb_var_sum_temp);
3177 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3180 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3181 MERGE(dct_count[1]);
3190 MERGE(er.error_count);
3191 MERGE(padding_bug_score);
3192 MERGE(current_picture.f->error[0]);
3193 MERGE(current_picture.f->error[1]);
3194 MERGE(current_picture.f->error[2]);
3196 if(dst->avctx->noise_reduction){
3197 for(i=0; i<64; i++){
3198 MERGE(dct_error_sum[0][i]);
3199 MERGE(dct_error_sum[1][i]);
3203 assert(put_bits_count(&src->pb) % 8 ==0);
3204 assert(put_bits_count(&dst->pb) % 8 ==0);
3205 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3206 flush_put_bits(&dst->pb);
3209 static int estimate_qp(MpegEncContext *s, int dry_run){
3210 if (s->next_lambda){
3211 s->current_picture_ptr->f->quality =
3212 s->current_picture.f->quality = s->next_lambda;
3213 if(!dry_run) s->next_lambda= 0;
3214 } else if (!s->fixed_qscale) {
3215 s->current_picture_ptr->f->quality =
3216 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3217 if (s->current_picture.f->quality < 0)
3221 if(s->adaptive_quant){
3222 switch(s->codec_id){
3223 case AV_CODEC_ID_MPEG4:
3224 if (CONFIG_MPEG4_ENCODER)
3225 ff_clean_mpeg4_qscales(s);
3227 case AV_CODEC_ID_H263:
3228 case AV_CODEC_ID_H263P:
3229 case AV_CODEC_ID_FLV1:
3230 if (CONFIG_H263_ENCODER)
3231 ff_clean_h263_qscales(s);
3234 ff_init_qscale_tab(s);
3237 s->lambda= s->lambda_table[0];
3240 s->lambda = s->current_picture.f->quality;
3245 /* must be called before writing the header */
3246 static void set_frame_distances(MpegEncContext * s){
3247 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3248 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3250 if(s->pict_type==AV_PICTURE_TYPE_B){
3251 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3252 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3254 s->pp_time= s->time - s->last_non_b_time;
3255 s->last_non_b_time= s->time;
3256 assert(s->picture_number==0 || s->pp_time > 0);
3260 static int encode_picture(MpegEncContext *s, int picture_number)
3264 int context_count = s->slice_context_count;
3266 s->picture_number = picture_number;
3268 /* Reset the average MB variance */
3269 s->me.mb_var_sum_temp =
3270 s->me.mc_mb_var_sum_temp = 0;
3272 /* we need to initialize some time vars before we can encode b-frames */
3273 // RAL: Condition added for MPEG1VIDEO
3274 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3275 set_frame_distances(s);
3276 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3277 ff_set_mpeg4_time(s);
3279 s->me.scene_change_score=0;
3281 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3283 if(s->pict_type==AV_PICTURE_TYPE_I){
3284 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3285 else s->no_rounding=0;
3286 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3287 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3288 s->no_rounding ^= 1;
3291 if (s->avctx->flags & CODEC_FLAG_PASS2) {
3292 if (estimate_qp(s,1) < 0)
3294 ff_get_2pass_fcode(s);
3295 } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
3296 if(s->pict_type==AV_PICTURE_TYPE_B)
3297 s->lambda= s->last_lambda_for[s->pict_type];
3299 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3303 s->mb_intra=0; //for the rate distortion & bit compare functions
3304 for(i=1; i<context_count; i++){
3305 ret = ff_update_duplicate_context(s->thread_context[i], s);
3313 /* Estimate motion for every MB */
3314 if(s->pict_type != AV_PICTURE_TYPE_I){
3315 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3316 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3317 if (s->pict_type != AV_PICTURE_TYPE_B) {
3318 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3319 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3323 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3324 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3326 for(i=0; i<s->mb_stride*s->mb_height; i++)
3327 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3329 if(!s->fixed_qscale){
3330 /* finding spatial complexity for I-frame rate control */
3331 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3334 for(i=1; i<context_count; i++){
3335 merge_context_after_me(s, s->thread_context[i]);
3337 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3338 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3341 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3342 s->pict_type= AV_PICTURE_TYPE_I;
3343 for(i=0; i<s->mb_stride*s->mb_height; i++)
3344 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3345 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3346 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3350 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3351 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3353 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3355 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3356 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3357 s->f_code= FFMAX3(s->f_code, a, b);
3360 ff_fix_long_p_mvs(s);
3361 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3362 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3366 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3367 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3372 if(s->pict_type==AV_PICTURE_TYPE_B){
3375 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3376 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3377 s->f_code = FFMAX(a, b);
3379 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3380 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3381 s->b_code = FFMAX(a, b);
3383 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3384 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3385 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3386 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3387 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3389 for(dir=0; dir<2; dir++){
3392 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3393 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3394 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3395 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3403 if (estimate_qp(s, 0) < 0)
3406 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3407 s->pict_type == AV_PICTURE_TYPE_I &&
3408 !(s->avctx->flags & CODEC_FLAG_QSCALE))
3409 s->qscale= 3; //reduce clipping problems
3411 if (s->out_format == FMT_MJPEG) {
3412 /* for mjpeg, we do include qscale in the matrix */
3414 int j = s->idsp.idct_permutation[i];
3416 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3418 s->y_dc_scale_table=
3419 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3420 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3421 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3422 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3426 //FIXME var duplication
3427 s->current_picture_ptr->f->key_frame =
3428 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3429 s->current_picture_ptr->f->pict_type =
3430 s->current_picture.f->pict_type = s->pict_type;
3432 if (s->current_picture.f->key_frame)
3433 s->picture_in_gop_number=0;
3435 s->last_bits= put_bits_count(&s->pb);
3436 switch(s->out_format) {
3438 if (CONFIG_MJPEG_ENCODER)
3439 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3443 if (CONFIG_H261_ENCODER)
3444 ff_h261_encode_picture_header(s, picture_number);
3447 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3448 ff_wmv2_encode_picture_header(s, picture_number);
3449 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3450 ff_msmpeg4_encode_picture_header(s, picture_number);
3451 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3452 ff_mpeg4_encode_picture_header(s, picture_number);
3453 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3454 ret = ff_rv10_encode_picture_header(s, picture_number);
3458 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3459 ff_rv20_encode_picture_header(s, picture_number);
3460 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3461 ff_flv_encode_picture_header(s, picture_number);
3462 else if (CONFIG_H263_ENCODER)
3463 ff_h263_encode_picture_header(s, picture_number);
3466 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3467 ff_mpeg1_encode_picture_header(s, picture_number);
3472 bits= put_bits_count(&s->pb);
3473 s->header_bits= bits - s->last_bits;
3475 for(i=1; i<context_count; i++){
3476 update_duplicate_context_after_me(s->thread_context[i], s);
3478 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3479 for(i=1; i<context_count; i++){
3480 merge_context_after_encode(s, s->thread_context[i]);
3486 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3487 const int intra= s->mb_intra;
3490 s->dct_count[intra]++;
3492 for(i=0; i<64; i++){
3493 int level= block[i];
3497 s->dct_error_sum[intra][i] += level;
3498 level -= s->dct_offset[intra][i];
3499 if(level<0) level=0;
3501 s->dct_error_sum[intra][i] -= level;
3502 level += s->dct_offset[intra][i];
3503 if(level>0) level=0;
3510 static int dct_quantize_trellis_c(MpegEncContext *s,
3511 int16_t *block, int n,
3512 int qscale, int *overflow){
3514 const uint8_t *scantable= s->intra_scantable.scantable;
3515 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3517 unsigned int threshold1, threshold2;
3529 int coeff_count[64];
3530 int qmul, qadd, start_i, last_non_zero, i, dc;
3531 const int esc_length= s->ac_esc_length;
3533 uint8_t * last_length;
3534 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3536 s->fdsp.fdct(block);
3538 if(s->dct_error_sum)
3539 s->denoise_dct(s, block);
3541 qadd= ((qscale-1)|1)*8;
3552 /* For AIC we skip quant/dequant of INTRADC */
3557 /* note: block[0] is assumed to be positive */
3558 block[0] = (block[0] + (q >> 1)) / q;
3561 qmat = s->q_intra_matrix[qscale];
3562 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3563 bias= 1<<(QMAT_SHIFT-1);
3564 length = s->intra_ac_vlc_length;
3565 last_length= s->intra_ac_vlc_last_length;
3569 qmat = s->q_inter_matrix[qscale];
3570 length = s->inter_ac_vlc_length;
3571 last_length= s->inter_ac_vlc_last_length;
3575 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3576 threshold2= (threshold1<<1);
3578 for(i=63; i>=start_i; i--) {
3579 const int j = scantable[i];
3580 int level = block[j] * qmat[j];
3582 if(((unsigned)(level+threshold1))>threshold2){
3588 for(i=start_i; i<=last_non_zero; i++) {
3589 const int j = scantable[i];
3590 int level = block[j] * qmat[j];
3592 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3593 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3594 if(((unsigned)(level+threshold1))>threshold2){
3596 level= (bias + level)>>QMAT_SHIFT;
3598 coeff[1][i]= level-1;
3599 // coeff[2][k]= level-2;
3601 level= (bias - level)>>QMAT_SHIFT;
3602 coeff[0][i]= -level;
3603 coeff[1][i]= -level+1;
3604 // coeff[2][k]= -level+2;
3606 coeff_count[i]= FFMIN(level, 2);
3607 assert(coeff_count[i]);
3610 coeff[0][i]= (level>>31)|1;
3615 *overflow= s->max_qcoeff < max; //overflow might have happened
3617 if(last_non_zero < start_i){
3618 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3619 return last_non_zero;
3622 score_tab[start_i]= 0;
3623 survivor[0]= start_i;
3626 for(i=start_i; i<=last_non_zero; i++){
3627 int level_index, j, zero_distortion;
3628 int dct_coeff= FFABS(block[ scantable[i] ]);
3629 int best_score=256*256*256*120;
3631 if (s->fdsp.fdct == ff_fdct_ifast)
3632 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3633 zero_distortion= dct_coeff*dct_coeff;
3635 for(level_index=0; level_index < coeff_count[i]; level_index++){
3637 int level= coeff[level_index][i];
3638 const int alevel= FFABS(level);
3643 if(s->out_format == FMT_H263){
3644 unquant_coeff= alevel*qmul + qadd;
3646 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3648 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3649 unquant_coeff = (unquant_coeff - 1) | 1;
3651 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3652 unquant_coeff = (unquant_coeff - 1) | 1;
3657 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3659 if((level&(~127)) == 0){
3660 for(j=survivor_count-1; j>=0; j--){
3661 int run= i - survivor[j];
3662 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3663 score += score_tab[i-run];
3665 if(score < best_score){
3668 level_tab[i+1]= level-64;
3672 if(s->out_format == FMT_H263){
3673 for(j=survivor_count-1; j>=0; j--){
3674 int run= i - survivor[j];
3675 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3676 score += score_tab[i-run];
3677 if(score < last_score){
3680 last_level= level-64;
3686 distortion += esc_length*lambda;
3687 for(j=survivor_count-1; j>=0; j--){
3688 int run= i - survivor[j];
3689 int score= distortion + score_tab[i-run];
3691 if(score < best_score){
3694 level_tab[i+1]= level-64;
3698 if(s->out_format == FMT_H263){
3699 for(j=survivor_count-1; j>=0; j--){
3700 int run= i - survivor[j];
3701 int score= distortion + score_tab[i-run];
3702 if(score < last_score){
3705 last_level= level-64;
3713 score_tab[i+1]= best_score;
3715 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3716 if(last_non_zero <= 27){
3717 for(; survivor_count; survivor_count--){
3718 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3722 for(; survivor_count; survivor_count--){
3723 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3728 survivor[ survivor_count++ ]= i+1;
3731 if(s->out_format != FMT_H263){
3732 last_score= 256*256*256*120;
3733 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3734 int score= score_tab[i];
3735 if(i) score += lambda*2; //FIXME exacter?
3737 if(score < last_score){
3740 last_level= level_tab[i];
3741 last_run= run_tab[i];
3746 s->coded_score[n] = last_score;
3748 dc= FFABS(block[0]);
3749 last_non_zero= last_i - 1;
3750 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3752 if(last_non_zero < start_i)
3753 return last_non_zero;
3755 if(last_non_zero == 0 && start_i == 0){
3757 int best_score= dc * dc;
3759 for(i=0; i<coeff_count[0]; i++){
3760 int level= coeff[i][0];
3761 int alevel= FFABS(level);
3762 int unquant_coeff, score, distortion;
3764 if(s->out_format == FMT_H263){
3765 unquant_coeff= (alevel*qmul + qadd)>>3;
3767 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3768 unquant_coeff = (unquant_coeff - 1) | 1;
3770 unquant_coeff = (unquant_coeff + 4) >> 3;
3771 unquant_coeff<<= 3 + 3;
3773 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3775 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3776 else score= distortion + esc_length*lambda;
3778 if(score < best_score){
3780 best_level= level - 64;
3783 block[0]= best_level;
3784 s->coded_score[n] = best_score - dc*dc;
3785 if(best_level == 0) return -1;
3786 else return last_non_zero;
3792 block[ perm_scantable[last_non_zero] ]= last_level;
3795 for(; i>start_i; i -= run_tab[i] + 1){
3796 block[ perm_scantable[i-1] ]= level_tab[i];
3799 return last_non_zero;
3802 //#define REFINE_STATS 1
3803 static int16_t basis[64][64];
3805 static void build_basis(uint8_t *perm){
3812 double s= 0.25*(1<<BASIS_SHIFT);
3814 int perm_index= perm[index];
3815 if(i==0) s*= sqrt(0.5);
3816 if(j==0) s*= sqrt(0.5);
3817 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)));
3824 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3825 int16_t *block, int16_t *weight, int16_t *orig,
3828 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3829 const uint8_t *scantable= s->intra_scantable.scantable;
3830 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3831 // unsigned int threshold1, threshold2;
3836 int qmul, qadd, start_i, last_non_zero, i, dc;
3838 uint8_t * last_length;
3840 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3843 static int after_last=0;
3844 static int to_zero=0;
3845 static int from_zero=0;
3848 static int messed_sign=0;
3851 if(basis[0][0] == 0)
3852 build_basis(s->idsp.idct_permutation);
3863 /* For AIC we skip quant/dequant of INTRADC */
3867 q <<= RECON_SHIFT-3;
3868 /* note: block[0] is assumed to be positive */
3870 // block[0] = (block[0] + (q >> 1)) / q;
3872 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3873 // bias= 1<<(QMAT_SHIFT-1);
3874 length = s->intra_ac_vlc_length;
3875 last_length= s->intra_ac_vlc_last_length;
3879 length = s->inter_ac_vlc_length;
3880 last_length= s->inter_ac_vlc_last_length;
3882 last_non_zero = s->block_last_index[n];
3887 dc += (1<<(RECON_SHIFT-1));
3888 for(i=0; i<64; i++){
3889 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3892 STOP_TIMER("memset rem[]")}
3895 for(i=0; i<64; i++){
3900 w= FFABS(weight[i]) + qns*one;
3901 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3904 // w=weight[i] = (63*qns + (w/2)) / w;
3910 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3916 for(i=start_i; i<=last_non_zero; i++){
3917 int j= perm_scantable[i];
3918 const int level= block[j];
3922 if(level<0) coeff= qmul*level - qadd;
3923 else coeff= qmul*level + qadd;
3924 run_tab[rle_index++]=run;
3927 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3933 if(last_non_zero>0){
3934 STOP_TIMER("init rem[]")
3941 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3944 int run2, best_unquant_change=0, analyze_gradient;
3948 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3950 if(analyze_gradient){
3954 for(i=0; i<64; i++){
3957 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3960 STOP_TIMER("rem*w*w")}
3970 const int level= block[0];
3971 int change, old_coeff;
3973 assert(s->mb_intra);
3977 for(change=-1; change<=1; change+=2){
3978 int new_level= level + change;
3979 int score, new_coeff;
3981 new_coeff= q*new_level;
3982 if(new_coeff >= 2048 || new_coeff < 0)
3985 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3986 new_coeff - old_coeff);
3987 if(score<best_score){
3990 best_change= change;
3991 best_unquant_change= new_coeff - old_coeff;
3998 run2= run_tab[rle_index++];
4002 for(i=start_i; i<64; i++){
4003 int j= perm_scantable[i];
4004 const int level= block[j];
4005 int change, old_coeff;
4007 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4011 if(level<0) old_coeff= qmul*level - qadd;
4012 else old_coeff= qmul*level + qadd;
4013 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4017 assert(run2>=0 || i >= last_non_zero );
4020 for(change=-1; change<=1; change+=2){
4021 int new_level= level + change;
4022 int score, new_coeff, unquant_change;
4025 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4029 if(new_level<0) new_coeff= qmul*new_level - qadd;
4030 else new_coeff= qmul*new_level + qadd;
4031 if(new_coeff >= 2048 || new_coeff <= -2048)
4033 //FIXME check for overflow
4036 if(level < 63 && level > -63){
4037 if(i < last_non_zero)
4038 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4039 - length[UNI_AC_ENC_INDEX(run, level+64)];
4041 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4042 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4045 assert(FFABS(new_level)==1);
4047 if(analyze_gradient){
4048 int g= d1[ scantable[i] ];
4049 if(g && (g^new_level) >= 0)
4053 if(i < last_non_zero){
4054 int next_i= i + run2 + 1;
4055 int next_level= block[ perm_scantable[next_i] ] + 64;
4057 if(next_level&(~127))
4060 if(next_i < last_non_zero)
4061 score += length[UNI_AC_ENC_INDEX(run, 65)]
4062 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4063 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4065 score += length[UNI_AC_ENC_INDEX(run, 65)]
4066 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4067 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4069 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4071 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4072 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4078 assert(FFABS(level)==1);
4080 if(i < last_non_zero){
4081 int next_i= i + run2 + 1;
4082 int next_level= block[ perm_scantable[next_i] ] + 64;
4084 if(next_level&(~127))
4087 if(next_i < last_non_zero)
4088 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4089 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4090 - length[UNI_AC_ENC_INDEX(run, 65)];
4092 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4093 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4094 - length[UNI_AC_ENC_INDEX(run, 65)];
4096 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4098 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4099 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4106 unquant_change= new_coeff - old_coeff;
4107 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4109 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4111 if(score<best_score){
4114 best_change= change;
4115 best_unquant_change= unquant_change;
4119 prev_level= level + 64;
4120 if(prev_level&(~127))
4129 STOP_TIMER("iterative step")}
4133 int j= perm_scantable[ best_coeff ];
4135 block[j] += best_change;
4137 if(best_coeff > last_non_zero){
4138 last_non_zero= best_coeff;
4146 if(block[j] - best_change){
4147 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4159 for(; last_non_zero>=start_i; last_non_zero--){
4160 if(block[perm_scantable[last_non_zero]])
4166 if(256*256*256*64 % count == 0){
4167 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);
4172 for(i=start_i; i<=last_non_zero; i++){
4173 int j= perm_scantable[i];
4174 const int level= block[j];
4177 run_tab[rle_index++]=run;
4184 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4190 if(last_non_zero>0){
4191 STOP_TIMER("iterative search")
4196 return last_non_zero;
4200 * Permute an 8x8 block according to permuatation.
4201 * @param block the block which will be permuted according to
4202 * the given permutation vector
4203 * @param permutation the permutation vector
4204 * @param last the last non zero coefficient in scantable order, used to
4205 * speed the permutation up
4206 * @param scantable the used scantable, this is only used to speed the
4207 * permutation up, the block is not (inverse) permutated
4208 * to scantable order!
4210 static void block_permute(int16_t *block, uint8_t *permutation,
4211 const uint8_t *scantable, int last)
4218 //FIXME it is ok but not clean and might fail for some permutations
4219 // if (permutation[1] == 1)
4222 for (i = 0; i <= last; i++) {
4223 const int j = scantable[i];
4228 for (i = 0; i <= last; i++) {
4229 const int j = scantable[i];
4230 const int perm_j = permutation[j];
4231 block[perm_j] = temp[j];
4235 int ff_dct_quantize_c(MpegEncContext *s,
4236 int16_t *block, int n,
4237 int qscale, int *overflow)
4239 int i, j, level, last_non_zero, q, start_i;
4241 const uint8_t *scantable= s->intra_scantable.scantable;
4244 unsigned int threshold1, threshold2;
4246 s->fdsp.fdct(block);
4248 if(s->dct_error_sum)
4249 s->denoise_dct(s, block);
4259 /* For AIC we skip quant/dequant of INTRADC */
4262 /* note: block[0] is assumed to be positive */
4263 block[0] = (block[0] + (q >> 1)) / q;
4266 qmat = s->q_intra_matrix[qscale];
4267 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4271 qmat = s->q_inter_matrix[qscale];
4272 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4274 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4275 threshold2= (threshold1<<1);
4276 for(i=63;i>=start_i;i--) {
4278 level = block[j] * qmat[j];
4280 if(((unsigned)(level+threshold1))>threshold2){
4287 for(i=start_i; i<=last_non_zero; i++) {
4289 level = block[j] * qmat[j];
4291 // if( bias+level >= (1<<QMAT_SHIFT)
4292 // || bias-level >= (1<<QMAT_SHIFT)){
4293 if(((unsigned)(level+threshold1))>threshold2){
4295 level= (bias + level)>>QMAT_SHIFT;
4298 level= (bias - level)>>QMAT_SHIFT;
4306 *overflow= s->max_qcoeff < max; //overflow might have happened
4308 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4309 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4310 block_permute(block, s->idsp.idct_permutation,
4311 scantable, last_non_zero);
4313 return last_non_zero;
4316 #define OFFSET(x) offsetof(MpegEncContext, x)
4317 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4318 static const AVOption h263_options[] = {
4319 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4320 { "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},
4321 { "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 },
4326 static const AVClass h263_class = {
4327 .class_name = "H.263 encoder",
4328 .item_name = av_default_item_name,
4329 .option = h263_options,
4330 .version = LIBAVUTIL_VERSION_INT,
4333 AVCodec ff_h263_encoder = {
4335 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4336 .type = AVMEDIA_TYPE_VIDEO,
4337 .id = AV_CODEC_ID_H263,
4338 .priv_data_size = sizeof(MpegEncContext),
4339 .init = ff_mpv_encode_init,
4340 .encode2 = ff_mpv_encode_picture,
4341 .close = ff_mpv_encode_end,
4342 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4343 .priv_class = &h263_class,
4346 static const AVOption h263p_options[] = {
4347 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4348 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4349 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4350 { "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 static const AVClass h263p_class = {
4355 .class_name = "H.263p encoder",
4356 .item_name = av_default_item_name,
4357 .option = h263p_options,
4358 .version = LIBAVUTIL_VERSION_INT,
4361 AVCodec ff_h263p_encoder = {
4363 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4364 .type = AVMEDIA_TYPE_VIDEO,
4365 .id = AV_CODEC_ID_H263P,
4366 .priv_data_size = sizeof(MpegEncContext),
4367 .init = ff_mpv_encode_init,
4368 .encode2 = ff_mpv_encode_picture,
4369 .close = ff_mpv_encode_end,
4370 .capabilities = CODEC_CAP_SLICE_THREADS,
4371 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4372 .priv_class = &h263p_class,
4375 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4377 AVCodec ff_msmpeg4v2_encoder = {
4378 .name = "msmpeg4v2",
4379 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4380 .type = AVMEDIA_TYPE_VIDEO,
4381 .id = AV_CODEC_ID_MSMPEG4V2,
4382 .priv_data_size = sizeof(MpegEncContext),
4383 .init = ff_mpv_encode_init,
4384 .encode2 = ff_mpv_encode_picture,
4385 .close = ff_mpv_encode_end,
4386 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4387 .priv_class = &msmpeg4v2_class,
4390 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4392 AVCodec ff_msmpeg4v3_encoder = {
4394 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4395 .type = AVMEDIA_TYPE_VIDEO,
4396 .id = AV_CODEC_ID_MSMPEG4V3,
4397 .priv_data_size = sizeof(MpegEncContext),
4398 .init = ff_mpv_encode_init,
4399 .encode2 = ff_mpv_encode_picture,
4400 .close = ff_mpv_encode_end,
4401 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4402 .priv_class = &msmpeg4v3_class,
4405 FF_MPV_GENERIC_CLASS(wmv1)
4407 AVCodec ff_wmv1_encoder = {
4409 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4410 .type = AVMEDIA_TYPE_VIDEO,
4411 .id = AV_CODEC_ID_WMV1,
4412 .priv_data_size = sizeof(MpegEncContext),
4413 .init = ff_mpv_encode_init,
4414 .encode2 = ff_mpv_encode_picture,
4415 .close = ff_mpv_encode_end,
4416 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4417 .priv_class = &wmv1_class,