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"
45 #include "mjpegenc_common.h"
47 #include "mpegutils.h"
50 #include "pixblockdsp.h"
54 #include "aandcttab.h"
56 #include "mpeg4video.h"
58 #include "bytestream.h"
61 static int encode_picture(MpegEncContext *s, int picture_number);
62 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
63 static int sse_mb(MpegEncContext *s);
64 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
65 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
67 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
68 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
70 const AVOption ff_mpv_generic_options[] = {
75 void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64],
76 uint16_t (*qmat16)[2][64],
77 const uint16_t *quant_matrix,
78 int bias, int qmin, int qmax, int intra)
80 FDCTDSPContext *fdsp = &s->fdsp;
84 for (qscale = qmin; qscale <= qmax; qscale++) {
86 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
87 fdsp->fdct == ff_jpeg_fdct_islow_10 ||
88 fdsp->fdct == ff_faandct) {
89 for (i = 0; i < 64; i++) {
90 const int j = s->idsp.idct_permutation[i];
91 /* 16 <= qscale * quant_matrix[i] <= 7905
92 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
93 * 19952 <= x <= 249205026
94 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
95 * 3444240 >= (1 << 36) / (x) >= 275 */
97 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
98 (qscale * quant_matrix[j]));
100 } else if (fdsp->fdct == ff_fdct_ifast) {
101 for (i = 0; i < 64; i++) {
102 const int j = s->idsp.idct_permutation[i];
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 + 14)) /
110 (ff_aanscales[i] * qscale *
114 for (i = 0; i < 64; i++) {
115 const int j = s->idsp.idct_permutation[i];
116 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
117 * Assume x = qscale * quant_matrix[i]
119 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
120 * so 32768 >= (1 << 19) / (x) >= 67 */
121 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
122 (qscale * quant_matrix[j]));
123 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
124 // (qscale * quant_matrix[i]);
125 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
126 (qscale * quant_matrix[j]);
128 if (qmat16[qscale][0][i] == 0 ||
129 qmat16[qscale][0][i] == 128 * 256)
130 qmat16[qscale][0][i] = 128 * 256 - 1;
131 qmat16[qscale][1][i] =
132 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
133 qmat16[qscale][0][i]);
137 for (i = intra; i < 64; i++) {
139 if (fdsp->fdct == ff_fdct_ifast) {
140 max = (8191LL * ff_aanscales[i]) >> 14;
142 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
148 av_log(NULL, AV_LOG_INFO,
149 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
154 static inline void update_qscale(MpegEncContext *s)
156 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
157 (FF_LAMBDA_SHIFT + 7);
158 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
160 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
164 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
170 for (i = 0; i < 64; i++) {
171 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
178 * init s->current_picture.qscale_table from s->lambda_table
180 void ff_init_qscale_tab(MpegEncContext *s)
182 int8_t * const qscale_table = s->current_picture.qscale_table;
185 for (i = 0; i < s->mb_num; i++) {
186 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
187 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
188 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
193 static void update_duplicate_context_after_me(MpegEncContext *dst,
196 #define COPY(a) dst->a= src->a
198 COPY(current_picture);
204 COPY(picture_in_gop_number);
205 COPY(gop_picture_number);
206 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
207 COPY(progressive_frame); // FIXME don't set in encode_header
208 COPY(partitioned_frame); // FIXME don't set in encode_header
213 * Set the given MpegEncContext to defaults for encoding.
214 * the changed fields will not depend upon the prior state of the MpegEncContext.
216 static void MPV_encode_defaults(MpegEncContext *s)
219 ff_MPV_common_defaults(s);
221 for (i = -16; i < 16; i++) {
222 default_fcode_tab[i + MAX_MV] = 1;
224 s->me.mv_penalty = default_mv_penalty;
225 s->fcode_tab = default_fcode_tab;
227 s->input_picture_number = 0;
228 s->picture_in_gop_number = 0;
231 /* init video encoder */
232 av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
234 MpegEncContext *s = avctx->priv_data;
235 int i, ret, format_supported;
237 MPV_encode_defaults(s);
239 switch (avctx->codec_id) {
240 case AV_CODEC_ID_MPEG2VIDEO:
241 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
242 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
243 av_log(avctx, AV_LOG_ERROR,
244 "only YUV420 and YUV422 are supported\n");
248 case AV_CODEC_ID_MJPEG:
249 format_supported = 0;
250 /* JPEG color space */
251 if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
252 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
253 (avctx->color_range == AVCOL_RANGE_JPEG &&
254 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
255 avctx->pix_fmt == AV_PIX_FMT_YUV422P)))
256 format_supported = 1;
257 /* MPEG color space */
258 else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
259 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
260 avctx->pix_fmt == AV_PIX_FMT_YUV422P))
261 format_supported = 1;
263 if (!format_supported) {
264 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
269 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
270 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
275 switch (avctx->pix_fmt) {
276 case AV_PIX_FMT_YUVJ422P:
277 case AV_PIX_FMT_YUV422P:
278 s->chroma_format = CHROMA_422;
280 case AV_PIX_FMT_YUVJ420P:
281 case AV_PIX_FMT_YUV420P:
283 s->chroma_format = CHROMA_420;
287 s->bit_rate = avctx->bit_rate;
288 s->width = avctx->width;
289 s->height = avctx->height;
290 if (avctx->gop_size > 600 &&
291 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
292 av_log(avctx, AV_LOG_ERROR,
293 "Warning keyframe interval too large! reducing it ...\n");
294 avctx->gop_size = 600;
296 s->gop_size = avctx->gop_size;
298 s->flags = avctx->flags;
299 s->flags2 = avctx->flags2;
300 if (avctx->max_b_frames > MAX_B_FRAMES) {
301 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
302 "is %d.\n", MAX_B_FRAMES);
304 s->max_b_frames = avctx->max_b_frames;
305 s->codec_id = avctx->codec->id;
306 s->strict_std_compliance = avctx->strict_std_compliance;
307 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
308 s->mpeg_quant = avctx->mpeg_quant;
309 s->rtp_mode = !!avctx->rtp_payload_size;
310 s->intra_dc_precision = avctx->intra_dc_precision;
311 s->user_specified_pts = AV_NOPTS_VALUE;
313 if (s->gop_size <= 1) {
320 s->me_method = avctx->me_method;
323 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
325 s->adaptive_quant = (s->avctx->lumi_masking ||
326 s->avctx->dark_masking ||
327 s->avctx->temporal_cplx_masking ||
328 s->avctx->spatial_cplx_masking ||
329 s->avctx->p_masking ||
330 s->avctx->border_masking ||
331 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
334 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
336 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
337 av_log(avctx, AV_LOG_ERROR,
338 "a vbv buffer size is needed, "
339 "for encoding with a maximum bitrate\n");
343 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
344 av_log(avctx, AV_LOG_INFO,
345 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
348 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
349 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
353 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
354 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
358 if (avctx->rc_max_rate &&
359 avctx->rc_max_rate == avctx->bit_rate &&
360 avctx->rc_max_rate != avctx->rc_min_rate) {
361 av_log(avctx, AV_LOG_INFO,
362 "impossible bitrate constraints, this will fail\n");
365 if (avctx->rc_buffer_size &&
366 avctx->bit_rate * (int64_t)avctx->time_base.num >
367 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
368 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
372 if (!s->fixed_qscale &&
373 avctx->bit_rate * av_q2d(avctx->time_base) >
374 avctx->bit_rate_tolerance) {
375 av_log(avctx, AV_LOG_ERROR,
376 "bitrate tolerance too small for bitrate\n");
380 if (s->avctx->rc_max_rate &&
381 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
382 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
383 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
384 90000LL * (avctx->rc_buffer_size - 1) >
385 s->avctx->rc_max_rate * 0xFFFFLL) {
386 av_log(avctx, AV_LOG_INFO,
387 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
388 "specified vbv buffer is too large for the given bitrate!\n");
391 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
392 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
393 s->codec_id != AV_CODEC_ID_FLV1) {
394 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
398 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
399 av_log(avctx, AV_LOG_ERROR,
400 "OBMC is only supported with simple mb decision\n");
404 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
405 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
409 if (s->max_b_frames &&
410 s->codec_id != AV_CODEC_ID_MPEG4 &&
411 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
412 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
413 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
417 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
418 s->codec_id == AV_CODEC_ID_H263 ||
419 s->codec_id == AV_CODEC_ID_H263P) &&
420 (avctx->sample_aspect_ratio.num > 255 ||
421 avctx->sample_aspect_ratio.den > 255)) {
422 av_log(avctx, AV_LOG_ERROR,
423 "Invalid pixel aspect ratio %i/%i, limit is 255/255\n",
424 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
428 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
429 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
430 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
434 // FIXME mpeg2 uses that too
435 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
436 av_log(avctx, AV_LOG_ERROR,
437 "mpeg2 style quantization not supported by codec\n");
441 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
442 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
446 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
447 s->avctx->mb_decision != FF_MB_DECISION_RD) {
448 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
452 if (s->avctx->scenechange_threshold < 1000000000 &&
453 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
454 av_log(avctx, AV_LOG_ERROR,
455 "closed gop with scene change detection are not supported yet, "
456 "set threshold to 1000000000\n");
460 if (s->flags & CODEC_FLAG_LOW_DELAY) {
461 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
462 av_log(avctx, AV_LOG_ERROR,
463 "low delay forcing is only available for mpeg2\n");
466 if (s->max_b_frames != 0) {
467 av_log(avctx, AV_LOG_ERROR,
468 "b frames cannot be used with low delay\n");
473 if (s->q_scale_type == 1) {
474 if (avctx->qmax > 12) {
475 av_log(avctx, AV_LOG_ERROR,
476 "non linear quant only supports qmax <= 12 currently\n");
481 if (s->avctx->thread_count > 1 &&
482 s->codec_id != AV_CODEC_ID_MPEG4 &&
483 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
484 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
485 (s->codec_id != AV_CODEC_ID_H263P)) {
486 av_log(avctx, AV_LOG_ERROR,
487 "multi threaded encoding not supported by codec\n");
491 if (s->avctx->thread_count < 1) {
492 av_log(avctx, AV_LOG_ERROR,
493 "automatic thread number detection not supported by codec,"
498 if (s->avctx->thread_count > 1)
501 if (!avctx->time_base.den || !avctx->time_base.num) {
502 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
506 i = (INT_MAX / 2 + 128) >> 8;
507 if (avctx->mb_threshold >= i) {
508 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
513 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
514 av_log(avctx, AV_LOG_INFO,
515 "notice: b_frame_strategy only affects the first pass\n");
516 avctx->b_frame_strategy = 0;
519 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
521 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
522 avctx->time_base.den /= i;
523 avctx->time_base.num /= i;
527 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
528 s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG) {
529 // (a + x * 3 / 8) / x
530 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
531 s->inter_quant_bias = 0;
533 s->intra_quant_bias = 0;
535 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
538 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
539 s->intra_quant_bias = avctx->intra_quant_bias;
540 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
541 s->inter_quant_bias = avctx->inter_quant_bias;
543 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
544 s->avctx->time_base.den > (1 << 16) - 1) {
545 av_log(avctx, AV_LOG_ERROR,
546 "timebase %d/%d not supported by MPEG 4 standard, "
547 "the maximum admitted value for the timebase denominator "
548 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
552 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
554 switch (avctx->codec->id) {
555 case AV_CODEC_ID_MPEG1VIDEO:
556 s->out_format = FMT_MPEG1;
557 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
558 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
560 case AV_CODEC_ID_MPEG2VIDEO:
561 s->out_format = FMT_MPEG1;
562 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
563 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
566 case AV_CODEC_ID_MJPEG:
567 s->out_format = FMT_MJPEG;
568 s->intra_only = 1; /* force intra only for jpeg */
569 if (!CONFIG_MJPEG_ENCODER ||
570 ff_mjpeg_encode_init(s) < 0)
575 case AV_CODEC_ID_H261:
576 if (!CONFIG_H261_ENCODER)
578 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
579 av_log(avctx, AV_LOG_ERROR,
580 "The specified picture size of %dx%d is not valid for the "
581 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
582 s->width, s->height);
585 s->out_format = FMT_H261;
589 case AV_CODEC_ID_H263:
590 if (!CONFIG_H263_ENCODER)
592 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
593 s->width, s->height) == 8) {
594 av_log(avctx, AV_LOG_INFO,
595 "The specified picture size of %dx%d is not valid for "
596 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
597 "352x288, 704x576, and 1408x1152."
598 "Try H.263+.\n", s->width, s->height);
601 s->out_format = FMT_H263;
605 case AV_CODEC_ID_H263P:
606 s->out_format = FMT_H263;
609 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
610 s->modified_quant = s->h263_aic;
611 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
612 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
615 /* These are just to be sure */
619 case AV_CODEC_ID_FLV1:
620 s->out_format = FMT_H263;
621 s->h263_flv = 2; /* format = 1; 11-bit codes */
622 s->unrestricted_mv = 1;
623 s->rtp_mode = 0; /* don't allow GOB */
627 case AV_CODEC_ID_RV10:
628 s->out_format = FMT_H263;
632 case AV_CODEC_ID_RV20:
633 s->out_format = FMT_H263;
636 s->modified_quant = 1;
640 s->unrestricted_mv = 0;
642 case AV_CODEC_ID_MPEG4:
643 s->out_format = FMT_H263;
645 s->unrestricted_mv = 1;
646 s->low_delay = s->max_b_frames ? 0 : 1;
647 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
649 case AV_CODEC_ID_MSMPEG4V2:
650 s->out_format = FMT_H263;
652 s->unrestricted_mv = 1;
653 s->msmpeg4_version = 2;
657 case AV_CODEC_ID_MSMPEG4V3:
658 s->out_format = FMT_H263;
660 s->unrestricted_mv = 1;
661 s->msmpeg4_version = 3;
662 s->flipflop_rounding = 1;
666 case AV_CODEC_ID_WMV1:
667 s->out_format = FMT_H263;
669 s->unrestricted_mv = 1;
670 s->msmpeg4_version = 4;
671 s->flipflop_rounding = 1;
675 case AV_CODEC_ID_WMV2:
676 s->out_format = FMT_H263;
678 s->unrestricted_mv = 1;
679 s->msmpeg4_version = 5;
680 s->flipflop_rounding = 1;
688 avctx->has_b_frames = !s->low_delay;
692 s->progressive_frame =
693 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
694 CODEC_FLAG_INTERLACED_ME) ||
698 if (ff_MPV_common_init(s) < 0)
702 ff_MPV_encode_init_x86(s);
704 ff_fdctdsp_init(&s->fdsp, avctx);
705 ff_me_cmp_init(&s->mecc, avctx);
706 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
707 ff_pixblockdsp_init(&s->pdsp, avctx);
708 ff_qpeldsp_init(&s->qdsp);
710 s->avctx->coded_frame = s->current_picture.f;
712 if (s->msmpeg4_version) {
713 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
714 2 * 2 * (MAX_LEVEL + 1) *
715 (MAX_RUN + 1) * 2 * sizeof(int), fail);
717 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
719 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
720 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
721 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
722 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
723 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
724 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
725 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
726 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
728 if (s->avctx->noise_reduction) {
729 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
730 2 * 64 * sizeof(uint16_t), fail);
733 if (CONFIG_H263_ENCODER)
734 ff_h263dsp_init(&s->h263dsp);
735 if (!s->dct_quantize)
736 s->dct_quantize = ff_dct_quantize_c;
738 s->denoise_dct = denoise_dct_c;
739 s->fast_dct_quantize = s->dct_quantize;
741 s->dct_quantize = dct_quantize_trellis_c;
743 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
744 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
746 s->quant_precision = 5;
748 ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
749 ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
751 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
752 ff_h261_encode_init(s);
753 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
754 ff_h263_encode_init(s);
755 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
756 ff_msmpeg4_encode_init(s);
757 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
758 && s->out_format == FMT_MPEG1)
759 ff_mpeg1_encode_init(s);
762 for (i = 0; i < 64; i++) {
763 int j = s->idsp.idct_permutation[i];
764 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
766 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
767 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
768 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
770 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
773 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
774 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
776 if (s->avctx->intra_matrix)
777 s->intra_matrix[j] = s->avctx->intra_matrix[i];
778 if (s->avctx->inter_matrix)
779 s->inter_matrix[j] = s->avctx->inter_matrix[i];
782 /* precompute matrix */
783 /* for mjpeg, we do include qscale in the matrix */
784 if (s->out_format != FMT_MJPEG) {
785 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
786 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
788 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
789 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
793 if (ff_rate_control_init(s) < 0)
796 #if FF_API_ERROR_RATE
797 FF_DISABLE_DEPRECATION_WARNINGS
798 if (avctx->error_rate)
799 s->error_rate = avctx->error_rate;
800 FF_ENABLE_DEPRECATION_WARNINGS;
803 #if FF_API_NORMALIZE_AQP
804 FF_DISABLE_DEPRECATION_WARNINGS
805 if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
806 s->mpv_flags |= FF_MPV_FLAG_NAQ;
807 FF_ENABLE_DEPRECATION_WARNINGS;
811 FF_DISABLE_DEPRECATION_WARNINGS
812 if (avctx->flags & CODEC_FLAG_MV0)
813 s->mpv_flags |= FF_MPV_FLAG_MV0;
814 FF_ENABLE_DEPRECATION_WARNINGS
817 if (avctx->b_frame_strategy == 2) {
818 for (i = 0; i < s->max_b_frames + 2; i++) {
819 s->tmp_frames[i] = av_frame_alloc();
820 if (!s->tmp_frames[i])
821 return AVERROR(ENOMEM);
823 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
824 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
825 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
827 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
835 ff_MPV_encode_end(avctx);
836 return AVERROR_UNKNOWN;
839 av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
841 MpegEncContext *s = avctx->priv_data;
844 ff_rate_control_uninit(s);
846 ff_MPV_common_end(s);
847 if (CONFIG_MJPEG_ENCODER &&
848 s->out_format == FMT_MJPEG)
849 ff_mjpeg_encode_close(s);
851 av_freep(&avctx->extradata);
853 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
854 av_frame_free(&s->tmp_frames[i]);
856 ff_free_picture_tables(&s->new_picture);
857 ff_mpeg_unref_picture(s, &s->new_picture);
859 av_freep(&s->avctx->stats_out);
860 av_freep(&s->ac_stats);
862 av_freep(&s->q_intra_matrix);
863 av_freep(&s->q_inter_matrix);
864 av_freep(&s->q_intra_matrix16);
865 av_freep(&s->q_inter_matrix16);
866 av_freep(&s->input_picture);
867 av_freep(&s->reordered_input_picture);
868 av_freep(&s->dct_offset);
873 static int get_sae(uint8_t *src, int ref, int stride)
878 for (y = 0; y < 16; y++) {
879 for (x = 0; x < 16; x++) {
880 acc += FFABS(src[x + y * stride] - ref);
887 static int get_intra_count(MpegEncContext *s, uint8_t *src,
888 uint8_t *ref, int stride)
896 for (y = 0; y < h; y += 16) {
897 for (x = 0; x < w; x += 16) {
898 int offset = x + y * stride;
899 int sad = s->mecc.sad[0](NULL, src + offset, ref + offset,
901 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
902 int sae = get_sae(src + offset, mean, stride);
904 acc += sae + 500 < sad;
911 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
915 int i, display_picture_number = 0, ret;
916 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
917 (s->low_delay ? 0 : 1);
922 display_picture_number = s->input_picture_number++;
924 if (pts != AV_NOPTS_VALUE) {
925 if (s->user_specified_pts != AV_NOPTS_VALUE) {
927 int64_t last = s->user_specified_pts;
930 av_log(s->avctx, AV_LOG_ERROR,
931 "Error, Invalid timestamp=%"PRId64", "
932 "last=%"PRId64"\n", pts, s->user_specified_pts);
936 if (!s->low_delay && display_picture_number == 1)
937 s->dts_delta = time - last;
939 s->user_specified_pts = pts;
941 if (s->user_specified_pts != AV_NOPTS_VALUE) {
942 s->user_specified_pts =
943 pts = s->user_specified_pts + 1;
944 av_log(s->avctx, AV_LOG_INFO,
945 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
948 pts = display_picture_number;
954 if (!pic_arg->buf[0]);
956 if (pic_arg->linesize[0] != s->linesize)
958 if (pic_arg->linesize[1] != s->uvlinesize)
960 if (pic_arg->linesize[2] != s->uvlinesize)
963 av_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
964 pic_arg->linesize[1], s->linesize, s->uvlinesize);
967 i = ff_find_unused_picture(s, 1);
971 pic = &s->picture[i];
974 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
976 if (ff_alloc_picture(s, pic, 1) < 0) {
980 i = ff_find_unused_picture(s, 0);
984 pic = &s->picture[i];
987 if (ff_alloc_picture(s, pic, 0) < 0) {
991 if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
992 pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
993 pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
996 int h_chroma_shift, v_chroma_shift;
997 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1001 for (i = 0; i < 3; i++) {
1002 int src_stride = pic_arg->linesize[i];
1003 int dst_stride = i ? s->uvlinesize : s->linesize;
1004 int h_shift = i ? h_chroma_shift : 0;
1005 int v_shift = i ? v_chroma_shift : 0;
1006 int w = s->width >> h_shift;
1007 int h = s->height >> v_shift;
1008 uint8_t *src = pic_arg->data[i];
1009 uint8_t *dst = pic->f->data[i];
1011 if (!s->avctx->rc_buffer_size)
1012 dst += INPLACE_OFFSET;
1014 if (src_stride == dst_stride)
1015 memcpy(dst, src, src_stride * h);
1018 memcpy(dst, src, w);
1026 ret = av_frame_copy_props(pic->f, pic_arg);
1030 pic->f->display_picture_number = display_picture_number;
1031 pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
1034 /* shift buffer entries */
1035 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1036 s->input_picture[i - 1] = s->input_picture[i];
1038 s->input_picture[encoding_delay] = (Picture*) pic;
1043 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1047 int64_t score64 = 0;
1049 for (plane = 0; plane < 3; plane++) {
1050 const int stride = p->f->linesize[plane];
1051 const int bw = plane ? 1 : 2;
1052 for (y = 0; y < s->mb_height * bw; y++) {
1053 for (x = 0; x < s->mb_width * bw; x++) {
1054 int off = p->shared ? 0 : 16;
1055 uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1056 uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1057 int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1059 switch (s->avctx->frame_skip_exp) {
1060 case 0: score = FFMAX(score, v); break;
1061 case 1: score += FFABS(v); break;
1062 case 2: score += v * v; break;
1063 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1064 case 4: score64 += v * v * (int64_t)(v * v); break;
1073 if (score64 < s->avctx->frame_skip_threshold)
1075 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1080 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1082 AVPacket pkt = { 0 };
1083 int ret, got_output;
1085 av_init_packet(&pkt);
1086 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1091 av_free_packet(&pkt);
1095 static int estimate_best_b_count(MpegEncContext *s)
1097 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1098 AVCodecContext *c = avcodec_alloc_context3(NULL);
1099 const int scale = s->avctx->brd_scale;
1100 int i, j, out_size, p_lambda, b_lambda, lambda2;
1101 int64_t best_rd = INT64_MAX;
1102 int best_b_count = -1;
1104 assert(scale >= 0 && scale <= 3);
1107 //s->next_picture_ptr->quality;
1108 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1109 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1110 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1111 if (!b_lambda) // FIXME we should do this somewhere else
1112 b_lambda = p_lambda;
1113 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1116 c->width = s->width >> scale;
1117 c->height = s->height >> scale;
1118 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
1119 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1120 c->mb_decision = s->avctx->mb_decision;
1121 c->me_cmp = s->avctx->me_cmp;
1122 c->mb_cmp = s->avctx->mb_cmp;
1123 c->me_sub_cmp = s->avctx->me_sub_cmp;
1124 c->pix_fmt = AV_PIX_FMT_YUV420P;
1125 c->time_base = s->avctx->time_base;
1126 c->max_b_frames = s->max_b_frames;
1128 if (avcodec_open2(c, codec, NULL) < 0)
1131 for (i = 0; i < s->max_b_frames + 2; i++) {
1132 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1133 s->next_picture_ptr;
1135 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1136 pre_input = *pre_input_ptr;
1138 if (!pre_input.shared && i) {
1139 pre_input.f->data[0] += INPLACE_OFFSET;
1140 pre_input.f->data[1] += INPLACE_OFFSET;
1141 pre_input.f->data[2] += INPLACE_OFFSET;
1144 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
1145 s->tmp_frames[i]->linesize[0],
1146 pre_input.f->data[0],
1147 pre_input.f->linesize[0],
1148 c->width, c->height);
1149 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
1150 s->tmp_frames[i]->linesize[1],
1151 pre_input.f->data[1],
1152 pre_input.f->linesize[1],
1153 c->width >> 1, c->height >> 1);
1154 s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
1155 s->tmp_frames[i]->linesize[2],
1156 pre_input.f->data[2],
1157 pre_input.f->linesize[2],
1158 c->width >> 1, c->height >> 1);
1162 for (j = 0; j < s->max_b_frames + 1; j++) {
1165 if (!s->input_picture[j])
1168 c->error[0] = c->error[1] = c->error[2] = 0;
1170 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1171 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1173 out_size = encode_frame(c, s->tmp_frames[0]);
1175 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1177 for (i = 0; i < s->max_b_frames + 1; i++) {
1178 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1180 s->tmp_frames[i + 1]->pict_type = is_p ?
1181 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1182 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1184 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1186 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1189 /* get the delayed frames */
1191 out_size = encode_frame(c, NULL);
1192 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1195 rd += c->error[0] + c->error[1] + c->error[2];
1206 return best_b_count;
1209 static int select_input_picture(MpegEncContext *s)
1213 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1214 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1215 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1217 /* set next picture type & ordering */
1218 if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1219 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1220 s->next_picture_ptr == NULL || s->intra_only) {
1221 s->reordered_input_picture[0] = s->input_picture[0];
1222 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
1223 s->reordered_input_picture[0]->f->coded_picture_number =
1224 s->coded_picture_number++;
1228 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1229 if (s->picture_in_gop_number < s->gop_size &&
1230 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1231 // FIXME check that te gop check above is +-1 correct
1232 av_frame_unref(s->input_picture[0]->f);
1235 ff_vbv_update(s, 0);
1241 if (s->flags & CODEC_FLAG_PASS2) {
1242 for (i = 0; i < s->max_b_frames + 1; i++) {
1243 int pict_num = s->input_picture[0]->f->display_picture_number + i;
1245 if (pict_num >= s->rc_context.num_entries)
1247 if (!s->input_picture[i]) {
1248 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1252 s->input_picture[i]->f->pict_type =
1253 s->rc_context.entry[pict_num].new_pict_type;
1257 if (s->avctx->b_frame_strategy == 0) {
1258 b_frames = s->max_b_frames;
1259 while (b_frames && !s->input_picture[b_frames])
1261 } else if (s->avctx->b_frame_strategy == 1) {
1262 for (i = 1; i < s->max_b_frames + 1; i++) {
1263 if (s->input_picture[i] &&
1264 s->input_picture[i]->b_frame_score == 0) {
1265 s->input_picture[i]->b_frame_score =
1267 s->input_picture[i ]->f->data[0],
1268 s->input_picture[i - 1]->f->data[0],
1272 for (i = 0; i < s->max_b_frames + 1; i++) {
1273 if (s->input_picture[i] == NULL ||
1274 s->input_picture[i]->b_frame_score - 1 >
1275 s->mb_num / s->avctx->b_sensitivity)
1279 b_frames = FFMAX(0, i - 1);
1282 for (i = 0; i < b_frames + 1; i++) {
1283 s->input_picture[i]->b_frame_score = 0;
1285 } else if (s->avctx->b_frame_strategy == 2) {
1286 b_frames = estimate_best_b_count(s);
1288 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1294 for (i = b_frames - 1; i >= 0; i--) {
1295 int type = s->input_picture[i]->f->pict_type;
1296 if (type && type != AV_PICTURE_TYPE_B)
1299 if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1300 b_frames == s->max_b_frames) {
1301 av_log(s->avctx, AV_LOG_ERROR,
1302 "warning, too many b frames in a row\n");
1305 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1306 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1307 s->gop_size > s->picture_in_gop_number) {
1308 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1310 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1312 s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1316 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1317 s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1320 s->reordered_input_picture[0] = s->input_picture[b_frames];
1321 if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
1322 s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
1323 s->reordered_input_picture[0]->f->coded_picture_number =
1324 s->coded_picture_number++;
1325 for (i = 0; i < b_frames; i++) {
1326 s->reordered_input_picture[i + 1] = s->input_picture[i];
1327 s->reordered_input_picture[i + 1]->f->pict_type =
1329 s->reordered_input_picture[i + 1]->f->coded_picture_number =
1330 s->coded_picture_number++;
1335 if (s->reordered_input_picture[0]) {
1336 s->reordered_input_picture[0]->reference =
1337 s->reordered_input_picture[0]->f->pict_type !=
1338 AV_PICTURE_TYPE_B ? 3 : 0;
1340 ff_mpeg_unref_picture(s, &s->new_picture);
1341 if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1344 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1345 // input is a shared pix, so we can't modifiy it -> alloc a new
1346 // one & ensure that the shared one is reuseable
1349 int i = ff_find_unused_picture(s, 0);
1352 pic = &s->picture[i];
1354 pic->reference = s->reordered_input_picture[0]->reference;
1355 if (ff_alloc_picture(s, pic, 0) < 0) {
1359 ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1363 /* mark us unused / free shared pic */
1364 av_frame_unref(s->reordered_input_picture[0]->f);
1365 s->reordered_input_picture[0]->shared = 0;
1367 s->current_picture_ptr = pic;
1369 // input is not a shared pix -> reuse buffer for current_pix
1370 s->current_picture_ptr = s->reordered_input_picture[0];
1371 for (i = 0; i < 4; i++) {
1372 s->new_picture.f->data[i] += INPLACE_OFFSET;
1375 ff_mpeg_unref_picture(s, &s->current_picture);
1376 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1377 s->current_picture_ptr)) < 0)
1380 s->picture_number = s->new_picture.f->display_picture_number;
1382 ff_mpeg_unref_picture(s, &s->new_picture);
1387 static void frame_end(MpegEncContext *s)
1391 if (s->unrestricted_mv &&
1392 s->current_picture.reference &&
1394 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1395 int hshift = desc->log2_chroma_w;
1396 int vshift = desc->log2_chroma_h;
1397 s->mpvencdsp.draw_edges(s->current_picture.f->data[0], s->linesize,
1398 s->h_edge_pos, s->v_edge_pos,
1399 EDGE_WIDTH, EDGE_WIDTH,
1400 EDGE_TOP | EDGE_BOTTOM);
1401 s->mpvencdsp.draw_edges(s->current_picture.f->data[1], s->uvlinesize,
1402 s->h_edge_pos >> hshift,
1403 s->v_edge_pos >> vshift,
1404 EDGE_WIDTH >> hshift,
1405 EDGE_WIDTH >> vshift,
1406 EDGE_TOP | EDGE_BOTTOM);
1407 s->mpvencdsp.draw_edges(s->current_picture.f->data[2], s->uvlinesize,
1408 s->h_edge_pos >> hshift,
1409 s->v_edge_pos >> vshift,
1410 EDGE_WIDTH >> hshift,
1411 EDGE_WIDTH >> vshift,
1412 EDGE_TOP | EDGE_BOTTOM);
1417 s->last_pict_type = s->pict_type;
1418 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1419 if (s->pict_type!= AV_PICTURE_TYPE_B)
1420 s->last_non_b_pict_type = s->pict_type;
1423 /* release non-reference frames */
1424 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1425 if (!s->picture[i].reference)
1426 ff_mpeg_unref_picture(s, &s->picture[i]);
1430 s->avctx->coded_frame = s->current_picture_ptr->f;
1434 static void update_noise_reduction(MpegEncContext *s)
1438 for (intra = 0; intra < 2; intra++) {
1439 if (s->dct_count[intra] > (1 << 16)) {
1440 for (i = 0; i < 64; i++) {
1441 s->dct_error_sum[intra][i] >>= 1;
1443 s->dct_count[intra] >>= 1;
1446 for (i = 0; i < 64; i++) {
1447 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1448 s->dct_count[intra] +
1449 s->dct_error_sum[intra][i] / 2) /
1450 (s->dct_error_sum[intra][i] + 1);
1455 static int frame_start(MpegEncContext *s)
1459 /* mark & release old frames */
1460 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1461 s->last_picture_ptr != s->next_picture_ptr &&
1462 s->last_picture_ptr->f->buf[0]) {
1463 ff_mpeg_unref_picture(s, s->last_picture_ptr);
1466 s->current_picture_ptr->f->pict_type = s->pict_type;
1467 s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1469 ff_mpeg_unref_picture(s, &s->current_picture);
1470 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1471 s->current_picture_ptr)) < 0)
1474 if (s->pict_type != AV_PICTURE_TYPE_B) {
1475 s->last_picture_ptr = s->next_picture_ptr;
1477 s->next_picture_ptr = s->current_picture_ptr;
1480 if (s->last_picture_ptr) {
1481 ff_mpeg_unref_picture(s, &s->last_picture);
1482 if (s->last_picture_ptr->f->buf[0] &&
1483 (ret = ff_mpeg_ref_picture(s, &s->last_picture,
1484 s->last_picture_ptr)) < 0)
1487 if (s->next_picture_ptr) {
1488 ff_mpeg_unref_picture(s, &s->next_picture);
1489 if (s->next_picture_ptr->f->buf[0] &&
1490 (ret = ff_mpeg_ref_picture(s, &s->next_picture,
1491 s->next_picture_ptr)) < 0)
1495 if (s->picture_structure!= PICT_FRAME) {
1497 for (i = 0; i < 4; i++) {
1498 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1499 s->current_picture.f->data[i] +=
1500 s->current_picture.f->linesize[i];
1502 s->current_picture.f->linesize[i] *= 2;
1503 s->last_picture.f->linesize[i] *= 2;
1504 s->next_picture.f->linesize[i] *= 2;
1508 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1509 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1510 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1511 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1512 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1513 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1515 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1516 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1519 if (s->dct_error_sum) {
1520 assert(s->avctx->noise_reduction && s->encoding);
1521 update_noise_reduction(s);
1527 int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1528 const AVFrame *pic_arg, int *got_packet)
1530 MpegEncContext *s = avctx->priv_data;
1531 int i, stuffing_count, ret;
1532 int context_count = s->slice_context_count;
1534 s->picture_in_gop_number++;
1536 if (load_input_picture(s, pic_arg) < 0)
1539 if (select_input_picture(s) < 0) {
1544 if (s->new_picture.f->data[0]) {
1546 (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
1549 s->mb_info_ptr = av_packet_new_side_data(pkt,
1550 AV_PKT_DATA_H263_MB_INFO,
1551 s->mb_width*s->mb_height*12);
1552 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1555 for (i = 0; i < context_count; i++) {
1556 int start_y = s->thread_context[i]->start_mb_y;
1557 int end_y = s->thread_context[i]-> end_mb_y;
1558 int h = s->mb_height;
1559 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1560 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1562 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1565 s->pict_type = s->new_picture.f->pict_type;
1567 ret = frame_start(s);
1571 if (encode_picture(s, s->picture_number) < 0)
1574 avctx->header_bits = s->header_bits;
1575 avctx->mv_bits = s->mv_bits;
1576 avctx->misc_bits = s->misc_bits;
1577 avctx->i_tex_bits = s->i_tex_bits;
1578 avctx->p_tex_bits = s->p_tex_bits;
1579 avctx->i_count = s->i_count;
1580 // FIXME f/b_count in avctx
1581 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1582 avctx->skip_count = s->skip_count;
1586 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1587 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1589 if (avctx->rc_buffer_size) {
1590 RateControlContext *rcc = &s->rc_context;
1591 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1593 if (put_bits_count(&s->pb) > max_size &&
1594 s->lambda < s->avctx->lmax) {
1595 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1596 (s->qscale + 1) / s->qscale);
1597 if (s->adaptive_quant) {
1599 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1600 s->lambda_table[i] =
1601 FFMAX(s->lambda_table[i] + 1,
1602 s->lambda_table[i] * (s->qscale + 1) /
1605 s->mb_skipped = 0; // done in frame_start()
1606 // done in encode_picture() so we must undo it
1607 if (s->pict_type == AV_PICTURE_TYPE_P) {
1608 if (s->flipflop_rounding ||
1609 s->codec_id == AV_CODEC_ID_H263P ||
1610 s->codec_id == AV_CODEC_ID_MPEG4)
1611 s->no_rounding ^= 1;
1613 if (s->pict_type != AV_PICTURE_TYPE_B) {
1614 s->time_base = s->last_time_base;
1615 s->last_non_b_time = s->time - s->pp_time;
1617 for (i = 0; i < context_count; i++) {
1618 PutBitContext *pb = &s->thread_context[i]->pb;
1619 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1624 assert(s->avctx->rc_max_rate);
1627 if (s->flags & CODEC_FLAG_PASS1)
1628 ff_write_pass1_stats(s);
1630 for (i = 0; i < 4; i++) {
1631 s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
1632 avctx->error[i] += s->current_picture_ptr->f->error[i];
1635 if (s->flags & CODEC_FLAG_PASS1)
1636 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1637 avctx->i_tex_bits + avctx->p_tex_bits ==
1638 put_bits_count(&s->pb));
1639 flush_put_bits(&s->pb);
1640 s->frame_bits = put_bits_count(&s->pb);
1642 stuffing_count = ff_vbv_update(s, s->frame_bits);
1643 if (stuffing_count) {
1644 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1645 stuffing_count + 50) {
1646 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1650 switch (s->codec_id) {
1651 case AV_CODEC_ID_MPEG1VIDEO:
1652 case AV_CODEC_ID_MPEG2VIDEO:
1653 while (stuffing_count--) {
1654 put_bits(&s->pb, 8, 0);
1657 case AV_CODEC_ID_MPEG4:
1658 put_bits(&s->pb, 16, 0);
1659 put_bits(&s->pb, 16, 0x1C3);
1660 stuffing_count -= 4;
1661 while (stuffing_count--) {
1662 put_bits(&s->pb, 8, 0xFF);
1666 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1668 flush_put_bits(&s->pb);
1669 s->frame_bits = put_bits_count(&s->pb);
1672 /* update mpeg1/2 vbv_delay for CBR */
1673 if (s->avctx->rc_max_rate &&
1674 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1675 s->out_format == FMT_MPEG1 &&
1676 90000LL * (avctx->rc_buffer_size - 1) <=
1677 s->avctx->rc_max_rate * 0xFFFFLL) {
1678 int vbv_delay, min_delay;
1679 double inbits = s->avctx->rc_max_rate *
1680 av_q2d(s->avctx->time_base);
1681 int minbits = s->frame_bits - 8 *
1682 (s->vbv_delay_ptr - s->pb.buf - 1);
1683 double bits = s->rc_context.buffer_index + minbits - inbits;
1686 av_log(s->avctx, AV_LOG_ERROR,
1687 "Internal error, negative bits\n");
1689 assert(s->repeat_first_field == 0);
1691 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1692 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1693 s->avctx->rc_max_rate;
1695 vbv_delay = FFMAX(vbv_delay, min_delay);
1697 assert(vbv_delay < 0xFFFF);
1699 s->vbv_delay_ptr[0] &= 0xF8;
1700 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1701 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1702 s->vbv_delay_ptr[2] &= 0x07;
1703 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1704 avctx->vbv_delay = vbv_delay * 300;
1706 s->total_bits += s->frame_bits;
1707 avctx->frame_bits = s->frame_bits;
1709 pkt->pts = s->current_picture.f->pts;
1710 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1711 if (!s->current_picture.f->coded_picture_number)
1712 pkt->dts = pkt->pts - s->dts_delta;
1714 pkt->dts = s->reordered_pts;
1715 s->reordered_pts = pkt->pts;
1717 pkt->dts = pkt->pts;
1718 if (s->current_picture.f->key_frame)
1719 pkt->flags |= AV_PKT_FLAG_KEY;
1721 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1725 assert((s->frame_bits & 7) == 0);
1727 pkt->size = s->frame_bits / 8;
1728 *got_packet = !!pkt->size;
1732 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1733 int n, int threshold)
1735 static const char tab[64] = {
1736 3, 2, 2, 1, 1, 1, 1, 1,
1737 1, 1, 1, 1, 1, 1, 1, 1,
1738 1, 1, 1, 1, 1, 1, 1, 1,
1739 0, 0, 0, 0, 0, 0, 0, 0,
1740 0, 0, 0, 0, 0, 0, 0, 0,
1741 0, 0, 0, 0, 0, 0, 0, 0,
1742 0, 0, 0, 0, 0, 0, 0, 0,
1743 0, 0, 0, 0, 0, 0, 0, 0
1748 int16_t *block = s->block[n];
1749 const int last_index = s->block_last_index[n];
1752 if (threshold < 0) {
1754 threshold = -threshold;
1758 /* Are all we could set to zero already zero? */
1759 if (last_index <= skip_dc - 1)
1762 for (i = 0; i <= last_index; i++) {
1763 const int j = s->intra_scantable.permutated[i];
1764 const int level = FFABS(block[j]);
1766 if (skip_dc && i == 0)
1770 } else if (level > 1) {
1776 if (score >= threshold)
1778 for (i = skip_dc; i <= last_index; i++) {
1779 const int j = s->intra_scantable.permutated[i];
1783 s->block_last_index[n] = 0;
1785 s->block_last_index[n] = -1;
1788 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1792 const int maxlevel = s->max_qcoeff;
1793 const int minlevel = s->min_qcoeff;
1797 i = 1; // skip clipping of intra dc
1801 for (; i <= last_index; i++) {
1802 const int j = s->intra_scantable.permutated[i];
1803 int level = block[j];
1805 if (level > maxlevel) {
1808 } else if (level < minlevel) {
1816 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1817 av_log(s->avctx, AV_LOG_INFO,
1818 "warning, clipping %d dct coefficients to %d..%d\n",
1819 overflow, minlevel, maxlevel);
1822 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1826 for (y = 0; y < 8; y++) {
1827 for (x = 0; x < 8; x++) {
1833 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1834 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1835 int v = ptr[x2 + y2 * stride];
1841 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1846 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1847 int motion_x, int motion_y,
1848 int mb_block_height,
1851 int16_t weight[8][64];
1852 int16_t orig[8][64];
1853 const int mb_x = s->mb_x;
1854 const int mb_y = s->mb_y;
1857 int dct_offset = s->linesize * 8; // default for progressive frames
1858 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1859 ptrdiff_t wrap_y, wrap_c;
1861 for (i = 0; i < mb_block_count; i++)
1862 skip_dct[i] = s->skipdct;
1864 if (s->adaptive_quant) {
1865 const int last_qp = s->qscale;
1866 const int mb_xy = mb_x + mb_y * s->mb_stride;
1868 s->lambda = s->lambda_table[mb_xy];
1871 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1872 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1873 s->dquant = s->qscale - last_qp;
1875 if (s->out_format == FMT_H263) {
1876 s->dquant = av_clip(s->dquant, -2, 2);
1878 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1880 if (s->pict_type == AV_PICTURE_TYPE_B) {
1881 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1884 if (s->mv_type == MV_TYPE_8X8)
1890 ff_set_qscale(s, last_qp + s->dquant);
1891 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1892 ff_set_qscale(s, s->qscale + s->dquant);
1894 wrap_y = s->linesize;
1895 wrap_c = s->uvlinesize;
1896 ptr_y = s->new_picture.f->data[0] +
1897 (mb_y * 16 * wrap_y) + mb_x * 16;
1898 ptr_cb = s->new_picture.f->data[1] +
1899 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1900 ptr_cr = s->new_picture.f->data[2] +
1901 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1903 if (mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) {
1904 uint8_t *ebuf = s->edge_emu_buffer + 32;
1905 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1907 16, 16, mb_x * 16, mb_y * 16,
1908 s->width, s->height);
1910 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
1912 8, mb_block_height, mb_x * 8, mb_y * 8,
1913 s->width >> 1, s->height >> 1);
1914 ptr_cb = ebuf + 18 * wrap_y;
1915 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr,
1917 8, mb_block_height, mb_x * 8, mb_y * 8,
1918 s->width >> 1, s->height >> 1);
1919 ptr_cr = ebuf + 18 * wrap_y + 8;
1923 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1924 int progressive_score, interlaced_score;
1926 s->interlaced_dct = 0;
1927 progressive_score = s->mecc.ildct_cmp[4](s, ptr_y, NULL, wrap_y, 8) +
1928 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1929 NULL, wrap_y, 8) - 400;
1931 if (progressive_score > 0) {
1932 interlaced_score = s->mecc.ildct_cmp[4](s, ptr_y,
1933 NULL, wrap_y * 2, 8) +
1934 s->mecc.ildct_cmp[4](s, ptr_y + wrap_y,
1935 NULL, wrap_y * 2, 8);
1936 if (progressive_score > interlaced_score) {
1937 s->interlaced_dct = 1;
1939 dct_offset = wrap_y;
1941 if (s->chroma_format == CHROMA_422)
1947 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
1948 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
1949 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
1950 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
1952 if (s->flags & CODEC_FLAG_GRAY) {
1956 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1957 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1958 if (!s->chroma_y_shift) { /* 422 */
1959 s->pdsp.get_pixels(s->block[6],
1960 ptr_cb + (dct_offset >> 1), wrap_c);
1961 s->pdsp.get_pixels(s->block[7],
1962 ptr_cr + (dct_offset >> 1), wrap_c);
1966 op_pixels_func (*op_pix)[4];
1967 qpel_mc_func (*op_qpix)[16];
1968 uint8_t *dest_y, *dest_cb, *dest_cr;
1970 dest_y = s->dest[0];
1971 dest_cb = s->dest[1];
1972 dest_cr = s->dest[2];
1974 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1975 op_pix = s->hdsp.put_pixels_tab;
1976 op_qpix = s->qdsp.put_qpel_pixels_tab;
1978 op_pix = s->hdsp.put_no_rnd_pixels_tab;
1979 op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
1982 if (s->mv_dir & MV_DIR_FORWARD) {
1983 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
1984 s->last_picture.f->data,
1986 op_pix = s->hdsp.avg_pixels_tab;
1987 op_qpix = s->qdsp.avg_qpel_pixels_tab;
1989 if (s->mv_dir & MV_DIR_BACKWARD) {
1990 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
1991 s->next_picture.f->data,
1995 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1996 int progressive_score, interlaced_score;
1998 s->interlaced_dct = 0;
1999 progressive_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2000 s->mecc.ildct_cmp[0](s, dest_y + wrap_y * 8,
2004 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2005 progressive_score -= 400;
2007 if (progressive_score > 0) {
2008 interlaced_score = s->mecc.ildct_cmp[0](s, dest_y, ptr_y,
2010 s->mecc.ildct_cmp[0](s, dest_y + wrap_y,
2014 if (progressive_score > interlaced_score) {
2015 s->interlaced_dct = 1;
2017 dct_offset = wrap_y;
2019 if (s->chroma_format == CHROMA_422)
2025 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2026 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2027 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2028 dest_y + dct_offset, wrap_y);
2029 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2030 dest_y + dct_offset + 8, wrap_y);
2032 if (s->flags & CODEC_FLAG_GRAY) {
2036 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2037 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2038 if (!s->chroma_y_shift) { /* 422 */
2039 s->pdsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
2040 dest_cb + (dct_offset >> 1), wrap_c);
2041 s->pdsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
2042 dest_cr + (dct_offset >> 1), wrap_c);
2045 /* pre quantization */
2046 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2047 2 * s->qscale * s->qscale) {
2049 if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale)
2051 if (s->mecc.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2053 if (s->mecc.sad[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2054 wrap_y, 8) < 20 * s->qscale)
2056 if (s->mecc.sad[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2057 wrap_y, 8) < 20 * s->qscale)
2059 if (s->mecc.sad[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->qscale)
2061 if (s->mecc.sad[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->qscale)
2063 if (!s->chroma_y_shift) { /* 422 */
2064 if (s->mecc.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2065 dest_cb + (dct_offset >> 1),
2066 wrap_c, 8) < 20 * s->qscale)
2068 if (s->mecc.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2069 dest_cr + (dct_offset >> 1),
2070 wrap_c, 8) < 20 * s->qscale)
2076 if (s->quantizer_noise_shaping) {
2078 get_visual_weight(weight[0], ptr_y , wrap_y);
2080 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2082 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2084 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2086 get_visual_weight(weight[4], ptr_cb , wrap_c);
2088 get_visual_weight(weight[5], ptr_cr , wrap_c);
2089 if (!s->chroma_y_shift) { /* 422 */
2091 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2094 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2097 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2100 /* DCT & quantize */
2101 assert(s->out_format != FMT_MJPEG || s->qscale == 8);
2103 for (i = 0; i < mb_block_count; i++) {
2106 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2107 // FIXME we could decide to change to quantizer instead of
2109 // JS: I don't think that would be a good idea it could lower
2110 // quality instead of improve it. Just INTRADC clipping
2111 // deserves changes in quantizer
2113 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2115 s->block_last_index[i] = -1;
2117 if (s->quantizer_noise_shaping) {
2118 for (i = 0; i < mb_block_count; i++) {
2120 s->block_last_index[i] =
2121 dct_quantize_refine(s, s->block[i], weight[i],
2122 orig[i], i, s->qscale);
2127 if (s->luma_elim_threshold && !s->mb_intra)
2128 for (i = 0; i < 4; i++)
2129 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2130 if (s->chroma_elim_threshold && !s->mb_intra)
2131 for (i = 4; i < mb_block_count; i++)
2132 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2134 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2135 for (i = 0; i < mb_block_count; i++) {
2136 if (s->block_last_index[i] == -1)
2137 s->coded_score[i] = INT_MAX / 256;
2142 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2143 s->block_last_index[4] =
2144 s->block_last_index[5] = 0;
2146 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2149 // non c quantize code returns incorrect block_last_index FIXME
2150 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2151 for (i = 0; i < mb_block_count; i++) {
2153 if (s->block_last_index[i] > 0) {
2154 for (j = 63; j > 0; j--) {
2155 if (s->block[i][s->intra_scantable.permutated[j]])
2158 s->block_last_index[i] = j;
2163 /* huffman encode */
2164 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2165 case AV_CODEC_ID_MPEG1VIDEO:
2166 case AV_CODEC_ID_MPEG2VIDEO:
2167 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2168 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2170 case AV_CODEC_ID_MPEG4:
2171 if (CONFIG_MPEG4_ENCODER)
2172 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2174 case AV_CODEC_ID_MSMPEG4V2:
2175 case AV_CODEC_ID_MSMPEG4V3:
2176 case AV_CODEC_ID_WMV1:
2177 if (CONFIG_MSMPEG4_ENCODER)
2178 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2180 case AV_CODEC_ID_WMV2:
2181 if (CONFIG_WMV2_ENCODER)
2182 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2184 case AV_CODEC_ID_H261:
2185 if (CONFIG_H261_ENCODER)
2186 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2188 case AV_CODEC_ID_H263:
2189 case AV_CODEC_ID_H263P:
2190 case AV_CODEC_ID_FLV1:
2191 case AV_CODEC_ID_RV10:
2192 case AV_CODEC_ID_RV20:
2193 if (CONFIG_H263_ENCODER)
2194 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2196 case AV_CODEC_ID_MJPEG:
2197 if (CONFIG_MJPEG_ENCODER)
2198 ff_mjpeg_encode_mb(s, s->block);
2205 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2207 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2208 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2211 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2214 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2217 d->mb_skip_run= s->mb_skip_run;
2219 d->last_dc[i] = s->last_dc[i];
2222 d->mv_bits= s->mv_bits;
2223 d->i_tex_bits= s->i_tex_bits;
2224 d->p_tex_bits= s->p_tex_bits;
2225 d->i_count= s->i_count;
2226 d->f_count= s->f_count;
2227 d->b_count= s->b_count;
2228 d->skip_count= s->skip_count;
2229 d->misc_bits= s->misc_bits;
2233 d->qscale= s->qscale;
2234 d->dquant= s->dquant;
2236 d->esc3_level_length= s->esc3_level_length;
2239 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2242 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2243 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2246 d->mb_skip_run= s->mb_skip_run;
2248 d->last_dc[i] = s->last_dc[i];
2251 d->mv_bits= s->mv_bits;
2252 d->i_tex_bits= s->i_tex_bits;
2253 d->p_tex_bits= s->p_tex_bits;
2254 d->i_count= s->i_count;
2255 d->f_count= s->f_count;
2256 d->b_count= s->b_count;
2257 d->skip_count= s->skip_count;
2258 d->misc_bits= s->misc_bits;
2260 d->mb_intra= s->mb_intra;
2261 d->mb_skipped= s->mb_skipped;
2262 d->mv_type= s->mv_type;
2263 d->mv_dir= s->mv_dir;
2265 if(s->data_partitioning){
2267 d->tex_pb= s->tex_pb;
2271 d->block_last_index[i]= s->block_last_index[i];
2272 d->interlaced_dct= s->interlaced_dct;
2273 d->qscale= s->qscale;
2275 d->esc3_level_length= s->esc3_level_length;
2278 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2279 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2280 int *dmin, int *next_block, int motion_x, int motion_y)
2283 uint8_t *dest_backup[3];
2285 copy_context_before_encode(s, backup, type);
2287 s->block= s->blocks[*next_block];
2288 s->pb= pb[*next_block];
2289 if(s->data_partitioning){
2290 s->pb2 = pb2 [*next_block];
2291 s->tex_pb= tex_pb[*next_block];
2295 memcpy(dest_backup, s->dest, sizeof(s->dest));
2296 s->dest[0] = s->rd_scratchpad;
2297 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2298 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2299 assert(s->linesize >= 32); //FIXME
2302 encode_mb(s, motion_x, motion_y);
2304 score= put_bits_count(&s->pb);
2305 if(s->data_partitioning){
2306 score+= put_bits_count(&s->pb2);
2307 score+= put_bits_count(&s->tex_pb);
2310 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2311 ff_MPV_decode_mb(s, s->block);
2313 score *= s->lambda2;
2314 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2318 memcpy(s->dest, dest_backup, sizeof(s->dest));
2325 copy_context_after_encode(best, s, type);
2329 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2330 uint32_t *sq = ff_square_tab + 256;
2335 return s->mecc.sse[0](NULL, src1, src2, stride, 16);
2336 else if(w==8 && h==8)
2337 return s->mecc.sse[1](NULL, src1, src2, stride, 8);
2341 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2350 static int sse_mb(MpegEncContext *s){
2354 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2355 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2358 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2359 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) +
2360 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) +
2361 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);
2363 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) +
2364 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) +
2365 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);
2368 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)
2369 +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)
2370 +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);
2373 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2374 MpegEncContext *s= *(void**)arg;
2378 s->me.dia_size= s->avctx->pre_dia_size;
2379 s->first_slice_line=1;
2380 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2381 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2382 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2384 s->first_slice_line=0;
2392 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2393 MpegEncContext *s= *(void**)arg;
2395 s->me.dia_size= s->avctx->dia_size;
2396 s->first_slice_line=1;
2397 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2398 s->mb_x=0; //for block init below
2399 ff_init_block_index(s);
2400 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2401 s->block_index[0]+=2;
2402 s->block_index[1]+=2;
2403 s->block_index[2]+=2;
2404 s->block_index[3]+=2;
2406 /* compute motion vector & mb_type and store in context */
2407 if(s->pict_type==AV_PICTURE_TYPE_B)
2408 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2410 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2412 s->first_slice_line=0;
2417 static int mb_var_thread(AVCodecContext *c, void *arg){
2418 MpegEncContext *s= *(void**)arg;
2421 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2422 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2425 uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
2427 int sum = s->mpvencdsp.pix_sum(pix, s->linesize);
2429 varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) -
2430 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2432 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2433 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2434 s->me.mb_var_sum_temp += varc;
2440 static void write_slice_end(MpegEncContext *s){
2441 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2442 if(s->partitioned_frame){
2443 ff_mpeg4_merge_partitions(s);
2446 ff_mpeg4_stuffing(&s->pb);
2447 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2448 ff_mjpeg_encode_stuffing(&s->pb);
2451 avpriv_align_put_bits(&s->pb);
2452 flush_put_bits(&s->pb);
2454 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2455 s->misc_bits+= get_bits_diff(s);
2458 static void write_mb_info(MpegEncContext *s)
2460 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2461 int offset = put_bits_count(&s->pb);
2462 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2463 int gobn = s->mb_y / s->gob_index;
2465 if (CONFIG_H263_ENCODER)
2466 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2467 bytestream_put_le32(&ptr, offset);
2468 bytestream_put_byte(&ptr, s->qscale);
2469 bytestream_put_byte(&ptr, gobn);
2470 bytestream_put_le16(&ptr, mba);
2471 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2472 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2473 /* 4MV not implemented */
2474 bytestream_put_byte(&ptr, 0); /* hmv2 */
2475 bytestream_put_byte(&ptr, 0); /* vmv2 */
2478 static void update_mb_info(MpegEncContext *s, int startcode)
2482 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2483 s->mb_info_size += 12;
2484 s->prev_mb_info = s->last_mb_info;
2487 s->prev_mb_info = put_bits_count(&s->pb)/8;
2488 /* This might have incremented mb_info_size above, and we return without
2489 * actually writing any info into that slot yet. But in that case,
2490 * this will be called again at the start of the after writing the
2491 * start code, actually writing the mb info. */
2495 s->last_mb_info = put_bits_count(&s->pb)/8;
2496 if (!s->mb_info_size)
2497 s->mb_info_size += 12;
2501 static int encode_thread(AVCodecContext *c, void *arg){
2502 MpegEncContext *s= *(void**)arg;
2503 int mb_x, mb_y, pdif = 0;
2504 int chr_h= 16>>s->chroma_y_shift;
2506 MpegEncContext best_s, backup_s;
2507 uint8_t bit_buf[2][MAX_MB_BYTES];
2508 uint8_t bit_buf2[2][MAX_MB_BYTES];
2509 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2510 PutBitContext pb[2], pb2[2], tex_pb[2];
2513 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2514 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2515 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2518 s->last_bits= put_bits_count(&s->pb);
2529 /* init last dc values */
2530 /* note: quant matrix value (8) is implied here */
2531 s->last_dc[i] = 128 << s->intra_dc_precision;
2533 s->current_picture.f->error[i] = 0;
2536 memset(s->last_mv, 0, sizeof(s->last_mv));
2540 switch(s->codec_id){
2541 case AV_CODEC_ID_H263:
2542 case AV_CODEC_ID_H263P:
2543 case AV_CODEC_ID_FLV1:
2544 if (CONFIG_H263_ENCODER)
2545 s->gob_index = ff_h263_get_gob_height(s);
2547 case AV_CODEC_ID_MPEG4:
2548 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2549 ff_mpeg4_init_partitions(s);
2555 s->first_slice_line = 1;
2556 s->ptr_lastgob = s->pb.buf;
2557 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2561 ff_set_qscale(s, s->qscale);
2562 ff_init_block_index(s);
2564 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2565 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2566 int mb_type= s->mb_type[xy];
2571 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2572 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2575 if(s->data_partitioning){
2576 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2577 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2578 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2584 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2585 ff_update_block_index(s);
2587 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2588 ff_h261_reorder_mb_index(s);
2589 xy= s->mb_y*s->mb_stride + s->mb_x;
2590 mb_type= s->mb_type[xy];
2593 /* write gob / video packet header */
2595 int current_packet_size, is_gob_start;
2597 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2599 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2601 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2603 switch(s->codec_id){
2604 case AV_CODEC_ID_H263:
2605 case AV_CODEC_ID_H263P:
2606 if(!s->h263_slice_structured)
2607 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2609 case AV_CODEC_ID_MPEG2VIDEO:
2610 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2611 case AV_CODEC_ID_MPEG1VIDEO:
2612 if(s->mb_skip_run) is_gob_start=0;
2617 if(s->start_mb_y != mb_y || mb_x!=0){
2620 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2621 ff_mpeg4_init_partitions(s);
2625 assert((put_bits_count(&s->pb)&7) == 0);
2626 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2628 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2629 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2630 int d = 100 / s->error_rate;
2632 current_packet_size=0;
2633 s->pb.buf_ptr= s->ptr_lastgob;
2634 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2638 if (s->avctx->rtp_callback){
2639 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2640 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2642 update_mb_info(s, 1);
2644 switch(s->codec_id){
2645 case AV_CODEC_ID_MPEG4:
2646 if (CONFIG_MPEG4_ENCODER) {
2647 ff_mpeg4_encode_video_packet_header(s);
2648 ff_mpeg4_clean_buffers(s);
2651 case AV_CODEC_ID_MPEG1VIDEO:
2652 case AV_CODEC_ID_MPEG2VIDEO:
2653 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2654 ff_mpeg1_encode_slice_header(s);
2655 ff_mpeg1_clean_buffers(s);
2658 case AV_CODEC_ID_H263:
2659 case AV_CODEC_ID_H263P:
2660 if (CONFIG_H263_ENCODER)
2661 ff_h263_encode_gob_header(s, mb_y);
2665 if(s->flags&CODEC_FLAG_PASS1){
2666 int bits= put_bits_count(&s->pb);
2667 s->misc_bits+= bits - s->last_bits;
2671 s->ptr_lastgob += current_packet_size;
2672 s->first_slice_line=1;
2673 s->resync_mb_x=mb_x;
2674 s->resync_mb_y=mb_y;
2678 if( (s->resync_mb_x == s->mb_x)
2679 && s->resync_mb_y+1 == s->mb_y){
2680 s->first_slice_line=0;
2684 s->dquant=0; //only for QP_RD
2686 update_mb_info(s, 0);
2688 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
2690 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2692 copy_context_before_encode(&backup_s, s, -1);
2694 best_s.data_partitioning= s->data_partitioning;
2695 best_s.partitioned_frame= s->partitioned_frame;
2696 if(s->data_partitioning){
2697 backup_s.pb2= s->pb2;
2698 backup_s.tex_pb= s->tex_pb;
2701 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2702 s->mv_dir = MV_DIR_FORWARD;
2703 s->mv_type = MV_TYPE_16X16;
2705 s->mv[0][0][0] = s->p_mv_table[xy][0];
2706 s->mv[0][0][1] = s->p_mv_table[xy][1];
2707 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2708 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2710 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2711 s->mv_dir = MV_DIR_FORWARD;
2712 s->mv_type = MV_TYPE_FIELD;
2715 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2716 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2717 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2719 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2720 &dmin, &next_block, 0, 0);
2722 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2723 s->mv_dir = MV_DIR_FORWARD;
2724 s->mv_type = MV_TYPE_16X16;
2728 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2729 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2731 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2732 s->mv_dir = MV_DIR_FORWARD;
2733 s->mv_type = MV_TYPE_8X8;
2736 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2737 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2739 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2740 &dmin, &next_block, 0, 0);
2742 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2743 s->mv_dir = MV_DIR_FORWARD;
2744 s->mv_type = MV_TYPE_16X16;
2746 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2747 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2748 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2749 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2751 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2752 s->mv_dir = MV_DIR_BACKWARD;
2753 s->mv_type = MV_TYPE_16X16;
2755 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2756 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2757 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2758 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2760 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2761 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2762 s->mv_type = MV_TYPE_16X16;
2764 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2765 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2766 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2767 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2768 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2769 &dmin, &next_block, 0, 0);
2771 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2772 s->mv_dir = MV_DIR_FORWARD;
2773 s->mv_type = MV_TYPE_FIELD;
2776 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2777 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2778 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2780 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2781 &dmin, &next_block, 0, 0);
2783 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2784 s->mv_dir = MV_DIR_BACKWARD;
2785 s->mv_type = MV_TYPE_FIELD;
2788 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2789 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2790 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2792 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2793 &dmin, &next_block, 0, 0);
2795 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2796 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2797 s->mv_type = MV_TYPE_FIELD;
2799 for(dir=0; dir<2; dir++){
2801 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2802 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2803 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2806 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2807 &dmin, &next_block, 0, 0);
2809 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2811 s->mv_type = MV_TYPE_16X16;
2815 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2816 &dmin, &next_block, 0, 0);
2817 if(s->h263_pred || s->h263_aic){
2819 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2821 ff_clean_intra_table_entries(s); //old mode?
2825 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2826 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2827 const int last_qp= backup_s.qscale;
2830 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2831 static const int dquant_tab[4]={-1,1,-2,2};
2833 assert(backup_s.dquant == 0);
2836 s->mv_dir= best_s.mv_dir;
2837 s->mv_type = MV_TYPE_16X16;
2838 s->mb_intra= best_s.mb_intra;
2839 s->mv[0][0][0] = best_s.mv[0][0][0];
2840 s->mv[0][0][1] = best_s.mv[0][0][1];
2841 s->mv[1][0][0] = best_s.mv[1][0][0];
2842 s->mv[1][0][1] = best_s.mv[1][0][1];
2844 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2845 for(; qpi<4; qpi++){
2846 int dquant= dquant_tab[qpi];
2847 qp= last_qp + dquant;
2848 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2850 backup_s.dquant= dquant;
2851 if(s->mb_intra && s->dc_val[0]){
2853 dc[i]= s->dc_val[0][ s->block_index[i] ];
2854 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2858 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2859 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2860 if(best_s.qscale != qp){
2861 if(s->mb_intra && s->dc_val[0]){
2863 s->dc_val[0][ s->block_index[i] ]= dc[i];
2864 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2871 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2872 int mx= s->b_direct_mv_table[xy][0];
2873 int my= s->b_direct_mv_table[xy][1];
2875 backup_s.dquant = 0;
2876 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2878 ff_mpeg4_set_direct_mv(s, mx, my);
2879 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2880 &dmin, &next_block, mx, my);
2882 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2883 backup_s.dquant = 0;
2884 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2886 ff_mpeg4_set_direct_mv(s, 0, 0);
2887 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2888 &dmin, &next_block, 0, 0);
2890 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2893 coded |= s->block_last_index[i];
2896 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2897 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2898 mx=my=0; //FIXME find the one we actually used
2899 ff_mpeg4_set_direct_mv(s, mx, my);
2900 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2908 s->mv_dir= best_s.mv_dir;
2909 s->mv_type = best_s.mv_type;
2911 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2912 s->mv[0][0][1] = best_s.mv[0][0][1];
2913 s->mv[1][0][0] = best_s.mv[1][0][0];
2914 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2917 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2918 &dmin, &next_block, mx, my);
2923 s->current_picture.qscale_table[xy] = best_s.qscale;
2925 copy_context_after_encode(s, &best_s, -1);
2927 pb_bits_count= put_bits_count(&s->pb);
2928 flush_put_bits(&s->pb);
2929 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2932 if(s->data_partitioning){
2933 pb2_bits_count= put_bits_count(&s->pb2);
2934 flush_put_bits(&s->pb2);
2935 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2936 s->pb2= backup_s.pb2;
2938 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2939 flush_put_bits(&s->tex_pb);
2940 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2941 s->tex_pb= backup_s.tex_pb;
2943 s->last_bits= put_bits_count(&s->pb);
2945 if (CONFIG_H263_ENCODER &&
2946 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2947 ff_h263_update_motion_val(s);
2949 if(next_block==0){ //FIXME 16 vs linesize16
2950 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2951 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2952 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2955 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2956 ff_MPV_decode_mb(s, s->block);
2958 int motion_x = 0, motion_y = 0;
2959 s->mv_type=MV_TYPE_16X16;
2960 // only one MB-Type possible
2963 case CANDIDATE_MB_TYPE_INTRA:
2966 motion_x= s->mv[0][0][0] = 0;
2967 motion_y= s->mv[0][0][1] = 0;
2969 case CANDIDATE_MB_TYPE_INTER:
2970 s->mv_dir = MV_DIR_FORWARD;
2972 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2973 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2975 case CANDIDATE_MB_TYPE_INTER_I:
2976 s->mv_dir = MV_DIR_FORWARD;
2977 s->mv_type = MV_TYPE_FIELD;
2980 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2981 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2982 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2985 case CANDIDATE_MB_TYPE_INTER4V:
2986 s->mv_dir = MV_DIR_FORWARD;
2987 s->mv_type = MV_TYPE_8X8;
2990 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2991 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2994 case CANDIDATE_MB_TYPE_DIRECT:
2995 if (CONFIG_MPEG4_ENCODER) {
2996 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2998 motion_x=s->b_direct_mv_table[xy][0];
2999 motion_y=s->b_direct_mv_table[xy][1];
3000 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3003 case CANDIDATE_MB_TYPE_DIRECT0:
3004 if (CONFIG_MPEG4_ENCODER) {
3005 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3007 ff_mpeg4_set_direct_mv(s, 0, 0);
3010 case CANDIDATE_MB_TYPE_BIDIR:
3011 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3013 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3014 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3015 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3016 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3018 case CANDIDATE_MB_TYPE_BACKWARD:
3019 s->mv_dir = MV_DIR_BACKWARD;
3021 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3022 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3024 case CANDIDATE_MB_TYPE_FORWARD:
3025 s->mv_dir = MV_DIR_FORWARD;
3027 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3028 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3030 case CANDIDATE_MB_TYPE_FORWARD_I:
3031 s->mv_dir = MV_DIR_FORWARD;
3032 s->mv_type = MV_TYPE_FIELD;
3035 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3036 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3037 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3040 case CANDIDATE_MB_TYPE_BACKWARD_I:
3041 s->mv_dir = MV_DIR_BACKWARD;
3042 s->mv_type = MV_TYPE_FIELD;
3045 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3046 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3047 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3050 case CANDIDATE_MB_TYPE_BIDIR_I:
3051 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3052 s->mv_type = MV_TYPE_FIELD;
3054 for(dir=0; dir<2; dir++){
3056 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3057 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3058 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3063 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3066 encode_mb(s, motion_x, motion_y);
3068 // RAL: Update last macroblock type
3069 s->last_mv_dir = s->mv_dir;
3071 if (CONFIG_H263_ENCODER &&
3072 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3073 ff_h263_update_motion_val(s);
3075 ff_MPV_decode_mb(s, s->block);
3078 /* clean the MV table in IPS frames for direct mode in B frames */
3079 if(s->mb_intra /* && I,P,S_TYPE */){
3080 s->p_mv_table[xy][0]=0;
3081 s->p_mv_table[xy][1]=0;
3084 if(s->flags&CODEC_FLAG_PSNR){
3088 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3089 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3091 s->current_picture.f->error[0] += sse(
3092 s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3093 s->dest[0], w, h, s->linesize);
3094 s->current_picture.f->error[1] += sse(
3095 s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3096 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3097 s->current_picture.f->error[2] += sse(
3098 s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3099 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3102 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3103 ff_h263_loop_filter(s);
3105 av_dlog(s->avctx, "MB %d %d bits\n",
3106 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3110 //not beautiful here but we must write it before flushing so it has to be here
3111 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3112 ff_msmpeg4_encode_ext_header(s);
3116 /* Send the last GOB if RTP */
3117 if (s->avctx->rtp_callback) {
3118 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3119 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3120 /* Call the RTP callback to send the last GOB */
3122 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3128 #define MERGE(field) dst->field += src->field; src->field=0
3129 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3130 MERGE(me.scene_change_score);
3131 MERGE(me.mc_mb_var_sum_temp);
3132 MERGE(me.mb_var_sum_temp);
3135 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3138 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3139 MERGE(dct_count[1]);
3148 MERGE(er.error_count);
3149 MERGE(padding_bug_score);
3150 MERGE(current_picture.f->error[0]);
3151 MERGE(current_picture.f->error[1]);
3152 MERGE(current_picture.f->error[2]);
3154 if(dst->avctx->noise_reduction){
3155 for(i=0; i<64; i++){
3156 MERGE(dct_error_sum[0][i]);
3157 MERGE(dct_error_sum[1][i]);
3161 assert(put_bits_count(&src->pb) % 8 ==0);
3162 assert(put_bits_count(&dst->pb) % 8 ==0);
3163 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3164 flush_put_bits(&dst->pb);
3167 static int estimate_qp(MpegEncContext *s, int dry_run){
3168 if (s->next_lambda){
3169 s->current_picture_ptr->f->quality =
3170 s->current_picture.f->quality = s->next_lambda;
3171 if(!dry_run) s->next_lambda= 0;
3172 } else if (!s->fixed_qscale) {
3173 s->current_picture_ptr->f->quality =
3174 s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
3175 if (s->current_picture.f->quality < 0)
3179 if(s->adaptive_quant){
3180 switch(s->codec_id){
3181 case AV_CODEC_ID_MPEG4:
3182 if (CONFIG_MPEG4_ENCODER)
3183 ff_clean_mpeg4_qscales(s);
3185 case AV_CODEC_ID_H263:
3186 case AV_CODEC_ID_H263P:
3187 case AV_CODEC_ID_FLV1:
3188 if (CONFIG_H263_ENCODER)
3189 ff_clean_h263_qscales(s);
3192 ff_init_qscale_tab(s);
3195 s->lambda= s->lambda_table[0];
3198 s->lambda = s->current_picture.f->quality;
3203 /* must be called before writing the header */
3204 static void set_frame_distances(MpegEncContext * s){
3205 assert(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3206 s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3208 if(s->pict_type==AV_PICTURE_TYPE_B){
3209 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3210 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3212 s->pp_time= s->time - s->last_non_b_time;
3213 s->last_non_b_time= s->time;
3214 assert(s->picture_number==0 || s->pp_time > 0);
3218 static int encode_picture(MpegEncContext *s, int picture_number)
3222 int context_count = s->slice_context_count;
3224 s->picture_number = picture_number;
3226 /* Reset the average MB variance */
3227 s->me.mb_var_sum_temp =
3228 s->me.mc_mb_var_sum_temp = 0;
3230 /* we need to initialize some time vars before we can encode b-frames */
3231 // RAL: Condition added for MPEG1VIDEO
3232 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3233 set_frame_distances(s);
3234 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3235 ff_set_mpeg4_time(s);
3237 s->me.scene_change_score=0;
3239 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3241 if(s->pict_type==AV_PICTURE_TYPE_I){
3242 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3243 else s->no_rounding=0;
3244 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3245 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3246 s->no_rounding ^= 1;
3249 if(s->flags & CODEC_FLAG_PASS2){
3250 if (estimate_qp(s,1) < 0)
3252 ff_get_2pass_fcode(s);
3253 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3254 if(s->pict_type==AV_PICTURE_TYPE_B)
3255 s->lambda= s->last_lambda_for[s->pict_type];
3257 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3261 s->mb_intra=0; //for the rate distortion & bit compare functions
3262 for(i=1; i<context_count; i++){
3263 ret = ff_update_duplicate_context(s->thread_context[i], s);
3271 /* Estimate motion for every MB */
3272 if(s->pict_type != AV_PICTURE_TYPE_I){
3273 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3274 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3275 if (s->pict_type != AV_PICTURE_TYPE_B) {
3276 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3277 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3281 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3282 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3284 for(i=0; i<s->mb_stride*s->mb_height; i++)
3285 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3287 if(!s->fixed_qscale){
3288 /* finding spatial complexity for I-frame rate control */
3289 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3292 for(i=1; i<context_count; i++){
3293 merge_context_after_me(s, s->thread_context[i]);
3295 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3296 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3299 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3300 s->pict_type= AV_PICTURE_TYPE_I;
3301 for(i=0; i<s->mb_stride*s->mb_height; i++)
3302 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3303 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3304 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3308 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3309 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3311 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3313 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3314 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3315 s->f_code= FFMAX3(s->f_code, a, b);
3318 ff_fix_long_p_mvs(s);
3319 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3320 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3324 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3325 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3330 if(s->pict_type==AV_PICTURE_TYPE_B){
3333 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3334 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3335 s->f_code = FFMAX(a, b);
3337 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3338 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3339 s->b_code = FFMAX(a, b);
3341 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3342 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3343 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3344 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3345 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3347 for(dir=0; dir<2; dir++){
3350 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3351 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3352 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3353 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3361 if (estimate_qp(s, 0) < 0)
3364 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3365 s->qscale= 3; //reduce clipping problems
3367 if (s->out_format == FMT_MJPEG) {
3368 /* for mjpeg, we do include qscale in the matrix */
3370 int j = s->idsp.idct_permutation[i];
3372 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3374 s->y_dc_scale_table=
3375 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3376 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3377 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3378 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3382 //FIXME var duplication
3383 s->current_picture_ptr->f->key_frame =
3384 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3385 s->current_picture_ptr->f->pict_type =
3386 s->current_picture.f->pict_type = s->pict_type;
3388 if (s->current_picture.f->key_frame)
3389 s->picture_in_gop_number=0;
3391 s->last_bits= put_bits_count(&s->pb);
3392 switch(s->out_format) {
3394 if (CONFIG_MJPEG_ENCODER)
3395 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3399 if (CONFIG_H261_ENCODER)
3400 ff_h261_encode_picture_header(s, picture_number);
3403 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3404 ff_wmv2_encode_picture_header(s, picture_number);
3405 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3406 ff_msmpeg4_encode_picture_header(s, picture_number);
3407 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3408 ff_mpeg4_encode_picture_header(s, picture_number);
3409 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3410 ff_rv10_encode_picture_header(s, picture_number);
3411 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3412 ff_rv20_encode_picture_header(s, picture_number);
3413 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3414 ff_flv_encode_picture_header(s, picture_number);
3415 else if (CONFIG_H263_ENCODER)
3416 ff_h263_encode_picture_header(s, picture_number);
3419 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3420 ff_mpeg1_encode_picture_header(s, picture_number);
3425 bits= put_bits_count(&s->pb);
3426 s->header_bits= bits - s->last_bits;
3428 for(i=1; i<context_count; i++){
3429 update_duplicate_context_after_me(s->thread_context[i], s);
3431 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3432 for(i=1; i<context_count; i++){
3433 merge_context_after_encode(s, s->thread_context[i]);
3439 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3440 const int intra= s->mb_intra;
3443 s->dct_count[intra]++;
3445 for(i=0; i<64; i++){
3446 int level= block[i];
3450 s->dct_error_sum[intra][i] += level;
3451 level -= s->dct_offset[intra][i];
3452 if(level<0) level=0;
3454 s->dct_error_sum[intra][i] -= level;
3455 level += s->dct_offset[intra][i];
3456 if(level>0) level=0;
3463 static int dct_quantize_trellis_c(MpegEncContext *s,
3464 int16_t *block, int n,
3465 int qscale, int *overflow){
3467 const uint8_t *scantable= s->intra_scantable.scantable;
3468 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3470 unsigned int threshold1, threshold2;
3482 int coeff_count[64];
3483 int qmul, qadd, start_i, last_non_zero, i, dc;
3484 const int esc_length= s->ac_esc_length;
3486 uint8_t * last_length;
3487 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3489 s->fdsp.fdct(block);
3491 if(s->dct_error_sum)
3492 s->denoise_dct(s, block);
3494 qadd= ((qscale-1)|1)*8;
3505 /* For AIC we skip quant/dequant of INTRADC */
3510 /* note: block[0] is assumed to be positive */
3511 block[0] = (block[0] + (q >> 1)) / q;
3514 qmat = s->q_intra_matrix[qscale];
3515 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3516 bias= 1<<(QMAT_SHIFT-1);
3517 length = s->intra_ac_vlc_length;
3518 last_length= s->intra_ac_vlc_last_length;
3522 qmat = s->q_inter_matrix[qscale];
3523 length = s->inter_ac_vlc_length;
3524 last_length= s->inter_ac_vlc_last_length;
3528 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3529 threshold2= (threshold1<<1);
3531 for(i=63; i>=start_i; i--) {
3532 const int j = scantable[i];
3533 int level = block[j] * qmat[j];
3535 if(((unsigned)(level+threshold1))>threshold2){
3541 for(i=start_i; i<=last_non_zero; i++) {
3542 const int j = scantable[i];
3543 int level = block[j] * qmat[j];
3545 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3546 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3547 if(((unsigned)(level+threshold1))>threshold2){
3549 level= (bias + level)>>QMAT_SHIFT;
3551 coeff[1][i]= level-1;
3552 // coeff[2][k]= level-2;
3554 level= (bias - level)>>QMAT_SHIFT;
3555 coeff[0][i]= -level;
3556 coeff[1][i]= -level+1;
3557 // coeff[2][k]= -level+2;
3559 coeff_count[i]= FFMIN(level, 2);
3560 assert(coeff_count[i]);
3563 coeff[0][i]= (level>>31)|1;
3568 *overflow= s->max_qcoeff < max; //overflow might have happened
3570 if(last_non_zero < start_i){
3571 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3572 return last_non_zero;
3575 score_tab[start_i]= 0;
3576 survivor[0]= start_i;
3579 for(i=start_i; i<=last_non_zero; i++){
3580 int level_index, j, zero_distortion;
3581 int dct_coeff= FFABS(block[ scantable[i] ]);
3582 int best_score=256*256*256*120;
3584 if (s->fdsp.fdct == ff_fdct_ifast)
3585 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3586 zero_distortion= dct_coeff*dct_coeff;
3588 for(level_index=0; level_index < coeff_count[i]; level_index++){
3590 int level= coeff[level_index][i];
3591 const int alevel= FFABS(level);
3596 if(s->out_format == FMT_H263){
3597 unquant_coeff= alevel*qmul + qadd;
3599 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
3601 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3602 unquant_coeff = (unquant_coeff - 1) | 1;
3604 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3605 unquant_coeff = (unquant_coeff - 1) | 1;
3610 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3612 if((level&(~127)) == 0){
3613 for(j=survivor_count-1; j>=0; j--){
3614 int run= i - survivor[j];
3615 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3616 score += score_tab[i-run];
3618 if(score < best_score){
3621 level_tab[i+1]= level-64;
3625 if(s->out_format == FMT_H263){
3626 for(j=survivor_count-1; j>=0; j--){
3627 int run= i - survivor[j];
3628 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3629 score += score_tab[i-run];
3630 if(score < last_score){
3633 last_level= level-64;
3639 distortion += esc_length*lambda;
3640 for(j=survivor_count-1; j>=0; j--){
3641 int run= i - survivor[j];
3642 int score= distortion + score_tab[i-run];
3644 if(score < best_score){
3647 level_tab[i+1]= level-64;
3651 if(s->out_format == FMT_H263){
3652 for(j=survivor_count-1; j>=0; j--){
3653 int run= i - survivor[j];
3654 int score= distortion + score_tab[i-run];
3655 if(score < last_score){
3658 last_level= level-64;
3666 score_tab[i+1]= best_score;
3668 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3669 if(last_non_zero <= 27){
3670 for(; survivor_count; survivor_count--){
3671 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3675 for(; survivor_count; survivor_count--){
3676 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3681 survivor[ survivor_count++ ]= i+1;
3684 if(s->out_format != FMT_H263){
3685 last_score= 256*256*256*120;
3686 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3687 int score= score_tab[i];
3688 if(i) score += lambda*2; //FIXME exacter?
3690 if(score < last_score){
3693 last_level= level_tab[i];
3694 last_run= run_tab[i];
3699 s->coded_score[n] = last_score;
3701 dc= FFABS(block[0]);
3702 last_non_zero= last_i - 1;
3703 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3705 if(last_non_zero < start_i)
3706 return last_non_zero;
3708 if(last_non_zero == 0 && start_i == 0){
3710 int best_score= dc * dc;
3712 for(i=0; i<coeff_count[0]; i++){
3713 int level= coeff[i][0];
3714 int alevel= FFABS(level);
3715 int unquant_coeff, score, distortion;
3717 if(s->out_format == FMT_H263){
3718 unquant_coeff= (alevel*qmul + qadd)>>3;
3720 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3721 unquant_coeff = (unquant_coeff - 1) | 1;
3723 unquant_coeff = (unquant_coeff + 4) >> 3;
3724 unquant_coeff<<= 3 + 3;
3726 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3728 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3729 else score= distortion + esc_length*lambda;
3731 if(score < best_score){
3733 best_level= level - 64;
3736 block[0]= best_level;
3737 s->coded_score[n] = best_score - dc*dc;
3738 if(best_level == 0) return -1;
3739 else return last_non_zero;
3745 block[ perm_scantable[last_non_zero] ]= last_level;
3748 for(; i>start_i; i -= run_tab[i] + 1){
3749 block[ perm_scantable[i-1] ]= level_tab[i];
3752 return last_non_zero;
3755 //#define REFINE_STATS 1
3756 static int16_t basis[64][64];
3758 static void build_basis(uint8_t *perm){
3765 double s= 0.25*(1<<BASIS_SHIFT);
3767 int perm_index= perm[index];
3768 if(i==0) s*= sqrt(0.5);
3769 if(j==0) s*= sqrt(0.5);
3770 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)));
3777 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3778 int16_t *block, int16_t *weight, int16_t *orig,
3781 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3782 const uint8_t *scantable= s->intra_scantable.scantable;
3783 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3784 // unsigned int threshold1, threshold2;
3789 int qmul, qadd, start_i, last_non_zero, i, dc;
3791 uint8_t * last_length;
3793 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3796 static int after_last=0;
3797 static int to_zero=0;
3798 static int from_zero=0;
3801 static int messed_sign=0;
3804 if(basis[0][0] == 0)
3805 build_basis(s->idsp.idct_permutation);
3816 /* For AIC we skip quant/dequant of INTRADC */
3820 q <<= RECON_SHIFT-3;
3821 /* note: block[0] is assumed to be positive */
3823 // block[0] = (block[0] + (q >> 1)) / q;
3825 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3826 // bias= 1<<(QMAT_SHIFT-1);
3827 length = s->intra_ac_vlc_length;
3828 last_length= s->intra_ac_vlc_last_length;
3832 length = s->inter_ac_vlc_length;
3833 last_length= s->inter_ac_vlc_last_length;
3835 last_non_zero = s->block_last_index[n];
3840 dc += (1<<(RECON_SHIFT-1));
3841 for(i=0; i<64; i++){
3842 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3845 STOP_TIMER("memset rem[]")}
3848 for(i=0; i<64; i++){
3853 w= FFABS(weight[i]) + qns*one;
3854 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3857 // w=weight[i] = (63*qns + (w/2)) / w;
3863 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3869 for(i=start_i; i<=last_non_zero; i++){
3870 int j= perm_scantable[i];
3871 const int level= block[j];
3875 if(level<0) coeff= qmul*level - qadd;
3876 else coeff= qmul*level + qadd;
3877 run_tab[rle_index++]=run;
3880 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
3886 if(last_non_zero>0){
3887 STOP_TIMER("init rem[]")
3894 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
3897 int run2, best_unquant_change=0, analyze_gradient;
3901 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3903 if(analyze_gradient){
3907 for(i=0; i<64; i++){
3910 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3913 STOP_TIMER("rem*w*w")}
3923 const int level= block[0];
3924 int change, old_coeff;
3926 assert(s->mb_intra);
3930 for(change=-1; change<=1; change+=2){
3931 int new_level= level + change;
3932 int score, new_coeff;
3934 new_coeff= q*new_level;
3935 if(new_coeff >= 2048 || new_coeff < 0)
3938 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
3939 new_coeff - old_coeff);
3940 if(score<best_score){
3943 best_change= change;
3944 best_unquant_change= new_coeff - old_coeff;
3951 run2= run_tab[rle_index++];
3955 for(i=start_i; i<64; i++){
3956 int j= perm_scantable[i];
3957 const int level= block[j];
3958 int change, old_coeff;
3960 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3964 if(level<0) old_coeff= qmul*level - qadd;
3965 else old_coeff= qmul*level + qadd;
3966 run2= run_tab[rle_index++]; //FIXME ! maybe after last
3970 assert(run2>=0 || i >= last_non_zero );
3973 for(change=-1; change<=1; change+=2){
3974 int new_level= level + change;
3975 int score, new_coeff, unquant_change;
3978 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
3982 if(new_level<0) new_coeff= qmul*new_level - qadd;
3983 else new_coeff= qmul*new_level + qadd;
3984 if(new_coeff >= 2048 || new_coeff <= -2048)
3986 //FIXME check for overflow
3989 if(level < 63 && level > -63){
3990 if(i < last_non_zero)
3991 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
3992 - length[UNI_AC_ENC_INDEX(run, level+64)];
3994 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
3995 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
3998 assert(FFABS(new_level)==1);
4000 if(analyze_gradient){
4001 int g= d1[ scantable[i] ];
4002 if(g && (g^new_level) >= 0)
4006 if(i < last_non_zero){
4007 int next_i= i + run2 + 1;
4008 int next_level= block[ perm_scantable[next_i] ] + 64;
4010 if(next_level&(~127))
4013 if(next_i < last_non_zero)
4014 score += length[UNI_AC_ENC_INDEX(run, 65)]
4015 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4016 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4018 score += length[UNI_AC_ENC_INDEX(run, 65)]
4019 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4020 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4022 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4024 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4025 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4031 assert(FFABS(level)==1);
4033 if(i < last_non_zero){
4034 int next_i= i + run2 + 1;
4035 int next_level= block[ perm_scantable[next_i] ] + 64;
4037 if(next_level&(~127))
4040 if(next_i < last_non_zero)
4041 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4042 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4043 - length[UNI_AC_ENC_INDEX(run, 65)];
4045 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4046 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4047 - length[UNI_AC_ENC_INDEX(run, 65)];
4049 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4051 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4052 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4059 unquant_change= new_coeff - old_coeff;
4060 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
4062 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4064 if(score<best_score){
4067 best_change= change;
4068 best_unquant_change= unquant_change;
4072 prev_level= level + 64;
4073 if(prev_level&(~127))
4082 STOP_TIMER("iterative step")}
4086 int j= perm_scantable[ best_coeff ];
4088 block[j] += best_change;
4090 if(best_coeff > last_non_zero){
4091 last_non_zero= best_coeff;
4099 if(block[j] - best_change){
4100 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4112 for(; last_non_zero>=start_i; last_non_zero--){
4113 if(block[perm_scantable[last_non_zero]])
4119 if(256*256*256*64 % count == 0){
4120 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);
4125 for(i=start_i; i<=last_non_zero; i++){
4126 int j= perm_scantable[i];
4127 const int level= block[j];
4130 run_tab[rle_index++]=run;
4137 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4143 if(last_non_zero>0){
4144 STOP_TIMER("iterative search")
4149 return last_non_zero;
4152 int ff_dct_quantize_c(MpegEncContext *s,
4153 int16_t *block, int n,
4154 int qscale, int *overflow)
4156 int i, j, level, last_non_zero, q, start_i;
4158 const uint8_t *scantable= s->intra_scantable.scantable;
4161 unsigned int threshold1, threshold2;
4163 s->fdsp.fdct(block);
4165 if(s->dct_error_sum)
4166 s->denoise_dct(s, block);
4176 /* For AIC we skip quant/dequant of INTRADC */
4179 /* note: block[0] is assumed to be positive */
4180 block[0] = (block[0] + (q >> 1)) / q;
4183 qmat = s->q_intra_matrix[qscale];
4184 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4188 qmat = s->q_inter_matrix[qscale];
4189 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4191 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4192 threshold2= (threshold1<<1);
4193 for(i=63;i>=start_i;i--) {
4195 level = block[j] * qmat[j];
4197 if(((unsigned)(level+threshold1))>threshold2){
4204 for(i=start_i; i<=last_non_zero; i++) {
4206 level = block[j] * qmat[j];
4208 // if( bias+level >= (1<<QMAT_SHIFT)
4209 // || bias-level >= (1<<QMAT_SHIFT)){
4210 if(((unsigned)(level+threshold1))>threshold2){
4212 level= (bias + level)>>QMAT_SHIFT;
4215 level= (bias - level)>>QMAT_SHIFT;
4223 *overflow= s->max_qcoeff < max; //overflow might have happened
4225 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4226 if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
4227 ff_block_permute(block, s->idsp.idct_permutation,
4228 scantable, last_non_zero);
4230 return last_non_zero;
4233 #define OFFSET(x) offsetof(MpegEncContext, x)
4234 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4235 static const AVOption h263_options[] = {
4236 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4237 { "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},
4238 { "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 },
4243 static const AVClass h263_class = {
4244 .class_name = "H.263 encoder",
4245 .item_name = av_default_item_name,
4246 .option = h263_options,
4247 .version = LIBAVUTIL_VERSION_INT,
4250 AVCodec ff_h263_encoder = {
4252 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4253 .type = AVMEDIA_TYPE_VIDEO,
4254 .id = AV_CODEC_ID_H263,
4255 .priv_data_size = sizeof(MpegEncContext),
4256 .init = ff_MPV_encode_init,
4257 .encode2 = ff_MPV_encode_picture,
4258 .close = ff_MPV_encode_end,
4259 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4260 .priv_class = &h263_class,
4263 static const AVOption h263p_options[] = {
4264 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4265 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4266 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4267 { "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},
4271 static const AVClass h263p_class = {
4272 .class_name = "H.263p encoder",
4273 .item_name = av_default_item_name,
4274 .option = h263p_options,
4275 .version = LIBAVUTIL_VERSION_INT,
4278 AVCodec ff_h263p_encoder = {
4280 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4281 .type = AVMEDIA_TYPE_VIDEO,
4282 .id = AV_CODEC_ID_H263P,
4283 .priv_data_size = sizeof(MpegEncContext),
4284 .init = ff_MPV_encode_init,
4285 .encode2 = ff_MPV_encode_picture,
4286 .close = ff_MPV_encode_end,
4287 .capabilities = CODEC_CAP_SLICE_THREADS,
4288 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4289 .priv_class = &h263p_class,
4292 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4294 AVCodec ff_msmpeg4v2_encoder = {
4295 .name = "msmpeg4v2",
4296 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4297 .type = AVMEDIA_TYPE_VIDEO,
4298 .id = AV_CODEC_ID_MSMPEG4V2,
4299 .priv_data_size = sizeof(MpegEncContext),
4300 .init = ff_MPV_encode_init,
4301 .encode2 = ff_MPV_encode_picture,
4302 .close = ff_MPV_encode_end,
4303 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4304 .priv_class = &msmpeg4v2_class,
4307 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4309 AVCodec ff_msmpeg4v3_encoder = {
4311 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4312 .type = AVMEDIA_TYPE_VIDEO,
4313 .id = AV_CODEC_ID_MSMPEG4V3,
4314 .priv_data_size = sizeof(MpegEncContext),
4315 .init = ff_MPV_encode_init,
4316 .encode2 = ff_MPV_encode_picture,
4317 .close = ff_MPV_encode_end,
4318 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4319 .priv_class = &msmpeg4v3_class,
4322 FF_MPV_GENERIC_CLASS(wmv1)
4324 AVCodec ff_wmv1_encoder = {
4326 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4327 .type = AVMEDIA_TYPE_VIDEO,
4328 .id = AV_CODEC_ID_WMV1,
4329 .priv_data_size = sizeof(MpegEncContext),
4330 .init = ff_MPV_encode_init,
4331 .encode2 = ff_MPV_encode_picture,
4332 .close = ff_MPV_encode_end,
4333 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4334 .priv_class = &wmv1_class,