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 s->avctx->coded_frame = s->current_picture.f;
727 if (s->msmpeg4_version) {
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
729 2 * 2 * (MAX_LEVEL + 1) *
730 (MAX_RUN + 1) * 2 * sizeof(int), fail);
732 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
735 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
737 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
738 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
739 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
740 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
741 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
743 if (s->avctx->noise_reduction) {
744 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
745 2 * 64 * sizeof(uint16_t), fail);
748 if (CONFIG_H263_ENCODER)
749 ff_h263dsp_init(&s->h263dsp);
750 if (!s->dct_quantize)
751 s->dct_quantize = ff_dct_quantize_c;
753 s->denoise_dct = denoise_dct_c;
754 s->fast_dct_quantize = s->dct_quantize;
756 s->dct_quantize = dct_quantize_trellis_c;
758 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
759 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
761 s->quant_precision = 5;
763 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
764 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
766 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
767 ff_h261_encode_init(s);
768 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
769 ff_h263_encode_init(s);
770 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
771 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
773 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
774 && s->out_format == FMT_MPEG1)
775 ff_mpeg1_encode_init(s);
778 for (i = 0; i < 64; i++) {
779 int j = s->idsp.idct_permutation[i];
780 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
782 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
783 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
784 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
786 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
789 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
790 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
792 if (s->avctx->intra_matrix)
793 s->intra_matrix[j] = s->avctx->intra_matrix[i];
794 if (s->avctx->inter_matrix)
795 s->inter_matrix[j] = s->avctx->inter_matrix[i];
798 /* precompute matrix */
799 /* for mjpeg, we do include qscale in the matrix */
800 if (s->out_format != FMT_MJPEG) {
801 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
802 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
804 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
805 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
809 if (ff_rate_control_init(s) < 0)
812 #if FF_API_ERROR_RATE
813 FF_DISABLE_DEPRECATION_WARNINGS
814 if (avctx->error_rate)
815 s->error_rate = avctx->error_rate;
816 FF_ENABLE_DEPRECATION_WARNINGS;
819 #if FF_API_NORMALIZE_AQP
820 FF_DISABLE_DEPRECATION_WARNINGS
821 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
822 s->mpv_flags |= FF_MPV_FLAG_NAQ;
823 FF_ENABLE_DEPRECATION_WARNINGS;
827 FF_DISABLE_DEPRECATION_WARNINGS
828 if (avctx->flags & CODEC_FLAG_MV0)
829 s->mpv_flags |= FF_MPV_FLAG_MV0;
830 FF_ENABLE_DEPRECATION_WARNINGS
834 FF_DISABLE_DEPRECATION_WARNINGS
835 if (avctx->rc_qsquish != 0.0)
836 s->rc_qsquish = avctx->rc_qsquish;
837 if (avctx->rc_qmod_amp != 0.0)
838 s->rc_qmod_amp = avctx->rc_qmod_amp;
839 if (avctx->rc_qmod_freq)
840 s->rc_qmod_freq = avctx->rc_qmod_freq;
841 if (avctx->rc_buffer_aggressivity != 1.0)
842 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
843 if (avctx->rc_initial_cplx != 0.0)
844 s->rc_initial_cplx = avctx->rc_initial_cplx;
846 s->lmin = avctx->lmin;
848 s->lmax = avctx->lmax;
852 s->rc_eq = av_strdup(avctx->rc_eq);
854 return AVERROR(ENOMEM);
856 FF_ENABLE_DEPRECATION_WARNINGS
859 if (avctx->b_frame_strategy == 2) {
860 for (i = 0; i < s->max_b_frames + 2; i++) {
861 s->tmp_frames[i] = av_frame_alloc();
862 if (!s->tmp_frames[i])
863 return AVERROR(ENOMEM);
865 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
866 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
867 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
869 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
877 ff_mpv_encode_end(avctx);
878 return AVERROR_UNKNOWN;
881 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
883 MpegEncContext *s = avctx->priv_data;
886 ff_rate_control_uninit(s);
888 ff_mpv_common_end(s);
889 if (CONFIG_MJPEG_ENCODER &&
890 s->out_format == FMT_MJPEG)
891 ff_mjpeg_encode_close(s);
893 av_freep(&avctx->extradata);
895 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
896 av_frame_free(&s->tmp_frames[i]);
898 ff_free_picture_tables(&s->new_picture);
899 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
901 av_freep(&s->avctx->stats_out);
902 av_freep(&s->ac_stats);
904 av_freep(&s->q_intra_matrix);
905 av_freep(&s->q_inter_matrix);
906 av_freep(&s->q_intra_matrix16);
907 av_freep(&s->q_inter_matrix16);
908 av_freep(&s->input_picture);
909 av_freep(&s->reordered_input_picture);
910 av_freep(&s->dct_offset);
915 static int get_sae(uint8_t *src, int ref, int stride)
920 for (y = 0; y < 16; y++) {
921 for (x = 0; x < 16; x++) {
922 acc += FFABS(src[x + y * stride] - ref);
929 static int get_intra_count(MpegEncContext *s, uint8_t *src,
930 uint8_t *ref, int stride)
938 for (y = 0; y < h; y += 16) {
939 for (x = 0; x < w; x += 16) {
940 int offset = x + y * stride;
941 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
943 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
944 int sae = get_sae(src + offset, mean, stride);
946 acc += sae + 500 < sad;
952 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
954 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
955 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
956 s->mb_stride, s->mb_height, s->b8_stride,
957 &s->linesize, &s->uvlinesize);
960 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
964 int i, display_picture_number = 0, ret;
965 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
966 (s->low_delay ? 0 : 1);
971 display_picture_number = s->input_picture_number++;
973 if (pts != AV_NOPTS_VALUE) {
974 if (s->user_specified_pts != AV_NOPTS_VALUE) {
976 int64_t last = s->user_specified_pts;
979 av_log(s->avctx, AV_LOG_ERROR,
980 "Error, Invalid timestamp=%"PRId64", "
981 "last=%"PRId64"\n", pts, s->user_specified_pts);
985 if (!s->low_delay && display_picture_number == 1)
986 s->dts_delta = time - last;
988 s->user_specified_pts = pts;
990 if (s->user_specified_pts != AV_NOPTS_VALUE) {
991 s->user_specified_pts =
992 pts = s->user_specified_pts + 1;
993 av_log(s->avctx, AV_LOG_INFO,
994 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
997 pts = display_picture_number;
1003 if (!pic_arg->buf[0] ||
1004 pic_arg->linesize[0] != s->linesize ||
1005 pic_arg->linesize[1] != s->uvlinesize ||
1006 pic_arg->linesize[2] != s->uvlinesize)
1008 if ((s->width & 15) || (s->height & 15))
1011 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1012 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1014 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1018 pic = &s->picture[i];
1022 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1025 ret = alloc_picture(s, pic, direct);
1030 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1031 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1032 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1035 int h_chroma_shift, v_chroma_shift;
1036 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1040 for (i = 0; i < 3; i++) {
1041 int src_stride = pic_arg->linesize[i];
1042 int dst_stride = i ? s->uvlinesize : s->linesize;
1043 int h_shift = i ? h_chroma_shift : 0;
1044 int v_shift = i ? v_chroma_shift : 0;
1045 int w = s->width >> h_shift;
1046 int h = s->height >> v_shift;
1047 uint8_t *src = pic_arg->data[i];
1048 uint8_t *dst = pic->f->data[i];
1050 if (!s->avctx->rc_buffer_size)
1051 dst += INPLACE_OFFSET;
1053 if (src_stride == dst_stride)
1054 memcpy(dst, src, src_stride * h);
1057 uint8_t *dst2 = dst;
1059 memcpy(dst2, src, w);
1064 if ((s->width & 15) || (s->height & 15)) {
1065 s->mpvencdsp.draw_edges(dst, dst_stride,
1074 ret = av_frame_copy_props(pic->f, pic_arg);
1078 pic->f->display_picture_number = display_picture_number;
1079 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1082 /* shift buffer entries */
1083 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1084 s->input_picture[i - 1] = s->input_picture[i];
1086 s->input_picture[encoding_delay] = (Picture*) pic;
1091 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1095 int64_t score64 = 0;
1097 for (plane = 0; plane < 3; plane++) {
1098 const int stride = p->f->linesize[plane];
1099 const int bw = plane ? 1 : 2;
1100 for (y = 0; y < s->mb_height * bw; y++) {
1101 for (x = 0; x < s->mb_width * bw; x++) {
1102 int off = p->shared ? 0 : 16;
1103 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1104 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1105 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1107 switch (s->avctx->frame_skip_exp) {
1108 case 0: score = FFMAX(score, v); break;
1109 case 1: score += FFABS(v); break;
1110 case 2: score += v * v; break;
1111 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1112 case 4: score64 += v * v * (int64_t)(v * v); break;
1121 if (score64 < s->avctx->frame_skip_threshold)
1123 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1128 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1130 AVPacket pkt = { 0 };
1131 int ret, got_output;
1133 av_init_packet(&pkt);
1134 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1139 av_free_packet(&pkt);
1143 static int estimate_best_b_count(MpegEncContext *s)
1145 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1146 AVCodecContext *c = avcodec_alloc_context3(NULL);
1147 const int scale = s->avctx->brd_scale;
1148 int i, j, out_size, p_lambda, b_lambda, lambda2;
1149 int64_t best_rd = INT64_MAX;
1150 int best_b_count = -1;
1153 return AVERROR(ENOMEM);
1154 assert(scale >= 0 && scale <= 3);
1157 //s->next_picture_ptr->quality;
1158 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1159 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1160 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1161 if (!b_lambda) // FIXME we should do this somewhere else
1162 b_lambda = p_lambda;
1163 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1166 c->width = s->width >> scale;
1167 c->height = s->height >> scale;
1168 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1169 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1170 c->mb_decision = s->avctx->mb_decision;
1171 c->me_cmp = s->avctx->me_cmp;
1172 c->mb_cmp = s->avctx->mb_cmp;
1173 c->me_sub_cmp = s->avctx->me_sub_cmp;
1174 c->pix_fmt = AV_PIX_FMT_YUV420P;
1175 c->time_base = s->avctx->time_base;
1176 c->max_b_frames = s->max_b_frames;
1178 if (avcodec_open2(c, codec, NULL) < 0)
1181 for (i = 0; i < s->max_b_frames + 2; i++) {
1182 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1183 s->next_picture_ptr;
1185 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1186 pre_input = *pre_input_ptr;
1188 if (!pre_input.shared && i) {
1189 pre_input.f->data[0] += INPLACE_OFFSET;
1190 pre_input.f->data[1] += INPLACE_OFFSET;
1191 pre_input.f->data[2] += INPLACE_OFFSET;
1194 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1195 s->tmp_frames[i]->linesize[0],
1196 pre_input.f->data[0],
1197 pre_input.f->linesize[0],
1198 c->width, c->height);
1199 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1200 s->tmp_frames[i]->linesize[1],
1201 pre_input.f->data[1],
1202 pre_input.f->linesize[1],
1203 c->width >> 1, c->height >> 1);
1204 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1205 s->tmp_frames[i]->linesize[2],
1206 pre_input.f->data[2],
1207 pre_input.f->linesize[2],
1208 c->width >> 1, c->height >> 1);
1212 for (j = 0; j < s->max_b_frames + 1; j++) {
1215 if (!s->input_picture[j])
1218 c->error[0] = c->error[1] = c->error[2] = 0;
1220 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1221 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1223 out_size = encode_frame(c, s->tmp_frames[0]);
1225 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1227 for (i = 0; i < s->max_b_frames + 1; i++) {
1228 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1230 s->tmp_frames[i + 1]->pict_type = is_p ?
1231 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1232 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1234 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1236 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1239 /* get the delayed frames */
1241 out_size = encode_frame(c, NULL);
1242 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1245 rd += c->error[0] + c->error[1] + c->error[2];
1256 return best_b_count;
1259 static int select_input_picture(MpegEncContext *s)
1263 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1264 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1265 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1267 /* set next picture type & ordering */
1268 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1269 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1270 !s->next_picture_ptr || s->intra_only) {
1271 s->reordered_input_picture[0] = s->input_picture[0];
1272 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1273 s->reordered_input_picture[0]->f->coded_picture_number =
1274 s->coded_picture_number++;
1278 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1279 if (s->picture_in_gop_number < s->gop_size &&
1280 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1281 // FIXME check that te gop check above is +-1 correct
1282 av_frame_unref(s->input_picture[0]->f);
1285 ff_vbv_update(s, 0);
1291 if (s->avctx->flags & CODEC_FLAG_PASS2) {
1292 for (i = 0; i < s->max_b_frames + 1; i++) {
1293 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1295 if (pict_num >= s->rc_context.num_entries)
1297 if (!s->input_picture[i]) {
1298 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1302 s->input_picture[i]->f->pict_type =
1303 s->rc_context.entry[pict_num].new_pict_type;
1307 if (s->avctx->b_frame_strategy == 0) {
1308 b_frames = s->max_b_frames;
1309 while (b_frames && !s->input_picture[b_frames])
1311 } else if (s->avctx->b_frame_strategy == 1) {
1312 for (i = 1; i < s->max_b_frames + 1; i++) {
1313 if (s->input_picture[i] &&
1314 s->input_picture[i]->b_frame_score == 0) {
1315 s->input_picture[i]->b_frame_score =
1317 s->input_picture[i ]->f->data[0],
1318 s->input_picture[i - 1]->f->data[0],
1322 for (i = 0; i < s->max_b_frames + 1; i++) {
1323 if (!s->input_picture[i] ||
1324 s->input_picture[i]->b_frame_score - 1 >
1325 s->mb_num / s->avctx->b_sensitivity)
1329 b_frames = FFMAX(0, i - 1);
1332 for (i = 0; i < b_frames + 1; i++) {
1333 s->input_picture[i]->b_frame_score = 0;
1335 } else if (s->avctx->b_frame_strategy == 2) {
1336 b_frames = estimate_best_b_count(s);
1338 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1344 for (i = b_frames - 1; i >= 0; i--) {
1345 int type = s->input_picture[i]->f->pict_type;
1346 if (type && type != AV_PICTURE_TYPE_B)
1349 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1350 b_frames == s->max_b_frames) {
1351 av_log(s->avctx, AV_LOG_ERROR,
1352 "warning, too many b frames in a row\n");
1355 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1356 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1357 s->gop_size > s->picture_in_gop_number) {
1358 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1360 if (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)
1362 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1366 if ((s->avctx->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1367 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1370 s->reordered_input_picture[0] = s->input_picture[b_frames];
1371 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1372 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1373 s->reordered_input_picture[0]->f->coded_picture_number =
1374 s->coded_picture_number++;
1375 for (i = 0; i < b_frames; i++) {
1376 s->reordered_input_picture[i + 1] = s->input_picture[i];
1377 s->reordered_input_picture[i + 1]->f->pict_type =
1379 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1380 s->coded_picture_number++;
1385 if (s->reordered_input_picture[0]) {
1386 s->reordered_input_picture[0]->reference =
1387 s->reordered_input_picture[0]->f->pict_type !=
1388 AV_PICTURE_TYPE_B ? 3 : 0;
1390 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1391 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1394 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1395 // input is a shared pix, so we can't modifiy it -> alloc a new
1396 // one & ensure that the shared one is reuseable
1399 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1402 pic = &s->picture[i];
1404 pic->reference = s->reordered_input_picture[0]->reference;
1405 if (alloc_picture(s, pic, 0) < 0) {
1409 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1413 /* mark us unused / free shared pic */
1414 av_frame_unref(s->reordered_input_picture[0]->f);
1415 s->reordered_input_picture[0]->shared = 0;
1417 s->current_picture_ptr = pic;
1419 // input is not a shared pix -> reuse buffer for current_pix
1420 s->current_picture_ptr = s->reordered_input_picture[0];
1421 for (i = 0; i < 4; i++) {
1422 s->new_picture.f->data[i] += INPLACE_OFFSET;
1425 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1426 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1427 s->current_picture_ptr)) < 0)
1430 s->picture_number = s->new_picture.f->display_picture_number;
1432 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1437 static void frame_end(MpegEncContext *s)
1441 if (s->unrestricted_mv &&
1442 s->current_picture.reference &&
1444 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1445 int hshift = desc->log2_chroma_w;
1446 int vshift = desc->log2_chroma_h;
1447 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1448 s->h_edge_pos, s->v_edge_pos,
1449 EDGE_WIDTH, EDGE_WIDTH,
1450 EDGE_TOP | EDGE_BOTTOM);
1451 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1452 s->h_edge_pos >> hshift,
1453 s->v_edge_pos >> vshift,
1454 EDGE_WIDTH >> hshift,
1455 EDGE_WIDTH >> vshift,
1456 EDGE_TOP | EDGE_BOTTOM);
1457 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1458 s->h_edge_pos >> hshift,
1459 s->v_edge_pos >> vshift,
1460 EDGE_WIDTH >> hshift,
1461 EDGE_WIDTH >> vshift,
1462 EDGE_TOP | EDGE_BOTTOM);
1467 s->last_pict_type = s->pict_type;
1468 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1469 if (s->pict_type!= AV_PICTURE_TYPE_B)
1470 s->last_non_b_pict_type = s->pict_type;
1473 /* release non-reference frames */
1474 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1475 if (!s->picture[i].reference)
1476 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1480 s->avctx->coded_frame = s->current_picture_ptr->f;
1484 static void update_noise_reduction(MpegEncContext *s)
1488 for (intra = 0; intra < 2; intra++) {
1489 if (s->dct_count[intra] > (1 << 16)) {
1490 for (i = 0; i < 64; i++) {
1491 s->dct_error_sum[intra][i] >>= 1;
1493 s->dct_count[intra] >>= 1;
1496 for (i = 0; i < 64; i++) {
1497 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1498 s->dct_count[intra] +
1499 s->dct_error_sum[intra][i] / 2) /
1500 (s->dct_error_sum[intra][i] + 1);
1505 static int frame_start(MpegEncContext *s)
1509 /* mark & release old frames */
1510 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1511 s->last_picture_ptr != s->next_picture_ptr &&
1512 s->last_picture_ptr->f->buf[0]) {
1513 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1516 s->current_picture_ptr->f->pict_type = s->pict_type;
1517 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1519 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1520 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1521 s->current_picture_ptr)) < 0)
1524 if (s->pict_type != AV_PICTURE_TYPE_B) {
1525 s->last_picture_ptr = s->next_picture_ptr;
1527 s->next_picture_ptr = s->current_picture_ptr;
1530 if (s->last_picture_ptr) {
1531 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1532 if (s->last_picture_ptr->f->buf[0] &&
1533 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1534 s->last_picture_ptr)) < 0)
1537 if (s->next_picture_ptr) {
1538 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1539 if (s->next_picture_ptr->f->buf[0] &&
1540 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1541 s->next_picture_ptr)) < 0)
1545 if (s->picture_structure!= PICT_FRAME) {
1547 for (i = 0; i < 4; i++) {
1548 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1549 s->current_picture.f->data[i] +=
1550 s->current_picture.f->linesize[i];
1552 s->current_picture.f->linesize[i] *= 2;
1553 s->last_picture.f->linesize[i] *= 2;
1554 s->next_picture.f->linesize[i] *= 2;
1558 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1559 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1560 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1561 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1562 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1563 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1565 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1566 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1569 if (s->dct_error_sum) {
1570 assert(s->avctx->noise_reduction && s->encoding);
1571 update_noise_reduction(s);
1577 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1578 const AVFrame *pic_arg, int *got_packet)
1580 MpegEncContext *s = avctx->priv_data;
1581 int i, stuffing_count, ret;
1582 int context_count = s->slice_context_count;
1584 s->picture_in_gop_number++;
1586 if (load_input_picture(s, pic_arg) < 0)
1589 if (select_input_picture(s) < 0) {
1594 if (s->new_picture.f->data[0]) {
1596 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1599 s->mb_info_ptr = av_packet_new_side_data(pkt,
1600 AV_PKT_DATA_H263_MB_INFO,
1601 s->mb_width*s->mb_height*12);
1602 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1605 for (i = 0; i < context_count; i++) {
1606 int start_y = s->thread_context[i]->start_mb_y;
1607 int end_y = s->thread_context[i]-> end_mb_y;
1608 int h = s->mb_height;
1609 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1610 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1612 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1615 s->pict_type = s->new_picture.f->pict_type;
1617 ret = frame_start(s);
1621 if (encode_picture(s, s->picture_number) < 0)
1624 avctx->header_bits = s->header_bits;
1625 avctx->mv_bits = s->mv_bits;
1626 avctx->misc_bits = s->misc_bits;
1627 avctx->i_tex_bits = s->i_tex_bits;
1628 avctx->p_tex_bits = s->p_tex_bits;
1629 avctx->i_count = s->i_count;
1630 // FIXME f/b_count in avctx
1631 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1632 avctx->skip_count = s->skip_count;
1636 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1637 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1639 if (avctx->rc_buffer_size) {
1640 RateControlContext *rcc = &s->rc_context;
1641 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1643 if (put_bits_count(&s->pb) > max_size &&
1644 s->lambda < s->lmax) {
1645 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1646 (s->qscale + 1) / s->qscale);
1647 if (s->adaptive_quant) {
1649 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1650 s->lambda_table[i] =
1651 FFMAX(s->lambda_table[i] + 1,
1652 s->lambda_table[i] * (s->qscale + 1) /
1655 s->mb_skipped = 0; // done in frame_start()
1656 // done in encode_picture() so we must undo it
1657 if (s->pict_type == AV_PICTURE_TYPE_P) {
1658 if (s->flipflop_rounding ||
1659 s->codec_id == AV_CODEC_ID_H263P ||
1660 s->codec_id == AV_CODEC_ID_MPEG4)
1661 s->no_rounding ^= 1;
1663 if (s->pict_type != AV_PICTURE_TYPE_B) {
1664 s->time_base = s->last_time_base;
1665 s->last_non_b_time = s->time - s->pp_time;
1667 for (i = 0; i < context_count; i++) {
1668 PutBitContext *pb = &s->thread_context[i]->pb;
1669 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1674 assert(s->avctx->rc_max_rate);
1677 if (s->avctx->flags & CODEC_FLAG_PASS1)
1678 ff_write_pass1_stats(s);
1680 for (i = 0; i < 4; i++) {
1681 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1682 avctx->error[i] += s->current_picture_ptr->f->error[i];
1685 if (s->avctx->flags & CODEC_FLAG_PASS1)
1686 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1687 avctx->i_tex_bits + avctx->p_tex_bits ==
1688 put_bits_count(&s->pb));
1689 flush_put_bits(&s->pb);
1690 s->frame_bits = put_bits_count(&s->pb);
1692 stuffing_count = ff_vbv_update(s, s->frame_bits);
1693 if (stuffing_count) {
1694 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1695 stuffing_count + 50) {
1696 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1700 switch (s->codec_id) {
1701 case AV_CODEC_ID_MPEG1VIDEO:
1702 case AV_CODEC_ID_MPEG2VIDEO:
1703 while (stuffing_count--) {
1704 put_bits(&s->pb, 8, 0);
1707 case AV_CODEC_ID_MPEG4:
1708 put_bits(&s->pb, 16, 0);
1709 put_bits(&s->pb, 16, 0x1C3);
1710 stuffing_count -= 4;
1711 while (stuffing_count--) {
1712 put_bits(&s->pb, 8, 0xFF);
1716 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1718 flush_put_bits(&s->pb);
1719 s->frame_bits = put_bits_count(&s->pb);
1722 /* update mpeg1/2 vbv_delay for CBR */
1723 if (s->avctx->rc_max_rate &&
1724 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1725 s->out_format == FMT_MPEG1 &&
1726 90000LL * (avctx->rc_buffer_size - 1) <=
1727 s->avctx->rc_max_rate * 0xFFFFLL) {
1728 int vbv_delay, min_delay;
1729 double inbits = s->avctx->rc_max_rate *
1730 av_q2d(s->avctx->time_base);
1731 int minbits = s->frame_bits - 8 *
1732 (s->vbv_delay_ptr - s->pb.buf - 1);
1733 double bits = s->rc_context.buffer_index + minbits - inbits;
1736 av_log(s->avctx, AV_LOG_ERROR,
1737 "Internal error, negative bits\n");
1739 assert(s->repeat_first_field == 0);
1741 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1742 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1743 s->avctx->rc_max_rate;
1745 vbv_delay = FFMAX(vbv_delay, min_delay);
1747 assert(vbv_delay < 0xFFFF);
1749 s->vbv_delay_ptr[0] &= 0xF8;
1750 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1751 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1752 s->vbv_delay_ptr[2] &= 0x07;
1753 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1754 avctx->vbv_delay = vbv_delay * 300;
1756 s->total_bits += s->frame_bits;
1757 avctx->frame_bits = s->frame_bits;
1759 pkt->pts = s->current_picture.f->pts;
1760 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1761 if (!s->current_picture.f->coded_picture_number)
1762 pkt->dts = pkt->pts - s->dts_delta;
1764 pkt->dts = s->reordered_pts;
1765 s->reordered_pts = pkt->pts;
1767 pkt->dts = pkt->pts;
1768 if (s->current_picture.f->key_frame)
1769 pkt->flags |= AV_PKT_FLAG_KEY;
1771 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1775 assert((s->frame_bits & 7) == 0);
1777 pkt->size = s->frame_bits / 8;
1778 *got_packet = !!pkt->size;
1782 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1783 int n, int threshold)
1785 static const char tab[64] = {
1786 3, 2, 2, 1, 1, 1, 1, 1,
1787 1, 1, 1, 1, 1, 1, 1, 1,
1788 1, 1, 1, 1, 1, 1, 1, 1,
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,
1792 0, 0, 0, 0, 0, 0, 0, 0,
1793 0, 0, 0, 0, 0, 0, 0, 0
1798 int16_t *block = s->block[n];
1799 const int last_index = s->block_last_index[n];
1802 if (threshold < 0) {
1804 threshold = -threshold;
1808 /* Are all we could set to zero already zero? */
1809 if (last_index <= skip_dc - 1)
1812 for (i = 0; i <= last_index; i++) {
1813 const int j = s->intra_scantable.permutated[i];
1814 const int level = FFABS(block[j]);
1816 if (skip_dc && i == 0)
1820 } else if (level > 1) {
1826 if (score >= threshold)
1828 for (i = skip_dc; i <= last_index; i++) {
1829 const int j = s->intra_scantable.permutated[i];
1833 s->block_last_index[n] = 0;
1835 s->block_last_index[n] = -1;
1838 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1842 const int maxlevel = s->max_qcoeff;
1843 const int minlevel = s->min_qcoeff;
1847 i = 1; // skip clipping of intra dc
1851 for (; i <= last_index; i++) {
1852 const int j = s->intra_scantable.permutated[i];
1853 int level = block[j];
1855 if (level > maxlevel) {
1858 } else if (level < minlevel) {
1866 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1867 av_log(s->avctx, AV_LOG_INFO,
1868 "warning, clipping %d dct coefficients to %d..%d\n",
1869 overflow, minlevel, maxlevel);
1872 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1876 for (y = 0; y < 8; y++) {
1877 for (x = 0; x < 8; x++) {
1883 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1884 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1885 int v = ptr[x2 + y2 * stride];
1891 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1896 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1897 int motion_x, int motion_y,
1898 int mb_block_height,
1901 int16_t weight[8][64];
1902 int16_t orig[8][64];
1903 const int mb_x = s->mb_x;
1904 const int mb_y = s->mb_y;
1907 int dct_offset = s->linesize * 8; // default for progressive frames
1908 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1909 ptrdiff_t wrap_y, wrap_c;
1911 for (i = 0; i < mb_block_count; i++)
1912 skip_dct[i] = s->skipdct;
1914 if (s->adaptive_quant) {
1915 const int last_qp = s->qscale;
1916 const int mb_xy = mb_x + mb_y * s->mb_stride;
1918 s->lambda = s->lambda_table[mb_xy];
1921 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1922 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1923 s->dquant = s->qscale - last_qp;
1925 if (s->out_format == FMT_H263) {
1926 s->dquant = av_clip(s->dquant, -2, 2);
1928 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1930 if (s->pict_type == AV_PICTURE_TYPE_B) {
1931 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1934 if (s->mv_type == MV_TYPE_8X8)
1940 ff_set_qscale(s, last_qp + s->dquant);
1941 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1942 ff_set_qscale(s, s->qscale + s->dquant);
1944 wrap_y = s->linesize;
1945 wrap_c = s->uvlinesize;
1946 ptr_y = s->new_picture.f->data[0] +
1947 (mb_y * 16 * wrap_y) + mb_x * 16;
1948 ptr_cb = s->new_picture.f->data[1] +
1949 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1950 ptr_cr = s->new_picture.f->data[2] +
1951 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1953 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1954 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
1955 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1957 16, 16, mb_x * 16, mb_y * 16,
1958 s->width, s->height);
1960 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1962 8, mb_block_height, mb_x * 8, mb_y * 8,
1963 s->width >> 1, s->height >> 1);
1964 ptr_cb = ebuf + 18 * wrap_y;
1965 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1967 8, mb_block_height, mb_x * 8, mb_y * 8,
1968 s->width >> 1, s->height >> 1);
1969 ptr_cr = ebuf + 18 * wrap_y + 8;
1973 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
1974 int progressive_score, interlaced_score;
1976 s->interlaced_dct = 0;
1977 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1978 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1979 NULL, wrap_y, 8) - 400;
1981 if (progressive_score > 0) {
1982 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1983 NULL, wrap_y * 2, 8) +
1984 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1985 NULL, wrap_y * 2, 8);
1986 if (progressive_score > interlaced_score) {
1987 s->interlaced_dct = 1;
1989 dct_offset = wrap_y;
1991 if (s->chroma_format == CHROMA_422)
1997 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1998 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1999 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2000 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2002 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2006 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2007 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2008 if (!s->chroma_y_shift) { /* 422 */
2009 s->pdsp.get_pixels(s->block[6],
2010 ptr_cb + (dct_offset >> 1), wrap_c);
2011 s->pdsp.get_pixels(s->block[7],
2012 ptr_cr + (dct_offset >> 1), wrap_c);
2016 op_pixels_func (*op_pix)[4];
2017 qpel_mc_func (*op_qpix)[16];
2018 uint8_t *dest_y, *dest_cb, *dest_cr;
2020 dest_y = s->dest[0];
2021 dest_cb = s->dest[1];
2022 dest_cr = s->dest[2];
2024 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2025 op_pix = s->hdsp.put_pixels_tab;
2026 op_qpix = s->qdsp.put_qpel_pixels_tab;
2028 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2029 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2032 if (s->mv_dir & MV_DIR_FORWARD) {
2033 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2034 s->last_picture.f->data,
2036 op_pix = s->hdsp.avg_pixels_tab;
2037 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2039 if (s->mv_dir & MV_DIR_BACKWARD) {
2040 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2041 s->next_picture.f->data,
2045 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
2046 int progressive_score, interlaced_score;
2048 s->interlaced_dct = 0;
2049 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2050 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2054 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2055 progressive_score -= 400;
2057 if (progressive_score > 0) {
2058 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2060 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2064 if (progressive_score > interlaced_score) {
2065 s->interlaced_dct = 1;
2067 dct_offset = wrap_y;
2069 if (s->chroma_format == CHROMA_422)
2075 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2076 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2077 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2078 dest_y + dct_offset, wrap_y);
2079 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2080 dest_y + dct_offset + 8, wrap_y);
2082 if (s->avctx->flags & CODEC_FLAG_GRAY) {
2086 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2087 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2088 if (!s->chroma_y_shift) { /* 422 */
2089 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2090 dest_cb + (dct_offset >> 1), wrap_c);
2091 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2092 dest_cr + (dct_offset >> 1), wrap_c);
2095 /* pre quantization */
2096 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2097 2 * s->qscale * s->qscale) {
2099 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2101 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2103 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2104 wrap_y, 8) < 20 * s->qscale)
2106 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2107 wrap_y, 8) < 20 * s->qscale)
2109 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2111 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2113 if (!s->chroma_y_shift) { /* 422 */
2114 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2115 dest_cb + (dct_offset >> 1),
2116 wrap_c, 8) < 20 * s->qscale)
2118 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2119 dest_cr + (dct_offset >> 1),
2120 wrap_c, 8) < 20 * s->qscale)
2126 if (s->quantizer_noise_shaping) {
2128 get_visual_weight(weight[0], ptr_y , wrap_y);
2130 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2132 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2134 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2136 get_visual_weight(weight[4], ptr_cb , wrap_c);
2138 get_visual_weight(weight[5], ptr_cr , wrap_c);
2139 if (!s->chroma_y_shift) { /* 422 */
2141 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2144 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2147 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2150 /* DCT & quantize */
2151 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2153 for (i = 0; i < mb_block_count; i++) {
2156 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2157 // FIXME we could decide to change to quantizer instead of
2159 // JS: I don't think that would be a good idea it could lower
2160 // quality instead of improve it. Just INTRADC clipping
2161 // deserves changes in quantizer
2163 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2165 s->block_last_index[i] = -1;
2167 if (s->quantizer_noise_shaping) {
2168 for (i = 0; i < mb_block_count; i++) {
2170 s->block_last_index[i] =
2171 dct_quantize_refine(s, s->block[i], weight[i],
2172 orig[i], i, s->qscale);
2177 if (s->luma_elim_threshold && !s->mb_intra)
2178 for (i = 0; i < 4; i++)
2179 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2180 if (s->chroma_elim_threshold && !s->mb_intra)
2181 for (i = 4; i < mb_block_count; i++)
2182 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2184 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2185 for (i = 0; i < mb_block_count; i++) {
2186 if (s->block_last_index[i] == -1)
2187 s->coded_score[i] = INT_MAX / 256;
2192 if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2193 s->block_last_index[4] =
2194 s->block_last_index[5] = 0;
2196 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2199 // non c quantize code returns incorrect block_last_index FIXME
2200 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2201 for (i = 0; i < mb_block_count; i++) {
2203 if (s->block_last_index[i] > 0) {
2204 for (j = 63; j > 0; j--) {
2205 if (s->block[i][s->intra_scantable.permutated[j]])
2208 s->block_last_index[i] = j;
2213 /* huffman encode */
2214 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2215 case AV_CODEC_ID_MPEG1VIDEO:
2216 case AV_CODEC_ID_MPEG2VIDEO:
2217 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2218 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2220 case AV_CODEC_ID_MPEG4:
2221 if (CONFIG_MPEG4_ENCODER)
2222 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2224 case AV_CODEC_ID_MSMPEG4V2:
2225 case AV_CODEC_ID_MSMPEG4V3:
2226 case AV_CODEC_ID_WMV1:
2227 if (CONFIG_MSMPEG4_ENCODER)
2228 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2230 case AV_CODEC_ID_WMV2:
2231 if (CONFIG_WMV2_ENCODER)
2232 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2234 case AV_CODEC_ID_H261:
2235 if (CONFIG_H261_ENCODER)
2236 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2238 case AV_CODEC_ID_H263:
2239 case AV_CODEC_ID_H263P:
2240 case AV_CODEC_ID_FLV1:
2241 case AV_CODEC_ID_RV10:
2242 case AV_CODEC_ID_RV20:
2243 if (CONFIG_H263_ENCODER)
2244 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2246 case AV_CODEC_ID_MJPEG:
2247 if (CONFIG_MJPEG_ENCODER)
2248 ff_mjpeg_encode_mb(s, s->block);
2255 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2257 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2258 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2261 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2264 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2267 d->mb_skip_run= s->mb_skip_run;
2269 d->last_dc[i] = s->last_dc[i];
2272 d->mv_bits= s->mv_bits;
2273 d->i_tex_bits= s->i_tex_bits;
2274 d->p_tex_bits= s->p_tex_bits;
2275 d->i_count= s->i_count;
2276 d->f_count= s->f_count;
2277 d->b_count= s->b_count;
2278 d->skip_count= s->skip_count;
2279 d->misc_bits= s->misc_bits;
2283 d->qscale= s->qscale;
2284 d->dquant= s->dquant;
2286 d->esc3_level_length= s->esc3_level_length;
2289 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2292 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2293 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2296 d->mb_skip_run= s->mb_skip_run;
2298 d->last_dc[i] = s->last_dc[i];
2301 d->mv_bits= s->mv_bits;
2302 d->i_tex_bits= s->i_tex_bits;
2303 d->p_tex_bits= s->p_tex_bits;
2304 d->i_count= s->i_count;
2305 d->f_count= s->f_count;
2306 d->b_count= s->b_count;
2307 d->skip_count= s->skip_count;
2308 d->misc_bits= s->misc_bits;
2310 d->mb_intra= s->mb_intra;
2311 d->mb_skipped= s->mb_skipped;
2312 d->mv_type= s->mv_type;
2313 d->mv_dir= s->mv_dir;
2315 if(s->data_partitioning){
2317 d->tex_pb= s->tex_pb;
2321 d->block_last_index[i]= s->block_last_index[i];
2322 d->interlaced_dct= s->interlaced_dct;
2323 d->qscale= s->qscale;
2325 d->esc3_level_length= s->esc3_level_length;
2328 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2329 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2330 int *dmin, int *next_block, int motion_x, int motion_y)
2333 uint8_t *dest_backup[3];
2335 copy_context_before_encode(s, backup, type);
2337 s->block= s->blocks[*next_block];
2338 s->pb= pb[*next_block];
2339 if(s->data_partitioning){
2340 s->pb2 = pb2 [*next_block];
2341 s->tex_pb= tex_pb[*next_block];
2345 memcpy(dest_backup, s->dest, sizeof(s->dest));
2346 s->dest[0] = s->sc.rd_scratchpad;
2347 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2348 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2349 assert(s->linesize >= 32); //FIXME
2352 encode_mb(s, motion_x, motion_y);
2354 score= put_bits_count(&s->pb);
2355 if(s->data_partitioning){
2356 score+= put_bits_count(&s->pb2);
2357 score+= put_bits_count(&s->tex_pb);
2360 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2361 ff_mpv_decode_mb(s, s->block);
2363 score *= s->lambda2;
2364 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2368 memcpy(s->dest, dest_backup, sizeof(s->dest));
2375 copy_context_after_encode(best, s, type);
2379 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2380 uint32_t *sq = ff_square_tab + 256;
2385 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2386 else if(w==8 && h==8)
2387 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2391 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2400 static int sse_mb(MpegEncContext *s){
2404 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2405 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2408 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2409 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) +
2410 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) +
2411 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);
2413 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) +
2414 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) +
2415 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);
2418 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)
2419 +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)
2420 +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);
2423 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2424 MpegEncContext *s= *(void**)arg;
2428 s->me.dia_size= s->avctx->pre_dia_size;
2429 s->first_slice_line=1;
2430 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2431 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2432 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2434 s->first_slice_line=0;
2442 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2443 MpegEncContext *s= *(void**)arg;
2445 s->me.dia_size= s->avctx->dia_size;
2446 s->first_slice_line=1;
2447 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2448 s->mb_x=0; //for block init below
2449 ff_init_block_index(s);
2450 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2451 s->block_index[0]+=2;
2452 s->block_index[1]+=2;
2453 s->block_index[2]+=2;
2454 s->block_index[3]+=2;
2456 /* compute motion vector & mb_type and store in context */
2457 if(s->pict_type==AV_PICTURE_TYPE_B)
2458 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2460 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2462 s->first_slice_line=0;
2467 static int mb_var_thread(AVCodecContext *c, void *arg){
2468 MpegEncContext *s= *(void**)arg;
2471 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2472 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2475 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2477 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2479 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2480 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2482 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2483 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2484 s->me.mb_var_sum_temp += varc;
2490 static void write_slice_end(MpegEncContext *s){
2491 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2492 if(s->partitioned_frame){
2493 ff_mpeg4_merge_partitions(s);
2496 ff_mpeg4_stuffing(&s->pb);
2497 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2498 ff_mjpeg_encode_stuffing(&s->pb);
2501 avpriv_align_put_bits(&s->pb);
2502 flush_put_bits(&s->pb);
2504 if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
2505 s->misc_bits+= get_bits_diff(s);
2508 static void write_mb_info(MpegEncContext *s)
2510 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2511 int offset = put_bits_count(&s->pb);
2512 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2513 int gobn = s->mb_y / s->gob_index;
2515 if (CONFIG_H263_ENCODER)
2516 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2517 bytestream_put_le32(&ptr, offset);
2518 bytestream_put_byte(&ptr, s->qscale);
2519 bytestream_put_byte(&ptr, gobn);
2520 bytestream_put_le16(&ptr, mba);
2521 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2522 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2523 /* 4MV not implemented */
2524 bytestream_put_byte(&ptr, 0); /* hmv2 */
2525 bytestream_put_byte(&ptr, 0); /* vmv2 */
2528 static void update_mb_info(MpegEncContext *s, int startcode)
2532 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2533 s->mb_info_size += 12;
2534 s->prev_mb_info = s->last_mb_info;
2537 s->prev_mb_info = put_bits_count(&s->pb)/8;
2538 /* This might have incremented mb_info_size above, and we return without
2539 * actually writing any info into that slot yet. But in that case,
2540 * this will be called again at the start of the after writing the
2541 * start code, actually writing the mb info. */
2545 s->last_mb_info = put_bits_count(&s->pb)/8;
2546 if (!s->mb_info_size)
2547 s->mb_info_size += 12;
2551 static int encode_thread(AVCodecContext *c, void *arg){
2552 MpegEncContext *s= *(void**)arg;
2553 int mb_x, mb_y, pdif = 0;
2554 int chr_h= 16>>s->chroma_y_shift;
2556 MpegEncContext best_s = { 0 }, backup_s;
2557 uint8_t bit_buf[2][MAX_MB_BYTES];
2558 uint8_t bit_buf2[2][MAX_MB_BYTES];
2559 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2560 PutBitContext pb[2], pb2[2], tex_pb[2];
2563 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2564 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2565 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2568 s->last_bits= put_bits_count(&s->pb);
2579 /* init last dc values */
2580 /* note: quant matrix value (8) is implied here */
2581 s->last_dc[i] = 128 << s->intra_dc_precision;
2583 s->current_picture.f->error[i] = 0;
2586 memset(s->last_mv, 0, sizeof(s->last_mv));
2590 switch(s->codec_id){
2591 case AV_CODEC_ID_H263:
2592 case AV_CODEC_ID_H263P:
2593 case AV_CODEC_ID_FLV1:
2594 if (CONFIG_H263_ENCODER)
2595 s->gob_index = H263_GOB_HEIGHT(s->height);
2597 case AV_CODEC_ID_MPEG4:
2598 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2599 ff_mpeg4_init_partitions(s);
2605 s->first_slice_line = 1;
2606 s->ptr_lastgob = s->pb.buf;
2607 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2611 ff_set_qscale(s, s->qscale);
2612 ff_init_block_index(s);
2614 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2615 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2616 int mb_type= s->mb_type[xy];
2621 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2622 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2625 if(s->data_partitioning){
2626 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2627 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2628 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2634 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2635 ff_update_block_index(s);
2637 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2638 ff_h261_reorder_mb_index(s);
2639 xy= s->mb_y*s->mb_stride + s->mb_x;
2640 mb_type= s->mb_type[xy];
2643 /* write gob / video packet header */
2645 int current_packet_size, is_gob_start;
2647 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2649 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2651 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2653 switch(s->codec_id){
2654 case AV_CODEC_ID_H263:
2655 case AV_CODEC_ID_H263P:
2656 if(!s->h263_slice_structured)
2657 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2659 case AV_CODEC_ID_MPEG2VIDEO:
2660 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2661 case AV_CODEC_ID_MPEG1VIDEO:
2662 if(s->mb_skip_run) is_gob_start=0;
2667 if(s->start_mb_y != mb_y || mb_x!=0){
2670 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2671 ff_mpeg4_init_partitions(s);
2675 assert((put_bits_count(&s->pb)&7) == 0);
2676 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2678 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2679 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2680 int d = 100 / s->error_rate;
2682 current_packet_size=0;
2683 s->pb.buf_ptr= s->ptr_lastgob;
2684 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2688 if (s->avctx->rtp_callback){
2689 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2690 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2692 update_mb_info(s, 1);
2694 switch(s->codec_id){
2695 case AV_CODEC_ID_MPEG4:
2696 if (CONFIG_MPEG4_ENCODER) {
2697 ff_mpeg4_encode_video_packet_header(s);
2698 ff_mpeg4_clean_buffers(s);
2701 case AV_CODEC_ID_MPEG1VIDEO:
2702 case AV_CODEC_ID_MPEG2VIDEO:
2703 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2704 ff_mpeg1_encode_slice_header(s);
2705 ff_mpeg1_clean_buffers(s);
2708 case AV_CODEC_ID_H263:
2709 case AV_CODEC_ID_H263P:
2710 if (CONFIG_H263_ENCODER)
2711 ff_h263_encode_gob_header(s, mb_y);
2715 if (s->avctx->flags & CODEC_FLAG_PASS1) {
2716 int bits= put_bits_count(&s->pb);
2717 s->misc_bits+= bits - s->last_bits;
2721 s->ptr_lastgob += current_packet_size;
2722 s->first_slice_line=1;
2723 s->resync_mb_x=mb_x;
2724 s->resync_mb_y=mb_y;
2728 if( (s->resync_mb_x == s->mb_x)
2729 && s->resync_mb_y+1 == s->mb_y){
2730 s->first_slice_line=0;
2734 s->dquant=0; //only for QP_RD
2736 update_mb_info(s, 0);
2738 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
2740 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2742 copy_context_before_encode(&backup_s, s, -1);
2744 best_s.data_partitioning= s->data_partitioning;
2745 best_s.partitioned_frame= s->partitioned_frame;
2746 if(s->data_partitioning){
2747 backup_s.pb2= s->pb2;
2748 backup_s.tex_pb= s->tex_pb;
2751 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2752 s->mv_dir = MV_DIR_FORWARD;
2753 s->mv_type = MV_TYPE_16X16;
2755 s->mv[0][0][0] = s->p_mv_table[xy][0];
2756 s->mv[0][0][1] = s->p_mv_table[xy][1];
2757 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2758 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2760 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2761 s->mv_dir = MV_DIR_FORWARD;
2762 s->mv_type = MV_TYPE_FIELD;
2765 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2766 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2767 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2769 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2770 &dmin, &next_block, 0, 0);
2772 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2773 s->mv_dir = MV_DIR_FORWARD;
2774 s->mv_type = MV_TYPE_16X16;
2778 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2779 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2781 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2782 s->mv_dir = MV_DIR_FORWARD;
2783 s->mv_type = MV_TYPE_8X8;
2786 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2787 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2789 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2790 &dmin, &next_block, 0, 0);
2792 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2793 s->mv_dir = MV_DIR_FORWARD;
2794 s->mv_type = MV_TYPE_16X16;
2796 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2797 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2798 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2799 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2801 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2802 s->mv_dir = MV_DIR_BACKWARD;
2803 s->mv_type = MV_TYPE_16X16;
2805 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2806 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2807 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2808 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2810 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2811 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2812 s->mv_type = MV_TYPE_16X16;
2814 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2815 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2816 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2817 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2818 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2819 &dmin, &next_block, 0, 0);
2821 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2822 s->mv_dir = MV_DIR_FORWARD;
2823 s->mv_type = MV_TYPE_FIELD;
2826 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2827 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2828 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2830 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2831 &dmin, &next_block, 0, 0);
2833 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2834 s->mv_dir = MV_DIR_BACKWARD;
2835 s->mv_type = MV_TYPE_FIELD;
2838 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2839 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2840 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2842 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2843 &dmin, &next_block, 0, 0);
2845 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2846 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2847 s->mv_type = MV_TYPE_FIELD;
2849 for(dir=0; dir<2; dir++){
2851 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2852 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2853 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2856 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2857 &dmin, &next_block, 0, 0);
2859 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2861 s->mv_type = MV_TYPE_16X16;
2865 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2866 &dmin, &next_block, 0, 0);
2867 if(s->h263_pred || s->h263_aic){
2869 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2871 ff_clean_intra_table_entries(s); //old mode?
2875 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2876 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2877 const int last_qp= backup_s.qscale;
2880 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2881 static const int dquant_tab[4]={-1,1,-2,2};
2883 assert(backup_s.dquant == 0);
2886 s->mv_dir= best_s.mv_dir;
2887 s->mv_type = MV_TYPE_16X16;
2888 s->mb_intra= best_s.mb_intra;
2889 s->mv[0][0][0] = best_s.mv[0][0][0];
2890 s->mv[0][0][1] = best_s.mv[0][0][1];
2891 s->mv[1][0][0] = best_s.mv[1][0][0];
2892 s->mv[1][0][1] = best_s.mv[1][0][1];
2894 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2895 for(; qpi<4; qpi++){
2896 int dquant= dquant_tab[qpi];
2897 qp= last_qp + dquant;
2898 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2900 backup_s.dquant= dquant;
2901 if(s->mb_intra && s->dc_val[0]){
2903 dc[i]= s->dc_val[0][ s->block_index[i] ];
2904 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2908 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2909 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2910 if(best_s.qscale != qp){
2911 if(s->mb_intra && s->dc_val[0]){
2913 s->dc_val[0][ s->block_index[i] ]= dc[i];
2914 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2921 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2922 int mx= s->b_direct_mv_table[xy][0];
2923 int my= s->b_direct_mv_table[xy][1];
2925 backup_s.dquant = 0;
2926 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2928 ff_mpeg4_set_direct_mv(s, mx, my);
2929 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2930 &dmin, &next_block, mx, my);
2932 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2933 backup_s.dquant = 0;
2934 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2936 ff_mpeg4_set_direct_mv(s, 0, 0);
2937 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2938 &dmin, &next_block, 0, 0);
2940 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2943 coded |= s->block_last_index[i];
2946 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2947 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2948 mx=my=0; //FIXME find the one we actually used
2949 ff_mpeg4_set_direct_mv(s, mx, my);
2950 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2958 s->mv_dir= best_s.mv_dir;
2959 s->mv_type = best_s.mv_type;
2961 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2962 s->mv[0][0][1] = best_s.mv[0][0][1];
2963 s->mv[1][0][0] = best_s.mv[1][0][0];
2964 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2967 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2968 &dmin, &next_block, mx, my);
2973 s->current_picture.qscale_table[xy] = best_s.qscale;
2975 copy_context_after_encode(s, &best_s, -1);
2977 pb_bits_count= put_bits_count(&s->pb);
2978 flush_put_bits(&s->pb);
2979 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2982 if(s->data_partitioning){
2983 pb2_bits_count= put_bits_count(&s->pb2);
2984 flush_put_bits(&s->pb2);
2985 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2986 s->pb2= backup_s.pb2;
2988 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2989 flush_put_bits(&s->tex_pb);
2990 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2991 s->tex_pb= backup_s.tex_pb;
2993 s->last_bits= put_bits_count(&s->pb);
2995 if (CONFIG_H263_ENCODER &&
2996 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2997 ff_h263_update_motion_val(s);
2999 if(next_block==0){ //FIXME 16 vs linesize16
3000 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3001 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3002 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3005 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3006 ff_mpv_decode_mb(s, s->block);
3008 int motion_x = 0, motion_y = 0;
3009 s->mv_type=MV_TYPE_16X16;
3010 // only one MB-Type possible
3013 case CANDIDATE_MB_TYPE_INTRA:
3016 motion_x= s->mv[0][0][0] = 0;
3017 motion_y= s->mv[0][0][1] = 0;
3019 case CANDIDATE_MB_TYPE_INTER:
3020 s->mv_dir = MV_DIR_FORWARD;
3022 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3023 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3025 case CANDIDATE_MB_TYPE_INTER_I:
3026 s->mv_dir = MV_DIR_FORWARD;
3027 s->mv_type = MV_TYPE_FIELD;
3030 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3031 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3032 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3035 case CANDIDATE_MB_TYPE_INTER4V:
3036 s->mv_dir = MV_DIR_FORWARD;
3037 s->mv_type = MV_TYPE_8X8;
3040 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3041 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3044 case CANDIDATE_MB_TYPE_DIRECT:
3045 if (CONFIG_MPEG4_ENCODER) {
3046 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3048 motion_x=s->b_direct_mv_table[xy][0];
3049 motion_y=s->b_direct_mv_table[xy][1];
3050 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3053 case CANDIDATE_MB_TYPE_DIRECT0:
3054 if (CONFIG_MPEG4_ENCODER) {
3055 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3057 ff_mpeg4_set_direct_mv(s, 0, 0);
3060 case CANDIDATE_MB_TYPE_BIDIR:
3061 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3063 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3064 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3065 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3066 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3068 case CANDIDATE_MB_TYPE_BACKWARD:
3069 s->mv_dir = MV_DIR_BACKWARD;
3071 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3072 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3074 case CANDIDATE_MB_TYPE_FORWARD:
3075 s->mv_dir = MV_DIR_FORWARD;
3077 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3078 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3080 case CANDIDATE_MB_TYPE_FORWARD_I:
3081 s->mv_dir = MV_DIR_FORWARD;
3082 s->mv_type = MV_TYPE_FIELD;
3085 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3086 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3087 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3090 case CANDIDATE_MB_TYPE_BACKWARD_I:
3091 s->mv_dir = MV_DIR_BACKWARD;
3092 s->mv_type = MV_TYPE_FIELD;
3095 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3096 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3097 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3100 case CANDIDATE_MB_TYPE_BIDIR_I:
3101 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3102 s->mv_type = MV_TYPE_FIELD;
3104 for(dir=0; dir<2; dir++){
3106 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3107 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3108 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3113 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3116 encode_mb(s, motion_x, motion_y);
3118 // RAL: Update last macroblock type
3119 s->last_mv_dir = s->mv_dir;
3121 if (CONFIG_H263_ENCODER &&
3122 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3123 ff_h263_update_motion_val(s);
3125 ff_mpv_decode_mb(s, s->block);
3128 /* clean the MV table in IPS frames for direct mode in B frames */
3129 if(s->mb_intra /* && I,P,S_TYPE */){
3130 s->p_mv_table[xy][0]=0;
3131 s->p_mv_table[xy][1]=0;
3134 if (s->avctx->flags & CODEC_FLAG_PSNR) {
3138 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3139 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3141 s->current_picture.f->error[0] += sse(
3142 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3143 s->dest[0], w, h, s->linesize);
3144 s->current_picture.f->error[1] += sse(
3145 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3146 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3147 s->current_picture.f->error[2] += sse(
3148 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3149 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3152 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3153 ff_h263_loop_filter(s);
3155 ff_dlog(s->avctx, "MB %d %d bits\n",
3156 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3160 //not beautiful here but we must write it before flushing so it has to be here
3161 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3162 ff_msmpeg4_encode_ext_header(s);
3166 /* Send the last GOB if RTP */
3167 if (s->avctx->rtp_callback) {
3168 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3169 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3170 /* Call the RTP callback to send the last GOB */
3172 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3178 #define MERGE(field) dst->field += src->field; src->field=0
3179 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3180 MERGE(me.scene_change_score);
3181 MERGE(me.mc_mb_var_sum_temp);
3182 MERGE(me.mb_var_sum_temp);
3185 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3188 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3189 MERGE(dct_count[1]);
3198 MERGE(er.error_count);
3199 MERGE(padding_bug_score);
3200 MERGE(current_picture.f->error[0]);
3201 MERGE(current_picture.f->error[1]);
3202 MERGE(current_picture.f->error[2]);
3204 if(dst->avctx->noise_reduction){
3205 for(i=0; i<64; i++){
3206 MERGE(dct_error_sum[0][i]);
3207 MERGE(dct_error_sum[1][i]);
3211 assert(put_bits_count(&src->pb) % 8 ==0);
3212 assert(put_bits_count(&dst->pb) % 8 ==0);
3213 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3214 flush_put_bits(&dst->pb);
3217 static int estimate_qp(MpegEncContext *s, int dry_run){
3218 if (s->next_lambda){
3219 s->current_picture_ptr->f->quality =
3220 s->current_picture.f->quality = s->next_lambda;
3221 if(!dry_run) s->next_lambda= 0;
3222 } else if (!s->fixed_qscale) {
3223 s->current_picture_ptr->f->quality =
3224 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3225 if (s->current_picture.f->quality < 0)
3229 if(s->adaptive_quant){
3230 switch(s->codec_id){
3231 case AV_CODEC_ID_MPEG4:
3232 if (CONFIG_MPEG4_ENCODER)
3233 ff_clean_mpeg4_qscales(s);
3235 case AV_CODEC_ID_H263:
3236 case AV_CODEC_ID_H263P:
3237 case AV_CODEC_ID_FLV1:
3238 if (CONFIG_H263_ENCODER)
3239 ff_clean_h263_qscales(s);
3242 ff_init_qscale_tab(s);
3245 s->lambda= s->lambda_table[0];
3248 s->lambda = s->current_picture.f->quality;
3253 /* must be called before writing the header */
3254 static void set_frame_distances(MpegEncContext * s){
3255 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3256 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3258 if(s->pict_type==AV_PICTURE_TYPE_B){
3259 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3260 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3262 s->pp_time= s->time - s->last_non_b_time;
3263 s->last_non_b_time= s->time;
3264 assert(s->picture_number==0 || s->pp_time > 0);
3268 static int encode_picture(MpegEncContext *s, int picture_number)
3272 int context_count = s->slice_context_count;
3274 s->picture_number = picture_number;
3276 /* Reset the average MB variance */
3277 s->me.mb_var_sum_temp =
3278 s->me.mc_mb_var_sum_temp = 0;
3280 /* we need to initialize some time vars before we can encode b-frames */
3281 // RAL: Condition added for MPEG1VIDEO
3282 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3283 set_frame_distances(s);
3284 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3285 ff_set_mpeg4_time(s);
3287 s->me.scene_change_score=0;
3289 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3291 if(s->pict_type==AV_PICTURE_TYPE_I){
3292 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3293 else s->no_rounding=0;
3294 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3295 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3296 s->no_rounding ^= 1;
3299 if (s->avctx->flags & CODEC_FLAG_PASS2) {
3300 if (estimate_qp(s,1) < 0)
3302 ff_get_2pass_fcode(s);
3303 } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
3304 if(s->pict_type==AV_PICTURE_TYPE_B)
3305 s->lambda= s->last_lambda_for[s->pict_type];
3307 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3311 s->mb_intra=0; //for the rate distortion & bit compare functions
3312 for(i=1; i<context_count; i++){
3313 ret = ff_update_duplicate_context(s->thread_context[i], s);
3321 /* Estimate motion for every MB */
3322 if(s->pict_type != AV_PICTURE_TYPE_I){
3323 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3324 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3325 if (s->pict_type != AV_PICTURE_TYPE_B) {
3326 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3327 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3331 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3332 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3334 for(i=0; i<s->mb_stride*s->mb_height; i++)
3335 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3337 if(!s->fixed_qscale){
3338 /* finding spatial complexity for I-frame rate control */
3339 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3342 for(i=1; i<context_count; i++){
3343 merge_context_after_me(s, s->thread_context[i]);
3345 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3346 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3349 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3350 s->pict_type= AV_PICTURE_TYPE_I;
3351 for(i=0; i<s->mb_stride*s->mb_height; i++)
3352 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3353 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3354 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3358 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3359 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3361 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3363 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3364 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3365 s->f_code= FFMAX3(s->f_code, a, b);
3368 ff_fix_long_p_mvs(s);
3369 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3370 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3374 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3375 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3380 if(s->pict_type==AV_PICTURE_TYPE_B){
3383 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3384 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3385 s->f_code = FFMAX(a, b);
3387 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3388 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3389 s->b_code = FFMAX(a, b);
3391 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3392 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3393 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3394 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3395 if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
3397 for(dir=0; dir<2; dir++){
3400 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3401 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3402 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3403 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3411 if (estimate_qp(s, 0) < 0)
3414 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3415 s->pict_type == AV_PICTURE_TYPE_I &&
3416 !(s->avctx->flags & CODEC_FLAG_QSCALE))
3417 s->qscale= 3; //reduce clipping problems
3419 if (s->out_format == FMT_MJPEG) {
3420 /* for mjpeg, we do include qscale in the matrix */
3422 int j = s->idsp.idct_permutation[i];
3424 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3426 s->y_dc_scale_table=
3427 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3428 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3429 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3430 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3434 //FIXME var duplication
3435 s->current_picture_ptr->f->key_frame =
3436 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3437 s->current_picture_ptr->f->pict_type =
3438 s->current_picture.f->pict_type = s->pict_type;
3440 if (s->current_picture.f->key_frame)
3441 s->picture_in_gop_number=0;
3443 s->last_bits= put_bits_count(&s->pb);
3444 switch(s->out_format) {
3446 if (CONFIG_MJPEG_ENCODER)
3447 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3451 if (CONFIG_H261_ENCODER)
3452 ff_h261_encode_picture_header(s, picture_number);
3455 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3456 ff_wmv2_encode_picture_header(s, picture_number);
3457 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3458 ff_msmpeg4_encode_picture_header(s, picture_number);
3459 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3460 ff_mpeg4_encode_picture_header(s, picture_number);
3461 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3462 ret = ff_rv10_encode_picture_header(s, picture_number);
3466 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3467 ff_rv20_encode_picture_header(s, picture_number);
3468 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3469 ff_flv_encode_picture_header(s, picture_number);
3470 else if (CONFIG_H263_ENCODER)
3471 ff_h263_encode_picture_header(s, picture_number);
3474 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3475 ff_mpeg1_encode_picture_header(s, picture_number);
3480 bits= put_bits_count(&s->pb);
3481 s->header_bits= bits - s->last_bits;
3483 for(i=1; i<context_count; i++){
3484 update_duplicate_context_after_me(s->thread_context[i], s);
3486 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3487 for(i=1; i<context_count; i++){
3488 merge_context_after_encode(s, s->thread_context[i]);
3494 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3495 const int intra= s->mb_intra;
3498 s->dct_count[intra]++;
3500 for(i=0; i<64; i++){
3501 int level= block[i];
3505 s->dct_error_sum[intra][i] += level;
3506 level -= s->dct_offset[intra][i];
3507 if(level<0) level=0;
3509 s->dct_error_sum[intra][i] -= level;
3510 level += s->dct_offset[intra][i];
3511 if(level>0) level=0;
3518 static int dct_quantize_trellis_c(MpegEncContext *s,
3519 int16_t *block, int n,
3520 int qscale, int *overflow){
3522 const uint8_t *scantable= s->intra_scantable.scantable;
3523 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3525 unsigned int threshold1, threshold2;
3537 int coeff_count[64];
3538 int qmul, qadd, start_i, last_non_zero, i, dc;
3539 const int esc_length= s->ac_esc_length;
3541 uint8_t * last_length;
3542 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3544 s->fdsp.fdct(block);
3546 if(s->dct_error_sum)
3547 s->denoise_dct(s, block);
3549 qadd= ((qscale-1)|1)*8;
3560 /* For AIC we skip quant/dequant of INTRADC */
3565 /* note: block[0] is assumed to be positive */
3566 block[0] = (block[0] + (q >> 1)) / q;
3569 qmat = s->q_intra_matrix[qscale];
3570 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3571 bias= 1<<(QMAT_SHIFT-1);
3572 length = s->intra_ac_vlc_length;
3573 last_length= s->intra_ac_vlc_last_length;
3577 qmat = s->q_inter_matrix[qscale];
3578 length = s->inter_ac_vlc_length;
3579 last_length= s->inter_ac_vlc_last_length;
3583 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3584 threshold2= (threshold1<<1);
3586 for(i=63; i>=start_i; i--) {
3587 const int j = scantable[i];
3588 int level = block[j] * qmat[j];
3590 if(((unsigned)(level+threshold1))>threshold2){
3596 for(i=start_i; i<=last_non_zero; i++) {
3597 const int j = scantable[i];
3598 int level = block[j] * qmat[j];
3600 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3601 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3602 if(((unsigned)(level+threshold1))>threshold2){
3604 level= (bias + level)>>QMAT_SHIFT;
3606 coeff[1][i]= level-1;
3607 // coeff[2][k]= level-2;
3609 level= (bias - level)>>QMAT_SHIFT;
3610 coeff[0][i]= -level;
3611 coeff[1][i]= -level+1;
3612 // coeff[2][k]= -level+2;
3614 coeff_count[i]= FFMIN(level, 2);
3615 assert(coeff_count[i]);
3618 coeff[0][i]= (level>>31)|1;
3623 *overflow= s->max_qcoeff < max; //overflow might have happened
3625 if(last_non_zero < start_i){
3626 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3627 return last_non_zero;
3630 score_tab[start_i]= 0;
3631 survivor[0]= start_i;
3634 for(i=start_i; i<=last_non_zero; i++){
3635 int level_index, j, zero_distortion;
3636 int dct_coeff= FFABS(block[ scantable[i] ]);
3637 int best_score=256*256*256*120;
3639 if (s->fdsp.fdct == ff_fdct_ifast)
3640 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3641 zero_distortion= dct_coeff*dct_coeff;
3643 for(level_index=0; level_index < coeff_count[i]; level_index++){
3645 int level= coeff[level_index][i];
3646 const int alevel= FFABS(level);
3651 if(s->out_format == FMT_H263){
3652 unquant_coeff= alevel*qmul + qadd;
3654 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3656 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3657 unquant_coeff = (unquant_coeff - 1) | 1;
3659 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3660 unquant_coeff = (unquant_coeff - 1) | 1;
3665 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3667 if((level&(~127)) == 0){
3668 for(j=survivor_count-1; j>=0; j--){
3669 int run= i - survivor[j];
3670 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3671 score += score_tab[i-run];
3673 if(score < best_score){
3676 level_tab[i+1]= level-64;
3680 if(s->out_format == FMT_H263){
3681 for(j=survivor_count-1; j>=0; j--){
3682 int run= i - survivor[j];
3683 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3684 score += score_tab[i-run];
3685 if(score < last_score){
3688 last_level= level-64;
3694 distortion += esc_length*lambda;
3695 for(j=survivor_count-1; j>=0; j--){
3696 int run= i - survivor[j];
3697 int score= distortion + score_tab[i-run];
3699 if(score < best_score){
3702 level_tab[i+1]= level-64;
3706 if(s->out_format == FMT_H263){
3707 for(j=survivor_count-1; j>=0; j--){
3708 int run= i - survivor[j];
3709 int score= distortion + score_tab[i-run];
3710 if(score < last_score){
3713 last_level= level-64;
3721 score_tab[i+1]= best_score;
3723 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3724 if(last_non_zero <= 27){
3725 for(; survivor_count; survivor_count--){
3726 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3730 for(; survivor_count; survivor_count--){
3731 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3736 survivor[ survivor_count++ ]= i+1;
3739 if(s->out_format != FMT_H263){
3740 last_score= 256*256*256*120;
3741 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3742 int score= score_tab[i];
3743 if(i) score += lambda*2; //FIXME exacter?
3745 if(score < last_score){
3748 last_level= level_tab[i];
3749 last_run= run_tab[i];
3754 s->coded_score[n] = last_score;
3756 dc= FFABS(block[0]);
3757 last_non_zero= last_i - 1;
3758 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3760 if(last_non_zero < start_i)
3761 return last_non_zero;
3763 if(last_non_zero == 0 && start_i == 0){
3765 int best_score= dc * dc;
3767 for(i=0; i<coeff_count[0]; i++){
3768 int level= coeff[i][0];
3769 int alevel= FFABS(level);
3770 int unquant_coeff, score, distortion;
3772 if(s->out_format == FMT_H263){
3773 unquant_coeff= (alevel*qmul + qadd)>>3;
3775 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3776 unquant_coeff = (unquant_coeff - 1) | 1;
3778 unquant_coeff = (unquant_coeff + 4) >> 3;
3779 unquant_coeff<<= 3 + 3;
3781 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3783 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3784 else score= distortion + esc_length*lambda;
3786 if(score < best_score){
3788 best_level= level - 64;
3791 block[0]= best_level;
3792 s->coded_score[n] = best_score - dc*dc;
3793 if(best_level == 0) return -1;
3794 else return last_non_zero;
3800 block[ perm_scantable[last_non_zero] ]= last_level;
3803 for(; i>start_i; i -= run_tab[i] + 1){
3804 block[ perm_scantable[i-1] ]= level_tab[i];
3807 return last_non_zero;
3810 //#define REFINE_STATS 1
3811 static int16_t basis[64][64];
3813 static void build_basis(uint8_t *perm){
3820 double s= 0.25*(1<<BASIS_SHIFT);
3822 int perm_index= perm[index];
3823 if(i==0) s*= sqrt(0.5);
3824 if(j==0) s*= sqrt(0.5);
3825 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)));
3832 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3833 int16_t *block, int16_t *weight, int16_t *orig,
3836 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3837 const uint8_t *scantable= s->intra_scantable.scantable;
3838 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3839 // unsigned int threshold1, threshold2;
3844 int qmul, qadd, start_i, last_non_zero, i, dc;
3846 uint8_t * last_length;
3848 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3851 static int after_last=0;
3852 static int to_zero=0;
3853 static int from_zero=0;
3856 static int messed_sign=0;
3859 if(basis[0][0] == 0)
3860 build_basis(s->idsp.idct_permutation);
3871 /* For AIC we skip quant/dequant of INTRADC */
3875 q <<= RECON_SHIFT-3;
3876 /* note: block[0] is assumed to be positive */
3878 // block[0] = (block[0] + (q >> 1)) / q;
3880 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3881 // bias= 1<<(QMAT_SHIFT-1);
3882 length = s->intra_ac_vlc_length;
3883 last_length= s->intra_ac_vlc_last_length;
3887 length = s->inter_ac_vlc_length;
3888 last_length= s->inter_ac_vlc_last_length;
3890 last_non_zero = s->block_last_index[n];
3895 dc += (1<<(RECON_SHIFT-1));
3896 for(i=0; i<64; i++){
3897 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3900 STOP_TIMER("memset rem[]")}
3903 for(i=0; i<64; i++){
3908 w= FFABS(weight[i]) + qns*one;
3909 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3912 // w=weight[i] = (63*qns + (w/2)) / w;
3918 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3924 for(i=start_i; i<=last_non_zero; i++){
3925 int j= perm_scantable[i];
3926 const int level= block[j];
3930 if(level<0) coeff= qmul*level - qadd;
3931 else coeff= qmul*level + qadd;
3932 run_tab[rle_index++]=run;
3935 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3941 if(last_non_zero>0){
3942 STOP_TIMER("init rem[]")
3949 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3952 int run2, best_unquant_change=0, analyze_gradient;
3956 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3958 if(analyze_gradient){
3962 for(i=0; i<64; i++){
3965 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3968 STOP_TIMER("rem*w*w")}
3978 const int level= block[0];
3979 int change, old_coeff;
3981 assert(s->mb_intra);
3985 for(change=-1; change<=1; change+=2){
3986 int new_level= level + change;
3987 int score, new_coeff;
3989 new_coeff= q*new_level;
3990 if(new_coeff >= 2048 || new_coeff < 0)
3993 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3994 new_coeff - old_coeff);
3995 if(score<best_score){
3998 best_change= change;
3999 best_unquant_change= new_coeff - old_coeff;
4006 run2= run_tab[rle_index++];
4010 for(i=start_i; i<64; i++){
4011 int j= perm_scantable[i];
4012 const int level= block[j];
4013 int change, old_coeff;
4015 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4019 if(level<0) old_coeff= qmul*level - qadd;
4020 else old_coeff= qmul*level + qadd;
4021 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4025 assert(run2>=0 || i >= last_non_zero );
4028 for(change=-1; change<=1; change+=2){
4029 int new_level= level + change;
4030 int score, new_coeff, unquant_change;
4033 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4037 if(new_level<0) new_coeff= qmul*new_level - qadd;
4038 else new_coeff= qmul*new_level + qadd;
4039 if(new_coeff >= 2048 || new_coeff <= -2048)
4041 //FIXME check for overflow
4044 if(level < 63 && level > -63){
4045 if(i < last_non_zero)
4046 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4047 - length[UNI_AC_ENC_INDEX(run, level+64)];
4049 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4050 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4053 assert(FFABS(new_level)==1);
4055 if(analyze_gradient){
4056 int g= d1[ scantable[i] ];
4057 if(g && (g^new_level) >= 0)
4061 if(i < last_non_zero){
4062 int next_i= i + run2 + 1;
4063 int next_level= block[ perm_scantable[next_i] ] + 64;
4065 if(next_level&(~127))
4068 if(next_i < last_non_zero)
4069 score += length[UNI_AC_ENC_INDEX(run, 65)]
4070 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4071 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4073 score += length[UNI_AC_ENC_INDEX(run, 65)]
4074 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4075 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4077 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4079 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4080 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4086 assert(FFABS(level)==1);
4088 if(i < last_non_zero){
4089 int next_i= i + run2 + 1;
4090 int next_level= block[ perm_scantable[next_i] ] + 64;
4092 if(next_level&(~127))
4095 if(next_i < last_non_zero)
4096 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4097 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4098 - length[UNI_AC_ENC_INDEX(run, 65)];
4100 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4101 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4102 - length[UNI_AC_ENC_INDEX(run, 65)];
4104 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4106 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4107 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4114 unquant_change= new_coeff - old_coeff;
4115 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4117 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4119 if(score<best_score){
4122 best_change= change;
4123 best_unquant_change= unquant_change;
4127 prev_level= level + 64;
4128 if(prev_level&(~127))
4137 STOP_TIMER("iterative step")}
4141 int j= perm_scantable[ best_coeff ];
4143 block[j] += best_change;
4145 if(best_coeff > last_non_zero){
4146 last_non_zero= best_coeff;
4154 if(block[j] - best_change){
4155 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4167 for(; last_non_zero>=start_i; last_non_zero--){
4168 if(block[perm_scantable[last_non_zero]])
4174 if(256*256*256*64 % count == 0){
4175 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);
4180 for(i=start_i; i<=last_non_zero; i++){
4181 int j= perm_scantable[i];
4182 const int level= block[j];
4185 run_tab[rle_index++]=run;
4192 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4198 if(last_non_zero>0){
4199 STOP_TIMER("iterative search")
4204 return last_non_zero;
4208 * Permute an 8x8 block according to permuatation.
4209 * @param block the block which will be permuted according to
4210 * the given permutation vector
4211 * @param permutation the permutation vector
4212 * @param last the last non zero coefficient in scantable order, used to
4213 * speed the permutation up
4214 * @param scantable the used scantable, this is only used to speed the
4215 * permutation up, the block is not (inverse) permutated
4216 * to scantable order!
4218 static void block_permute(int16_t *block, uint8_t *permutation,
4219 const uint8_t *scantable, int last)
4226 //FIXME it is ok but not clean and might fail for some permutations
4227 // if (permutation[1] == 1)
4230 for (i = 0; i <= last; i++) {
4231 const int j = scantable[i];
4236 for (i = 0; i <= last; i++) {
4237 const int j = scantable[i];
4238 const int perm_j = permutation[j];
4239 block[perm_j] = temp[j];
4243 int ff_dct_quantize_c(MpegEncContext *s,
4244 int16_t *block, int n,
4245 int qscale, int *overflow)
4247 int i, j, level, last_non_zero, q, start_i;
4249 const uint8_t *scantable= s->intra_scantable.scantable;
4252 unsigned int threshold1, threshold2;
4254 s->fdsp.fdct(block);
4256 if(s->dct_error_sum)
4257 s->denoise_dct(s, block);
4267 /* For AIC we skip quant/dequant of INTRADC */
4270 /* note: block[0] is assumed to be positive */
4271 block[0] = (block[0] + (q >> 1)) / q;
4274 qmat = s->q_intra_matrix[qscale];
4275 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4279 qmat = s->q_inter_matrix[qscale];
4280 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4282 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4283 threshold2= (threshold1<<1);
4284 for(i=63;i>=start_i;i--) {
4286 level = block[j] * qmat[j];
4288 if(((unsigned)(level+threshold1))>threshold2){
4295 for(i=start_i; i<=last_non_zero; i++) {
4297 level = block[j] * qmat[j];
4299 // if( bias+level >= (1<<QMAT_SHIFT)
4300 // || bias-level >= (1<<QMAT_SHIFT)){
4301 if(((unsigned)(level+threshold1))>threshold2){
4303 level= (bias + level)>>QMAT_SHIFT;
4306 level= (bias - level)>>QMAT_SHIFT;
4314 *overflow= s->max_qcoeff < max; //overflow might have happened
4316 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4317 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4318 block_permute(block, s->idsp.idct_permutation,
4319 scantable, last_non_zero);
4321 return last_non_zero;
4324 #define OFFSET(x) offsetof(MpegEncContext, x)
4325 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4326 static const AVOption h263_options[] = {
4327 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4328 { "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},
4329 { "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 },
4334 static const AVClass h263_class = {
4335 .class_name = "H.263 encoder",
4336 .item_name = av_default_item_name,
4337 .option = h263_options,
4338 .version = LIBAVUTIL_VERSION_INT,
4341 AVCodec ff_h263_encoder = {
4343 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4344 .type = AVMEDIA_TYPE_VIDEO,
4345 .id = AV_CODEC_ID_H263,
4346 .priv_data_size = sizeof(MpegEncContext),
4347 .init = ff_mpv_encode_init,
4348 .encode2 = ff_mpv_encode_picture,
4349 .close = ff_mpv_encode_end,
4350 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4351 .priv_class = &h263_class,
4354 static const AVOption h263p_options[] = {
4355 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4356 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4357 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4358 { "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},
4362 static const AVClass h263p_class = {
4363 .class_name = "H.263p encoder",
4364 .item_name = av_default_item_name,
4365 .option = h263p_options,
4366 .version = LIBAVUTIL_VERSION_INT,
4369 AVCodec ff_h263p_encoder = {
4371 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4372 .type = AVMEDIA_TYPE_VIDEO,
4373 .id = AV_CODEC_ID_H263P,
4374 .priv_data_size = sizeof(MpegEncContext),
4375 .init = ff_mpv_encode_init,
4376 .encode2 = ff_mpv_encode_picture,
4377 .close = ff_mpv_encode_end,
4378 .capabilities = CODEC_CAP_SLICE_THREADS,
4379 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4380 .priv_class = &h263p_class,
4383 static const AVClass msmpeg4v2_class = {
4384 .class_name = "msmpeg4v2 encoder",
4385 .item_name = av_default_item_name,
4386 .option = ff_mpv_generic_options,
4387 .version = LIBAVUTIL_VERSION_INT,
4390 AVCodec ff_msmpeg4v2_encoder = {
4391 .name = "msmpeg4v2",
4392 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4393 .type = AVMEDIA_TYPE_VIDEO,
4394 .id = AV_CODEC_ID_MSMPEG4V2,
4395 .priv_data_size = sizeof(MpegEncContext),
4396 .init = ff_mpv_encode_init,
4397 .encode2 = ff_mpv_encode_picture,
4398 .close = ff_mpv_encode_end,
4399 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4400 .priv_class = &msmpeg4v2_class,
4403 static const AVClass msmpeg4v3_class = {
4404 .class_name = "msmpeg4v3 encoder",
4405 .item_name = av_default_item_name,
4406 .option = ff_mpv_generic_options,
4407 .version = LIBAVUTIL_VERSION_INT,
4410 AVCodec ff_msmpeg4v3_encoder = {
4412 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4413 .type = AVMEDIA_TYPE_VIDEO,
4414 .id = AV_CODEC_ID_MSMPEG4V3,
4415 .priv_data_size = sizeof(MpegEncContext),
4416 .init = ff_mpv_encode_init,
4417 .encode2 = ff_mpv_encode_picture,
4418 .close = ff_mpv_encode_end,
4419 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4420 .priv_class = &msmpeg4v3_class,
4423 static const AVClass wmv1_class = {
4424 .class_name = "wmv1 encoder",
4425 .item_name = av_default_item_name,
4426 .option = ff_mpv_generic_options,
4427 .version = LIBAVUTIL_VERSION_INT,
4430 AVCodec ff_wmv1_encoder = {
4432 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4433 .type = AVMEDIA_TYPE_VIDEO,
4434 .id = AV_CODEC_ID_WMV1,
4435 .priv_data_size = sizeof(MpegEncContext),
4436 .init = ff_mpv_encode_init,
4437 .encode2 = ff_mpv_encode_picture,
4438 .close = ff_mpv_encode_end,
4439 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4440 .priv_class = &wmv1_class,