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 AVCPBProperties *cpb_props;
245 int i, ret, format_supported;
247 mpv_encode_defaults(s);
249 switch (avctx->codec_id) {
250 case AV_CODEC_ID_MPEG2VIDEO:
251 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
252 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
253 av_log(avctx, AV_LOG_ERROR,
254 "only YUV420 and YUV422 are supported\n");
258 case AV_CODEC_ID_MJPEG:
259 format_supported = 0;
260 /* JPEG color space */
261 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
262 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
263 (avctx->color_range == AVCOL_RANGE_JPEG &&
264 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
265 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
266 format_supported = 1;
267 /* MPEG color space */
268 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
269 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
270 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
271 format_supported = 1;
273 if (!format_supported) {
274 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
279 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
280 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
285 switch (avctx->pix_fmt) {
286 case AV_PIX_FMT_YUVJ422P:
287 case AV_PIX_FMT_YUV422P:
288 s->chroma_format = CHROMA_422;
290 case AV_PIX_FMT_YUVJ420P:
291 case AV_PIX_FMT_YUV420P:
293 s->chroma_format = CHROMA_420;
297 #if FF_API_PRIVATE_OPT
298 FF_DISABLE_DEPRECATION_WARNINGS
299 if (avctx->rtp_payload_size)
300 s->rtp_payload_size = avctx->rtp_payload_size;
301 FF_ENABLE_DEPRECATION_WARNINGS
304 s->bit_rate = avctx->bit_rate;
305 s->width = avctx->width;
306 s->height = avctx->height;
307 if (avctx->gop_size > 600 &&
308 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
309 av_log(avctx, AV_LOG_ERROR,
310 "Warning keyframe interval too large! reducing it ...\n");
311 avctx->gop_size = 600;
313 s->gop_size = avctx->gop_size;
315 if (avctx->max_b_frames > MAX_B_FRAMES) {
316 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
317 "is %d.\n", MAX_B_FRAMES);
319 s->max_b_frames = avctx->max_b_frames;
320 s->codec_id = avctx->codec->id;
321 s->strict_std_compliance = avctx->strict_std_compliance;
322 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
323 s->rtp_mode = !!s->rtp_payload_size;
324 s->intra_dc_precision = avctx->intra_dc_precision;
325 s->user_specified_pts = AV_NOPTS_VALUE;
327 if (s->gop_size <= 1) {
334 #if FF_API_MOTION_EST
335 FF_DISABLE_DEPRECATION_WARNINGS
336 s->me_method = avctx->me_method;
337 FF_ENABLE_DEPRECATION_WARNINGS
341 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
344 FF_DISABLE_DEPRECATION_WARNINGS
345 if (avctx->border_masking != 0.0)
346 s->border_masking = avctx->border_masking;
347 FF_ENABLE_DEPRECATION_WARNINGS
350 s->adaptive_quant = (s->avctx->lumi_masking ||
351 s->avctx->dark_masking ||
352 s->avctx->temporal_cplx_masking ||
353 s->avctx->spatial_cplx_masking ||
354 s->avctx->p_masking ||
356 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
359 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
361 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
362 av_log(avctx, AV_LOG_ERROR,
363 "a vbv buffer size is needed, "
364 "for encoding with a maximum bitrate\n");
368 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
369 av_log(avctx, AV_LOG_INFO,
370 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
373 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
374 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
378 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
379 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
383 if (avctx->rc_max_rate &&
384 avctx->rc_max_rate == avctx->bit_rate &&
385 avctx->rc_max_rate != avctx->rc_min_rate) {
386 av_log(avctx, AV_LOG_INFO,
387 "impossible bitrate constraints, this will fail\n");
390 if (avctx->rc_buffer_size &&
391 avctx->bit_rate * (int64_t)avctx->time_base.num >
392 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
393 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
397 if (!s->fixed_qscale &&
398 avctx->bit_rate * av_q2d(avctx->time_base) >
399 avctx->bit_rate_tolerance) {
400 av_log(avctx, AV_LOG_ERROR,
401 "bitrate tolerance too small for bitrate\n");
405 if (s->avctx->rc_max_rate &&
406 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
407 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
408 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
409 90000LL * (avctx->rc_buffer_size - 1) >
410 s->avctx->rc_max_rate * 0xFFFFLL) {
411 av_log(avctx, AV_LOG_INFO,
412 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
413 "specified vbv buffer is too large for the given bitrate!\n");
416 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
417 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
418 s->codec_id != AV_CODEC_ID_FLV1) {
419 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
423 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
424 av_log(avctx, AV_LOG_ERROR,
425 "OBMC is only supported with simple mb decision\n");
429 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
430 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
434 if (s->max_b_frames &&
435 s->codec_id != AV_CODEC_ID_MPEG4 &&
436 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
437 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
438 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
442 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
443 s->codec_id == AV_CODEC_ID_H263 ||
444 s->codec_id == AV_CODEC_ID_H263P) &&
445 (avctx->sample_aspect_ratio.num > 255 ||
446 avctx->sample_aspect_ratio.den > 255)) {
447 av_log(avctx, AV_LOG_ERROR,
448 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
449 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
453 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
454 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
455 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
459 #if FF_API_PRIVATE_OPT
460 FF_DISABLE_DEPRECATION_WARNINGS
461 if (avctx->mpeg_quant)
462 s->mpeg_quant = avctx->mpeg_quant;
463 FF_ENABLE_DEPRECATION_WARNINGS
466 // FIXME mpeg2 uses that too
467 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
468 av_log(avctx, AV_LOG_ERROR,
469 "mpeg2 style quantization not supported by codec\n");
473 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
474 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
478 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
479 s->avctx->mb_decision != FF_MB_DECISION_RD) {
480 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
484 #if FF_API_PRIVATE_OPT
485 FF_DISABLE_DEPRECATION_WARNINGS
486 if (avctx->scenechange_threshold)
487 s->scenechange_threshold = avctx->scenechange_threshold;
488 FF_ENABLE_DEPRECATION_WARNINGS
491 if (s->scenechange_threshold < 1000000000 &&
492 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
493 av_log(avctx, AV_LOG_ERROR,
494 "closed gop with scene change detection are not supported yet, "
495 "set threshold to 1000000000\n");
499 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
500 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
501 av_log(avctx, AV_LOG_ERROR,
502 "low delay forcing is only available for mpeg2\n");
505 if (s->max_b_frames != 0) {
506 av_log(avctx, AV_LOG_ERROR,
507 "b frames cannot be used with low delay\n");
512 if (s->q_scale_type == 1) {
513 if (avctx->qmax > 12) {
514 av_log(avctx, AV_LOG_ERROR,
515 "non linear quant only supports qmax <= 12 currently\n");
520 if (avctx->slices > 1 &&
521 (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
522 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
523 return AVERROR(EINVAL);
526 if (s->avctx->thread_count > 1 &&
527 s->codec_id != AV_CODEC_ID_MPEG4 &&
528 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
529 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
530 (s->codec_id != AV_CODEC_ID_H263P)) {
531 av_log(avctx, AV_LOG_ERROR,
532 "multi threaded encoding not supported by codec\n");
536 if (s->avctx->thread_count < 1) {
537 av_log(avctx, AV_LOG_ERROR,
538 "automatic thread number detection not supported by codec,"
543 if (!avctx->time_base.den || !avctx->time_base.num) {
544 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
548 #if FF_API_PRIVATE_OPT
549 FF_DISABLE_DEPRECATION_WARNINGS
550 if (avctx->b_frame_strategy)
551 s->b_frame_strategy = avctx->b_frame_strategy;
552 if (avctx->b_sensitivity != 40)
553 s->b_sensitivity = avctx->b_sensitivity;
554 FF_ENABLE_DEPRECATION_WARNINGS
557 if (s->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
558 av_log(avctx, AV_LOG_INFO,
559 "notice: b_frame_strategy only affects the first pass\n");
560 s->b_frame_strategy = 0;
563 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
565 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
566 avctx->time_base.den /= i;
567 avctx->time_base.num /= i;
571 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
572 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
573 // (a + x * 3 / 8) / x
574 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
575 s->inter_quant_bias = 0;
577 s->intra_quant_bias = 0;
579 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
582 #if FF_API_QUANT_BIAS
583 FF_DISABLE_DEPRECATION_WARNINGS
584 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
585 s->intra_quant_bias = avctx->intra_quant_bias;
586 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
587 s->inter_quant_bias = avctx->inter_quant_bias;
588 FF_ENABLE_DEPRECATION_WARNINGS
591 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
592 s->avctx->time_base.den > (1 << 16) - 1) {
593 av_log(avctx, AV_LOG_ERROR,
594 "timebase %d/%d not supported by MPEG 4 standard, "
595 "the maximum admitted value for the timebase denominator "
596 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
600 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
602 switch (avctx->codec->id) {
603 case AV_CODEC_ID_MPEG1VIDEO:
604 s->out_format = FMT_MPEG1;
605 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
606 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
608 case AV_CODEC_ID_MPEG2VIDEO:
609 s->out_format = FMT_MPEG1;
610 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
611 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
614 case AV_CODEC_ID_MJPEG:
615 s->out_format = FMT_MJPEG;
616 s->intra_only = 1; /* force intra only for jpeg */
617 if (!CONFIG_MJPEG_ENCODER ||
618 ff_mjpeg_encode_init(s) < 0)
623 case AV_CODEC_ID_H261:
624 if (!CONFIG_H261_ENCODER)
626 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
627 av_log(avctx, AV_LOG_ERROR,
628 "The specified picture size of %dx%d is not valid for the "
629 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
630 s->width, s->height);
633 s->out_format = FMT_H261;
636 s->rtp_mode = 0; /* Sliced encoding not supported */
638 case AV_CODEC_ID_H263:
639 if (!CONFIG_H263_ENCODER)
641 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
642 s->width, s->height) == 8) {
643 av_log(avctx, AV_LOG_INFO,
644 "The specified picture size of %dx%d is not valid for "
645 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
646 "352x288, 704x576, and 1408x1152."
647 "Try H.263+.\n", s->width, s->height);
650 s->out_format = FMT_H263;
654 case AV_CODEC_ID_H263P:
655 s->out_format = FMT_H263;
658 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
659 s->modified_quant = s->h263_aic;
660 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
661 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
664 /* These are just to be sure */
668 case AV_CODEC_ID_FLV1:
669 s->out_format = FMT_H263;
670 s->h263_flv = 2; /* format = 1; 11-bit codes */
671 s->unrestricted_mv = 1;
672 s->rtp_mode = 0; /* don't allow GOB */
676 case AV_CODEC_ID_RV10:
677 s->out_format = FMT_H263;
681 case AV_CODEC_ID_RV20:
682 s->out_format = FMT_H263;
685 s->modified_quant = 1;
689 s->unrestricted_mv = 0;
691 case AV_CODEC_ID_MPEG4:
692 s->out_format = FMT_H263;
694 s->unrestricted_mv = 1;
695 s->low_delay = s->max_b_frames ? 0 : 1;
696 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
698 case AV_CODEC_ID_MSMPEG4V2:
699 s->out_format = FMT_H263;
701 s->unrestricted_mv = 1;
702 s->msmpeg4_version = 2;
706 case AV_CODEC_ID_MSMPEG4V3:
707 s->out_format = FMT_H263;
709 s->unrestricted_mv = 1;
710 s->msmpeg4_version = 3;
711 s->flipflop_rounding = 1;
715 case AV_CODEC_ID_WMV1:
716 s->out_format = FMT_H263;
718 s->unrestricted_mv = 1;
719 s->msmpeg4_version = 4;
720 s->flipflop_rounding = 1;
724 case AV_CODEC_ID_WMV2:
725 s->out_format = FMT_H263;
727 s->unrestricted_mv = 1;
728 s->msmpeg4_version = 5;
729 s->flipflop_rounding = 1;
737 #if FF_API_PRIVATE_OPT
738 FF_DISABLE_DEPRECATION_WARNINGS
739 if (avctx->noise_reduction)
740 s->noise_reduction = avctx->noise_reduction;
741 FF_ENABLE_DEPRECATION_WARNINGS
744 avctx->has_b_frames = !s->low_delay;
748 s->progressive_frame =
749 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
750 AV_CODEC_FLAG_INTERLACED_ME) ||
755 if (ff_mpv_common_init(s) < 0)
759 ff_mpv_encode_init_x86(s);
761 ff_fdctdsp_init(&s->fdsp, avctx);
762 ff_me_cmp_init(&s->mecc, avctx);
763 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
764 ff_pixblockdsp_init(&s->pdsp, avctx);
765 ff_qpeldsp_init(&s->qdsp);
767 if (s->msmpeg4_version) {
768 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
769 2 * 2 * (MAX_LEVEL + 1) *
770 (MAX_RUN + 1) * 2 * sizeof(int), fail);
772 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
774 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
775 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
776 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
777 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
778 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
779 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
780 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
781 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
784 if (s->noise_reduction) {
785 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
786 2 * 64 * sizeof(uint16_t), fail);
789 if (CONFIG_H263_ENCODER)
790 ff_h263dsp_init(&s->h263dsp);
791 if (!s->dct_quantize)
792 s->dct_quantize = ff_dct_quantize_c;
794 s->denoise_dct = denoise_dct_c;
795 s->fast_dct_quantize = s->dct_quantize;
797 s->dct_quantize = dct_quantize_trellis_c;
799 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
800 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
802 if (s->slice_context_count > 1) {
805 if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P)
806 s->h263_slice_structured = 1;
809 s->quant_precision = 5;
811 #if FF_API_PRIVATE_OPT
812 FF_DISABLE_DEPRECATION_WARNINGS
813 if (avctx->frame_skip_threshold)
814 s->frame_skip_threshold = avctx->frame_skip_threshold;
815 if (avctx->frame_skip_factor)
816 s->frame_skip_factor = avctx->frame_skip_factor;
817 if (avctx->frame_skip_exp)
818 s->frame_skip_exp = avctx->frame_skip_exp;
819 if (avctx->frame_skip_cmp != FF_CMP_DCTMAX)
820 s->frame_skip_cmp = avctx->frame_skip_cmp;
821 FF_ENABLE_DEPRECATION_WARNINGS
824 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
825 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->frame_skip_cmp);
827 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
828 ff_h261_encode_init(s);
829 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
830 ff_h263_encode_init(s);
831 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
832 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
834 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
835 && s->out_format == FMT_MPEG1)
836 ff_mpeg1_encode_init(s);
839 for (i = 0; i < 64; i++) {
840 int j = s->idsp.idct_permutation[i];
841 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
843 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
844 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
845 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
847 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
850 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
851 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
853 if (s->avctx->intra_matrix)
854 s->intra_matrix[j] = s->avctx->intra_matrix[i];
855 if (s->avctx->inter_matrix)
856 s->inter_matrix[j] = s->avctx->inter_matrix[i];
859 /* precompute matrix */
860 /* for mjpeg, we do include qscale in the matrix */
861 if (s->out_format != FMT_MJPEG) {
862 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
863 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
865 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
866 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
870 if (ff_rate_control_init(s) < 0)
873 #if FF_API_ERROR_RATE
874 FF_DISABLE_DEPRECATION_WARNINGS
875 if (avctx->error_rate)
876 s->error_rate = avctx->error_rate;
877 FF_ENABLE_DEPRECATION_WARNINGS;
880 #if FF_API_NORMALIZE_AQP
881 FF_DISABLE_DEPRECATION_WARNINGS
882 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
883 s->mpv_flags |= FF_MPV_FLAG_NAQ;
884 FF_ENABLE_DEPRECATION_WARNINGS;
888 FF_DISABLE_DEPRECATION_WARNINGS
889 if (avctx->flags & CODEC_FLAG_MV0)
890 s->mpv_flags |= FF_MPV_FLAG_MV0;
891 FF_ENABLE_DEPRECATION_WARNINGS
895 FF_DISABLE_DEPRECATION_WARNINGS
896 if (avctx->rc_qsquish != 0.0)
897 s->rc_qsquish = avctx->rc_qsquish;
898 if (avctx->rc_qmod_amp != 0.0)
899 s->rc_qmod_amp = avctx->rc_qmod_amp;
900 if (avctx->rc_qmod_freq)
901 s->rc_qmod_freq = avctx->rc_qmod_freq;
902 if (avctx->rc_buffer_aggressivity != 1.0)
903 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
904 if (avctx->rc_initial_cplx != 0.0)
905 s->rc_initial_cplx = avctx->rc_initial_cplx;
907 s->lmin = avctx->lmin;
909 s->lmax = avctx->lmax;
913 s->rc_eq = av_strdup(avctx->rc_eq);
915 return AVERROR(ENOMEM);
917 FF_ENABLE_DEPRECATION_WARNINGS
920 #if FF_API_PRIVATE_OPT
921 FF_DISABLE_DEPRECATION_WARNINGS
922 if (avctx->brd_scale)
923 s->brd_scale = avctx->brd_scale;
925 if (avctx->prediction_method)
926 s->pred = avctx->prediction_method + 1;
927 FF_ENABLE_DEPRECATION_WARNINGS
930 if (s->b_frame_strategy == 2) {
931 for (i = 0; i < s->max_b_frames + 2; i++) {
932 s->tmp_frames[i] = av_frame_alloc();
933 if (!s->tmp_frames[i])
934 return AVERROR(ENOMEM);
936 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
937 s->tmp_frames[i]->width = s->width >> s->brd_scale;
938 s->tmp_frames[i]->height = s->height >> s->brd_scale;
940 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
946 cpb_props = ff_add_cpb_side_data(avctx);
948 return AVERROR(ENOMEM);
949 cpb_props->max_bitrate = avctx->rc_max_rate;
950 cpb_props->min_bitrate = avctx->rc_min_rate;
951 cpb_props->avg_bitrate = avctx->bit_rate;
952 cpb_props->buffer_size = avctx->rc_buffer_size;
956 ff_mpv_encode_end(avctx);
957 return AVERROR_UNKNOWN;
960 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
962 MpegEncContext *s = avctx->priv_data;
965 ff_rate_control_uninit(s);
967 ff_mpv_common_end(s);
968 if (CONFIG_MJPEG_ENCODER &&
969 s->out_format == FMT_MJPEG)
970 ff_mjpeg_encode_close(s);
972 av_freep(&avctx->extradata);
974 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
975 av_frame_free(&s->tmp_frames[i]);
977 ff_free_picture_tables(&s->new_picture);
978 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
980 av_freep(&s->avctx->stats_out);
981 av_freep(&s->ac_stats);
983 av_freep(&s->q_intra_matrix);
984 av_freep(&s->q_inter_matrix);
985 av_freep(&s->q_intra_matrix16);
986 av_freep(&s->q_inter_matrix16);
987 av_freep(&s->input_picture);
988 av_freep(&s->reordered_input_picture);
989 av_freep(&s->dct_offset);
994 static int get_sae(uint8_t *src, int ref, int stride)
999 for (y = 0; y < 16; y++) {
1000 for (x = 0; x < 16; x++) {
1001 acc += FFABS(src[x + y * stride] - ref);
1008 static int get_intra_count(MpegEncContext *s, uint8_t *src,
1009 uint8_t *ref, int stride)
1015 h = s->height & ~15;
1017 for (y = 0; y < h; y += 16) {
1018 for (x = 0; x < w; x += 16) {
1019 int offset = x + y * stride;
1020 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
1022 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
1023 int sae = get_sae(src + offset, mean, stride);
1025 acc += sae + 500 < sad;
1031 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
1033 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
1034 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
1035 s->mb_stride, s->mb_height, s->b8_stride,
1036 &s->linesize, &s->uvlinesize);
1039 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
1041 Picture *pic = NULL;
1043 int i, display_picture_number = 0, ret;
1044 int encoding_delay = s->max_b_frames ? s->max_b_frames
1045 : (s->low_delay ? 0 : 1);
1046 int flush_offset = 1;
1051 display_picture_number = s->input_picture_number++;
1053 if (pts != AV_NOPTS_VALUE) {
1054 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1056 int64_t last = s->user_specified_pts;
1059 av_log(s->avctx, AV_LOG_ERROR,
1060 "Error, Invalid timestamp=%"PRId64", "
1061 "last=%"PRId64"\n", pts, s->user_specified_pts);
1065 if (!s->low_delay && display_picture_number == 1)
1066 s->dts_delta = time - last;
1068 s->user_specified_pts = pts;
1070 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1071 s->user_specified_pts =
1072 pts = s->user_specified_pts + 1;
1073 av_log(s->avctx, AV_LOG_INFO,
1074 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1077 pts = display_picture_number;
1081 if (!pic_arg->buf[0] ||
1082 pic_arg->linesize[0] != s->linesize ||
1083 pic_arg->linesize[1] != s->uvlinesize ||
1084 pic_arg->linesize[2] != s->uvlinesize)
1086 if ((s->width & 15) || (s->height & 15))
1089 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1090 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1092 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1096 pic = &s->picture[i];
1100 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1103 ret = alloc_picture(s, pic, direct);
1108 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1109 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1110 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1113 int h_chroma_shift, v_chroma_shift;
1114 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1118 for (i = 0; i < 3; i++) {
1119 int src_stride = pic_arg->linesize[i];
1120 int dst_stride = i ? s->uvlinesize : s->linesize;
1121 int h_shift = i ? h_chroma_shift : 0;
1122 int v_shift = i ? v_chroma_shift : 0;
1123 int w = s->width >> h_shift;
1124 int h = s->height >> v_shift;
1125 uint8_t *src = pic_arg->data[i];
1126 uint8_t *dst = pic->f->data[i];
1128 if (!s->avctx->rc_buffer_size)
1129 dst += INPLACE_OFFSET;
1131 if (src_stride == dst_stride)
1132 memcpy(dst, src, src_stride * h);
1135 uint8_t *dst2 = dst;
1137 memcpy(dst2, src, w);
1142 if ((s->width & 15) || (s->height & 15)) {
1143 s->mpvencdsp.draw_edges(dst, dst_stride,
1152 ret = av_frame_copy_props(pic->f, pic_arg);
1156 pic->f->display_picture_number = display_picture_number;
1157 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1159 /* Flushing: When we have not received enough input frames,
1160 * ensure s->input_picture[0] contains the first picture */
1161 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1162 if (s->input_picture[flush_offset])
1165 if (flush_offset <= 1)
1168 encoding_delay = encoding_delay - flush_offset + 1;
1171 /* shift buffer entries */
1172 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1173 s->input_picture[i - flush_offset] = s->input_picture[i];
1175 s->input_picture[encoding_delay] = (Picture*) pic;
1180 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1184 int64_t score64 = 0;
1186 for (plane = 0; plane < 3; plane++) {
1187 const int stride = p->f->linesize[plane];
1188 const int bw = plane ? 1 : 2;
1189 for (y = 0; y < s->mb_height * bw; y++) {
1190 for (x = 0; x < s->mb_width * bw; x++) {
1191 int off = p->shared ? 0 : 16;
1192 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1193 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1194 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1196 switch (s->frame_skip_exp) {
1197 case 0: score = FFMAX(score, v); break;
1198 case 1: score += FFABS(v); break;
1199 case 2: score += v * v; break;
1200 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1201 case 4: score64 += v * v * (int64_t)(v * v); break;
1210 if (score64 < s->frame_skip_threshold)
1212 if (score64 < ((s->frame_skip_factor * (int64_t) s->lambda) >> 8))
1217 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1219 AVPacket pkt = { 0 };
1220 int ret, got_output;
1222 av_init_packet(&pkt);
1223 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1228 av_packet_unref(&pkt);
1232 static int estimate_best_b_count(MpegEncContext *s)
1234 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1235 AVCodecContext *c = avcodec_alloc_context3(NULL);
1236 const int scale = s->brd_scale;
1237 int i, j, out_size, p_lambda, b_lambda, lambda2;
1238 int64_t best_rd = INT64_MAX;
1239 int best_b_count = -1;
1242 return AVERROR(ENOMEM);
1243 assert(scale >= 0 && scale <= 3);
1246 //s->next_picture_ptr->quality;
1247 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1248 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1249 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1250 if (!b_lambda) // FIXME we should do this somewhere else
1251 b_lambda = p_lambda;
1252 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1255 c->width = s->width >> scale;
1256 c->height = s->height >> scale;
1257 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1258 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1259 c->mb_decision = s->avctx->mb_decision;
1260 c->me_cmp = s->avctx->me_cmp;
1261 c->mb_cmp = s->avctx->mb_cmp;
1262 c->me_sub_cmp = s->avctx->me_sub_cmp;
1263 c->pix_fmt = AV_PIX_FMT_YUV420P;
1264 c->time_base = s->avctx->time_base;
1265 c->max_b_frames = s->max_b_frames;
1267 if (avcodec_open2(c, codec, NULL) < 0)
1270 for (i = 0; i < s->max_b_frames + 2; i++) {
1271 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1272 s->next_picture_ptr;
1274 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1275 pre_input = *pre_input_ptr;
1277 if (!pre_input.shared && i) {
1278 pre_input.f->data[0] += INPLACE_OFFSET;
1279 pre_input.f->data[1] += INPLACE_OFFSET;
1280 pre_input.f->data[2] += INPLACE_OFFSET;
1283 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1284 s->tmp_frames[i]->linesize[0],
1285 pre_input.f->data[0],
1286 pre_input.f->linesize[0],
1287 c->width, c->height);
1288 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1289 s->tmp_frames[i]->linesize[1],
1290 pre_input.f->data[1],
1291 pre_input.f->linesize[1],
1292 c->width >> 1, c->height >> 1);
1293 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1294 s->tmp_frames[i]->linesize[2],
1295 pre_input.f->data[2],
1296 pre_input.f->linesize[2],
1297 c->width >> 1, c->height >> 1);
1301 for (j = 0; j < s->max_b_frames + 1; j++) {
1304 if (!s->input_picture[j])
1307 c->error[0] = c->error[1] = c->error[2] = 0;
1309 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1310 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1312 out_size = encode_frame(c, s->tmp_frames[0]);
1314 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1316 for (i = 0; i < s->max_b_frames + 1; i++) {
1317 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1319 s->tmp_frames[i + 1]->pict_type = is_p ?
1320 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1321 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1323 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1325 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1328 /* get the delayed frames */
1330 out_size = encode_frame(c, NULL);
1331 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1334 rd += c->error[0] + c->error[1] + c->error[2];
1345 return best_b_count;
1348 static int select_input_picture(MpegEncContext *s)
1352 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1353 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1354 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1356 /* set next picture type & ordering */
1357 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1358 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1359 !s->next_picture_ptr || s->intra_only) {
1360 s->reordered_input_picture[0] = s->input_picture[0];
1361 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1362 s->reordered_input_picture[0]->f->coded_picture_number =
1363 s->coded_picture_number++;
1367 if (s->frame_skip_threshold || s->frame_skip_factor) {
1368 if (s->picture_in_gop_number < s->gop_size &&
1369 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1370 // FIXME check that te gop check above is +-1 correct
1371 av_frame_unref(s->input_picture[0]->f);
1374 ff_vbv_update(s, 0);
1380 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1381 for (i = 0; i < s->max_b_frames + 1; i++) {
1382 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1384 if (pict_num >= s->rc_context.num_entries)
1386 if (!s->input_picture[i]) {
1387 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1391 s->input_picture[i]->f->pict_type =
1392 s->rc_context.entry[pict_num].new_pict_type;
1396 if (s->b_frame_strategy == 0) {
1397 b_frames = s->max_b_frames;
1398 while (b_frames && !s->input_picture[b_frames])
1400 } else if (s->b_frame_strategy == 1) {
1401 for (i = 1; i < s->max_b_frames + 1; i++) {
1402 if (s->input_picture[i] &&
1403 s->input_picture[i]->b_frame_score == 0) {
1404 s->input_picture[i]->b_frame_score =
1406 s->input_picture[i ]->f->data[0],
1407 s->input_picture[i - 1]->f->data[0],
1411 for (i = 0; i < s->max_b_frames + 1; i++) {
1412 if (!s->input_picture[i] ||
1413 s->input_picture[i]->b_frame_score - 1 >
1414 s->mb_num / s->b_sensitivity)
1418 b_frames = FFMAX(0, i - 1);
1421 for (i = 0; i < b_frames + 1; i++) {
1422 s->input_picture[i]->b_frame_score = 0;
1424 } else if (s->b_frame_strategy == 2) {
1425 b_frames = estimate_best_b_count(s);
1430 for (i = b_frames - 1; i >= 0; i--) {
1431 int type = s->input_picture[i]->f->pict_type;
1432 if (type && type != AV_PICTURE_TYPE_B)
1435 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1436 b_frames == s->max_b_frames) {
1437 av_log(s->avctx, AV_LOG_ERROR,
1438 "warning, too many b frames in a row\n");
1441 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1442 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1443 s->gop_size > s->picture_in_gop_number) {
1444 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1446 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1448 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1452 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1453 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1456 s->reordered_input_picture[0] = s->input_picture[b_frames];
1457 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1458 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1459 s->reordered_input_picture[0]->f->coded_picture_number =
1460 s->coded_picture_number++;
1461 for (i = 0; i < b_frames; i++) {
1462 s->reordered_input_picture[i + 1] = s->input_picture[i];
1463 s->reordered_input_picture[i + 1]->f->pict_type =
1465 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1466 s->coded_picture_number++;
1471 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1473 if (s->reordered_input_picture[0]) {
1474 s->reordered_input_picture[0]->reference =
1475 s->reordered_input_picture[0]->f->pict_type !=
1476 AV_PICTURE_TYPE_B ? 3 : 0;
1478 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1481 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1482 // input is a shared pix, so we can't modifiy it -> alloc a new
1483 // one & ensure that the shared one is reuseable
1486 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1489 pic = &s->picture[i];
1491 pic->reference = s->reordered_input_picture[0]->reference;
1492 if (alloc_picture(s, pic, 0) < 0) {
1496 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1500 /* mark us unused / free shared pic */
1501 av_frame_unref(s->reordered_input_picture[0]->f);
1502 s->reordered_input_picture[0]->shared = 0;
1504 s->current_picture_ptr = pic;
1506 // input is not a shared pix -> reuse buffer for current_pix
1507 s->current_picture_ptr = s->reordered_input_picture[0];
1508 for (i = 0; i < 4; i++) {
1509 s->new_picture.f->data[i] += INPLACE_OFFSET;
1512 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1513 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1514 s->current_picture_ptr)) < 0)
1517 s->picture_number = s->new_picture.f->display_picture_number;
1522 static void frame_end(MpegEncContext *s)
1526 if (s->unrestricted_mv &&
1527 s->current_picture.reference &&
1529 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1530 int hshift = desc->log2_chroma_w;
1531 int vshift = desc->log2_chroma_h;
1532 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1533 s->h_edge_pos, s->v_edge_pos,
1534 EDGE_WIDTH, EDGE_WIDTH,
1535 EDGE_TOP | EDGE_BOTTOM);
1536 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1537 s->h_edge_pos >> hshift,
1538 s->v_edge_pos >> vshift,
1539 EDGE_WIDTH >> hshift,
1540 EDGE_WIDTH >> vshift,
1541 EDGE_TOP | EDGE_BOTTOM);
1542 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1543 s->h_edge_pos >> hshift,
1544 s->v_edge_pos >> vshift,
1545 EDGE_WIDTH >> hshift,
1546 EDGE_WIDTH >> vshift,
1547 EDGE_TOP | EDGE_BOTTOM);
1552 s->last_pict_type = s->pict_type;
1553 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1554 if (s->pict_type!= AV_PICTURE_TYPE_B)
1555 s->last_non_b_pict_type = s->pict_type;
1558 /* release non-reference frames */
1559 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1560 if (!s->picture[i].reference)
1561 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1565 #if FF_API_CODED_FRAME
1566 FF_DISABLE_DEPRECATION_WARNINGS
1567 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1568 FF_ENABLE_DEPRECATION_WARNINGS
1570 #if FF_API_ERROR_FRAME
1571 FF_DISABLE_DEPRECATION_WARNINGS
1572 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1573 sizeof(s->current_picture.encoding_error));
1574 FF_ENABLE_DEPRECATION_WARNINGS
1578 static void update_noise_reduction(MpegEncContext *s)
1582 for (intra = 0; intra < 2; intra++) {
1583 if (s->dct_count[intra] > (1 << 16)) {
1584 for (i = 0; i < 64; i++) {
1585 s->dct_error_sum[intra][i] >>= 1;
1587 s->dct_count[intra] >>= 1;
1590 for (i = 0; i < 64; i++) {
1591 s->dct_offset[intra][i] = (s->noise_reduction *
1592 s->dct_count[intra] +
1593 s->dct_error_sum[intra][i] / 2) /
1594 (s->dct_error_sum[intra][i] + 1);
1599 static int frame_start(MpegEncContext *s)
1603 /* mark & release old frames */
1604 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1605 s->last_picture_ptr != s->next_picture_ptr &&
1606 s->last_picture_ptr->f->buf[0]) {
1607 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1610 s->current_picture_ptr->f->pict_type = s->pict_type;
1611 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1613 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1614 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1615 s->current_picture_ptr)) < 0)
1618 if (s->pict_type != AV_PICTURE_TYPE_B) {
1619 s->last_picture_ptr = s->next_picture_ptr;
1621 s->next_picture_ptr = s->current_picture_ptr;
1624 if (s->last_picture_ptr) {
1625 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1626 if (s->last_picture_ptr->f->buf[0] &&
1627 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1628 s->last_picture_ptr)) < 0)
1631 if (s->next_picture_ptr) {
1632 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1633 if (s->next_picture_ptr->f->buf[0] &&
1634 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1635 s->next_picture_ptr)) < 0)
1639 if (s->picture_structure!= PICT_FRAME) {
1641 for (i = 0; i < 4; i++) {
1642 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1643 s->current_picture.f->data[i] +=
1644 s->current_picture.f->linesize[i];
1646 s->current_picture.f->linesize[i] *= 2;
1647 s->last_picture.f->linesize[i] *= 2;
1648 s->next_picture.f->linesize[i] *= 2;
1652 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1653 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1654 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1655 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1656 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1657 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1659 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1660 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1663 if (s->dct_error_sum) {
1664 assert(s->noise_reduction && s->encoding);
1665 update_noise_reduction(s);
1671 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1672 const AVFrame *pic_arg, int *got_packet)
1674 MpegEncContext *s = avctx->priv_data;
1675 int i, stuffing_count, ret;
1676 int context_count = s->slice_context_count;
1678 s->picture_in_gop_number++;
1680 if (load_input_picture(s, pic_arg) < 0)
1683 if (select_input_picture(s) < 0) {
1688 if (s->new_picture.f->data[0]) {
1691 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1694 s->mb_info_ptr = av_packet_new_side_data(pkt,
1695 AV_PKT_DATA_H263_MB_INFO,
1696 s->mb_width*s->mb_height*12);
1697 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1700 for (i = 0; i < context_count; i++) {
1701 int start_y = s->thread_context[i]->start_mb_y;
1702 int end_y = s->thread_context[i]-> end_mb_y;
1703 int h = s->mb_height;
1704 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1705 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1707 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1710 s->pict_type = s->new_picture.f->pict_type;
1712 ret = frame_start(s);
1716 if (encode_picture(s, s->picture_number) < 0)
1719 #if FF_API_STAT_BITS
1720 FF_DISABLE_DEPRECATION_WARNINGS
1721 avctx->header_bits = s->header_bits;
1722 avctx->mv_bits = s->mv_bits;
1723 avctx->misc_bits = s->misc_bits;
1724 avctx->i_tex_bits = s->i_tex_bits;
1725 avctx->p_tex_bits = s->p_tex_bits;
1726 avctx->i_count = s->i_count;
1727 // FIXME f/b_count in avctx
1728 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1729 avctx->skip_count = s->skip_count;
1730 FF_ENABLE_DEPRECATION_WARNINGS
1735 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1738 return AVERROR(ENOMEM);
1739 *(int *)sd = s->current_picture.f->quality;
1741 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1742 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1744 if (avctx->rc_buffer_size) {
1745 RateControlContext *rcc = &s->rc_context;
1746 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1748 if (put_bits_count(&s->pb) > max_size &&
1749 s->lambda < s->lmax) {
1750 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1751 (s->qscale + 1) / s->qscale);
1752 if (s->adaptive_quant) {
1754 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1755 s->lambda_table[i] =
1756 FFMAX(s->lambda_table[i] + 1,
1757 s->lambda_table[i] * (s->qscale + 1) /
1760 s->mb_skipped = 0; // done in frame_start()
1761 // done in encode_picture() so we must undo it
1762 if (s->pict_type == AV_PICTURE_TYPE_P) {
1763 if (s->flipflop_rounding ||
1764 s->codec_id == AV_CODEC_ID_H263P ||
1765 s->codec_id == AV_CODEC_ID_MPEG4)
1766 s->no_rounding ^= 1;
1768 if (s->pict_type != AV_PICTURE_TYPE_B) {
1769 s->time_base = s->last_time_base;
1770 s->last_non_b_time = s->time - s->pp_time;
1772 for (i = 0; i < context_count; i++) {
1773 PutBitContext *pb = &s->thread_context[i]->pb;
1774 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1779 assert(s->avctx->rc_max_rate);
1782 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1783 ff_write_pass1_stats(s);
1785 for (i = 0; i < 4; i++) {
1786 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1787 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1790 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1791 assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits +
1792 s->misc_bits + s->i_tex_bits +
1794 flush_put_bits(&s->pb);
1795 s->frame_bits = put_bits_count(&s->pb);
1797 stuffing_count = ff_vbv_update(s, s->frame_bits);
1798 if (stuffing_count) {
1799 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1800 stuffing_count + 50) {
1801 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1805 switch (s->codec_id) {
1806 case AV_CODEC_ID_MPEG1VIDEO:
1807 case AV_CODEC_ID_MPEG2VIDEO:
1808 while (stuffing_count--) {
1809 put_bits(&s->pb, 8, 0);
1812 case AV_CODEC_ID_MPEG4:
1813 put_bits(&s->pb, 16, 0);
1814 put_bits(&s->pb, 16, 0x1C3);
1815 stuffing_count -= 4;
1816 while (stuffing_count--) {
1817 put_bits(&s->pb, 8, 0xFF);
1821 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1823 flush_put_bits(&s->pb);
1824 s->frame_bits = put_bits_count(&s->pb);
1827 /* update mpeg1/2 vbv_delay for CBR */
1828 if (s->avctx->rc_max_rate &&
1829 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1830 s->out_format == FMT_MPEG1 &&
1831 90000LL * (avctx->rc_buffer_size - 1) <=
1832 s->avctx->rc_max_rate * 0xFFFFLL) {
1833 AVCPBProperties *props;
1836 int vbv_delay, min_delay;
1837 double inbits = s->avctx->rc_max_rate *
1838 av_q2d(s->avctx->time_base);
1839 int minbits = s->frame_bits - 8 *
1840 (s->vbv_delay_ptr - s->pb.buf - 1);
1841 double bits = s->rc_context.buffer_index + minbits - inbits;
1844 av_log(s->avctx, AV_LOG_ERROR,
1845 "Internal error, negative bits\n");
1847 assert(s->repeat_first_field == 0);
1849 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1850 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1851 s->avctx->rc_max_rate;
1853 vbv_delay = FFMAX(vbv_delay, min_delay);
1855 assert(vbv_delay < 0xFFFF);
1857 s->vbv_delay_ptr[0] &= 0xF8;
1858 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1859 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1860 s->vbv_delay_ptr[2] &= 0x07;
1861 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1863 props = av_cpb_properties_alloc(&props_size);
1865 return AVERROR(ENOMEM);
1866 props->vbv_delay = vbv_delay * 300;
1868 ret = av_packet_add_side_data(pkt, AV_PKT_DATA_CPB_PROPERTIES,
1869 (uint8_t*)props, props_size);
1875 #if FF_API_VBV_DELAY
1876 FF_DISABLE_DEPRECATION_WARNINGS
1877 avctx->vbv_delay = vbv_delay * 300;
1878 FF_ENABLE_DEPRECATION_WARNINGS
1881 s->total_bits += s->frame_bits;
1882 #if FF_API_STAT_BITS
1883 FF_DISABLE_DEPRECATION_WARNINGS
1884 avctx->frame_bits = s->frame_bits;
1885 FF_ENABLE_DEPRECATION_WARNINGS
1889 pkt->pts = s->current_picture.f->pts;
1890 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1891 if (!s->current_picture.f->coded_picture_number)
1892 pkt->dts = pkt->pts - s->dts_delta;
1894 pkt->dts = s->reordered_pts;
1895 s->reordered_pts = pkt->pts;
1897 pkt->dts = pkt->pts;
1898 if (s->current_picture.f->key_frame)
1899 pkt->flags |= AV_PKT_FLAG_KEY;
1901 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1905 assert((s->frame_bits & 7) == 0);
1907 pkt->size = s->frame_bits / 8;
1908 *got_packet = !!pkt->size;
1912 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1913 int n, int threshold)
1915 static const char tab[64] = {
1916 3, 2, 2, 1, 1, 1, 1, 1,
1917 1, 1, 1, 1, 1, 1, 1, 1,
1918 1, 1, 1, 1, 1, 1, 1, 1,
1919 0, 0, 0, 0, 0, 0, 0, 0,
1920 0, 0, 0, 0, 0, 0, 0, 0,
1921 0, 0, 0, 0, 0, 0, 0, 0,
1922 0, 0, 0, 0, 0, 0, 0, 0,
1923 0, 0, 0, 0, 0, 0, 0, 0
1928 int16_t *block = s->block[n];
1929 const int last_index = s->block_last_index[n];
1932 if (threshold < 0) {
1934 threshold = -threshold;
1938 /* Are all we could set to zero already zero? */
1939 if (last_index <= skip_dc - 1)
1942 for (i = 0; i <= last_index; i++) {
1943 const int j = s->intra_scantable.permutated[i];
1944 const int level = FFABS(block[j]);
1946 if (skip_dc && i == 0)
1950 } else if (level > 1) {
1956 if (score >= threshold)
1958 for (i = skip_dc; i <= last_index; i++) {
1959 const int j = s->intra_scantable.permutated[i];
1963 s->block_last_index[n] = 0;
1965 s->block_last_index[n] = -1;
1968 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1972 const int maxlevel = s->max_qcoeff;
1973 const int minlevel = s->min_qcoeff;
1977 i = 1; // skip clipping of intra dc
1981 for (; i <= last_index; i++) {
1982 const int j = s->intra_scantable.permutated[i];
1983 int level = block[j];
1985 if (level > maxlevel) {
1988 } else if (level < minlevel) {
1996 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1997 av_log(s->avctx, AV_LOG_INFO,
1998 "warning, clipping %d dct coefficients to %d..%d\n",
1999 overflow, minlevel, maxlevel);
2002 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
2006 for (y = 0; y < 8; y++) {
2007 for (x = 0; x < 8; x++) {
2013 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
2014 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
2015 int v = ptr[x2 + y2 * stride];
2021 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2026 static av_always_inline void encode_mb_internal(MpegEncContext *s,
2027 int motion_x, int motion_y,
2028 int mb_block_height,
2031 int16_t weight[8][64];
2032 int16_t orig[8][64];
2033 const int mb_x = s->mb_x;
2034 const int mb_y = s->mb_y;
2037 int dct_offset = s->linesize * 8; // default for progressive frames
2038 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2039 ptrdiff_t wrap_y, wrap_c;
2041 for (i = 0; i < mb_block_count; i++)
2042 skip_dct[i] = s->skipdct;
2044 if (s->adaptive_quant) {
2045 const int last_qp = s->qscale;
2046 const int mb_xy = mb_x + mb_y * s->mb_stride;
2048 s->lambda = s->lambda_table[mb_xy];
2051 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2052 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
2053 s->dquant = s->qscale - last_qp;
2055 if (s->out_format == FMT_H263) {
2056 s->dquant = av_clip(s->dquant, -2, 2);
2058 if (s->codec_id == AV_CODEC_ID_MPEG4) {
2060 if (s->pict_type == AV_PICTURE_TYPE_B) {
2061 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
2064 if (s->mv_type == MV_TYPE_8X8)
2070 ff_set_qscale(s, last_qp + s->dquant);
2071 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2072 ff_set_qscale(s, s->qscale + s->dquant);
2074 wrap_y = s->linesize;
2075 wrap_c = s->uvlinesize;
2076 ptr_y = s->new_picture.f->data[0] +
2077 (mb_y * 16 * wrap_y) + mb_x * 16;
2078 ptr_cb = s->new_picture.f->data[1] +
2079 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2080 ptr_cr = s->new_picture.f->data[2] +
2081 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2083 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
2084 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
2085 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2087 16, 16, mb_x * 16, mb_y * 16,
2088 s->width, s->height);
2090 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
2092 8, mb_block_height, mb_x * 8, mb_y * 8,
2093 s->width >> 1, s->height >> 1);
2094 ptr_cb = ebuf + 18 * wrap_y;
2095 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
2097 8, mb_block_height, mb_x * 8, mb_y * 8,
2098 s->width >> 1, s->height >> 1);
2099 ptr_cr = ebuf + 18 * wrap_y + 8;
2103 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2104 int progressive_score, interlaced_score;
2106 s->interlaced_dct = 0;
2107 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2108 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2109 NULL, wrap_y, 8) - 400;
2111 if (progressive_score > 0) {
2112 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2113 NULL, wrap_y * 2, 8) +
2114 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2115 NULL, wrap_y * 2, 8);
2116 if (progressive_score > interlaced_score) {
2117 s->interlaced_dct = 1;
2119 dct_offset = wrap_y;
2121 if (s->chroma_format == CHROMA_422)
2127 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2128 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2129 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2130 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2132 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2136 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2137 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2138 if (!s->chroma_y_shift) { /* 422 */
2139 s->pdsp.get_pixels(s->block[6],
2140 ptr_cb + (dct_offset >> 1), wrap_c);
2141 s->pdsp.get_pixels(s->block[7],
2142 ptr_cr + (dct_offset >> 1), wrap_c);
2146 op_pixels_func (*op_pix)[4];
2147 qpel_mc_func (*op_qpix)[16];
2148 uint8_t *dest_y, *dest_cb, *dest_cr;
2150 dest_y = s->dest[0];
2151 dest_cb = s->dest[1];
2152 dest_cr = s->dest[2];
2154 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2155 op_pix = s->hdsp.put_pixels_tab;
2156 op_qpix = s->qdsp.put_qpel_pixels_tab;
2158 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2159 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2162 if (s->mv_dir & MV_DIR_FORWARD) {
2163 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2164 s->last_picture.f->data,
2166 op_pix = s->hdsp.avg_pixels_tab;
2167 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2169 if (s->mv_dir & MV_DIR_BACKWARD) {
2170 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2171 s->next_picture.f->data,
2175 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2176 int progressive_score, interlaced_score;
2178 s->interlaced_dct = 0;
2179 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2180 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2184 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2185 progressive_score -= 400;
2187 if (progressive_score > 0) {
2188 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2190 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2194 if (progressive_score > interlaced_score) {
2195 s->interlaced_dct = 1;
2197 dct_offset = wrap_y;
2199 if (s->chroma_format == CHROMA_422)
2205 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2206 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2207 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2208 dest_y + dct_offset, wrap_y);
2209 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2210 dest_y + dct_offset + 8, wrap_y);
2212 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2216 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2217 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2218 if (!s->chroma_y_shift) { /* 422 */
2219 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2220 dest_cb + (dct_offset >> 1), wrap_c);
2221 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2222 dest_cr + (dct_offset >> 1), wrap_c);
2225 /* pre quantization */
2226 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2227 2 * s->qscale * s->qscale) {
2229 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2231 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2233 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2234 wrap_y, 8) < 20 * s->qscale)
2236 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2237 wrap_y, 8) < 20 * s->qscale)
2239 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2241 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2243 if (!s->chroma_y_shift) { /* 422 */
2244 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2245 dest_cb + (dct_offset >> 1),
2246 wrap_c, 8) < 20 * s->qscale)
2248 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2249 dest_cr + (dct_offset >> 1),
2250 wrap_c, 8) < 20 * s->qscale)
2256 if (s->quantizer_noise_shaping) {
2258 get_visual_weight(weight[0], ptr_y , wrap_y);
2260 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2262 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2264 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2266 get_visual_weight(weight[4], ptr_cb , wrap_c);
2268 get_visual_weight(weight[5], ptr_cr , wrap_c);
2269 if (!s->chroma_y_shift) { /* 422 */
2271 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2274 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2277 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2280 /* DCT & quantize */
2281 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2283 for (i = 0; i < mb_block_count; i++) {
2286 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2287 // FIXME we could decide to change to quantizer instead of
2289 // JS: I don't think that would be a good idea it could lower
2290 // quality instead of improve it. Just INTRADC clipping
2291 // deserves changes in quantizer
2293 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2295 s->block_last_index[i] = -1;
2297 if (s->quantizer_noise_shaping) {
2298 for (i = 0; i < mb_block_count; i++) {
2300 s->block_last_index[i] =
2301 dct_quantize_refine(s, s->block[i], weight[i],
2302 orig[i], i, s->qscale);
2307 if (s->luma_elim_threshold && !s->mb_intra)
2308 for (i = 0; i < 4; i++)
2309 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2310 if (s->chroma_elim_threshold && !s->mb_intra)
2311 for (i = 4; i < mb_block_count; i++)
2312 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2314 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2315 for (i = 0; i < mb_block_count; i++) {
2316 if (s->block_last_index[i] == -1)
2317 s->coded_score[i] = INT_MAX / 256;
2322 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2323 s->block_last_index[4] =
2324 s->block_last_index[5] = 0;
2326 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2329 // non c quantize code returns incorrect block_last_index FIXME
2330 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2331 for (i = 0; i < mb_block_count; i++) {
2333 if (s->block_last_index[i] > 0) {
2334 for (j = 63; j > 0; j--) {
2335 if (s->block[i][s->intra_scantable.permutated[j]])
2338 s->block_last_index[i] = j;
2343 /* huffman encode */
2344 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2345 case AV_CODEC_ID_MPEG1VIDEO:
2346 case AV_CODEC_ID_MPEG2VIDEO:
2347 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2348 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2350 case AV_CODEC_ID_MPEG4:
2351 if (CONFIG_MPEG4_ENCODER)
2352 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2354 case AV_CODEC_ID_MSMPEG4V2:
2355 case AV_CODEC_ID_MSMPEG4V3:
2356 case AV_CODEC_ID_WMV1:
2357 if (CONFIG_MSMPEG4_ENCODER)
2358 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2360 case AV_CODEC_ID_WMV2:
2361 if (CONFIG_WMV2_ENCODER)
2362 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2364 case AV_CODEC_ID_H261:
2365 if (CONFIG_H261_ENCODER)
2366 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2368 case AV_CODEC_ID_H263:
2369 case AV_CODEC_ID_H263P:
2370 case AV_CODEC_ID_FLV1:
2371 case AV_CODEC_ID_RV10:
2372 case AV_CODEC_ID_RV20:
2373 if (CONFIG_H263_ENCODER)
2374 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2376 case AV_CODEC_ID_MJPEG:
2377 if (CONFIG_MJPEG_ENCODER)
2378 ff_mjpeg_encode_mb(s, s->block);
2385 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2387 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2388 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2391 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2394 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2397 d->mb_skip_run= s->mb_skip_run;
2399 d->last_dc[i] = s->last_dc[i];
2402 d->mv_bits= s->mv_bits;
2403 d->i_tex_bits= s->i_tex_bits;
2404 d->p_tex_bits= s->p_tex_bits;
2405 d->i_count= s->i_count;
2406 d->f_count= s->f_count;
2407 d->b_count= s->b_count;
2408 d->skip_count= s->skip_count;
2409 d->misc_bits= s->misc_bits;
2413 d->qscale= s->qscale;
2414 d->dquant= s->dquant;
2416 d->esc3_level_length= s->esc3_level_length;
2419 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2422 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2423 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2426 d->mb_skip_run= s->mb_skip_run;
2428 d->last_dc[i] = s->last_dc[i];
2431 d->mv_bits= s->mv_bits;
2432 d->i_tex_bits= s->i_tex_bits;
2433 d->p_tex_bits= s->p_tex_bits;
2434 d->i_count= s->i_count;
2435 d->f_count= s->f_count;
2436 d->b_count= s->b_count;
2437 d->skip_count= s->skip_count;
2438 d->misc_bits= s->misc_bits;
2440 d->mb_intra= s->mb_intra;
2441 d->mb_skipped= s->mb_skipped;
2442 d->mv_type= s->mv_type;
2443 d->mv_dir= s->mv_dir;
2445 if(s->data_partitioning){
2447 d->tex_pb= s->tex_pb;
2451 d->block_last_index[i]= s->block_last_index[i];
2452 d->interlaced_dct= s->interlaced_dct;
2453 d->qscale= s->qscale;
2455 d->esc3_level_length= s->esc3_level_length;
2458 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2459 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2460 int *dmin, int *next_block, int motion_x, int motion_y)
2463 uint8_t *dest_backup[3];
2465 copy_context_before_encode(s, backup, type);
2467 s->block= s->blocks[*next_block];
2468 s->pb= pb[*next_block];
2469 if(s->data_partitioning){
2470 s->pb2 = pb2 [*next_block];
2471 s->tex_pb= tex_pb[*next_block];
2475 memcpy(dest_backup, s->dest, sizeof(s->dest));
2476 s->dest[0] = s->sc.rd_scratchpad;
2477 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2478 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2479 assert(s->linesize >= 32); //FIXME
2482 encode_mb(s, motion_x, motion_y);
2484 score= put_bits_count(&s->pb);
2485 if(s->data_partitioning){
2486 score+= put_bits_count(&s->pb2);
2487 score+= put_bits_count(&s->tex_pb);
2490 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2491 ff_mpv_decode_mb(s, s->block);
2493 score *= s->lambda2;
2494 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2498 memcpy(s->dest, dest_backup, sizeof(s->dest));
2505 copy_context_after_encode(best, s, type);
2509 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2510 uint32_t *sq = ff_square_tab + 256;
2515 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2516 else if(w==8 && h==8)
2517 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2521 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2530 static int sse_mb(MpegEncContext *s){
2534 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2535 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2538 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2539 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) +
2540 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) +
2541 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);
2543 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) +
2544 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) +
2545 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);
2548 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)
2549 +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)
2550 +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);
2553 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2554 MpegEncContext *s= *(void**)arg;
2558 s->me.dia_size= s->avctx->pre_dia_size;
2559 s->first_slice_line=1;
2560 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2561 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2562 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2564 s->first_slice_line=0;
2572 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2573 MpegEncContext *s= *(void**)arg;
2575 s->me.dia_size= s->avctx->dia_size;
2576 s->first_slice_line=1;
2577 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2578 s->mb_x=0; //for block init below
2579 ff_init_block_index(s);
2580 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2581 s->block_index[0]+=2;
2582 s->block_index[1]+=2;
2583 s->block_index[2]+=2;
2584 s->block_index[3]+=2;
2586 /* compute motion vector & mb_type and store in context */
2587 if(s->pict_type==AV_PICTURE_TYPE_B)
2588 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2590 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2592 s->first_slice_line=0;
2597 static int mb_var_thread(AVCodecContext *c, void *arg){
2598 MpegEncContext *s= *(void**)arg;
2601 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2602 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2605 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2607 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2609 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2610 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2612 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2613 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2614 s->me.mb_var_sum_temp += varc;
2620 static void write_slice_end(MpegEncContext *s){
2621 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2622 if(s->partitioned_frame){
2623 ff_mpeg4_merge_partitions(s);
2626 ff_mpeg4_stuffing(&s->pb);
2627 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2628 ff_mjpeg_encode_stuffing(&s->pb);
2631 avpriv_align_put_bits(&s->pb);
2632 flush_put_bits(&s->pb);
2634 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2635 s->misc_bits+= get_bits_diff(s);
2638 static void write_mb_info(MpegEncContext *s)
2640 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2641 int offset = put_bits_count(&s->pb);
2642 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2643 int gobn = s->mb_y / s->gob_index;
2645 if (CONFIG_H263_ENCODER)
2646 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2647 bytestream_put_le32(&ptr, offset);
2648 bytestream_put_byte(&ptr, s->qscale);
2649 bytestream_put_byte(&ptr, gobn);
2650 bytestream_put_le16(&ptr, mba);
2651 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2652 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2653 /* 4MV not implemented */
2654 bytestream_put_byte(&ptr, 0); /* hmv2 */
2655 bytestream_put_byte(&ptr, 0); /* vmv2 */
2658 static void update_mb_info(MpegEncContext *s, int startcode)
2662 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2663 s->mb_info_size += 12;
2664 s->prev_mb_info = s->last_mb_info;
2667 s->prev_mb_info = put_bits_count(&s->pb)/8;
2668 /* This might have incremented mb_info_size above, and we return without
2669 * actually writing any info into that slot yet. But in that case,
2670 * this will be called again at the start of the after writing the
2671 * start code, actually writing the mb info. */
2675 s->last_mb_info = put_bits_count(&s->pb)/8;
2676 if (!s->mb_info_size)
2677 s->mb_info_size += 12;
2681 static int encode_thread(AVCodecContext *c, void *arg){
2682 MpegEncContext *s= *(void**)arg;
2683 int mb_x, mb_y, pdif = 0;
2684 int chr_h= 16>>s->chroma_y_shift;
2686 MpegEncContext best_s = { 0 }, backup_s;
2687 uint8_t bit_buf[2][MAX_MB_BYTES];
2688 uint8_t bit_buf2[2][MAX_MB_BYTES];
2689 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2690 PutBitContext pb[2], pb2[2], tex_pb[2];
2693 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2694 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2695 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2698 s->last_bits= put_bits_count(&s->pb);
2709 /* init last dc values */
2710 /* note: quant matrix value (8) is implied here */
2711 s->last_dc[i] = 128 << s->intra_dc_precision;
2713 s->current_picture.encoding_error[i] = 0;
2716 memset(s->last_mv, 0, sizeof(s->last_mv));
2720 switch(s->codec_id){
2721 case AV_CODEC_ID_H263:
2722 case AV_CODEC_ID_H263P:
2723 case AV_CODEC_ID_FLV1:
2724 if (CONFIG_H263_ENCODER)
2725 s->gob_index = H263_GOB_HEIGHT(s->height);
2727 case AV_CODEC_ID_MPEG4:
2728 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2729 ff_mpeg4_init_partitions(s);
2735 s->first_slice_line = 1;
2736 s->ptr_lastgob = s->pb.buf;
2737 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2741 ff_set_qscale(s, s->qscale);
2742 ff_init_block_index(s);
2744 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2745 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2746 int mb_type= s->mb_type[xy];
2751 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2752 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2755 if(s->data_partitioning){
2756 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2757 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2758 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2764 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2765 ff_update_block_index(s);
2767 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2768 ff_h261_reorder_mb_index(s);
2769 xy= s->mb_y*s->mb_stride + s->mb_x;
2770 mb_type= s->mb_type[xy];
2773 /* write gob / video packet header */
2775 int current_packet_size, is_gob_start;
2777 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2779 is_gob_start = s->rtp_payload_size &&
2780 current_packet_size >= s->rtp_payload_size &&
2783 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2785 switch(s->codec_id){
2786 case AV_CODEC_ID_H263:
2787 case AV_CODEC_ID_H263P:
2788 if(!s->h263_slice_structured)
2789 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2791 case AV_CODEC_ID_MPEG2VIDEO:
2792 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2793 case AV_CODEC_ID_MPEG1VIDEO:
2794 if(s->mb_skip_run) is_gob_start=0;
2799 if(s->start_mb_y != mb_y || mb_x!=0){
2802 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2803 ff_mpeg4_init_partitions(s);
2807 assert((put_bits_count(&s->pb)&7) == 0);
2808 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2810 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2811 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2812 int d = 100 / s->error_rate;
2814 current_packet_size=0;
2815 s->pb.buf_ptr= s->ptr_lastgob;
2816 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2820 #if FF_API_RTP_CALLBACK
2821 FF_DISABLE_DEPRECATION_WARNINGS
2822 if (s->avctx->rtp_callback){
2823 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2824 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2826 FF_ENABLE_DEPRECATION_WARNINGS
2828 update_mb_info(s, 1);
2830 switch(s->codec_id){
2831 case AV_CODEC_ID_MPEG4:
2832 if (CONFIG_MPEG4_ENCODER) {
2833 ff_mpeg4_encode_video_packet_header(s);
2834 ff_mpeg4_clean_buffers(s);
2837 case AV_CODEC_ID_MPEG1VIDEO:
2838 case AV_CODEC_ID_MPEG2VIDEO:
2839 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2840 ff_mpeg1_encode_slice_header(s);
2841 ff_mpeg1_clean_buffers(s);
2844 case AV_CODEC_ID_H263:
2845 case AV_CODEC_ID_H263P:
2846 if (CONFIG_H263_ENCODER)
2847 ff_h263_encode_gob_header(s, mb_y);
2851 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2852 int bits= put_bits_count(&s->pb);
2853 s->misc_bits+= bits - s->last_bits;
2857 s->ptr_lastgob += current_packet_size;
2858 s->first_slice_line=1;
2859 s->resync_mb_x=mb_x;
2860 s->resync_mb_y=mb_y;
2864 if( (s->resync_mb_x == s->mb_x)
2865 && s->resync_mb_y+1 == s->mb_y){
2866 s->first_slice_line=0;
2870 s->dquant=0; //only for QP_RD
2872 update_mb_info(s, 0);
2874 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
2876 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2878 copy_context_before_encode(&backup_s, s, -1);
2880 best_s.data_partitioning= s->data_partitioning;
2881 best_s.partitioned_frame= s->partitioned_frame;
2882 if(s->data_partitioning){
2883 backup_s.pb2= s->pb2;
2884 backup_s.tex_pb= s->tex_pb;
2887 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2888 s->mv_dir = MV_DIR_FORWARD;
2889 s->mv_type = MV_TYPE_16X16;
2891 s->mv[0][0][0] = s->p_mv_table[xy][0];
2892 s->mv[0][0][1] = s->p_mv_table[xy][1];
2893 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2894 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2896 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2897 s->mv_dir = MV_DIR_FORWARD;
2898 s->mv_type = MV_TYPE_FIELD;
2901 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2902 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2903 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2905 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2906 &dmin, &next_block, 0, 0);
2908 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2909 s->mv_dir = MV_DIR_FORWARD;
2910 s->mv_type = MV_TYPE_16X16;
2914 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2915 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2917 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2918 s->mv_dir = MV_DIR_FORWARD;
2919 s->mv_type = MV_TYPE_8X8;
2922 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2923 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2925 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2926 &dmin, &next_block, 0, 0);
2928 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2929 s->mv_dir = MV_DIR_FORWARD;
2930 s->mv_type = MV_TYPE_16X16;
2932 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2933 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2934 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2935 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2937 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2938 s->mv_dir = MV_DIR_BACKWARD;
2939 s->mv_type = MV_TYPE_16X16;
2941 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2942 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2943 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2944 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2946 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2947 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2948 s->mv_type = MV_TYPE_16X16;
2950 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2951 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2952 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2953 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2954 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2955 &dmin, &next_block, 0, 0);
2957 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2958 s->mv_dir = MV_DIR_FORWARD;
2959 s->mv_type = MV_TYPE_FIELD;
2962 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2963 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2964 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2966 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2967 &dmin, &next_block, 0, 0);
2969 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2970 s->mv_dir = MV_DIR_BACKWARD;
2971 s->mv_type = MV_TYPE_FIELD;
2974 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2975 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2976 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2978 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2979 &dmin, &next_block, 0, 0);
2981 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2982 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2983 s->mv_type = MV_TYPE_FIELD;
2985 for(dir=0; dir<2; dir++){
2987 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2988 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2989 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2992 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2993 &dmin, &next_block, 0, 0);
2995 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2997 s->mv_type = MV_TYPE_16X16;
3001 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
3002 &dmin, &next_block, 0, 0);
3003 if(s->h263_pred || s->h263_aic){
3005 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
3007 ff_clean_intra_table_entries(s); //old mode?
3011 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
3012 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
3013 const int last_qp= backup_s.qscale;
3016 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
3017 static const int dquant_tab[4]={-1,1,-2,2};
3019 assert(backup_s.dquant == 0);
3022 s->mv_dir= best_s.mv_dir;
3023 s->mv_type = MV_TYPE_16X16;
3024 s->mb_intra= best_s.mb_intra;
3025 s->mv[0][0][0] = best_s.mv[0][0][0];
3026 s->mv[0][0][1] = best_s.mv[0][0][1];
3027 s->mv[1][0][0] = best_s.mv[1][0][0];
3028 s->mv[1][0][1] = best_s.mv[1][0][1];
3030 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3031 for(; qpi<4; qpi++){
3032 int dquant= dquant_tab[qpi];
3033 qp= last_qp + dquant;
3034 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
3036 backup_s.dquant= dquant;
3037 if(s->mb_intra && s->dc_val[0]){
3039 dc[i]= s->dc_val[0][ s->block_index[i] ];
3040 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
3044 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3045 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
3046 if(best_s.qscale != qp){
3047 if(s->mb_intra && s->dc_val[0]){
3049 s->dc_val[0][ s->block_index[i] ]= dc[i];
3050 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
3057 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3058 int mx= s->b_direct_mv_table[xy][0];
3059 int my= s->b_direct_mv_table[xy][1];
3061 backup_s.dquant = 0;
3062 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3064 ff_mpeg4_set_direct_mv(s, mx, my);
3065 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3066 &dmin, &next_block, mx, my);
3068 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3069 backup_s.dquant = 0;
3070 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3072 ff_mpeg4_set_direct_mv(s, 0, 0);
3073 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3074 &dmin, &next_block, 0, 0);
3076 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3079 coded |= s->block_last_index[i];
3082 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3083 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3084 mx=my=0; //FIXME find the one we actually used
3085 ff_mpeg4_set_direct_mv(s, mx, my);
3086 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3094 s->mv_dir= best_s.mv_dir;
3095 s->mv_type = best_s.mv_type;
3097 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3098 s->mv[0][0][1] = best_s.mv[0][0][1];
3099 s->mv[1][0][0] = best_s.mv[1][0][0];
3100 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3103 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3104 &dmin, &next_block, mx, my);
3109 s->current_picture.qscale_table[xy] = best_s.qscale;
3111 copy_context_after_encode(s, &best_s, -1);
3113 pb_bits_count= put_bits_count(&s->pb);
3114 flush_put_bits(&s->pb);
3115 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3118 if(s->data_partitioning){
3119 pb2_bits_count= put_bits_count(&s->pb2);
3120 flush_put_bits(&s->pb2);
3121 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3122 s->pb2= backup_s.pb2;
3124 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3125 flush_put_bits(&s->tex_pb);
3126 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3127 s->tex_pb= backup_s.tex_pb;
3129 s->last_bits= put_bits_count(&s->pb);
3131 if (CONFIG_H263_ENCODER &&
3132 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3133 ff_h263_update_motion_val(s);
3135 if(next_block==0){ //FIXME 16 vs linesize16
3136 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3137 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3138 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3141 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3142 ff_mpv_decode_mb(s, s->block);
3144 int motion_x = 0, motion_y = 0;
3145 s->mv_type=MV_TYPE_16X16;
3146 // only one MB-Type possible
3149 case CANDIDATE_MB_TYPE_INTRA:
3152 motion_x= s->mv[0][0][0] = 0;
3153 motion_y= s->mv[0][0][1] = 0;
3155 case CANDIDATE_MB_TYPE_INTER:
3156 s->mv_dir = MV_DIR_FORWARD;
3158 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3159 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3161 case CANDIDATE_MB_TYPE_INTER_I:
3162 s->mv_dir = MV_DIR_FORWARD;
3163 s->mv_type = MV_TYPE_FIELD;
3166 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3167 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3168 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3171 case CANDIDATE_MB_TYPE_INTER4V:
3172 s->mv_dir = MV_DIR_FORWARD;
3173 s->mv_type = MV_TYPE_8X8;
3176 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3177 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3180 case CANDIDATE_MB_TYPE_DIRECT:
3181 if (CONFIG_MPEG4_ENCODER) {
3182 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3184 motion_x=s->b_direct_mv_table[xy][0];
3185 motion_y=s->b_direct_mv_table[xy][1];
3186 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3189 case CANDIDATE_MB_TYPE_DIRECT0:
3190 if (CONFIG_MPEG4_ENCODER) {
3191 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3193 ff_mpeg4_set_direct_mv(s, 0, 0);
3196 case CANDIDATE_MB_TYPE_BIDIR:
3197 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3199 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3200 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3201 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3202 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3204 case CANDIDATE_MB_TYPE_BACKWARD:
3205 s->mv_dir = MV_DIR_BACKWARD;
3207 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3208 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3210 case CANDIDATE_MB_TYPE_FORWARD:
3211 s->mv_dir = MV_DIR_FORWARD;
3213 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3214 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3216 case CANDIDATE_MB_TYPE_FORWARD_I:
3217 s->mv_dir = MV_DIR_FORWARD;
3218 s->mv_type = MV_TYPE_FIELD;
3221 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3222 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3223 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3226 case CANDIDATE_MB_TYPE_BACKWARD_I:
3227 s->mv_dir = MV_DIR_BACKWARD;
3228 s->mv_type = MV_TYPE_FIELD;
3231 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3232 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3233 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3236 case CANDIDATE_MB_TYPE_BIDIR_I:
3237 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3238 s->mv_type = MV_TYPE_FIELD;
3240 for(dir=0; dir<2; dir++){
3242 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3243 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3244 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3249 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3252 encode_mb(s, motion_x, motion_y);
3254 // RAL: Update last macroblock type
3255 s->last_mv_dir = s->mv_dir;
3257 if (CONFIG_H263_ENCODER &&
3258 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3259 ff_h263_update_motion_val(s);
3261 ff_mpv_decode_mb(s, s->block);
3264 /* clean the MV table in IPS frames for direct mode in B frames */
3265 if(s->mb_intra /* && I,P,S_TYPE */){
3266 s->p_mv_table[xy][0]=0;
3267 s->p_mv_table[xy][1]=0;
3270 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3274 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3275 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3277 s->current_picture.encoding_error[0] += sse(
3278 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3279 s->dest[0], w, h, s->linesize);
3280 s->current_picture.encoding_error[1] += sse(
3281 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3282 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3283 s->current_picture.encoding_error[2] += sse(
3284 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3285 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3288 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3289 ff_h263_loop_filter(s);
3291 ff_dlog(s->avctx, "MB %d %d bits\n",
3292 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3296 //not beautiful here but we must write it before flushing so it has to be here
3297 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3298 ff_msmpeg4_encode_ext_header(s);
3302 #if FF_API_RTP_CALLBACK
3303 FF_DISABLE_DEPRECATION_WARNINGS
3304 /* Send the last GOB if RTP */
3305 if (s->avctx->rtp_callback) {
3306 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3307 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3308 /* Call the RTP callback to send the last GOB */
3310 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3312 FF_ENABLE_DEPRECATION_WARNINGS
3318 #define MERGE(field) dst->field += src->field; src->field=0
3319 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3320 MERGE(me.scene_change_score);
3321 MERGE(me.mc_mb_var_sum_temp);
3322 MERGE(me.mb_var_sum_temp);
3325 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3328 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3329 MERGE(dct_count[1]);
3338 MERGE(er.error_count);
3339 MERGE(padding_bug_score);
3340 MERGE(current_picture.encoding_error[0]);
3341 MERGE(current_picture.encoding_error[1]);
3342 MERGE(current_picture.encoding_error[2]);
3344 if (dst->noise_reduction){
3345 for(i=0; i<64; i++){
3346 MERGE(dct_error_sum[0][i]);
3347 MERGE(dct_error_sum[1][i]);
3351 assert(put_bits_count(&src->pb) % 8 ==0);
3352 assert(put_bits_count(&dst->pb) % 8 ==0);
3353 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3354 flush_put_bits(&dst->pb);
3357 static int estimate_qp(MpegEncContext *s, int dry_run){
3358 if (s->next_lambda){
3359 s->current_picture_ptr->f->quality =
3360 s->current_picture.f->quality = s->next_lambda;
3361 if(!dry_run) s->next_lambda= 0;
3362 } else if (!s->fixed_qscale) {
3363 s->current_picture_ptr->f->quality =
3364 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3365 if (s->current_picture.f->quality < 0)
3369 if(s->adaptive_quant){
3370 switch(s->codec_id){
3371 case AV_CODEC_ID_MPEG4:
3372 if (CONFIG_MPEG4_ENCODER)
3373 ff_clean_mpeg4_qscales(s);
3375 case AV_CODEC_ID_H263:
3376 case AV_CODEC_ID_H263P:
3377 case AV_CODEC_ID_FLV1:
3378 if (CONFIG_H263_ENCODER)
3379 ff_clean_h263_qscales(s);
3382 ff_init_qscale_tab(s);
3385 s->lambda= s->lambda_table[0];
3388 s->lambda = s->current_picture.f->quality;
3393 /* must be called before writing the header */
3394 static void set_frame_distances(MpegEncContext * s){
3395 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3396 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3398 if(s->pict_type==AV_PICTURE_TYPE_B){
3399 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3400 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3402 s->pp_time= s->time - s->last_non_b_time;
3403 s->last_non_b_time= s->time;
3404 assert(s->picture_number==0 || s->pp_time > 0);
3408 static int encode_picture(MpegEncContext *s, int picture_number)
3412 int context_count = s->slice_context_count;
3414 s->picture_number = picture_number;
3416 /* Reset the average MB variance */
3417 s->me.mb_var_sum_temp =
3418 s->me.mc_mb_var_sum_temp = 0;
3420 /* we need to initialize some time vars before we can encode b-frames */
3421 // RAL: Condition added for MPEG1VIDEO
3422 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3423 set_frame_distances(s);
3424 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3425 ff_set_mpeg4_time(s);
3427 s->me.scene_change_score=0;
3429 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3431 if(s->pict_type==AV_PICTURE_TYPE_I){
3432 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3433 else s->no_rounding=0;
3434 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3435 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3436 s->no_rounding ^= 1;
3439 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3440 if (estimate_qp(s,1) < 0)
3442 ff_get_2pass_fcode(s);
3443 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3444 if(s->pict_type==AV_PICTURE_TYPE_B)
3445 s->lambda= s->last_lambda_for[s->pict_type];
3447 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3451 s->mb_intra=0; //for the rate distortion & bit compare functions
3452 for(i=1; i<context_count; i++){
3453 ret = ff_update_duplicate_context(s->thread_context[i], s);
3461 /* Estimate motion for every MB */
3462 if(s->pict_type != AV_PICTURE_TYPE_I){
3463 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3464 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3465 if (s->pict_type != AV_PICTURE_TYPE_B) {
3466 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3467 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3471 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3472 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3474 for(i=0; i<s->mb_stride*s->mb_height; i++)
3475 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3477 if(!s->fixed_qscale){
3478 /* finding spatial complexity for I-frame rate control */
3479 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3482 for(i=1; i<context_count; i++){
3483 merge_context_after_me(s, s->thread_context[i]);
3485 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3486 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3489 if (s->me.scene_change_score > s->scenechange_threshold &&
3490 s->pict_type == AV_PICTURE_TYPE_P) {
3491 s->pict_type= AV_PICTURE_TYPE_I;
3492 for(i=0; i<s->mb_stride*s->mb_height; i++)
3493 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3494 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3495 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3499 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3500 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3502 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3504 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3505 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3506 s->f_code= FFMAX3(s->f_code, a, b);
3509 ff_fix_long_p_mvs(s);
3510 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3511 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3515 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3516 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3521 if(s->pict_type==AV_PICTURE_TYPE_B){
3524 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3525 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3526 s->f_code = FFMAX(a, b);
3528 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3529 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3530 s->b_code = FFMAX(a, b);
3532 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3533 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3534 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3535 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3536 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3538 for(dir=0; dir<2; dir++){
3541 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3542 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3543 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3544 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3552 if (estimate_qp(s, 0) < 0)
3555 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3556 s->pict_type == AV_PICTURE_TYPE_I &&
3557 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3558 s->qscale= 3; //reduce clipping problems
3560 if (s->out_format == FMT_MJPEG) {
3561 /* for mjpeg, we do include qscale in the matrix */
3563 int j = s->idsp.idct_permutation[i];
3565 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3567 s->y_dc_scale_table=
3568 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3569 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3570 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3571 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3575 //FIXME var duplication
3576 s->current_picture_ptr->f->key_frame =
3577 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3578 s->current_picture_ptr->f->pict_type =
3579 s->current_picture.f->pict_type = s->pict_type;
3581 if (s->current_picture.f->key_frame)
3582 s->picture_in_gop_number=0;
3584 s->last_bits= put_bits_count(&s->pb);
3585 switch(s->out_format) {
3587 if (CONFIG_MJPEG_ENCODER)
3588 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3589 s->pred, s->intra_matrix);
3592 if (CONFIG_H261_ENCODER)
3593 ff_h261_encode_picture_header(s, picture_number);
3596 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3597 ff_wmv2_encode_picture_header(s, picture_number);
3598 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3599 ff_msmpeg4_encode_picture_header(s, picture_number);
3600 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3601 ff_mpeg4_encode_picture_header(s, picture_number);
3602 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3603 ret = ff_rv10_encode_picture_header(s, picture_number);
3607 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3608 ff_rv20_encode_picture_header(s, picture_number);
3609 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3610 ff_flv_encode_picture_header(s, picture_number);
3611 else if (CONFIG_H263_ENCODER)
3612 ff_h263_encode_picture_header(s, picture_number);
3615 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3616 ff_mpeg1_encode_picture_header(s, picture_number);
3621 bits= put_bits_count(&s->pb);
3622 s->header_bits= bits - s->last_bits;
3624 for(i=1; i<context_count; i++){
3625 update_duplicate_context_after_me(s->thread_context[i], s);
3627 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3628 for(i=1; i<context_count; i++){
3629 merge_context_after_encode(s, s->thread_context[i]);
3635 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3636 const int intra= s->mb_intra;
3639 s->dct_count[intra]++;
3641 for(i=0; i<64; i++){
3642 int level= block[i];
3646 s->dct_error_sum[intra][i] += level;
3647 level -= s->dct_offset[intra][i];
3648 if(level<0) level=0;
3650 s->dct_error_sum[intra][i] -= level;
3651 level += s->dct_offset[intra][i];
3652 if(level>0) level=0;
3659 static int dct_quantize_trellis_c(MpegEncContext *s,
3660 int16_t *block, int n,
3661 int qscale, int *overflow){
3663 const uint8_t *scantable= s->intra_scantable.scantable;
3664 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3666 unsigned int threshold1, threshold2;
3678 int coeff_count[64];
3679 int qmul, qadd, start_i, last_non_zero, i, dc;
3680 const int esc_length= s->ac_esc_length;
3682 uint8_t * last_length;
3683 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3685 s->fdsp.fdct(block);
3687 if(s->dct_error_sum)
3688 s->denoise_dct(s, block);
3690 qadd= ((qscale-1)|1)*8;
3701 /* For AIC we skip quant/dequant of INTRADC */
3706 /* note: block[0] is assumed to be positive */
3707 block[0] = (block[0] + (q >> 1)) / q;
3710 qmat = s->q_intra_matrix[qscale];
3711 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3712 bias= 1<<(QMAT_SHIFT-1);
3713 length = s->intra_ac_vlc_length;
3714 last_length= s->intra_ac_vlc_last_length;
3718 qmat = s->q_inter_matrix[qscale];
3719 length = s->inter_ac_vlc_length;
3720 last_length= s->inter_ac_vlc_last_length;
3724 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3725 threshold2= (threshold1<<1);
3727 for(i=63; i>=start_i; i--) {
3728 const int j = scantable[i];
3729 int level = block[j] * qmat[j];
3731 if(((unsigned)(level+threshold1))>threshold2){
3737 for(i=start_i; i<=last_non_zero; i++) {
3738 const int j = scantable[i];
3739 int level = block[j] * qmat[j];
3741 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3742 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3743 if(((unsigned)(level+threshold1))>threshold2){
3745 level= (bias + level)>>QMAT_SHIFT;
3747 coeff[1][i]= level-1;
3748 // coeff[2][k]= level-2;
3750 level= (bias - level)>>QMAT_SHIFT;
3751 coeff[0][i]= -level;
3752 coeff[1][i]= -level+1;
3753 // coeff[2][k]= -level+2;
3755 coeff_count[i]= FFMIN(level, 2);
3756 assert(coeff_count[i]);
3759 coeff[0][i]= (level>>31)|1;
3764 *overflow= s->max_qcoeff < max; //overflow might have happened
3766 if(last_non_zero < start_i){
3767 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3768 return last_non_zero;
3771 score_tab[start_i]= 0;
3772 survivor[0]= start_i;
3775 for(i=start_i; i<=last_non_zero; i++){
3776 int level_index, j, zero_distortion;
3777 int dct_coeff= FFABS(block[ scantable[i] ]);
3778 int best_score=256*256*256*120;
3780 if (s->fdsp.fdct == ff_fdct_ifast)
3781 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3782 zero_distortion= dct_coeff*dct_coeff;
3784 for(level_index=0; level_index < coeff_count[i]; level_index++){
3786 int level= coeff[level_index][i];
3787 const int alevel= FFABS(level);
3792 if(s->out_format == FMT_H263){
3793 unquant_coeff= alevel*qmul + qadd;
3795 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3797 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3798 unquant_coeff = (unquant_coeff - 1) | 1;
3800 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3801 unquant_coeff = (unquant_coeff - 1) | 1;
3806 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3808 if((level&(~127)) == 0){
3809 for(j=survivor_count-1; j>=0; j--){
3810 int run= i - survivor[j];
3811 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3812 score += score_tab[i-run];
3814 if(score < best_score){
3817 level_tab[i+1]= level-64;
3821 if(s->out_format == FMT_H263){
3822 for(j=survivor_count-1; j>=0; j--){
3823 int run= i - survivor[j];
3824 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3825 score += score_tab[i-run];
3826 if(score < last_score){
3829 last_level= level-64;
3835 distortion += esc_length*lambda;
3836 for(j=survivor_count-1; j>=0; j--){
3837 int run= i - survivor[j];
3838 int score= distortion + score_tab[i-run];
3840 if(score < best_score){
3843 level_tab[i+1]= level-64;
3847 if(s->out_format == FMT_H263){
3848 for(j=survivor_count-1; j>=0; j--){
3849 int run= i - survivor[j];
3850 int score= distortion + score_tab[i-run];
3851 if(score < last_score){
3854 last_level= level-64;
3862 score_tab[i+1]= best_score;
3864 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3865 if(last_non_zero <= 27){
3866 for(; survivor_count; survivor_count--){
3867 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3871 for(; survivor_count; survivor_count--){
3872 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3877 survivor[ survivor_count++ ]= i+1;
3880 if(s->out_format != FMT_H263){
3881 last_score= 256*256*256*120;
3882 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3883 int score= score_tab[i];
3884 if(i) score += lambda*2; //FIXME exacter?
3886 if(score < last_score){
3889 last_level= level_tab[i];
3890 last_run= run_tab[i];
3895 s->coded_score[n] = last_score;
3897 dc= FFABS(block[0]);
3898 last_non_zero= last_i - 1;
3899 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3901 if(last_non_zero < start_i)
3902 return last_non_zero;
3904 if(last_non_zero == 0 && start_i == 0){
3906 int best_score= dc * dc;
3908 for(i=0; i<coeff_count[0]; i++){
3909 int level= coeff[i][0];
3910 int alevel= FFABS(level);
3911 int unquant_coeff, score, distortion;
3913 if(s->out_format == FMT_H263){
3914 unquant_coeff= (alevel*qmul + qadd)>>3;
3916 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3917 unquant_coeff = (unquant_coeff - 1) | 1;
3919 unquant_coeff = (unquant_coeff + 4) >> 3;
3920 unquant_coeff<<= 3 + 3;
3922 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3924 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3925 else score= distortion + esc_length*lambda;
3927 if(score < best_score){
3929 best_level= level - 64;
3932 block[0]= best_level;
3933 s->coded_score[n] = best_score - dc*dc;
3934 if(best_level == 0) return -1;
3935 else return last_non_zero;
3941 block[ perm_scantable[last_non_zero] ]= last_level;
3944 for(; i>start_i; i -= run_tab[i] + 1){
3945 block[ perm_scantable[i-1] ]= level_tab[i];
3948 return last_non_zero;
3951 //#define REFINE_STATS 1
3952 static int16_t basis[64][64];
3954 static void build_basis(uint8_t *perm){
3961 double s= 0.25*(1<<BASIS_SHIFT);
3963 int perm_index= perm[index];
3964 if(i==0) s*= sqrt(0.5);
3965 if(j==0) s*= sqrt(0.5);
3966 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)));
3973 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3974 int16_t *block, int16_t *weight, int16_t *orig,
3977 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3978 const uint8_t *scantable= s->intra_scantable.scantable;
3979 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3980 // unsigned int threshold1, threshold2;
3985 int qmul, qadd, start_i, last_non_zero, i, dc;
3987 uint8_t * last_length;
3989 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3992 static int after_last=0;
3993 static int to_zero=0;
3994 static int from_zero=0;
3997 static int messed_sign=0;
4000 if(basis[0][0] == 0)
4001 build_basis(s->idsp.idct_permutation);
4012 /* For AIC we skip quant/dequant of INTRADC */
4016 q <<= RECON_SHIFT-3;
4017 /* note: block[0] is assumed to be positive */
4019 // block[0] = (block[0] + (q >> 1)) / q;
4021 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4022 // bias= 1<<(QMAT_SHIFT-1);
4023 length = s->intra_ac_vlc_length;
4024 last_length= s->intra_ac_vlc_last_length;
4028 length = s->inter_ac_vlc_length;
4029 last_length= s->inter_ac_vlc_last_length;
4031 last_non_zero = s->block_last_index[n];
4036 dc += (1<<(RECON_SHIFT-1));
4037 for(i=0; i<64; i++){
4038 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
4041 STOP_TIMER("memset rem[]")}
4044 for(i=0; i<64; i++){
4049 w= FFABS(weight[i]) + qns*one;
4050 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4053 // w=weight[i] = (63*qns + (w/2)) / w;
4059 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4065 for(i=start_i; i<=last_non_zero; i++){
4066 int j= perm_scantable[i];
4067 const int level= block[j];
4071 if(level<0) coeff= qmul*level - qadd;
4072 else coeff= qmul*level + qadd;
4073 run_tab[rle_index++]=run;
4076 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4082 if(last_non_zero>0){
4083 STOP_TIMER("init rem[]")
4090 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4093 int run2, best_unquant_change=0, analyze_gradient;
4097 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4099 if(analyze_gradient){
4103 for(i=0; i<64; i++){
4106 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4109 STOP_TIMER("rem*w*w")}
4119 const int level= block[0];
4120 int change, old_coeff;
4122 assert(s->mb_intra);
4126 for(change=-1; change<=1; change+=2){
4127 int new_level= level + change;
4128 int score, new_coeff;
4130 new_coeff= q*new_level;
4131 if(new_coeff >= 2048 || new_coeff < 0)
4134 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4135 new_coeff - old_coeff);
4136 if(score<best_score){
4139 best_change= change;
4140 best_unquant_change= new_coeff - old_coeff;
4147 run2= run_tab[rle_index++];
4151 for(i=start_i; i<64; i++){
4152 int j= perm_scantable[i];
4153 const int level= block[j];
4154 int change, old_coeff;
4156 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4160 if(level<0) old_coeff= qmul*level - qadd;
4161 else old_coeff= qmul*level + qadd;
4162 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4166 assert(run2>=0 || i >= last_non_zero );
4169 for(change=-1; change<=1; change+=2){
4170 int new_level= level + change;
4171 int score, new_coeff, unquant_change;
4174 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4178 if(new_level<0) new_coeff= qmul*new_level - qadd;
4179 else new_coeff= qmul*new_level + qadd;
4180 if(new_coeff >= 2048 || new_coeff <= -2048)
4182 //FIXME check for overflow
4185 if(level < 63 && level > -63){
4186 if(i < last_non_zero)
4187 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4188 - length[UNI_AC_ENC_INDEX(run, level+64)];
4190 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4191 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4194 assert(FFABS(new_level)==1);
4196 if(analyze_gradient){
4197 int g= d1[ scantable[i] ];
4198 if(g && (g^new_level) >= 0)
4202 if(i < last_non_zero){
4203 int next_i= i + run2 + 1;
4204 int next_level= block[ perm_scantable[next_i] ] + 64;
4206 if(next_level&(~127))
4209 if(next_i < last_non_zero)
4210 score += length[UNI_AC_ENC_INDEX(run, 65)]
4211 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4212 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4214 score += length[UNI_AC_ENC_INDEX(run, 65)]
4215 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4216 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4218 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4220 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4221 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4227 assert(FFABS(level)==1);
4229 if(i < last_non_zero){
4230 int next_i= i + run2 + 1;
4231 int next_level= block[ perm_scantable[next_i] ] + 64;
4233 if(next_level&(~127))
4236 if(next_i < last_non_zero)
4237 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4238 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4239 - length[UNI_AC_ENC_INDEX(run, 65)];
4241 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4242 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4243 - length[UNI_AC_ENC_INDEX(run, 65)];
4245 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4247 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4248 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4255 unquant_change= new_coeff - old_coeff;
4256 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4258 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4260 if(score<best_score){
4263 best_change= change;
4264 best_unquant_change= unquant_change;
4268 prev_level= level + 64;
4269 if(prev_level&(~127))
4278 STOP_TIMER("iterative step")}
4282 int j= perm_scantable[ best_coeff ];
4284 block[j] += best_change;
4286 if(best_coeff > last_non_zero){
4287 last_non_zero= best_coeff;
4295 if(block[j] - best_change){
4296 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4308 for(; last_non_zero>=start_i; last_non_zero--){
4309 if(block[perm_scantable[last_non_zero]])
4315 if(256*256*256*64 % count == 0){
4316 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);
4321 for(i=start_i; i<=last_non_zero; i++){
4322 int j= perm_scantable[i];
4323 const int level= block[j];
4326 run_tab[rle_index++]=run;
4333 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4339 if(last_non_zero>0){
4340 STOP_TIMER("iterative search")
4345 return last_non_zero;
4349 * Permute an 8x8 block according to permuatation.
4350 * @param block the block which will be permuted according to
4351 * the given permutation vector
4352 * @param permutation the permutation vector
4353 * @param last the last non zero coefficient in scantable order, used to
4354 * speed the permutation up
4355 * @param scantable the used scantable, this is only used to speed the
4356 * permutation up, the block is not (inverse) permutated
4357 * to scantable order!
4359 static void block_permute(int16_t *block, uint8_t *permutation,
4360 const uint8_t *scantable, int last)
4367 //FIXME it is ok but not clean and might fail for some permutations
4368 // if (permutation[1] == 1)
4371 for (i = 0; i <= last; i++) {
4372 const int j = scantable[i];
4377 for (i = 0; i <= last; i++) {
4378 const int j = scantable[i];
4379 const int perm_j = permutation[j];
4380 block[perm_j] = temp[j];
4384 int ff_dct_quantize_c(MpegEncContext *s,
4385 int16_t *block, int n,
4386 int qscale, int *overflow)
4388 int i, j, level, last_non_zero, q, start_i;
4390 const uint8_t *scantable= s->intra_scantable.scantable;
4393 unsigned int threshold1, threshold2;
4395 s->fdsp.fdct(block);
4397 if(s->dct_error_sum)
4398 s->denoise_dct(s, block);
4408 /* For AIC we skip quant/dequant of INTRADC */
4411 /* note: block[0] is assumed to be positive */
4412 block[0] = (block[0] + (q >> 1)) / q;
4415 qmat = s->q_intra_matrix[qscale];
4416 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4420 qmat = s->q_inter_matrix[qscale];
4421 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4423 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4424 threshold2= (threshold1<<1);
4425 for(i=63;i>=start_i;i--) {
4427 level = block[j] * qmat[j];
4429 if(((unsigned)(level+threshold1))>threshold2){
4436 for(i=start_i; i<=last_non_zero; i++) {
4438 level = block[j] * qmat[j];
4440 // if( bias+level >= (1<<QMAT_SHIFT)
4441 // || bias-level >= (1<<QMAT_SHIFT)){
4442 if(((unsigned)(level+threshold1))>threshold2){
4444 level= (bias + level)>>QMAT_SHIFT;
4447 level= (bias - level)>>QMAT_SHIFT;
4455 *overflow= s->max_qcoeff < max; //overflow might have happened
4457 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4458 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4459 block_permute(block, s->idsp.idct_permutation,
4460 scantable, last_non_zero);
4462 return last_non_zero;
4465 #define OFFSET(x) offsetof(MpegEncContext, x)
4466 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4467 static const AVOption h263_options[] = {
4468 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4469 { "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},
4470 { "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 },
4475 static const AVClass h263_class = {
4476 .class_name = "H.263 encoder",
4477 .item_name = av_default_item_name,
4478 .option = h263_options,
4479 .version = LIBAVUTIL_VERSION_INT,
4482 AVCodec ff_h263_encoder = {
4484 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4485 .type = AVMEDIA_TYPE_VIDEO,
4486 .id = AV_CODEC_ID_H263,
4487 .priv_data_size = sizeof(MpegEncContext),
4488 .init = ff_mpv_encode_init,
4489 .encode2 = ff_mpv_encode_picture,
4490 .close = ff_mpv_encode_end,
4491 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4492 .priv_class = &h263_class,
4495 static const AVOption h263p_options[] = {
4496 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4497 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4498 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4499 { "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},
4503 static const AVClass h263p_class = {
4504 .class_name = "H.263p encoder",
4505 .item_name = av_default_item_name,
4506 .option = h263p_options,
4507 .version = LIBAVUTIL_VERSION_INT,
4510 AVCodec ff_h263p_encoder = {
4512 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4513 .type = AVMEDIA_TYPE_VIDEO,
4514 .id = AV_CODEC_ID_H263P,
4515 .priv_data_size = sizeof(MpegEncContext),
4516 .init = ff_mpv_encode_init,
4517 .encode2 = ff_mpv_encode_picture,
4518 .close = ff_mpv_encode_end,
4519 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4520 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4521 .priv_class = &h263p_class,
4524 static const AVClass msmpeg4v2_class = {
4525 .class_name = "msmpeg4v2 encoder",
4526 .item_name = av_default_item_name,
4527 .option = ff_mpv_generic_options,
4528 .version = LIBAVUTIL_VERSION_INT,
4531 AVCodec ff_msmpeg4v2_encoder = {
4532 .name = "msmpeg4v2",
4533 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4534 .type = AVMEDIA_TYPE_VIDEO,
4535 .id = AV_CODEC_ID_MSMPEG4V2,
4536 .priv_data_size = sizeof(MpegEncContext),
4537 .init = ff_mpv_encode_init,
4538 .encode2 = ff_mpv_encode_picture,
4539 .close = ff_mpv_encode_end,
4540 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4541 .priv_class = &msmpeg4v2_class,
4544 static const AVClass msmpeg4v3_class = {
4545 .class_name = "msmpeg4v3 encoder",
4546 .item_name = av_default_item_name,
4547 .option = ff_mpv_generic_options,
4548 .version = LIBAVUTIL_VERSION_INT,
4551 AVCodec ff_msmpeg4v3_encoder = {
4553 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4554 .type = AVMEDIA_TYPE_VIDEO,
4555 .id = AV_CODEC_ID_MSMPEG4V3,
4556 .priv_data_size = sizeof(MpegEncContext),
4557 .init = ff_mpv_encode_init,
4558 .encode2 = ff_mpv_encode_picture,
4559 .close = ff_mpv_encode_end,
4560 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4561 .priv_class = &msmpeg4v3_class,
4564 static const AVClass wmv1_class = {
4565 .class_name = "wmv1 encoder",
4566 .item_name = av_default_item_name,
4567 .option = ff_mpv_generic_options,
4568 .version = LIBAVUTIL_VERSION_INT,
4571 AVCodec ff_wmv1_encoder = {
4573 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4574 .type = AVMEDIA_TYPE_VIDEO,
4575 .id = AV_CODEC_ID_WMV1,
4576 .priv_data_size = sizeof(MpegEncContext),
4577 .init = ff_mpv_encode_init,
4578 .encode2 = ff_mpv_encode_picture,
4579 .close = ff_mpv_encode_end,
4580 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4581 .priv_class = &wmv1_class,