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 s->avctx->coded_frame = s->current_picture_ptr->f;
1482 static void update_noise_reduction(MpegEncContext *s)
1486 for (intra = 0; intra < 2; intra++) {
1487 if (s->dct_count[intra] > (1 << 16)) {
1488 for (i = 0; i < 64; i++) {
1489 s->dct_error_sum[intra][i] >>= 1;
1491 s->dct_count[intra] >>= 1;
1494 for (i = 0; i < 64; i++) {
1495 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1496 s->dct_count[intra] +
1497 s->dct_error_sum[intra][i] / 2) /
1498 (s->dct_error_sum[intra][i] + 1);
1503 static int frame_start(MpegEncContext *s)
1507 /* mark & release old frames */
1508 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1509 s->last_picture_ptr != s->next_picture_ptr &&
1510 s->last_picture_ptr->f->buf[0]) {
1511 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1514 s->current_picture_ptr->f->pict_type = s->pict_type;
1515 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1517 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1518 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1519 s->current_picture_ptr)) < 0)
1522 if (s->pict_type != AV_PICTURE_TYPE_B) {
1523 s->last_picture_ptr = s->next_picture_ptr;
1525 s->next_picture_ptr = s->current_picture_ptr;
1528 if (s->last_picture_ptr) {
1529 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1530 if (s->last_picture_ptr->f->buf[0] &&
1531 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1532 s->last_picture_ptr)) < 0)
1535 if (s->next_picture_ptr) {
1536 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1537 if (s->next_picture_ptr->f->buf[0] &&
1538 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1539 s->next_picture_ptr)) < 0)
1543 if (s->picture_structure!= PICT_FRAME) {
1545 for (i = 0; i < 4; i++) {
1546 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1547 s->current_picture.f->data[i] +=
1548 s->current_picture.f->linesize[i];
1550 s->current_picture.f->linesize[i] *= 2;
1551 s->last_picture.f->linesize[i] *= 2;
1552 s->next_picture.f->linesize[i] *= 2;
1556 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1557 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1558 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1559 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1560 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1561 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1563 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1564 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1567 if (s->dct_error_sum) {
1568 assert(s->avctx->noise_reduction && s->encoding);
1569 update_noise_reduction(s);
1575 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1576 const AVFrame *pic_arg, int *got_packet)
1578 MpegEncContext *s = avctx->priv_data;
1579 int i, stuffing_count, ret;
1580 int context_count = s->slice_context_count;
1582 s->picture_in_gop_number++;
1584 if (load_input_picture(s, pic_arg) < 0)
1587 if (select_input_picture(s) < 0) {
1592 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 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1635 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1637 if (avctx->rc_buffer_size) {
1638 RateControlContext *rcc = &s->rc_context;
1639 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1641 if (put_bits_count(&s->pb) > max_size &&
1642 s->lambda < s->lmax) {
1643 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1644 (s->qscale + 1) / s->qscale);
1645 if (s->adaptive_quant) {
1647 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1648 s->lambda_table[i] =
1649 FFMAX(s->lambda_table[i] + 1,
1650 s->lambda_table[i] * (s->qscale + 1) /
1653 s->mb_skipped = 0; // done in frame_start()
1654 // done in encode_picture() so we must undo it
1655 if (s->pict_type == AV_PICTURE_TYPE_P) {
1656 if (s->flipflop_rounding ||
1657 s->codec_id == AV_CODEC_ID_H263P ||
1658 s->codec_id == AV_CODEC_ID_MPEG4)
1659 s->no_rounding ^= 1;
1661 if (s->pict_type != AV_PICTURE_TYPE_B) {
1662 s->time_base = s->last_time_base;
1663 s->last_non_b_time = s->time - s->pp_time;
1665 for (i = 0; i < context_count; i++) {
1666 PutBitContext *pb = &s->thread_context[i]->pb;
1667 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1672 assert(s->avctx->rc_max_rate);
1675 if (s->avctx->flags & CODEC_FLAG_PASS1)
1676 ff_write_pass1_stats(s);
1678 for (i = 0; i < 4; i++) {
1679 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1680 avctx->error[i] += s->current_picture_ptr->f->error[i];
1683 if (s->avctx->flags & CODEC_FLAG_PASS1)
1684 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1685 avctx->i_tex_bits + avctx->p_tex_bits ==
1686 put_bits_count(&s->pb));
1687 flush_put_bits(&s->pb);
1688 s->frame_bits = put_bits_count(&s->pb);
1690 stuffing_count = ff_vbv_update(s, s->frame_bits);
1691 if (stuffing_count) {
1692 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1693 stuffing_count + 50) {
1694 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1698 switch (s->codec_id) {
1699 case AV_CODEC_ID_MPEG1VIDEO:
1700 case AV_CODEC_ID_MPEG2VIDEO:
1701 while (stuffing_count--) {
1702 put_bits(&s->pb, 8, 0);
1705 case AV_CODEC_ID_MPEG4:
1706 put_bits(&s->pb, 16, 0);
1707 put_bits(&s->pb, 16, 0x1C3);
1708 stuffing_count -= 4;
1709 while (stuffing_count--) {
1710 put_bits(&s->pb, 8, 0xFF);
1714 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1716 flush_put_bits(&s->pb);
1717 s->frame_bits = put_bits_count(&s->pb);
1720 /* update mpeg1/2 vbv_delay for CBR */
1721 if (s->avctx->rc_max_rate &&
1722 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1723 s->out_format == FMT_MPEG1 &&
1724 90000LL * (avctx->rc_buffer_size - 1) <=
1725 s->avctx->rc_max_rate * 0xFFFFLL) {
1726 int vbv_delay, min_delay;
1727 double inbits = s->avctx->rc_max_rate *
1728 av_q2d(s->avctx->time_base);
1729 int minbits = s->frame_bits - 8 *
1730 (s->vbv_delay_ptr - s->pb.buf - 1);
1731 double bits = s->rc_context.buffer_index + minbits - inbits;
1734 av_log(s->avctx, AV_LOG_ERROR,
1735 "Internal error, negative bits\n");
1737 assert(s->repeat_first_field == 0);
1739 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1740 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1741 s->avctx->rc_max_rate;
1743 vbv_delay = FFMAX(vbv_delay, min_delay);
1745 assert(vbv_delay < 0xFFFF);
1747 s->vbv_delay_ptr[0] &= 0xF8;
1748 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1749 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1750 s->vbv_delay_ptr[2] &= 0x07;
1751 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1752 avctx->vbv_delay = vbv_delay * 300;
1754 s->total_bits += s->frame_bits;
1755 avctx->frame_bits = s->frame_bits;
1757 pkt->pts = s->current_picture.f->pts;
1758 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1759 if (!s->current_picture.f->coded_picture_number)
1760 pkt->dts = pkt->pts - s->dts_delta;
1762 pkt->dts = s->reordered_pts;
1763 s->reordered_pts = pkt->pts;
1765 pkt->dts = pkt->pts;
1766 if (s->current_picture.f->key_frame)
1767 pkt->flags |= AV_PKT_FLAG_KEY;
1769 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1773 assert((s->frame_bits & 7) == 0);
1775 pkt->size = s->frame_bits / 8;
1776 *got_packet = !!pkt->size;
1780 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1781 int n, int threshold)
1783 static const char tab[64] = {
1784 3, 2, 2, 1, 1, 1, 1, 1,
1785 1, 1, 1, 1, 1, 1, 1, 1,
1786 1, 1, 1, 1, 1, 1, 1, 1,
1787 0, 0, 0, 0, 0, 0, 0, 0,
1788 0, 0, 0, 0, 0, 0, 0, 0,
1789 0, 0, 0, 0, 0, 0, 0, 0,
1790 0, 0, 0, 0, 0, 0, 0, 0,
1791 0, 0, 0, 0, 0, 0, 0, 0
1796 int16_t *block = s->block[n];
1797 const int last_index = s->block_last_index[n];
1800 if (threshold < 0) {
1802 threshold = -threshold;
1806 /* Are all we could set to zero already zero? */
1807 if (last_index <= skip_dc - 1)
1810 for (i = 0; i <= last_index; i++) {
1811 const int j = s->intra_scantable.permutated[i];
1812 const int level = FFABS(block[j]);
1814 if (skip_dc && i == 0)
1818 } else if (level > 1) {
1824 if (score >= threshold)
1826 for (i = skip_dc; i <= last_index; i++) {
1827 const int j = s->intra_scantable.permutated[i];
1831 s->block_last_index[n] = 0;
1833 s->block_last_index[n] = -1;
1836 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1840 const int maxlevel = s->max_qcoeff;
1841 const int minlevel = s->min_qcoeff;
1845 i = 1; // skip clipping of intra dc
1849 for (; i <= last_index; i++) {
1850 const int j = s->intra_scantable.permutated[i];
1851 int level = block[j];
1853 if (level > maxlevel) {
1856 } else if (level < minlevel) {
1864 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1865 av_log(s->avctx, AV_LOG_INFO,
1866 "warning, clipping %d dct coefficients to %d..%d\n",
1867 overflow, minlevel, maxlevel);
1870 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1874 for (y = 0; y < 8; y++) {
1875 for (x = 0; x < 8; x++) {
1881 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1882 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1883 int v = ptr[x2 + y2 * stride];
1889 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1894 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1895 int motion_x, int motion_y,
1896 int mb_block_height,
1899 int16_t weight[8][64];
1900 int16_t orig[8][64];
1901 const int mb_x = s->mb_x;
1902 const int mb_y = s->mb_y;
1905 int dct_offset = s->linesize * 8; // default for progressive frames
1906 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1907 ptrdiff_t wrap_y, wrap_c;
1909 for (i = 0; i < mb_block_count; i++)
1910 skip_dct[i] = s->skipdct;
1912 if (s->adaptive_quant) {
1913 const int last_qp = s->qscale;
1914 const int mb_xy = mb_x + mb_y * s->mb_stride;
1916 s->lambda = s->lambda_table[mb_xy];
1919 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1920 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1921 s->dquant = s->qscale - last_qp;
1923 if (s->out_format == FMT_H263) {
1924 s->dquant = av_clip(s->dquant, -2, 2);
1926 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1928 if (s->pict_type == AV_PICTURE_TYPE_B) {
1929 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1932 if (s->mv_type == MV_TYPE_8X8)
1938 ff_set_qscale(s, last_qp + s->dquant);
1939 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1940 ff_set_qscale(s, s->qscale + s->dquant);
1942 wrap_y = s->linesize;
1943 wrap_c = s->uvlinesize;
1944 ptr_y = s->new_picture.f->data[0] +
1945 (mb_y * 16 * wrap_y) + mb_x * 16;
1946 ptr_cb = s->new_picture.f->data[1] +
1947 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1948 ptr_cr = s->new_picture.f->data[2] +
1949 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1951 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1952 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1953 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1955 16, 16, mb_x * 16, mb_y * 16,
1956 s->width, s->height);
1958 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1960 8, mb_block_height, mb_x * 8, mb_y * 8,
1961 s->width >> 1, s->height >> 1);
1962 ptr_cb = ebuf + 18 * wrap_y;
1963 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1965 8, mb_block_height, mb_x * 8, mb_y * 8,
1966 s->width >> 1, s->height >> 1);
1967 ptr_cr = ebuf + 18 * wrap_y + 8;
1971 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
1972 int progressive_score, interlaced_score;
1974 s->interlaced_dct = 0;
1975 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1976 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1977 NULL, wrap_y, 8) - 400;
1979 if (progressive_score > 0) {
1980 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1981 NULL, wrap_y * 2, 8) +
1982 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1983 NULL, wrap_y * 2, 8);
1984 if (progressive_score > interlaced_score) {
1985 s->interlaced_dct = 1;
1987 dct_offset = wrap_y;
1989 if (s->chroma_format == CHROMA_422)
1995 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1996 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1997 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
1998 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2000 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2004 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2005 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2006 if (!s->chroma_y_shift) { /* 422 */
2007 s->pdsp.get_pixels(s->block[6],
2008 ptr_cb + (dct_offset >> 1), wrap_c);
2009 s->pdsp.get_pixels(s->block[7],
2010 ptr_cr + (dct_offset >> 1), wrap_c);
2014 op_pixels_func (*op_pix)[4];
2015 qpel_mc_func (*op_qpix)[16];
2016 uint8_t *dest_y, *dest_cb, *dest_cr;
2018 dest_y = s->dest[0];
2019 dest_cb = s->dest[1];
2020 dest_cr = s->dest[2];
2022 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2023 op_pix = s->hdsp.put_pixels_tab;
2024 op_qpix = s->qdsp.put_qpel_pixels_tab;
2026 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2027 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2030 if (s->mv_dir & MV_DIR_FORWARD) {
2031 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2032 s->last_picture.f->data,
2034 op_pix = s->hdsp.avg_pixels_tab;
2035 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2037 if (s->mv_dir & MV_DIR_BACKWARD) {
2038 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2039 s->next_picture.f->data,
2043 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
2044 int progressive_score, interlaced_score;
2046 s->interlaced_dct = 0;
2047 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2048 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2052 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2053 progressive_score -= 400;
2055 if (progressive_score > 0) {
2056 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2058 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2062 if (progressive_score > interlaced_score) {
2063 s->interlaced_dct = 1;
2065 dct_offset = wrap_y;
2067 if (s->chroma_format == CHROMA_422)
2073 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2074 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2075 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2076 dest_y + dct_offset, wrap_y);
2077 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2078 dest_y + dct_offset + 8, wrap_y);
2080 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2084 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2085 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2086 if (!s->chroma_y_shift) { /* 422 */
2087 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2088 dest_cb + (dct_offset >> 1), wrap_c);
2089 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2090 dest_cr + (dct_offset >> 1), wrap_c);
2093 /* pre quantization */
2094 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2095 2 * s->qscale * s->qscale) {
2097 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2099 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2101 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2102 wrap_y, 8) < 20 * s->qscale)
2104 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2105 wrap_y, 8) < 20 * s->qscale)
2107 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2109 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2111 if (!s->chroma_y_shift) { /* 422 */
2112 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2113 dest_cb + (dct_offset >> 1),
2114 wrap_c, 8) < 20 * s->qscale)
2116 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2117 dest_cr + (dct_offset >> 1),
2118 wrap_c, 8) < 20 * s->qscale)
2124 if (s->quantizer_noise_shaping) {
2126 get_visual_weight(weight[0], ptr_y , wrap_y);
2128 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2130 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2132 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2134 get_visual_weight(weight[4], ptr_cb , wrap_c);
2136 get_visual_weight(weight[5], ptr_cr , wrap_c);
2137 if (!s->chroma_y_shift) { /* 422 */
2139 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2142 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2145 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2148 /* DCT & quantize */
2149 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2151 for (i = 0; i < mb_block_count; i++) {
2154 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2155 // FIXME we could decide to change to quantizer instead of
2157 // JS: I don't think that would be a good idea it could lower
2158 // quality instead of improve it. Just INTRADC clipping
2159 // deserves changes in quantizer
2161 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2163 s->block_last_index[i] = -1;
2165 if (s->quantizer_noise_shaping) {
2166 for (i = 0; i < mb_block_count; i++) {
2168 s->block_last_index[i] =
2169 dct_quantize_refine(s, s->block[i], weight[i],
2170 orig[i], i, s->qscale);
2175 if (s->luma_elim_threshold && !s->mb_intra)
2176 for (i = 0; i < 4; i++)
2177 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2178 if (s->chroma_elim_threshold && !s->mb_intra)
2179 for (i = 4; i < mb_block_count; i++)
2180 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2182 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2183 for (i = 0; i < mb_block_count; i++) {
2184 if (s->block_last_index[i] == -1)
2185 s->coded_score[i] = INT_MAX / 256;
2190 if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2191 s->block_last_index[4] =
2192 s->block_last_index[5] = 0;
2194 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2197 // non c quantize code returns incorrect block_last_index FIXME
2198 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2199 for (i = 0; i < mb_block_count; i++) {
2201 if (s->block_last_index[i] > 0) {
2202 for (j = 63; j > 0; j--) {
2203 if (s->block[i][s->intra_scantable.permutated[j]])
2206 s->block_last_index[i] = j;
2211 /* huffman encode */
2212 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2213 case AV_CODEC_ID_MPEG1VIDEO:
2214 case AV_CODEC_ID_MPEG2VIDEO:
2215 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2216 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2218 case AV_CODEC_ID_MPEG4:
2219 if (CONFIG_MPEG4_ENCODER)
2220 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2222 case AV_CODEC_ID_MSMPEG4V2:
2223 case AV_CODEC_ID_MSMPEG4V3:
2224 case AV_CODEC_ID_WMV1:
2225 if (CONFIG_MSMPEG4_ENCODER)
2226 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2228 case AV_CODEC_ID_WMV2:
2229 if (CONFIG_WMV2_ENCODER)
2230 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2232 case AV_CODEC_ID_H261:
2233 if (CONFIG_H261_ENCODER)
2234 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2236 case AV_CODEC_ID_H263:
2237 case AV_CODEC_ID_H263P:
2238 case AV_CODEC_ID_FLV1:
2239 case AV_CODEC_ID_RV10:
2240 case AV_CODEC_ID_RV20:
2241 if (CONFIG_H263_ENCODER)
2242 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2244 case AV_CODEC_ID_MJPEG:
2245 if (CONFIG_MJPEG_ENCODER)
2246 ff_mjpeg_encode_mb(s, s->block);
2253 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2255 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2256 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2259 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2262 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2265 d->mb_skip_run= s->mb_skip_run;
2267 d->last_dc[i] = s->last_dc[i];
2270 d->mv_bits= s->mv_bits;
2271 d->i_tex_bits= s->i_tex_bits;
2272 d->p_tex_bits= s->p_tex_bits;
2273 d->i_count= s->i_count;
2274 d->f_count= s->f_count;
2275 d->b_count= s->b_count;
2276 d->skip_count= s->skip_count;
2277 d->misc_bits= s->misc_bits;
2281 d->qscale= s->qscale;
2282 d->dquant= s->dquant;
2284 d->esc3_level_length= s->esc3_level_length;
2287 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2290 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2291 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2294 d->mb_skip_run= s->mb_skip_run;
2296 d->last_dc[i] = s->last_dc[i];
2299 d->mv_bits= s->mv_bits;
2300 d->i_tex_bits= s->i_tex_bits;
2301 d->p_tex_bits= s->p_tex_bits;
2302 d->i_count= s->i_count;
2303 d->f_count= s->f_count;
2304 d->b_count= s->b_count;
2305 d->skip_count= s->skip_count;
2306 d->misc_bits= s->misc_bits;
2308 d->mb_intra= s->mb_intra;
2309 d->mb_skipped= s->mb_skipped;
2310 d->mv_type= s->mv_type;
2311 d->mv_dir= s->mv_dir;
2313 if(s->data_partitioning){
2315 d->tex_pb= s->tex_pb;
2319 d->block_last_index[i]= s->block_last_index[i];
2320 d->interlaced_dct= s->interlaced_dct;
2321 d->qscale= s->qscale;
2323 d->esc3_level_length= s->esc3_level_length;
2326 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2327 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2328 int *dmin, int *next_block, int motion_x, int motion_y)
2331 uint8_t *dest_backup[3];
2333 copy_context_before_encode(s, backup, type);
2335 s->block= s->blocks[*next_block];
2336 s->pb= pb[*next_block];
2337 if(s->data_partitioning){
2338 s->pb2 = pb2 [*next_block];
2339 s->tex_pb= tex_pb[*next_block];
2343 memcpy(dest_backup, s->dest, sizeof(s->dest));
2344 s->dest[0] = s->sc.rd_scratchpad;
2345 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2346 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2347 assert(s->linesize >= 32); //FIXME
2350 encode_mb(s, motion_x, motion_y);
2352 score= put_bits_count(&s->pb);
2353 if(s->data_partitioning){
2354 score+= put_bits_count(&s->pb2);
2355 score+= put_bits_count(&s->tex_pb);
2358 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2359 ff_mpv_decode_mb(s, s->block);
2361 score *= s->lambda2;
2362 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2366 memcpy(s->dest, dest_backup, sizeof(s->dest));
2373 copy_context_after_encode(best, s, type);
2377 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2378 uint32_t *sq = ff_square_tab + 256;
2383 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2384 else if(w==8 && h==8)
2385 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2389 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2398 static int sse_mb(MpegEncContext *s){
2402 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2403 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2406 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2407 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) +
2408 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) +
2409 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);
2411 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) +
2412 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) +
2413 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);
2416 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)
2417 +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)
2418 +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);
2421 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2422 MpegEncContext *s= *(void**)arg;
2426 s->me.dia_size= s->avctx->pre_dia_size;
2427 s->first_slice_line=1;
2428 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2429 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2430 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2432 s->first_slice_line=0;
2440 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2441 MpegEncContext *s= *(void**)arg;
2443 s->me.dia_size= s->avctx->dia_size;
2444 s->first_slice_line=1;
2445 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2446 s->mb_x=0; //for block init below
2447 ff_init_block_index(s);
2448 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2449 s->block_index[0]+=2;
2450 s->block_index[1]+=2;
2451 s->block_index[2]+=2;
2452 s->block_index[3]+=2;
2454 /* compute motion vector & mb_type and store in context */
2455 if(s->pict_type==AV_PICTURE_TYPE_B)
2456 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2458 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2460 s->first_slice_line=0;
2465 static int mb_var_thread(AVCodecContext *c, void *arg){
2466 MpegEncContext *s= *(void**)arg;
2469 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2470 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2473 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2475 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2477 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2478 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2480 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2481 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2482 s->me.mb_var_sum_temp += varc;
2488 static void write_slice_end(MpegEncContext *s){
2489 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2490 if(s->partitioned_frame){
2491 ff_mpeg4_merge_partitions(s);
2494 ff_mpeg4_stuffing(&s->pb);
2495 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2496 ff_mjpeg_encode_stuffing(&s->pb);
2499 avpriv_align_put_bits(&s->pb);
2500 flush_put_bits(&s->pb);
2502 if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
2503 s->misc_bits+= get_bits_diff(s);
2506 static void write_mb_info(MpegEncContext *s)
2508 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2509 int offset = put_bits_count(&s->pb);
2510 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2511 int gobn = s->mb_y / s->gob_index;
2513 if (CONFIG_H263_ENCODER)
2514 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2515 bytestream_put_le32(&ptr, offset);
2516 bytestream_put_byte(&ptr, s->qscale);
2517 bytestream_put_byte(&ptr, gobn);
2518 bytestream_put_le16(&ptr, mba);
2519 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2520 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2521 /* 4MV not implemented */
2522 bytestream_put_byte(&ptr, 0); /* hmv2 */
2523 bytestream_put_byte(&ptr, 0); /* vmv2 */
2526 static void update_mb_info(MpegEncContext *s, int startcode)
2530 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2531 s->mb_info_size += 12;
2532 s->prev_mb_info = s->last_mb_info;
2535 s->prev_mb_info = put_bits_count(&s->pb)/8;
2536 /* This might have incremented mb_info_size above, and we return without
2537 * actually writing any info into that slot yet. But in that case,
2538 * this will be called again at the start of the after writing the
2539 * start code, actually writing the mb info. */
2543 s->last_mb_info = put_bits_count(&s->pb)/8;
2544 if (!s->mb_info_size)
2545 s->mb_info_size += 12;
2549 static int encode_thread(AVCodecContext *c, void *arg){
2550 MpegEncContext *s= *(void**)arg;
2551 int mb_x, mb_y, pdif = 0;
2552 int chr_h= 16>>s->chroma_y_shift;
2554 MpegEncContext best_s = { 0 }, backup_s;
2555 uint8_t bit_buf[2][MAX_MB_BYTES];
2556 uint8_t bit_buf2[2][MAX_MB_BYTES];
2557 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2558 PutBitContext pb[2], pb2[2], tex_pb[2];
2561 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2562 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2563 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2566 s->last_bits= put_bits_count(&s->pb);
2577 /* init last dc values */
2578 /* note: quant matrix value (8) is implied here */
2579 s->last_dc[i] = 128 << s->intra_dc_precision;
2581 s->current_picture.f->error[i] = 0;
2584 memset(s->last_mv, 0, sizeof(s->last_mv));
2588 switch(s->codec_id){
2589 case AV_CODEC_ID_H263:
2590 case AV_CODEC_ID_H263P:
2591 case AV_CODEC_ID_FLV1:
2592 if (CONFIG_H263_ENCODER)
2593 s->gob_index = H263_GOB_HEIGHT(s->height);
2595 case AV_CODEC_ID_MPEG4:
2596 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2597 ff_mpeg4_init_partitions(s);
2603 s->first_slice_line = 1;
2604 s->ptr_lastgob = s->pb.buf;
2605 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2609 ff_set_qscale(s, s->qscale);
2610 ff_init_block_index(s);
2612 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2613 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2614 int mb_type= s->mb_type[xy];
2619 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2620 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2623 if(s->data_partitioning){
2624 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2625 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2626 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2632 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2633 ff_update_block_index(s);
2635 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2636 ff_h261_reorder_mb_index(s);
2637 xy= s->mb_y*s->mb_stride + s->mb_x;
2638 mb_type= s->mb_type[xy];
2641 /* write gob / video packet header */
2643 int current_packet_size, is_gob_start;
2645 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2647 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2649 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2651 switch(s->codec_id){
2652 case AV_CODEC_ID_H263:
2653 case AV_CODEC_ID_H263P:
2654 if(!s->h263_slice_structured)
2655 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2657 case AV_CODEC_ID_MPEG2VIDEO:
2658 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2659 case AV_CODEC_ID_MPEG1VIDEO:
2660 if(s->mb_skip_run) is_gob_start=0;
2665 if(s->start_mb_y != mb_y || mb_x!=0){
2668 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2669 ff_mpeg4_init_partitions(s);
2673 assert((put_bits_count(&s->pb)&7) == 0);
2674 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2676 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2677 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2678 int d = 100 / s->error_rate;
2680 current_packet_size=0;
2681 s->pb.buf_ptr= s->ptr_lastgob;
2682 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2686 if (s->avctx->rtp_callback){
2687 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2688 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2690 update_mb_info(s, 1);
2692 switch(s->codec_id){
2693 case AV_CODEC_ID_MPEG4:
2694 if (CONFIG_MPEG4_ENCODER) {
2695 ff_mpeg4_encode_video_packet_header(s);
2696 ff_mpeg4_clean_buffers(s);
2699 case AV_CODEC_ID_MPEG1VIDEO:
2700 case AV_CODEC_ID_MPEG2VIDEO:
2701 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2702 ff_mpeg1_encode_slice_header(s);
2703 ff_mpeg1_clean_buffers(s);
2706 case AV_CODEC_ID_H263:
2707 case AV_CODEC_ID_H263P:
2708 if (CONFIG_H263_ENCODER)
2709 ff_h263_encode_gob_header(s, mb_y);
2713 if (s->avctx->flags & CODEC_FLAG_PASS1) {
2714 int bits= put_bits_count(&s->pb);
2715 s->misc_bits+= bits - s->last_bits;
2719 s->ptr_lastgob += current_packet_size;
2720 s->first_slice_line=1;
2721 s->resync_mb_x=mb_x;
2722 s->resync_mb_y=mb_y;
2726 if( (s->resync_mb_x == s->mb_x)
2727 && s->resync_mb_y+1 == s->mb_y){
2728 s->first_slice_line=0;
2732 s->dquant=0; //only for QP_RD
2734 update_mb_info(s, 0);
2736 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
2738 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2740 copy_context_before_encode(&backup_s, s, -1);
2742 best_s.data_partitioning= s->data_partitioning;
2743 best_s.partitioned_frame= s->partitioned_frame;
2744 if(s->data_partitioning){
2745 backup_s.pb2= s->pb2;
2746 backup_s.tex_pb= s->tex_pb;
2749 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2750 s->mv_dir = MV_DIR_FORWARD;
2751 s->mv_type = MV_TYPE_16X16;
2753 s->mv[0][0][0] = s->p_mv_table[xy][0];
2754 s->mv[0][0][1] = s->p_mv_table[xy][1];
2755 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2756 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2758 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2759 s->mv_dir = MV_DIR_FORWARD;
2760 s->mv_type = MV_TYPE_FIELD;
2763 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2764 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2765 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2767 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2768 &dmin, &next_block, 0, 0);
2770 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2771 s->mv_dir = MV_DIR_FORWARD;
2772 s->mv_type = MV_TYPE_16X16;
2776 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2777 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2779 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2780 s->mv_dir = MV_DIR_FORWARD;
2781 s->mv_type = MV_TYPE_8X8;
2784 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2785 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2787 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2788 &dmin, &next_block, 0, 0);
2790 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2791 s->mv_dir = MV_DIR_FORWARD;
2792 s->mv_type = MV_TYPE_16X16;
2794 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2795 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2796 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2797 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2799 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2800 s->mv_dir = MV_DIR_BACKWARD;
2801 s->mv_type = MV_TYPE_16X16;
2803 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2804 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2805 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2806 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2808 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2809 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2810 s->mv_type = MV_TYPE_16X16;
2812 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2813 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2814 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2815 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2816 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2817 &dmin, &next_block, 0, 0);
2819 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2820 s->mv_dir = MV_DIR_FORWARD;
2821 s->mv_type = MV_TYPE_FIELD;
2824 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2825 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2826 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2828 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2829 &dmin, &next_block, 0, 0);
2831 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2832 s->mv_dir = MV_DIR_BACKWARD;
2833 s->mv_type = MV_TYPE_FIELD;
2836 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2837 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2838 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2840 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2841 &dmin, &next_block, 0, 0);
2843 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2844 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2845 s->mv_type = MV_TYPE_FIELD;
2847 for(dir=0; dir<2; dir++){
2849 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2850 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2851 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2854 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2855 &dmin, &next_block, 0, 0);
2857 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2859 s->mv_type = MV_TYPE_16X16;
2863 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2864 &dmin, &next_block, 0, 0);
2865 if(s->h263_pred || s->h263_aic){
2867 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2869 ff_clean_intra_table_entries(s); //old mode?
2873 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2874 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2875 const int last_qp= backup_s.qscale;
2878 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2879 static const int dquant_tab[4]={-1,1,-2,2};
2881 assert(backup_s.dquant == 0);
2884 s->mv_dir= best_s.mv_dir;
2885 s->mv_type = MV_TYPE_16X16;
2886 s->mb_intra= best_s.mb_intra;
2887 s->mv[0][0][0] = best_s.mv[0][0][0];
2888 s->mv[0][0][1] = best_s.mv[0][0][1];
2889 s->mv[1][0][0] = best_s.mv[1][0][0];
2890 s->mv[1][0][1] = best_s.mv[1][0][1];
2892 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2893 for(; qpi<4; qpi++){
2894 int dquant= dquant_tab[qpi];
2895 qp= last_qp + dquant;
2896 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2898 backup_s.dquant= dquant;
2899 if(s->mb_intra && s->dc_val[0]){
2901 dc[i]= s->dc_val[0][ s->block_index[i] ];
2902 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2906 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2907 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2908 if(best_s.qscale != qp){
2909 if(s->mb_intra && s->dc_val[0]){
2911 s->dc_val[0][ s->block_index[i] ]= dc[i];
2912 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2919 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2920 int mx= s->b_direct_mv_table[xy][0];
2921 int my= s->b_direct_mv_table[xy][1];
2923 backup_s.dquant = 0;
2924 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2926 ff_mpeg4_set_direct_mv(s, mx, my);
2927 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2928 &dmin, &next_block, mx, my);
2930 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2931 backup_s.dquant = 0;
2932 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2934 ff_mpeg4_set_direct_mv(s, 0, 0);
2935 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2936 &dmin, &next_block, 0, 0);
2938 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2941 coded |= s->block_last_index[i];
2944 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2945 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2946 mx=my=0; //FIXME find the one we actually used
2947 ff_mpeg4_set_direct_mv(s, mx, my);
2948 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2956 s->mv_dir= best_s.mv_dir;
2957 s->mv_type = best_s.mv_type;
2959 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2960 s->mv[0][0][1] = best_s.mv[0][0][1];
2961 s->mv[1][0][0] = best_s.mv[1][0][0];
2962 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2965 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2966 &dmin, &next_block, mx, my);
2971 s->current_picture.qscale_table[xy] = best_s.qscale;
2973 copy_context_after_encode(s, &best_s, -1);
2975 pb_bits_count= put_bits_count(&s->pb);
2976 flush_put_bits(&s->pb);
2977 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2980 if(s->data_partitioning){
2981 pb2_bits_count= put_bits_count(&s->pb2);
2982 flush_put_bits(&s->pb2);
2983 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2984 s->pb2= backup_s.pb2;
2986 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2987 flush_put_bits(&s->tex_pb);
2988 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2989 s->tex_pb= backup_s.tex_pb;
2991 s->last_bits= put_bits_count(&s->pb);
2993 if (CONFIG_H263_ENCODER &&
2994 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2995 ff_h263_update_motion_val(s);
2997 if(next_block==0){ //FIXME 16 vs linesize16
2998 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
2999 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3000 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3003 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3004 ff_mpv_decode_mb(s, s->block);
3006 int motion_x = 0, motion_y = 0;
3007 s->mv_type=MV_TYPE_16X16;
3008 // only one MB-Type possible
3011 case CANDIDATE_MB_TYPE_INTRA:
3014 motion_x= s->mv[0][0][0] = 0;
3015 motion_y= s->mv[0][0][1] = 0;
3017 case CANDIDATE_MB_TYPE_INTER:
3018 s->mv_dir = MV_DIR_FORWARD;
3020 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3021 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3023 case CANDIDATE_MB_TYPE_INTER_I:
3024 s->mv_dir = MV_DIR_FORWARD;
3025 s->mv_type = MV_TYPE_FIELD;
3028 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3029 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3030 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3033 case CANDIDATE_MB_TYPE_INTER4V:
3034 s->mv_dir = MV_DIR_FORWARD;
3035 s->mv_type = MV_TYPE_8X8;
3038 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3039 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3042 case CANDIDATE_MB_TYPE_DIRECT:
3043 if (CONFIG_MPEG4_ENCODER) {
3044 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3046 motion_x=s->b_direct_mv_table[xy][0];
3047 motion_y=s->b_direct_mv_table[xy][1];
3048 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3051 case CANDIDATE_MB_TYPE_DIRECT0:
3052 if (CONFIG_MPEG4_ENCODER) {
3053 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3055 ff_mpeg4_set_direct_mv(s, 0, 0);
3058 case CANDIDATE_MB_TYPE_BIDIR:
3059 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3061 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3062 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3063 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3064 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3066 case CANDIDATE_MB_TYPE_BACKWARD:
3067 s->mv_dir = MV_DIR_BACKWARD;
3069 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3070 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3072 case CANDIDATE_MB_TYPE_FORWARD:
3073 s->mv_dir = MV_DIR_FORWARD;
3075 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3076 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3078 case CANDIDATE_MB_TYPE_FORWARD_I:
3079 s->mv_dir = MV_DIR_FORWARD;
3080 s->mv_type = MV_TYPE_FIELD;
3083 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3084 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3085 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3088 case CANDIDATE_MB_TYPE_BACKWARD_I:
3089 s->mv_dir = MV_DIR_BACKWARD;
3090 s->mv_type = MV_TYPE_FIELD;
3093 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3094 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3095 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3098 case CANDIDATE_MB_TYPE_BIDIR_I:
3099 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3100 s->mv_type = MV_TYPE_FIELD;
3102 for(dir=0; dir<2; dir++){
3104 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3105 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3106 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3111 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3114 encode_mb(s, motion_x, motion_y);
3116 // RAL: Update last macroblock type
3117 s->last_mv_dir = s->mv_dir;
3119 if (CONFIG_H263_ENCODER &&
3120 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3121 ff_h263_update_motion_val(s);
3123 ff_mpv_decode_mb(s, s->block);
3126 /* clean the MV table in IPS frames for direct mode in B frames */
3127 if(s->mb_intra /* && I,P,S_TYPE */){
3128 s->p_mv_table[xy][0]=0;
3129 s->p_mv_table[xy][1]=0;
3132 if (s->avctx->flags & CODEC_FLAG_PSNR) {
3136 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3137 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3139 s->current_picture.f->error[0] += sse(
3140 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3141 s->dest[0], w, h, s->linesize);
3142 s->current_picture.f->error[1] += sse(
3143 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3144 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3145 s->current_picture.f->error[2] += sse(
3146 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3147 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3150 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3151 ff_h263_loop_filter(s);
3153 ff_dlog(s->avctx, "MB %d %d bits\n",
3154 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3158 //not beautiful here but we must write it before flushing so it has to be here
3159 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3160 ff_msmpeg4_encode_ext_header(s);
3164 /* Send the last GOB if RTP */
3165 if (s->avctx->rtp_callback) {
3166 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3167 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3168 /* Call the RTP callback to send the last GOB */
3170 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3176 #define MERGE(field) dst->field += src->field; src->field=0
3177 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3178 MERGE(me.scene_change_score);
3179 MERGE(me.mc_mb_var_sum_temp);
3180 MERGE(me.mb_var_sum_temp);
3183 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3186 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3187 MERGE(dct_count[1]);
3196 MERGE(er.error_count);
3197 MERGE(padding_bug_score);
3198 MERGE(current_picture.f->error[0]);
3199 MERGE(current_picture.f->error[1]);
3200 MERGE(current_picture.f->error[2]);
3202 if(dst->avctx->noise_reduction){
3203 for(i=0; i<64; i++){
3204 MERGE(dct_error_sum[0][i]);
3205 MERGE(dct_error_sum[1][i]);
3209 assert(put_bits_count(&src->pb) % 8 ==0);
3210 assert(put_bits_count(&dst->pb) % 8 ==0);
3211 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3212 flush_put_bits(&dst->pb);
3215 static int estimate_qp(MpegEncContext *s, int dry_run){
3216 if (s->next_lambda){
3217 s->current_picture_ptr->f->quality =
3218 s->current_picture.f->quality = s->next_lambda;
3219 if(!dry_run) s->next_lambda= 0;
3220 } else if (!s->fixed_qscale) {
3221 s->current_picture_ptr->f->quality =
3222 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3223 if (s->current_picture.f->quality < 0)
3227 if(s->adaptive_quant){
3228 switch(s->codec_id){
3229 case AV_CODEC_ID_MPEG4:
3230 if (CONFIG_MPEG4_ENCODER)
3231 ff_clean_mpeg4_qscales(s);
3233 case AV_CODEC_ID_H263:
3234 case AV_CODEC_ID_H263P:
3235 case AV_CODEC_ID_FLV1:
3236 if (CONFIG_H263_ENCODER)
3237 ff_clean_h263_qscales(s);
3240 ff_init_qscale_tab(s);
3243 s->lambda= s->lambda_table[0];
3246 s->lambda = s->current_picture.f->quality;
3251 /* must be called before writing the header */
3252 static void set_frame_distances(MpegEncContext * s){
3253 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3254 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3256 if(s->pict_type==AV_PICTURE_TYPE_B){
3257 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3258 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3260 s->pp_time= s->time - s->last_non_b_time;
3261 s->last_non_b_time= s->time;
3262 assert(s->picture_number==0 || s->pp_time > 0);
3266 static int encode_picture(MpegEncContext *s, int picture_number)
3270 int context_count = s->slice_context_count;
3272 s->picture_number = picture_number;
3274 /* Reset the average MB variance */
3275 s->me.mb_var_sum_temp =
3276 s->me.mc_mb_var_sum_temp = 0;
3278 /* we need to initialize some time vars before we can encode b-frames */
3279 // RAL: Condition added for MPEG1VIDEO
3280 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3281 set_frame_distances(s);
3282 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3283 ff_set_mpeg4_time(s);
3285 s->me.scene_change_score=0;
3287 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3289 if(s->pict_type==AV_PICTURE_TYPE_I){
3290 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3291 else s->no_rounding=0;
3292 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3293 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3294 s->no_rounding ^= 1;
3297 if (s->avctx->flags & CODEC_FLAG_PASS2) {
3298 if (estimate_qp(s,1) < 0)
3300 ff_get_2pass_fcode(s);
3301 } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
3302 if(s->pict_type==AV_PICTURE_TYPE_B)
3303 s->lambda= s->last_lambda_for[s->pict_type];
3305 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3309 s->mb_intra=0; //for the rate distortion & bit compare functions
3310 for(i=1; i<context_count; i++){
3311 ret = ff_update_duplicate_context(s->thread_context[i], s);
3319 /* Estimate motion for every MB */
3320 if(s->pict_type != AV_PICTURE_TYPE_I){
3321 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3322 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3323 if (s->pict_type != AV_PICTURE_TYPE_B) {
3324 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3325 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3329 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3330 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3332 for(i=0; i<s->mb_stride*s->mb_height; i++)
3333 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3335 if(!s->fixed_qscale){
3336 /* finding spatial complexity for I-frame rate control */
3337 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3340 for(i=1; i<context_count; i++){
3341 merge_context_after_me(s, s->thread_context[i]);
3343 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3344 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3347 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3348 s->pict_type= AV_PICTURE_TYPE_I;
3349 for(i=0; i<s->mb_stride*s->mb_height; i++)
3350 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3351 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3352 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3356 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3357 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3359 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3361 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3362 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3363 s->f_code= FFMAX3(s->f_code, a, b);
3366 ff_fix_long_p_mvs(s);
3367 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3368 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3372 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3373 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3378 if(s->pict_type==AV_PICTURE_TYPE_B){
3381 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3382 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3383 s->f_code = FFMAX(a, b);
3385 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3386 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3387 s->b_code = FFMAX(a, b);
3389 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3390 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3391 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3392 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3393 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3395 for(dir=0; dir<2; dir++){
3398 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3399 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3400 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3401 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3409 if (estimate_qp(s, 0) < 0)
3412 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3413 s->pict_type == AV_PICTURE_TYPE_I &&
3414 !(s->avctx->flags & CODEC_FLAG_QSCALE))
3415 s->qscale= 3; //reduce clipping problems
3417 if (s->out_format == FMT_MJPEG) {
3418 /* for mjpeg, we do include qscale in the matrix */
3420 int j = s->idsp.idct_permutation[i];
3422 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3424 s->y_dc_scale_table=
3425 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3426 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3427 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3428 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3432 //FIXME var duplication
3433 s->current_picture_ptr->f->key_frame =
3434 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3435 s->current_picture_ptr->f->pict_type =
3436 s->current_picture.f->pict_type = s->pict_type;
3438 if (s->current_picture.f->key_frame)
3439 s->picture_in_gop_number=0;
3441 s->last_bits= put_bits_count(&s->pb);
3442 switch(s->out_format) {
3444 if (CONFIG_MJPEG_ENCODER)
3445 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3449 if (CONFIG_H261_ENCODER)
3450 ff_h261_encode_picture_header(s, picture_number);
3453 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3454 ff_wmv2_encode_picture_header(s, picture_number);
3455 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3456 ff_msmpeg4_encode_picture_header(s, picture_number);
3457 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3458 ff_mpeg4_encode_picture_header(s, picture_number);
3459 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3460 ret = ff_rv10_encode_picture_header(s, picture_number);
3464 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3465 ff_rv20_encode_picture_header(s, picture_number);
3466 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3467 ff_flv_encode_picture_header(s, picture_number);
3468 else if (CONFIG_H263_ENCODER)
3469 ff_h263_encode_picture_header(s, picture_number);
3472 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3473 ff_mpeg1_encode_picture_header(s, picture_number);
3478 bits= put_bits_count(&s->pb);
3479 s->header_bits= bits - s->last_bits;
3481 for(i=1; i<context_count; i++){
3482 update_duplicate_context_after_me(s->thread_context[i], s);
3484 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3485 for(i=1; i<context_count; i++){
3486 merge_context_after_encode(s, s->thread_context[i]);
3492 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3493 const int intra= s->mb_intra;
3496 s->dct_count[intra]++;
3498 for(i=0; i<64; i++){
3499 int level= block[i];
3503 s->dct_error_sum[intra][i] += level;
3504 level -= s->dct_offset[intra][i];
3505 if(level<0) level=0;
3507 s->dct_error_sum[intra][i] -= level;
3508 level += s->dct_offset[intra][i];
3509 if(level>0) level=0;
3516 static int dct_quantize_trellis_c(MpegEncContext *s,
3517 int16_t *block, int n,
3518 int qscale, int *overflow){
3520 const uint8_t *scantable= s->intra_scantable.scantable;
3521 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3523 unsigned int threshold1, threshold2;
3535 int coeff_count[64];
3536 int qmul, qadd, start_i, last_non_zero, i, dc;
3537 const int esc_length= s->ac_esc_length;
3539 uint8_t * last_length;
3540 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3542 s->fdsp.fdct(block);
3544 if(s->dct_error_sum)
3545 s->denoise_dct(s, block);
3547 qadd= ((qscale-1)|1)*8;
3558 /* For AIC we skip quant/dequant of INTRADC */
3563 /* note: block[0] is assumed to be positive */
3564 block[0] = (block[0] + (q >> 1)) / q;
3567 qmat = s->q_intra_matrix[qscale];
3568 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3569 bias= 1<<(QMAT_SHIFT-1);
3570 length = s->intra_ac_vlc_length;
3571 last_length= s->intra_ac_vlc_last_length;
3575 qmat = s->q_inter_matrix[qscale];
3576 length = s->inter_ac_vlc_length;
3577 last_length= s->inter_ac_vlc_last_length;
3581 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3582 threshold2= (threshold1<<1);
3584 for(i=63; i>=start_i; i--) {
3585 const int j = scantable[i];
3586 int level = block[j] * qmat[j];
3588 if(((unsigned)(level+threshold1))>threshold2){
3594 for(i=start_i; i<=last_non_zero; i++) {
3595 const int j = scantable[i];
3596 int level = block[j] * qmat[j];
3598 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3599 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3600 if(((unsigned)(level+threshold1))>threshold2){
3602 level= (bias + level)>>QMAT_SHIFT;
3604 coeff[1][i]= level-1;
3605 // coeff[2][k]= level-2;
3607 level= (bias - level)>>QMAT_SHIFT;
3608 coeff[0][i]= -level;
3609 coeff[1][i]= -level+1;
3610 // coeff[2][k]= -level+2;
3612 coeff_count[i]= FFMIN(level, 2);
3613 assert(coeff_count[i]);
3616 coeff[0][i]= (level>>31)|1;
3621 *overflow= s->max_qcoeff < max; //overflow might have happened
3623 if(last_non_zero < start_i){
3624 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3625 return last_non_zero;
3628 score_tab[start_i]= 0;
3629 survivor[0]= start_i;
3632 for(i=start_i; i<=last_non_zero; i++){
3633 int level_index, j, zero_distortion;
3634 int dct_coeff= FFABS(block[ scantable[i] ]);
3635 int best_score=256*256*256*120;
3637 if (s->fdsp.fdct == ff_fdct_ifast)
3638 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3639 zero_distortion= dct_coeff*dct_coeff;
3641 for(level_index=0; level_index < coeff_count[i]; level_index++){
3643 int level= coeff[level_index][i];
3644 const int alevel= FFABS(level);
3649 if(s->out_format == FMT_H263){
3650 unquant_coeff= alevel*qmul + qadd;
3652 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3654 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3655 unquant_coeff = (unquant_coeff - 1) | 1;
3657 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3658 unquant_coeff = (unquant_coeff - 1) | 1;
3663 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3665 if((level&(~127)) == 0){
3666 for(j=survivor_count-1; j>=0; j--){
3667 int run= i - survivor[j];
3668 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3669 score += score_tab[i-run];
3671 if(score < best_score){
3674 level_tab[i+1]= level-64;
3678 if(s->out_format == FMT_H263){
3679 for(j=survivor_count-1; j>=0; j--){
3680 int run= i - survivor[j];
3681 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3682 score += score_tab[i-run];
3683 if(score < last_score){
3686 last_level= level-64;
3692 distortion += esc_length*lambda;
3693 for(j=survivor_count-1; j>=0; j--){
3694 int run= i - survivor[j];
3695 int score= distortion + score_tab[i-run];
3697 if(score < best_score){
3700 level_tab[i+1]= level-64;
3704 if(s->out_format == FMT_H263){
3705 for(j=survivor_count-1; j>=0; j--){
3706 int run= i - survivor[j];
3707 int score= distortion + score_tab[i-run];
3708 if(score < last_score){
3711 last_level= level-64;
3719 score_tab[i+1]= best_score;
3721 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3722 if(last_non_zero <= 27){
3723 for(; survivor_count; survivor_count--){
3724 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3728 for(; survivor_count; survivor_count--){
3729 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3734 survivor[ survivor_count++ ]= i+1;
3737 if(s->out_format != FMT_H263){
3738 last_score= 256*256*256*120;
3739 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3740 int score= score_tab[i];
3741 if(i) score += lambda*2; //FIXME exacter?
3743 if(score < last_score){
3746 last_level= level_tab[i];
3747 last_run= run_tab[i];
3752 s->coded_score[n] = last_score;
3754 dc= FFABS(block[0]);
3755 last_non_zero= last_i - 1;
3756 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3758 if(last_non_zero < start_i)
3759 return last_non_zero;
3761 if(last_non_zero == 0 && start_i == 0){
3763 int best_score= dc * dc;
3765 for(i=0; i<coeff_count[0]; i++){
3766 int level= coeff[i][0];
3767 int alevel= FFABS(level);
3768 int unquant_coeff, score, distortion;
3770 if(s->out_format == FMT_H263){
3771 unquant_coeff= (alevel*qmul + qadd)>>3;
3773 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3774 unquant_coeff = (unquant_coeff - 1) | 1;
3776 unquant_coeff = (unquant_coeff + 4) >> 3;
3777 unquant_coeff<<= 3 + 3;
3779 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3781 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3782 else score= distortion + esc_length*lambda;
3784 if(score < best_score){
3786 best_level= level - 64;
3789 block[0]= best_level;
3790 s->coded_score[n] = best_score - dc*dc;
3791 if(best_level == 0) return -1;
3792 else return last_non_zero;
3798 block[ perm_scantable[last_non_zero] ]= last_level;
3801 for(; i>start_i; i -= run_tab[i] + 1){
3802 block[ perm_scantable[i-1] ]= level_tab[i];
3805 return last_non_zero;
3808 //#define REFINE_STATS 1
3809 static int16_t basis[64][64];
3811 static void build_basis(uint8_t *perm){
3818 double s= 0.25*(1<<BASIS_SHIFT);
3820 int perm_index= perm[index];
3821 if(i==0) s*= sqrt(0.5);
3822 if(j==0) s*= sqrt(0.5);
3823 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)));
3830 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3831 int16_t *block, int16_t *weight, int16_t *orig,
3834 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3835 const uint8_t *scantable= s->intra_scantable.scantable;
3836 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3837 // unsigned int threshold1, threshold2;
3842 int qmul, qadd, start_i, last_non_zero, i, dc;
3844 uint8_t * last_length;
3846 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3849 static int after_last=0;
3850 static int to_zero=0;
3851 static int from_zero=0;
3854 static int messed_sign=0;
3857 if(basis[0][0] == 0)
3858 build_basis(s->idsp.idct_permutation);
3869 /* For AIC we skip quant/dequant of INTRADC */
3873 q <<= RECON_SHIFT-3;
3874 /* note: block[0] is assumed to be positive */
3876 // block[0] = (block[0] + (q >> 1)) / q;
3878 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3879 // bias= 1<<(QMAT_SHIFT-1);
3880 length = s->intra_ac_vlc_length;
3881 last_length= s->intra_ac_vlc_last_length;
3885 length = s->inter_ac_vlc_length;
3886 last_length= s->inter_ac_vlc_last_length;
3888 last_non_zero = s->block_last_index[n];
3893 dc += (1<<(RECON_SHIFT-1));
3894 for(i=0; i<64; i++){
3895 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3898 STOP_TIMER("memset rem[]")}
3901 for(i=0; i<64; i++){
3906 w= FFABS(weight[i]) + qns*one;
3907 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3910 // w=weight[i] = (63*qns + (w/2)) / w;
3916 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3922 for(i=start_i; i<=last_non_zero; i++){
3923 int j= perm_scantable[i];
3924 const int level= block[j];
3928 if(level<0) coeff= qmul*level - qadd;
3929 else coeff= qmul*level + qadd;
3930 run_tab[rle_index++]=run;
3933 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3939 if(last_non_zero>0){
3940 STOP_TIMER("init rem[]")
3947 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3950 int run2, best_unquant_change=0, analyze_gradient;
3954 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3956 if(analyze_gradient){
3960 for(i=0; i<64; i++){
3963 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3966 STOP_TIMER("rem*w*w")}
3976 const int level= block[0];
3977 int change, old_coeff;
3979 assert(s->mb_intra);
3983 for(change=-1; change<=1; change+=2){
3984 int new_level= level + change;
3985 int score, new_coeff;
3987 new_coeff= q*new_level;
3988 if(new_coeff >= 2048 || new_coeff < 0)
3991 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3992 new_coeff - old_coeff);
3993 if(score<best_score){
3996 best_change= change;
3997 best_unquant_change= new_coeff - old_coeff;
4004 run2= run_tab[rle_index++];
4008 for(i=start_i; i<64; i++){
4009 int j= perm_scantable[i];
4010 const int level= block[j];
4011 int change, old_coeff;
4013 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4017 if(level<0) old_coeff= qmul*level - qadd;
4018 else old_coeff= qmul*level + qadd;
4019 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4023 assert(run2>=0 || i >= last_non_zero );
4026 for(change=-1; change<=1; change+=2){
4027 int new_level= level + change;
4028 int score, new_coeff, unquant_change;
4031 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4035 if(new_level<0) new_coeff= qmul*new_level - qadd;
4036 else new_coeff= qmul*new_level + qadd;
4037 if(new_coeff >= 2048 || new_coeff <= -2048)
4039 //FIXME check for overflow
4042 if(level < 63 && level > -63){
4043 if(i < last_non_zero)
4044 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4045 - length[UNI_AC_ENC_INDEX(run, level+64)];
4047 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4048 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4051 assert(FFABS(new_level)==1);
4053 if(analyze_gradient){
4054 int g= d1[ scantable[i] ];
4055 if(g && (g^new_level) >= 0)
4059 if(i < last_non_zero){
4060 int next_i= i + run2 + 1;
4061 int next_level= block[ perm_scantable[next_i] ] + 64;
4063 if(next_level&(~127))
4066 if(next_i < last_non_zero)
4067 score += length[UNI_AC_ENC_INDEX(run, 65)]
4068 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4069 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4071 score += length[UNI_AC_ENC_INDEX(run, 65)]
4072 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4073 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4075 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4077 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4078 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4084 assert(FFABS(level)==1);
4086 if(i < last_non_zero){
4087 int next_i= i + run2 + 1;
4088 int next_level= block[ perm_scantable[next_i] ] + 64;
4090 if(next_level&(~127))
4093 if(next_i < last_non_zero)
4094 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4095 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4096 - length[UNI_AC_ENC_INDEX(run, 65)];
4098 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4099 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4100 - length[UNI_AC_ENC_INDEX(run, 65)];
4102 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4104 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4105 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4112 unquant_change= new_coeff - old_coeff;
4113 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4115 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4117 if(score<best_score){
4120 best_change= change;
4121 best_unquant_change= unquant_change;
4125 prev_level= level + 64;
4126 if(prev_level&(~127))
4135 STOP_TIMER("iterative step")}
4139 int j= perm_scantable[ best_coeff ];
4141 block[j] += best_change;
4143 if(best_coeff > last_non_zero){
4144 last_non_zero= best_coeff;
4152 if(block[j] - best_change){
4153 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4165 for(; last_non_zero>=start_i; last_non_zero--){
4166 if(block[perm_scantable[last_non_zero]])
4172 if(256*256*256*64 % count == 0){
4173 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);
4178 for(i=start_i; i<=last_non_zero; i++){
4179 int j= perm_scantable[i];
4180 const int level= block[j];
4183 run_tab[rle_index++]=run;
4190 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4196 if(last_non_zero>0){
4197 STOP_TIMER("iterative search")
4202 return last_non_zero;
4206 * Permute an 8x8 block according to permuatation.
4207 * @param block the block which will be permuted according to
4208 * the given permutation vector
4209 * @param permutation the permutation vector
4210 * @param last the last non zero coefficient in scantable order, used to
4211 * speed the permutation up
4212 * @param scantable the used scantable, this is only used to speed the
4213 * permutation up, the block is not (inverse) permutated
4214 * to scantable order!
4216 static void block_permute(int16_t *block, uint8_t *permutation,
4217 const uint8_t *scantable, int last)
4224 //FIXME it is ok but not clean and might fail for some permutations
4225 // if (permutation[1] == 1)
4228 for (i = 0; i <= last; i++) {
4229 const int j = scantable[i];
4234 for (i = 0; i <= last; i++) {
4235 const int j = scantable[i];
4236 const int perm_j = permutation[j];
4237 block[perm_j] = temp[j];
4241 int ff_dct_quantize_c(MpegEncContext *s,
4242 int16_t *block, int n,
4243 int qscale, int *overflow)
4245 int i, j, level, last_non_zero, q, start_i;
4247 const uint8_t *scantable= s->intra_scantable.scantable;
4250 unsigned int threshold1, threshold2;
4252 s->fdsp.fdct(block);
4254 if(s->dct_error_sum)
4255 s->denoise_dct(s, block);
4265 /* For AIC we skip quant/dequant of INTRADC */
4268 /* note: block[0] is assumed to be positive */
4269 block[0] = (block[0] + (q >> 1)) / q;
4272 qmat = s->q_intra_matrix[qscale];
4273 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4277 qmat = s->q_inter_matrix[qscale];
4278 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4280 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4281 threshold2= (threshold1<<1);
4282 for(i=63;i>=start_i;i--) {
4284 level = block[j] * qmat[j];
4286 if(((unsigned)(level+threshold1))>threshold2){
4293 for(i=start_i; i<=last_non_zero; i++) {
4295 level = block[j] * qmat[j];
4297 // if( bias+level >= (1<<QMAT_SHIFT)
4298 // || bias-level >= (1<<QMAT_SHIFT)){
4299 if(((unsigned)(level+threshold1))>threshold2){
4301 level= (bias + level)>>QMAT_SHIFT;
4304 level= (bias - level)>>QMAT_SHIFT;
4312 *overflow= s->max_qcoeff < max; //overflow might have happened
4314 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4315 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4316 block_permute(block, s->idsp.idct_permutation,
4317 scantable, last_non_zero);
4319 return last_non_zero;
4322 #define OFFSET(x) offsetof(MpegEncContext, x)
4323 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4324 static const AVOption h263_options[] = {
4325 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4326 { "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},
4327 { "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 },
4332 static const AVClass h263_class = {
4333 .class_name = "H.263 encoder",
4334 .item_name = av_default_item_name,
4335 .option = h263_options,
4336 .version = LIBAVUTIL_VERSION_INT,
4339 AVCodec ff_h263_encoder = {
4341 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4342 .type = AVMEDIA_TYPE_VIDEO,
4343 .id = AV_CODEC_ID_H263,
4344 .priv_data_size = sizeof(MpegEncContext),
4345 .init = ff_mpv_encode_init,
4346 .encode2 = ff_mpv_encode_picture,
4347 .close = ff_mpv_encode_end,
4348 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4349 .priv_class = &h263_class,
4352 static const AVOption h263p_options[] = {
4353 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4354 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4355 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4356 { "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},
4360 static const AVClass h263p_class = {
4361 .class_name = "H.263p encoder",
4362 .item_name = av_default_item_name,
4363 .option = h263p_options,
4364 .version = LIBAVUTIL_VERSION_INT,
4367 AVCodec ff_h263p_encoder = {
4369 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4370 .type = AVMEDIA_TYPE_VIDEO,
4371 .id = AV_CODEC_ID_H263P,
4372 .priv_data_size = sizeof(MpegEncContext),
4373 .init = ff_mpv_encode_init,
4374 .encode2 = ff_mpv_encode_picture,
4375 .close = ff_mpv_encode_end,
4376 .capabilities = CODEC_CAP_SLICE_THREADS,
4377 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4378 .priv_class = &h263p_class,
4381 static const AVClass msmpeg4v2_class = {
4382 .class_name = "msmpeg4v2 encoder",
4383 .item_name = av_default_item_name,
4384 .option = ff_mpv_generic_options,
4385 .version = LIBAVUTIL_VERSION_INT,
4388 AVCodec ff_msmpeg4v2_encoder = {
4389 .name = "msmpeg4v2",
4390 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4391 .type = AVMEDIA_TYPE_VIDEO,
4392 .id = AV_CODEC_ID_MSMPEG4V2,
4393 .priv_data_size = sizeof(MpegEncContext),
4394 .init = ff_mpv_encode_init,
4395 .encode2 = ff_mpv_encode_picture,
4396 .close = ff_mpv_encode_end,
4397 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4398 .priv_class = &msmpeg4v2_class,
4401 static const AVClass msmpeg4v3_class = {
4402 .class_name = "msmpeg4v3 encoder",
4403 .item_name = av_default_item_name,
4404 .option = ff_mpv_generic_options,
4405 .version = LIBAVUTIL_VERSION_INT,
4408 AVCodec ff_msmpeg4v3_encoder = {
4410 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4411 .type = AVMEDIA_TYPE_VIDEO,
4412 .id = AV_CODEC_ID_MSMPEG4V3,
4413 .priv_data_size = sizeof(MpegEncContext),
4414 .init = ff_mpv_encode_init,
4415 .encode2 = ff_mpv_encode_picture,
4416 .close = ff_mpv_encode_end,
4417 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4418 .priv_class = &msmpeg4v3_class,
4421 static const AVClass wmv1_class = {
4422 .class_name = "wmv1 encoder",
4423 .item_name = av_default_item_name,
4424 .option = ff_mpv_generic_options,
4425 .version = LIBAVUTIL_VERSION_INT,
4428 AVCodec ff_wmv1_encoder = {
4430 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4431 .type = AVMEDIA_TYPE_VIDEO,
4432 .id = AV_CODEC_ID_WMV1,
4433 .priv_data_size = sizeof(MpegEncContext),
4434 .init = ff_mpv_encode_init,
4435 .encode2 = ff_mpv_encode_picture,
4436 .close = ff_mpv_encode_end,
4437 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4438 .priv_class = &wmv1_class,