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 s->bit_rate = avctx->bit_rate;
298 s->width = avctx->width;
299 s->height = avctx->height;
300 if (avctx->gop_size > 600 &&
301 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
302 av_log(avctx, AV_LOG_ERROR,
303 "Warning keyframe interval too large! reducing it ...\n");
304 avctx->gop_size = 600;
306 s->gop_size = avctx->gop_size;
308 if (avctx->max_b_frames > MAX_B_FRAMES) {
309 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
310 "is %d.\n", MAX_B_FRAMES);
312 s->max_b_frames = avctx->max_b_frames;
313 s->codec_id = avctx->codec->id;
314 s->strict_std_compliance = avctx->strict_std_compliance;
315 s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
316 s->mpeg_quant = avctx->mpeg_quant;
317 s->rtp_mode = !!avctx->rtp_payload_size;
318 s->intra_dc_precision = avctx->intra_dc_precision;
319 s->user_specified_pts = AV_NOPTS_VALUE;
321 if (s->gop_size <= 1) {
328 #if FF_API_MOTION_EST
329 FF_DISABLE_DEPRECATION_WARNINGS
330 s->me_method = avctx->me_method;
331 FF_ENABLE_DEPRECATION_WARNINGS
335 s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
338 FF_DISABLE_DEPRECATION_WARNINGS
339 if (avctx->border_masking != 0.0)
340 s->border_masking = avctx->border_masking;
341 FF_ENABLE_DEPRECATION_WARNINGS
344 s->adaptive_quant = (s->avctx->lumi_masking ||
345 s->avctx->dark_masking ||
346 s->avctx->temporal_cplx_masking ||
347 s->avctx->spatial_cplx_masking ||
348 s->avctx->p_masking ||
350 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
353 s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
355 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
356 av_log(avctx, AV_LOG_ERROR,
357 "a vbv buffer size is needed, "
358 "for encoding with a maximum bitrate\n");
362 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
363 av_log(avctx, AV_LOG_INFO,
364 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
367 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
368 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
372 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
373 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
377 if (avctx->rc_max_rate &&
378 avctx->rc_max_rate == avctx->bit_rate &&
379 avctx->rc_max_rate != avctx->rc_min_rate) {
380 av_log(avctx, AV_LOG_INFO,
381 "impossible bitrate constraints, this will fail\n");
384 if (avctx->rc_buffer_size &&
385 avctx->bit_rate * (int64_t)avctx->time_base.num >
386 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
387 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
391 if (!s->fixed_qscale &&
392 avctx->bit_rate * av_q2d(avctx->time_base) >
393 avctx->bit_rate_tolerance) {
394 av_log(avctx, AV_LOG_ERROR,
395 "bitrate tolerance too small for bitrate\n");
399 if (s->avctx->rc_max_rate &&
400 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
401 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
402 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
403 90000LL * (avctx->rc_buffer_size - 1) >
404 s->avctx->rc_max_rate * 0xFFFFLL) {
405 av_log(avctx, AV_LOG_INFO,
406 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
407 "specified vbv buffer is too large for the given bitrate!\n");
410 if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
411 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
412 s->codec_id != AV_CODEC_ID_FLV1) {
413 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
417 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
418 av_log(avctx, AV_LOG_ERROR,
419 "OBMC is only supported with simple mb decision\n");
423 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
424 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
428 if (s->max_b_frames &&
429 s->codec_id != AV_CODEC_ID_MPEG4 &&
430 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
431 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
432 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
436 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
437 s->codec_id == AV_CODEC_ID_H263 ||
438 s->codec_id == AV_CODEC_ID_H263P) &&
439 (avctx->sample_aspect_ratio.num > 255 ||
440 avctx->sample_aspect_ratio.den > 255)) {
441 av_log(avctx, AV_LOG_ERROR,
442 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
443 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
447 if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
448 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
449 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
453 // FIXME mpeg2 uses that too
454 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
455 av_log(avctx, AV_LOG_ERROR,
456 "mpeg2 style quantization not supported by codec\n");
460 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
461 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
465 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
466 s->avctx->mb_decision != FF_MB_DECISION_RD) {
467 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
471 #if FF_API_PRIVATE_OPT
472 FF_DISABLE_DEPRECATION_WARNINGS
473 if (avctx->scenechange_threshold)
474 s->scenechange_threshold = avctx->scenechange_threshold;
475 FF_ENABLE_DEPRECATION_WARNINGS
478 if (s->scenechange_threshold < 1000000000 &&
479 (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
480 av_log(avctx, AV_LOG_ERROR,
481 "closed gop with scene change detection are not supported yet, "
482 "set threshold to 1000000000\n");
486 if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
487 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
488 av_log(avctx, AV_LOG_ERROR,
489 "low delay forcing is only available for mpeg2\n");
492 if (s->max_b_frames != 0) {
493 av_log(avctx, AV_LOG_ERROR,
494 "b frames cannot be used with low delay\n");
499 if (s->q_scale_type == 1) {
500 if (avctx->qmax > 12) {
501 av_log(avctx, AV_LOG_ERROR,
502 "non linear quant only supports qmax <= 12 currently\n");
507 if (avctx->slices > 1 &&
508 (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
509 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
510 return AVERROR(EINVAL);
513 if (s->avctx->thread_count > 1 &&
514 s->codec_id != AV_CODEC_ID_MPEG4 &&
515 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
516 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
517 (s->codec_id != AV_CODEC_ID_H263P)) {
518 av_log(avctx, AV_LOG_ERROR,
519 "multi threaded encoding not supported by codec\n");
523 if (s->avctx->thread_count < 1) {
524 av_log(avctx, AV_LOG_ERROR,
525 "automatic thread number detection not supported by codec,"
530 if (!avctx->time_base.den || !avctx->time_base.num) {
531 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
535 #if FF_API_PRIVATE_OPT
536 FF_DISABLE_DEPRECATION_WARNINGS
537 if (avctx->b_frame_strategy)
538 s->b_frame_strategy = avctx->b_frame_strategy;
539 if (avctx->b_sensitivity != 40)
540 s->b_sensitivity = avctx->b_sensitivity;
541 FF_ENABLE_DEPRECATION_WARNINGS
544 if (s->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
545 av_log(avctx, AV_LOG_INFO,
546 "notice: b_frame_strategy only affects the first pass\n");
547 s->b_frame_strategy = 0;
550 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
552 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
553 avctx->time_base.den /= i;
554 avctx->time_base.num /= i;
558 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
559 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
560 // (a + x * 3 / 8) / x
561 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
562 s->inter_quant_bias = 0;
564 s->intra_quant_bias = 0;
566 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
569 #if FF_API_QUANT_BIAS
570 FF_DISABLE_DEPRECATION_WARNINGS
571 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
572 s->intra_quant_bias = avctx->intra_quant_bias;
573 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
574 s->inter_quant_bias = avctx->inter_quant_bias;
575 FF_ENABLE_DEPRECATION_WARNINGS
578 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
579 s->avctx->time_base.den > (1 << 16) - 1) {
580 av_log(avctx, AV_LOG_ERROR,
581 "timebase %d/%d not supported by MPEG 4 standard, "
582 "the maximum admitted value for the timebase denominator "
583 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
587 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
589 switch (avctx->codec->id) {
590 case AV_CODEC_ID_MPEG1VIDEO:
591 s->out_format = FMT_MPEG1;
592 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
593 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
595 case AV_CODEC_ID_MPEG2VIDEO:
596 s->out_format = FMT_MPEG1;
597 s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
598 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
601 case AV_CODEC_ID_MJPEG:
602 s->out_format = FMT_MJPEG;
603 s->intra_only = 1; /* force intra only for jpeg */
604 if (!CONFIG_MJPEG_ENCODER ||
605 ff_mjpeg_encode_init(s) < 0)
610 case AV_CODEC_ID_H261:
611 if (!CONFIG_H261_ENCODER)
613 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
614 av_log(avctx, AV_LOG_ERROR,
615 "The specified picture size of %dx%d is not valid for the "
616 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
617 s->width, s->height);
620 s->out_format = FMT_H261;
623 s->rtp_mode = 0; /* Sliced encoding not supported */
625 case AV_CODEC_ID_H263:
626 if (!CONFIG_H263_ENCODER)
628 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
629 s->width, s->height) == 8) {
630 av_log(avctx, AV_LOG_INFO,
631 "The specified picture size of %dx%d is not valid for "
632 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
633 "352x288, 704x576, and 1408x1152."
634 "Try H.263+.\n", s->width, s->height);
637 s->out_format = FMT_H263;
641 case AV_CODEC_ID_H263P:
642 s->out_format = FMT_H263;
645 s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
646 s->modified_quant = s->h263_aic;
647 s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
648 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
651 /* These are just to be sure */
655 case AV_CODEC_ID_FLV1:
656 s->out_format = FMT_H263;
657 s->h263_flv = 2; /* format = 1; 11-bit codes */
658 s->unrestricted_mv = 1;
659 s->rtp_mode = 0; /* don't allow GOB */
663 case AV_CODEC_ID_RV10:
664 s->out_format = FMT_H263;
668 case AV_CODEC_ID_RV20:
669 s->out_format = FMT_H263;
672 s->modified_quant = 1;
676 s->unrestricted_mv = 0;
678 case AV_CODEC_ID_MPEG4:
679 s->out_format = FMT_H263;
681 s->unrestricted_mv = 1;
682 s->low_delay = s->max_b_frames ? 0 : 1;
683 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
685 case AV_CODEC_ID_MSMPEG4V2:
686 s->out_format = FMT_H263;
688 s->unrestricted_mv = 1;
689 s->msmpeg4_version = 2;
693 case AV_CODEC_ID_MSMPEG4V3:
694 s->out_format = FMT_H263;
696 s->unrestricted_mv = 1;
697 s->msmpeg4_version = 3;
698 s->flipflop_rounding = 1;
702 case AV_CODEC_ID_WMV1:
703 s->out_format = FMT_H263;
705 s->unrestricted_mv = 1;
706 s->msmpeg4_version = 4;
707 s->flipflop_rounding = 1;
711 case AV_CODEC_ID_WMV2:
712 s->out_format = FMT_H263;
714 s->unrestricted_mv = 1;
715 s->msmpeg4_version = 5;
716 s->flipflop_rounding = 1;
724 avctx->has_b_frames = !s->low_delay;
728 s->progressive_frame =
729 s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
730 AV_CODEC_FLAG_INTERLACED_ME) ||
735 if (ff_mpv_common_init(s) < 0)
739 ff_mpv_encode_init_x86(s);
741 ff_fdctdsp_init(&s->fdsp, avctx);
742 ff_me_cmp_init(&s->mecc, avctx);
743 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
744 ff_pixblockdsp_init(&s->pdsp, avctx);
745 ff_qpeldsp_init(&s->qdsp);
747 if (s->msmpeg4_version) {
748 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
749 2 * 2 * (MAX_LEVEL + 1) *
750 (MAX_RUN + 1) * 2 * sizeof(int), fail);
752 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
754 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
755 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
756 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
757 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
758 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
759 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
760 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
761 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
763 if (s->avctx->noise_reduction) {
764 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
765 2 * 64 * sizeof(uint16_t), fail);
768 if (CONFIG_H263_ENCODER)
769 ff_h263dsp_init(&s->h263dsp);
770 if (!s->dct_quantize)
771 s->dct_quantize = ff_dct_quantize_c;
773 s->denoise_dct = denoise_dct_c;
774 s->fast_dct_quantize = s->dct_quantize;
776 s->dct_quantize = dct_quantize_trellis_c;
778 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
779 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
781 if (s->slice_context_count > 1) {
784 if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P)
785 s->h263_slice_structured = 1;
788 s->quant_precision = 5;
790 #if FF_API_PRIVATE_OPT
791 FF_DISABLE_DEPRECATION_WARNINGS
792 if (avctx->frame_skip_threshold)
793 s->frame_skip_threshold = avctx->frame_skip_threshold;
794 if (avctx->frame_skip_factor)
795 s->frame_skip_factor = avctx->frame_skip_factor;
796 if (avctx->frame_skip_exp)
797 s->frame_skip_exp = avctx->frame_skip_exp;
798 if (avctx->frame_skip_cmp != FF_CMP_DCTMAX)
799 s->frame_skip_cmp = avctx->frame_skip_cmp;
800 FF_ENABLE_DEPRECATION_WARNINGS
803 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
804 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->frame_skip_cmp);
806 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
807 ff_h261_encode_init(s);
808 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
809 ff_h263_encode_init(s);
810 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
811 if ((ret = ff_msmpeg4_encode_init(s)) < 0)
813 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
814 && s->out_format == FMT_MPEG1)
815 ff_mpeg1_encode_init(s);
818 for (i = 0; i < 64; i++) {
819 int j = s->idsp.idct_permutation[i];
820 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
822 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
823 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
824 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
826 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
829 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
830 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
832 if (s->avctx->intra_matrix)
833 s->intra_matrix[j] = s->avctx->intra_matrix[i];
834 if (s->avctx->inter_matrix)
835 s->inter_matrix[j] = s->avctx->inter_matrix[i];
838 /* precompute matrix */
839 /* for mjpeg, we do include qscale in the matrix */
840 if (s->out_format != FMT_MJPEG) {
841 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
842 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
844 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
845 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
849 if (ff_rate_control_init(s) < 0)
852 #if FF_API_ERROR_RATE
853 FF_DISABLE_DEPRECATION_WARNINGS
854 if (avctx->error_rate)
855 s->error_rate = avctx->error_rate;
856 FF_ENABLE_DEPRECATION_WARNINGS;
859 #if FF_API_NORMALIZE_AQP
860 FF_DISABLE_DEPRECATION_WARNINGS
861 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
862 s->mpv_flags |= FF_MPV_FLAG_NAQ;
863 FF_ENABLE_DEPRECATION_WARNINGS;
867 FF_DISABLE_DEPRECATION_WARNINGS
868 if (avctx->flags & CODEC_FLAG_MV0)
869 s->mpv_flags |= FF_MPV_FLAG_MV0;
870 FF_ENABLE_DEPRECATION_WARNINGS
874 FF_DISABLE_DEPRECATION_WARNINGS
875 if (avctx->rc_qsquish != 0.0)
876 s->rc_qsquish = avctx->rc_qsquish;
877 if (avctx->rc_qmod_amp != 0.0)
878 s->rc_qmod_amp = avctx->rc_qmod_amp;
879 if (avctx->rc_qmod_freq)
880 s->rc_qmod_freq = avctx->rc_qmod_freq;
881 if (avctx->rc_buffer_aggressivity != 1.0)
882 s->rc_buffer_aggressivity = avctx->rc_buffer_aggressivity;
883 if (avctx->rc_initial_cplx != 0.0)
884 s->rc_initial_cplx = avctx->rc_initial_cplx;
886 s->lmin = avctx->lmin;
888 s->lmax = avctx->lmax;
892 s->rc_eq = av_strdup(avctx->rc_eq);
894 return AVERROR(ENOMEM);
896 FF_ENABLE_DEPRECATION_WARNINGS
899 #if FF_API_PRIVATE_OPT
900 FF_DISABLE_DEPRECATION_WARNINGS
901 if (avctx->brd_scale)
902 s->brd_scale = avctx->brd_scale;
903 FF_ENABLE_DEPRECATION_WARNINGS
906 if (s->b_frame_strategy == 2) {
907 for (i = 0; i < s->max_b_frames + 2; i++) {
908 s->tmp_frames[i] = av_frame_alloc();
909 if (!s->tmp_frames[i])
910 return AVERROR(ENOMEM);
912 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
913 s->tmp_frames[i]->width = s->width >> s->brd_scale;
914 s->tmp_frames[i]->height = s->height >> s->brd_scale;
916 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
922 cpb_props = ff_add_cpb_side_data(avctx);
924 return AVERROR(ENOMEM);
925 cpb_props->max_bitrate = avctx->rc_max_rate;
926 cpb_props->min_bitrate = avctx->rc_min_rate;
927 cpb_props->avg_bitrate = avctx->bit_rate;
928 cpb_props->buffer_size = avctx->rc_buffer_size;
932 ff_mpv_encode_end(avctx);
933 return AVERROR_UNKNOWN;
936 av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
938 MpegEncContext *s = avctx->priv_data;
941 ff_rate_control_uninit(s);
943 ff_mpv_common_end(s);
944 if (CONFIG_MJPEG_ENCODER &&
945 s->out_format == FMT_MJPEG)
946 ff_mjpeg_encode_close(s);
948 av_freep(&avctx->extradata);
950 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
951 av_frame_free(&s->tmp_frames[i]);
953 ff_free_picture_tables(&s->new_picture);
954 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
956 av_freep(&s->avctx->stats_out);
957 av_freep(&s->ac_stats);
959 av_freep(&s->q_intra_matrix);
960 av_freep(&s->q_inter_matrix);
961 av_freep(&s->q_intra_matrix16);
962 av_freep(&s->q_inter_matrix16);
963 av_freep(&s->input_picture);
964 av_freep(&s->reordered_input_picture);
965 av_freep(&s->dct_offset);
970 static int get_sae(uint8_t *src, int ref, int stride)
975 for (y = 0; y < 16; y++) {
976 for (x = 0; x < 16; x++) {
977 acc += FFABS(src[x + y * stride] - ref);
984 static int get_intra_count(MpegEncContext *s, uint8_t *src,
985 uint8_t *ref, int stride)
993 for (y = 0; y < h; y += 16) {
994 for (x = 0; x < w; x += 16) {
995 int offset = x + y * stride;
996 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
998 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
999 int sae = get_sae(src + offset, mean, stride);
1001 acc += sae + 500 < sad;
1007 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
1009 return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
1010 s->chroma_x_shift, s->chroma_y_shift, s->out_format,
1011 s->mb_stride, s->mb_height, s->b8_stride,
1012 &s->linesize, &s->uvlinesize);
1015 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
1017 Picture *pic = NULL;
1019 int i, display_picture_number = 0, ret;
1020 int encoding_delay = s->max_b_frames ? s->max_b_frames
1021 : (s->low_delay ? 0 : 1);
1022 int flush_offset = 1;
1027 display_picture_number = s->input_picture_number++;
1029 if (pts != AV_NOPTS_VALUE) {
1030 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1032 int64_t last = s->user_specified_pts;
1035 av_log(s->avctx, AV_LOG_ERROR,
1036 "Error, Invalid timestamp=%"PRId64", "
1037 "last=%"PRId64"\n", pts, s->user_specified_pts);
1041 if (!s->low_delay && display_picture_number == 1)
1042 s->dts_delta = time - last;
1044 s->user_specified_pts = pts;
1046 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1047 s->user_specified_pts =
1048 pts = s->user_specified_pts + 1;
1049 av_log(s->avctx, AV_LOG_INFO,
1050 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1053 pts = display_picture_number;
1057 if (!pic_arg->buf[0] ||
1058 pic_arg->linesize[0] != s->linesize ||
1059 pic_arg->linesize[1] != s->uvlinesize ||
1060 pic_arg->linesize[2] != s->uvlinesize)
1062 if ((s->width & 15) || (s->height & 15))
1065 ff_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1066 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1068 i = ff_find_unused_picture(s->avctx, s->picture, direct);
1072 pic = &s->picture[i];
1076 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1079 ret = alloc_picture(s, pic, direct);
1084 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1085 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1086 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1089 int h_chroma_shift, v_chroma_shift;
1090 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1094 for (i = 0; i < 3; i++) {
1095 int src_stride = pic_arg->linesize[i];
1096 int dst_stride = i ? s->uvlinesize : s->linesize;
1097 int h_shift = i ? h_chroma_shift : 0;
1098 int v_shift = i ? v_chroma_shift : 0;
1099 int w = s->width >> h_shift;
1100 int h = s->height >> v_shift;
1101 uint8_t *src = pic_arg->data[i];
1102 uint8_t *dst = pic->f->data[i];
1104 if (!s->avctx->rc_buffer_size)
1105 dst += INPLACE_OFFSET;
1107 if (src_stride == dst_stride)
1108 memcpy(dst, src, src_stride * h);
1111 uint8_t *dst2 = dst;
1113 memcpy(dst2, src, w);
1118 if ((s->width & 15) || (s->height & 15)) {
1119 s->mpvencdsp.draw_edges(dst, dst_stride,
1128 ret = av_frame_copy_props(pic->f, pic_arg);
1132 pic->f->display_picture_number = display_picture_number;
1133 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1135 /* Flushing: When we have not received enough input frames,
1136 * ensure s->input_picture[0] contains the first picture */
1137 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1138 if (s->input_picture[flush_offset])
1141 if (flush_offset <= 1)
1144 encoding_delay = encoding_delay - flush_offset + 1;
1147 /* shift buffer entries */
1148 for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1149 s->input_picture[i - flush_offset] = s->input_picture[i];
1151 s->input_picture[encoding_delay] = (Picture*) pic;
1156 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1160 int64_t score64 = 0;
1162 for (plane = 0; plane < 3; plane++) {
1163 const int stride = p->f->linesize[plane];
1164 const int bw = plane ? 1 : 2;
1165 for (y = 0; y < s->mb_height * bw; y++) {
1166 for (x = 0; x < s->mb_width * bw; x++) {
1167 int off = p->shared ? 0 : 16;
1168 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1169 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1170 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1172 switch (s->frame_skip_exp) {
1173 case 0: score = FFMAX(score, v); break;
1174 case 1: score += FFABS(v); break;
1175 case 2: score += v * v; break;
1176 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1177 case 4: score64 += v * v * (int64_t)(v * v); break;
1186 if (score64 < s->frame_skip_threshold)
1188 if (score64 < ((s->frame_skip_factor * (int64_t) s->lambda) >> 8))
1193 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1195 AVPacket pkt = { 0 };
1196 int ret, got_output;
1198 av_init_packet(&pkt);
1199 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1204 av_packet_unref(&pkt);
1208 static int estimate_best_b_count(MpegEncContext *s)
1210 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1211 AVCodecContext *c = avcodec_alloc_context3(NULL);
1212 const int scale = s->brd_scale;
1213 int i, j, out_size, p_lambda, b_lambda, lambda2;
1214 int64_t best_rd = INT64_MAX;
1215 int best_b_count = -1;
1218 return AVERROR(ENOMEM);
1219 assert(scale >= 0 && scale <= 3);
1222 //s->next_picture_ptr->quality;
1223 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1224 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1225 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1226 if (!b_lambda) // FIXME we should do this somewhere else
1227 b_lambda = p_lambda;
1228 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1231 c->width = s->width >> scale;
1232 c->height = s->height >> scale;
1233 c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
1234 c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
1235 c->mb_decision = s->avctx->mb_decision;
1236 c->me_cmp = s->avctx->me_cmp;
1237 c->mb_cmp = s->avctx->mb_cmp;
1238 c->me_sub_cmp = s->avctx->me_sub_cmp;
1239 c->pix_fmt = AV_PIX_FMT_YUV420P;
1240 c->time_base = s->avctx->time_base;
1241 c->max_b_frames = s->max_b_frames;
1243 if (avcodec_open2(c, codec, NULL) < 0)
1246 for (i = 0; i < s->max_b_frames + 2; i++) {
1247 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1248 s->next_picture_ptr;
1250 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1251 pre_input = *pre_input_ptr;
1253 if (!pre_input.shared && i) {
1254 pre_input.f->data[0] += INPLACE_OFFSET;
1255 pre_input.f->data[1] += INPLACE_OFFSET;
1256 pre_input.f->data[2] += INPLACE_OFFSET;
1259 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1260 s->tmp_frames[i]->linesize[0],
1261 pre_input.f->data[0],
1262 pre_input.f->linesize[0],
1263 c->width, c->height);
1264 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1265 s->tmp_frames[i]->linesize[1],
1266 pre_input.f->data[1],
1267 pre_input.f->linesize[1],
1268 c->width >> 1, c->height >> 1);
1269 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1270 s->tmp_frames[i]->linesize[2],
1271 pre_input.f->data[2],
1272 pre_input.f->linesize[2],
1273 c->width >> 1, c->height >> 1);
1277 for (j = 0; j < s->max_b_frames + 1; j++) {
1280 if (!s->input_picture[j])
1283 c->error[0] = c->error[1] = c->error[2] = 0;
1285 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1286 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1288 out_size = encode_frame(c, s->tmp_frames[0]);
1290 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1292 for (i = 0; i < s->max_b_frames + 1; i++) {
1293 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1295 s->tmp_frames[i + 1]->pict_type = is_p ?
1296 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1297 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1299 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1301 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1304 /* get the delayed frames */
1306 out_size = encode_frame(c, NULL);
1307 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1310 rd += c->error[0] + c->error[1] + c->error[2];
1321 return best_b_count;
1324 static int select_input_picture(MpegEncContext *s)
1328 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1329 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1330 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1332 /* set next picture type & ordering */
1333 if (!s->reordered_input_picture[0] && s->input_picture[0]) {
1334 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1335 !s->next_picture_ptr || s->intra_only) {
1336 s->reordered_input_picture[0] = s->input_picture[0];
1337 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1338 s->reordered_input_picture[0]->f->coded_picture_number =
1339 s->coded_picture_number++;
1343 if (s->frame_skip_threshold || s->frame_skip_factor) {
1344 if (s->picture_in_gop_number < s->gop_size &&
1345 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1346 // FIXME check that te gop check above is +-1 correct
1347 av_frame_unref(s->input_picture[0]->f);
1350 ff_vbv_update(s, 0);
1356 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
1357 for (i = 0; i < s->max_b_frames + 1; i++) {
1358 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1360 if (pict_num >= s->rc_context.num_entries)
1362 if (!s->input_picture[i]) {
1363 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1367 s->input_picture[i]->f->pict_type =
1368 s->rc_context.entry[pict_num].new_pict_type;
1372 if (s->b_frame_strategy == 0) {
1373 b_frames = s->max_b_frames;
1374 while (b_frames && !s->input_picture[b_frames])
1376 } else if (s->b_frame_strategy == 1) {
1377 for (i = 1; i < s->max_b_frames + 1; i++) {
1378 if (s->input_picture[i] &&
1379 s->input_picture[i]->b_frame_score == 0) {
1380 s->input_picture[i]->b_frame_score =
1382 s->input_picture[i ]->f->data[0],
1383 s->input_picture[i - 1]->f->data[0],
1387 for (i = 0; i < s->max_b_frames + 1; i++) {
1388 if (!s->input_picture[i] ||
1389 s->input_picture[i]->b_frame_score - 1 >
1390 s->mb_num / s->b_sensitivity)
1394 b_frames = FFMAX(0, i - 1);
1397 for (i = 0; i < b_frames + 1; i++) {
1398 s->input_picture[i]->b_frame_score = 0;
1400 } else if (s->b_frame_strategy == 2) {
1401 b_frames = estimate_best_b_count(s);
1406 for (i = b_frames - 1; i >= 0; i--) {
1407 int type = s->input_picture[i]->f->pict_type;
1408 if (type && type != AV_PICTURE_TYPE_B)
1411 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1412 b_frames == s->max_b_frames) {
1413 av_log(s->avctx, AV_LOG_ERROR,
1414 "warning, too many b frames in a row\n");
1417 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1418 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1419 s->gop_size > s->picture_in_gop_number) {
1420 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1422 if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1424 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1428 if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1429 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1432 s->reordered_input_picture[0] = s->input_picture[b_frames];
1433 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1434 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1435 s->reordered_input_picture[0]->f->coded_picture_number =
1436 s->coded_picture_number++;
1437 for (i = 0; i < b_frames; i++) {
1438 s->reordered_input_picture[i + 1] = s->input_picture[i];
1439 s->reordered_input_picture[i + 1]->f->pict_type =
1441 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1442 s->coded_picture_number++;
1447 ff_mpeg_unref_picture(s->avctx, &s->new_picture);
1449 if (s->reordered_input_picture[0]) {
1450 s->reordered_input_picture[0]->reference =
1451 s->reordered_input_picture[0]->f->pict_type !=
1452 AV_PICTURE_TYPE_B ? 3 : 0;
1454 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
1457 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1458 // input is a shared pix, so we can't modifiy it -> alloc a new
1459 // one & ensure that the shared one is reuseable
1462 int i = ff_find_unused_picture(s->avctx, s->picture, 0);
1465 pic = &s->picture[i];
1467 pic->reference = s->reordered_input_picture[0]->reference;
1468 if (alloc_picture(s, pic, 0) < 0) {
1472 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1476 /* mark us unused / free shared pic */
1477 av_frame_unref(s->reordered_input_picture[0]->f);
1478 s->reordered_input_picture[0]->shared = 0;
1480 s->current_picture_ptr = pic;
1482 // input is not a shared pix -> reuse buffer for current_pix
1483 s->current_picture_ptr = s->reordered_input_picture[0];
1484 for (i = 0; i < 4; i++) {
1485 s->new_picture.f->data[i] += INPLACE_OFFSET;
1488 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1489 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1490 s->current_picture_ptr)) < 0)
1493 s->picture_number = s->new_picture.f->display_picture_number;
1498 static void frame_end(MpegEncContext *s)
1502 if (s->unrestricted_mv &&
1503 s->current_picture.reference &&
1505 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1506 int hshift = desc->log2_chroma_w;
1507 int vshift = desc->log2_chroma_h;
1508 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1509 s->h_edge_pos, s->v_edge_pos,
1510 EDGE_WIDTH, EDGE_WIDTH,
1511 EDGE_TOP | EDGE_BOTTOM);
1512 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1513 s->h_edge_pos >> hshift,
1514 s->v_edge_pos >> vshift,
1515 EDGE_WIDTH >> hshift,
1516 EDGE_WIDTH >> vshift,
1517 EDGE_TOP | EDGE_BOTTOM);
1518 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1519 s->h_edge_pos >> hshift,
1520 s->v_edge_pos >> vshift,
1521 EDGE_WIDTH >> hshift,
1522 EDGE_WIDTH >> vshift,
1523 EDGE_TOP | EDGE_BOTTOM);
1528 s->last_pict_type = s->pict_type;
1529 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1530 if (s->pict_type!= AV_PICTURE_TYPE_B)
1531 s->last_non_b_pict_type = s->pict_type;
1534 /* release non-reference frames */
1535 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1536 if (!s->picture[i].reference)
1537 ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
1541 #if FF_API_CODED_FRAME
1542 FF_DISABLE_DEPRECATION_WARNINGS
1543 av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
1544 FF_ENABLE_DEPRECATION_WARNINGS
1546 #if FF_API_ERROR_FRAME
1547 FF_DISABLE_DEPRECATION_WARNINGS
1548 memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
1549 sizeof(s->current_picture.encoding_error));
1550 FF_ENABLE_DEPRECATION_WARNINGS
1554 static void update_noise_reduction(MpegEncContext *s)
1558 for (intra = 0; intra < 2; intra++) {
1559 if (s->dct_count[intra] > (1 << 16)) {
1560 for (i = 0; i < 64; i++) {
1561 s->dct_error_sum[intra][i] >>= 1;
1563 s->dct_count[intra] >>= 1;
1566 for (i = 0; i < 64; i++) {
1567 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1568 s->dct_count[intra] +
1569 s->dct_error_sum[intra][i] / 2) /
1570 (s->dct_error_sum[intra][i] + 1);
1575 static int frame_start(MpegEncContext *s)
1579 /* mark & release old frames */
1580 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1581 s->last_picture_ptr != s->next_picture_ptr &&
1582 s->last_picture_ptr->f->buf[0]) {
1583 ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr);
1586 s->current_picture_ptr->f->pict_type = s->pict_type;
1587 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1589 ff_mpeg_unref_picture(s->avctx, &s->current_picture);
1590 if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture,
1591 s->current_picture_ptr)) < 0)
1594 if (s->pict_type != AV_PICTURE_TYPE_B) {
1595 s->last_picture_ptr = s->next_picture_ptr;
1597 s->next_picture_ptr = s->current_picture_ptr;
1600 if (s->last_picture_ptr) {
1601 ff_mpeg_unref_picture(s->avctx, &s->last_picture);
1602 if (s->last_picture_ptr->f->buf[0] &&
1603 (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture,
1604 s->last_picture_ptr)) < 0)
1607 if (s->next_picture_ptr) {
1608 ff_mpeg_unref_picture(s->avctx, &s->next_picture);
1609 if (s->next_picture_ptr->f->buf[0] &&
1610 (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture,
1611 s->next_picture_ptr)) < 0)
1615 if (s->picture_structure!= PICT_FRAME) {
1617 for (i = 0; i < 4; i++) {
1618 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1619 s->current_picture.f->data[i] +=
1620 s->current_picture.f->linesize[i];
1622 s->current_picture.f->linesize[i] *= 2;
1623 s->last_picture.f->linesize[i] *= 2;
1624 s->next_picture.f->linesize[i] *= 2;
1628 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1629 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1630 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1631 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1632 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1633 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1635 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1636 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1639 if (s->dct_error_sum) {
1640 assert(s->avctx->noise_reduction && s->encoding);
1641 update_noise_reduction(s);
1647 int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1648 const AVFrame *pic_arg, int *got_packet)
1650 MpegEncContext *s = avctx->priv_data;
1651 int i, stuffing_count, ret;
1652 int context_count = s->slice_context_count;
1654 s->picture_in_gop_number++;
1656 if (load_input_picture(s, pic_arg) < 0)
1659 if (select_input_picture(s) < 0) {
1664 if (s->new_picture.f->data[0]) {
1667 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1670 s->mb_info_ptr = av_packet_new_side_data(pkt,
1671 AV_PKT_DATA_H263_MB_INFO,
1672 s->mb_width*s->mb_height*12);
1673 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1676 for (i = 0; i < context_count; i++) {
1677 int start_y = s->thread_context[i]->start_mb_y;
1678 int end_y = s->thread_context[i]-> end_mb_y;
1679 int h = s->mb_height;
1680 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1681 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1683 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1686 s->pict_type = s->new_picture.f->pict_type;
1688 ret = frame_start(s);
1692 if (encode_picture(s, s->picture_number) < 0)
1695 #if FF_API_STAT_BITS
1696 FF_DISABLE_DEPRECATION_WARNINGS
1697 avctx->header_bits = s->header_bits;
1698 avctx->mv_bits = s->mv_bits;
1699 avctx->misc_bits = s->misc_bits;
1700 avctx->i_tex_bits = s->i_tex_bits;
1701 avctx->p_tex_bits = s->p_tex_bits;
1702 avctx->i_count = s->i_count;
1703 // FIXME f/b_count in avctx
1704 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1705 avctx->skip_count = s->skip_count;
1706 FF_ENABLE_DEPRECATION_WARNINGS
1711 sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
1714 return AVERROR(ENOMEM);
1715 *(int *)sd = s->current_picture.f->quality;
1717 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1718 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1720 if (avctx->rc_buffer_size) {
1721 RateControlContext *rcc = &s->rc_context;
1722 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1724 if (put_bits_count(&s->pb) > max_size &&
1725 s->lambda < s->lmax) {
1726 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1727 (s->qscale + 1) / s->qscale);
1728 if (s->adaptive_quant) {
1730 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1731 s->lambda_table[i] =
1732 FFMAX(s->lambda_table[i] + 1,
1733 s->lambda_table[i] * (s->qscale + 1) /
1736 s->mb_skipped = 0; // done in frame_start()
1737 // done in encode_picture() so we must undo it
1738 if (s->pict_type == AV_PICTURE_TYPE_P) {
1739 if (s->flipflop_rounding ||
1740 s->codec_id == AV_CODEC_ID_H263P ||
1741 s->codec_id == AV_CODEC_ID_MPEG4)
1742 s->no_rounding ^= 1;
1744 if (s->pict_type != AV_PICTURE_TYPE_B) {
1745 s->time_base = s->last_time_base;
1746 s->last_non_b_time = s->time - s->pp_time;
1748 for (i = 0; i < context_count; i++) {
1749 PutBitContext *pb = &s->thread_context[i]->pb;
1750 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1755 assert(s->avctx->rc_max_rate);
1758 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1759 ff_write_pass1_stats(s);
1761 for (i = 0; i < 4; i++) {
1762 s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
1763 avctx->error[i] += s->current_picture_ptr->encoding_error[i];
1766 if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
1767 assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits +
1768 s->misc_bits + s->i_tex_bits +
1770 flush_put_bits(&s->pb);
1771 s->frame_bits = put_bits_count(&s->pb);
1773 stuffing_count = ff_vbv_update(s, s->frame_bits);
1774 if (stuffing_count) {
1775 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1776 stuffing_count + 50) {
1777 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1781 switch (s->codec_id) {
1782 case AV_CODEC_ID_MPEG1VIDEO:
1783 case AV_CODEC_ID_MPEG2VIDEO:
1784 while (stuffing_count--) {
1785 put_bits(&s->pb, 8, 0);
1788 case AV_CODEC_ID_MPEG4:
1789 put_bits(&s->pb, 16, 0);
1790 put_bits(&s->pb, 16, 0x1C3);
1791 stuffing_count -= 4;
1792 while (stuffing_count--) {
1793 put_bits(&s->pb, 8, 0xFF);
1797 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1799 flush_put_bits(&s->pb);
1800 s->frame_bits = put_bits_count(&s->pb);
1803 /* update mpeg1/2 vbv_delay for CBR */
1804 if (s->avctx->rc_max_rate &&
1805 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1806 s->out_format == FMT_MPEG1 &&
1807 90000LL * (avctx->rc_buffer_size - 1) <=
1808 s->avctx->rc_max_rate * 0xFFFFLL) {
1809 AVCPBProperties *props;
1812 int vbv_delay, min_delay;
1813 double inbits = s->avctx->rc_max_rate *
1814 av_q2d(s->avctx->time_base);
1815 int minbits = s->frame_bits - 8 *
1816 (s->vbv_delay_ptr - s->pb.buf - 1);
1817 double bits = s->rc_context.buffer_index + minbits - inbits;
1820 av_log(s->avctx, AV_LOG_ERROR,
1821 "Internal error, negative bits\n");
1823 assert(s->repeat_first_field == 0);
1825 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1826 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1827 s->avctx->rc_max_rate;
1829 vbv_delay = FFMAX(vbv_delay, min_delay);
1831 assert(vbv_delay < 0xFFFF);
1833 s->vbv_delay_ptr[0] &= 0xF8;
1834 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1835 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1836 s->vbv_delay_ptr[2] &= 0x07;
1837 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1839 props = av_cpb_properties_alloc(&props_size);
1841 return AVERROR(ENOMEM);
1842 props->vbv_delay = vbv_delay * 300;
1844 ret = av_packet_add_side_data(pkt, AV_PKT_DATA_CPB_PROPERTIES,
1845 (uint8_t*)props, props_size);
1851 #if FF_API_VBV_DELAY
1852 FF_DISABLE_DEPRECATION_WARNINGS
1853 avctx->vbv_delay = vbv_delay * 300;
1854 FF_ENABLE_DEPRECATION_WARNINGS
1857 s->total_bits += s->frame_bits;
1858 #if FF_API_STAT_BITS
1859 FF_DISABLE_DEPRECATION_WARNINGS
1860 avctx->frame_bits = s->frame_bits;
1861 FF_ENABLE_DEPRECATION_WARNINGS
1865 pkt->pts = s->current_picture.f->pts;
1866 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1867 if (!s->current_picture.f->coded_picture_number)
1868 pkt->dts = pkt->pts - s->dts_delta;
1870 pkt->dts = s->reordered_pts;
1871 s->reordered_pts = pkt->pts;
1873 pkt->dts = pkt->pts;
1874 if (s->current_picture.f->key_frame)
1875 pkt->flags |= AV_PKT_FLAG_KEY;
1877 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1881 assert((s->frame_bits & 7) == 0);
1883 pkt->size = s->frame_bits / 8;
1884 *got_packet = !!pkt->size;
1888 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1889 int n, int threshold)
1891 static const char tab[64] = {
1892 3, 2, 2, 1, 1, 1, 1, 1,
1893 1, 1, 1, 1, 1, 1, 1, 1,
1894 1, 1, 1, 1, 1, 1, 1, 1,
1895 0, 0, 0, 0, 0, 0, 0, 0,
1896 0, 0, 0, 0, 0, 0, 0, 0,
1897 0, 0, 0, 0, 0, 0, 0, 0,
1898 0, 0, 0, 0, 0, 0, 0, 0,
1899 0, 0, 0, 0, 0, 0, 0, 0
1904 int16_t *block = s->block[n];
1905 const int last_index = s->block_last_index[n];
1908 if (threshold < 0) {
1910 threshold = -threshold;
1914 /* Are all we could set to zero already zero? */
1915 if (last_index <= skip_dc - 1)
1918 for (i = 0; i <= last_index; i++) {
1919 const int j = s->intra_scantable.permutated[i];
1920 const int level = FFABS(block[j]);
1922 if (skip_dc && i == 0)
1926 } else if (level > 1) {
1932 if (score >= threshold)
1934 for (i = skip_dc; i <= last_index; i++) {
1935 const int j = s->intra_scantable.permutated[i];
1939 s->block_last_index[n] = 0;
1941 s->block_last_index[n] = -1;
1944 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1948 const int maxlevel = s->max_qcoeff;
1949 const int minlevel = s->min_qcoeff;
1953 i = 1; // skip clipping of intra dc
1957 for (; i <= last_index; i++) {
1958 const int j = s->intra_scantable.permutated[i];
1959 int level = block[j];
1961 if (level > maxlevel) {
1964 } else if (level < minlevel) {
1972 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1973 av_log(s->avctx, AV_LOG_INFO,
1974 "warning, clipping %d dct coefficients to %d..%d\n",
1975 overflow, minlevel, maxlevel);
1978 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1982 for (y = 0; y < 8; y++) {
1983 for (x = 0; x < 8; x++) {
1989 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1990 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1991 int v = ptr[x2 + y2 * stride];
1997 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2002 static av_always_inline void encode_mb_internal(MpegEncContext *s,
2003 int motion_x, int motion_y,
2004 int mb_block_height,
2007 int16_t weight[8][64];
2008 int16_t orig[8][64];
2009 const int mb_x = s->mb_x;
2010 const int mb_y = s->mb_y;
2013 int dct_offset = s->linesize * 8; // default for progressive frames
2014 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2015 ptrdiff_t wrap_y, wrap_c;
2017 for (i = 0; i < mb_block_count; i++)
2018 skip_dct[i] = s->skipdct;
2020 if (s->adaptive_quant) {
2021 const int last_qp = s->qscale;
2022 const int mb_xy = mb_x + mb_y * s->mb_stride;
2024 s->lambda = s->lambda_table[mb_xy];
2027 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2028 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
2029 s->dquant = s->qscale - last_qp;
2031 if (s->out_format == FMT_H263) {
2032 s->dquant = av_clip(s->dquant, -2, 2);
2034 if (s->codec_id == AV_CODEC_ID_MPEG4) {
2036 if (s->pict_type == AV_PICTURE_TYPE_B) {
2037 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
2040 if (s->mv_type == MV_TYPE_8X8)
2046 ff_set_qscale(s, last_qp + s->dquant);
2047 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2048 ff_set_qscale(s, s->qscale + s->dquant);
2050 wrap_y = s->linesize;
2051 wrap_c = s->uvlinesize;
2052 ptr_y = s->new_picture.f->data[0] +
2053 (mb_y * 16 * wrap_y) + mb_x * 16;
2054 ptr_cb = s->new_picture.f->data[1] +
2055 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2056 ptr_cr = s->new_picture.f->data[2] +
2057 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
2059 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
2060 uint8_t *ebuf = s->sc.edge_emu_buffer + 32;
2061 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2063 16, 16, mb_x * 16, mb_y * 16,
2064 s->width, s->height);
2066 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
2068 8, mb_block_height, mb_x * 8, mb_y * 8,
2069 s->width >> 1, s->height >> 1);
2070 ptr_cb = ebuf + 18 * wrap_y;
2071 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
2073 8, mb_block_height, mb_x * 8, mb_y * 8,
2074 s->width >> 1, s->height >> 1);
2075 ptr_cr = ebuf + 18 * wrap_y + 8;
2079 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2080 int progressive_score, interlaced_score;
2082 s->interlaced_dct = 0;
2083 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
2084 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2085 NULL, wrap_y, 8) - 400;
2087 if (progressive_score > 0) {
2088 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
2089 NULL, wrap_y * 2, 8) +
2090 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
2091 NULL, wrap_y * 2, 8);
2092 if (progressive_score > interlaced_score) {
2093 s->interlaced_dct = 1;
2095 dct_offset = wrap_y;
2097 if (s->chroma_format == CHROMA_422)
2103 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2104 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2105 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2106 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2108 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2112 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2113 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2114 if (!s->chroma_y_shift) { /* 422 */
2115 s->pdsp.get_pixels(s->block[6],
2116 ptr_cb + (dct_offset >> 1), wrap_c);
2117 s->pdsp.get_pixels(s->block[7],
2118 ptr_cr + (dct_offset >> 1), wrap_c);
2122 op_pixels_func (*op_pix)[4];
2123 qpel_mc_func (*op_qpix)[16];
2124 uint8_t *dest_y, *dest_cb, *dest_cr;
2126 dest_y = s->dest[0];
2127 dest_cb = s->dest[1];
2128 dest_cr = s->dest[2];
2130 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2131 op_pix = s->hdsp.put_pixels_tab;
2132 op_qpix = s->qdsp.put_qpel_pixels_tab;
2134 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2135 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
2138 if (s->mv_dir & MV_DIR_FORWARD) {
2139 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0,
2140 s->last_picture.f->data,
2142 op_pix = s->hdsp.avg_pixels_tab;
2143 op_qpix = s->qdsp.avg_qpel_pixels_tab;
2145 if (s->mv_dir & MV_DIR_BACKWARD) {
2146 ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1,
2147 s->next_picture.f->data,
2151 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
2152 int progressive_score, interlaced_score;
2154 s->interlaced_dct = 0;
2155 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2156 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2160 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2161 progressive_score -= 400;
2163 if (progressive_score > 0) {
2164 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2166 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2170 if (progressive_score > interlaced_score) {
2171 s->interlaced_dct = 1;
2173 dct_offset = wrap_y;
2175 if (s->chroma_format == CHROMA_422)
2181 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2182 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2183 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2184 dest_y + dct_offset, wrap_y);
2185 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2186 dest_y + dct_offset + 8, wrap_y);
2188 if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
2192 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2193 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2194 if (!s->chroma_y_shift) { /* 422 */
2195 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2196 dest_cb + (dct_offset >> 1), wrap_c);
2197 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2198 dest_cr + (dct_offset >> 1), wrap_c);
2201 /* pre quantization */
2202 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2203 2 * s->qscale * s->qscale) {
2205 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2207 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2209 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2210 wrap_y, 8) < 20 * s->qscale)
2212 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2213 wrap_y, 8) < 20 * s->qscale)
2215 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2217 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2219 if (!s->chroma_y_shift) { /* 422 */
2220 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2221 dest_cb + (dct_offset >> 1),
2222 wrap_c, 8) < 20 * s->qscale)
2224 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2225 dest_cr + (dct_offset >> 1),
2226 wrap_c, 8) < 20 * s->qscale)
2232 if (s->quantizer_noise_shaping) {
2234 get_visual_weight(weight[0], ptr_y , wrap_y);
2236 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2238 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2240 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2242 get_visual_weight(weight[4], ptr_cb , wrap_c);
2244 get_visual_weight(weight[5], ptr_cr , wrap_c);
2245 if (!s->chroma_y_shift) { /* 422 */
2247 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2250 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2253 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2256 /* DCT & quantize */
2257 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2259 for (i = 0; i < mb_block_count; i++) {
2262 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2263 // FIXME we could decide to change to quantizer instead of
2265 // JS: I don't think that would be a good idea it could lower
2266 // quality instead of improve it. Just INTRADC clipping
2267 // deserves changes in quantizer
2269 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2271 s->block_last_index[i] = -1;
2273 if (s->quantizer_noise_shaping) {
2274 for (i = 0; i < mb_block_count; i++) {
2276 s->block_last_index[i] =
2277 dct_quantize_refine(s, s->block[i], weight[i],
2278 orig[i], i, s->qscale);
2283 if (s->luma_elim_threshold && !s->mb_intra)
2284 for (i = 0; i < 4; i++)
2285 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2286 if (s->chroma_elim_threshold && !s->mb_intra)
2287 for (i = 4; i < mb_block_count; i++)
2288 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2290 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2291 for (i = 0; i < mb_block_count; i++) {
2292 if (s->block_last_index[i] == -1)
2293 s->coded_score[i] = INT_MAX / 256;
2298 if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
2299 s->block_last_index[4] =
2300 s->block_last_index[5] = 0;
2302 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2305 // non c quantize code returns incorrect block_last_index FIXME
2306 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2307 for (i = 0; i < mb_block_count; i++) {
2309 if (s->block_last_index[i] > 0) {
2310 for (j = 63; j > 0; j--) {
2311 if (s->block[i][s->intra_scantable.permutated[j]])
2314 s->block_last_index[i] = j;
2319 /* huffman encode */
2320 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2321 case AV_CODEC_ID_MPEG1VIDEO:
2322 case AV_CODEC_ID_MPEG2VIDEO:
2323 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2324 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2326 case AV_CODEC_ID_MPEG4:
2327 if (CONFIG_MPEG4_ENCODER)
2328 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2330 case AV_CODEC_ID_MSMPEG4V2:
2331 case AV_CODEC_ID_MSMPEG4V3:
2332 case AV_CODEC_ID_WMV1:
2333 if (CONFIG_MSMPEG4_ENCODER)
2334 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2336 case AV_CODEC_ID_WMV2:
2337 if (CONFIG_WMV2_ENCODER)
2338 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2340 case AV_CODEC_ID_H261:
2341 if (CONFIG_H261_ENCODER)
2342 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2344 case AV_CODEC_ID_H263:
2345 case AV_CODEC_ID_H263P:
2346 case AV_CODEC_ID_FLV1:
2347 case AV_CODEC_ID_RV10:
2348 case AV_CODEC_ID_RV20:
2349 if (CONFIG_H263_ENCODER)
2350 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2352 case AV_CODEC_ID_MJPEG:
2353 if (CONFIG_MJPEG_ENCODER)
2354 ff_mjpeg_encode_mb(s, s->block);
2361 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2363 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2364 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2367 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2370 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2373 d->mb_skip_run= s->mb_skip_run;
2375 d->last_dc[i] = s->last_dc[i];
2378 d->mv_bits= s->mv_bits;
2379 d->i_tex_bits= s->i_tex_bits;
2380 d->p_tex_bits= s->p_tex_bits;
2381 d->i_count= s->i_count;
2382 d->f_count= s->f_count;
2383 d->b_count= s->b_count;
2384 d->skip_count= s->skip_count;
2385 d->misc_bits= s->misc_bits;
2389 d->qscale= s->qscale;
2390 d->dquant= s->dquant;
2392 d->esc3_level_length= s->esc3_level_length;
2395 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2398 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2399 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2402 d->mb_skip_run= s->mb_skip_run;
2404 d->last_dc[i] = s->last_dc[i];
2407 d->mv_bits= s->mv_bits;
2408 d->i_tex_bits= s->i_tex_bits;
2409 d->p_tex_bits= s->p_tex_bits;
2410 d->i_count= s->i_count;
2411 d->f_count= s->f_count;
2412 d->b_count= s->b_count;
2413 d->skip_count= s->skip_count;
2414 d->misc_bits= s->misc_bits;
2416 d->mb_intra= s->mb_intra;
2417 d->mb_skipped= s->mb_skipped;
2418 d->mv_type= s->mv_type;
2419 d->mv_dir= s->mv_dir;
2421 if(s->data_partitioning){
2423 d->tex_pb= s->tex_pb;
2427 d->block_last_index[i]= s->block_last_index[i];
2428 d->interlaced_dct= s->interlaced_dct;
2429 d->qscale= s->qscale;
2431 d->esc3_level_length= s->esc3_level_length;
2434 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2435 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2436 int *dmin, int *next_block, int motion_x, int motion_y)
2439 uint8_t *dest_backup[3];
2441 copy_context_before_encode(s, backup, type);
2443 s->block= s->blocks[*next_block];
2444 s->pb= pb[*next_block];
2445 if(s->data_partitioning){
2446 s->pb2 = pb2 [*next_block];
2447 s->tex_pb= tex_pb[*next_block];
2451 memcpy(dest_backup, s->dest, sizeof(s->dest));
2452 s->dest[0] = s->sc.rd_scratchpad;
2453 s->dest[1] = s->sc.rd_scratchpad + 16*s->linesize;
2454 s->dest[2] = s->sc.rd_scratchpad + 16*s->linesize + 8;
2455 assert(s->linesize >= 32); //FIXME
2458 encode_mb(s, motion_x, motion_y);
2460 score= put_bits_count(&s->pb);
2461 if(s->data_partitioning){
2462 score+= put_bits_count(&s->pb2);
2463 score+= put_bits_count(&s->tex_pb);
2466 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2467 ff_mpv_decode_mb(s, s->block);
2469 score *= s->lambda2;
2470 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2474 memcpy(s->dest, dest_backup, sizeof(s->dest));
2481 copy_context_after_encode(best, s, type);
2485 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2486 uint32_t *sq = ff_square_tab + 256;
2491 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2492 else if(w==8 && h==8)
2493 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2497 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2506 static int sse_mb(MpegEncContext *s){
2510 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2511 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2514 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2515 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) +
2516 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) +
2517 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);
2519 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) +
2520 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) +
2521 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);
2524 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)
2525 +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)
2526 +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);
2529 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2530 MpegEncContext *s= *(void**)arg;
2534 s->me.dia_size= s->avctx->pre_dia_size;
2535 s->first_slice_line=1;
2536 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2537 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2538 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2540 s->first_slice_line=0;
2548 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2549 MpegEncContext *s= *(void**)arg;
2551 s->me.dia_size= s->avctx->dia_size;
2552 s->first_slice_line=1;
2553 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2554 s->mb_x=0; //for block init below
2555 ff_init_block_index(s);
2556 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2557 s->block_index[0]+=2;
2558 s->block_index[1]+=2;
2559 s->block_index[2]+=2;
2560 s->block_index[3]+=2;
2562 /* compute motion vector & mb_type and store in context */
2563 if(s->pict_type==AV_PICTURE_TYPE_B)
2564 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2566 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2568 s->first_slice_line=0;
2573 static int mb_var_thread(AVCodecContext *c, void *arg){
2574 MpegEncContext *s= *(void**)arg;
2577 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2578 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2581 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2583 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2585 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2586 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2588 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2589 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2590 s->me.mb_var_sum_temp += varc;
2596 static void write_slice_end(MpegEncContext *s){
2597 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2598 if(s->partitioned_frame){
2599 ff_mpeg4_merge_partitions(s);
2602 ff_mpeg4_stuffing(&s->pb);
2603 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2604 ff_mjpeg_encode_stuffing(&s->pb);
2607 avpriv_align_put_bits(&s->pb);
2608 flush_put_bits(&s->pb);
2610 if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2611 s->misc_bits+= get_bits_diff(s);
2614 static void write_mb_info(MpegEncContext *s)
2616 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2617 int offset = put_bits_count(&s->pb);
2618 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2619 int gobn = s->mb_y / s->gob_index;
2621 if (CONFIG_H263_ENCODER)
2622 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2623 bytestream_put_le32(&ptr, offset);
2624 bytestream_put_byte(&ptr, s->qscale);
2625 bytestream_put_byte(&ptr, gobn);
2626 bytestream_put_le16(&ptr, mba);
2627 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2628 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2629 /* 4MV not implemented */
2630 bytestream_put_byte(&ptr, 0); /* hmv2 */
2631 bytestream_put_byte(&ptr, 0); /* vmv2 */
2634 static void update_mb_info(MpegEncContext *s, int startcode)
2638 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2639 s->mb_info_size += 12;
2640 s->prev_mb_info = s->last_mb_info;
2643 s->prev_mb_info = put_bits_count(&s->pb)/8;
2644 /* This might have incremented mb_info_size above, and we return without
2645 * actually writing any info into that slot yet. But in that case,
2646 * this will be called again at the start of the after writing the
2647 * start code, actually writing the mb info. */
2651 s->last_mb_info = put_bits_count(&s->pb)/8;
2652 if (!s->mb_info_size)
2653 s->mb_info_size += 12;
2657 static int encode_thread(AVCodecContext *c, void *arg){
2658 MpegEncContext *s= *(void**)arg;
2659 int mb_x, mb_y, pdif = 0;
2660 int chr_h= 16>>s->chroma_y_shift;
2662 MpegEncContext best_s = { 0 }, backup_s;
2663 uint8_t bit_buf[2][MAX_MB_BYTES];
2664 uint8_t bit_buf2[2][MAX_MB_BYTES];
2665 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2666 PutBitContext pb[2], pb2[2], tex_pb[2];
2669 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2670 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2671 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2674 s->last_bits= put_bits_count(&s->pb);
2685 /* init last dc values */
2686 /* note: quant matrix value (8) is implied here */
2687 s->last_dc[i] = 128 << s->intra_dc_precision;
2689 s->current_picture.encoding_error[i] = 0;
2692 memset(s->last_mv, 0, sizeof(s->last_mv));
2696 switch(s->codec_id){
2697 case AV_CODEC_ID_H263:
2698 case AV_CODEC_ID_H263P:
2699 case AV_CODEC_ID_FLV1:
2700 if (CONFIG_H263_ENCODER)
2701 s->gob_index = H263_GOB_HEIGHT(s->height);
2703 case AV_CODEC_ID_MPEG4:
2704 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2705 ff_mpeg4_init_partitions(s);
2711 s->first_slice_line = 1;
2712 s->ptr_lastgob = s->pb.buf;
2713 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2717 ff_set_qscale(s, s->qscale);
2718 ff_init_block_index(s);
2720 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2721 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2722 int mb_type= s->mb_type[xy];
2727 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2728 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2731 if(s->data_partitioning){
2732 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2733 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2734 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2740 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2741 ff_update_block_index(s);
2743 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2744 ff_h261_reorder_mb_index(s);
2745 xy= s->mb_y*s->mb_stride + s->mb_x;
2746 mb_type= s->mb_type[xy];
2749 /* write gob / video packet header */
2751 int current_packet_size, is_gob_start;
2753 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2755 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2757 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2759 switch(s->codec_id){
2760 case AV_CODEC_ID_H263:
2761 case AV_CODEC_ID_H263P:
2762 if(!s->h263_slice_structured)
2763 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2765 case AV_CODEC_ID_MPEG2VIDEO:
2766 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2767 case AV_CODEC_ID_MPEG1VIDEO:
2768 if(s->mb_skip_run) is_gob_start=0;
2773 if(s->start_mb_y != mb_y || mb_x!=0){
2776 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2777 ff_mpeg4_init_partitions(s);
2781 assert((put_bits_count(&s->pb)&7) == 0);
2782 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2784 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2785 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2786 int d = 100 / s->error_rate;
2788 current_packet_size=0;
2789 s->pb.buf_ptr= s->ptr_lastgob;
2790 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2794 #if FF_API_RTP_CALLBACK
2795 FF_DISABLE_DEPRECATION_WARNINGS
2796 if (s->avctx->rtp_callback){
2797 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2798 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2800 FF_ENABLE_DEPRECATION_WARNINGS
2802 update_mb_info(s, 1);
2804 switch(s->codec_id){
2805 case AV_CODEC_ID_MPEG4:
2806 if (CONFIG_MPEG4_ENCODER) {
2807 ff_mpeg4_encode_video_packet_header(s);
2808 ff_mpeg4_clean_buffers(s);
2811 case AV_CODEC_ID_MPEG1VIDEO:
2812 case AV_CODEC_ID_MPEG2VIDEO:
2813 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2814 ff_mpeg1_encode_slice_header(s);
2815 ff_mpeg1_clean_buffers(s);
2818 case AV_CODEC_ID_H263:
2819 case AV_CODEC_ID_H263P:
2820 if (CONFIG_H263_ENCODER)
2821 ff_h263_encode_gob_header(s, mb_y);
2825 if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
2826 int bits= put_bits_count(&s->pb);
2827 s->misc_bits+= bits - s->last_bits;
2831 s->ptr_lastgob += current_packet_size;
2832 s->first_slice_line=1;
2833 s->resync_mb_x=mb_x;
2834 s->resync_mb_y=mb_y;
2838 if( (s->resync_mb_x == s->mb_x)
2839 && s->resync_mb_y+1 == s->mb_y){
2840 s->first_slice_line=0;
2844 s->dquant=0; //only for QP_RD
2846 update_mb_info(s, 0);
2848 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
2850 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2852 copy_context_before_encode(&backup_s, s, -1);
2854 best_s.data_partitioning= s->data_partitioning;
2855 best_s.partitioned_frame= s->partitioned_frame;
2856 if(s->data_partitioning){
2857 backup_s.pb2= s->pb2;
2858 backup_s.tex_pb= s->tex_pb;
2861 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2862 s->mv_dir = MV_DIR_FORWARD;
2863 s->mv_type = MV_TYPE_16X16;
2865 s->mv[0][0][0] = s->p_mv_table[xy][0];
2866 s->mv[0][0][1] = s->p_mv_table[xy][1];
2867 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2868 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2870 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2871 s->mv_dir = MV_DIR_FORWARD;
2872 s->mv_type = MV_TYPE_FIELD;
2875 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2876 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2877 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2879 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2880 &dmin, &next_block, 0, 0);
2882 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2883 s->mv_dir = MV_DIR_FORWARD;
2884 s->mv_type = MV_TYPE_16X16;
2888 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2889 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2891 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2892 s->mv_dir = MV_DIR_FORWARD;
2893 s->mv_type = MV_TYPE_8X8;
2896 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2897 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2899 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2900 &dmin, &next_block, 0, 0);
2902 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2903 s->mv_dir = MV_DIR_FORWARD;
2904 s->mv_type = MV_TYPE_16X16;
2906 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2907 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2908 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2909 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2911 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2912 s->mv_dir = MV_DIR_BACKWARD;
2913 s->mv_type = MV_TYPE_16X16;
2915 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2916 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2917 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2918 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2920 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2921 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2922 s->mv_type = MV_TYPE_16X16;
2924 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2925 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2926 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2927 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2928 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2929 &dmin, &next_block, 0, 0);
2931 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2932 s->mv_dir = MV_DIR_FORWARD;
2933 s->mv_type = MV_TYPE_FIELD;
2936 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2937 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2938 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2940 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2941 &dmin, &next_block, 0, 0);
2943 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2944 s->mv_dir = MV_DIR_BACKWARD;
2945 s->mv_type = MV_TYPE_FIELD;
2948 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2949 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2950 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2952 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2953 &dmin, &next_block, 0, 0);
2955 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2956 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2957 s->mv_type = MV_TYPE_FIELD;
2959 for(dir=0; dir<2; dir++){
2961 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2962 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2963 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2966 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2967 &dmin, &next_block, 0, 0);
2969 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2971 s->mv_type = MV_TYPE_16X16;
2975 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2976 &dmin, &next_block, 0, 0);
2977 if(s->h263_pred || s->h263_aic){
2979 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2981 ff_clean_intra_table_entries(s); //old mode?
2985 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2986 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2987 const int last_qp= backup_s.qscale;
2990 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2991 static const int dquant_tab[4]={-1,1,-2,2};
2993 assert(backup_s.dquant == 0);
2996 s->mv_dir= best_s.mv_dir;
2997 s->mv_type = MV_TYPE_16X16;
2998 s->mb_intra= best_s.mb_intra;
2999 s->mv[0][0][0] = best_s.mv[0][0][0];
3000 s->mv[0][0][1] = best_s.mv[0][0][1];
3001 s->mv[1][0][0] = best_s.mv[1][0][0];
3002 s->mv[1][0][1] = best_s.mv[1][0][1];
3004 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3005 for(; qpi<4; qpi++){
3006 int dquant= dquant_tab[qpi];
3007 qp= last_qp + dquant;
3008 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
3010 backup_s.dquant= dquant;
3011 if(s->mb_intra && s->dc_val[0]){
3013 dc[i]= s->dc_val[0][ s->block_index[i] ];
3014 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
3018 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3019 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
3020 if(best_s.qscale != qp){
3021 if(s->mb_intra && s->dc_val[0]){
3023 s->dc_val[0][ s->block_index[i] ]= dc[i];
3024 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
3031 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3032 int mx= s->b_direct_mv_table[xy][0];
3033 int my= s->b_direct_mv_table[xy][1];
3035 backup_s.dquant = 0;
3036 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3038 ff_mpeg4_set_direct_mv(s, mx, my);
3039 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3040 &dmin, &next_block, mx, my);
3042 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3043 backup_s.dquant = 0;
3044 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3046 ff_mpeg4_set_direct_mv(s, 0, 0);
3047 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3048 &dmin, &next_block, 0, 0);
3050 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3053 coded |= s->block_last_index[i];
3056 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3057 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3058 mx=my=0; //FIXME find the one we actually used
3059 ff_mpeg4_set_direct_mv(s, mx, my);
3060 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3068 s->mv_dir= best_s.mv_dir;
3069 s->mv_type = best_s.mv_type;
3071 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3072 s->mv[0][0][1] = best_s.mv[0][0][1];
3073 s->mv[1][0][0] = best_s.mv[1][0][0];
3074 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3077 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3078 &dmin, &next_block, mx, my);
3083 s->current_picture.qscale_table[xy] = best_s.qscale;
3085 copy_context_after_encode(s, &best_s, -1);
3087 pb_bits_count= put_bits_count(&s->pb);
3088 flush_put_bits(&s->pb);
3089 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3092 if(s->data_partitioning){
3093 pb2_bits_count= put_bits_count(&s->pb2);
3094 flush_put_bits(&s->pb2);
3095 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3096 s->pb2= backup_s.pb2;
3098 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3099 flush_put_bits(&s->tex_pb);
3100 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3101 s->tex_pb= backup_s.tex_pb;
3103 s->last_bits= put_bits_count(&s->pb);
3105 if (CONFIG_H263_ENCODER &&
3106 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3107 ff_h263_update_motion_val(s);
3109 if(next_block==0){ //FIXME 16 vs linesize16
3110 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->sc.rd_scratchpad , s->linesize ,16);
3111 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->sc.rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3112 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->sc.rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3115 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3116 ff_mpv_decode_mb(s, s->block);
3118 int motion_x = 0, motion_y = 0;
3119 s->mv_type=MV_TYPE_16X16;
3120 // only one MB-Type possible
3123 case CANDIDATE_MB_TYPE_INTRA:
3126 motion_x= s->mv[0][0][0] = 0;
3127 motion_y= s->mv[0][0][1] = 0;
3129 case CANDIDATE_MB_TYPE_INTER:
3130 s->mv_dir = MV_DIR_FORWARD;
3132 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3133 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3135 case CANDIDATE_MB_TYPE_INTER_I:
3136 s->mv_dir = MV_DIR_FORWARD;
3137 s->mv_type = MV_TYPE_FIELD;
3140 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3141 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3142 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3145 case CANDIDATE_MB_TYPE_INTER4V:
3146 s->mv_dir = MV_DIR_FORWARD;
3147 s->mv_type = MV_TYPE_8X8;
3150 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3151 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3154 case CANDIDATE_MB_TYPE_DIRECT:
3155 if (CONFIG_MPEG4_ENCODER) {
3156 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3158 motion_x=s->b_direct_mv_table[xy][0];
3159 motion_y=s->b_direct_mv_table[xy][1];
3160 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3163 case CANDIDATE_MB_TYPE_DIRECT0:
3164 if (CONFIG_MPEG4_ENCODER) {
3165 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3167 ff_mpeg4_set_direct_mv(s, 0, 0);
3170 case CANDIDATE_MB_TYPE_BIDIR:
3171 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3173 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3174 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3175 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3176 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3178 case CANDIDATE_MB_TYPE_BACKWARD:
3179 s->mv_dir = MV_DIR_BACKWARD;
3181 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3182 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3184 case CANDIDATE_MB_TYPE_FORWARD:
3185 s->mv_dir = MV_DIR_FORWARD;
3187 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3188 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3190 case CANDIDATE_MB_TYPE_FORWARD_I:
3191 s->mv_dir = MV_DIR_FORWARD;
3192 s->mv_type = MV_TYPE_FIELD;
3195 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3196 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3197 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3200 case CANDIDATE_MB_TYPE_BACKWARD_I:
3201 s->mv_dir = MV_DIR_BACKWARD;
3202 s->mv_type = MV_TYPE_FIELD;
3205 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3206 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3207 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3210 case CANDIDATE_MB_TYPE_BIDIR_I:
3211 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3212 s->mv_type = MV_TYPE_FIELD;
3214 for(dir=0; dir<2; dir++){
3216 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3217 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3218 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3223 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3226 encode_mb(s, motion_x, motion_y);
3228 // RAL: Update last macroblock type
3229 s->last_mv_dir = s->mv_dir;
3231 if (CONFIG_H263_ENCODER &&
3232 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3233 ff_h263_update_motion_val(s);
3235 ff_mpv_decode_mb(s, s->block);
3238 /* clean the MV table in IPS frames for direct mode in B frames */
3239 if(s->mb_intra /* && I,P,S_TYPE */){
3240 s->p_mv_table[xy][0]=0;
3241 s->p_mv_table[xy][1]=0;
3244 if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
3248 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3249 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3251 s->current_picture.encoding_error[0] += sse(
3252 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3253 s->dest[0], w, h, s->linesize);
3254 s->current_picture.encoding_error[1] += sse(
3255 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3256 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3257 s->current_picture.encoding_error[2] += sse(
3258 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3259 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3262 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3263 ff_h263_loop_filter(s);
3265 ff_dlog(s->avctx, "MB %d %d bits\n",
3266 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3270 //not beautiful here but we must write it before flushing so it has to be here
3271 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3272 ff_msmpeg4_encode_ext_header(s);
3276 #if FF_API_RTP_CALLBACK
3277 FF_DISABLE_DEPRECATION_WARNINGS
3278 /* Send the last GOB if RTP */
3279 if (s->avctx->rtp_callback) {
3280 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3281 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3282 /* Call the RTP callback to send the last GOB */
3284 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3286 FF_ENABLE_DEPRECATION_WARNINGS
3292 #define MERGE(field) dst->field += src->field; src->field=0
3293 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3294 MERGE(me.scene_change_score);
3295 MERGE(me.mc_mb_var_sum_temp);
3296 MERGE(me.mb_var_sum_temp);
3299 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3302 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3303 MERGE(dct_count[1]);
3312 MERGE(er.error_count);
3313 MERGE(padding_bug_score);
3314 MERGE(current_picture.encoding_error[0]);
3315 MERGE(current_picture.encoding_error[1]);
3316 MERGE(current_picture.encoding_error[2]);
3318 if(dst->avctx->noise_reduction){
3319 for(i=0; i<64; i++){
3320 MERGE(dct_error_sum[0][i]);
3321 MERGE(dct_error_sum[1][i]);
3325 assert(put_bits_count(&src->pb) % 8 ==0);
3326 assert(put_bits_count(&dst->pb) % 8 ==0);
3327 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3328 flush_put_bits(&dst->pb);
3331 static int estimate_qp(MpegEncContext *s, int dry_run){
3332 if (s->next_lambda){
3333 s->current_picture_ptr->f->quality =
3334 s->current_picture.f->quality = s->next_lambda;
3335 if(!dry_run) s->next_lambda= 0;
3336 } else if (!s->fixed_qscale) {
3337 s->current_picture_ptr->f->quality =
3338 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3339 if (s->current_picture.f->quality < 0)
3343 if(s->adaptive_quant){
3344 switch(s->codec_id){
3345 case AV_CODEC_ID_MPEG4:
3346 if (CONFIG_MPEG4_ENCODER)
3347 ff_clean_mpeg4_qscales(s);
3349 case AV_CODEC_ID_H263:
3350 case AV_CODEC_ID_H263P:
3351 case AV_CODEC_ID_FLV1:
3352 if (CONFIG_H263_ENCODER)
3353 ff_clean_h263_qscales(s);
3356 ff_init_qscale_tab(s);
3359 s->lambda= s->lambda_table[0];
3362 s->lambda = s->current_picture.f->quality;
3367 /* must be called before writing the header */
3368 static void set_frame_distances(MpegEncContext * s){
3369 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3370 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3372 if(s->pict_type==AV_PICTURE_TYPE_B){
3373 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3374 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3376 s->pp_time= s->time - s->last_non_b_time;
3377 s->last_non_b_time= s->time;
3378 assert(s->picture_number==0 || s->pp_time > 0);
3382 static int encode_picture(MpegEncContext *s, int picture_number)
3386 int context_count = s->slice_context_count;
3388 s->picture_number = picture_number;
3390 /* Reset the average MB variance */
3391 s->me.mb_var_sum_temp =
3392 s->me.mc_mb_var_sum_temp = 0;
3394 /* we need to initialize some time vars before we can encode b-frames */
3395 // RAL: Condition added for MPEG1VIDEO
3396 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3397 set_frame_distances(s);
3398 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3399 ff_set_mpeg4_time(s);
3401 s->me.scene_change_score=0;
3403 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3405 if(s->pict_type==AV_PICTURE_TYPE_I){
3406 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3407 else s->no_rounding=0;
3408 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3409 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3410 s->no_rounding ^= 1;
3413 if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
3414 if (estimate_qp(s,1) < 0)
3416 ff_get_2pass_fcode(s);
3417 } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3418 if(s->pict_type==AV_PICTURE_TYPE_B)
3419 s->lambda= s->last_lambda_for[s->pict_type];
3421 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3425 s->mb_intra=0; //for the rate distortion & bit compare functions
3426 for(i=1; i<context_count; i++){
3427 ret = ff_update_duplicate_context(s->thread_context[i], s);
3435 /* Estimate motion for every MB */
3436 if(s->pict_type != AV_PICTURE_TYPE_I){
3437 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3438 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3439 if (s->pict_type != AV_PICTURE_TYPE_B) {
3440 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3441 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3445 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3446 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3448 for(i=0; i<s->mb_stride*s->mb_height; i++)
3449 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3451 if(!s->fixed_qscale){
3452 /* finding spatial complexity for I-frame rate control */
3453 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3456 for(i=1; i<context_count; i++){
3457 merge_context_after_me(s, s->thread_context[i]);
3459 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3460 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3463 if (s->me.scene_change_score > s->scenechange_threshold &&
3464 s->pict_type == AV_PICTURE_TYPE_P) {
3465 s->pict_type= AV_PICTURE_TYPE_I;
3466 for(i=0; i<s->mb_stride*s->mb_height; i++)
3467 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3468 ff_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3469 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3473 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3474 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3476 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3478 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3479 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3480 s->f_code= FFMAX3(s->f_code, a, b);
3483 ff_fix_long_p_mvs(s);
3484 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3485 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3489 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3490 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3495 if(s->pict_type==AV_PICTURE_TYPE_B){
3498 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3499 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3500 s->f_code = FFMAX(a, b);
3502 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3503 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3504 s->b_code = FFMAX(a, b);
3506 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3507 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3508 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3509 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3510 if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3512 for(dir=0; dir<2; dir++){
3515 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3516 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3517 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3518 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3526 if (estimate_qp(s, 0) < 0)
3529 if (s->qscale < 3 && s->max_qcoeff <= 128 &&
3530 s->pict_type == AV_PICTURE_TYPE_I &&
3531 !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
3532 s->qscale= 3; //reduce clipping problems
3534 if (s->out_format == FMT_MJPEG) {
3535 /* for mjpeg, we do include qscale in the matrix */
3537 int j = s->idsp.idct_permutation[i];
3539 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3541 s->y_dc_scale_table=
3542 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3543 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3544 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3545 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3549 //FIXME var duplication
3550 s->current_picture_ptr->f->key_frame =
3551 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3552 s->current_picture_ptr->f->pict_type =
3553 s->current_picture.f->pict_type = s->pict_type;
3555 if (s->current_picture.f->key_frame)
3556 s->picture_in_gop_number=0;
3558 s->last_bits= put_bits_count(&s->pb);
3559 switch(s->out_format) {
3561 if (CONFIG_MJPEG_ENCODER)
3562 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3566 if (CONFIG_H261_ENCODER)
3567 ff_h261_encode_picture_header(s, picture_number);
3570 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3571 ff_wmv2_encode_picture_header(s, picture_number);
3572 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3573 ff_msmpeg4_encode_picture_header(s, picture_number);
3574 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3575 ff_mpeg4_encode_picture_header(s, picture_number);
3576 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
3577 ret = ff_rv10_encode_picture_header(s, picture_number);
3581 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3582 ff_rv20_encode_picture_header(s, picture_number);
3583 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3584 ff_flv_encode_picture_header(s, picture_number);
3585 else if (CONFIG_H263_ENCODER)
3586 ff_h263_encode_picture_header(s, picture_number);
3589 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3590 ff_mpeg1_encode_picture_header(s, picture_number);
3595 bits= put_bits_count(&s->pb);
3596 s->header_bits= bits - s->last_bits;
3598 for(i=1; i<context_count; i++){
3599 update_duplicate_context_after_me(s->thread_context[i], s);
3601 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3602 for(i=1; i<context_count; i++){
3603 merge_context_after_encode(s, s->thread_context[i]);
3609 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3610 const int intra= s->mb_intra;
3613 s->dct_count[intra]++;
3615 for(i=0; i<64; i++){
3616 int level= block[i];
3620 s->dct_error_sum[intra][i] += level;
3621 level -= s->dct_offset[intra][i];
3622 if(level<0) level=0;
3624 s->dct_error_sum[intra][i] -= level;
3625 level += s->dct_offset[intra][i];
3626 if(level>0) level=0;
3633 static int dct_quantize_trellis_c(MpegEncContext *s,
3634 int16_t *block, int n,
3635 int qscale, int *overflow){
3637 const uint8_t *scantable= s->intra_scantable.scantable;
3638 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3640 unsigned int threshold1, threshold2;
3652 int coeff_count[64];
3653 int qmul, qadd, start_i, last_non_zero, i, dc;
3654 const int esc_length= s->ac_esc_length;
3656 uint8_t * last_length;
3657 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3659 s->fdsp.fdct(block);
3661 if(s->dct_error_sum)
3662 s->denoise_dct(s, block);
3664 qadd= ((qscale-1)|1)*8;
3675 /* For AIC we skip quant/dequant of INTRADC */
3680 /* note: block[0] is assumed to be positive */
3681 block[0] = (block[0] + (q >> 1)) / q;
3684 qmat = s->q_intra_matrix[qscale];
3685 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3686 bias= 1<<(QMAT_SHIFT-1);
3687 length = s->intra_ac_vlc_length;
3688 last_length= s->intra_ac_vlc_last_length;
3692 qmat = s->q_inter_matrix[qscale];
3693 length = s->inter_ac_vlc_length;
3694 last_length= s->inter_ac_vlc_last_length;
3698 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3699 threshold2= (threshold1<<1);
3701 for(i=63; i>=start_i; i--) {
3702 const int j = scantable[i];
3703 int level = block[j] * qmat[j];
3705 if(((unsigned)(level+threshold1))>threshold2){
3711 for(i=start_i; i<=last_non_zero; i++) {
3712 const int j = scantable[i];
3713 int level = block[j] * qmat[j];
3715 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3716 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3717 if(((unsigned)(level+threshold1))>threshold2){
3719 level= (bias + level)>>QMAT_SHIFT;
3721 coeff[1][i]= level-1;
3722 // coeff[2][k]= level-2;
3724 level= (bias - level)>>QMAT_SHIFT;
3725 coeff[0][i]= -level;
3726 coeff[1][i]= -level+1;
3727 // coeff[2][k]= -level+2;
3729 coeff_count[i]= FFMIN(level, 2);
3730 assert(coeff_count[i]);
3733 coeff[0][i]= (level>>31)|1;
3738 *overflow= s->max_qcoeff < max; //overflow might have happened
3740 if(last_non_zero < start_i){
3741 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3742 return last_non_zero;
3745 score_tab[start_i]= 0;
3746 survivor[0]= start_i;
3749 for(i=start_i; i<=last_non_zero; i++){
3750 int level_index, j, zero_distortion;
3751 int dct_coeff= FFABS(block[ scantable[i] ]);
3752 int best_score=256*256*256*120;
3754 if (s->fdsp.fdct == ff_fdct_ifast)
3755 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3756 zero_distortion= dct_coeff*dct_coeff;
3758 for(level_index=0; level_index < coeff_count[i]; level_index++){
3760 int level= coeff[level_index][i];
3761 const int alevel= FFABS(level);
3766 if(s->out_format == FMT_H263){
3767 unquant_coeff= alevel*qmul + qadd;
3769 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3771 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3772 unquant_coeff = (unquant_coeff - 1) | 1;
3774 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3775 unquant_coeff = (unquant_coeff - 1) | 1;
3780 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3782 if((level&(~127)) == 0){
3783 for(j=survivor_count-1; j>=0; j--){
3784 int run= i - survivor[j];
3785 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3786 score += score_tab[i-run];
3788 if(score < best_score){
3791 level_tab[i+1]= level-64;
3795 if(s->out_format == FMT_H263){
3796 for(j=survivor_count-1; j>=0; j--){
3797 int run= i - survivor[j];
3798 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3799 score += score_tab[i-run];
3800 if(score < last_score){
3803 last_level= level-64;
3809 distortion += esc_length*lambda;
3810 for(j=survivor_count-1; j>=0; j--){
3811 int run= i - survivor[j];
3812 int score= distortion + 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 + score_tab[i-run];
3825 if(score < last_score){
3828 last_level= level-64;
3836 score_tab[i+1]= best_score;
3838 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3839 if(last_non_zero <= 27){
3840 for(; survivor_count; survivor_count--){
3841 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3845 for(; survivor_count; survivor_count--){
3846 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3851 survivor[ survivor_count++ ]= i+1;
3854 if(s->out_format != FMT_H263){
3855 last_score= 256*256*256*120;
3856 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3857 int score= score_tab[i];
3858 if(i) score += lambda*2; //FIXME exacter?
3860 if(score < last_score){
3863 last_level= level_tab[i];
3864 last_run= run_tab[i];
3869 s->coded_score[n] = last_score;
3871 dc= FFABS(block[0]);
3872 last_non_zero= last_i - 1;
3873 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3875 if(last_non_zero < start_i)
3876 return last_non_zero;
3878 if(last_non_zero == 0 && start_i == 0){
3880 int best_score= dc * dc;
3882 for(i=0; i<coeff_count[0]; i++){
3883 int level= coeff[i][0];
3884 int alevel= FFABS(level);
3885 int unquant_coeff, score, distortion;
3887 if(s->out_format == FMT_H263){
3888 unquant_coeff= (alevel*qmul + qadd)>>3;
3890 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3891 unquant_coeff = (unquant_coeff - 1) | 1;
3893 unquant_coeff = (unquant_coeff + 4) >> 3;
3894 unquant_coeff<<= 3 + 3;
3896 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3898 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3899 else score= distortion + esc_length*lambda;
3901 if(score < best_score){
3903 best_level= level - 64;
3906 block[0]= best_level;
3907 s->coded_score[n] = best_score - dc*dc;
3908 if(best_level == 0) return -1;
3909 else return last_non_zero;
3915 block[ perm_scantable[last_non_zero] ]= last_level;
3918 for(; i>start_i; i -= run_tab[i] + 1){
3919 block[ perm_scantable[i-1] ]= level_tab[i];
3922 return last_non_zero;
3925 //#define REFINE_STATS 1
3926 static int16_t basis[64][64];
3928 static void build_basis(uint8_t *perm){
3935 double s= 0.25*(1<<BASIS_SHIFT);
3937 int perm_index= perm[index];
3938 if(i==0) s*= sqrt(0.5);
3939 if(j==0) s*= sqrt(0.5);
3940 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)));
3947 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3948 int16_t *block, int16_t *weight, int16_t *orig,
3951 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3952 const uint8_t *scantable= s->intra_scantable.scantable;
3953 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3954 // unsigned int threshold1, threshold2;
3959 int qmul, qadd, start_i, last_non_zero, i, dc;
3961 uint8_t * last_length;
3963 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3966 static int after_last=0;
3967 static int to_zero=0;
3968 static int from_zero=0;
3971 static int messed_sign=0;
3974 if(basis[0][0] == 0)
3975 build_basis(s->idsp.idct_permutation);
3986 /* For AIC we skip quant/dequant of INTRADC */
3990 q <<= RECON_SHIFT-3;
3991 /* note: block[0] is assumed to be positive */
3993 // block[0] = (block[0] + (q >> 1)) / q;
3995 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3996 // bias= 1<<(QMAT_SHIFT-1);
3997 length = s->intra_ac_vlc_length;
3998 last_length= s->intra_ac_vlc_last_length;
4002 length = s->inter_ac_vlc_length;
4003 last_length= s->inter_ac_vlc_last_length;
4005 last_non_zero = s->block_last_index[n];
4010 dc += (1<<(RECON_SHIFT-1));
4011 for(i=0; i<64; i++){
4012 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
4015 STOP_TIMER("memset rem[]")}
4018 for(i=0; i<64; i++){
4023 w= FFABS(weight[i]) + qns*one;
4024 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4027 // w=weight[i] = (63*qns + (w/2)) / w;
4033 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4039 for(i=start_i; i<=last_non_zero; i++){
4040 int j= perm_scantable[i];
4041 const int level= block[j];
4045 if(level<0) coeff= qmul*level - qadd;
4046 else coeff= qmul*level + qadd;
4047 run_tab[rle_index++]=run;
4050 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4056 if(last_non_zero>0){
4057 STOP_TIMER("init rem[]")
4064 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4067 int run2, best_unquant_change=0, analyze_gradient;
4071 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4073 if(analyze_gradient){
4077 for(i=0; i<64; i++){
4080 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4083 STOP_TIMER("rem*w*w")}
4093 const int level= block[0];
4094 int change, old_coeff;
4096 assert(s->mb_intra);
4100 for(change=-1; change<=1; change+=2){
4101 int new_level= level + change;
4102 int score, new_coeff;
4104 new_coeff= q*new_level;
4105 if(new_coeff >= 2048 || new_coeff < 0)
4108 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4109 new_coeff - old_coeff);
4110 if(score<best_score){
4113 best_change= change;
4114 best_unquant_change= new_coeff - old_coeff;
4121 run2= run_tab[rle_index++];
4125 for(i=start_i; i<64; i++){
4126 int j= perm_scantable[i];
4127 const int level= block[j];
4128 int change, old_coeff;
4130 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4134 if(level<0) old_coeff= qmul*level - qadd;
4135 else old_coeff= qmul*level + qadd;
4136 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4140 assert(run2>=0 || i >= last_non_zero );
4143 for(change=-1; change<=1; change+=2){
4144 int new_level= level + change;
4145 int score, new_coeff, unquant_change;
4148 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4152 if(new_level<0) new_coeff= qmul*new_level - qadd;
4153 else new_coeff= qmul*new_level + qadd;
4154 if(new_coeff >= 2048 || new_coeff <= -2048)
4156 //FIXME check for overflow
4159 if(level < 63 && level > -63){
4160 if(i < last_non_zero)
4161 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4162 - length[UNI_AC_ENC_INDEX(run, level+64)];
4164 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4165 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4168 assert(FFABS(new_level)==1);
4170 if(analyze_gradient){
4171 int g= d1[ scantable[i] ];
4172 if(g && (g^new_level) >= 0)
4176 if(i < last_non_zero){
4177 int next_i= i + run2 + 1;
4178 int next_level= block[ perm_scantable[next_i] ] + 64;
4180 if(next_level&(~127))
4183 if(next_i < last_non_zero)
4184 score += length[UNI_AC_ENC_INDEX(run, 65)]
4185 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4186 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4188 score += length[UNI_AC_ENC_INDEX(run, 65)]
4189 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4190 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4192 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4194 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4195 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4201 assert(FFABS(level)==1);
4203 if(i < last_non_zero){
4204 int next_i= i + run2 + 1;
4205 int next_level= block[ perm_scantable[next_i] ] + 64;
4207 if(next_level&(~127))
4210 if(next_i < last_non_zero)
4211 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4212 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4213 - length[UNI_AC_ENC_INDEX(run, 65)];
4215 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4216 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4217 - length[UNI_AC_ENC_INDEX(run, 65)];
4219 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4221 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4222 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4229 unquant_change= new_coeff - old_coeff;
4230 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4232 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4234 if(score<best_score){
4237 best_change= change;
4238 best_unquant_change= unquant_change;
4242 prev_level= level + 64;
4243 if(prev_level&(~127))
4252 STOP_TIMER("iterative step")}
4256 int j= perm_scantable[ best_coeff ];
4258 block[j] += best_change;
4260 if(best_coeff > last_non_zero){
4261 last_non_zero= best_coeff;
4269 if(block[j] - best_change){
4270 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4282 for(; last_non_zero>=start_i; last_non_zero--){
4283 if(block[perm_scantable[last_non_zero]])
4289 if(256*256*256*64 % count == 0){
4290 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);
4295 for(i=start_i; i<=last_non_zero; i++){
4296 int j= perm_scantable[i];
4297 const int level= block[j];
4300 run_tab[rle_index++]=run;
4307 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4313 if(last_non_zero>0){
4314 STOP_TIMER("iterative search")
4319 return last_non_zero;
4323 * Permute an 8x8 block according to permuatation.
4324 * @param block the block which will be permuted according to
4325 * the given permutation vector
4326 * @param permutation the permutation vector
4327 * @param last the last non zero coefficient in scantable order, used to
4328 * speed the permutation up
4329 * @param scantable the used scantable, this is only used to speed the
4330 * permutation up, the block is not (inverse) permutated
4331 * to scantable order!
4333 static void block_permute(int16_t *block, uint8_t *permutation,
4334 const uint8_t *scantable, int last)
4341 //FIXME it is ok but not clean and might fail for some permutations
4342 // if (permutation[1] == 1)
4345 for (i = 0; i <= last; i++) {
4346 const int j = scantable[i];
4351 for (i = 0; i <= last; i++) {
4352 const int j = scantable[i];
4353 const int perm_j = permutation[j];
4354 block[perm_j] = temp[j];
4358 int ff_dct_quantize_c(MpegEncContext *s,
4359 int16_t *block, int n,
4360 int qscale, int *overflow)
4362 int i, j, level, last_non_zero, q, start_i;
4364 const uint8_t *scantable= s->intra_scantable.scantable;
4367 unsigned int threshold1, threshold2;
4369 s->fdsp.fdct(block);
4371 if(s->dct_error_sum)
4372 s->denoise_dct(s, block);
4382 /* For AIC we skip quant/dequant of INTRADC */
4385 /* note: block[0] is assumed to be positive */
4386 block[0] = (block[0] + (q >> 1)) / q;
4389 qmat = s->q_intra_matrix[qscale];
4390 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4394 qmat = s->q_inter_matrix[qscale];
4395 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4397 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4398 threshold2= (threshold1<<1);
4399 for(i=63;i>=start_i;i--) {
4401 level = block[j] * qmat[j];
4403 if(((unsigned)(level+threshold1))>threshold2){
4410 for(i=start_i; i<=last_non_zero; i++) {
4412 level = block[j] * qmat[j];
4414 // if( bias+level >= (1<<QMAT_SHIFT)
4415 // || bias-level >= (1<<QMAT_SHIFT)){
4416 if(((unsigned)(level+threshold1))>threshold2){
4418 level= (bias + level)>>QMAT_SHIFT;
4421 level= (bias - level)>>QMAT_SHIFT;
4429 *overflow= s->max_qcoeff < max; //overflow might have happened
4431 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4432 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4433 block_permute(block, s->idsp.idct_permutation,
4434 scantable, last_non_zero);
4436 return last_non_zero;
4439 #define OFFSET(x) offsetof(MpegEncContext, x)
4440 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4441 static const AVOption h263_options[] = {
4442 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4443 { "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},
4444 { "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 },
4449 static const AVClass h263_class = {
4450 .class_name = "H.263 encoder",
4451 .item_name = av_default_item_name,
4452 .option = h263_options,
4453 .version = LIBAVUTIL_VERSION_INT,
4456 AVCodec ff_h263_encoder = {
4458 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4459 .type = AVMEDIA_TYPE_VIDEO,
4460 .id = AV_CODEC_ID_H263,
4461 .priv_data_size = sizeof(MpegEncContext),
4462 .init = ff_mpv_encode_init,
4463 .encode2 = ff_mpv_encode_picture,
4464 .close = ff_mpv_encode_end,
4465 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4466 .priv_class = &h263_class,
4469 static const AVOption h263p_options[] = {
4470 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4471 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4472 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4473 { "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},
4477 static const AVClass h263p_class = {
4478 .class_name = "H.263p encoder",
4479 .item_name = av_default_item_name,
4480 .option = h263p_options,
4481 .version = LIBAVUTIL_VERSION_INT,
4484 AVCodec ff_h263p_encoder = {
4486 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4487 .type = AVMEDIA_TYPE_VIDEO,
4488 .id = AV_CODEC_ID_H263P,
4489 .priv_data_size = sizeof(MpegEncContext),
4490 .init = ff_mpv_encode_init,
4491 .encode2 = ff_mpv_encode_picture,
4492 .close = ff_mpv_encode_end,
4493 .capabilities = AV_CODEC_CAP_SLICE_THREADS,
4494 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4495 .priv_class = &h263p_class,
4498 static const AVClass msmpeg4v2_class = {
4499 .class_name = "msmpeg4v2 encoder",
4500 .item_name = av_default_item_name,
4501 .option = ff_mpv_generic_options,
4502 .version = LIBAVUTIL_VERSION_INT,
4505 AVCodec ff_msmpeg4v2_encoder = {
4506 .name = "msmpeg4v2",
4507 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4508 .type = AVMEDIA_TYPE_VIDEO,
4509 .id = AV_CODEC_ID_MSMPEG4V2,
4510 .priv_data_size = sizeof(MpegEncContext),
4511 .init = ff_mpv_encode_init,
4512 .encode2 = ff_mpv_encode_picture,
4513 .close = ff_mpv_encode_end,
4514 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4515 .priv_class = &msmpeg4v2_class,
4518 static const AVClass msmpeg4v3_class = {
4519 .class_name = "msmpeg4v3 encoder",
4520 .item_name = av_default_item_name,
4521 .option = ff_mpv_generic_options,
4522 .version = LIBAVUTIL_VERSION_INT,
4525 AVCodec ff_msmpeg4v3_encoder = {
4527 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4528 .type = AVMEDIA_TYPE_VIDEO,
4529 .id = AV_CODEC_ID_MSMPEG4V3,
4530 .priv_data_size = sizeof(MpegEncContext),
4531 .init = ff_mpv_encode_init,
4532 .encode2 = ff_mpv_encode_picture,
4533 .close = ff_mpv_encode_end,
4534 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4535 .priv_class = &msmpeg4v3_class,
4538 static const AVClass wmv1_class = {
4539 .class_name = "wmv1 encoder",
4540 .item_name = av_default_item_name,
4541 .option = ff_mpv_generic_options,
4542 .version = LIBAVUTIL_VERSION_INT,
4545 AVCodec ff_wmv1_encoder = {
4547 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4548 .type = AVMEDIA_TYPE_VIDEO,
4549 .id = AV_CODEC_ID_WMV1,
4550 .priv_data_size = sizeof(MpegEncContext),
4551 .init = ff_mpv_encode_init,
4552 .encode2 = ff_mpv_encode_picture,
4553 .close = ff_mpv_encode_end,
4554 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4555 .priv_class = &wmv1_class,