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"
46 #include "mpegutils.h"
52 #include "aandcttab.h"
54 #include "mpeg4video.h"
56 #include "bytestream.h"
59 static int encode_picture(MpegEncContext *s, int picture_number);
60 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
61 static int sse_mb(MpegEncContext *s);
62 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
63 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
65 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
66 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
68 const AVOption ff_mpv_generic_options[] = {
73 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
74 uint16_t (*qmat16)[2][64],
75 const uint16_t *quant_matrix,
76 int bias, int qmin, int qmax, int intra)
78 DSPContext *dsp = &s->dsp;
82 for (qscale = qmin; qscale <= qmax; qscale++) {
84 if (dsp->fdct == ff_jpeg_fdct_islow_8 ||
85 dsp->fdct == ff_jpeg_fdct_islow_10 ||
86 dsp->fdct == ff_faandct) {
87 for (i = 0; i < 64; i++) {
88 const int j = dsp->idct_permutation[i];
89 /* 16 <= qscale * quant_matrix[i] <= 7905
90 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
91 * 19952 <= x <= 249205026
92 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
93 * 3444240 >= (1 << 36) / (x) >= 275 */
95 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
96 (qscale * quant_matrix[j]));
98 } else if (dsp->fdct == ff_fdct_ifast) {
99 for (i = 0; i < 64; i++) {
100 const int j = dsp->idct_permutation[i];
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 + 14)) /
108 (ff_aanscales[i] * qscale *
112 for (i = 0; i < 64; i++) {
113 const int j = dsp->idct_permutation[i];
114 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
115 * Assume x = qscale * quant_matrix[i]
117 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
118 * so 32768 >= (1 << 19) / (x) >= 67 */
119 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
120 (qscale * quant_matrix[j]));
121 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
122 // (qscale * quant_matrix[i]);
123 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
124 (qscale * quant_matrix[j]);
126 if (qmat16[qscale][0][i] == 0 ||
127 qmat16[qscale][0][i] == 128 * 256)
128 qmat16[qscale][0][i] = 128 * 256 - 1;
129 qmat16[qscale][1][i] =
130 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
131 qmat16[qscale][0][i]);
135 for (i = intra; i < 64; i++) {
137 if (dsp->fdct == ff_fdct_ifast) {
138 max = (8191LL * ff_aanscales[i]) >> 14;
140 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
146 av_log(NULL, AV_LOG_INFO,
147 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
152 static inline void update_qscale(MpegEncContext *s)
154 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
155 (FF_LAMBDA_SHIFT + 7);
156 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
158 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
162 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
168 for (i = 0; i < 64; i++) {
169 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
176 * init s->current_picture.qscale_table from s->lambda_table
178 void ff_init_qscale_tab(MpegEncContext *s)
180 int8_t * const qscale_table = s->current_picture.qscale_table;
183 for (i = 0; i < s->mb_num; i++) {
184 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
185 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
186 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
191 static void update_duplicate_context_after_me(MpegEncContext *dst,
194 #define COPY(a) dst->a= src->a
196 COPY(current_picture);
202 COPY(picture_in_gop_number);
203 COPY(gop_picture_number);
204 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
205 COPY(progressive_frame); // FIXME don't set in encode_header
206 COPY(partitioned_frame); // FIXME don't set in encode_header
211 * Set the given MpegEncContext to defaults for encoding.
212 * the changed fields will not depend upon the prior state of the MpegEncContext.
214 static void MPV_encode_defaults(MpegEncContext *s)
217 ff_MPV_common_defaults(s);
219 for (i = -16; i < 16; i++) {
220 default_fcode_tab[i + MAX_MV] = 1;
222 s->me.mv_penalty = default_mv_penalty;
223 s->fcode_tab = default_fcode_tab;
225 s->input_picture_number = 0;
226 s->picture_in_gop_number = 0;
229 /* init video encoder */
230 av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
232 MpegEncContext *s = avctx->priv_data;
233 int i, ret, format_supported;
235 MPV_encode_defaults(s);
237 switch (avctx->codec_id) {
238 case AV_CODEC_ID_MPEG2VIDEO:
239 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
240 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
241 av_log(avctx, AV_LOG_ERROR,
242 "only YUV420 and YUV422 are supported\n");
246 case AV_CODEC_ID_MJPEG:
247 format_supported = 0;
248 /* JPEG color space */
249 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
250 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
251 (avctx->color_range == AVCOL_RANGE_JPEG &&
252 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
253 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
254 format_supported = 1;
255 /* MPEG color space */
256 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
257 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
258 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
259 format_supported = 1;
261 if (!format_supported) {
262 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
267 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
268 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
273 switch (avctx->pix_fmt) {
274 case AV_PIX_FMT_YUVJ422P:
275 case AV_PIX_FMT_YUV422P:
276 s->chroma_format = CHROMA_422;
278 case AV_PIX_FMT_YUVJ420P:
279 case AV_PIX_FMT_YUV420P:
281 s->chroma_format = CHROMA_420;
285 s->bit_rate = avctx->bit_rate;
286 s->width = avctx->width;
287 s->height = avctx->height;
288 if (avctx->gop_size > 600 &&
289 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
290 av_log(avctx, AV_LOG_ERROR,
291 "Warning keyframe interval too large! reducing it ...\n");
292 avctx->gop_size = 600;
294 s->gop_size = avctx->gop_size;
296 s->flags = avctx->flags;
297 s->flags2 = avctx->flags2;
298 if (avctx->max_b_frames > MAX_B_FRAMES) {
299 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
300 "is %d.\n", MAX_B_FRAMES);
302 s->max_b_frames = avctx->max_b_frames;
303 s->codec_id = avctx->codec->id;
304 s->strict_std_compliance = avctx->strict_std_compliance;
305 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
306 s->mpeg_quant = avctx->mpeg_quant;
307 s->rtp_mode = !!avctx->rtp_payload_size;
308 s->intra_dc_precision = avctx->intra_dc_precision;
309 s->user_specified_pts = AV_NOPTS_VALUE;
311 if (s->gop_size <= 1) {
318 s->me_method = avctx->me_method;
321 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
323 s->adaptive_quant = (s->avctx->lumi_masking ||
324 s->avctx->dark_masking ||
325 s->avctx->temporal_cplx_masking ||
326 s->avctx->spatial_cplx_masking ||
327 s->avctx->p_masking ||
328 s->avctx->border_masking ||
329 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
332 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
334 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
335 av_log(avctx, AV_LOG_ERROR,
336 "a vbv buffer size is needed, "
337 "for encoding with a maximum bitrate\n");
341 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
342 av_log(avctx, AV_LOG_INFO,
343 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
346 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
347 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
351 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
352 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
356 if (avctx->rc_max_rate &&
357 avctx->rc_max_rate == avctx->bit_rate &&
358 avctx->rc_max_rate != avctx->rc_min_rate) {
359 av_log(avctx, AV_LOG_INFO,
360 "impossible bitrate constraints, this will fail\n");
363 if (avctx->rc_buffer_size &&
364 avctx->bit_rate * (int64_t)avctx->time_base.num >
365 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
366 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
370 if (!s->fixed_qscale &&
371 avctx->bit_rate * av_q2d(avctx->time_base) >
372 avctx->bit_rate_tolerance) {
373 av_log(avctx, AV_LOG_ERROR,
374 "bitrate tolerance too small for bitrate\n");
378 if (s->avctx->rc_max_rate &&
379 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
380 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
381 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
382 90000LL * (avctx->rc_buffer_size - 1) >
383 s->avctx->rc_max_rate * 0xFFFFLL) {
384 av_log(avctx, AV_LOG_INFO,
385 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
386 "specified vbv buffer is too large for the given bitrate!\n");
389 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
390 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
391 s->codec_id != AV_CODEC_ID_FLV1) {
392 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
396 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
397 av_log(avctx, AV_LOG_ERROR,
398 "OBMC is only supported with simple mb decision\n");
402 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
403 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
407 if (s->max_b_frames &&
408 s->codec_id != AV_CODEC_ID_MPEG4 &&
409 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
410 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
411 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
415 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
416 s->codec_id == AV_CODEC_ID_H263 ||
417 s->codec_id == AV_CODEC_ID_H263P) &&
418 (avctx->sample_aspect_ratio.num > 255 ||
419 avctx->sample_aspect_ratio.den > 255)) {
420 av_log(avctx, AV_LOG_ERROR,
421 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
422 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
426 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
427 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
428 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
432 // FIXME mpeg2 uses that too
433 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
434 av_log(avctx, AV_LOG_ERROR,
435 "mpeg2 style quantization not supported by codec\n");
439 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
440 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
444 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
445 s->avctx->mb_decision != FF_MB_DECISION_RD) {
446 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
450 if (s->avctx->scenechange_threshold < 1000000000 &&
451 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
452 av_log(avctx, AV_LOG_ERROR,
453 "closed gop with scene change detection are not supported yet, "
454 "set threshold to 1000000000\n");
458 if (s->flags & CODEC_FLAG_LOW_DELAY) {
459 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
460 av_log(avctx, AV_LOG_ERROR,
461 "low delay forcing is only available for mpeg2\n");
464 if (s->max_b_frames != 0) {
465 av_log(avctx, AV_LOG_ERROR,
466 "b frames cannot be used with low delay\n");
471 if (s->q_scale_type == 1) {
472 if (avctx->qmax > 12) {
473 av_log(avctx, AV_LOG_ERROR,
474 "non linear quant only supports qmax <= 12 currently\n");
479 if (s->avctx->thread_count > 1 &&
480 s->codec_id != AV_CODEC_ID_MPEG4 &&
481 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
482 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
483 (s->codec_id != AV_CODEC_ID_H263P)) {
484 av_log(avctx, AV_LOG_ERROR,
485 "multi threaded encoding not supported by codec\n");
489 if (s->avctx->thread_count < 1) {
490 av_log(avctx, AV_LOG_ERROR,
491 "automatic thread number detection not supported by codec,"
496 if (s->avctx->thread_count > 1)
499 if (!avctx->time_base.den || !avctx->time_base.num) {
500 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
504 i = (INT_MAX / 2 + 128) >> 8;
505 if (avctx->mb_threshold >= i) {
506 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
511 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
512 av_log(avctx, AV_LOG_INFO,
513 "notice: b_frame_strategy only affects the first pass\n");
514 avctx->b_frame_strategy = 0;
517 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
519 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
520 avctx->time_base.den /= i;
521 avctx->time_base.num /= i;
525 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
526 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
527 // (a + x * 3 / 8) / x
528 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
529 s->inter_quant_bias = 0;
531 s->intra_quant_bias = 0;
533 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
536 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
537 s->intra_quant_bias = avctx->intra_quant_bias;
538 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
539 s->inter_quant_bias = avctx->inter_quant_bias;
541 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
542 s->avctx->time_base.den > (1 << 16) - 1) {
543 av_log(avctx, AV_LOG_ERROR,
544 "timebase %d/%d not supported by MPEG 4 standard, "
545 "the maximum admitted value for the timebase denominator "
546 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
550 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
552 switch (avctx->codec->id) {
553 case AV_CODEC_ID_MPEG1VIDEO:
554 s->out_format = FMT_MPEG1;
555 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
556 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
558 case AV_CODEC_ID_MPEG2VIDEO:
559 s->out_format = FMT_MPEG1;
560 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
561 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
564 case AV_CODEC_ID_MJPEG:
565 s->out_format = FMT_MJPEG;
566 s->intra_only = 1; /* force intra only for jpeg */
567 if (!CONFIG_MJPEG_ENCODER ||
568 ff_mjpeg_encode_init(s) < 0)
573 case AV_CODEC_ID_H261:
574 if (!CONFIG_H261_ENCODER)
576 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
577 av_log(avctx, AV_LOG_ERROR,
578 "The specified picture size of %dx%d is not valid for the "
579 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
580 s->width, s->height);
583 s->out_format = FMT_H261;
587 case AV_CODEC_ID_H263:
588 if (!CONFIG_H263_ENCODER)
590 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
591 s->width, s->height) == 8) {
592 av_log(avctx, AV_LOG_INFO,
593 "The specified picture size of %dx%d is not valid for "
594 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
595 "352x288, 704x576, and 1408x1152."
596 "Try H.263+.\n", s->width, s->height);
599 s->out_format = FMT_H263;
603 case AV_CODEC_ID_H263P:
604 s->out_format = FMT_H263;
607 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
608 s->modified_quant = s->h263_aic;
609 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
610 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
613 /* These are just to be sure */
617 case AV_CODEC_ID_FLV1:
618 s->out_format = FMT_H263;
619 s->h263_flv = 2; /* format = 1; 11-bit codes */
620 s->unrestricted_mv = 1;
621 s->rtp_mode = 0; /* don't allow GOB */
625 case AV_CODEC_ID_RV10:
626 s->out_format = FMT_H263;
630 case AV_CODEC_ID_RV20:
631 s->out_format = FMT_H263;
634 s->modified_quant = 1;
638 s->unrestricted_mv = 0;
640 case AV_CODEC_ID_MPEG4:
641 s->out_format = FMT_H263;
643 s->unrestricted_mv = 1;
644 s->low_delay = s->max_b_frames ? 0 : 1;
645 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
647 case AV_CODEC_ID_MSMPEG4V2:
648 s->out_format = FMT_H263;
650 s->unrestricted_mv = 1;
651 s->msmpeg4_version = 2;
655 case AV_CODEC_ID_MSMPEG4V3:
656 s->out_format = FMT_H263;
658 s->unrestricted_mv = 1;
659 s->msmpeg4_version = 3;
660 s->flipflop_rounding = 1;
664 case AV_CODEC_ID_WMV1:
665 s->out_format = FMT_H263;
667 s->unrestricted_mv = 1;
668 s->msmpeg4_version = 4;
669 s->flipflop_rounding = 1;
673 case AV_CODEC_ID_WMV2:
674 s->out_format = FMT_H263;
676 s->unrestricted_mv = 1;
677 s->msmpeg4_version = 5;
678 s->flipflop_rounding = 1;
686 avctx->has_b_frames = !s->low_delay;
690 s->progressive_frame =
691 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
692 CODEC_FLAG_INTERLACED_ME) ||
696 if (ff_MPV_common_init(s) < 0)
700 ff_MPV_encode_init_x86(s);
702 ff_qpeldsp_init(&s->qdsp);
704 s->avctx->coded_frame = s->current_picture.f;
706 if (s->msmpeg4_version) {
707 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
708 2 * 2 * (MAX_LEVEL + 1) *
709 (MAX_RUN + 1) * 2 * sizeof(int), fail);
711 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
713 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
714 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
715 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
716 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
717 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
718 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
719 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
720 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
722 if (s->avctx->noise_reduction) {
723 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
724 2 * 64 * sizeof(uint16_t), fail);
727 if (CONFIG_H263_ENCODER)
728 ff_h263dsp_init(&s->h263dsp);
729 if (!s->dct_quantize)
730 s->dct_quantize = ff_dct_quantize_c;
732 s->denoise_dct = denoise_dct_c;
733 s->fast_dct_quantize = s->dct_quantize;
735 s->dct_quantize = dct_quantize_trellis_c;
737 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
738 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
740 s->quant_precision = 5;
742 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
743 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
745 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
746 ff_h261_encode_init(s);
747 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
748 ff_h263_encode_init(s);
749 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
750 ff_msmpeg4_encode_init(s);
751 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
752 && s->out_format == FMT_MPEG1)
753 ff_mpeg1_encode_init(s);
756 for (i = 0; i < 64; i++) {
757 int j = s->dsp.idct_permutation[i];
758 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
760 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
761 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
762 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
764 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
767 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
768 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
770 if (s->avctx->intra_matrix)
771 s->intra_matrix[j] = s->avctx->intra_matrix[i];
772 if (s->avctx->inter_matrix)
773 s->inter_matrix[j] = s->avctx->inter_matrix[i];
776 /* precompute matrix */
777 /* for mjpeg, we do include qscale in the matrix */
778 if (s->out_format != FMT_MJPEG) {
779 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
780 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
782 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
783 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
787 if (ff_rate_control_init(s) < 0)
790 #if FF_API_ERROR_RATE
791 FF_DISABLE_DEPRECATION_WARNINGS
792 if (avctx->error_rate)
793 s->error_rate = avctx->error_rate;
794 FF_ENABLE_DEPRECATION_WARNINGS;
797 #if FF_API_NORMALIZE_AQP
798 FF_DISABLE_DEPRECATION_WARNINGS
799 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
800 s->mpv_flags |= FF_MPV_FLAG_NAQ;
801 FF_ENABLE_DEPRECATION_WARNINGS;
805 FF_DISABLE_DEPRECATION_WARNINGS
806 if (avctx->flags & CODEC_FLAG_MV0)
807 s->mpv_flags |= FF_MPV_FLAG_MV0;
808 FF_ENABLE_DEPRECATION_WARNINGS
811 if (avctx->b_frame_strategy == 2) {
812 for (i = 0; i < s->max_b_frames + 2; i++) {
813 s->tmp_frames[i] = av_frame_alloc();
814 if (!s->tmp_frames[i])
815 return AVERROR(ENOMEM);
817 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
818 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
819 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
821 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
829 ff_MPV_encode_end(avctx);
830 return AVERROR_UNKNOWN;
833 av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
835 MpegEncContext *s = avctx->priv_data;
838 ff_rate_control_uninit(s);
840 ff_MPV_common_end(s);
841 if (CONFIG_MJPEG_ENCODER &&
842 s->out_format == FMT_MJPEG)
843 ff_mjpeg_encode_close(s);
845 av_freep(&avctx->extradata);
847 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
848 av_frame_free(&s->tmp_frames[i]);
850 ff_free_picture_tables(&s->new_picture);
851 ff_mpeg_unref_picture(s, &s->new_picture);
853 av_freep(&s->avctx->stats_out);
854 av_freep(&s->ac_stats);
856 av_freep(&s->q_intra_matrix);
857 av_freep(&s->q_inter_matrix);
858 av_freep(&s->q_intra_matrix16);
859 av_freep(&s->q_inter_matrix16);
860 av_freep(&s->input_picture);
861 av_freep(&s->reordered_input_picture);
862 av_freep(&s->dct_offset);
867 static int get_sae(uint8_t *src, int ref, int stride)
872 for (y = 0; y < 16; y++) {
873 for (x = 0; x < 16; x++) {
874 acc += FFABS(src[x + y * stride] - ref);
881 static int get_intra_count(MpegEncContext *s, uint8_t *src,
882 uint8_t *ref, int stride)
890 for (y = 0; y < h; y += 16) {
891 for (x = 0; x < w; x += 16) {
892 int offset = x + y * stride;
893 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
895 int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
896 int sae = get_sae(src + offset, mean, stride);
898 acc += sae + 500 < sad;
905 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
909 int i, display_picture_number = 0, ret;
910 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
911 (s->low_delay ? 0 : 1);
916 display_picture_number = s->input_picture_number++;
918 if (pts != AV_NOPTS_VALUE) {
919 if (s->user_specified_pts != AV_NOPTS_VALUE) {
921 int64_t last = s->user_specified_pts;
924 av_log(s->avctx, AV_LOG_ERROR,
925 "Error, Invalid timestamp=%"PRId64", "
926 "last=%"PRId64"\n", pts, s->user_specified_pts);
930 if (!s->low_delay && display_picture_number == 1)
931 s->dts_delta = time - last;
933 s->user_specified_pts = pts;
935 if (s->user_specified_pts != AV_NOPTS_VALUE) {
936 s->user_specified_pts =
937 pts = s->user_specified_pts + 1;
938 av_log(s->avctx, AV_LOG_INFO,
939 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
942 pts = display_picture_number;
948 if (!pic_arg->buf[0]);
950 if (pic_arg->linesize[0] != s->linesize)
952 if (pic_arg->linesize[1] != s->uvlinesize)
954 if (pic_arg->linesize[2] != s->uvlinesize)
957 av_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
958 pic_arg->linesize[1], s->linesize, s->uvlinesize);
961 i = ff_find_unused_picture(s, 1);
965 pic = &s->picture[i];
968 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
970 if (ff_alloc_picture(s, pic, 1) < 0) {
974 i = ff_find_unused_picture(s, 0);
978 pic = &s->picture[i];
981 if (ff_alloc_picture(s, pic, 0) < 0) {
985 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
986 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
987 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
990 int h_chroma_shift, v_chroma_shift;
991 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
995 for (i = 0; i < 3; i++) {
996 int src_stride = pic_arg->linesize[i];
997 int dst_stride = i ? s->uvlinesize : s->linesize;
998 int h_shift = i ? h_chroma_shift : 0;
999 int v_shift = i ? v_chroma_shift : 0;
1000 int w = s->width >> h_shift;
1001 int h = s->height >> v_shift;
1002 uint8_t *src = pic_arg->data[i];
1003 uint8_t *dst = pic->f->data[i];
1005 if (!s->avctx->rc_buffer_size)
1006 dst += INPLACE_OFFSET;
1008 if (src_stride == dst_stride)
1009 memcpy(dst, src, src_stride * h);
1012 memcpy(dst, src, w);
1020 ret = av_frame_copy_props(pic->f, pic_arg);
1024 pic->f->display_picture_number = display_picture_number;
1025 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1028 /* shift buffer entries */
1029 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1030 s->input_picture[i - 1] = s->input_picture[i];
1032 s->input_picture[encoding_delay] = (Picture*) pic;
1037 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1041 int64_t score64 = 0;
1043 for (plane = 0; plane < 3; plane++) {
1044 const int stride = p->f->linesize[plane];
1045 const int bw = plane ? 1 : 2;
1046 for (y = 0; y < s->mb_height * bw; y++) {
1047 for (x = 0; x < s->mb_width * bw; x++) {
1048 int off = p->shared ? 0 : 16;
1049 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1050 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1051 int v = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1053 switch (s->avctx->frame_skip_exp) {
1054 case 0: score = FFMAX(score, v); break;
1055 case 1: score += FFABS(v); break;
1056 case 2: score += v * v; break;
1057 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1058 case 4: score64 += v * v * (int64_t)(v * v); break;
1067 if (score64 < s->avctx->frame_skip_threshold)
1069 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1074 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1076 AVPacket pkt = { 0 };
1077 int ret, got_output;
1079 av_init_packet(&pkt);
1080 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1085 av_free_packet(&pkt);
1089 static int estimate_best_b_count(MpegEncContext *s)
1091 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1092 AVCodecContext *c = avcodec_alloc_context3(NULL);
1093 const int scale = s->avctx->brd_scale;
1094 int i, j, out_size, p_lambda, b_lambda, lambda2;
1095 int64_t best_rd = INT64_MAX;
1096 int best_b_count = -1;
1098 assert(scale >= 0 && scale <= 3);
1101 //s->next_picture_ptr->quality;
1102 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1103 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1104 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1105 if (!b_lambda) // FIXME we should do this somewhere else
1106 b_lambda = p_lambda;
1107 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1110 c->width = s->width >> scale;
1111 c->height = s->height >> scale;
1112 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1113 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1114 c->mb_decision = s->avctx->mb_decision;
1115 c->me_cmp = s->avctx->me_cmp;
1116 c->mb_cmp = s->avctx->mb_cmp;
1117 c->me_sub_cmp = s->avctx->me_sub_cmp;
1118 c->pix_fmt = AV_PIX_FMT_YUV420P;
1119 c->time_base = s->avctx->time_base;
1120 c->max_b_frames = s->max_b_frames;
1122 if (avcodec_open2(c, codec, NULL) < 0)
1125 for (i = 0; i < s->max_b_frames + 2; i++) {
1126 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1127 s->next_picture_ptr;
1129 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1130 pre_input = *pre_input_ptr;
1132 if (!pre_input.shared && i) {
1133 pre_input.f->data[0] += INPLACE_OFFSET;
1134 pre_input.f->data[1] += INPLACE_OFFSET;
1135 pre_input.f->data[2] += INPLACE_OFFSET;
1138 s->dsp.shrink[scale](s->tmp_frames[i]->data[0], s->tmp_frames[i]->linesize[0],
1139 pre_input.f->data[0], pre_input.f->linesize[0],
1140 c->width, c->height);
1141 s->dsp.shrink[scale](s->tmp_frames[i]->data[1], s->tmp_frames[i]->linesize[1],
1142 pre_input.f->data[1], pre_input.f->linesize[1],
1143 c->width >> 1, c->height >> 1);
1144 s->dsp.shrink[scale](s->tmp_frames[i]->data[2], s->tmp_frames[i]->linesize[2],
1145 pre_input.f->data[2], pre_input.f->linesize[2],
1146 c->width >> 1, c->height >> 1);
1150 for (j = 0; j < s->max_b_frames + 1; j++) {
1153 if (!s->input_picture[j])
1156 c->error[0] = c->error[1] = c->error[2] = 0;
1158 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1159 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1161 out_size = encode_frame(c, s->tmp_frames[0]);
1163 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1165 for (i = 0; i < s->max_b_frames + 1; i++) {
1166 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1168 s->tmp_frames[i + 1]->pict_type = is_p ?
1169 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1170 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1172 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1174 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1177 /* get the delayed frames */
1179 out_size = encode_frame(c, NULL);
1180 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1183 rd += c->error[0] + c->error[1] + c->error[2];
1194 return best_b_count;
1197 static int select_input_picture(MpegEncContext *s)
1201 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1202 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1203 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1205 /* set next picture type & ordering */
1206 if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1207 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1208 s->next_picture_ptr == NULL || s->intra_only) {
1209 s->reordered_input_picture[0] = s->input_picture[0];
1210 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1211 s->reordered_input_picture[0]->f->coded_picture_number =
1212 s->coded_picture_number++;
1216 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1217 if (s->picture_in_gop_number < s->gop_size &&
1218 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1219 // FIXME check that te gop check above is +-1 correct
1220 av_frame_unref(s->input_picture[0]->f);
1223 ff_vbv_update(s, 0);
1229 if (s->flags & CODEC_FLAG_PASS2) {
1230 for (i = 0; i < s->max_b_frames + 1; i++) {
1231 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1233 if (pict_num >= s->rc_context.num_entries)
1235 if (!s->input_picture[i]) {
1236 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1240 s->input_picture[i]->f->pict_type =
1241 s->rc_context.entry[pict_num].new_pict_type;
1245 if (s->avctx->b_frame_strategy == 0) {
1246 b_frames = s->max_b_frames;
1247 while (b_frames && !s->input_picture[b_frames])
1249 } else if (s->avctx->b_frame_strategy == 1) {
1250 for (i = 1; i < s->max_b_frames + 1; i++) {
1251 if (s->input_picture[i] &&
1252 s->input_picture[i]->b_frame_score == 0) {
1253 s->input_picture[i]->b_frame_score =
1255 s->input_picture[i ]->f->data[0],
1256 s->input_picture[i - 1]->f->data[0],
1260 for (i = 0; i < s->max_b_frames + 1; i++) {
1261 if (s->input_picture[i] == NULL ||
1262 s->input_picture[i]->b_frame_score - 1 >
1263 s->mb_num / s->avctx->b_sensitivity)
1267 b_frames = FFMAX(0, i - 1);
1270 for (i = 0; i < b_frames + 1; i++) {
1271 s->input_picture[i]->b_frame_score = 0;
1273 } else if (s->avctx->b_frame_strategy == 2) {
1274 b_frames = estimate_best_b_count(s);
1276 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1282 for (i = b_frames - 1; i >= 0; i--) {
1283 int type = s->input_picture[i]->f->pict_type;
1284 if (type && type != AV_PICTURE_TYPE_B)
1287 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1288 b_frames == s->max_b_frames) {
1289 av_log(s->avctx, AV_LOG_ERROR,
1290 "warning, too many b frames in a row\n");
1293 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1294 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1295 s->gop_size > s->picture_in_gop_number) {
1296 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1298 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1300 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1304 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1305 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1308 s->reordered_input_picture[0] = s->input_picture[b_frames];
1309 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1310 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1311 s->reordered_input_picture[0]->f->coded_picture_number =
1312 s->coded_picture_number++;
1313 for (i = 0; i < b_frames; i++) {
1314 s->reordered_input_picture[i + 1] = s->input_picture[i];
1315 s->reordered_input_picture[i + 1]->f->pict_type =
1317 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1318 s->coded_picture_number++;
1323 if (s->reordered_input_picture[0]) {
1324 s->reordered_input_picture[0]->reference =
1325 s->reordered_input_picture[0]->f->pict_type !=
1326 AV_PICTURE_TYPE_B ? 3 : 0;
1328 ff_mpeg_unref_picture(s, &s->new_picture);
1329 if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1332 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1333 // input is a shared pix, so we can't modifiy it -> alloc a new
1334 // one & ensure that the shared one is reuseable
1337 int i = ff_find_unused_picture(s, 0);
1340 pic = &s->picture[i];
1342 pic->reference = s->reordered_input_picture[0]->reference;
1343 if (ff_alloc_picture(s, pic, 0) < 0) {
1347 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1351 /* mark us unused / free shared pic */
1352 av_frame_unref(s->reordered_input_picture[0]->f);
1353 s->reordered_input_picture[0]->shared = 0;
1355 s->current_picture_ptr = pic;
1357 // input is not a shared pix -> reuse buffer for current_pix
1358 s->current_picture_ptr = s->reordered_input_picture[0];
1359 for (i = 0; i < 4; i++) {
1360 s->new_picture.f->data[i] += INPLACE_OFFSET;
1363 ff_mpeg_unref_picture(s, &s->current_picture);
1364 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1365 s->current_picture_ptr)) < 0)
1368 s->picture_number = s->new_picture.f->display_picture_number;
1370 ff_mpeg_unref_picture(s, &s->new_picture);
1375 static void frame_end(MpegEncContext *s)
1379 if (s->unrestricted_mv &&
1380 s->current_picture.reference &&
1382 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1383 int hshift = desc->log2_chroma_w;
1384 int vshift = desc->log2_chroma_h;
1385 s->dsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1386 s->h_edge_pos, s->v_edge_pos,
1387 EDGE_WIDTH, EDGE_WIDTH,
1388 EDGE_TOP | EDGE_BOTTOM);
1389 s->dsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1390 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1391 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1392 EDGE_TOP | EDGE_BOTTOM);
1393 s->dsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1394 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1395 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1396 EDGE_TOP | EDGE_BOTTOM);
1401 s->last_pict_type = s->pict_type;
1402 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1403 if (s->pict_type!= AV_PICTURE_TYPE_B)
1404 s->last_non_b_pict_type = s->pict_type;
1407 /* release non-reference frames */
1408 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1409 if (!s->picture[i].reference)
1410 ff_mpeg_unref_picture(s, &s->picture[i]);
1414 s->avctx->coded_frame = s->current_picture_ptr->f;
1418 static void update_noise_reduction(MpegEncContext *s)
1422 for (intra = 0; intra < 2; intra++) {
1423 if (s->dct_count[intra] > (1 << 16)) {
1424 for (i = 0; i < 64; i++) {
1425 s->dct_error_sum[intra][i] >>= 1;
1427 s->dct_count[intra] >>= 1;
1430 for (i = 0; i < 64; i++) {
1431 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1432 s->dct_count[intra] +
1433 s->dct_error_sum[intra][i] / 2) /
1434 (s->dct_error_sum[intra][i] + 1);
1439 static int frame_start(MpegEncContext *s)
1443 /* mark & release old frames */
1444 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1445 s->last_picture_ptr != s->next_picture_ptr &&
1446 s->last_picture_ptr->f->buf[0]) {
1447 ff_mpeg_unref_picture(s, s->last_picture_ptr);
1450 s->current_picture_ptr->f->pict_type = s->pict_type;
1451 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1453 ff_mpeg_unref_picture(s, &s->current_picture);
1454 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1455 s->current_picture_ptr)) < 0)
1458 if (s->pict_type != AV_PICTURE_TYPE_B) {
1459 s->last_picture_ptr = s->next_picture_ptr;
1461 s->next_picture_ptr = s->current_picture_ptr;
1464 if (s->last_picture_ptr) {
1465 ff_mpeg_unref_picture(s, &s->last_picture);
1466 if (s->last_picture_ptr->f->buf[0] &&
1467 (ret = ff_mpeg_ref_picture(s, &s->last_picture,
1468 s->last_picture_ptr)) < 0)
1471 if (s->next_picture_ptr) {
1472 ff_mpeg_unref_picture(s, &s->next_picture);
1473 if (s->next_picture_ptr->f->buf[0] &&
1474 (ret = ff_mpeg_ref_picture(s, &s->next_picture,
1475 s->next_picture_ptr)) < 0)
1479 if (s->picture_structure!= PICT_FRAME) {
1481 for (i = 0; i < 4; i++) {
1482 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1483 s->current_picture.f->data[i] +=
1484 s->current_picture.f->linesize[i];
1486 s->current_picture.f->linesize[i] *= 2;
1487 s->last_picture.f->linesize[i] *= 2;
1488 s->next_picture.f->linesize[i] *= 2;
1492 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1493 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1494 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1495 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1496 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1497 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1499 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1500 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1503 if (s->dct_error_sum) {
1504 assert(s->avctx->noise_reduction && s->encoding);
1505 update_noise_reduction(s);
1511 int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1512 const AVFrame *pic_arg, int *got_packet)
1514 MpegEncContext *s = avctx->priv_data;
1515 int i, stuffing_count, ret;
1516 int context_count = s->slice_context_count;
1518 s->picture_in_gop_number++;
1520 if (load_input_picture(s, pic_arg) < 0)
1523 if (select_input_picture(s) < 0) {
1528 if (s->new_picture.f->data[0]) {
1530 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1533 s->mb_info_ptr = av_packet_new_side_data(pkt,
1534 AV_PKT_DATA_H263_MB_INFO,
1535 s->mb_width*s->mb_height*12);
1536 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1539 for (i = 0; i < context_count; i++) {
1540 int start_y = s->thread_context[i]->start_mb_y;
1541 int end_y = s->thread_context[i]-> end_mb_y;
1542 int h = s->mb_height;
1543 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1544 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1546 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1549 s->pict_type = s->new_picture.f->pict_type;
1551 ret = frame_start(s);
1555 if (encode_picture(s, s->picture_number) < 0)
1558 avctx->header_bits = s->header_bits;
1559 avctx->mv_bits = s->mv_bits;
1560 avctx->misc_bits = s->misc_bits;
1561 avctx->i_tex_bits = s->i_tex_bits;
1562 avctx->p_tex_bits = s->p_tex_bits;
1563 avctx->i_count = s->i_count;
1564 // FIXME f/b_count in avctx
1565 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1566 avctx->skip_count = s->skip_count;
1570 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1571 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1573 if (avctx->rc_buffer_size) {
1574 RateControlContext *rcc = &s->rc_context;
1575 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1577 if (put_bits_count(&s->pb) > max_size &&
1578 s->lambda < s->avctx->lmax) {
1579 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1580 (s->qscale + 1) / s->qscale);
1581 if (s->adaptive_quant) {
1583 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1584 s->lambda_table[i] =
1585 FFMAX(s->lambda_table[i] + 1,
1586 s->lambda_table[i] * (s->qscale + 1) /
1589 s->mb_skipped = 0; // done in frame_start()
1590 // done in encode_picture() so we must undo it
1591 if (s->pict_type == AV_PICTURE_TYPE_P) {
1592 if (s->flipflop_rounding ||
1593 s->codec_id == AV_CODEC_ID_H263P ||
1594 s->codec_id == AV_CODEC_ID_MPEG4)
1595 s->no_rounding ^= 1;
1597 if (s->pict_type != AV_PICTURE_TYPE_B) {
1598 s->time_base = s->last_time_base;
1599 s->last_non_b_time = s->time - s->pp_time;
1601 for (i = 0; i < context_count; i++) {
1602 PutBitContext *pb = &s->thread_context[i]->pb;
1603 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1608 assert(s->avctx->rc_max_rate);
1611 if (s->flags & CODEC_FLAG_PASS1)
1612 ff_write_pass1_stats(s);
1614 for (i = 0; i < 4; i++) {
1615 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1616 avctx->error[i] += s->current_picture_ptr->f->error[i];
1619 if (s->flags & CODEC_FLAG_PASS1)
1620 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1621 avctx->i_tex_bits + avctx->p_tex_bits ==
1622 put_bits_count(&s->pb));
1623 flush_put_bits(&s->pb);
1624 s->frame_bits = put_bits_count(&s->pb);
1626 stuffing_count = ff_vbv_update(s, s->frame_bits);
1627 if (stuffing_count) {
1628 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1629 stuffing_count + 50) {
1630 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1634 switch (s->codec_id) {
1635 case AV_CODEC_ID_MPEG1VIDEO:
1636 case AV_CODEC_ID_MPEG2VIDEO:
1637 while (stuffing_count--) {
1638 put_bits(&s->pb, 8, 0);
1641 case AV_CODEC_ID_MPEG4:
1642 put_bits(&s->pb, 16, 0);
1643 put_bits(&s->pb, 16, 0x1C3);
1644 stuffing_count -= 4;
1645 while (stuffing_count--) {
1646 put_bits(&s->pb, 8, 0xFF);
1650 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1652 flush_put_bits(&s->pb);
1653 s->frame_bits = put_bits_count(&s->pb);
1656 /* update mpeg1/2 vbv_delay for CBR */
1657 if (s->avctx->rc_max_rate &&
1658 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1659 s->out_format == FMT_MPEG1 &&
1660 90000LL * (avctx->rc_buffer_size - 1) <=
1661 s->avctx->rc_max_rate * 0xFFFFLL) {
1662 int vbv_delay, min_delay;
1663 double inbits = s->avctx->rc_max_rate *
1664 av_q2d(s->avctx->time_base);
1665 int minbits = s->frame_bits - 8 *
1666 (s->vbv_delay_ptr - s->pb.buf - 1);
1667 double bits = s->rc_context.buffer_index + minbits - inbits;
1670 av_log(s->avctx, AV_LOG_ERROR,
1671 "Internal error, negative bits\n");
1673 assert(s->repeat_first_field == 0);
1675 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1676 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1677 s->avctx->rc_max_rate;
1679 vbv_delay = FFMAX(vbv_delay, min_delay);
1681 assert(vbv_delay < 0xFFFF);
1683 s->vbv_delay_ptr[0] &= 0xF8;
1684 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1685 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1686 s->vbv_delay_ptr[2] &= 0x07;
1687 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1688 avctx->vbv_delay = vbv_delay * 300;
1690 s->total_bits += s->frame_bits;
1691 avctx->frame_bits = s->frame_bits;
1693 pkt->pts = s->current_picture.f->pts;
1694 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1695 if (!s->current_picture.f->coded_picture_number)
1696 pkt->dts = pkt->pts - s->dts_delta;
1698 pkt->dts = s->reordered_pts;
1699 s->reordered_pts = pkt->pts;
1701 pkt->dts = pkt->pts;
1702 if (s->current_picture.f->key_frame)
1703 pkt->flags |= AV_PKT_FLAG_KEY;
1705 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1709 assert((s->frame_bits & 7) == 0);
1711 pkt->size = s->frame_bits / 8;
1712 *got_packet = !!pkt->size;
1716 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1717 int n, int threshold)
1719 static const char tab[64] = {
1720 3, 2, 2, 1, 1, 1, 1, 1,
1721 1, 1, 1, 1, 1, 1, 1, 1,
1722 1, 1, 1, 1, 1, 1, 1, 1,
1723 0, 0, 0, 0, 0, 0, 0, 0,
1724 0, 0, 0, 0, 0, 0, 0, 0,
1725 0, 0, 0, 0, 0, 0, 0, 0,
1726 0, 0, 0, 0, 0, 0, 0, 0,
1727 0, 0, 0, 0, 0, 0, 0, 0
1732 int16_t *block = s->block[n];
1733 const int last_index = s->block_last_index[n];
1736 if (threshold < 0) {
1738 threshold = -threshold;
1742 /* Are all we could set to zero already zero? */
1743 if (last_index <= skip_dc - 1)
1746 for (i = 0; i <= last_index; i++) {
1747 const int j = s->intra_scantable.permutated[i];
1748 const int level = FFABS(block[j]);
1750 if (skip_dc && i == 0)
1754 } else if (level > 1) {
1760 if (score >= threshold)
1762 for (i = skip_dc; i <= last_index; i++) {
1763 const int j = s->intra_scantable.permutated[i];
1767 s->block_last_index[n] = 0;
1769 s->block_last_index[n] = -1;
1772 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1776 const int maxlevel = s->max_qcoeff;
1777 const int minlevel = s->min_qcoeff;
1781 i = 1; // skip clipping of intra dc
1785 for (; i <= last_index; i++) {
1786 const int j = s->intra_scantable.permutated[i];
1787 int level = block[j];
1789 if (level > maxlevel) {
1792 } else if (level < minlevel) {
1800 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1801 av_log(s->avctx, AV_LOG_INFO,
1802 "warning, clipping %d dct coefficients to %d..%d\n",
1803 overflow, minlevel, maxlevel);
1806 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1810 for (y = 0; y < 8; y++) {
1811 for (x = 0; x < 8; x++) {
1817 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1818 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1819 int v = ptr[x2 + y2 * stride];
1825 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1830 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1831 int motion_x, int motion_y,
1832 int mb_block_height,
1835 int16_t weight[8][64];
1836 int16_t orig[8][64];
1837 const int mb_x = s->mb_x;
1838 const int mb_y = s->mb_y;
1841 int dct_offset = s->linesize * 8; // default for progressive frames
1842 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1843 ptrdiff_t wrap_y, wrap_c;
1845 for (i = 0; i < mb_block_count; i++)
1846 skip_dct[i] = s->skipdct;
1848 if (s->adaptive_quant) {
1849 const int last_qp = s->qscale;
1850 const int mb_xy = mb_x + mb_y * s->mb_stride;
1852 s->lambda = s->lambda_table[mb_xy];
1855 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1856 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1857 s->dquant = s->qscale - last_qp;
1859 if (s->out_format == FMT_H263) {
1860 s->dquant = av_clip(s->dquant, -2, 2);
1862 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1864 if (s->pict_type == AV_PICTURE_TYPE_B) {
1865 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1868 if (s->mv_type == MV_TYPE_8X8)
1874 ff_set_qscale(s, last_qp + s->dquant);
1875 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1876 ff_set_qscale(s, s->qscale + s->dquant);
1878 wrap_y = s->linesize;
1879 wrap_c = s->uvlinesize;
1880 ptr_y = s->new_picture.f->data[0] +
1881 (mb_y * 16 * wrap_y) + mb_x * 16;
1882 ptr_cb = s->new_picture.f->data[1] +
1883 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1884 ptr_cr = s->new_picture.f->data[2] +
1885 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1887 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1888 uint8_t *ebuf = s->edge_emu_buffer + 32;
1889 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1891 16, 16, mb_x * 16, mb_y * 16,
1892 s->width, s->height);
1894 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1896 8, mb_block_height, mb_x * 8, mb_y * 8,
1897 s->width >> 1, s->height >> 1);
1898 ptr_cb = ebuf + 18 * wrap_y;
1899 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1901 8, mb_block_height, mb_x * 8, mb_y * 8,
1902 s->width >> 1, s->height >> 1);
1903 ptr_cr = ebuf + 18 * wrap_y + 8;
1907 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1908 int progressive_score, interlaced_score;
1910 s->interlaced_dct = 0;
1911 progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
1913 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1914 NULL, wrap_y, 8) - 400;
1916 if (progressive_score > 0) {
1917 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
1918 NULL, wrap_y * 2, 8) +
1919 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
1920 NULL, wrap_y * 2, 8);
1921 if (progressive_score > interlaced_score) {
1922 s->interlaced_dct = 1;
1924 dct_offset = wrap_y;
1926 if (s->chroma_format == CHROMA_422)
1932 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
1933 s->dsp.get_pixels(s->block[1], ptr_y + 8 , wrap_y);
1934 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
1935 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
1937 if (s->flags & CODEC_FLAG_GRAY) {
1941 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1942 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1943 if (!s->chroma_y_shift) { /* 422 */
1944 s->dsp.get_pixels(s->block[6],
1945 ptr_cb + (dct_offset >> 1), wrap_c);
1946 s->dsp.get_pixels(s->block[7],
1947 ptr_cr + (dct_offset >> 1), wrap_c);
1951 op_pixels_func (*op_pix)[4];
1952 qpel_mc_func (*op_qpix)[16];
1953 uint8_t *dest_y, *dest_cb, *dest_cr;
1955 dest_y = s->dest[0];
1956 dest_cb = s->dest[1];
1957 dest_cr = s->dest[2];
1959 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1960 op_pix = s->hdsp.put_pixels_tab;
1961 op_qpix = s->qdsp.put_qpel_pixels_tab;
1963 op_pix = s->hdsp.put_no_rnd_pixels_tab;
1964 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
1967 if (s->mv_dir & MV_DIR_FORWARD) {
1968 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
1969 s->last_picture.f->data,
1971 op_pix = s->hdsp.avg_pixels_tab;
1972 op_qpix = s->qdsp.avg_qpel_pixels_tab;
1974 if (s->mv_dir & MV_DIR_BACKWARD) {
1975 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
1976 s->next_picture.f->data,
1980 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1981 int progressive_score, interlaced_score;
1983 s->interlaced_dct = 0;
1984 progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
1987 s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
1988 ptr_y + wrap_y * 8, wrap_y,
1991 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
1992 progressive_score -= 400;
1994 if (progressive_score > 0) {
1995 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
1998 s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
2002 if (progressive_score > interlaced_score) {
2003 s->interlaced_dct = 1;
2005 dct_offset = wrap_y;
2007 if (s->chroma_format == CHROMA_422)
2013 s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2014 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2015 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2016 dest_y + dct_offset, wrap_y);
2017 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2018 dest_y + dct_offset + 8, wrap_y);
2020 if (s->flags & CODEC_FLAG_GRAY) {
2024 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2025 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2026 if (!s->chroma_y_shift) { /* 422 */
2027 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2028 dest_cb + (dct_offset >> 1), wrap_c);
2029 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2030 dest_cr + (dct_offset >> 1), wrap_c);
2033 /* pre quantization */
2034 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2035 2 * s->qscale * s->qscale) {
2037 if (s->dsp.sad[1](NULL, ptr_y , dest_y,
2038 wrap_y, 8) < 20 * s->qscale)
2040 if (s->dsp.sad[1](NULL, ptr_y + 8,
2041 dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2043 if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
2044 dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
2046 if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
2047 dest_y + dct_offset + 8,
2048 wrap_y, 8) < 20 * s->qscale)
2050 if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
2051 wrap_c, 8) < 20 * s->qscale)
2053 if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
2054 wrap_c, 8) < 20 * s->qscale)
2056 if (!s->chroma_y_shift) { /* 422 */
2057 if (s->dsp.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2058 dest_cb + (dct_offset >> 1),
2059 wrap_c, 8) < 20 * s->qscale)
2061 if (s->dsp.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2062 dest_cr + (dct_offset >> 1),
2063 wrap_c, 8) < 20 * s->qscale)
2069 if (s->quantizer_noise_shaping) {
2071 get_visual_weight(weight[0], ptr_y , wrap_y);
2073 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2075 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2077 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2079 get_visual_weight(weight[4], ptr_cb , wrap_c);
2081 get_visual_weight(weight[5], ptr_cr , wrap_c);
2082 if (!s->chroma_y_shift) { /* 422 */
2084 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2087 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2090 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2093 /* DCT & quantize */
2094 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2096 for (i = 0; i < mb_block_count; i++) {
2099 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2100 // FIXME we could decide to change to quantizer instead of
2102 // JS: I don't think that would be a good idea it could lower
2103 // quality instead of improve it. Just INTRADC clipping
2104 // deserves changes in quantizer
2106 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2108 s->block_last_index[i] = -1;
2110 if (s->quantizer_noise_shaping) {
2111 for (i = 0; i < mb_block_count; i++) {
2113 s->block_last_index[i] =
2114 dct_quantize_refine(s, s->block[i], weight[i],
2115 orig[i], i, s->qscale);
2120 if (s->luma_elim_threshold && !s->mb_intra)
2121 for (i = 0; i < 4; i++)
2122 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2123 if (s->chroma_elim_threshold && !s->mb_intra)
2124 for (i = 4; i < mb_block_count; i++)
2125 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2127 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2128 for (i = 0; i < mb_block_count; i++) {
2129 if (s->block_last_index[i] == -1)
2130 s->coded_score[i] = INT_MAX / 256;
2135 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2136 s->block_last_index[4] =
2137 s->block_last_index[5] = 0;
2139 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2142 // non c quantize code returns incorrect block_last_index FIXME
2143 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2144 for (i = 0; i < mb_block_count; i++) {
2146 if (s->block_last_index[i] > 0) {
2147 for (j = 63; j > 0; j--) {
2148 if (s->block[i][s->intra_scantable.permutated[j]])
2151 s->block_last_index[i] = j;
2156 /* huffman encode */
2157 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2158 case AV_CODEC_ID_MPEG1VIDEO:
2159 case AV_CODEC_ID_MPEG2VIDEO:
2160 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2161 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2163 case AV_CODEC_ID_MPEG4:
2164 if (CONFIG_MPEG4_ENCODER)
2165 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2167 case AV_CODEC_ID_MSMPEG4V2:
2168 case AV_CODEC_ID_MSMPEG4V3:
2169 case AV_CODEC_ID_WMV1:
2170 if (CONFIG_MSMPEG4_ENCODER)
2171 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2173 case AV_CODEC_ID_WMV2:
2174 if (CONFIG_WMV2_ENCODER)
2175 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2177 case AV_CODEC_ID_H261:
2178 if (CONFIG_H261_ENCODER)
2179 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2181 case AV_CODEC_ID_H263:
2182 case AV_CODEC_ID_H263P:
2183 case AV_CODEC_ID_FLV1:
2184 case AV_CODEC_ID_RV10:
2185 case AV_CODEC_ID_RV20:
2186 if (CONFIG_H263_ENCODER)
2187 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2189 case AV_CODEC_ID_MJPEG:
2190 if (CONFIG_MJPEG_ENCODER)
2191 ff_mjpeg_encode_mb(s, s->block);
2198 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2200 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2201 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2204 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2207 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2210 d->mb_skip_run= s->mb_skip_run;
2212 d->last_dc[i] = s->last_dc[i];
2215 d->mv_bits= s->mv_bits;
2216 d->i_tex_bits= s->i_tex_bits;
2217 d->p_tex_bits= s->p_tex_bits;
2218 d->i_count= s->i_count;
2219 d->f_count= s->f_count;
2220 d->b_count= s->b_count;
2221 d->skip_count= s->skip_count;
2222 d->misc_bits= s->misc_bits;
2226 d->qscale= s->qscale;
2227 d->dquant= s->dquant;
2229 d->esc3_level_length= s->esc3_level_length;
2232 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2235 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2236 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2239 d->mb_skip_run= s->mb_skip_run;
2241 d->last_dc[i] = s->last_dc[i];
2244 d->mv_bits= s->mv_bits;
2245 d->i_tex_bits= s->i_tex_bits;
2246 d->p_tex_bits= s->p_tex_bits;
2247 d->i_count= s->i_count;
2248 d->f_count= s->f_count;
2249 d->b_count= s->b_count;
2250 d->skip_count= s->skip_count;
2251 d->misc_bits= s->misc_bits;
2253 d->mb_intra= s->mb_intra;
2254 d->mb_skipped= s->mb_skipped;
2255 d->mv_type= s->mv_type;
2256 d->mv_dir= s->mv_dir;
2258 if(s->data_partitioning){
2260 d->tex_pb= s->tex_pb;
2264 d->block_last_index[i]= s->block_last_index[i];
2265 d->interlaced_dct= s->interlaced_dct;
2266 d->qscale= s->qscale;
2268 d->esc3_level_length= s->esc3_level_length;
2271 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2272 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2273 int *dmin, int *next_block, int motion_x, int motion_y)
2276 uint8_t *dest_backup[3];
2278 copy_context_before_encode(s, backup, type);
2280 s->block= s->blocks[*next_block];
2281 s->pb= pb[*next_block];
2282 if(s->data_partitioning){
2283 s->pb2 = pb2 [*next_block];
2284 s->tex_pb= tex_pb[*next_block];
2288 memcpy(dest_backup, s->dest, sizeof(s->dest));
2289 s->dest[0] = s->rd_scratchpad;
2290 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2291 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2292 assert(s->linesize >= 32); //FIXME
2295 encode_mb(s, motion_x, motion_y);
2297 score= put_bits_count(&s->pb);
2298 if(s->data_partitioning){
2299 score+= put_bits_count(&s->pb2);
2300 score+= put_bits_count(&s->tex_pb);
2303 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2304 ff_MPV_decode_mb(s, s->block);
2306 score *= s->lambda2;
2307 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2311 memcpy(s->dest, dest_backup, sizeof(s->dest));
2318 copy_context_after_encode(best, s, type);
2322 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2323 uint32_t *sq = ff_square_tab + 256;
2328 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
2329 else if(w==8 && h==8)
2330 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
2334 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2343 static int sse_mb(MpegEncContext *s){
2347 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2348 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2351 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2352 return s->dsp.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)
2353 +s->dsp.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)
2354 +s->dsp.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);
2356 return s->dsp.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)
2357 +s->dsp.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)
2358 +s->dsp.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);
2361 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)
2362 +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)
2363 +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);
2366 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2367 MpegEncContext *s= *(void**)arg;
2371 s->me.dia_size= s->avctx->pre_dia_size;
2372 s->first_slice_line=1;
2373 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2374 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2375 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2377 s->first_slice_line=0;
2385 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2386 MpegEncContext *s= *(void**)arg;
2388 s->me.dia_size= s->avctx->dia_size;
2389 s->first_slice_line=1;
2390 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2391 s->mb_x=0; //for block init below
2392 ff_init_block_index(s);
2393 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2394 s->block_index[0]+=2;
2395 s->block_index[1]+=2;
2396 s->block_index[2]+=2;
2397 s->block_index[3]+=2;
2399 /* compute motion vector & mb_type and store in context */
2400 if(s->pict_type==AV_PICTURE_TYPE_B)
2401 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2403 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2405 s->first_slice_line=0;
2410 static int mb_var_thread(AVCodecContext *c, void *arg){
2411 MpegEncContext *s= *(void**)arg;
2414 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2415 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2418 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2420 int sum = s->dsp.pix_sum(pix, s->linesize);
2422 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
2424 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2425 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2426 s->me.mb_var_sum_temp += varc;
2432 static void write_slice_end(MpegEncContext *s){
2433 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2434 if(s->partitioned_frame){
2435 ff_mpeg4_merge_partitions(s);
2438 ff_mpeg4_stuffing(&s->pb);
2439 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2440 ff_mjpeg_encode_stuffing(&s->pb);
2443 avpriv_align_put_bits(&s->pb);
2444 flush_put_bits(&s->pb);
2446 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2447 s->misc_bits+= get_bits_diff(s);
2450 static void write_mb_info(MpegEncContext *s)
2452 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2453 int offset = put_bits_count(&s->pb);
2454 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2455 int gobn = s->mb_y / s->gob_index;
2457 if (CONFIG_H263_ENCODER)
2458 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2459 bytestream_put_le32(&ptr, offset);
2460 bytestream_put_byte(&ptr, s->qscale);
2461 bytestream_put_byte(&ptr, gobn);
2462 bytestream_put_le16(&ptr, mba);
2463 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2464 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2465 /* 4MV not implemented */
2466 bytestream_put_byte(&ptr, 0); /* hmv2 */
2467 bytestream_put_byte(&ptr, 0); /* vmv2 */
2470 static void update_mb_info(MpegEncContext *s, int startcode)
2474 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2475 s->mb_info_size += 12;
2476 s->prev_mb_info = s->last_mb_info;
2479 s->prev_mb_info = put_bits_count(&s->pb)/8;
2480 /* This might have incremented mb_info_size above, and we return without
2481 * actually writing any info into that slot yet. But in that case,
2482 * this will be called again at the start of the after writing the
2483 * start code, actually writing the mb info. */
2487 s->last_mb_info = put_bits_count(&s->pb)/8;
2488 if (!s->mb_info_size)
2489 s->mb_info_size += 12;
2493 static int encode_thread(AVCodecContext *c, void *arg){
2494 MpegEncContext *s= *(void**)arg;
2495 int mb_x, mb_y, pdif = 0;
2496 int chr_h= 16>>s->chroma_y_shift;
2498 MpegEncContext best_s, backup_s;
2499 uint8_t bit_buf[2][MAX_MB_BYTES];
2500 uint8_t bit_buf2[2][MAX_MB_BYTES];
2501 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2502 PutBitContext pb[2], pb2[2], tex_pb[2];
2505 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2506 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2507 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2510 s->last_bits= put_bits_count(&s->pb);
2521 /* init last dc values */
2522 /* note: quant matrix value (8) is implied here */
2523 s->last_dc[i] = 128 << s->intra_dc_precision;
2525 s->current_picture.f->error[i] = 0;
2528 memset(s->last_mv, 0, sizeof(s->last_mv));
2532 switch(s->codec_id){
2533 case AV_CODEC_ID_H263:
2534 case AV_CODEC_ID_H263P:
2535 case AV_CODEC_ID_FLV1:
2536 if (CONFIG_H263_ENCODER)
2537 s->gob_index = ff_h263_get_gob_height(s);
2539 case AV_CODEC_ID_MPEG4:
2540 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2541 ff_mpeg4_init_partitions(s);
2547 s->first_slice_line = 1;
2548 s->ptr_lastgob = s->pb.buf;
2549 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2553 ff_set_qscale(s, s->qscale);
2554 ff_init_block_index(s);
2556 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2557 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2558 int mb_type= s->mb_type[xy];
2563 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2564 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2567 if(s->data_partitioning){
2568 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2569 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2570 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2576 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2577 ff_update_block_index(s);
2579 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2580 ff_h261_reorder_mb_index(s);
2581 xy= s->mb_y*s->mb_stride + s->mb_x;
2582 mb_type= s->mb_type[xy];
2585 /* write gob / video packet header */
2587 int current_packet_size, is_gob_start;
2589 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2591 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2593 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2595 switch(s->codec_id){
2596 case AV_CODEC_ID_H263:
2597 case AV_CODEC_ID_H263P:
2598 if(!s->h263_slice_structured)
2599 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2601 case AV_CODEC_ID_MPEG2VIDEO:
2602 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2603 case AV_CODEC_ID_MPEG1VIDEO:
2604 if(s->mb_skip_run) is_gob_start=0;
2609 if(s->start_mb_y != mb_y || mb_x!=0){
2612 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2613 ff_mpeg4_init_partitions(s);
2617 assert((put_bits_count(&s->pb)&7) == 0);
2618 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2620 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2621 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2622 int d = 100 / s->error_rate;
2624 current_packet_size=0;
2625 s->pb.buf_ptr= s->ptr_lastgob;
2626 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2630 if (s->avctx->rtp_callback){
2631 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2632 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2634 update_mb_info(s, 1);
2636 switch(s->codec_id){
2637 case AV_CODEC_ID_MPEG4:
2638 if (CONFIG_MPEG4_ENCODER) {
2639 ff_mpeg4_encode_video_packet_header(s);
2640 ff_mpeg4_clean_buffers(s);
2643 case AV_CODEC_ID_MPEG1VIDEO:
2644 case AV_CODEC_ID_MPEG2VIDEO:
2645 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2646 ff_mpeg1_encode_slice_header(s);
2647 ff_mpeg1_clean_buffers(s);
2650 case AV_CODEC_ID_H263:
2651 case AV_CODEC_ID_H263P:
2652 if (CONFIG_H263_ENCODER)
2653 ff_h263_encode_gob_header(s, mb_y);
2657 if(s->flags&CODEC_FLAG_PASS1){
2658 int bits= put_bits_count(&s->pb);
2659 s->misc_bits+= bits - s->last_bits;
2663 s->ptr_lastgob += current_packet_size;
2664 s->first_slice_line=1;
2665 s->resync_mb_x=mb_x;
2666 s->resync_mb_y=mb_y;
2670 if( (s->resync_mb_x == s->mb_x)
2671 && s->resync_mb_y+1 == s->mb_y){
2672 s->first_slice_line=0;
2676 s->dquant=0; //only for QP_RD
2678 update_mb_info(s, 0);
2680 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
2682 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2684 copy_context_before_encode(&backup_s, s, -1);
2686 best_s.data_partitioning= s->data_partitioning;
2687 best_s.partitioned_frame= s->partitioned_frame;
2688 if(s->data_partitioning){
2689 backup_s.pb2= s->pb2;
2690 backup_s.tex_pb= s->tex_pb;
2693 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2694 s->mv_dir = MV_DIR_FORWARD;
2695 s->mv_type = MV_TYPE_16X16;
2697 s->mv[0][0][0] = s->p_mv_table[xy][0];
2698 s->mv[0][0][1] = s->p_mv_table[xy][1];
2699 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2700 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2702 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2703 s->mv_dir = MV_DIR_FORWARD;
2704 s->mv_type = MV_TYPE_FIELD;
2707 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2708 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2709 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2711 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2712 &dmin, &next_block, 0, 0);
2714 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2715 s->mv_dir = MV_DIR_FORWARD;
2716 s->mv_type = MV_TYPE_16X16;
2720 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2721 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2723 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2724 s->mv_dir = MV_DIR_FORWARD;
2725 s->mv_type = MV_TYPE_8X8;
2728 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2729 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2731 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2732 &dmin, &next_block, 0, 0);
2734 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2735 s->mv_dir = MV_DIR_FORWARD;
2736 s->mv_type = MV_TYPE_16X16;
2738 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2739 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2740 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2741 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2743 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2744 s->mv_dir = MV_DIR_BACKWARD;
2745 s->mv_type = MV_TYPE_16X16;
2747 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2748 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2749 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2750 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2752 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2753 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2754 s->mv_type = MV_TYPE_16X16;
2756 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2757 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2758 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2759 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2760 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2761 &dmin, &next_block, 0, 0);
2763 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2764 s->mv_dir = MV_DIR_FORWARD;
2765 s->mv_type = MV_TYPE_FIELD;
2768 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2769 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2770 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2772 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2773 &dmin, &next_block, 0, 0);
2775 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2776 s->mv_dir = MV_DIR_BACKWARD;
2777 s->mv_type = MV_TYPE_FIELD;
2780 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2781 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2782 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2784 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2785 &dmin, &next_block, 0, 0);
2787 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2788 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2789 s->mv_type = MV_TYPE_FIELD;
2791 for(dir=0; dir<2; dir++){
2793 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2794 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2795 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2798 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2799 &dmin, &next_block, 0, 0);
2801 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2803 s->mv_type = MV_TYPE_16X16;
2807 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2808 &dmin, &next_block, 0, 0);
2809 if(s->h263_pred || s->h263_aic){
2811 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2813 ff_clean_intra_table_entries(s); //old mode?
2817 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2818 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2819 const int last_qp= backup_s.qscale;
2822 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2823 static const int dquant_tab[4]={-1,1,-2,2};
2825 assert(backup_s.dquant == 0);
2828 s->mv_dir= best_s.mv_dir;
2829 s->mv_type = MV_TYPE_16X16;
2830 s->mb_intra= best_s.mb_intra;
2831 s->mv[0][0][0] = best_s.mv[0][0][0];
2832 s->mv[0][0][1] = best_s.mv[0][0][1];
2833 s->mv[1][0][0] = best_s.mv[1][0][0];
2834 s->mv[1][0][1] = best_s.mv[1][0][1];
2836 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2837 for(; qpi<4; qpi++){
2838 int dquant= dquant_tab[qpi];
2839 qp= last_qp + dquant;
2840 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2842 backup_s.dquant= dquant;
2843 if(s->mb_intra && s->dc_val[0]){
2845 dc[i]= s->dc_val[0][ s->block_index[i] ];
2846 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2850 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2851 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2852 if(best_s.qscale != qp){
2853 if(s->mb_intra && s->dc_val[0]){
2855 s->dc_val[0][ s->block_index[i] ]= dc[i];
2856 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2863 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2864 int mx= s->b_direct_mv_table[xy][0];
2865 int my= s->b_direct_mv_table[xy][1];
2867 backup_s.dquant = 0;
2868 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2870 ff_mpeg4_set_direct_mv(s, mx, my);
2871 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2872 &dmin, &next_block, mx, my);
2874 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2875 backup_s.dquant = 0;
2876 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2878 ff_mpeg4_set_direct_mv(s, 0, 0);
2879 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2880 &dmin, &next_block, 0, 0);
2882 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2885 coded |= s->block_last_index[i];
2888 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2889 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2890 mx=my=0; //FIXME find the one we actually used
2891 ff_mpeg4_set_direct_mv(s, mx, my);
2892 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2900 s->mv_dir= best_s.mv_dir;
2901 s->mv_type = best_s.mv_type;
2903 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2904 s->mv[0][0][1] = best_s.mv[0][0][1];
2905 s->mv[1][0][0] = best_s.mv[1][0][0];
2906 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2909 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2910 &dmin, &next_block, mx, my);
2915 s->current_picture.qscale_table[xy] = best_s.qscale;
2917 copy_context_after_encode(s, &best_s, -1);
2919 pb_bits_count= put_bits_count(&s->pb);
2920 flush_put_bits(&s->pb);
2921 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2924 if(s->data_partitioning){
2925 pb2_bits_count= put_bits_count(&s->pb2);
2926 flush_put_bits(&s->pb2);
2927 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2928 s->pb2= backup_s.pb2;
2930 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2931 flush_put_bits(&s->tex_pb);
2932 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2933 s->tex_pb= backup_s.tex_pb;
2935 s->last_bits= put_bits_count(&s->pb);
2937 if (CONFIG_H263_ENCODER &&
2938 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2939 ff_h263_update_motion_val(s);
2941 if(next_block==0){ //FIXME 16 vs linesize16
2942 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2943 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2944 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2947 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2948 ff_MPV_decode_mb(s, s->block);
2950 int motion_x = 0, motion_y = 0;
2951 s->mv_type=MV_TYPE_16X16;
2952 // only one MB-Type possible
2955 case CANDIDATE_MB_TYPE_INTRA:
2958 motion_x= s->mv[0][0][0] = 0;
2959 motion_y= s->mv[0][0][1] = 0;
2961 case CANDIDATE_MB_TYPE_INTER:
2962 s->mv_dir = MV_DIR_FORWARD;
2964 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2965 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2967 case CANDIDATE_MB_TYPE_INTER_I:
2968 s->mv_dir = MV_DIR_FORWARD;
2969 s->mv_type = MV_TYPE_FIELD;
2972 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2973 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2974 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2977 case CANDIDATE_MB_TYPE_INTER4V:
2978 s->mv_dir = MV_DIR_FORWARD;
2979 s->mv_type = MV_TYPE_8X8;
2982 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2983 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2986 case CANDIDATE_MB_TYPE_DIRECT:
2987 if (CONFIG_MPEG4_ENCODER) {
2988 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2990 motion_x=s->b_direct_mv_table[xy][0];
2991 motion_y=s->b_direct_mv_table[xy][1];
2992 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
2995 case CANDIDATE_MB_TYPE_DIRECT0:
2996 if (CONFIG_MPEG4_ENCODER) {
2997 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2999 ff_mpeg4_set_direct_mv(s, 0, 0);
3002 case CANDIDATE_MB_TYPE_BIDIR:
3003 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3005 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3006 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3007 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3008 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3010 case CANDIDATE_MB_TYPE_BACKWARD:
3011 s->mv_dir = MV_DIR_BACKWARD;
3013 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3014 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3016 case CANDIDATE_MB_TYPE_FORWARD:
3017 s->mv_dir = MV_DIR_FORWARD;
3019 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3020 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3022 case CANDIDATE_MB_TYPE_FORWARD_I:
3023 s->mv_dir = MV_DIR_FORWARD;
3024 s->mv_type = MV_TYPE_FIELD;
3027 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3028 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3029 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3032 case CANDIDATE_MB_TYPE_BACKWARD_I:
3033 s->mv_dir = MV_DIR_BACKWARD;
3034 s->mv_type = MV_TYPE_FIELD;
3037 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3038 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3039 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3042 case CANDIDATE_MB_TYPE_BIDIR_I:
3043 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3044 s->mv_type = MV_TYPE_FIELD;
3046 for(dir=0; dir<2; dir++){
3048 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3049 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3050 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3055 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3058 encode_mb(s, motion_x, motion_y);
3060 // RAL: Update last macroblock type
3061 s->last_mv_dir = s->mv_dir;
3063 if (CONFIG_H263_ENCODER &&
3064 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3065 ff_h263_update_motion_val(s);
3067 ff_MPV_decode_mb(s, s->block);
3070 /* clean the MV table in IPS frames for direct mode in B frames */
3071 if(s->mb_intra /* && I,P,S_TYPE */){
3072 s->p_mv_table[xy][0]=0;
3073 s->p_mv_table[xy][1]=0;
3076 if(s->flags&CODEC_FLAG_PSNR){
3080 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3081 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3083 s->current_picture.f->error[0] += sse(
3084 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3085 s->dest[0], w, h, s->linesize);
3086 s->current_picture.f->error[1] += sse(
3087 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3088 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3089 s->current_picture.f->error[2] += sse(
3090 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3091 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3094 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3095 ff_h263_loop_filter(s);
3097 av_dlog(s->avctx, "MB %d %d bits\n",
3098 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3102 //not beautiful here but we must write it before flushing so it has to be here
3103 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3104 ff_msmpeg4_encode_ext_header(s);
3108 /* Send the last GOB if RTP */
3109 if (s->avctx->rtp_callback) {
3110 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3111 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3112 /* Call the RTP callback to send the last GOB */
3114 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3120 #define MERGE(field) dst->field += src->field; src->field=0
3121 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3122 MERGE(me.scene_change_score);
3123 MERGE(me.mc_mb_var_sum_temp);
3124 MERGE(me.mb_var_sum_temp);
3127 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3130 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3131 MERGE(dct_count[1]);
3140 MERGE(er.error_count);
3141 MERGE(padding_bug_score);
3142 MERGE(current_picture.f->error[0]);
3143 MERGE(current_picture.f->error[1]);
3144 MERGE(current_picture.f->error[2]);
3146 if(dst->avctx->noise_reduction){
3147 for(i=0; i<64; i++){
3148 MERGE(dct_error_sum[0][i]);
3149 MERGE(dct_error_sum[1][i]);
3153 assert(put_bits_count(&src->pb) % 8 ==0);
3154 assert(put_bits_count(&dst->pb) % 8 ==0);
3155 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3156 flush_put_bits(&dst->pb);
3159 static int estimate_qp(MpegEncContext *s, int dry_run){
3160 if (s->next_lambda){
3161 s->current_picture_ptr->f->quality =
3162 s->current_picture.f->quality = s->next_lambda;
3163 if(!dry_run) s->next_lambda= 0;
3164 } else if (!s->fixed_qscale) {
3165 s->current_picture_ptr->f->quality =
3166 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3167 if (s->current_picture.f->quality < 0)
3171 if(s->adaptive_quant){
3172 switch(s->codec_id){
3173 case AV_CODEC_ID_MPEG4:
3174 if (CONFIG_MPEG4_ENCODER)
3175 ff_clean_mpeg4_qscales(s);
3177 case AV_CODEC_ID_H263:
3178 case AV_CODEC_ID_H263P:
3179 case AV_CODEC_ID_FLV1:
3180 if (CONFIG_H263_ENCODER)
3181 ff_clean_h263_qscales(s);
3184 ff_init_qscale_tab(s);
3187 s->lambda= s->lambda_table[0];
3190 s->lambda = s->current_picture.f->quality;
3195 /* must be called before writing the header */
3196 static void set_frame_distances(MpegEncContext * s){
3197 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3198 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3200 if(s->pict_type==AV_PICTURE_TYPE_B){
3201 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3202 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3204 s->pp_time= s->time - s->last_non_b_time;
3205 s->last_non_b_time= s->time;
3206 assert(s->picture_number==0 || s->pp_time > 0);
3210 static int encode_picture(MpegEncContext *s, int picture_number)
3214 int context_count = s->slice_context_count;
3216 s->picture_number = picture_number;
3218 /* Reset the average MB variance */
3219 s->me.mb_var_sum_temp =
3220 s->me.mc_mb_var_sum_temp = 0;
3222 /* we need to initialize some time vars before we can encode b-frames */
3223 // RAL: Condition added for MPEG1VIDEO
3224 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3225 set_frame_distances(s);
3226 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3227 ff_set_mpeg4_time(s);
3229 s->me.scene_change_score=0;
3231 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3233 if(s->pict_type==AV_PICTURE_TYPE_I){
3234 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3235 else s->no_rounding=0;
3236 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3237 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3238 s->no_rounding ^= 1;
3241 if(s->flags & CODEC_FLAG_PASS2){
3242 if (estimate_qp(s,1) < 0)
3244 ff_get_2pass_fcode(s);
3245 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3246 if(s->pict_type==AV_PICTURE_TYPE_B)
3247 s->lambda= s->last_lambda_for[s->pict_type];
3249 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3253 s->mb_intra=0; //for the rate distortion & bit compare functions
3254 for(i=1; i<context_count; i++){
3255 ret = ff_update_duplicate_context(s->thread_context[i], s);
3263 /* Estimate motion for every MB */
3264 if(s->pict_type != AV_PICTURE_TYPE_I){
3265 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3266 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3267 if (s->pict_type != AV_PICTURE_TYPE_B) {
3268 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3269 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3273 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3274 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3276 for(i=0; i<s->mb_stride*s->mb_height; i++)
3277 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3279 if(!s->fixed_qscale){
3280 /* finding spatial complexity for I-frame rate control */
3281 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3284 for(i=1; i<context_count; i++){
3285 merge_context_after_me(s, s->thread_context[i]);
3287 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3288 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3291 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3292 s->pict_type= AV_PICTURE_TYPE_I;
3293 for(i=0; i<s->mb_stride*s->mb_height; i++)
3294 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3295 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3296 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3300 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3301 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3303 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3305 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3306 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3307 s->f_code= FFMAX3(s->f_code, a, b);
3310 ff_fix_long_p_mvs(s);
3311 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3312 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3316 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3317 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3322 if(s->pict_type==AV_PICTURE_TYPE_B){
3325 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3326 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3327 s->f_code = FFMAX(a, b);
3329 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3330 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3331 s->b_code = FFMAX(a, b);
3333 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3334 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3335 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3336 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3337 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3339 for(dir=0; dir<2; dir++){
3342 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3343 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3344 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3345 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3353 if (estimate_qp(s, 0) < 0)
3356 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3357 s->qscale= 3; //reduce clipping problems
3359 if (s->out_format == FMT_MJPEG) {
3360 /* for mjpeg, we do include qscale in the matrix */
3362 int j= s->dsp.idct_permutation[i];
3364 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3366 s->y_dc_scale_table=
3367 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3368 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3369 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3370 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3374 //FIXME var duplication
3375 s->current_picture_ptr->f->key_frame =
3376 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3377 s->current_picture_ptr->f->pict_type =
3378 s->current_picture.f->pict_type = s->pict_type;
3380 if (s->current_picture.f->key_frame)
3381 s->picture_in_gop_number=0;
3383 s->last_bits= put_bits_count(&s->pb);
3384 switch(s->out_format) {
3386 if (CONFIG_MJPEG_ENCODER)
3387 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3391 if (CONFIG_H261_ENCODER)
3392 ff_h261_encode_picture_header(s, picture_number);
3395 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3396 ff_wmv2_encode_picture_header(s, picture_number);
3397 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3398 ff_msmpeg4_encode_picture_header(s, picture_number);
3399 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3400 ff_mpeg4_encode_picture_header(s, picture_number);
3401 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3402 ff_rv10_encode_picture_header(s, picture_number);
3403 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3404 ff_rv20_encode_picture_header(s, picture_number);
3405 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3406 ff_flv_encode_picture_header(s, picture_number);
3407 else if (CONFIG_H263_ENCODER)
3408 ff_h263_encode_picture_header(s, picture_number);
3411 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3412 ff_mpeg1_encode_picture_header(s, picture_number);
3417 bits= put_bits_count(&s->pb);
3418 s->header_bits= bits - s->last_bits;
3420 for(i=1; i<context_count; i++){
3421 update_duplicate_context_after_me(s->thread_context[i], s);
3423 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3424 for(i=1; i<context_count; i++){
3425 merge_context_after_encode(s, s->thread_context[i]);
3431 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3432 const int intra= s->mb_intra;
3435 s->dct_count[intra]++;
3437 for(i=0; i<64; i++){
3438 int level= block[i];
3442 s->dct_error_sum[intra][i] += level;
3443 level -= s->dct_offset[intra][i];
3444 if(level<0) level=0;
3446 s->dct_error_sum[intra][i] -= level;
3447 level += s->dct_offset[intra][i];
3448 if(level>0) level=0;
3455 static int dct_quantize_trellis_c(MpegEncContext *s,
3456 int16_t *block, int n,
3457 int qscale, int *overflow){
3459 const uint8_t *scantable= s->intra_scantable.scantable;
3460 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3462 unsigned int threshold1, threshold2;
3474 int coeff_count[64];
3475 int qmul, qadd, start_i, last_non_zero, i, dc;
3476 const int esc_length= s->ac_esc_length;
3478 uint8_t * last_length;
3479 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3481 s->dsp.fdct (block);
3483 if(s->dct_error_sum)
3484 s->denoise_dct(s, block);
3486 qadd= ((qscale-1)|1)*8;
3497 /* For AIC we skip quant/dequant of INTRADC */
3502 /* note: block[0] is assumed to be positive */
3503 block[0] = (block[0] + (q >> 1)) / q;
3506 qmat = s->q_intra_matrix[qscale];
3507 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3508 bias= 1<<(QMAT_SHIFT-1);
3509 length = s->intra_ac_vlc_length;
3510 last_length= s->intra_ac_vlc_last_length;
3514 qmat = s->q_inter_matrix[qscale];
3515 length = s->inter_ac_vlc_length;
3516 last_length= s->inter_ac_vlc_last_length;
3520 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3521 threshold2= (threshold1<<1);
3523 for(i=63; i>=start_i; i--) {
3524 const int j = scantable[i];
3525 int level = block[j] * qmat[j];
3527 if(((unsigned)(level+threshold1))>threshold2){
3533 for(i=start_i; i<=last_non_zero; i++) {
3534 const int j = scantable[i];
3535 int level = block[j] * qmat[j];
3537 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3538 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3539 if(((unsigned)(level+threshold1))>threshold2){
3541 level= (bias + level)>>QMAT_SHIFT;
3543 coeff[1][i]= level-1;
3544 // coeff[2][k]= level-2;
3546 level= (bias - level)>>QMAT_SHIFT;
3547 coeff[0][i]= -level;
3548 coeff[1][i]= -level+1;
3549 // coeff[2][k]= -level+2;
3551 coeff_count[i]= FFMIN(level, 2);
3552 assert(coeff_count[i]);
3555 coeff[0][i]= (level>>31)|1;
3560 *overflow= s->max_qcoeff < max; //overflow might have happened
3562 if(last_non_zero < start_i){
3563 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3564 return last_non_zero;
3567 score_tab[start_i]= 0;
3568 survivor[0]= start_i;
3571 for(i=start_i; i<=last_non_zero; i++){
3572 int level_index, j, zero_distortion;
3573 int dct_coeff= FFABS(block[ scantable[i] ]);
3574 int best_score=256*256*256*120;
3576 if (s->dsp.fdct == ff_fdct_ifast)
3577 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3578 zero_distortion= dct_coeff*dct_coeff;
3580 for(level_index=0; level_index < coeff_count[i]; level_index++){
3582 int level= coeff[level_index][i];
3583 const int alevel= FFABS(level);
3588 if(s->out_format == FMT_H263){
3589 unquant_coeff= alevel*qmul + qadd;
3591 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3593 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3594 unquant_coeff = (unquant_coeff - 1) | 1;
3596 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3597 unquant_coeff = (unquant_coeff - 1) | 1;
3602 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3604 if((level&(~127)) == 0){
3605 for(j=survivor_count-1; j>=0; j--){
3606 int run= i - survivor[j];
3607 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3608 score += score_tab[i-run];
3610 if(score < best_score){
3613 level_tab[i+1]= level-64;
3617 if(s->out_format == FMT_H263){
3618 for(j=survivor_count-1; j>=0; j--){
3619 int run= i - survivor[j];
3620 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3621 score += score_tab[i-run];
3622 if(score < last_score){
3625 last_level= level-64;
3631 distortion += esc_length*lambda;
3632 for(j=survivor_count-1; j>=0; j--){
3633 int run= i - survivor[j];
3634 int score= distortion + score_tab[i-run];
3636 if(score < best_score){
3639 level_tab[i+1]= level-64;
3643 if(s->out_format == FMT_H263){
3644 for(j=survivor_count-1; j>=0; j--){
3645 int run= i - survivor[j];
3646 int score= distortion + score_tab[i-run];
3647 if(score < last_score){
3650 last_level= level-64;
3658 score_tab[i+1]= best_score;
3660 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3661 if(last_non_zero <= 27){
3662 for(; survivor_count; survivor_count--){
3663 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3667 for(; survivor_count; survivor_count--){
3668 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3673 survivor[ survivor_count++ ]= i+1;
3676 if(s->out_format != FMT_H263){
3677 last_score= 256*256*256*120;
3678 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3679 int score= score_tab[i];
3680 if(i) score += lambda*2; //FIXME exacter?
3682 if(score < last_score){
3685 last_level= level_tab[i];
3686 last_run= run_tab[i];
3691 s->coded_score[n] = last_score;
3693 dc= FFABS(block[0]);
3694 last_non_zero= last_i - 1;
3695 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3697 if(last_non_zero < start_i)
3698 return last_non_zero;
3700 if(last_non_zero == 0 && start_i == 0){
3702 int best_score= dc * dc;
3704 for(i=0; i<coeff_count[0]; i++){
3705 int level= coeff[i][0];
3706 int alevel= FFABS(level);
3707 int unquant_coeff, score, distortion;
3709 if(s->out_format == FMT_H263){
3710 unquant_coeff= (alevel*qmul + qadd)>>3;
3712 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3713 unquant_coeff = (unquant_coeff - 1) | 1;
3715 unquant_coeff = (unquant_coeff + 4) >> 3;
3716 unquant_coeff<<= 3 + 3;
3718 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3720 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3721 else score= distortion + esc_length*lambda;
3723 if(score < best_score){
3725 best_level= level - 64;
3728 block[0]= best_level;
3729 s->coded_score[n] = best_score - dc*dc;
3730 if(best_level == 0) return -1;
3731 else return last_non_zero;
3737 block[ perm_scantable[last_non_zero] ]= last_level;
3740 for(; i>start_i; i -= run_tab[i] + 1){
3741 block[ perm_scantable[i-1] ]= level_tab[i];
3744 return last_non_zero;
3747 //#define REFINE_STATS 1
3748 static int16_t basis[64][64];
3750 static void build_basis(uint8_t *perm){
3757 double s= 0.25*(1<<BASIS_SHIFT);
3759 int perm_index= perm[index];
3760 if(i==0) s*= sqrt(0.5);
3761 if(j==0) s*= sqrt(0.5);
3762 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)));
3769 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3770 int16_t *block, int16_t *weight, int16_t *orig,
3773 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3774 const uint8_t *scantable= s->intra_scantable.scantable;
3775 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3776 // unsigned int threshold1, threshold2;
3781 int qmul, qadd, start_i, last_non_zero, i, dc;
3783 uint8_t * last_length;
3785 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3788 static int after_last=0;
3789 static int to_zero=0;
3790 static int from_zero=0;
3793 static int messed_sign=0;
3796 if(basis[0][0] == 0)
3797 build_basis(s->dsp.idct_permutation);
3808 /* For AIC we skip quant/dequant of INTRADC */
3812 q <<= RECON_SHIFT-3;
3813 /* note: block[0] is assumed to be positive */
3815 // block[0] = (block[0] + (q >> 1)) / q;
3817 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3818 // bias= 1<<(QMAT_SHIFT-1);
3819 length = s->intra_ac_vlc_length;
3820 last_length= s->intra_ac_vlc_last_length;
3824 length = s->inter_ac_vlc_length;
3825 last_length= s->inter_ac_vlc_last_length;
3827 last_non_zero = s->block_last_index[n];
3832 dc += (1<<(RECON_SHIFT-1));
3833 for(i=0; i<64; i++){
3834 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3837 STOP_TIMER("memset rem[]")}
3840 for(i=0; i<64; i++){
3845 w= FFABS(weight[i]) + qns*one;
3846 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3849 // w=weight[i] = (63*qns + (w/2)) / w;
3855 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3861 for(i=start_i; i<=last_non_zero; i++){
3862 int j= perm_scantable[i];
3863 const int level= block[j];
3867 if(level<0) coeff= qmul*level - qadd;
3868 else coeff= qmul*level + qadd;
3869 run_tab[rle_index++]=run;
3872 s->dsp.add_8x8basis(rem, basis[j], coeff);
3878 if(last_non_zero>0){
3879 STOP_TIMER("init rem[]")
3886 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
3889 int run2, best_unquant_change=0, analyze_gradient;
3893 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3895 if(analyze_gradient){
3899 for(i=0; i<64; i++){
3902 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3905 STOP_TIMER("rem*w*w")}
3915 const int level= block[0];
3916 int change, old_coeff;
3918 assert(s->mb_intra);
3922 for(change=-1; change<=1; change+=2){
3923 int new_level= level + change;
3924 int score, new_coeff;
3926 new_coeff= q*new_level;
3927 if(new_coeff >= 2048 || new_coeff < 0)
3930 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
3931 if(score<best_score){
3934 best_change= change;
3935 best_unquant_change= new_coeff - old_coeff;
3942 run2= run_tab[rle_index++];
3946 for(i=start_i; i<64; i++){
3947 int j= perm_scantable[i];
3948 const int level= block[j];
3949 int change, old_coeff;
3951 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3955 if(level<0) old_coeff= qmul*level - qadd;
3956 else old_coeff= qmul*level + qadd;
3957 run2= run_tab[rle_index++]; //FIXME ! maybe after last
3961 assert(run2>=0 || i >= last_non_zero );
3964 for(change=-1; change<=1; change+=2){
3965 int new_level= level + change;
3966 int score, new_coeff, unquant_change;
3969 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
3973 if(new_level<0) new_coeff= qmul*new_level - qadd;
3974 else new_coeff= qmul*new_level + qadd;
3975 if(new_coeff >= 2048 || new_coeff <= -2048)
3977 //FIXME check for overflow
3980 if(level < 63 && level > -63){
3981 if(i < last_non_zero)
3982 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
3983 - length[UNI_AC_ENC_INDEX(run, level+64)];
3985 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
3986 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
3989 assert(FFABS(new_level)==1);
3991 if(analyze_gradient){
3992 int g= d1[ scantable[i] ];
3993 if(g && (g^new_level) >= 0)
3997 if(i < last_non_zero){
3998 int next_i= i + run2 + 1;
3999 int next_level= block[ perm_scantable[next_i] ] + 64;
4001 if(next_level&(~127))
4004 if(next_i < last_non_zero)
4005 score += length[UNI_AC_ENC_INDEX(run, 65)]
4006 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4007 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4009 score += length[UNI_AC_ENC_INDEX(run, 65)]
4010 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4011 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4013 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4015 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4016 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4022 assert(FFABS(level)==1);
4024 if(i < last_non_zero){
4025 int next_i= i + run2 + 1;
4026 int next_level= block[ perm_scantable[next_i] ] + 64;
4028 if(next_level&(~127))
4031 if(next_i < last_non_zero)
4032 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4033 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4034 - length[UNI_AC_ENC_INDEX(run, 65)];
4036 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4037 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4038 - length[UNI_AC_ENC_INDEX(run, 65)];
4040 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4042 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4043 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4050 unquant_change= new_coeff - old_coeff;
4051 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4053 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
4054 if(score<best_score){
4057 best_change= change;
4058 best_unquant_change= unquant_change;
4062 prev_level= level + 64;
4063 if(prev_level&(~127))
4072 STOP_TIMER("iterative step")}
4076 int j= perm_scantable[ best_coeff ];
4078 block[j] += best_change;
4080 if(best_coeff > last_non_zero){
4081 last_non_zero= best_coeff;
4089 if(block[j] - best_change){
4090 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4102 for(; last_non_zero>=start_i; last_non_zero--){
4103 if(block[perm_scantable[last_non_zero]])
4109 if(256*256*256*64 % count == 0){
4110 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);
4115 for(i=start_i; i<=last_non_zero; i++){
4116 int j= perm_scantable[i];
4117 const int level= block[j];
4120 run_tab[rle_index++]=run;
4127 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
4133 if(last_non_zero>0){
4134 STOP_TIMER("iterative search")
4139 return last_non_zero;
4142 int ff_dct_quantize_c(MpegEncContext *s,
4143 int16_t *block, int n,
4144 int qscale, int *overflow)
4146 int i, j, level, last_non_zero, q, start_i;
4148 const uint8_t *scantable= s->intra_scantable.scantable;
4151 unsigned int threshold1, threshold2;
4153 s->dsp.fdct (block);
4155 if(s->dct_error_sum)
4156 s->denoise_dct(s, block);
4166 /* For AIC we skip quant/dequant of INTRADC */
4169 /* note: block[0] is assumed to be positive */
4170 block[0] = (block[0] + (q >> 1)) / q;
4173 qmat = s->q_intra_matrix[qscale];
4174 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4178 qmat = s->q_inter_matrix[qscale];
4179 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4181 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4182 threshold2= (threshold1<<1);
4183 for(i=63;i>=start_i;i--) {
4185 level = block[j] * qmat[j];
4187 if(((unsigned)(level+threshold1))>threshold2){
4194 for(i=start_i; i<=last_non_zero; i++) {
4196 level = block[j] * qmat[j];
4198 // if( bias+level >= (1<<QMAT_SHIFT)
4199 // || bias-level >= (1<<QMAT_SHIFT)){
4200 if(((unsigned)(level+threshold1))>threshold2){
4202 level= (bias + level)>>QMAT_SHIFT;
4205 level= (bias - level)>>QMAT_SHIFT;
4213 *overflow= s->max_qcoeff < max; //overflow might have happened
4215 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4216 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4217 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4219 return last_non_zero;
4222 #define OFFSET(x) offsetof(MpegEncContext, x)
4223 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4224 static const AVOption h263_options[] = {
4225 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4226 { "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},
4227 { "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 },
4232 static const AVClass h263_class = {
4233 .class_name = "H.263 encoder",
4234 .item_name = av_default_item_name,
4235 .option = h263_options,
4236 .version = LIBAVUTIL_VERSION_INT,
4239 AVCodec ff_h263_encoder = {
4241 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4242 .type = AVMEDIA_TYPE_VIDEO,
4243 .id = AV_CODEC_ID_H263,
4244 .priv_data_size = sizeof(MpegEncContext),
4245 .init = ff_MPV_encode_init,
4246 .encode2 = ff_MPV_encode_picture,
4247 .close = ff_MPV_encode_end,
4248 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4249 .priv_class = &h263_class,
4252 static const AVOption h263p_options[] = {
4253 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4254 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4255 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4256 { "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},
4260 static const AVClass h263p_class = {
4261 .class_name = "H.263p encoder",
4262 .item_name = av_default_item_name,
4263 .option = h263p_options,
4264 .version = LIBAVUTIL_VERSION_INT,
4267 AVCodec ff_h263p_encoder = {
4269 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4270 .type = AVMEDIA_TYPE_VIDEO,
4271 .id = AV_CODEC_ID_H263P,
4272 .priv_data_size = sizeof(MpegEncContext),
4273 .init = ff_MPV_encode_init,
4274 .encode2 = ff_MPV_encode_picture,
4275 .close = ff_MPV_encode_end,
4276 .capabilities = CODEC_CAP_SLICE_THREADS,
4277 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4278 .priv_class = &h263p_class,
4281 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4283 AVCodec ff_msmpeg4v2_encoder = {
4284 .name = "msmpeg4v2",
4285 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4286 .type = AVMEDIA_TYPE_VIDEO,
4287 .id = AV_CODEC_ID_MSMPEG4V2,
4288 .priv_data_size = sizeof(MpegEncContext),
4289 .init = ff_MPV_encode_init,
4290 .encode2 = ff_MPV_encode_picture,
4291 .close = ff_MPV_encode_end,
4292 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4293 .priv_class = &msmpeg4v2_class,
4296 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4298 AVCodec ff_msmpeg4v3_encoder = {
4300 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4301 .type = AVMEDIA_TYPE_VIDEO,
4302 .id = AV_CODEC_ID_MSMPEG4V3,
4303 .priv_data_size = sizeof(MpegEncContext),
4304 .init = ff_MPV_encode_init,
4305 .encode2 = ff_MPV_encode_picture,
4306 .close = ff_MPV_encode_end,
4307 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4308 .priv_class = &msmpeg4v3_class,
4311 FF_MPV_GENERIC_CLASS(wmv1)
4313 AVCodec ff_wmv1_encoder = {
4315 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4316 .type = AVMEDIA_TYPE_VIDEO,
4317 .id = AV_CODEC_ID_WMV1,
4318 .priv_data_size = sizeof(MpegEncContext),
4319 .init = ff_MPV_encode_init,
4320 .encode2 = ff_MPV_encode_picture,
4321 .close = ff_MPV_encode_end,
4322 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4323 .priv_class = &wmv1_class,