2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of Libav.
10 * Libav is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * Libav is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "libavutil/internal.h"
33 #include "libavutil/intmath.h"
34 #include "libavutil/mathematics.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/timer.h"
42 #include "mpegvideo.h"
43 #include "mpegvideodata.h"
47 #include "mjpegenc_common.h"
49 #include "mpegutils.h"
52 #include "pixblockdsp.h"
56 #include "aandcttab.h"
58 #include "mpeg4video.h"
60 #include "bytestream.h"
65 #define QUANT_BIAS_SHIFT 8
67 #define QMAT_SHIFT_MMX 16
70 static int encode_picture(MpegEncContext *s, int picture_number);
71 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
72 static int sse_mb(MpegEncContext *s);
73 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
74 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
76 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
77 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
79 const AVOption ff_mpv_generic_options[] = {
84 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
85 uint16_t (*qmat16)[2][64],
86 const uint16_t *quant_matrix,
87 int bias, int qmin, int qmax, int intra)
89 FDCTDSPContext *fdsp = &s->fdsp;
93 for (qscale = qmin; qscale <= qmax; qscale++) {
95 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
97 fdsp->fdct == ff_faandct ||
98 #endif /* CONFIG_FAANDCT */
99 fdsp->fdct == ff_jpeg_fdct_islow_10) {
100 for (i = 0; i < 64; i++) {
101 const int j = s->idsp.idct_permutation[i];
102 int64_t den = (int64_t) qscale * quant_matrix[j];
103 /* 16 <= qscale * quant_matrix[i] <= 7905
104 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
105 * 19952 <= x <= 249205026
106 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
107 * 3444240 >= (1 << 36) / (x) >= 275 */
109 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
111 } else if (fdsp->fdct == ff_fdct_ifast) {
112 for (i = 0; i < 64; i++) {
113 const int j = s->idsp.idct_permutation[i];
114 int64_t den = ff_aanscales[i] * (int64_t) qscale * quant_matrix[j];
115 /* 16 <= qscale * quant_matrix[i] <= 7905
116 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
117 * 19952 <= x <= 249205026
118 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
119 * 3444240 >= (1 << 36) / (x) >= 275 */
121 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / den);
124 for (i = 0; i < 64; i++) {
125 const int j = s->idsp.idct_permutation[i];
126 int64_t den = (int64_t) qscale * quant_matrix[j];
127 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
128 * Assume x = qscale * quant_matrix[i]
130 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
131 * so 32768 >= (1 << 19) / (x) >= 67 */
132 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / den);
133 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
134 // (qscale * quant_matrix[i]);
135 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / den;
137 if (qmat16[qscale][0][i] == 0 ||
138 qmat16[qscale][0][i] == 128 * 256)
139 qmat16[qscale][0][i] = 128 * 256 - 1;
140 qmat16[qscale][1][i] =
141 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
142 qmat16[qscale][0][i]);
146 for (i = intra; i < 64; i++) {
148 if (fdsp->fdct == ff_fdct_ifast) {
149 max = (8191LL * ff_aanscales[i]) >> 14;
151 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
157 av_log(NULL, AV_LOG_INFO,
158 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
163 static inline void update_qscale(MpegEncContext *s)
165 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
166 (FF_LAMBDA_SHIFT + 7);
167 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
169 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
173 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
179 for (i = 0; i < 64; i++) {
180 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
187 * init s->current_picture.qscale_table from s->lambda_table
189 void ff_init_qscale_tab(MpegEncContext *s)
191 int8_t * const qscale_table = s->current_picture.qscale_table;
194 for (i = 0; i < s->mb_num; i++) {
195 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
196 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
197 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
202 static void update_duplicate_context_after_me(MpegEncContext *dst,
205 #define COPY(a) dst->a= src->a
207 COPY(current_picture);
213 COPY(picture_in_gop_number);
214 COPY(gop_picture_number);
215 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
216 COPY(progressive_frame); // FIXME don't set in encode_header
217 COPY(partitioned_frame); // FIXME don't set in encode_header
222 * Set the given MpegEncContext to defaults for encoding.
223 * the changed fields will not depend upon the prior state of the MpegEncContext.
225 static void mpv_encode_defaults(MpegEncContext *s)
228 ff_mpv_common_defaults(s);
230 for (i = -16; i < 16; i++) {
231 default_fcode_tab[i + MAX_MV] = 1;
233 s->me.mv_penalty = default_mv_penalty;
234 s->fcode_tab = default_fcode_tab;
236 s->input_picture_number = 0;
237 s->picture_in_gop_number = 0;
240 /* init video encoder */
241 av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
243 MpegEncContext *s = avctx->priv_data;
244 int i, ret, format_supported;
246 mpv_encode_defaults(s);
248 switch (avctx->codec_id) {
249 case AV_CODEC_ID_MPEG2VIDEO:
250 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
251 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
252 av_log(avctx, AV_LOG_ERROR,
253 "only YUV420 and YUV422 are supported\n");
257 case AV_CODEC_ID_MJPEG:
258 format_supported = 0;
259 /* JPEG color space */
260 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
261 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
262 (avctx->color_range == AVCOL_RANGE_JPEG &&
263 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
264 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
265 format_supported = 1;
266 /* MPEG color space */
267 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
268 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
269 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
270 format_supported = 1;
272 if (!format_supported) {
273 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
278 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
279 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
284 switch (avctx->pix_fmt) {
285 case AV_PIX_FMT_YUVJ422P:
286 case AV_PIX_FMT_YUV422P:
287 s->chroma_format = CHROMA_422;
289 case AV_PIX_FMT_YUVJ420P:
290 case AV_PIX_FMT_YUV420P:
292 s->chroma_format = CHROMA_420;
296 s->bit_rate = avctx->bit_rate;
297 s->width = avctx->width;
298 s->height = avctx->height;
299 if (avctx->gop_size > 600 &&
300 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
301 av_log(avctx, AV_LOG_ERROR,
302 "Warning keyframe interval too large! reducing it ...\n");
303 avctx->gop_size = 600;
305 s->gop_size = avctx->gop_size;
307 if (avctx->max_b_frames > MAX_B_FRAMES) {
308 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
309 "is %d.\n", MAX_B_FRAMES);
311 s->max_b_frames = avctx->max_b_frames;
312 s->codec_id = avctx->codec->id;
313 s->strict_std_compliance = avctx->strict_std_compliance;
314 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
315 s->mpeg_quant = avctx->mpeg_quant;
316 s->rtp_mode = !!avctx->rtp_payload_size;
317 s->intra_dc_precision = avctx->intra_dc_precision;
318 s->user_specified_pts = AV_NOPTS_VALUE;
320 if (s->gop_size <= 1) {
327 s->me_method = avctx->me_method;
330 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
333 FF_DISABLE_DEPRECATION_WARNINGS
334 if (avctx->border_masking != 0.0)
335 s->border_masking = avctx->border_masking;
336 FF_ENABLE_DEPRECATION_WARNINGS
339 s->adaptive_quant = (s->avctx->lumi_masking ||
340 s->avctx->dark_masking ||
341 s->avctx->temporal_cplx_masking ||
342 s->avctx->spatial_cplx_masking ||
343 s->avctx->p_masking ||
345 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
348 s->loop_filter = !!(s->avctx->flags & CODEC_FLAG_LOOP_FILTER);
350 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
351 av_log(avctx, AV_LOG_ERROR,
352 "a vbv buffer size is needed, "
353 "for encoding with a maximum bitrate\n");
357 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
358 av_log(avctx, AV_LOG_INFO,
359 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
362 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
363 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
367 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
368 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
372 if (avctx->rc_max_rate &&
373 avctx->rc_max_rate == avctx->bit_rate &&
374 avctx->rc_max_rate != avctx->rc_min_rate) {
375 av_log(avctx, AV_LOG_INFO,
376 "impossible bitrate constraints, this will fail\n");
379 if (avctx->rc_buffer_size &&
380 avctx->bit_rate * (int64_t)avctx->time_base.num >
381 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
382 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
386 if (!s->fixed_qscale &&
387 avctx->bit_rate * av_q2d(avctx->time_base) >
388 avctx->bit_rate_tolerance) {
389 av_log(avctx, AV_LOG_ERROR,
390 "bitrate tolerance too small for bitrate\n");
394 if (s->avctx->rc_max_rate &&
395 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
396 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
397 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
398 90000LL * (avctx->rc_buffer_size - 1) >
399 s->avctx->rc_max_rate * 0xFFFFLL) {
400 av_log(avctx, AV_LOG_INFO,
401 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
402 "specified vbv buffer is too large for the given bitrate!\n");
405 if ((s->avctx->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
406 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
407 s->codec_id != AV_CODEC_ID_FLV1) {
408 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
412 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
413 av_log(avctx, AV_LOG_ERROR,
414 "OBMC is only supported with simple mb decision\n");
418 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
419 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
423 if (s->max_b_frames &&
424 s->codec_id != AV_CODEC_ID_MPEG4 &&
425 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
426 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
427 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
431 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
432 s->codec_id == AV_CODEC_ID_H263 ||
433 s->codec_id == AV_CODEC_ID_H263P) &&
434 (avctx->sample_aspect_ratio.num > 255 ||
435 avctx->sample_aspect_ratio.den > 255)) {
436 av_log(avctx, AV_LOG_ERROR,
437 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
438 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
442 if ((s->avctx->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
443 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
444 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
448 // FIXME mpeg2 uses that too
449 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
450 av_log(avctx, AV_LOG_ERROR,
451 "mpeg2 style quantization not supported by codec\n");
455 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
456 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
460 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
461 s->avctx->mb_decision != FF_MB_DECISION_RD) {
462 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
466 if (s->avctx->scenechange_threshold < 1000000000 &&
467 (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)) {
468 av_log(avctx, AV_LOG_ERROR,
469 "closed gop with scene change detection are not supported yet, "
470 "set threshold to 1000000000\n");
474 if (s->avctx->flags & CODEC_FLAG_LOW_DELAY) {
475 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
476 av_log(avctx, AV_LOG_ERROR,
477 "low delay forcing is only available for mpeg2\n");
480 if (s->max_b_frames != 0) {
481 av_log(avctx, AV_LOG_ERROR,
482 "b frames cannot be used with low delay\n");
487 if (s->q_scale_type == 1) {
488 if (avctx->qmax > 12) {
489 av_log(avctx, AV_LOG_ERROR,
490 "non linear quant only supports qmax <= 12 currently\n");
495 if (s->avctx->thread_count > 1 &&
496 s->codec_id != AV_CODEC_ID_MPEG4 &&
497 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
498 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
499 (s->codec_id != AV_CODEC_ID_H263P)) {
500 av_log(avctx, AV_LOG_ERROR,
501 "multi threaded encoding not supported by codec\n");
505 if (s->avctx->thread_count < 1) {
506 av_log(avctx, AV_LOG_ERROR,
507 "automatic thread number detection not supported by codec,"
512 if (s->avctx->thread_count > 1)
515 if (!avctx->time_base.den || !avctx->time_base.num) {
516 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
520 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
521 av_log(avctx, AV_LOG_INFO,
522 "notice: b_frame_strategy only affects the first pass\n");
523 avctx->b_frame_strategy = 0;
526 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
528 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
529 avctx->time_base.den /= i;
530 avctx->time_base.num /= i;
534 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
535 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
536 // (a + x * 3 / 8) / x
537 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
538 s->inter_quant_bias = 0;
540 s->intra_quant_bias = 0;
542 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
545 #if FF_API_QUANT_BIAS
546 FF_DISABLE_DEPRECATION_WARNINGS
547 if (s->intra_quant_bias == FF_DEFAULT_QUANT_BIAS &&
548 avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
549 s->intra_quant_bias = avctx->intra_quant_bias;
550 if (s->inter_quant_bias == FF_DEFAULT_QUANT_BIAS &&
551 avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
552 s->inter_quant_bias = avctx->inter_quant_bias;
553 FF_ENABLE_DEPRECATION_WARNINGS
556 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
557 s->avctx->time_base.den > (1 << 16) - 1) {
558 av_log(avctx, AV_LOG_ERROR,
559 "timebase %d/%d not supported by MPEG 4 standard, "
560 "the maximum admitted value for the timebase denominator "
561 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
565 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
567 switch (avctx->codec->id) {
568 case AV_CODEC_ID_MPEG1VIDEO:
569 s->out_format = FMT_MPEG1;
570 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
571 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
573 case AV_CODEC_ID_MPEG2VIDEO:
574 s->out_format = FMT_MPEG1;
575 s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
576 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
579 case AV_CODEC_ID_MJPEG:
580 s->out_format = FMT_MJPEG;
581 s->intra_only = 1; /* force intra only for jpeg */
582 if (!CONFIG_MJPEG_ENCODER ||
583 ff_mjpeg_encode_init(s) < 0)
588 case AV_CODEC_ID_H261:
589 if (!CONFIG_H261_ENCODER)
591 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
592 av_log(avctx, AV_LOG_ERROR,
593 "The specified picture size of %dx%d is not valid for the "
594 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
595 s->width, s->height);
598 s->out_format = FMT_H261;
601 s->rtp_mode = 0; /* Sliced encoding not supported */
603 case AV_CODEC_ID_H263:
604 if (!CONFIG_H263_ENCODER)
606 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
607 s->width, s->height) == 8) {
608 av_log(avctx, AV_LOG_INFO,
609 "The specified picture size of %dx%d is not valid for "
610 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
611 "352x288, 704x576, and 1408x1152."
612 "Try H.263+.\n", s->width, s->height);
615 s->out_format = FMT_H263;
619 case AV_CODEC_ID_H263P:
620 s->out_format = FMT_H263;
623 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
624 s->modified_quant = s->h263_aic;
625 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
626 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
629 /* These are just to be sure */
633 case AV_CODEC_ID_FLV1:
634 s->out_format = FMT_H263;
635 s->h263_flv = 2; /* format = 1; 11-bit codes */
636 s->unrestricted_mv = 1;
637 s->rtp_mode = 0; /* don't allow GOB */
641 case AV_CODEC_ID_RV10:
642 s->out_format = FMT_H263;
646 case AV_CODEC_ID_RV20:
647 s->out_format = FMT_H263;
650 s->modified_quant = 1;
654 s->unrestricted_mv = 0;
656 case AV_CODEC_ID_MPEG4:
657 s->out_format = FMT_H263;
659 s->unrestricted_mv = 1;
660 s->low_delay = s->max_b_frames ? 0 : 1;
661 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
663 case AV_CODEC_ID_MSMPEG4V2:
664 s->out_format = FMT_H263;
666 s->unrestricted_mv = 1;
667 s->msmpeg4_version = 2;
671 case AV_CODEC_ID_MSMPEG4V3:
672 s->out_format = FMT_H263;
674 s->unrestricted_mv = 1;
675 s->msmpeg4_version = 3;
676 s->flipflop_rounding = 1;
680 case AV_CODEC_ID_WMV1:
681 s->out_format = FMT_H263;
683 s->unrestricted_mv = 1;
684 s->msmpeg4_version = 4;
685 s->flipflop_rounding = 1;
689 case AV_CODEC_ID_WMV2:
690 s->out_format = FMT_H263;
692 s->unrestricted_mv = 1;
693 s->msmpeg4_version = 5;
694 s->flipflop_rounding = 1;
702 avctx->has_b_frames = !s->low_delay;
706 s->progressive_frame =
707 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
708 CODEC_FLAG_INTERLACED_ME) ||
713 if (ff_mpv_common_init(s) < 0)
717 ff_mpv_encode_init_x86(s);
719 ff_fdctdsp_init(&s->fdsp, avctx);
720 ff_me_cmp_init(&s->mecc, avctx);
721 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
722 ff_pixblockdsp_init(&s->pdsp, avctx);
723 ff_qpeldsp_init(&s->qdsp);
725 if (s->msmpeg4_version) {
726 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
727 2 * 2 * (MAX_LEVEL + 1) *
728 (MAX_RUN + 1) * 2 * sizeof(int), fail);
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
732 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
733 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
735 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
737 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
738 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
739 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
741 if (s->avctx->noise_reduction) {
742 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
743 2 * 64 * sizeof(uint16_t), fail);
746 if (CONFIG_H263_ENCODER)
747 ff_h263dsp_init(&s->h263dsp);
748 if (!s->dct_quantize)
749 s->dct_quantize = ff_dct_quantize_c;
751 s->denoise_dct = denoise_dct_c;
752 s->fast_dct_quantize = s->dct_quantize;
754 s->dct_quantize = dct_quantize_trellis_c;
756 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
757 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
759 s->quant_precision = 5;
761 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
762 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
764 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
765 ff_h261_encode_init(s);
766 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
767 ff_h263_encode_init(s);
768 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
769 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
771 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
772 && s->out_format == FMT_MPEG1)
773 ff_mpeg1_encode_init(s);
776 for (i = 0; i < 64; i++) {
777 int j = s->idsp.idct_permutation[i];
778 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
780 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
781 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
782 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
784 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
787 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
788 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
790 if (s->avctx->intra_matrix)
791 s->intra_matrix[j] = s->avctx->intra_matrix[i];
792 if (s->avctx->inter_matrix)
793 s->inter_matrix[j] = s->avctx->inter_matrix[i];
796 /* precompute matrix */
797 /* for mjpeg, we do include qscale in the matrix */
798 if (s->out_format != FMT_MJPEG) {
799 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
800 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
802 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
803 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
807 if (ff_rate_control_init(s) < 0)
810 #if FF_API_ERROR_RATE
811 FF_DISABLE_DEPRECATION_WARNINGS
812 if (avctx->error_rate)
813 s->error_rate = avctx->error_rate;
814 FF_ENABLE_DEPRECATION_WARNINGS;
817 #if FF_API_NORMALIZE_AQP
818 FF_DISABLE_DEPRECATION_WARNINGS
819 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
820 s->mpv_flags |= FF_MPV_FLAG_NAQ;
821 FF_ENABLE_DEPRECATION_WARNINGS;
825 FF_DISABLE_DEPRECATION_WARNINGS
826 if (avctx->flags & CODEC_FLAG_MV0)
827 s->mpv_flags |= FF_MPV_FLAG_MV0;
828 FF_ENABLE_DEPRECATION_WARNINGS
832 FF_DISABLE_DEPRECATION_WARNINGS
833 if (avctx->rc_qsquish != 0.0)
834 s->rc_qsquish = avctx->rc_qsquish;
835 if (avctx->rc_qmod_amp != 0.0)
836 s->rc_qmod_amp = avctx->rc_qmod_amp;
837 if (avctx->rc_qmod_freq)
838 s->rc_qmod_freq = avctx->rc_qmod_freq;
839 if (avctx->rc_buffer_aggressivity != 1.0)
840 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
841 if (avctx->rc_initial_cplx != 0.0)
842 s->rc_initial_cplx = avctx->rc_initial_cplx;
844 s->lmin = avctx->lmin;
846 s->lmax = avctx->lmax;
850 s->rc_eq = av_strdup(avctx->rc_eq);
852 return AVERROR(ENOMEM);
854 FF_ENABLE_DEPRECATION_WARNINGS
857 if (avctx->b_frame_strategy == 2) {
858 for (i = 0; i < s->max_b_frames + 2; i++) {
859 s->tmp_frames[i] = av_frame_alloc();
860 if (!s->tmp_frames[i])
861 return AVERROR(ENOMEM);
863 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
864 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
865 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
867 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
875 ff_mpv_encode_end(avctx);
876 return AVERROR_UNKNOWN;
879 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
881 MpegEncContext *s = avctx->priv_data;
884 ff_rate_control_uninit(s);
886 ff_mpv_common_end(s);
887 if (CONFIG_MJPEG_ENCODER &&
888 s->out_format == FMT_MJPEG)
889 ff_mjpeg_encode_close(s);
891 av_freep(&avctx->extradata);
893 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
894 av_frame_free(&s->tmp_frames[i]);
896 ff_free_picture_tables(&s->new_picture);
897 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
899 av_freep(&s->avctx->stats_out);
900 av_freep(&s->ac_stats);
902 av_freep(&s->q_intra_matrix);
903 av_freep(&s->q_inter_matrix);
904 av_freep(&s->q_intra_matrix16);
905 av_freep(&s->q_inter_matrix16);
906 av_freep(&s->input_picture);
907 av_freep(&s->reordered_input_picture);
908 av_freep(&s->dct_offset);
913 static int get_sae(uint8_t *src, int ref, int stride)
918 for (y = 0; y < 16; y++) {
919 for (x = 0; x < 16; x++) {
920 acc += FFABS(src[x + y * stride] - ref);
927 static int get_intra_count(MpegEncContext *s, uint8_t *src,
928 uint8_t *ref, int stride)
936 for (y = 0; y < h; y += 16) {
937 for (x = 0; x < w; x += 16) {
938 int offset = x + y * stride;
939 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
941 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
942 int sae = get_sae(src + offset, mean, stride);
944 acc += sae + 500 < sad;
950 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
952 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
953 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
954 s->mb_stride, s->mb_height, s->b8_stride,
955 &s->linesize, &s->uvlinesize);
958 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
962 int i, display_picture_number = 0, ret;
963 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
964 (s->low_delay ? 0 : 1);
969 display_picture_number = s->input_picture_number++;
971 if (pts != AV_NOPTS_VALUE) {
972 if (s->user_specified_pts != AV_NOPTS_VALUE) {
974 int64_t last = s->user_specified_pts;
977 av_log(s->avctx, AV_LOG_ERROR,
978 "Error, Invalid timestamp=%"PRId64", "
979 "last=%"PRId64"\n", pts, s->user_specified_pts);
983 if (!s->low_delay && display_picture_number == 1)
984 s->dts_delta = time - last;
986 s->user_specified_pts = pts;
988 if (s->user_specified_pts != AV_NOPTS_VALUE) {
989 s->user_specified_pts =
990 pts = s->user_specified_pts + 1;
991 av_log(s->avctx, AV_LOG_INFO,
992 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
995 pts = display_picture_number;
1001 if (!pic_arg->buf[0] ||
1002 pic_arg->linesize[0] != s->linesize ||
1003 pic_arg->linesize[1] != s->uvlinesize ||
1004 pic_arg->linesize[2] != s->uvlinesize)
1006 if ((s->width & 15) || (s->height & 15))
1009 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1010 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1012 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1016 pic = &s->picture[i];
1020 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1023 ret = alloc_picture(s, pic, direct);
1028 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1029 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1030 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1033 int h_chroma_shift, v_chroma_shift;
1034 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1038 for (i = 0; i < 3; i++) {
1039 int src_stride = pic_arg->linesize[i];
1040 int dst_stride = i ? s->uvlinesize : s->linesize;
1041 int h_shift = i ? h_chroma_shift : 0;
1042 int v_shift = i ? v_chroma_shift : 0;
1043 int w = s->width >> h_shift;
1044 int h = s->height >> v_shift;
1045 uint8_t *src = pic_arg->data[i];
1046 uint8_t *dst = pic->f->data[i];
1048 if (!s->avctx->rc_buffer_size)
1049 dst += INPLACE_OFFSET;
1051 if (src_stride == dst_stride)
1052 memcpy(dst, src, src_stride * h);
1055 uint8_t *dst2 = dst;
1057 memcpy(dst2, src, w);
1062 if ((s->width & 15) || (s->height & 15)) {
1063 s->mpvencdsp.draw_edges(dst, dst_stride,
1072 ret = av_frame_copy_props(pic->f, pic_arg);
1076 pic->f->display_picture_number = display_picture_number;
1077 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1080 /* shift buffer entries */
1081 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1082 s->input_picture[i - 1] = s->input_picture[i];
1084 s->input_picture[encoding_delay] = (Picture*) pic;
1089 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1093 int64_t score64 = 0;
1095 for (plane = 0; plane < 3; plane++) {
1096 const int stride = p->f->linesize[plane];
1097 const int bw = plane ? 1 : 2;
1098 for (y = 0; y < s->mb_height * bw; y++) {
1099 for (x = 0; x < s->mb_width * bw; x++) {
1100 int off = p->shared ? 0 : 16;
1101 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1102 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1103 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1105 switch (s->avctx->frame_skip_exp) {
1106 case 0: score = FFMAX(score, v); break;
1107 case 1: score += FFABS(v); break;
1108 case 2: score += v * v; break;
1109 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1110 case 4: score64 += v * v * (int64_t)(v * v); break;
1119 if (score64 < s->avctx->frame_skip_threshold)
1121 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1126 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1128 AVPacket pkt = { 0 };
1129 int ret, got_output;
1131 av_init_packet(&pkt);
1132 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1137 av_free_packet(&pkt);
1141 static int estimate_best_b_count(MpegEncContext *s)
1143 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1144 AVCodecContext *c = avcodec_alloc_context3(NULL);
1145 const int scale = s->avctx->brd_scale;
1146 int i, j, out_size, p_lambda, b_lambda, lambda2;
1147 int64_t best_rd = INT64_MAX;
1148 int best_b_count = -1;
1151 return AVERROR(ENOMEM);
1152 assert(scale >= 0 && scale <= 3);
1155 //s->next_picture_ptr->quality;
1156 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1157 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1158 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1159 if (!b_lambda) // FIXME we should do this somewhere else
1160 b_lambda = p_lambda;
1161 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1164 c->width = s->width >> scale;
1165 c->height = s->height >> scale;
1166 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1167 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1168 c->mb_decision = s->avctx->mb_decision;
1169 c->me_cmp = s->avctx->me_cmp;
1170 c->mb_cmp = s->avctx->mb_cmp;
1171 c->me_sub_cmp = s->avctx->me_sub_cmp;
1172 c->pix_fmt = AV_PIX_FMT_YUV420P;
1173 c->time_base = s->avctx->time_base;
1174 c->max_b_frames = s->max_b_frames;
1176 if (avcodec_open2(c, codec, NULL) < 0)
1179 for (i = 0; i < s->max_b_frames + 2; i++) {
1180 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1181 s->next_picture_ptr;
1183 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1184 pre_input = *pre_input_ptr;
1186 if (!pre_input.shared && i) {
1187 pre_input.f->data[0] += INPLACE_OFFSET;
1188 pre_input.f->data[1] += INPLACE_OFFSET;
1189 pre_input.f->data[2] += INPLACE_OFFSET;
1192 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1193 s->tmp_frames[i]->linesize[0],
1194 pre_input.f->data[0],
1195 pre_input.f->linesize[0],
1196 c->width, c->height);
1197 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1198 s->tmp_frames[i]->linesize[1],
1199 pre_input.f->data[1],
1200 pre_input.f->linesize[1],
1201 c->width >> 1, c->height >> 1);
1202 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1203 s->tmp_frames[i]->linesize[2],
1204 pre_input.f->data[2],
1205 pre_input.f->linesize[2],
1206 c->width >> 1, c->height >> 1);
1210 for (j = 0; j < s->max_b_frames + 1; j++) {
1213 if (!s->input_picture[j])
1216 c->error[0] = c->error[1] = c->error[2] = 0;
1218 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1219 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1221 out_size = encode_frame(c, s->tmp_frames[0]);
1223 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1225 for (i = 0; i < s->max_b_frames + 1; i++) {
1226 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1228 s->tmp_frames[i + 1]->pict_type = is_p ?
1229 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1230 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1232 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1234 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1237 /* get the delayed frames */
1239 out_size = encode_frame(c, NULL);
1240 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1243 rd += c->error[0] + c->error[1] + c->error[2];
1254 return best_b_count;
1257 static int select_input_picture(MpegEncContext *s)
1261 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1262 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1263 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1265 /* set next picture type & ordering */
1266 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1267 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1268 !s->next_picture_ptr || s->intra_only) {
1269 s->reordered_input_picture[0] = s->input_picture[0];
1270 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1271 s->reordered_input_picture[0]->f->coded_picture_number =
1272 s->coded_picture_number++;
1276 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1277 if (s->picture_in_gop_number < s->gop_size &&
1278 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1279 // FIXME check that te gop check above is +-1 correct
1280 av_frame_unref(s->input_picture[0]->f);
1283 ff_vbv_update(s, 0);
1289 if (s->avctx->flags & CODEC_FLAG_PASS2) {
1290 for (i = 0; i < s->max_b_frames + 1; i++) {
1291 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1293 if (pict_num >= s->rc_context.num_entries)
1295 if (!s->input_picture[i]) {
1296 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1300 s->input_picture[i]->f->pict_type =
1301 s->rc_context.entry[pict_num].new_pict_type;
1305 if (s->avctx->b_frame_strategy == 0) {
1306 b_frames = s->max_b_frames;
1307 while (b_frames && !s->input_picture[b_frames])
1309 } else if (s->avctx->b_frame_strategy == 1) {
1310 for (i = 1; i < s->max_b_frames + 1; i++) {
1311 if (s->input_picture[i] &&
1312 s->input_picture[i]->b_frame_score == 0) {
1313 s->input_picture[i]->b_frame_score =
1315 s->input_picture[i ]->f->data[0],
1316 s->input_picture[i - 1]->f->data[0],
1320 for (i = 0; i < s->max_b_frames + 1; i++) {
1321 if (!s->input_picture[i] ||
1322 s->input_picture[i]->b_frame_score - 1 >
1323 s->mb_num / s->avctx->b_sensitivity)
1327 b_frames = FFMAX(0, i - 1);
1330 for (i = 0; i < b_frames + 1; i++) {
1331 s->input_picture[i]->b_frame_score = 0;
1333 } else if (s->avctx->b_frame_strategy == 2) {
1334 b_frames = estimate_best_b_count(s);
1336 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1342 for (i = b_frames - 1; i >= 0; i--) {
1343 int type = s->input_picture[i]->f->pict_type;
1344 if (type && type != AV_PICTURE_TYPE_B)
1347 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1348 b_frames == s->max_b_frames) {
1349 av_log(s->avctx, AV_LOG_ERROR,
1350 "warning, too many b frames in a row\n");
1353 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1354 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1355 s->gop_size > s->picture_in_gop_number) {
1356 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1358 if (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)
1360 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1364 if ((s->avctx->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1365 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1368 s->reordered_input_picture[0] = s->input_picture[b_frames];
1369 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1370 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1371 s->reordered_input_picture[0]->f->coded_picture_number =
1372 s->coded_picture_number++;
1373 for (i = 0; i < b_frames; i++) {
1374 s->reordered_input_picture[i + 1] = s->input_picture[i];
1375 s->reordered_input_picture[i + 1]->f->pict_type =
1377 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1378 s->coded_picture_number++;
1383 if (s->reordered_input_picture[0]) {
1384 s->reordered_input_picture[0]->reference =
1385 s->reordered_input_picture[0]->f->pict_type !=
1386 AV_PICTURE_TYPE_B ? 3 : 0;
1388 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1389 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1392 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1393 // input is a shared pix, so we can't modifiy it -> alloc a new
1394 // one & ensure that the shared one is reuseable
1397 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1400 pic = &s->picture[i];
1402 pic->reference = s->reordered_input_picture[0]->reference;
1403 if (alloc_picture(s, pic, 0) < 0) {
1407 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1411 /* mark us unused / free shared pic */
1412 av_frame_unref(s->reordered_input_picture[0]->f);
1413 s->reordered_input_picture[0]->shared = 0;
1415 s->current_picture_ptr = pic;
1417 // input is not a shared pix -> reuse buffer for current_pix
1418 s->current_picture_ptr = s->reordered_input_picture[0];
1419 for (i = 0; i < 4; i++) {
1420 s->new_picture.f->data[i] += INPLACE_OFFSET;
1423 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1424 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1425 s->current_picture_ptr)) < 0)
1428 s->picture_number = s->new_picture.f->display_picture_number;
1430 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1435 static void frame_end(MpegEncContext *s)
1439 if (s->unrestricted_mv &&
1440 s->current_picture.reference &&
1442 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1443 int hshift = desc->log2_chroma_w;
1444 int vshift = desc->log2_chroma_h;
1445 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1446 s->h_edge_pos, s->v_edge_pos,
1447 EDGE_WIDTH, EDGE_WIDTH,
1448 EDGE_TOP | EDGE_BOTTOM);
1449 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1450 s->h_edge_pos >> hshift,
1451 s->v_edge_pos >> vshift,
1452 EDGE_WIDTH >> hshift,
1453 EDGE_WIDTH >> vshift,
1454 EDGE_TOP | EDGE_BOTTOM);
1455 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1456 s->h_edge_pos >> hshift,
1457 s->v_edge_pos >> vshift,
1458 EDGE_WIDTH >> hshift,
1459 EDGE_WIDTH >> vshift,
1460 EDGE_TOP | EDGE_BOTTOM);
1465 s->last_pict_type = s->pict_type;
1466 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1467 if (s->pict_type!= AV_PICTURE_TYPE_B)
1468 s->last_non_b_pict_type = s->pict_type;
1471 /* release non-reference frames */
1472 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1473 if (!s->picture[i].reference)
1474 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1478 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1481 static void update_noise_reduction(MpegEncContext *s)
1485 for (intra = 0; intra < 2; intra++) {
1486 if (s->dct_count[intra] > (1 << 16)) {
1487 for (i = 0; i < 64; i++) {
1488 s->dct_error_sum[intra][i] >>= 1;
1490 s->dct_count[intra] >>= 1;
1493 for (i = 0; i < 64; i++) {
1494 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1495 s->dct_count[intra] +
1496 s->dct_error_sum[intra][i] / 2) /
1497 (s->dct_error_sum[intra][i] + 1);
1502 static int frame_start(MpegEncContext *s)
1506 /* mark & release old frames */
1507 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1508 s->last_picture_ptr != s->next_picture_ptr &&
1509 s->last_picture_ptr->f->buf[0]) {
1510 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1513 s->current_picture_ptr->f->pict_type = s->pict_type;
1514 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1516 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1517 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1518 s->current_picture_ptr)) < 0)
1521 if (s->pict_type != AV_PICTURE_TYPE_B) {
1522 s->last_picture_ptr = s->next_picture_ptr;
1524 s->next_picture_ptr = s->current_picture_ptr;
1527 if (s->last_picture_ptr) {
1528 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1529 if (s->last_picture_ptr->f->buf[0] &&
1530 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1531 s->last_picture_ptr)) < 0)
1534 if (s->next_picture_ptr) {
1535 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1536 if (s->next_picture_ptr->f->buf[0] &&
1537 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1538 s->next_picture_ptr)) < 0)
1542 if (s->picture_structure!= PICT_FRAME) {
1544 for (i = 0; i < 4; i++) {
1545 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1546 s->current_picture.f->data[i] +=
1547 s->current_picture.f->linesize[i];
1549 s->current_picture.f->linesize[i] *= 2;
1550 s->last_picture.f->linesize[i] *= 2;
1551 s->next_picture.f->linesize[i] *= 2;
1555 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1556 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1557 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1558 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1559 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1560 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1562 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1563 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1566 if (s->dct_error_sum) {
1567 assert(s->avctx->noise_reduction && s->encoding);
1568 update_noise_reduction(s);
1574 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1575 const AVFrame *pic_arg, int *got_packet)
1577 MpegEncContext *s = avctx->priv_data;
1578 int i, stuffing_count, ret;
1579 int context_count = s->slice_context_count;
1581 s->picture_in_gop_number++;
1583 if (load_input_picture(s, pic_arg) < 0)
1586 if (select_input_picture(s) < 0) {
1591 if (s->new_picture.f->data[0]) {
1594 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1597 s->mb_info_ptr = av_packet_new_side_data(pkt,
1598 AV_PKT_DATA_H263_MB_INFO,
1599 s->mb_width*s->mb_height*12);
1600 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1603 for (i = 0; i < context_count; i++) {
1604 int start_y = s->thread_context[i]->start_mb_y;
1605 int end_y = s->thread_context[i]-> end_mb_y;
1606 int h = s->mb_height;
1607 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1608 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1610 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1613 s->pict_type = s->new_picture.f->pict_type;
1615 ret = frame_start(s);
1619 if (encode_picture(s, s->picture_number) < 0)
1622 avctx->header_bits = s->header_bits;
1623 avctx->mv_bits = s->mv_bits;
1624 avctx->misc_bits = s->misc_bits;
1625 avctx->i_tex_bits = s->i_tex_bits;
1626 avctx->p_tex_bits = s->p_tex_bits;
1627 avctx->i_count = s->i_count;
1628 // FIXME f/b_count in avctx
1629 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1630 avctx->skip_count = s->skip_count;
1634 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1637 return AVERROR(ENOMEM);
1638 *(int *)sd = s->current_picture.f->quality;
1640 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1641 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1643 if (avctx->rc_buffer_size) {
1644 RateControlContext *rcc = &s->rc_context;
1645 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1647 if (put_bits_count(&s->pb) > max_size &&
1648 s->lambda < s->lmax) {
1649 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1650 (s->qscale + 1) / s->qscale);
1651 if (s->adaptive_quant) {
1653 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1654 s->lambda_table[i] =
1655 FFMAX(s->lambda_table[i] + 1,
1656 s->lambda_table[i] * (s->qscale + 1) /
1659 s->mb_skipped = 0; // done in frame_start()
1660 // done in encode_picture() so we must undo it
1661 if (s->pict_type == AV_PICTURE_TYPE_P) {
1662 if (s->flipflop_rounding ||
1663 s->codec_id == AV_CODEC_ID_H263P ||
1664 s->codec_id == AV_CODEC_ID_MPEG4)
1665 s->no_rounding ^= 1;
1667 if (s->pict_type != AV_PICTURE_TYPE_B) {
1668 s->time_base = s->last_time_base;
1669 s->last_non_b_time = s->time - s->pp_time;
1671 for (i = 0; i < context_count; i++) {
1672 PutBitContext *pb = &s->thread_context[i]->pb;
1673 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1678 assert(s->avctx->rc_max_rate);
1681 if (s->avctx->flags & CODEC_FLAG_PASS1)
1682 ff_write_pass1_stats(s);
1684 for (i = 0; i < 4; i++) {
1685 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1686 avctx->error[i] += s->current_picture_ptr->f->error[i];
1689 if (s->avctx->flags & CODEC_FLAG_PASS1)
1690 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1691 avctx->i_tex_bits + avctx->p_tex_bits ==
1692 put_bits_count(&s->pb));
1693 flush_put_bits(&s->pb);
1694 s->frame_bits = put_bits_count(&s->pb);
1696 stuffing_count = ff_vbv_update(s, s->frame_bits);
1697 if (stuffing_count) {
1698 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1699 stuffing_count + 50) {
1700 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1704 switch (s->codec_id) {
1705 case AV_CODEC_ID_MPEG1VIDEO:
1706 case AV_CODEC_ID_MPEG2VIDEO:
1707 while (stuffing_count--) {
1708 put_bits(&s->pb, 8, 0);
1711 case AV_CODEC_ID_MPEG4:
1712 put_bits(&s->pb, 16, 0);
1713 put_bits(&s->pb, 16, 0x1C3);
1714 stuffing_count -= 4;
1715 while (stuffing_count--) {
1716 put_bits(&s->pb, 8, 0xFF);
1720 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1722 flush_put_bits(&s->pb);
1723 s->frame_bits = put_bits_count(&s->pb);
1726 /* update mpeg1/2 vbv_delay for CBR */
1727 if (s->avctx->rc_max_rate &&
1728 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1729 s->out_format == FMT_MPEG1 &&
1730 90000LL * (avctx->rc_buffer_size - 1) <=
1731 s->avctx->rc_max_rate * 0xFFFFLL) {
1732 int vbv_delay, min_delay;
1733 double inbits = s->avctx->rc_max_rate *
1734 av_q2d(s->avctx->time_base);
1735 int minbits = s->frame_bits - 8 *
1736 (s->vbv_delay_ptr - s->pb.buf - 1);
1737 double bits = s->rc_context.buffer_index + minbits - inbits;
1740 av_log(s->avctx, AV_LOG_ERROR,
1741 "Internal error, negative bits\n");
1743 assert(s->repeat_first_field == 0);
1745 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1746 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1747 s->avctx->rc_max_rate;
1749 vbv_delay = FFMAX(vbv_delay, min_delay);
1751 assert(vbv_delay < 0xFFFF);
1753 s->vbv_delay_ptr[0] &= 0xF8;
1754 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1755 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1756 s->vbv_delay_ptr[2] &= 0x07;
1757 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1758 avctx->vbv_delay = vbv_delay * 300;
1760 s->total_bits += s->frame_bits;
1761 avctx->frame_bits = s->frame_bits;
1763 pkt->pts = s->current_picture.f->pts;
1764 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1765 if (!s->current_picture.f->coded_picture_number)
1766 pkt->dts = pkt->pts - s->dts_delta;
1768 pkt->dts = s->reordered_pts;
1769 s->reordered_pts = pkt->pts;
1771 pkt->dts = pkt->pts;
1772 if (s->current_picture.f->key_frame)
1773 pkt->flags |= AV_PKT_FLAG_KEY;
1775 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1779 assert((s->frame_bits & 7) == 0);
1781 pkt->size = s->frame_bits / 8;
1782 *got_packet = !!pkt->size;
1786 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1787 int n, int threshold)
1789 static const char tab[64] = {
1790 3, 2, 2, 1, 1, 1, 1, 1,
1791 1, 1, 1, 1, 1, 1, 1, 1,
1792 1, 1, 1, 1, 1, 1, 1, 1,
1793 0, 0, 0, 0, 0, 0, 0, 0,
1794 0, 0, 0, 0, 0, 0, 0, 0,
1795 0, 0, 0, 0, 0, 0, 0, 0,
1796 0, 0, 0, 0, 0, 0, 0, 0,
1797 0, 0, 0, 0, 0, 0, 0, 0
1802 int16_t *block = s->block[n];
1803 const int last_index = s->block_last_index[n];
1806 if (threshold < 0) {
1808 threshold = -threshold;
1812 /* Are all we could set to zero already zero? */
1813 if (last_index <= skip_dc - 1)
1816 for (i = 0; i <= last_index; i++) {
1817 const int j = s->intra_scantable.permutated[i];
1818 const int level = FFABS(block[j]);
1820 if (skip_dc && i == 0)
1824 } else if (level > 1) {
1830 if (score >= threshold)
1832 for (i = skip_dc; i <= last_index; i++) {
1833 const int j = s->intra_scantable.permutated[i];
1837 s->block_last_index[n] = 0;
1839 s->block_last_index[n] = -1;
1842 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1846 const int maxlevel = s->max_qcoeff;
1847 const int minlevel = s->min_qcoeff;
1851 i = 1; // skip clipping of intra dc
1855 for (; i <= last_index; i++) {
1856 const int j = s->intra_scantable.permutated[i];
1857 int level = block[j];
1859 if (level > maxlevel) {
1862 } else if (level < minlevel) {
1870 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1871 av_log(s->avctx, AV_LOG_INFO,
1872 "warning, clipping %d dct coefficients to %d..%d\n",
1873 overflow, minlevel, maxlevel);
1876 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1880 for (y = 0; y < 8; y++) {
1881 for (x = 0; x < 8; x++) {
1887 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1888 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1889 int v = ptr[x2 + y2 * stride];
1895 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1900 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1901 int motion_x, int motion_y,
1902 int mb_block_height,
1905 int16_t weight[8][64];
1906 int16_t orig[8][64];
1907 const int mb_x = s->mb_x;
1908 const int mb_y = s->mb_y;
1911 int dct_offset = s->linesize * 8; // default for progressive frames
1912 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1913 ptrdiff_t wrap_y, wrap_c;
1915 for (i = 0; i < mb_block_count; i++)
1916 skip_dct[i] = s->skipdct;
1918 if (s->adaptive_quant) {
1919 const int last_qp = s->qscale;
1920 const int mb_xy = mb_x + mb_y * s->mb_stride;
1922 s->lambda = s->lambda_table[mb_xy];
1925 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1926 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1927 s->dquant = s->qscale - last_qp;
1929 if (s->out_format == FMT_H263) {
1930 s->dquant = av_clip(s->dquant, -2, 2);
1932 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1934 if (s->pict_type == AV_PICTURE_TYPE_B) {
1935 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1938 if (s->mv_type == MV_TYPE_8X8)
1944 ff_set_qscale(s, last_qp + s->dquant);
1945 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1946 ff_set_qscale(s, s->qscale + s->dquant);
1948 wrap_y = s->linesize;
1949 wrap_c = s->uvlinesize;
1950 ptr_y = s->new_picture.f->data[0] +
1951 (mb_y * 16 * wrap_y) + mb_x * 16;
1952 ptr_cb = s->new_picture.f->data[1] +
1953 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1954 ptr_cr = s->new_picture.f->data[2] +
1955 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1957 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1958 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1959 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1961 16, 16, mb_x * 16, mb_y * 16,
1962 s->width, s->height);
1964 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1966 8, mb_block_height, mb_x * 8, mb_y * 8,
1967 s->width >> 1, s->height >> 1);
1968 ptr_cb = ebuf + 18 * wrap_y;
1969 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1971 8, mb_block_height, mb_x * 8, mb_y * 8,
1972 s->width >> 1, s->height >> 1);
1973 ptr_cr = ebuf + 18 * wrap_y + 8;
1977 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
1978 int progressive_score, interlaced_score;
1980 s->interlaced_dct = 0;
1981 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1982 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1983 NULL, wrap_y, 8) - 400;
1985 if (progressive_score > 0) {
1986 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1987 NULL, wrap_y * 2, 8) +
1988 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1989 NULL, wrap_y * 2, 8);
1990 if (progressive_score > interlaced_score) {
1991 s->interlaced_dct = 1;
1993 dct_offset = wrap_y;
1995 if (s->chroma_format == CHROMA_422)
2001 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2002 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2003 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2004 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2006 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2010 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2011 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2012 if (!s->chroma_y_shift) { /* 422 */
2013 s->pdsp.get_pixels(s->block[6],
2014 ptr_cb + (dct_offset >> 1), wrap_c);
2015 s->pdsp.get_pixels(s->block[7],
2016 ptr_cr + (dct_offset >> 1), wrap_c);
2020 op_pixels_func (*op_pix)[4];
2021 qpel_mc_func (*op_qpix)[16];
2022 uint8_t *dest_y, *dest_cb, *dest_cr;
2024 dest_y = s->dest[0];
2025 dest_cb = s->dest[1];
2026 dest_cr = s->dest[2];
2028 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2029 op_pix = s->hdsp.put_pixels_tab;
2030 op_qpix = s->qdsp.put_qpel_pixels_tab;
2032 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2033 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2036 if (s->mv_dir & MV_DIR_FORWARD) {
2037 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2038 s->last_picture.f->data,
2040 op_pix = s->hdsp.avg_pixels_tab;
2041 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2043 if (s->mv_dir & MV_DIR_BACKWARD) {
2044 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2045 s->next_picture.f->data,
2049 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
2050 int progressive_score, interlaced_score;
2052 s->interlaced_dct = 0;
2053 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2054 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2058 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2059 progressive_score -= 400;
2061 if (progressive_score > 0) {
2062 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2064 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2068 if (progressive_score > interlaced_score) {
2069 s->interlaced_dct = 1;
2071 dct_offset = wrap_y;
2073 if (s->chroma_format == CHROMA_422)
2079 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2080 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2081 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2082 dest_y + dct_offset, wrap_y);
2083 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2084 dest_y + dct_offset + 8, wrap_y);
2086 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2090 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2091 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2092 if (!s->chroma_y_shift) { /* 422 */
2093 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2094 dest_cb + (dct_offset >> 1), wrap_c);
2095 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2096 dest_cr + (dct_offset >> 1), wrap_c);
2099 /* pre quantization */
2100 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2101 2 * s->qscale * s->qscale) {
2103 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2105 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2107 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2108 wrap_y, 8) < 20 * s->qscale)
2110 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2111 wrap_y, 8) < 20 * s->qscale)
2113 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2115 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2117 if (!s->chroma_y_shift) { /* 422 */
2118 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2119 dest_cb + (dct_offset >> 1),
2120 wrap_c, 8) < 20 * s->qscale)
2122 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2123 dest_cr + (dct_offset >> 1),
2124 wrap_c, 8) < 20 * s->qscale)
2130 if (s->quantizer_noise_shaping) {
2132 get_visual_weight(weight[0], ptr_y , wrap_y);
2134 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2136 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2138 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2140 get_visual_weight(weight[4], ptr_cb , wrap_c);
2142 get_visual_weight(weight[5], ptr_cr , wrap_c);
2143 if (!s->chroma_y_shift) { /* 422 */
2145 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2148 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2151 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2154 /* DCT & quantize */
2155 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2157 for (i = 0; i < mb_block_count; i++) {
2160 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2161 // FIXME we could decide to change to quantizer instead of
2163 // JS: I don't think that would be a good idea it could lower
2164 // quality instead of improve it. Just INTRADC clipping
2165 // deserves changes in quantizer
2167 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2169 s->block_last_index[i] = -1;
2171 if (s->quantizer_noise_shaping) {
2172 for (i = 0; i < mb_block_count; i++) {
2174 s->block_last_index[i] =
2175 dct_quantize_refine(s, s->block[i], weight[i],
2176 orig[i], i, s->qscale);
2181 if (s->luma_elim_threshold && !s->mb_intra)
2182 for (i = 0; i < 4; i++)
2183 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2184 if (s->chroma_elim_threshold && !s->mb_intra)
2185 for (i = 4; i < mb_block_count; i++)
2186 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2188 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2189 for (i = 0; i < mb_block_count; i++) {
2190 if (s->block_last_index[i] == -1)
2191 s->coded_score[i] = INT_MAX / 256;
2196 if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2197 s->block_last_index[4] =
2198 s->block_last_index[5] = 0;
2200 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2203 // non c quantize code returns incorrect block_last_index FIXME
2204 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2205 for (i = 0; i < mb_block_count; i++) {
2207 if (s->block_last_index[i] > 0) {
2208 for (j = 63; j > 0; j--) {
2209 if (s->block[i][s->intra_scantable.permutated[j]])
2212 s->block_last_index[i] = j;
2217 /* huffman encode */
2218 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2219 case AV_CODEC_ID_MPEG1VIDEO:
2220 case AV_CODEC_ID_MPEG2VIDEO:
2221 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2222 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2224 case AV_CODEC_ID_MPEG4:
2225 if (CONFIG_MPEG4_ENCODER)
2226 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2228 case AV_CODEC_ID_MSMPEG4V2:
2229 case AV_CODEC_ID_MSMPEG4V3:
2230 case AV_CODEC_ID_WMV1:
2231 if (CONFIG_MSMPEG4_ENCODER)
2232 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2234 case AV_CODEC_ID_WMV2:
2235 if (CONFIG_WMV2_ENCODER)
2236 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2238 case AV_CODEC_ID_H261:
2239 if (CONFIG_H261_ENCODER)
2240 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2242 case AV_CODEC_ID_H263:
2243 case AV_CODEC_ID_H263P:
2244 case AV_CODEC_ID_FLV1:
2245 case AV_CODEC_ID_RV10:
2246 case AV_CODEC_ID_RV20:
2247 if (CONFIG_H263_ENCODER)
2248 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2250 case AV_CODEC_ID_MJPEG:
2251 if (CONFIG_MJPEG_ENCODER)
2252 ff_mjpeg_encode_mb(s, s->block);
2259 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2261 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2262 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2265 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2268 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2271 d->mb_skip_run= s->mb_skip_run;
2273 d->last_dc[i] = s->last_dc[i];
2276 d->mv_bits= s->mv_bits;
2277 d->i_tex_bits= s->i_tex_bits;
2278 d->p_tex_bits= s->p_tex_bits;
2279 d->i_count= s->i_count;
2280 d->f_count= s->f_count;
2281 d->b_count= s->b_count;
2282 d->skip_count= s->skip_count;
2283 d->misc_bits= s->misc_bits;
2287 d->qscale= s->qscale;
2288 d->dquant= s->dquant;
2290 d->esc3_level_length= s->esc3_level_length;
2293 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2296 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2297 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2300 d->mb_skip_run= s->mb_skip_run;
2302 d->last_dc[i] = s->last_dc[i];
2305 d->mv_bits= s->mv_bits;
2306 d->i_tex_bits= s->i_tex_bits;
2307 d->p_tex_bits= s->p_tex_bits;
2308 d->i_count= s->i_count;
2309 d->f_count= s->f_count;
2310 d->b_count= s->b_count;
2311 d->skip_count= s->skip_count;
2312 d->misc_bits= s->misc_bits;
2314 d->mb_intra= s->mb_intra;
2315 d->mb_skipped= s->mb_skipped;
2316 d->mv_type= s->mv_type;
2317 d->mv_dir= s->mv_dir;
2319 if(s->data_partitioning){
2321 d->tex_pb= s->tex_pb;
2325 d->block_last_index[i]= s->block_last_index[i];
2326 d->interlaced_dct= s->interlaced_dct;
2327 d->qscale= s->qscale;
2329 d->esc3_level_length= s->esc3_level_length;
2332 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2333 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2334 int *dmin, int *next_block, int motion_x, int motion_y)
2337 uint8_t *dest_backup[3];
2339 copy_context_before_encode(s, backup, type);
2341 s->block= s->blocks[*next_block];
2342 s->pb= pb[*next_block];
2343 if(s->data_partitioning){
2344 s->pb2 = pb2 [*next_block];
2345 s->tex_pb= tex_pb[*next_block];
2349 memcpy(dest_backup, s->dest, sizeof(s->dest));
2350 s->dest[0] = s->sc.rd_scratchpad;
2351 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2352 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2353 assert(s->linesize >= 32); //FIXME
2356 encode_mb(s, motion_x, motion_y);
2358 score= put_bits_count(&s->pb);
2359 if(s->data_partitioning){
2360 score+= put_bits_count(&s->pb2);
2361 score+= put_bits_count(&s->tex_pb);
2364 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2365 ff_mpv_decode_mb(s, s->block);
2367 score *= s->lambda2;
2368 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2372 memcpy(s->dest, dest_backup, sizeof(s->dest));
2379 copy_context_after_encode(best, s, type);
2383 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2384 uint32_t *sq = ff_square_tab + 256;
2389 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2390 else if(w==8 && h==8)
2391 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2395 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2404 static int sse_mb(MpegEncContext *s){
2408 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2409 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2412 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2413 return s->mecc.nsse[0](s, s->new_picture.f->data[0] + s->mb_x * 16 + s->mb_y * s->linesize * 16, s->dest[0], s->linesize, 16) +
2414 s->mecc.nsse[1](s, s->new_picture.f->data[1] + s->mb_x * 8 + s->mb_y * s->uvlinesize * 8, s->dest[1], s->uvlinesize, 8) +
2415 s->mecc.nsse[1](s, s->new_picture.f->data[2] + s->mb_x * 8 + s->mb_y * s->uvlinesize * 8, s->dest[2], s->uvlinesize, 8);
2417 return s->mecc.sse[0](NULL, s->new_picture.f->data[0] + s->mb_x * 16 + s->mb_y * s->linesize * 16, s->dest[0], s->linesize, 16) +
2418 s->mecc.sse[1](NULL, s->new_picture.f->data[1] + s->mb_x * 8 + s->mb_y * s->uvlinesize * 8, s->dest[1], s->uvlinesize, 8) +
2419 s->mecc.sse[1](NULL, s->new_picture.f->data[2] + s->mb_x * 8 + s->mb_y * s->uvlinesize * 8, s->dest[2], s->uvlinesize, 8);
2422 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)
2423 +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)
2424 +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);
2427 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2428 MpegEncContext *s= *(void**)arg;
2432 s->me.dia_size= s->avctx->pre_dia_size;
2433 s->first_slice_line=1;
2434 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2435 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2436 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2438 s->first_slice_line=0;
2446 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2447 MpegEncContext *s= *(void**)arg;
2449 s->me.dia_size= s->avctx->dia_size;
2450 s->first_slice_line=1;
2451 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2452 s->mb_x=0; //for block init below
2453 ff_init_block_index(s);
2454 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2455 s->block_index[0]+=2;
2456 s->block_index[1]+=2;
2457 s->block_index[2]+=2;
2458 s->block_index[3]+=2;
2460 /* compute motion vector & mb_type and store in context */
2461 if(s->pict_type==AV_PICTURE_TYPE_B)
2462 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2464 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2466 s->first_slice_line=0;
2471 static int mb_var_thread(AVCodecContext *c, void *arg){
2472 MpegEncContext *s= *(void**)arg;
2475 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2476 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2479 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2481 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2483 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2484 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2486 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2487 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2488 s->me.mb_var_sum_temp += varc;
2494 static void write_slice_end(MpegEncContext *s){
2495 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2496 if(s->partitioned_frame){
2497 ff_mpeg4_merge_partitions(s);
2500 ff_mpeg4_stuffing(&s->pb);
2501 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2502 ff_mjpeg_encode_stuffing(&s->pb);
2505 avpriv_align_put_bits(&s->pb);
2506 flush_put_bits(&s->pb);
2508 if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
2509 s->misc_bits+= get_bits_diff(s);
2512 static void write_mb_info(MpegEncContext *s)
2514 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2515 int offset = put_bits_count(&s->pb);
2516 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2517 int gobn = s->mb_y / s->gob_index;
2519 if (CONFIG_H263_ENCODER)
2520 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2521 bytestream_put_le32(&ptr, offset);
2522 bytestream_put_byte(&ptr, s->qscale);
2523 bytestream_put_byte(&ptr, gobn);
2524 bytestream_put_le16(&ptr, mba);
2525 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2526 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2527 /* 4MV not implemented */
2528 bytestream_put_byte(&ptr, 0); /* hmv2 */
2529 bytestream_put_byte(&ptr, 0); /* vmv2 */
2532 static void update_mb_info(MpegEncContext *s, int startcode)
2536 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2537 s->mb_info_size += 12;
2538 s->prev_mb_info = s->last_mb_info;
2541 s->prev_mb_info = put_bits_count(&s->pb)/8;
2542 /* This might have incremented mb_info_size above, and we return without
2543 * actually writing any info into that slot yet. But in that case,
2544 * this will be called again at the start of the after writing the
2545 * start code, actually writing the mb info. */
2549 s->last_mb_info = put_bits_count(&s->pb)/8;
2550 if (!s->mb_info_size)
2551 s->mb_info_size += 12;
2555 static int encode_thread(AVCodecContext *c, void *arg){
2556 MpegEncContext *s= *(void**)arg;
2557 int mb_x, mb_y, pdif = 0;
2558 int chr_h= 16>>s->chroma_y_shift;
2560 MpegEncContext best_s = { 0 }, backup_s;
2561 uint8_t bit_buf[2][MAX_MB_BYTES];
2562 uint8_t bit_buf2[2][MAX_MB_BYTES];
2563 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2564 PutBitContext pb[2], pb2[2], tex_pb[2];
2567 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2568 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2569 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2572 s->last_bits= put_bits_count(&s->pb);
2583 /* init last dc values */
2584 /* note: quant matrix value (8) is implied here */
2585 s->last_dc[i] = 128 << s->intra_dc_precision;
2587 s->current_picture.f->error[i] = 0;
2590 memset(s->last_mv, 0, sizeof(s->last_mv));
2594 switch(s->codec_id){
2595 case AV_CODEC_ID_H263:
2596 case AV_CODEC_ID_H263P:
2597 case AV_CODEC_ID_FLV1:
2598 if (CONFIG_H263_ENCODER)
2599 s->gob_index = H263_GOB_HEIGHT(s->height);
2601 case AV_CODEC_ID_MPEG4:
2602 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2603 ff_mpeg4_init_partitions(s);
2609 s->first_slice_line = 1;
2610 s->ptr_lastgob = s->pb.buf;
2611 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2615 ff_set_qscale(s, s->qscale);
2616 ff_init_block_index(s);
2618 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2619 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2620 int mb_type= s->mb_type[xy];
2625 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2626 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2629 if(s->data_partitioning){
2630 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2631 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2632 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2638 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2639 ff_update_block_index(s);
2641 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2642 ff_h261_reorder_mb_index(s);
2643 xy= s->mb_y*s->mb_stride + s->mb_x;
2644 mb_type= s->mb_type[xy];
2647 /* write gob / video packet header */
2649 int current_packet_size, is_gob_start;
2651 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2653 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2655 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2657 switch(s->codec_id){
2658 case AV_CODEC_ID_H263:
2659 case AV_CODEC_ID_H263P:
2660 if(!s->h263_slice_structured)
2661 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2663 case AV_CODEC_ID_MPEG2VIDEO:
2664 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2665 case AV_CODEC_ID_MPEG1VIDEO:
2666 if(s->mb_skip_run) is_gob_start=0;
2671 if(s->start_mb_y != mb_y || mb_x!=0){
2674 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2675 ff_mpeg4_init_partitions(s);
2679 assert((put_bits_count(&s->pb)&7) == 0);
2680 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2682 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2683 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2684 int d = 100 / s->error_rate;
2686 current_packet_size=0;
2687 s->pb.buf_ptr= s->ptr_lastgob;
2688 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2692 if (s->avctx->rtp_callback){
2693 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2694 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2696 update_mb_info(s, 1);
2698 switch(s->codec_id){
2699 case AV_CODEC_ID_MPEG4:
2700 if (CONFIG_MPEG4_ENCODER) {
2701 ff_mpeg4_encode_video_packet_header(s);
2702 ff_mpeg4_clean_buffers(s);
2705 case AV_CODEC_ID_MPEG1VIDEO:
2706 case AV_CODEC_ID_MPEG2VIDEO:
2707 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2708 ff_mpeg1_encode_slice_header(s);
2709 ff_mpeg1_clean_buffers(s);
2712 case AV_CODEC_ID_H263:
2713 case AV_CODEC_ID_H263P:
2714 if (CONFIG_H263_ENCODER)
2715 ff_h263_encode_gob_header(s, mb_y);
2719 if (s->avctx->flags & CODEC_FLAG_PASS1) {
2720 int bits= put_bits_count(&s->pb);
2721 s->misc_bits+= bits - s->last_bits;
2725 s->ptr_lastgob += current_packet_size;
2726 s->first_slice_line=1;
2727 s->resync_mb_x=mb_x;
2728 s->resync_mb_y=mb_y;
2732 if( (s->resync_mb_x == s->mb_x)
2733 && s->resync_mb_y+1 == s->mb_y){
2734 s->first_slice_line=0;
2738 s->dquant=0; //only for QP_RD
2740 update_mb_info(s, 0);
2742 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
2744 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2746 copy_context_before_encode(&backup_s, s, -1);
2748 best_s.data_partitioning= s->data_partitioning;
2749 best_s.partitioned_frame= s->partitioned_frame;
2750 if(s->data_partitioning){
2751 backup_s.pb2= s->pb2;
2752 backup_s.tex_pb= s->tex_pb;
2755 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2756 s->mv_dir = MV_DIR_FORWARD;
2757 s->mv_type = MV_TYPE_16X16;
2759 s->mv[0][0][0] = s->p_mv_table[xy][0];
2760 s->mv[0][0][1] = s->p_mv_table[xy][1];
2761 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2762 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2764 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2765 s->mv_dir = MV_DIR_FORWARD;
2766 s->mv_type = MV_TYPE_FIELD;
2769 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2770 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2771 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2773 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2774 &dmin, &next_block, 0, 0);
2776 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2777 s->mv_dir = MV_DIR_FORWARD;
2778 s->mv_type = MV_TYPE_16X16;
2782 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2783 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2785 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2786 s->mv_dir = MV_DIR_FORWARD;
2787 s->mv_type = MV_TYPE_8X8;
2790 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2791 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2793 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2794 &dmin, &next_block, 0, 0);
2796 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2797 s->mv_dir = MV_DIR_FORWARD;
2798 s->mv_type = MV_TYPE_16X16;
2800 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2801 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2802 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2803 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2805 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2806 s->mv_dir = MV_DIR_BACKWARD;
2807 s->mv_type = MV_TYPE_16X16;
2809 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2810 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2811 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2812 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2814 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2815 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2816 s->mv_type = MV_TYPE_16X16;
2818 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2819 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2820 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2821 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2822 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2823 &dmin, &next_block, 0, 0);
2825 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2826 s->mv_dir = MV_DIR_FORWARD;
2827 s->mv_type = MV_TYPE_FIELD;
2830 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2831 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2832 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2834 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2835 &dmin, &next_block, 0, 0);
2837 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2838 s->mv_dir = MV_DIR_BACKWARD;
2839 s->mv_type = MV_TYPE_FIELD;
2842 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2843 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2844 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2846 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2847 &dmin, &next_block, 0, 0);
2849 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2850 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2851 s->mv_type = MV_TYPE_FIELD;
2853 for(dir=0; dir<2; dir++){
2855 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2856 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2857 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2860 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2861 &dmin, &next_block, 0, 0);
2863 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2865 s->mv_type = MV_TYPE_16X16;
2869 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2870 &dmin, &next_block, 0, 0);
2871 if(s->h263_pred || s->h263_aic){
2873 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2875 ff_clean_intra_table_entries(s); //old mode?
2879 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2880 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2881 const int last_qp= backup_s.qscale;
2884 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2885 static const int dquant_tab[4]={-1,1,-2,2};
2887 assert(backup_s.dquant == 0);
2890 s->mv_dir= best_s.mv_dir;
2891 s->mv_type = MV_TYPE_16X16;
2892 s->mb_intra= best_s.mb_intra;
2893 s->mv[0][0][0] = best_s.mv[0][0][0];
2894 s->mv[0][0][1] = best_s.mv[0][0][1];
2895 s->mv[1][0][0] = best_s.mv[1][0][0];
2896 s->mv[1][0][1] = best_s.mv[1][0][1];
2898 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2899 for(; qpi<4; qpi++){
2900 int dquant= dquant_tab[qpi];
2901 qp= last_qp + dquant;
2902 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2904 backup_s.dquant= dquant;
2905 if(s->mb_intra && s->dc_val[0]){
2907 dc[i]= s->dc_val[0][ s->block_index[i] ];
2908 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2912 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2913 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2914 if(best_s.qscale != qp){
2915 if(s->mb_intra && s->dc_val[0]){
2917 s->dc_val[0][ s->block_index[i] ]= dc[i];
2918 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2925 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2926 int mx= s->b_direct_mv_table[xy][0];
2927 int my= s->b_direct_mv_table[xy][1];
2929 backup_s.dquant = 0;
2930 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2932 ff_mpeg4_set_direct_mv(s, mx, my);
2933 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2934 &dmin, &next_block, mx, my);
2936 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2937 backup_s.dquant = 0;
2938 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2940 ff_mpeg4_set_direct_mv(s, 0, 0);
2941 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2942 &dmin, &next_block, 0, 0);
2944 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2947 coded |= s->block_last_index[i];
2950 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2951 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2952 mx=my=0; //FIXME find the one we actually used
2953 ff_mpeg4_set_direct_mv(s, mx, my);
2954 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2962 s->mv_dir= best_s.mv_dir;
2963 s->mv_type = best_s.mv_type;
2965 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2966 s->mv[0][0][1] = best_s.mv[0][0][1];
2967 s->mv[1][0][0] = best_s.mv[1][0][0];
2968 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2971 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2972 &dmin, &next_block, mx, my);
2977 s->current_picture.qscale_table[xy] = best_s.qscale;
2979 copy_context_after_encode(s, &best_s, -1);
2981 pb_bits_count= put_bits_count(&s->pb);
2982 flush_put_bits(&s->pb);
2983 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2986 if(s->data_partitioning){
2987 pb2_bits_count= put_bits_count(&s->pb2);
2988 flush_put_bits(&s->pb2);
2989 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2990 s->pb2= backup_s.pb2;
2992 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2993 flush_put_bits(&s->tex_pb);
2994 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2995 s->tex_pb= backup_s.tex_pb;
2997 s->last_bits= put_bits_count(&s->pb);
2999 if (CONFIG_H263_ENCODER &&
3000 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3001 ff_h263_update_motion_val(s);
3003 if(next_block==0){ //FIXME 16 vs linesize16
3004 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3005 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3006 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3009 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3010 ff_mpv_decode_mb(s, s->block);
3012 int motion_x = 0, motion_y = 0;
3013 s->mv_type=MV_TYPE_16X16;
3014 // only one MB-Type possible
3017 case CANDIDATE_MB_TYPE_INTRA:
3020 motion_x= s->mv[0][0][0] = 0;
3021 motion_y= s->mv[0][0][1] = 0;
3023 case CANDIDATE_MB_TYPE_INTER:
3024 s->mv_dir = MV_DIR_FORWARD;
3026 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3027 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3029 case CANDIDATE_MB_TYPE_INTER_I:
3030 s->mv_dir = MV_DIR_FORWARD;
3031 s->mv_type = MV_TYPE_FIELD;
3034 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3035 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3036 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3039 case CANDIDATE_MB_TYPE_INTER4V:
3040 s->mv_dir = MV_DIR_FORWARD;
3041 s->mv_type = MV_TYPE_8X8;
3044 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3045 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3048 case CANDIDATE_MB_TYPE_DIRECT:
3049 if (CONFIG_MPEG4_ENCODER) {
3050 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3052 motion_x=s->b_direct_mv_table[xy][0];
3053 motion_y=s->b_direct_mv_table[xy][1];
3054 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3057 case CANDIDATE_MB_TYPE_DIRECT0:
3058 if (CONFIG_MPEG4_ENCODER) {
3059 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3061 ff_mpeg4_set_direct_mv(s, 0, 0);
3064 case CANDIDATE_MB_TYPE_BIDIR:
3065 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3067 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3068 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3069 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3070 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3072 case CANDIDATE_MB_TYPE_BACKWARD:
3073 s->mv_dir = MV_DIR_BACKWARD;
3075 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3076 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3078 case CANDIDATE_MB_TYPE_FORWARD:
3079 s->mv_dir = MV_DIR_FORWARD;
3081 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3082 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3084 case CANDIDATE_MB_TYPE_FORWARD_I:
3085 s->mv_dir = MV_DIR_FORWARD;
3086 s->mv_type = MV_TYPE_FIELD;
3089 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3090 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3091 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3094 case CANDIDATE_MB_TYPE_BACKWARD_I:
3095 s->mv_dir = MV_DIR_BACKWARD;
3096 s->mv_type = MV_TYPE_FIELD;
3099 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3100 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3101 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3104 case CANDIDATE_MB_TYPE_BIDIR_I:
3105 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3106 s->mv_type = MV_TYPE_FIELD;
3108 for(dir=0; dir<2; dir++){
3110 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3111 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3112 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3117 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3120 encode_mb(s, motion_x, motion_y);
3122 // RAL: Update last macroblock type
3123 s->last_mv_dir = s->mv_dir;
3125 if (CONFIG_H263_ENCODER &&
3126 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3127 ff_h263_update_motion_val(s);
3129 ff_mpv_decode_mb(s, s->block);
3132 /* clean the MV table in IPS frames for direct mode in B frames */
3133 if(s->mb_intra /* && I,P,S_TYPE */){
3134 s->p_mv_table[xy][0]=0;
3135 s->p_mv_table[xy][1]=0;
3138 if (s->avctx->flags & CODEC_FLAG_PSNR) {
3142 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3143 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3145 s->current_picture.f->error[0] += sse(
3146 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3147 s->dest[0], w, h, s->linesize);
3148 s->current_picture.f->error[1] += sse(
3149 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3150 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3151 s->current_picture.f->error[2] += sse(
3152 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3153 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3156 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3157 ff_h263_loop_filter(s);
3159 ff_dlog(s->avctx, "MB %d %d bits\n",
3160 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3164 //not beautiful here but we must write it before flushing so it has to be here
3165 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3166 ff_msmpeg4_encode_ext_header(s);
3170 /* Send the last GOB if RTP */
3171 if (s->avctx->rtp_callback) {
3172 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3173 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3174 /* Call the RTP callback to send the last GOB */
3176 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3182 #define MERGE(field) dst->field += src->field; src->field=0
3183 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3184 MERGE(me.scene_change_score);
3185 MERGE(me.mc_mb_var_sum_temp);
3186 MERGE(me.mb_var_sum_temp);
3189 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3192 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3193 MERGE(dct_count[1]);
3202 MERGE(er.error_count);
3203 MERGE(padding_bug_score);
3204 MERGE(current_picture.f->error[0]);
3205 MERGE(current_picture.f->error[1]);
3206 MERGE(current_picture.f->error[2]);
3208 if(dst->avctx->noise_reduction){
3209 for(i=0; i<64; i++){
3210 MERGE(dct_error_sum[0][i]);
3211 MERGE(dct_error_sum[1][i]);
3215 assert(put_bits_count(&src->pb) % 8 ==0);
3216 assert(put_bits_count(&dst->pb) % 8 ==0);
3217 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3218 flush_put_bits(&dst->pb);
3221 static int estimate_qp(MpegEncContext *s, int dry_run){
3222 if (s->next_lambda){
3223 s->current_picture_ptr->f->quality =
3224 s->current_picture.f->quality = s->next_lambda;
3225 if(!dry_run) s->next_lambda= 0;
3226 } else if (!s->fixed_qscale) {
3227 s->current_picture_ptr->f->quality =
3228 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3229 if (s->current_picture.f->quality < 0)
3233 if(s->adaptive_quant){
3234 switch(s->codec_id){
3235 case AV_CODEC_ID_MPEG4:
3236 if (CONFIG_MPEG4_ENCODER)
3237 ff_clean_mpeg4_qscales(s);
3239 case AV_CODEC_ID_H263:
3240 case AV_CODEC_ID_H263P:
3241 case AV_CODEC_ID_FLV1:
3242 if (CONFIG_H263_ENCODER)
3243 ff_clean_h263_qscales(s);
3246 ff_init_qscale_tab(s);
3249 s->lambda= s->lambda_table[0];
3252 s->lambda = s->current_picture.f->quality;
3257 /* must be called before writing the header */
3258 static void set_frame_distances(MpegEncContext * s){
3259 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3260 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3262 if(s->pict_type==AV_PICTURE_TYPE_B){
3263 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3264 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3266 s->pp_time= s->time - s->last_non_b_time;
3267 s->last_non_b_time= s->time;
3268 assert(s->picture_number==0 || s->pp_time > 0);
3272 static int encode_picture(MpegEncContext *s, int picture_number)
3276 int context_count = s->slice_context_count;
3278 s->picture_number = picture_number;
3280 /* Reset the average MB variance */
3281 s->me.mb_var_sum_temp =
3282 s->me.mc_mb_var_sum_temp = 0;
3284 /* we need to initialize some time vars before we can encode b-frames */
3285 // RAL: Condition added for MPEG1VIDEO
3286 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3287 set_frame_distances(s);
3288 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3289 ff_set_mpeg4_time(s);
3291 s->me.scene_change_score=0;
3293 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3295 if(s->pict_type==AV_PICTURE_TYPE_I){
3296 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3297 else s->no_rounding=0;
3298 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3299 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3300 s->no_rounding ^= 1;
3303 if (s->avctx->flags & CODEC_FLAG_PASS2) {
3304 if (estimate_qp(s,1) < 0)
3306 ff_get_2pass_fcode(s);
3307 } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
3308 if(s->pict_type==AV_PICTURE_TYPE_B)
3309 s->lambda= s->last_lambda_for[s->pict_type];
3311 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3315 s->mb_intra=0; //for the rate distortion & bit compare functions
3316 for(i=1; i<context_count; i++){
3317 ret = ff_update_duplicate_context(s->thread_context[i], s);
3325 /* Estimate motion for every MB */
3326 if(s->pict_type != AV_PICTURE_TYPE_I){
3327 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3328 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3329 if (s->pict_type != AV_PICTURE_TYPE_B) {
3330 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3331 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3335 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3336 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3338 for(i=0; i<s->mb_stride*s->mb_height; i++)
3339 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3341 if(!s->fixed_qscale){
3342 /* finding spatial complexity for I-frame rate control */
3343 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3346 for(i=1; i<context_count; i++){
3347 merge_context_after_me(s, s->thread_context[i]);
3349 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3350 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3353 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3354 s->pict_type= AV_PICTURE_TYPE_I;
3355 for(i=0; i<s->mb_stride*s->mb_height; i++)
3356 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3357 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3358 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3362 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3363 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3365 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3367 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3368 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3369 s->f_code= FFMAX3(s->f_code, a, b);
3372 ff_fix_long_p_mvs(s);
3373 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3374 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3378 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3379 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3384 if(s->pict_type==AV_PICTURE_TYPE_B){
3387 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3388 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3389 s->f_code = FFMAX(a, b);
3391 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3392 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3393 s->b_code = FFMAX(a, b);
3395 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3396 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3397 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3398 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3399 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3401 for(dir=0; dir<2; dir++){
3404 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3405 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3406 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3407 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3415 if (estimate_qp(s, 0) < 0)
3418 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3419 s->pict_type == AV_PICTURE_TYPE_I &&
3420 !(s->avctx->flags & CODEC_FLAG_QSCALE))
3421 s->qscale= 3; //reduce clipping problems
3423 if (s->out_format == FMT_MJPEG) {
3424 /* for mjpeg, we do include qscale in the matrix */
3426 int j = s->idsp.idct_permutation[i];
3428 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3430 s->y_dc_scale_table=
3431 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3432 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3433 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3434 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3438 //FIXME var duplication
3439 s->current_picture_ptr->f->key_frame =
3440 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3441 s->current_picture_ptr->f->pict_type =
3442 s->current_picture.f->pict_type = s->pict_type;
3444 if (s->current_picture.f->key_frame)
3445 s->picture_in_gop_number=0;
3447 s->last_bits= put_bits_count(&s->pb);
3448 switch(s->out_format) {
3450 if (CONFIG_MJPEG_ENCODER)
3451 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3455 if (CONFIG_H261_ENCODER)
3456 ff_h261_encode_picture_header(s, picture_number);
3459 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3460 ff_wmv2_encode_picture_header(s, picture_number);
3461 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3462 ff_msmpeg4_encode_picture_header(s, picture_number);
3463 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3464 ff_mpeg4_encode_picture_header(s, picture_number);
3465 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3466 ret = ff_rv10_encode_picture_header(s, picture_number);
3470 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3471 ff_rv20_encode_picture_header(s, picture_number);
3472 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3473 ff_flv_encode_picture_header(s, picture_number);
3474 else if (CONFIG_H263_ENCODER)
3475 ff_h263_encode_picture_header(s, picture_number);
3478 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3479 ff_mpeg1_encode_picture_header(s, picture_number);
3484 bits= put_bits_count(&s->pb);
3485 s->header_bits= bits - s->last_bits;
3487 for(i=1; i<context_count; i++){
3488 update_duplicate_context_after_me(s->thread_context[i], s);
3490 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3491 for(i=1; i<context_count; i++){
3492 merge_context_after_encode(s, s->thread_context[i]);
3498 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3499 const int intra= s->mb_intra;
3502 s->dct_count[intra]++;
3504 for(i=0; i<64; i++){
3505 int level= block[i];
3509 s->dct_error_sum[intra][i] += level;
3510 level -= s->dct_offset[intra][i];
3511 if(level<0) level=0;
3513 s->dct_error_sum[intra][i] -= level;
3514 level += s->dct_offset[intra][i];
3515 if(level>0) level=0;
3522 static int dct_quantize_trellis_c(MpegEncContext *s,
3523 int16_t *block, int n,
3524 int qscale, int *overflow){
3526 const uint8_t *scantable= s->intra_scantable.scantable;
3527 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3529 unsigned int threshold1, threshold2;
3541 int coeff_count[64];
3542 int qmul, qadd, start_i, last_non_zero, i, dc;
3543 const int esc_length= s->ac_esc_length;
3545 uint8_t * last_length;
3546 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3548 s->fdsp.fdct(block);
3550 if(s->dct_error_sum)
3551 s->denoise_dct(s, block);
3553 qadd= ((qscale-1)|1)*8;
3564 /* For AIC we skip quant/dequant of INTRADC */
3569 /* note: block[0] is assumed to be positive */
3570 block[0] = (block[0] + (q >> 1)) / q;
3573 qmat = s->q_intra_matrix[qscale];
3574 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3575 bias= 1<<(QMAT_SHIFT-1);
3576 length = s->intra_ac_vlc_length;
3577 last_length= s->intra_ac_vlc_last_length;
3581 qmat = s->q_inter_matrix[qscale];
3582 length = s->inter_ac_vlc_length;
3583 last_length= s->inter_ac_vlc_last_length;
3587 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3588 threshold2= (threshold1<<1);
3590 for(i=63; i>=start_i; i--) {
3591 const int j = scantable[i];
3592 int level = block[j] * qmat[j];
3594 if(((unsigned)(level+threshold1))>threshold2){
3600 for(i=start_i; i<=last_non_zero; i++) {
3601 const int j = scantable[i];
3602 int level = block[j] * qmat[j];
3604 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3605 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3606 if(((unsigned)(level+threshold1))>threshold2){
3608 level= (bias + level)>>QMAT_SHIFT;
3610 coeff[1][i]= level-1;
3611 // coeff[2][k]= level-2;
3613 level= (bias - level)>>QMAT_SHIFT;
3614 coeff[0][i]= -level;
3615 coeff[1][i]= -level+1;
3616 // coeff[2][k]= -level+2;
3618 coeff_count[i]= FFMIN(level, 2);
3619 assert(coeff_count[i]);
3622 coeff[0][i]= (level>>31)|1;
3627 *overflow= s->max_qcoeff < max; //overflow might have happened
3629 if(last_non_zero < start_i){
3630 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3631 return last_non_zero;
3634 score_tab[start_i]= 0;
3635 survivor[0]= start_i;
3638 for(i=start_i; i<=last_non_zero; i++){
3639 int level_index, j, zero_distortion;
3640 int dct_coeff= FFABS(block[ scantable[i] ]);
3641 int best_score=256*256*256*120;
3643 if (s->fdsp.fdct == ff_fdct_ifast)
3644 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3645 zero_distortion= dct_coeff*dct_coeff;
3647 for(level_index=0; level_index < coeff_count[i]; level_index++){
3649 int level= coeff[level_index][i];
3650 const int alevel= FFABS(level);
3655 if(s->out_format == FMT_H263){
3656 unquant_coeff= alevel*qmul + qadd;
3658 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3660 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3661 unquant_coeff = (unquant_coeff - 1) | 1;
3663 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3664 unquant_coeff = (unquant_coeff - 1) | 1;
3669 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3671 if((level&(~127)) == 0){
3672 for(j=survivor_count-1; j>=0; j--){
3673 int run= i - survivor[j];
3674 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3675 score += score_tab[i-run];
3677 if(score < best_score){
3680 level_tab[i+1]= level-64;
3684 if(s->out_format == FMT_H263){
3685 for(j=survivor_count-1; j>=0; j--){
3686 int run= i - survivor[j];
3687 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3688 score += score_tab[i-run];
3689 if(score < last_score){
3692 last_level= level-64;
3698 distortion += esc_length*lambda;
3699 for(j=survivor_count-1; j>=0; j--){
3700 int run= i - survivor[j];
3701 int score= distortion + score_tab[i-run];
3703 if(score < best_score){
3706 level_tab[i+1]= level-64;
3710 if(s->out_format == FMT_H263){
3711 for(j=survivor_count-1; j>=0; j--){
3712 int run= i - survivor[j];
3713 int score= distortion + score_tab[i-run];
3714 if(score < last_score){
3717 last_level= level-64;
3725 score_tab[i+1]= best_score;
3727 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3728 if(last_non_zero <= 27){
3729 for(; survivor_count; survivor_count--){
3730 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3734 for(; survivor_count; survivor_count--){
3735 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3740 survivor[ survivor_count++ ]= i+1;
3743 if(s->out_format != FMT_H263){
3744 last_score= 256*256*256*120;
3745 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3746 int score= score_tab[i];
3747 if(i) score += lambda*2; //FIXME exacter?
3749 if(score < last_score){
3752 last_level= level_tab[i];
3753 last_run= run_tab[i];
3758 s->coded_score[n] = last_score;
3760 dc= FFABS(block[0]);
3761 last_non_zero= last_i - 1;
3762 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3764 if(last_non_zero < start_i)
3765 return last_non_zero;
3767 if(last_non_zero == 0 && start_i == 0){
3769 int best_score= dc * dc;
3771 for(i=0; i<coeff_count[0]; i++){
3772 int level= coeff[i][0];
3773 int alevel= FFABS(level);
3774 int unquant_coeff, score, distortion;
3776 if(s->out_format == FMT_H263){
3777 unquant_coeff= (alevel*qmul + qadd)>>3;
3779 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3780 unquant_coeff = (unquant_coeff - 1) | 1;
3782 unquant_coeff = (unquant_coeff + 4) >> 3;
3783 unquant_coeff<<= 3 + 3;
3785 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3787 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3788 else score= distortion + esc_length*lambda;
3790 if(score < best_score){
3792 best_level= level - 64;
3795 block[0]= best_level;
3796 s->coded_score[n] = best_score - dc*dc;
3797 if(best_level == 0) return -1;
3798 else return last_non_zero;
3804 block[ perm_scantable[last_non_zero] ]= last_level;
3807 for(; i>start_i; i -= run_tab[i] + 1){
3808 block[ perm_scantable[i-1] ]= level_tab[i];
3811 return last_non_zero;
3814 //#define REFINE_STATS 1
3815 static int16_t basis[64][64];
3817 static void build_basis(uint8_t *perm){
3824 double s= 0.25*(1<<BASIS_SHIFT);
3826 int perm_index= perm[index];
3827 if(i==0) s*= sqrt(0.5);
3828 if(j==0) s*= sqrt(0.5);
3829 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)));
3836 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3837 int16_t *block, int16_t *weight, int16_t *orig,
3840 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3841 const uint8_t *scantable= s->intra_scantable.scantable;
3842 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3843 // unsigned int threshold1, threshold2;
3848 int qmul, qadd, start_i, last_non_zero, i, dc;
3850 uint8_t * last_length;
3852 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3855 static int after_last=0;
3856 static int to_zero=0;
3857 static int from_zero=0;
3860 static int messed_sign=0;
3863 if(basis[0][0] == 0)
3864 build_basis(s->idsp.idct_permutation);
3875 /* For AIC we skip quant/dequant of INTRADC */
3879 q <<= RECON_SHIFT-3;
3880 /* note: block[0] is assumed to be positive */
3882 // block[0] = (block[0] + (q >> 1)) / q;
3884 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3885 // bias= 1<<(QMAT_SHIFT-1);
3886 length = s->intra_ac_vlc_length;
3887 last_length= s->intra_ac_vlc_last_length;
3891 length = s->inter_ac_vlc_length;
3892 last_length= s->inter_ac_vlc_last_length;
3894 last_non_zero = s->block_last_index[n];
3899 dc += (1<<(RECON_SHIFT-1));
3900 for(i=0; i<64; i++){
3901 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3904 STOP_TIMER("memset rem[]")}
3907 for(i=0; i<64; i++){
3912 w= FFABS(weight[i]) + qns*one;
3913 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3916 // w=weight[i] = (63*qns + (w/2)) / w;
3922 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3928 for(i=start_i; i<=last_non_zero; i++){
3929 int j= perm_scantable[i];
3930 const int level= block[j];
3934 if(level<0) coeff= qmul*level - qadd;
3935 else coeff= qmul*level + qadd;
3936 run_tab[rle_index++]=run;
3939 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3945 if(last_non_zero>0){
3946 STOP_TIMER("init rem[]")
3953 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3956 int run2, best_unquant_change=0, analyze_gradient;
3960 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3962 if(analyze_gradient){
3966 for(i=0; i<64; i++){
3969 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3972 STOP_TIMER("rem*w*w")}
3982 const int level= block[0];
3983 int change, old_coeff;
3985 assert(s->mb_intra);
3989 for(change=-1; change<=1; change+=2){
3990 int new_level= level + change;
3991 int score, new_coeff;
3993 new_coeff= q*new_level;
3994 if(new_coeff >= 2048 || new_coeff < 0)
3997 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3998 new_coeff - old_coeff);
3999 if(score<best_score){
4002 best_change= change;
4003 best_unquant_change= new_coeff - old_coeff;
4010 run2= run_tab[rle_index++];
4014 for(i=start_i; i<64; i++){
4015 int j= perm_scantable[i];
4016 const int level= block[j];
4017 int change, old_coeff;
4019 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4023 if(level<0) old_coeff= qmul*level - qadd;
4024 else old_coeff= qmul*level + qadd;
4025 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4029 assert(run2>=0 || i >= last_non_zero );
4032 for(change=-1; change<=1; change+=2){
4033 int new_level= level + change;
4034 int score, new_coeff, unquant_change;
4037 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4041 if(new_level<0) new_coeff= qmul*new_level - qadd;
4042 else new_coeff= qmul*new_level + qadd;
4043 if(new_coeff >= 2048 || new_coeff <= -2048)
4045 //FIXME check for overflow
4048 if(level < 63 && level > -63){
4049 if(i < last_non_zero)
4050 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4051 - length[UNI_AC_ENC_INDEX(run, level+64)];
4053 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4054 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4057 assert(FFABS(new_level)==1);
4059 if(analyze_gradient){
4060 int g= d1[ scantable[i] ];
4061 if(g && (g^new_level) >= 0)
4065 if(i < last_non_zero){
4066 int next_i= i + run2 + 1;
4067 int next_level= block[ perm_scantable[next_i] ] + 64;
4069 if(next_level&(~127))
4072 if(next_i < last_non_zero)
4073 score += length[UNI_AC_ENC_INDEX(run, 65)]
4074 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4075 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4077 score += length[UNI_AC_ENC_INDEX(run, 65)]
4078 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4079 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4081 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4083 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4084 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4090 assert(FFABS(level)==1);
4092 if(i < last_non_zero){
4093 int next_i= i + run2 + 1;
4094 int next_level= block[ perm_scantable[next_i] ] + 64;
4096 if(next_level&(~127))
4099 if(next_i < last_non_zero)
4100 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4101 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4102 - length[UNI_AC_ENC_INDEX(run, 65)];
4104 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4105 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4106 - length[UNI_AC_ENC_INDEX(run, 65)];
4108 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4110 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4111 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4118 unquant_change= new_coeff - old_coeff;
4119 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4121 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4123 if(score<best_score){
4126 best_change= change;
4127 best_unquant_change= unquant_change;
4131 prev_level= level + 64;
4132 if(prev_level&(~127))
4141 STOP_TIMER("iterative step")}
4145 int j= perm_scantable[ best_coeff ];
4147 block[j] += best_change;
4149 if(best_coeff > last_non_zero){
4150 last_non_zero= best_coeff;
4158 if(block[j] - best_change){
4159 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4171 for(; last_non_zero>=start_i; last_non_zero--){
4172 if(block[perm_scantable[last_non_zero]])
4178 if(256*256*256*64 % count == 0){
4179 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);
4184 for(i=start_i; i<=last_non_zero; i++){
4185 int j= perm_scantable[i];
4186 const int level= block[j];
4189 run_tab[rle_index++]=run;
4196 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4202 if(last_non_zero>0){
4203 STOP_TIMER("iterative search")
4208 return last_non_zero;
4212 * Permute an 8x8 block according to permuatation.
4213 * @param block the block which will be permuted according to
4214 * the given permutation vector
4215 * @param permutation the permutation vector
4216 * @param last the last non zero coefficient in scantable order, used to
4217 * speed the permutation up
4218 * @param scantable the used scantable, this is only used to speed the
4219 * permutation up, the block is not (inverse) permutated
4220 * to scantable order!
4222 static void block_permute(int16_t *block, uint8_t *permutation,
4223 const uint8_t *scantable, int last)
4230 //FIXME it is ok but not clean and might fail for some permutations
4231 // if (permutation[1] == 1)
4234 for (i = 0; i <= last; i++) {
4235 const int j = scantable[i];
4240 for (i = 0; i <= last; i++) {
4241 const int j = scantable[i];
4242 const int perm_j = permutation[j];
4243 block[perm_j] = temp[j];
4247 int ff_dct_quantize_c(MpegEncContext *s,
4248 int16_t *block, int n,
4249 int qscale, int *overflow)
4251 int i, j, level, last_non_zero, q, start_i;
4253 const uint8_t *scantable= s->intra_scantable.scantable;
4256 unsigned int threshold1, threshold2;
4258 s->fdsp.fdct(block);
4260 if(s->dct_error_sum)
4261 s->denoise_dct(s, block);
4271 /* For AIC we skip quant/dequant of INTRADC */
4274 /* note: block[0] is assumed to be positive */
4275 block[0] = (block[0] + (q >> 1)) / q;
4278 qmat = s->q_intra_matrix[qscale];
4279 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4283 qmat = s->q_inter_matrix[qscale];
4284 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4286 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4287 threshold2= (threshold1<<1);
4288 for(i=63;i>=start_i;i--) {
4290 level = block[j] * qmat[j];
4292 if(((unsigned)(level+threshold1))>threshold2){
4299 for(i=start_i; i<=last_non_zero; i++) {
4301 level = block[j] * qmat[j];
4303 // if( bias+level >= (1<<QMAT_SHIFT)
4304 // || bias-level >= (1<<QMAT_SHIFT)){
4305 if(((unsigned)(level+threshold1))>threshold2){
4307 level= (bias + level)>>QMAT_SHIFT;
4310 level= (bias - level)>>QMAT_SHIFT;
4318 *overflow= s->max_qcoeff < max; //overflow might have happened
4320 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4321 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4322 block_permute(block, s->idsp.idct_permutation,
4323 scantable, last_non_zero);
4325 return last_non_zero;
4328 #define OFFSET(x) offsetof(MpegEncContext, x)
4329 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4330 static const AVOption h263_options[] = {
4331 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4332 { "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},
4333 { "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 },
4338 static const AVClass h263_class = {
4339 .class_name = "H.263 encoder",
4340 .item_name = av_default_item_name,
4341 .option = h263_options,
4342 .version = LIBAVUTIL_VERSION_INT,
4345 AVCodec ff_h263_encoder = {
4347 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4348 .type = AVMEDIA_TYPE_VIDEO,
4349 .id = AV_CODEC_ID_H263,
4350 .priv_data_size = sizeof(MpegEncContext),
4351 .init = ff_mpv_encode_init,
4352 .encode2 = ff_mpv_encode_picture,
4353 .close = ff_mpv_encode_end,
4354 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4355 .priv_class = &h263_class,
4358 static const AVOption h263p_options[] = {
4359 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4360 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4361 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4362 { "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},
4366 static const AVClass h263p_class = {
4367 .class_name = "H.263p encoder",
4368 .item_name = av_default_item_name,
4369 .option = h263p_options,
4370 .version = LIBAVUTIL_VERSION_INT,
4373 AVCodec ff_h263p_encoder = {
4375 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4376 .type = AVMEDIA_TYPE_VIDEO,
4377 .id = AV_CODEC_ID_H263P,
4378 .priv_data_size = sizeof(MpegEncContext),
4379 .init = ff_mpv_encode_init,
4380 .encode2 = ff_mpv_encode_picture,
4381 .close = ff_mpv_encode_end,
4382 .capabilities = CODEC_CAP_SLICE_THREADS,
4383 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4384 .priv_class = &h263p_class,
4387 static const AVClass msmpeg4v2_class = {
4388 .class_name = "msmpeg4v2 encoder",
4389 .item_name = av_default_item_name,
4390 .option = ff_mpv_generic_options,
4391 .version = LIBAVUTIL_VERSION_INT,
4394 AVCodec ff_msmpeg4v2_encoder = {
4395 .name = "msmpeg4v2",
4396 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4397 .type = AVMEDIA_TYPE_VIDEO,
4398 .id = AV_CODEC_ID_MSMPEG4V2,
4399 .priv_data_size = sizeof(MpegEncContext),
4400 .init = ff_mpv_encode_init,
4401 .encode2 = ff_mpv_encode_picture,
4402 .close = ff_mpv_encode_end,
4403 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4404 .priv_class = &msmpeg4v2_class,
4407 static const AVClass msmpeg4v3_class = {
4408 .class_name = "msmpeg4v3 encoder",
4409 .item_name = av_default_item_name,
4410 .option = ff_mpv_generic_options,
4411 .version = LIBAVUTIL_VERSION_INT,
4414 AVCodec ff_msmpeg4v3_encoder = {
4416 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4417 .type = AVMEDIA_TYPE_VIDEO,
4418 .id = AV_CODEC_ID_MSMPEG4V3,
4419 .priv_data_size = sizeof(MpegEncContext),
4420 .init = ff_mpv_encode_init,
4421 .encode2 = ff_mpv_encode_picture,
4422 .close = ff_mpv_encode_end,
4423 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4424 .priv_class = &msmpeg4v3_class,
4427 static const AVClass wmv1_class = {
4428 .class_name = "wmv1 encoder",
4429 .item_name = av_default_item_name,
4430 .option = ff_mpv_generic_options,
4431 .version = LIBAVUTIL_VERSION_INT,
4434 AVCodec ff_wmv1_encoder = {
4436 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4437 .type = AVMEDIA_TYPE_VIDEO,
4438 .id = AV_CODEC_ID_WMV1,
4439 .priv_data_size = sizeof(MpegEncContext),
4440 .init = ff_mpv_encode_init,
4441 .encode2 = ff_mpv_encode_picture,
4442 .close = ff_mpv_encode_end,
4443 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4444 .priv_class = &wmv1_class,