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 FFmpeg.
10 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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"
41 #include "mpegvideo.h"
49 #include "aandcttab.h"
51 #include "mpeg4video.h"
53 #include "bytestream.h"
57 static int encode_picture(MpegEncContext *s, int picture_number);
58 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
59 static int sse_mb(MpegEncContext *s);
60 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
61 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
63 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
64 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
66 const AVOption ff_mpv_generic_options[] = {
71 void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64],
72 uint16_t (*qmat16)[2][64],
73 const uint16_t *quant_matrix,
74 int bias, int qmin, int qmax, int intra)
79 for (qscale = qmin; qscale <= qmax; qscale++) {
81 if (dsp->fdct == ff_jpeg_fdct_islow_8 ||
82 dsp->fdct == ff_jpeg_fdct_islow_10 ||
83 dsp->fdct == ff_faandct) {
84 for (i = 0; i < 64; i++) {
85 const int j = dsp->idct_permutation[i];
86 /* 16 <= qscale * quant_matrix[i] <= 7905
87 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
88 * 19952 <= x <= 249205026
89 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
90 * 3444240 >= (1 << 36) / (x) >= 275 */
92 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
93 (qscale * quant_matrix[j]));
95 } else if (dsp->fdct == ff_fdct_ifast) {
96 for (i = 0; i < 64; i++) {
97 const int j = dsp->idct_permutation[i];
98 /* 16 <= qscale * quant_matrix[i] <= 7905
99 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
100 * 19952 <= x <= 249205026
101 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
102 * 3444240 >= (1 << 36) / (x) >= 275 */
104 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
105 (ff_aanscales[i] * (int64_t)qscale * quant_matrix[j]));
108 for (i = 0; i < 64; i++) {
109 const int j = dsp->idct_permutation[i];
110 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
111 * Assume x = qscale * quant_matrix[i]
113 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
114 * so 32768 >= (1 << 19) / (x) >= 67 */
115 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
116 (qscale * quant_matrix[j]));
117 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
118 // (qscale * quant_matrix[i]);
119 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
120 (qscale * quant_matrix[j]);
122 if (qmat16[qscale][0][i] == 0 ||
123 qmat16[qscale][0][i] == 128 * 256)
124 qmat16[qscale][0][i] = 128 * 256 - 1;
125 qmat16[qscale][1][i] =
126 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
127 qmat16[qscale][0][i]);
131 for (i = intra; i < 64; i++) {
133 if (dsp->fdct == ff_fdct_ifast) {
134 max = (8191LL * ff_aanscales[i]) >> 14;
136 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
142 av_log(NULL, AV_LOG_INFO,
143 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
148 static inline void update_qscale(MpegEncContext *s)
150 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
151 (FF_LAMBDA_SHIFT + 7);
152 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
154 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
158 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
164 for (i = 0; i < 64; i++) {
165 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
172 * init s->current_picture.qscale_table from s->lambda_table
174 void ff_init_qscale_tab(MpegEncContext *s)
176 int8_t * const qscale_table = s->current_picture.qscale_table;
179 for (i = 0; i < s->mb_num; i++) {
180 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
181 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
182 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
187 static void update_duplicate_context_after_me(MpegEncContext *dst,
190 #define COPY(a) dst->a= src->a
192 COPY(current_picture);
198 COPY(picture_in_gop_number);
199 COPY(gop_picture_number);
200 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
201 COPY(progressive_frame); // FIXME don't set in encode_header
202 COPY(partitioned_frame); // FIXME don't set in encode_header
207 * Set the given MpegEncContext to defaults for encoding.
208 * the changed fields will not depend upon the prior state of the MpegEncContext.
210 static void MPV_encode_defaults(MpegEncContext *s)
213 ff_MPV_common_defaults(s);
215 for (i = -16; i < 16; i++) {
216 default_fcode_tab[i + MAX_MV] = 1;
218 s->me.mv_penalty = default_mv_penalty;
219 s->fcode_tab = default_fcode_tab;
221 s->input_picture_number = 0;
222 s->picture_in_gop_number = 0;
225 av_cold int ff_dct_encode_init(MpegEncContext *s) {
227 ff_dct_encode_init_x86(s);
229 if (CONFIG_H263_ENCODER)
230 ff_h263dsp_init(&s->h263dsp);
231 if (!s->dct_quantize)
232 s->dct_quantize = ff_dct_quantize_c;
234 s->denoise_dct = denoise_dct_c;
235 s->fast_dct_quantize = s->dct_quantize;
236 if (s->avctx->trellis)
237 s->dct_quantize = dct_quantize_trellis_c;
242 /* init video encoder */
243 av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
245 MpegEncContext *s = avctx->priv_data;
248 MPV_encode_defaults(s);
250 switch (avctx->codec_id) {
251 case AV_CODEC_ID_MPEG2VIDEO:
252 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
253 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
254 av_log(avctx, AV_LOG_ERROR,
255 "only YUV420 and YUV422 are supported\n");
259 case AV_CODEC_ID_MJPEG:
260 case AV_CODEC_ID_AMV:
261 if (avctx->pix_fmt != AV_PIX_FMT_YUVJ420P &&
262 avctx->pix_fmt != AV_PIX_FMT_YUVJ422P &&
263 avctx->pix_fmt != AV_PIX_FMT_YUVJ444P &&
264 ((avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
265 avctx->pix_fmt != AV_PIX_FMT_YUV422P &&
266 avctx->pix_fmt != AV_PIX_FMT_YUV444P) ||
267 avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL)) {
268 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
273 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
274 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
279 switch (avctx->pix_fmt) {
280 case AV_PIX_FMT_YUVJ444P:
281 case AV_PIX_FMT_YUV444P:
282 s->chroma_format = CHROMA_444;
284 case AV_PIX_FMT_YUVJ422P:
285 case AV_PIX_FMT_YUV422P:
286 s->chroma_format = CHROMA_422;
288 case AV_PIX_FMT_YUVJ420P:
289 case AV_PIX_FMT_YUV420P:
291 s->chroma_format = CHROMA_420;
295 s->bit_rate = avctx->bit_rate;
296 s->width = avctx->width;
297 s->height = avctx->height;
298 if (avctx->gop_size > 600 &&
299 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
300 av_log(avctx, AV_LOG_WARNING,
301 "keyframe interval too large!, reducing it from %d to %d\n",
302 avctx->gop_size, 600);
303 avctx->gop_size = 600;
305 s->gop_size = avctx->gop_size;
307 s->flags = avctx->flags;
308 s->flags2 = avctx->flags2;
309 if (avctx->max_b_frames > MAX_B_FRAMES) {
310 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
311 "is %d.\n", MAX_B_FRAMES);
312 avctx->max_b_frames = MAX_B_FRAMES;
314 s->max_b_frames = avctx->max_b_frames;
315 s->codec_id = avctx->codec->id;
316 s->strict_std_compliance = avctx->strict_std_compliance;
317 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
318 s->mpeg_quant = avctx->mpeg_quant;
319 s->rtp_mode = !!avctx->rtp_payload_size;
320 s->intra_dc_precision = avctx->intra_dc_precision;
321 s->user_specified_pts = AV_NOPTS_VALUE;
323 if (s->gop_size <= 1) {
330 s->me_method = avctx->me_method;
333 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
335 s->adaptive_quant = (s->avctx->lumi_masking ||
336 s->avctx->dark_masking ||
337 s->avctx->temporal_cplx_masking ||
338 s->avctx->spatial_cplx_masking ||
339 s->avctx->p_masking ||
340 s->avctx->border_masking ||
341 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
344 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
346 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
347 switch(avctx->codec_id) {
348 case AV_CODEC_ID_MPEG1VIDEO:
349 case AV_CODEC_ID_MPEG2VIDEO:
350 avctx->rc_buffer_size = FFMAX(avctx->rc_max_rate, 15000000) * 112L / 15000000 * 16384;
352 case AV_CODEC_ID_MPEG4:
353 case AV_CODEC_ID_MSMPEG4V1:
354 case AV_CODEC_ID_MSMPEG4V2:
355 case AV_CODEC_ID_MSMPEG4V3:
356 if (avctx->rc_max_rate >= 15000000) {
357 avctx->rc_buffer_size = 320 + (avctx->rc_max_rate - 15000000L) * (760-320) / (38400000 - 15000000);
358 } else if(avctx->rc_max_rate >= 2000000) {
359 avctx->rc_buffer_size = 80 + (avctx->rc_max_rate - 2000000L) * (320- 80) / (15000000 - 2000000);
360 } else if(avctx->rc_max_rate >= 384000) {
361 avctx->rc_buffer_size = 40 + (avctx->rc_max_rate - 384000L) * ( 80- 40) / ( 2000000 - 384000);
363 avctx->rc_buffer_size = 40;
364 avctx->rc_buffer_size *= 16384;
367 if (avctx->rc_buffer_size) {
368 av_log(avctx, AV_LOG_INFO, "Automatically choosing VBV buffer size of %d kbyte\n", avctx->rc_buffer_size/8192);
372 if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
373 av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
374 if (avctx->rc_max_rate && !avctx->rc_buffer_size)
378 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
379 av_log(avctx, AV_LOG_INFO,
380 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
383 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
384 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
388 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
389 av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
393 if (avctx->rc_max_rate &&
394 avctx->rc_max_rate == avctx->bit_rate &&
395 avctx->rc_max_rate != avctx->rc_min_rate) {
396 av_log(avctx, AV_LOG_INFO,
397 "impossible bitrate constraints, this will fail\n");
400 if (avctx->rc_buffer_size &&
401 avctx->bit_rate * (int64_t)avctx->time_base.num >
402 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
403 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
407 if (!s->fixed_qscale &&
408 avctx->bit_rate * av_q2d(avctx->time_base) >
409 avctx->bit_rate_tolerance) {
410 av_log(avctx, AV_LOG_ERROR,
411 "bitrate tolerance %d too small for bitrate %d\n", avctx->bit_rate_tolerance, avctx->bit_rate);
415 if (s->avctx->rc_max_rate &&
416 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
417 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
418 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
419 90000LL * (avctx->rc_buffer_size - 1) >
420 s->avctx->rc_max_rate * 0xFFFFLL) {
421 av_log(avctx, AV_LOG_INFO,
422 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
423 "specified vbv buffer is too large for the given bitrate!\n");
426 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
427 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
428 s->codec_id != AV_CODEC_ID_FLV1) {
429 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
433 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
434 av_log(avctx, AV_LOG_ERROR,
435 "OBMC is only supported with simple mb decision\n");
439 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
440 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
444 if (s->max_b_frames &&
445 s->codec_id != AV_CODEC_ID_MPEG4 &&
446 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
447 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
448 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
451 if (s->max_b_frames < 0) {
452 av_log(avctx, AV_LOG_ERROR,
453 "max b frames must be 0 or positive for mpegvideo based encoders\n");
457 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
458 s->codec_id == AV_CODEC_ID_H263 ||
459 s->codec_id == AV_CODEC_ID_H263P) &&
460 (avctx->sample_aspect_ratio.num > 255 ||
461 avctx->sample_aspect_ratio.den > 255)) {
462 av_log(avctx, AV_LOG_WARNING,
463 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
464 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
465 av_reduce(&avctx->sample_aspect_ratio.num, &avctx->sample_aspect_ratio.den,
466 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 255);
469 if ((s->codec_id == AV_CODEC_ID_H263 ||
470 s->codec_id == AV_CODEC_ID_H263P) &&
471 (avctx->width > 2048 ||
472 avctx->height > 1152 )) {
473 av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
476 if ((s->codec_id == AV_CODEC_ID_H263 ||
477 s->codec_id == AV_CODEC_ID_H263P) &&
478 ((avctx->width &3) ||
479 (avctx->height&3) )) {
480 av_log(avctx, AV_LOG_ERROR, "w/h must be a multiple of 4\n");
484 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
485 (avctx->width > 4095 ||
486 avctx->height > 4095 )) {
487 av_log(avctx, AV_LOG_ERROR, "MPEG-1 does not support resolutions above 4095x4095\n");
491 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
492 (avctx->width > 16383 ||
493 avctx->height > 16383 )) {
494 av_log(avctx, AV_LOG_ERROR, "MPEG-2 does not support resolutions above 16383x16383\n");
498 if (s->codec_id == AV_CODEC_ID_RV10 &&
500 avctx->height&15 )) {
501 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 16\n");
502 return AVERROR(EINVAL);
505 if (s->codec_id == AV_CODEC_ID_RV20 &&
508 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 4\n");
509 return AVERROR(EINVAL);
512 if ((s->codec_id == AV_CODEC_ID_WMV1 ||
513 s->codec_id == AV_CODEC_ID_WMV2) &&
515 av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
519 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
520 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
521 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
525 // FIXME mpeg2 uses that too
526 if (s->mpeg_quant && ( s->codec_id != AV_CODEC_ID_MPEG4
527 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO)) {
528 av_log(avctx, AV_LOG_ERROR,
529 "mpeg2 style quantization not supported by codec\n");
533 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
534 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
538 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
539 s->avctx->mb_decision != FF_MB_DECISION_RD) {
540 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
544 if (s->avctx->scenechange_threshold < 1000000000 &&
545 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
546 av_log(avctx, AV_LOG_ERROR,
547 "closed gop with scene change detection are not supported yet, "
548 "set threshold to 1000000000\n");
552 if (s->flags & CODEC_FLAG_LOW_DELAY) {
553 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
554 av_log(avctx, AV_LOG_ERROR,
555 "low delay forcing is only available for mpeg2\n");
558 if (s->max_b_frames != 0) {
559 av_log(avctx, AV_LOG_ERROR,
560 "b frames cannot be used with low delay\n");
565 if (s->q_scale_type == 1) {
566 if (avctx->qmax > 12) {
567 av_log(avctx, AV_LOG_ERROR,
568 "non linear quant only supports qmax <= 12 currently\n");
573 if (s->avctx->thread_count > 1 &&
574 s->codec_id != AV_CODEC_ID_MPEG4 &&
575 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
576 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
577 s->codec_id != AV_CODEC_ID_MJPEG &&
578 (s->codec_id != AV_CODEC_ID_H263P)) {
579 av_log(avctx, AV_LOG_ERROR,
580 "multi threaded encoding not supported by codec\n");
584 if (s->avctx->thread_count < 1) {
585 av_log(avctx, AV_LOG_ERROR,
586 "automatic thread number detection not supported by codec, "
591 if (s->avctx->slices > 1 || s->avctx->thread_count > 1)
594 if (s->avctx->thread_count > 1 && s->codec_id == AV_CODEC_ID_H263P)
595 s->h263_slice_structured = 1;
597 if (!avctx->time_base.den || !avctx->time_base.num) {
598 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
602 i = (INT_MAX / 2 + 128) >> 8;
603 if (avctx->mb_threshold >= i) {
604 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
609 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
610 av_log(avctx, AV_LOG_INFO,
611 "notice: b_frame_strategy only affects the first pass\n");
612 avctx->b_frame_strategy = 0;
615 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
617 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
618 avctx->time_base.den /= i;
619 avctx->time_base.num /= i;
623 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG || s->codec_id==AV_CODEC_ID_AMV) {
624 // (a + x * 3 / 8) / x
625 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
626 s->inter_quant_bias = 0;
628 s->intra_quant_bias = 0;
630 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
633 if (avctx->qmin > avctx->qmax || avctx->qmin <= 0) {
634 av_log(avctx, AV_LOG_ERROR, "qmin and or qmax are invalid, they must be 0 < min <= max\n");
635 return AVERROR(EINVAL);
638 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
639 s->intra_quant_bias = avctx->intra_quant_bias;
640 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
641 s->inter_quant_bias = avctx->inter_quant_bias;
643 av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
645 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
646 s->avctx->time_base.den > (1 << 16) - 1) {
647 av_log(avctx, AV_LOG_ERROR,
648 "timebase %d/%d not supported by MPEG 4 standard, "
649 "the maximum admitted value for the timebase denominator "
650 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
654 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
656 switch (avctx->codec->id) {
657 case AV_CODEC_ID_MPEG1VIDEO:
658 s->out_format = FMT_MPEG1;
659 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
660 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
662 case AV_CODEC_ID_MPEG2VIDEO:
663 s->out_format = FMT_MPEG1;
664 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
665 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
668 case AV_CODEC_ID_MJPEG:
669 case AV_CODEC_ID_AMV:
670 s->out_format = FMT_MJPEG;
671 s->intra_only = 1; /* force intra only for jpeg */
672 if (!CONFIG_MJPEG_ENCODER ||
673 ff_mjpeg_encode_init(s) < 0)
678 case AV_CODEC_ID_H261:
679 if (!CONFIG_H261_ENCODER)
681 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
682 av_log(avctx, AV_LOG_ERROR,
683 "The specified picture size of %dx%d is not valid for the "
684 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
685 s->width, s->height);
688 s->out_format = FMT_H261;
692 case AV_CODEC_ID_H263:
693 if (!CONFIG_H263_ENCODER)
695 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
696 s->width, s->height) == 8) {
697 av_log(avctx, AV_LOG_ERROR,
698 "The specified picture size of %dx%d is not valid for "
699 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
700 "352x288, 704x576, and 1408x1152. "
701 "Try H.263+.\n", s->width, s->height);
704 s->out_format = FMT_H263;
708 case AV_CODEC_ID_H263P:
709 s->out_format = FMT_H263;
712 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
713 s->modified_quant = s->h263_aic;
714 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
715 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
718 /* These are just to be sure */
722 case AV_CODEC_ID_FLV1:
723 s->out_format = FMT_H263;
724 s->h263_flv = 2; /* format = 1; 11-bit codes */
725 s->unrestricted_mv = 1;
726 s->rtp_mode = 0; /* don't allow GOB */
730 case AV_CODEC_ID_RV10:
731 s->out_format = FMT_H263;
735 case AV_CODEC_ID_RV20:
736 s->out_format = FMT_H263;
739 s->modified_quant = 1;
743 s->unrestricted_mv = 0;
745 case AV_CODEC_ID_MPEG4:
746 s->out_format = FMT_H263;
748 s->unrestricted_mv = 1;
749 s->low_delay = s->max_b_frames ? 0 : 1;
750 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
752 case AV_CODEC_ID_MSMPEG4V2:
753 s->out_format = FMT_H263;
755 s->unrestricted_mv = 1;
756 s->msmpeg4_version = 2;
760 case AV_CODEC_ID_MSMPEG4V3:
761 s->out_format = FMT_H263;
763 s->unrestricted_mv = 1;
764 s->msmpeg4_version = 3;
765 s->flipflop_rounding = 1;
769 case AV_CODEC_ID_WMV1:
770 s->out_format = FMT_H263;
772 s->unrestricted_mv = 1;
773 s->msmpeg4_version = 4;
774 s->flipflop_rounding = 1;
778 case AV_CODEC_ID_WMV2:
779 s->out_format = FMT_H263;
781 s->unrestricted_mv = 1;
782 s->msmpeg4_version = 5;
783 s->flipflop_rounding = 1;
791 avctx->has_b_frames = !s->low_delay;
795 s->progressive_frame =
796 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
797 CODEC_FLAG_INTERLACED_ME) ||
801 if (ff_MPV_common_init(s) < 0)
804 s->avctx->coded_frame = &s->current_picture.f;
806 if (s->msmpeg4_version) {
807 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
808 2 * 2 * (MAX_LEVEL + 1) *
809 (MAX_RUN + 1) * 2 * sizeof(int), fail);
811 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
813 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail);
814 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail);
815 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail);
816 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
817 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
818 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
819 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
820 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
821 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
822 MAX_PICTURE_COUNT * sizeof(Picture *), fail);
824 if (s->avctx->noise_reduction) {
825 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
826 2 * 64 * sizeof(uint16_t), fail);
829 ff_dct_encode_init(s);
831 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
832 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
834 s->quant_precision = 5;
836 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
837 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
839 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
840 ff_h261_encode_init(s);
841 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
842 ff_h263_encode_init(s);
843 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
844 ff_msmpeg4_encode_init(s);
845 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
846 && s->out_format == FMT_MPEG1)
847 ff_mpeg1_encode_init(s);
850 for (i = 0; i < 64; i++) {
851 int j = s->dsp.idct_permutation[i];
852 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
854 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
855 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
856 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
858 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
861 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
862 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
864 if (s->avctx->intra_matrix)
865 s->intra_matrix[j] = s->avctx->intra_matrix[i];
866 if (s->avctx->inter_matrix)
867 s->inter_matrix[j] = s->avctx->inter_matrix[i];
870 /* precompute matrix */
871 /* for mjpeg, we do include qscale in the matrix */
872 if (s->out_format != FMT_MJPEG) {
873 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
874 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
876 ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
877 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
881 if (ff_rate_control_init(s) < 0)
884 #if FF_API_ERROR_RATE
885 FF_DISABLE_DEPRECATION_WARNINGS
886 if (avctx->error_rate)
887 s->error_rate = avctx->error_rate;
888 FF_ENABLE_DEPRECATION_WARNINGS;
891 if (avctx->b_frame_strategy == 2) {
892 for (i = 0; i < s->max_b_frames + 2; i++) {
893 s->tmp_frames[i] = av_frame_alloc();
894 if (!s->tmp_frames[i])
895 return AVERROR(ENOMEM);
897 s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
898 s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
899 s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
901 ret = av_frame_get_buffer(s->tmp_frames[i], 32);
909 ff_MPV_encode_end(avctx);
910 return AVERROR_UNKNOWN;
913 av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
915 MpegEncContext *s = avctx->priv_data;
918 ff_rate_control_uninit(s);
920 ff_MPV_common_end(s);
921 if (CONFIG_MJPEG_ENCODER &&
922 s->out_format == FMT_MJPEG)
923 ff_mjpeg_encode_close(s);
925 av_freep(&avctx->extradata);
927 for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
928 av_frame_free(&s->tmp_frames[i]);
930 ff_free_picture_tables(&s->new_picture);
931 ff_mpeg_unref_picture(s, &s->new_picture);
933 av_freep(&s->avctx->stats_out);
934 av_freep(&s->ac_stats);
936 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
937 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
938 s->q_chroma_intra_matrix= NULL;
939 s->q_chroma_intra_matrix16= NULL;
940 av_freep(&s->q_intra_matrix);
941 av_freep(&s->q_inter_matrix);
942 av_freep(&s->q_intra_matrix16);
943 av_freep(&s->q_inter_matrix16);
944 av_freep(&s->input_picture);
945 av_freep(&s->reordered_input_picture);
946 av_freep(&s->dct_offset);
951 static int get_sae(uint8_t *src, int ref, int stride)
956 for (y = 0; y < 16; y++) {
957 for (x = 0; x < 16; x++) {
958 acc += FFABS(src[x + y * stride] - ref);
965 static int get_intra_count(MpegEncContext *s, uint8_t *src,
966 uint8_t *ref, int stride)
974 for (y = 0; y < h; y += 16) {
975 for (x = 0; x < w; x += 16) {
976 int offset = x + y * stride;
977 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
979 int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
980 int sae = get_sae(src + offset, mean, stride);
982 acc += sae + 500 < sad;
989 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
993 int i, display_picture_number = 0, ret;
994 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
995 (s->low_delay ? 0 : 1);
1000 display_picture_number = s->input_picture_number++;
1002 if (pts != AV_NOPTS_VALUE) {
1003 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1004 int64_t last = s->user_specified_pts;
1007 av_log(s->avctx, AV_LOG_ERROR,
1008 "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
1010 return AVERROR(EINVAL);
1013 if (!s->low_delay && display_picture_number == 1)
1014 s->dts_delta = pts - last;
1016 s->user_specified_pts = pts;
1018 if (s->user_specified_pts != AV_NOPTS_VALUE) {
1019 s->user_specified_pts =
1020 pts = s->user_specified_pts + 1;
1021 av_log(s->avctx, AV_LOG_INFO,
1022 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1025 pts = display_picture_number;
1031 if (!pic_arg->buf[0])
1033 if (pic_arg->linesize[0] != s->linesize)
1035 if (pic_arg->linesize[1] != s->uvlinesize)
1037 if (pic_arg->linesize[2] != s->uvlinesize)
1039 if ((s->width & 15) || (s->height & 15))
1042 av_dlog(s->avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1043 pic_arg->linesize[1], s->linesize, s->uvlinesize);
1046 i = ff_find_unused_picture(s, 1);
1050 pic = &s->picture[i];
1053 if ((ret = av_frame_ref(&pic->f, pic_arg)) < 0)
1055 if (ff_alloc_picture(s, pic, 1) < 0) {
1059 i = ff_find_unused_picture(s, 0);
1063 pic = &s->picture[i];
1066 if (ff_alloc_picture(s, pic, 0) < 0) {
1070 if (pic->f.data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1071 pic->f.data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1072 pic->f.data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1075 int h_chroma_shift, v_chroma_shift;
1076 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1080 for (i = 0; i < 3; i++) {
1081 int src_stride = pic_arg->linesize[i];
1082 int dst_stride = i ? s->uvlinesize : s->linesize;
1083 int h_shift = i ? h_chroma_shift : 0;
1084 int v_shift = i ? v_chroma_shift : 0;
1085 int w = s->width >> h_shift;
1086 int h = s->height >> v_shift;
1087 uint8_t *src = pic_arg->data[i];
1088 uint8_t *dst = pic->f.data[i];
1090 if (s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)) {
1091 h = ((s->height + 15)/16*16) >> v_shift;
1094 if (!s->avctx->rc_buffer_size)
1095 dst += INPLACE_OFFSET;
1097 if (src_stride == dst_stride)
1098 memcpy(dst, src, src_stride * h);
1101 uint8_t *dst2 = dst;
1103 memcpy(dst2, src, w);
1108 if ((s->width & 15) || (s->height & 15)) {
1109 s->dsp.draw_edges(dst, dst_stride,
1118 ret = av_frame_copy_props(&pic->f, pic_arg);
1122 pic->f.display_picture_number = display_picture_number;
1123 pic->f.pts = pts; // we set this here to avoid modifiying pic_arg
1126 /* shift buffer entries */
1127 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1128 s->input_picture[i - 1] = s->input_picture[i];
1130 s->input_picture[encoding_delay] = (Picture*) pic;
1135 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1139 int64_t score64 = 0;
1141 for (plane = 0; plane < 3; plane++) {
1142 const int stride = p->f.linesize[plane];
1143 const int bw = plane ? 1 : 2;
1144 for (y = 0; y < s->mb_height * bw; y++) {
1145 for (x = 0; x < s->mb_width * bw; x++) {
1146 int off = p->shared ? 0 : 16;
1147 uint8_t *dptr = p->f.data[plane] + 8 * (x + y * stride) + off;
1148 uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride);
1149 int v = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1151 switch (FFABS(s->avctx->frame_skip_exp)) {
1152 case 0: score = FFMAX(score, v); break;
1153 case 1: score += FFABS(v); break;
1154 case 2: score64 += v * (int64_t)v; break;
1155 case 3: score64 += FFABS(v * (int64_t)v * v); break;
1156 case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v); break;
1165 if (s->avctx->frame_skip_exp < 0)
1166 score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
1167 -1.0/s->avctx->frame_skip_exp);
1169 if (score64 < s->avctx->frame_skip_threshold)
1171 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1176 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1178 AVPacket pkt = { 0 };
1179 int ret, got_output;
1181 av_init_packet(&pkt);
1182 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1187 av_free_packet(&pkt);
1191 static int estimate_best_b_count(MpegEncContext *s)
1193 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1194 AVCodecContext *c = avcodec_alloc_context3(NULL);
1195 const int scale = s->avctx->brd_scale;
1196 int i, j, out_size, p_lambda, b_lambda, lambda2;
1197 int64_t best_rd = INT64_MAX;
1198 int best_b_count = -1;
1200 av_assert0(scale >= 0 && scale <= 3);
1203 //s->next_picture_ptr->quality;
1204 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1205 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1206 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1207 if (!b_lambda) // FIXME we should do this somewhere else
1208 b_lambda = p_lambda;
1209 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1212 c->width = s->width >> scale;
1213 c->height = s->height >> scale;
1214 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR |
1215 CODEC_FLAG_INPUT_PRESERVED;
1216 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1217 c->mb_decision = s->avctx->mb_decision;
1218 c->me_cmp = s->avctx->me_cmp;
1219 c->mb_cmp = s->avctx->mb_cmp;
1220 c->me_sub_cmp = s->avctx->me_sub_cmp;
1221 c->pix_fmt = AV_PIX_FMT_YUV420P;
1222 c->time_base = s->avctx->time_base;
1223 c->max_b_frames = s->max_b_frames;
1225 if (avcodec_open2(c, codec, NULL) < 0)
1228 for (i = 0; i < s->max_b_frames + 2; i++) {
1229 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1230 s->next_picture_ptr;
1232 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1233 pre_input = *pre_input_ptr;
1235 if (!pre_input.shared && i) {
1236 pre_input.f.data[0] += INPLACE_OFFSET;
1237 pre_input.f.data[1] += INPLACE_OFFSET;
1238 pre_input.f.data[2] += INPLACE_OFFSET;
1241 s->dsp.shrink[scale](s->tmp_frames[i]->data[0], s->tmp_frames[i]->linesize[0],
1242 pre_input.f.data[0], pre_input.f.linesize[0],
1243 c->width, c->height);
1244 s->dsp.shrink[scale](s->tmp_frames[i]->data[1], s->tmp_frames[i]->linesize[1],
1245 pre_input.f.data[1], pre_input.f.linesize[1],
1246 c->width >> 1, c->height >> 1);
1247 s->dsp.shrink[scale](s->tmp_frames[i]->data[2], s->tmp_frames[i]->linesize[2],
1248 pre_input.f.data[2], pre_input.f.linesize[2],
1249 c->width >> 1, c->height >> 1);
1253 for (j = 0; j < s->max_b_frames + 1; j++) {
1256 if (!s->input_picture[j])
1259 c->error[0] = c->error[1] = c->error[2] = 0;
1261 s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
1262 s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1264 out_size = encode_frame(c, s->tmp_frames[0]);
1266 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1268 for (i = 0; i < s->max_b_frames + 1; i++) {
1269 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1271 s->tmp_frames[i + 1]->pict_type = is_p ?
1272 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1273 s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1275 out_size = encode_frame(c, s->tmp_frames[i + 1]);
1277 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1280 /* get the delayed frames */
1282 out_size = encode_frame(c, NULL);
1283 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1286 rd += c->error[0] + c->error[1] + c->error[2];
1297 return best_b_count;
1300 static int select_input_picture(MpegEncContext *s)
1304 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1305 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1306 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1308 /* set next picture type & ordering */
1309 if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1310 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1311 if (s->picture_in_gop_number < s->gop_size &&
1312 s->next_picture_ptr &&
1313 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1314 // FIXME check that te gop check above is +-1 correct
1315 av_frame_unref(&s->input_picture[0]->f);
1317 ff_vbv_update(s, 0);
1323 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1324 s->next_picture_ptr == NULL || s->intra_only) {
1325 s->reordered_input_picture[0] = s->input_picture[0];
1326 s->reordered_input_picture[0]->f.pict_type = AV_PICTURE_TYPE_I;
1327 s->reordered_input_picture[0]->f.coded_picture_number =
1328 s->coded_picture_number++;
1332 if (s->flags & CODEC_FLAG_PASS2) {
1333 for (i = 0; i < s->max_b_frames + 1; i++) {
1334 int pict_num = s->input_picture[0]->f.display_picture_number + i;
1336 if (pict_num >= s->rc_context.num_entries)
1338 if (!s->input_picture[i]) {
1339 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1343 s->input_picture[i]->f.pict_type =
1344 s->rc_context.entry[pict_num].new_pict_type;
1348 if (s->avctx->b_frame_strategy == 0) {
1349 b_frames = s->max_b_frames;
1350 while (b_frames && !s->input_picture[b_frames])
1352 } else if (s->avctx->b_frame_strategy == 1) {
1353 for (i = 1; i < s->max_b_frames + 1; i++) {
1354 if (s->input_picture[i] &&
1355 s->input_picture[i]->b_frame_score == 0) {
1356 s->input_picture[i]->b_frame_score =
1358 s->input_picture[i ]->f.data[0],
1359 s->input_picture[i - 1]->f.data[0],
1363 for (i = 0; i < s->max_b_frames + 1; i++) {
1364 if (s->input_picture[i] == NULL ||
1365 s->input_picture[i]->b_frame_score - 1 >
1366 s->mb_num / s->avctx->b_sensitivity)
1370 b_frames = FFMAX(0, i - 1);
1373 for (i = 0; i < b_frames + 1; i++) {
1374 s->input_picture[i]->b_frame_score = 0;
1376 } else if (s->avctx->b_frame_strategy == 2) {
1377 b_frames = estimate_best_b_count(s);
1379 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1385 for (i = b_frames - 1; i >= 0; i--) {
1386 int type = s->input_picture[i]->f.pict_type;
1387 if (type && type != AV_PICTURE_TYPE_B)
1390 if (s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_B &&
1391 b_frames == s->max_b_frames) {
1392 av_log(s->avctx, AV_LOG_ERROR,
1393 "warning, too many b frames in a row\n");
1396 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1397 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1398 s->gop_size > s->picture_in_gop_number) {
1399 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1401 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1403 s->input_picture[b_frames]->f.pict_type = AV_PICTURE_TYPE_I;
1407 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1408 s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_I)
1411 s->reordered_input_picture[0] = s->input_picture[b_frames];
1412 if (s->reordered_input_picture[0]->f.pict_type != AV_PICTURE_TYPE_I)
1413 s->reordered_input_picture[0]->f.pict_type = AV_PICTURE_TYPE_P;
1414 s->reordered_input_picture[0]->f.coded_picture_number =
1415 s->coded_picture_number++;
1416 for (i = 0; i < b_frames; i++) {
1417 s->reordered_input_picture[i + 1] = s->input_picture[i];
1418 s->reordered_input_picture[i + 1]->f.pict_type =
1420 s->reordered_input_picture[i + 1]->f.coded_picture_number =
1421 s->coded_picture_number++;
1426 if (s->reordered_input_picture[0]) {
1427 s->reordered_input_picture[0]->reference =
1428 s->reordered_input_picture[0]->f.pict_type !=
1429 AV_PICTURE_TYPE_B ? 3 : 0;
1431 ff_mpeg_unref_picture(s, &s->new_picture);
1432 if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1435 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1436 // input is a shared pix, so we can't modifiy it -> alloc a new
1437 // one & ensure that the shared one is reuseable
1440 int i = ff_find_unused_picture(s, 0);
1443 pic = &s->picture[i];
1445 pic->reference = s->reordered_input_picture[0]->reference;
1446 if (ff_alloc_picture(s, pic, 0) < 0) {
1450 ret = av_frame_copy_props(&pic->f, &s->reordered_input_picture[0]->f);
1454 /* mark us unused / free shared pic */
1455 av_frame_unref(&s->reordered_input_picture[0]->f);
1456 s->reordered_input_picture[0]->shared = 0;
1458 s->current_picture_ptr = pic;
1460 // input is not a shared pix -> reuse buffer for current_pix
1461 s->current_picture_ptr = s->reordered_input_picture[0];
1462 for (i = 0; i < 4; i++) {
1463 s->new_picture.f.data[i] += INPLACE_OFFSET;
1466 ff_mpeg_unref_picture(s, &s->current_picture);
1467 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1468 s->current_picture_ptr)) < 0)
1471 s->picture_number = s->new_picture.f.display_picture_number;
1473 ff_mpeg_unref_picture(s, &s->new_picture);
1478 static void frame_end(MpegEncContext *s)
1480 if (s->unrestricted_mv &&
1481 s->current_picture.reference &&
1483 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1484 int hshift = desc->log2_chroma_w;
1485 int vshift = desc->log2_chroma_h;
1486 s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
1487 s->h_edge_pos, s->v_edge_pos,
1488 EDGE_WIDTH, EDGE_WIDTH,
1489 EDGE_TOP | EDGE_BOTTOM);
1490 s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
1491 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1492 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1493 EDGE_TOP | EDGE_BOTTOM);
1494 s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
1495 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1496 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1497 EDGE_TOP | EDGE_BOTTOM);
1502 s->last_pict_type = s->pict_type;
1503 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality;
1504 if (s->pict_type!= AV_PICTURE_TYPE_B)
1505 s->last_non_b_pict_type = s->pict_type;
1507 s->avctx->coded_frame = &s->current_picture_ptr->f;
1511 static void update_noise_reduction(MpegEncContext *s)
1515 for (intra = 0; intra < 2; intra++) {
1516 if (s->dct_count[intra] > (1 << 16)) {
1517 for (i = 0; i < 64; i++) {
1518 s->dct_error_sum[intra][i] >>= 1;
1520 s->dct_count[intra] >>= 1;
1523 for (i = 0; i < 64; i++) {
1524 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1525 s->dct_count[intra] +
1526 s->dct_error_sum[intra][i] / 2) /
1527 (s->dct_error_sum[intra][i] + 1);
1532 static int frame_start(MpegEncContext *s)
1536 /* mark & release old frames */
1537 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1538 s->last_picture_ptr != s->next_picture_ptr &&
1539 s->last_picture_ptr->f.buf[0]) {
1540 ff_mpeg_unref_picture(s, s->last_picture_ptr);
1543 s->current_picture_ptr->f.pict_type = s->pict_type;
1544 s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1546 ff_mpeg_unref_picture(s, &s->current_picture);
1547 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1548 s->current_picture_ptr)) < 0)
1551 if (s->pict_type != AV_PICTURE_TYPE_B) {
1552 s->last_picture_ptr = s->next_picture_ptr;
1554 s->next_picture_ptr = s->current_picture_ptr;
1557 if (s->last_picture_ptr) {
1558 ff_mpeg_unref_picture(s, &s->last_picture);
1559 if (s->last_picture_ptr->f.buf[0] &&
1560 (ret = ff_mpeg_ref_picture(s, &s->last_picture,
1561 s->last_picture_ptr)) < 0)
1564 if (s->next_picture_ptr) {
1565 ff_mpeg_unref_picture(s, &s->next_picture);
1566 if (s->next_picture_ptr->f.buf[0] &&
1567 (ret = ff_mpeg_ref_picture(s, &s->next_picture,
1568 s->next_picture_ptr)) < 0)
1572 if (s->picture_structure!= PICT_FRAME) {
1574 for (i = 0; i < 4; i++) {
1575 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1576 s->current_picture.f.data[i] +=
1577 s->current_picture.f.linesize[i];
1579 s->current_picture.f.linesize[i] *= 2;
1580 s->last_picture.f.linesize[i] *= 2;
1581 s->next_picture.f.linesize[i] *= 2;
1585 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1586 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1587 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1588 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1589 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1590 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1592 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1593 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1596 if (s->dct_error_sum) {
1597 av_assert2(s->avctx->noise_reduction && s->encoding);
1598 update_noise_reduction(s);
1604 int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1605 AVFrame *pic_arg, int *got_packet)
1607 MpegEncContext *s = avctx->priv_data;
1608 int i, stuffing_count, ret;
1609 int context_count = s->slice_context_count;
1611 s->picture_in_gop_number++;
1613 if (load_input_picture(s, pic_arg) < 0)
1616 if (select_input_picture(s) < 0) {
1621 if (s->new_picture.f.data[0]) {
1622 if ((ret = ff_alloc_packet2(avctx, pkt, s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000)) < 0)
1625 s->mb_info_ptr = av_packet_new_side_data(pkt,
1626 AV_PKT_DATA_H263_MB_INFO,
1627 s->mb_width*s->mb_height*12);
1628 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1631 for (i = 0; i < context_count; i++) {
1632 int start_y = s->thread_context[i]->start_mb_y;
1633 int end_y = s->thread_context[i]-> end_mb_y;
1634 int h = s->mb_height;
1635 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1636 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1638 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1641 s->pict_type = s->new_picture.f.pict_type;
1643 ret = frame_start(s);
1647 if (encode_picture(s, s->picture_number) < 0)
1650 avctx->header_bits = s->header_bits;
1651 avctx->mv_bits = s->mv_bits;
1652 avctx->misc_bits = s->misc_bits;
1653 avctx->i_tex_bits = s->i_tex_bits;
1654 avctx->p_tex_bits = s->p_tex_bits;
1655 avctx->i_count = s->i_count;
1656 // FIXME f/b_count in avctx
1657 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1658 avctx->skip_count = s->skip_count;
1662 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1663 ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
1665 if (avctx->rc_buffer_size) {
1666 RateControlContext *rcc = &s->rc_context;
1667 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1669 if (put_bits_count(&s->pb) > max_size &&
1670 s->lambda < s->avctx->lmax) {
1671 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1672 (s->qscale + 1) / s->qscale);
1673 if (s->adaptive_quant) {
1675 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1676 s->lambda_table[i] =
1677 FFMAX(s->lambda_table[i] + 1,
1678 s->lambda_table[i] * (s->qscale + 1) /
1681 s->mb_skipped = 0; // done in frame_start()
1682 // done in encode_picture() so we must undo it
1683 if (s->pict_type == AV_PICTURE_TYPE_P) {
1684 if (s->flipflop_rounding ||
1685 s->codec_id == AV_CODEC_ID_H263P ||
1686 s->codec_id == AV_CODEC_ID_MPEG4)
1687 s->no_rounding ^= 1;
1689 if (s->pict_type != AV_PICTURE_TYPE_B) {
1690 s->time_base = s->last_time_base;
1691 s->last_non_b_time = s->time - s->pp_time;
1693 for (i = 0; i < context_count; i++) {
1694 PutBitContext *pb = &s->thread_context[i]->pb;
1695 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1700 assert(s->avctx->rc_max_rate);
1703 if (s->flags & CODEC_FLAG_PASS1)
1704 ff_write_pass1_stats(s);
1706 for (i = 0; i < 4; i++) {
1707 s->current_picture_ptr->f.error[i] = s->current_picture.f.error[i];
1708 avctx->error[i] += s->current_picture_ptr->f.error[i];
1711 if (s->flags & CODEC_FLAG_PASS1)
1712 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1713 avctx->i_tex_bits + avctx->p_tex_bits ==
1714 put_bits_count(&s->pb));
1715 flush_put_bits(&s->pb);
1716 s->frame_bits = put_bits_count(&s->pb);
1718 stuffing_count = ff_vbv_update(s, s->frame_bits);
1719 s->stuffing_bits = 8*stuffing_count;
1720 if (stuffing_count) {
1721 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1722 stuffing_count + 50) {
1723 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1727 switch (s->codec_id) {
1728 case AV_CODEC_ID_MPEG1VIDEO:
1729 case AV_CODEC_ID_MPEG2VIDEO:
1730 while (stuffing_count--) {
1731 put_bits(&s->pb, 8, 0);
1734 case AV_CODEC_ID_MPEG4:
1735 put_bits(&s->pb, 16, 0);
1736 put_bits(&s->pb, 16, 0x1C3);
1737 stuffing_count -= 4;
1738 while (stuffing_count--) {
1739 put_bits(&s->pb, 8, 0xFF);
1743 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1745 flush_put_bits(&s->pb);
1746 s->frame_bits = put_bits_count(&s->pb);
1749 /* update mpeg1/2 vbv_delay for CBR */
1750 if (s->avctx->rc_max_rate &&
1751 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1752 s->out_format == FMT_MPEG1 &&
1753 90000LL * (avctx->rc_buffer_size - 1) <=
1754 s->avctx->rc_max_rate * 0xFFFFLL) {
1755 int vbv_delay, min_delay;
1756 double inbits = s->avctx->rc_max_rate *
1757 av_q2d(s->avctx->time_base);
1758 int minbits = s->frame_bits - 8 *
1759 (s->vbv_delay_ptr - s->pb.buf - 1);
1760 double bits = s->rc_context.buffer_index + minbits - inbits;
1763 av_log(s->avctx, AV_LOG_ERROR,
1764 "Internal error, negative bits\n");
1766 assert(s->repeat_first_field == 0);
1768 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1769 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1770 s->avctx->rc_max_rate;
1772 vbv_delay = FFMAX(vbv_delay, min_delay);
1774 av_assert0(vbv_delay < 0xFFFF);
1776 s->vbv_delay_ptr[0] &= 0xF8;
1777 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1778 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1779 s->vbv_delay_ptr[2] &= 0x07;
1780 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1781 avctx->vbv_delay = vbv_delay * 300;
1783 s->total_bits += s->frame_bits;
1784 avctx->frame_bits = s->frame_bits;
1786 pkt->pts = s->current_picture.f.pts;
1787 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1788 if (!s->current_picture.f.coded_picture_number)
1789 pkt->dts = pkt->pts - s->dts_delta;
1791 pkt->dts = s->reordered_pts;
1792 s->reordered_pts = pkt->pts;
1794 pkt->dts = pkt->pts;
1795 if (s->current_picture.f.key_frame)
1796 pkt->flags |= AV_PKT_FLAG_KEY;
1798 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1803 /* release non-reference frames */
1804 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1805 if (!s->picture[i].reference)
1806 ff_mpeg_unref_picture(s, &s->picture[i]);
1809 assert((s->frame_bits & 7) == 0);
1811 pkt->size = s->frame_bits / 8;
1812 *got_packet = !!pkt->size;
1816 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1817 int n, int threshold)
1819 static const char tab[64] = {
1820 3, 2, 2, 1, 1, 1, 1, 1,
1821 1, 1, 1, 1, 1, 1, 1, 1,
1822 1, 1, 1, 1, 1, 1, 1, 1,
1823 0, 0, 0, 0, 0, 0, 0, 0,
1824 0, 0, 0, 0, 0, 0, 0, 0,
1825 0, 0, 0, 0, 0, 0, 0, 0,
1826 0, 0, 0, 0, 0, 0, 0, 0,
1827 0, 0, 0, 0, 0, 0, 0, 0
1832 int16_t *block = s->block[n];
1833 const int last_index = s->block_last_index[n];
1836 if (threshold < 0) {
1838 threshold = -threshold;
1842 /* Are all we could set to zero already zero? */
1843 if (last_index <= skip_dc - 1)
1846 for (i = 0; i <= last_index; i++) {
1847 const int j = s->intra_scantable.permutated[i];
1848 const int level = FFABS(block[j]);
1850 if (skip_dc && i == 0)
1854 } else if (level > 1) {
1860 if (score >= threshold)
1862 for (i = skip_dc; i <= last_index; i++) {
1863 const int j = s->intra_scantable.permutated[i];
1867 s->block_last_index[n] = 0;
1869 s->block_last_index[n] = -1;
1872 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1876 const int maxlevel = s->max_qcoeff;
1877 const int minlevel = s->min_qcoeff;
1881 i = 1; // skip clipping of intra dc
1885 for (; i <= last_index; i++) {
1886 const int j = s->intra_scantable.permutated[i];
1887 int level = block[j];
1889 if (level > maxlevel) {
1892 } else if (level < minlevel) {
1900 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1901 av_log(s->avctx, AV_LOG_INFO,
1902 "warning, clipping %d dct coefficients to %d..%d\n",
1903 overflow, minlevel, maxlevel);
1906 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1910 for (y = 0; y < 8; y++) {
1911 for (x = 0; x < 8; x++) {
1917 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1918 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1919 int v = ptr[x2 + y2 * stride];
1925 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1930 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1931 int motion_x, int motion_y,
1932 int mb_block_height,
1936 int16_t weight[12][64];
1937 int16_t orig[12][64];
1938 const int mb_x = s->mb_x;
1939 const int mb_y = s->mb_y;
1942 int dct_offset = s->linesize * 8; // default for progressive frames
1943 int uv_dct_offset = s->uvlinesize * 8;
1944 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1945 ptrdiff_t wrap_y, wrap_c;
1947 for (i = 0; i < mb_block_count; i++)
1948 skip_dct[i] = s->skipdct;
1950 if (s->adaptive_quant) {
1951 const int last_qp = s->qscale;
1952 const int mb_xy = mb_x + mb_y * s->mb_stride;
1954 s->lambda = s->lambda_table[mb_xy];
1957 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1958 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1959 s->dquant = s->qscale - last_qp;
1961 if (s->out_format == FMT_H263) {
1962 s->dquant = av_clip(s->dquant, -2, 2);
1964 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1966 if (s->pict_type == AV_PICTURE_TYPE_B) {
1967 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1970 if (s->mv_type == MV_TYPE_8X8)
1976 ff_set_qscale(s, last_qp + s->dquant);
1977 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1978 ff_set_qscale(s, s->qscale + s->dquant);
1980 wrap_y = s->linesize;
1981 wrap_c = s->uvlinesize;
1982 ptr_y = s->new_picture.f.data[0] +
1983 (mb_y * 16 * wrap_y) + mb_x * 16;
1984 ptr_cb = s->new_picture.f.data[1] +
1985 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1986 ptr_cr = s->new_picture.f.data[2] +
1987 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1989 if((mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
1990 uint8_t *ebuf = s->edge_emu_buffer + 32;
1991 int cw = (s->width + s->chroma_x_shift) >> s->chroma_x_shift;
1992 int ch = (s->height + s->chroma_y_shift) >> s->chroma_y_shift;
1993 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
1995 16, 16, mb_x * 16, mb_y * 16,
1996 s->width, s->height);
1998 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
2000 mb_block_width, mb_block_height,
2001 mb_x * mb_block_width, mb_y * mb_block_height,
2003 ptr_cb = ebuf + 18 * wrap_y;
2004 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 16, ptr_cr,
2006 mb_block_width, mb_block_height,
2007 mb_x * mb_block_width, mb_y * mb_block_height,
2009 ptr_cr = ebuf + 18 * wrap_y + 16;
2013 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
2014 int progressive_score, interlaced_score;
2016 s->interlaced_dct = 0;
2017 progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
2019 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
2020 NULL, wrap_y, 8) - 400;
2022 if (progressive_score > 0) {
2023 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
2024 NULL, wrap_y * 2, 8) +
2025 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
2026 NULL, wrap_y * 2, 8);
2027 if (progressive_score > interlaced_score) {
2028 s->interlaced_dct = 1;
2030 dct_offset = wrap_y;
2031 uv_dct_offset = wrap_c;
2033 if (s->chroma_format == CHROMA_422 ||
2034 s->chroma_format == CHROMA_444)
2040 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
2041 s->dsp.get_pixels(s->block[1], ptr_y + 8 , wrap_y);
2042 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
2043 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
2045 if (s->flags & CODEC_FLAG_GRAY) {
2049 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2050 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2051 if (!s->chroma_y_shift && s->chroma_x_shift) { /* 422 */
2052 s->dsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2053 s->dsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2054 } else if (!s->chroma_y_shift && !s->chroma_x_shift) { /* 444 */
2055 s->dsp.get_pixels(s->block[6], ptr_cb + 8, wrap_c);
2056 s->dsp.get_pixels(s->block[7], ptr_cr + 8, wrap_c);
2057 s->dsp.get_pixels(s->block[8], ptr_cb + uv_dct_offset, wrap_c);
2058 s->dsp.get_pixels(s->block[9], ptr_cr + uv_dct_offset, wrap_c);
2059 s->dsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2060 s->dsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2064 op_pixels_func (*op_pix)[4];
2065 qpel_mc_func (*op_qpix)[16];
2066 uint8_t *dest_y, *dest_cb, *dest_cr;
2068 dest_y = s->dest[0];
2069 dest_cb = s->dest[1];
2070 dest_cr = s->dest[2];
2072 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2073 op_pix = s->hdsp.put_pixels_tab;
2074 op_qpix = s->dsp.put_qpel_pixels_tab;
2076 op_pix = s->hdsp.put_no_rnd_pixels_tab;
2077 op_qpix = s->dsp.put_no_rnd_qpel_pixels_tab;
2080 if (s->mv_dir & MV_DIR_FORWARD) {
2081 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
2082 s->last_picture.f.data,
2084 op_pix = s->hdsp.avg_pixels_tab;
2085 op_qpix = s->dsp.avg_qpel_pixels_tab;
2087 if (s->mv_dir & MV_DIR_BACKWARD) {
2088 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
2089 s->next_picture.f.data,
2093 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
2094 int progressive_score, interlaced_score;
2096 s->interlaced_dct = 0;
2097 progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
2100 s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
2101 ptr_y + wrap_y * 8, wrap_y,
2104 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
2105 progressive_score -= 400;
2107 if (progressive_score > 0) {
2108 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
2111 s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
2115 if (progressive_score > interlaced_score) {
2116 s->interlaced_dct = 1;
2118 dct_offset = wrap_y;
2119 uv_dct_offset = wrap_c;
2121 if (s->chroma_format == CHROMA_422)
2127 s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2128 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2129 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2130 dest_y + dct_offset, wrap_y);
2131 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2132 dest_y + dct_offset + 8, wrap_y);
2134 if (s->flags & CODEC_FLAG_GRAY) {
2138 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2139 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2140 if (!s->chroma_y_shift) { /* 422 */
2141 s->dsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
2142 dest_cb + uv_dct_offset, wrap_c);
2143 s->dsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
2144 dest_cr + uv_dct_offset, wrap_c);
2147 /* pre quantization */
2148 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
2149 2 * s->qscale * s->qscale) {
2151 if (s->dsp.sad[1](NULL, ptr_y , dest_y,
2152 wrap_y, 8) < 20 * s->qscale)
2154 if (s->dsp.sad[1](NULL, ptr_y + 8,
2155 dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2157 if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
2158 dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
2160 if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
2161 dest_y + dct_offset + 8,
2162 wrap_y, 8) < 20 * s->qscale)
2164 if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
2165 wrap_c, 8) < 20 * s->qscale)
2167 if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
2168 wrap_c, 8) < 20 * s->qscale)
2170 if (!s->chroma_y_shift) { /* 422 */
2171 if (s->dsp.sad[1](NULL, ptr_cb + uv_dct_offset,
2172 dest_cb + uv_dct_offset,
2173 wrap_c, 8) < 20 * s->qscale)
2175 if (s->dsp.sad[1](NULL, ptr_cr + uv_dct_offset,
2176 dest_cr + uv_dct_offset,
2177 wrap_c, 8) < 20 * s->qscale)
2183 if (s->quantizer_noise_shaping) {
2185 get_visual_weight(weight[0], ptr_y , wrap_y);
2187 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2189 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2191 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2193 get_visual_weight(weight[4], ptr_cb , wrap_c);
2195 get_visual_weight(weight[5], ptr_cr , wrap_c);
2196 if (!s->chroma_y_shift) { /* 422 */
2198 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2201 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2204 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2207 /* DCT & quantize */
2208 av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
2210 for (i = 0; i < mb_block_count; i++) {
2213 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2214 // FIXME we could decide to change to quantizer instead of
2216 // JS: I don't think that would be a good idea it could lower
2217 // quality instead of improve it. Just INTRADC clipping
2218 // deserves changes in quantizer
2220 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2222 s->block_last_index[i] = -1;
2224 if (s->quantizer_noise_shaping) {
2225 for (i = 0; i < mb_block_count; i++) {
2227 s->block_last_index[i] =
2228 dct_quantize_refine(s, s->block[i], weight[i],
2229 orig[i], i, s->qscale);
2234 if (s->luma_elim_threshold && !s->mb_intra)
2235 for (i = 0; i < 4; i++)
2236 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2237 if (s->chroma_elim_threshold && !s->mb_intra)
2238 for (i = 4; i < mb_block_count; i++)
2239 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2241 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2242 for (i = 0; i < mb_block_count; i++) {
2243 if (s->block_last_index[i] == -1)
2244 s->coded_score[i] = INT_MAX / 256;
2249 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2250 s->block_last_index[4] =
2251 s->block_last_index[5] = 0;
2253 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2254 if (!s->chroma_y_shift) { /* 422 / 444 */
2255 for (i=6; i<12; i++) {
2256 s->block_last_index[i] = 0;
2257 s->block[i][0] = s->block[4][0];
2262 // non c quantize code returns incorrect block_last_index FIXME
2263 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2264 for (i = 0; i < mb_block_count; i++) {
2266 if (s->block_last_index[i] > 0) {
2267 for (j = 63; j > 0; j--) {
2268 if (s->block[i][s->intra_scantable.permutated[j]])
2271 s->block_last_index[i] = j;
2276 /* huffman encode */
2277 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2278 case AV_CODEC_ID_MPEG1VIDEO:
2279 case AV_CODEC_ID_MPEG2VIDEO:
2280 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2281 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2283 case AV_CODEC_ID_MPEG4:
2284 if (CONFIG_MPEG4_ENCODER)
2285 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2287 case AV_CODEC_ID_MSMPEG4V2:
2288 case AV_CODEC_ID_MSMPEG4V3:
2289 case AV_CODEC_ID_WMV1:
2290 if (CONFIG_MSMPEG4_ENCODER)
2291 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2293 case AV_CODEC_ID_WMV2:
2294 if (CONFIG_WMV2_ENCODER)
2295 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2297 case AV_CODEC_ID_H261:
2298 if (CONFIG_H261_ENCODER)
2299 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2301 case AV_CODEC_ID_H263:
2302 case AV_CODEC_ID_H263P:
2303 case AV_CODEC_ID_FLV1:
2304 case AV_CODEC_ID_RV10:
2305 case AV_CODEC_ID_RV20:
2306 if (CONFIG_H263_ENCODER)
2307 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2309 case AV_CODEC_ID_MJPEG:
2310 case AV_CODEC_ID_AMV:
2311 if (CONFIG_MJPEG_ENCODER)
2312 ff_mjpeg_encode_mb(s, s->block);
2319 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2321 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 8, 6);
2322 else if (s->chroma_format == CHROMA_422) encode_mb_internal(s, motion_x, motion_y, 16, 8, 8);
2323 else encode_mb_internal(s, motion_x, motion_y, 16, 16, 12);
2326 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2329 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2332 d->mb_skip_run= s->mb_skip_run;
2334 d->last_dc[i] = s->last_dc[i];
2337 d->mv_bits= s->mv_bits;
2338 d->i_tex_bits= s->i_tex_bits;
2339 d->p_tex_bits= s->p_tex_bits;
2340 d->i_count= s->i_count;
2341 d->f_count= s->f_count;
2342 d->b_count= s->b_count;
2343 d->skip_count= s->skip_count;
2344 d->misc_bits= s->misc_bits;
2348 d->qscale= s->qscale;
2349 d->dquant= s->dquant;
2351 d->esc3_level_length= s->esc3_level_length;
2354 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2357 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2358 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2361 d->mb_skip_run= s->mb_skip_run;
2363 d->last_dc[i] = s->last_dc[i];
2366 d->mv_bits= s->mv_bits;
2367 d->i_tex_bits= s->i_tex_bits;
2368 d->p_tex_bits= s->p_tex_bits;
2369 d->i_count= s->i_count;
2370 d->f_count= s->f_count;
2371 d->b_count= s->b_count;
2372 d->skip_count= s->skip_count;
2373 d->misc_bits= s->misc_bits;
2375 d->mb_intra= s->mb_intra;
2376 d->mb_skipped= s->mb_skipped;
2377 d->mv_type= s->mv_type;
2378 d->mv_dir= s->mv_dir;
2380 if(s->data_partitioning){
2382 d->tex_pb= s->tex_pb;
2386 d->block_last_index[i]= s->block_last_index[i];
2387 d->interlaced_dct= s->interlaced_dct;
2388 d->qscale= s->qscale;
2390 d->esc3_level_length= s->esc3_level_length;
2393 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2394 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2395 int *dmin, int *next_block, int motion_x, int motion_y)
2398 uint8_t *dest_backup[3];
2400 copy_context_before_encode(s, backup, type);
2402 s->block= s->blocks[*next_block];
2403 s->pb= pb[*next_block];
2404 if(s->data_partitioning){
2405 s->pb2 = pb2 [*next_block];
2406 s->tex_pb= tex_pb[*next_block];
2410 memcpy(dest_backup, s->dest, sizeof(s->dest));
2411 s->dest[0] = s->rd_scratchpad;
2412 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2413 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2414 assert(s->linesize >= 32); //FIXME
2417 encode_mb(s, motion_x, motion_y);
2419 score= put_bits_count(&s->pb);
2420 if(s->data_partitioning){
2421 score+= put_bits_count(&s->pb2);
2422 score+= put_bits_count(&s->tex_pb);
2425 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2426 ff_MPV_decode_mb(s, s->block);
2428 score *= s->lambda2;
2429 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2433 memcpy(s->dest, dest_backup, sizeof(s->dest));
2440 copy_context_after_encode(best, s, type);
2444 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2445 uint32_t *sq = ff_squareTbl + 256;
2450 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
2451 else if(w==8 && h==8)
2452 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
2456 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2465 static int sse_mb(MpegEncContext *s){
2469 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2470 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2473 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2474 return s->dsp.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)
2475 +s->dsp.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)
2476 +s->dsp.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);
2478 return s->dsp.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)
2479 +s->dsp.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)
2480 +s->dsp.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);
2483 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)
2484 +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)
2485 +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);
2488 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2489 MpegEncContext *s= *(void**)arg;
2493 s->me.dia_size= s->avctx->pre_dia_size;
2494 s->first_slice_line=1;
2495 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2496 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2497 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2499 s->first_slice_line=0;
2507 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2508 MpegEncContext *s= *(void**)arg;
2510 ff_check_alignment();
2512 s->me.dia_size= s->avctx->dia_size;
2513 s->first_slice_line=1;
2514 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2515 s->mb_x=0; //for block init below
2516 ff_init_block_index(s);
2517 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2518 s->block_index[0]+=2;
2519 s->block_index[1]+=2;
2520 s->block_index[2]+=2;
2521 s->block_index[3]+=2;
2523 /* compute motion vector & mb_type and store in context */
2524 if(s->pict_type==AV_PICTURE_TYPE_B)
2525 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2527 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2529 s->first_slice_line=0;
2534 static int mb_var_thread(AVCodecContext *c, void *arg){
2535 MpegEncContext *s= *(void**)arg;
2538 ff_check_alignment();
2540 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2541 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2544 uint8_t *pix = s->new_picture.f.data[0] + (yy * s->linesize) + xx;
2546 int sum = s->dsp.pix_sum(pix, s->linesize);
2548 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
2550 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2551 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2552 s->me.mb_var_sum_temp += varc;
2558 static void write_slice_end(MpegEncContext *s){
2559 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2560 if(s->partitioned_frame){
2561 ff_mpeg4_merge_partitions(s);
2564 ff_mpeg4_stuffing(&s->pb);
2565 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2566 ff_mjpeg_encode_stuffing(s);
2569 avpriv_align_put_bits(&s->pb);
2570 flush_put_bits(&s->pb);
2572 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2573 s->misc_bits+= get_bits_diff(s);
2576 static void write_mb_info(MpegEncContext *s)
2578 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2579 int offset = put_bits_count(&s->pb);
2580 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2581 int gobn = s->mb_y / s->gob_index;
2583 if (CONFIG_H263_ENCODER)
2584 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2585 bytestream_put_le32(&ptr, offset);
2586 bytestream_put_byte(&ptr, s->qscale);
2587 bytestream_put_byte(&ptr, gobn);
2588 bytestream_put_le16(&ptr, mba);
2589 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2590 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2591 /* 4MV not implemented */
2592 bytestream_put_byte(&ptr, 0); /* hmv2 */
2593 bytestream_put_byte(&ptr, 0); /* vmv2 */
2596 static void update_mb_info(MpegEncContext *s, int startcode)
2600 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2601 s->mb_info_size += 12;
2602 s->prev_mb_info = s->last_mb_info;
2605 s->prev_mb_info = put_bits_count(&s->pb)/8;
2606 /* This might have incremented mb_info_size above, and we return without
2607 * actually writing any info into that slot yet. But in that case,
2608 * this will be called again at the start of the after writing the
2609 * start code, actually writing the mb info. */
2613 s->last_mb_info = put_bits_count(&s->pb)/8;
2614 if (!s->mb_info_size)
2615 s->mb_info_size += 12;
2619 static int encode_thread(AVCodecContext *c, void *arg){
2620 MpegEncContext *s= *(void**)arg;
2621 int mb_x, mb_y, pdif = 0;
2622 int chr_h= 16>>s->chroma_y_shift;
2624 MpegEncContext best_s, backup_s;
2625 uint8_t bit_buf[2][MAX_MB_BYTES];
2626 uint8_t bit_buf2[2][MAX_MB_BYTES];
2627 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2628 PutBitContext pb[2], pb2[2], tex_pb[2];
2630 ff_check_alignment();
2633 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2634 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2635 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2638 s->last_bits= put_bits_count(&s->pb);
2649 /* init last dc values */
2650 /* note: quant matrix value (8) is implied here */
2651 s->last_dc[i] = 128 << s->intra_dc_precision;
2653 s->current_picture.f.error[i] = 0;
2655 if(s->codec_id==AV_CODEC_ID_AMV){
2656 s->last_dc[0] = 128*8/13;
2657 s->last_dc[1] = 128*8/14;
2658 s->last_dc[2] = 128*8/14;
2661 memset(s->last_mv, 0, sizeof(s->last_mv));
2665 switch(s->codec_id){
2666 case AV_CODEC_ID_H263:
2667 case AV_CODEC_ID_H263P:
2668 case AV_CODEC_ID_FLV1:
2669 if (CONFIG_H263_ENCODER)
2670 s->gob_index = ff_h263_get_gob_height(s);
2672 case AV_CODEC_ID_MPEG4:
2673 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2674 ff_mpeg4_init_partitions(s);
2680 s->first_slice_line = 1;
2681 s->ptr_lastgob = s->pb.buf;
2682 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2686 ff_set_qscale(s, s->qscale);
2687 ff_init_block_index(s);
2689 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2690 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2691 int mb_type= s->mb_type[xy];
2696 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2697 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2700 if(s->data_partitioning){
2701 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2702 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2703 av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
2709 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2710 ff_update_block_index(s);
2712 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2713 ff_h261_reorder_mb_index(s);
2714 xy= s->mb_y*s->mb_stride + s->mb_x;
2715 mb_type= s->mb_type[xy];
2718 /* write gob / video packet header */
2720 int current_packet_size, is_gob_start;
2722 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2724 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2726 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2728 switch(s->codec_id){
2729 case AV_CODEC_ID_H263:
2730 case AV_CODEC_ID_H263P:
2731 if(!s->h263_slice_structured)
2732 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2734 case AV_CODEC_ID_MPEG2VIDEO:
2735 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2736 case AV_CODEC_ID_MPEG1VIDEO:
2737 if(s->mb_skip_run) is_gob_start=0;
2739 case AV_CODEC_ID_MJPEG:
2740 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2745 if(s->start_mb_y != mb_y || mb_x!=0){
2748 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2749 ff_mpeg4_init_partitions(s);
2753 av_assert2((put_bits_count(&s->pb)&7) == 0);
2754 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2756 if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
2757 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2758 int d = 100 / s->error_rate;
2760 current_packet_size=0;
2761 s->pb.buf_ptr= s->ptr_lastgob;
2762 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2766 if (s->avctx->rtp_callback){
2767 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2768 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2770 update_mb_info(s, 1);
2772 switch(s->codec_id){
2773 case AV_CODEC_ID_MPEG4:
2774 if (CONFIG_MPEG4_ENCODER) {
2775 ff_mpeg4_encode_video_packet_header(s);
2776 ff_mpeg4_clean_buffers(s);
2779 case AV_CODEC_ID_MPEG1VIDEO:
2780 case AV_CODEC_ID_MPEG2VIDEO:
2781 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2782 ff_mpeg1_encode_slice_header(s);
2783 ff_mpeg1_clean_buffers(s);
2786 case AV_CODEC_ID_H263:
2787 case AV_CODEC_ID_H263P:
2788 if (CONFIG_H263_ENCODER)
2789 ff_h263_encode_gob_header(s, mb_y);
2793 if(s->flags&CODEC_FLAG_PASS1){
2794 int bits= put_bits_count(&s->pb);
2795 s->misc_bits+= bits - s->last_bits;
2799 s->ptr_lastgob += current_packet_size;
2800 s->first_slice_line=1;
2801 s->resync_mb_x=mb_x;
2802 s->resync_mb_y=mb_y;
2806 if( (s->resync_mb_x == s->mb_x)
2807 && s->resync_mb_y+1 == s->mb_y){
2808 s->first_slice_line=0;
2812 s->dquant=0; //only for QP_RD
2814 update_mb_info(s, 0);
2816 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
2818 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2820 copy_context_before_encode(&backup_s, s, -1);
2822 best_s.data_partitioning= s->data_partitioning;
2823 best_s.partitioned_frame= s->partitioned_frame;
2824 if(s->data_partitioning){
2825 backup_s.pb2= s->pb2;
2826 backup_s.tex_pb= s->tex_pb;
2829 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2830 s->mv_dir = MV_DIR_FORWARD;
2831 s->mv_type = MV_TYPE_16X16;
2833 s->mv[0][0][0] = s->p_mv_table[xy][0];
2834 s->mv[0][0][1] = s->p_mv_table[xy][1];
2835 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2836 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2838 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2839 s->mv_dir = MV_DIR_FORWARD;
2840 s->mv_type = MV_TYPE_FIELD;
2843 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2844 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2845 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2847 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2848 &dmin, &next_block, 0, 0);
2850 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2851 s->mv_dir = MV_DIR_FORWARD;
2852 s->mv_type = MV_TYPE_16X16;
2856 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2857 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2859 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2860 s->mv_dir = MV_DIR_FORWARD;
2861 s->mv_type = MV_TYPE_8X8;
2864 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2865 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2867 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2868 &dmin, &next_block, 0, 0);
2870 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2871 s->mv_dir = MV_DIR_FORWARD;
2872 s->mv_type = MV_TYPE_16X16;
2874 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2875 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2876 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2877 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2879 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2880 s->mv_dir = MV_DIR_BACKWARD;
2881 s->mv_type = MV_TYPE_16X16;
2883 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2884 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2885 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2886 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2888 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2889 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2890 s->mv_type = MV_TYPE_16X16;
2892 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2893 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2894 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2895 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2896 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2897 &dmin, &next_block, 0, 0);
2899 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2900 s->mv_dir = MV_DIR_FORWARD;
2901 s->mv_type = MV_TYPE_FIELD;
2904 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2905 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2906 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2908 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2909 &dmin, &next_block, 0, 0);
2911 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2912 s->mv_dir = MV_DIR_BACKWARD;
2913 s->mv_type = MV_TYPE_FIELD;
2916 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2917 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2918 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2920 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2921 &dmin, &next_block, 0, 0);
2923 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2924 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2925 s->mv_type = MV_TYPE_FIELD;
2927 for(dir=0; dir<2; dir++){
2929 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2930 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2931 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2934 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2935 &dmin, &next_block, 0, 0);
2937 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2939 s->mv_type = MV_TYPE_16X16;
2943 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2944 &dmin, &next_block, 0, 0);
2945 if(s->h263_pred || s->h263_aic){
2947 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2949 ff_clean_intra_table_entries(s); //old mode?
2953 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2954 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2955 const int last_qp= backup_s.qscale;
2958 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2959 static const int dquant_tab[4]={-1,1,-2,2};
2960 int storecoefs = s->mb_intra && s->dc_val[0];
2962 av_assert2(backup_s.dquant == 0);
2965 s->mv_dir= best_s.mv_dir;
2966 s->mv_type = MV_TYPE_16X16;
2967 s->mb_intra= best_s.mb_intra;
2968 s->mv[0][0][0] = best_s.mv[0][0][0];
2969 s->mv[0][0][1] = best_s.mv[0][0][1];
2970 s->mv[1][0][0] = best_s.mv[1][0][0];
2971 s->mv[1][0][1] = best_s.mv[1][0][1];
2973 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2974 for(; qpi<4; qpi++){
2975 int dquant= dquant_tab[qpi];
2976 qp= last_qp + dquant;
2977 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2979 backup_s.dquant= dquant;
2982 dc[i]= s->dc_val[0][ s->block_index[i] ];
2983 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2987 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2988 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2989 if(best_s.qscale != qp){
2992 s->dc_val[0][ s->block_index[i] ]= dc[i];
2993 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
3000 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3001 int mx= s->b_direct_mv_table[xy][0];
3002 int my= s->b_direct_mv_table[xy][1];
3004 backup_s.dquant = 0;
3005 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3007 ff_mpeg4_set_direct_mv(s, mx, my);
3008 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3009 &dmin, &next_block, mx, my);
3011 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3012 backup_s.dquant = 0;
3013 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3015 ff_mpeg4_set_direct_mv(s, 0, 0);
3016 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
3017 &dmin, &next_block, 0, 0);
3019 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3022 coded |= s->block_last_index[i];
3025 memcpy(s->mv, best_s.mv, sizeof(s->mv));
3026 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
3027 mx=my=0; //FIXME find the one we actually used
3028 ff_mpeg4_set_direct_mv(s, mx, my);
3029 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
3037 s->mv_dir= best_s.mv_dir;
3038 s->mv_type = best_s.mv_type;
3040 /* s->mv[0][0][0] = best_s.mv[0][0][0];
3041 s->mv[0][0][1] = best_s.mv[0][0][1];
3042 s->mv[1][0][0] = best_s.mv[1][0][0];
3043 s->mv[1][0][1] = best_s.mv[1][0][1];*/
3046 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
3047 &dmin, &next_block, mx, my);
3052 s->current_picture.qscale_table[xy] = best_s.qscale;
3054 copy_context_after_encode(s, &best_s, -1);
3056 pb_bits_count= put_bits_count(&s->pb);
3057 flush_put_bits(&s->pb);
3058 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3061 if(s->data_partitioning){
3062 pb2_bits_count= put_bits_count(&s->pb2);
3063 flush_put_bits(&s->pb2);
3064 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3065 s->pb2= backup_s.pb2;
3067 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3068 flush_put_bits(&s->tex_pb);
3069 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3070 s->tex_pb= backup_s.tex_pb;
3072 s->last_bits= put_bits_count(&s->pb);
3074 if (CONFIG_H263_ENCODER &&
3075 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3076 ff_h263_update_motion_val(s);
3078 if(next_block==0){ //FIXME 16 vs linesize16
3079 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
3080 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
3081 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
3084 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3085 ff_MPV_decode_mb(s, s->block);
3087 int motion_x = 0, motion_y = 0;
3088 s->mv_type=MV_TYPE_16X16;
3089 // only one MB-Type possible
3092 case CANDIDATE_MB_TYPE_INTRA:
3095 motion_x= s->mv[0][0][0] = 0;
3096 motion_y= s->mv[0][0][1] = 0;
3098 case CANDIDATE_MB_TYPE_INTER:
3099 s->mv_dir = MV_DIR_FORWARD;
3101 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3102 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3104 case CANDIDATE_MB_TYPE_INTER_I:
3105 s->mv_dir = MV_DIR_FORWARD;
3106 s->mv_type = MV_TYPE_FIELD;
3109 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
3110 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
3111 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
3114 case CANDIDATE_MB_TYPE_INTER4V:
3115 s->mv_dir = MV_DIR_FORWARD;
3116 s->mv_type = MV_TYPE_8X8;
3119 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
3120 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
3123 case CANDIDATE_MB_TYPE_DIRECT:
3124 if (CONFIG_MPEG4_ENCODER) {
3125 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3127 motion_x=s->b_direct_mv_table[xy][0];
3128 motion_y=s->b_direct_mv_table[xy][1];
3129 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3132 case CANDIDATE_MB_TYPE_DIRECT0:
3133 if (CONFIG_MPEG4_ENCODER) {
3134 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
3136 ff_mpeg4_set_direct_mv(s, 0, 0);
3139 case CANDIDATE_MB_TYPE_BIDIR:
3140 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3142 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3143 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3144 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3145 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3147 case CANDIDATE_MB_TYPE_BACKWARD:
3148 s->mv_dir = MV_DIR_BACKWARD;
3150 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3151 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3153 case CANDIDATE_MB_TYPE_FORWARD:
3154 s->mv_dir = MV_DIR_FORWARD;
3156 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3157 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3159 case CANDIDATE_MB_TYPE_FORWARD_I:
3160 s->mv_dir = MV_DIR_FORWARD;
3161 s->mv_type = MV_TYPE_FIELD;
3164 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3165 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3166 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3169 case CANDIDATE_MB_TYPE_BACKWARD_I:
3170 s->mv_dir = MV_DIR_BACKWARD;
3171 s->mv_type = MV_TYPE_FIELD;
3174 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3175 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3176 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3179 case CANDIDATE_MB_TYPE_BIDIR_I:
3180 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3181 s->mv_type = MV_TYPE_FIELD;
3183 for(dir=0; dir<2; dir++){
3185 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3186 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3187 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3192 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3195 encode_mb(s, motion_x, motion_y);
3197 // RAL: Update last macroblock type
3198 s->last_mv_dir = s->mv_dir;
3200 if (CONFIG_H263_ENCODER &&
3201 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3202 ff_h263_update_motion_val(s);
3204 ff_MPV_decode_mb(s, s->block);
3207 /* clean the MV table in IPS frames for direct mode in B frames */
3208 if(s->mb_intra /* && I,P,S_TYPE */){
3209 s->p_mv_table[xy][0]=0;
3210 s->p_mv_table[xy][1]=0;
3213 if(s->flags&CODEC_FLAG_PSNR){
3217 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3218 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3220 s->current_picture.f.error[0] += sse(
3221 s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3222 s->dest[0], w, h, s->linesize);
3223 s->current_picture.f.error[1] += sse(
3224 s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3225 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3226 s->current_picture.f.error[2] += sse(
3227 s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3228 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3231 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3232 ff_h263_loop_filter(s);
3234 av_dlog(s->avctx, "MB %d %d bits\n",
3235 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3239 //not beautiful here but we must write it before flushing so it has to be here
3240 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3241 ff_msmpeg4_encode_ext_header(s);
3245 /* Send the last GOB if RTP */
3246 if (s->avctx->rtp_callback) {
3247 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3248 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3249 /* Call the RTP callback to send the last GOB */
3251 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3257 #define MERGE(field) dst->field += src->field; src->field=0
3258 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3259 MERGE(me.scene_change_score);
3260 MERGE(me.mc_mb_var_sum_temp);
3261 MERGE(me.mb_var_sum_temp);
3264 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3267 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3268 MERGE(dct_count[1]);
3277 MERGE(er.error_count);
3278 MERGE(padding_bug_score);
3279 MERGE(current_picture.f.error[0]);
3280 MERGE(current_picture.f.error[1]);
3281 MERGE(current_picture.f.error[2]);
3283 if(dst->avctx->noise_reduction){
3284 for(i=0; i<64; i++){
3285 MERGE(dct_error_sum[0][i]);
3286 MERGE(dct_error_sum[1][i]);
3290 assert(put_bits_count(&src->pb) % 8 ==0);
3291 assert(put_bits_count(&dst->pb) % 8 ==0);
3292 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3293 flush_put_bits(&dst->pb);
3296 static int estimate_qp(MpegEncContext *s, int dry_run){
3297 if (s->next_lambda){
3298 s->current_picture_ptr->f.quality =
3299 s->current_picture.f.quality = s->next_lambda;
3300 if(!dry_run) s->next_lambda= 0;
3301 } else if (!s->fixed_qscale) {
3302 s->current_picture_ptr->f.quality =
3303 s->current_picture.f.quality = ff_rate_estimate_qscale(s, dry_run);
3304 if (s->current_picture.f.quality < 0)
3308 if(s->adaptive_quant){
3309 switch(s->codec_id){
3310 case AV_CODEC_ID_MPEG4:
3311 if (CONFIG_MPEG4_ENCODER)
3312 ff_clean_mpeg4_qscales(s);
3314 case AV_CODEC_ID_H263:
3315 case AV_CODEC_ID_H263P:
3316 case AV_CODEC_ID_FLV1:
3317 if (CONFIG_H263_ENCODER)
3318 ff_clean_h263_qscales(s);
3321 ff_init_qscale_tab(s);
3324 s->lambda= s->lambda_table[0];
3327 s->lambda = s->current_picture.f.quality;
3332 /* must be called before writing the header */
3333 static void set_frame_distances(MpegEncContext * s){
3334 assert(s->current_picture_ptr->f.pts != AV_NOPTS_VALUE);
3335 s->time = s->current_picture_ptr->f.pts * s->avctx->time_base.num;
3337 if(s->pict_type==AV_PICTURE_TYPE_B){
3338 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3339 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3341 s->pp_time= s->time - s->last_non_b_time;
3342 s->last_non_b_time= s->time;
3343 assert(s->picture_number==0 || s->pp_time > 0);
3347 static int encode_picture(MpegEncContext *s, int picture_number)
3351 int context_count = s->slice_context_count;
3353 s->picture_number = picture_number;
3355 /* Reset the average MB variance */
3356 s->me.mb_var_sum_temp =
3357 s->me.mc_mb_var_sum_temp = 0;
3359 /* we need to initialize some time vars before we can encode b-frames */
3360 // RAL: Condition added for MPEG1VIDEO
3361 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3362 set_frame_distances(s);
3363 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3364 ff_set_mpeg4_time(s);
3366 s->me.scene_change_score=0;
3368 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3370 if(s->pict_type==AV_PICTURE_TYPE_I){
3371 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3372 else s->no_rounding=0;
3373 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3374 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3375 s->no_rounding ^= 1;
3378 if(s->flags & CODEC_FLAG_PASS2){
3379 if (estimate_qp(s,1) < 0)
3381 ff_get_2pass_fcode(s);
3382 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3383 if(s->pict_type==AV_PICTURE_TYPE_B)
3384 s->lambda= s->last_lambda_for[s->pict_type];
3386 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3390 if(s->codec_id != AV_CODEC_ID_AMV && s->codec_id != AV_CODEC_ID_MJPEG){
3391 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
3392 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
3393 s->q_chroma_intra_matrix = s->q_intra_matrix;
3394 s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
3397 s->mb_intra=0; //for the rate distortion & bit compare functions
3398 for(i=1; i<context_count; i++){
3399 ret = ff_update_duplicate_context(s->thread_context[i], s);
3407 /* Estimate motion for every MB */
3408 if(s->pict_type != AV_PICTURE_TYPE_I){
3409 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3410 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3411 if (s->pict_type != AV_PICTURE_TYPE_B) {
3412 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3413 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3417 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3418 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3420 for(i=0; i<s->mb_stride*s->mb_height; i++)
3421 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3423 if(!s->fixed_qscale){
3424 /* finding spatial complexity for I-frame rate control */
3425 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3428 for(i=1; i<context_count; i++){
3429 merge_context_after_me(s, s->thread_context[i]);
3431 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3432 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3435 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3436 s->pict_type= AV_PICTURE_TYPE_I;
3437 for(i=0; i<s->mb_stride*s->mb_height; i++)
3438 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3439 if(s->msmpeg4_version >= 3)
3441 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3442 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3446 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3447 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3449 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3451 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3452 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3453 s->f_code= FFMAX3(s->f_code, a, b);
3456 ff_fix_long_p_mvs(s);
3457 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3458 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3462 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3463 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3468 if(s->pict_type==AV_PICTURE_TYPE_B){
3471 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3472 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3473 s->f_code = FFMAX(a, b);
3475 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3476 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3477 s->b_code = FFMAX(a, b);
3479 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3480 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3481 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3482 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3483 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3485 for(dir=0; dir<2; dir++){
3488 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3489 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3490 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3491 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3499 if (estimate_qp(s, 0) < 0)
3502 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3503 s->qscale= 3; //reduce clipping problems
3505 if (s->out_format == FMT_MJPEG) {
3506 const uint16_t * luma_matrix = ff_mpeg1_default_intra_matrix;
3507 const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix;
3509 if (s->avctx->intra_matrix) {
3511 luma_matrix = s->avctx->intra_matrix;
3514 /* for mjpeg, we do include qscale in the matrix */
3516 int j= s->dsp.idct_permutation[i];
3518 s->chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->qscale) >> 3);
3519 s-> intra_matrix[j] = av_clip_uint8(( luma_matrix[i] * s->qscale) >> 3);
3521 s->y_dc_scale_table=
3522 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3523 s->chroma_intra_matrix[0] =
3524 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3525 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3526 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3527 ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3528 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3531 if(s->codec_id == AV_CODEC_ID_AMV){
3532 static const uint8_t y[32]={13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
3533 static const uint8_t c[32]={14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14};
3535 int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];
3537 s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
3538 s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
3540 s->y_dc_scale_table= y;
3541 s->c_dc_scale_table= c;
3542 s->intra_matrix[0] = 13;
3543 s->chroma_intra_matrix[0] = 14;
3544 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3545 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3546 ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3547 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3551 //FIXME var duplication
3552 s->current_picture_ptr->f.key_frame =
3553 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3554 s->current_picture_ptr->f.pict_type =
3555 s->current_picture.f.pict_type = s->pict_type;
3557 if (s->current_picture.f.key_frame)
3558 s->picture_in_gop_number=0;
3560 s->mb_x = s->mb_y = 0;
3561 s->last_bits= put_bits_count(&s->pb);
3562 switch(s->out_format) {
3564 if (CONFIG_MJPEG_ENCODER)
3565 ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3566 s->intra_matrix, s->chroma_intra_matrix);
3569 if (CONFIG_H261_ENCODER)
3570 ff_h261_encode_picture_header(s, picture_number);
3573 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3574 ff_wmv2_encode_picture_header(s, picture_number);
3575 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3576 ff_msmpeg4_encode_picture_header(s, picture_number);
3577 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3578 ff_mpeg4_encode_picture_header(s, picture_number);
3579 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3580 ff_rv10_encode_picture_header(s, picture_number);
3581 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3582 ff_rv20_encode_picture_header(s, picture_number);
3583 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3584 ff_flv_encode_picture_header(s, picture_number);
3585 else if (CONFIG_H263_ENCODER)
3586 ff_h263_encode_picture_header(s, picture_number);
3589 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3590 ff_mpeg1_encode_picture_header(s, picture_number);
3595 bits= put_bits_count(&s->pb);
3596 s->header_bits= bits - s->last_bits;
3598 for(i=1; i<context_count; i++){
3599 update_duplicate_context_after_me(s->thread_context[i], s);
3601 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3602 for(i=1; i<context_count; i++){
3603 merge_context_after_encode(s, s->thread_context[i]);
3609 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3610 const int intra= s->mb_intra;
3613 s->dct_count[intra]++;
3615 for(i=0; i<64; i++){
3616 int level= block[i];
3620 s->dct_error_sum[intra][i] += level;
3621 level -= s->dct_offset[intra][i];
3622 if(level<0) level=0;
3624 s->dct_error_sum[intra][i] -= level;
3625 level += s->dct_offset[intra][i];
3626 if(level>0) level=0;
3633 static int dct_quantize_trellis_c(MpegEncContext *s,
3634 int16_t *block, int n,
3635 int qscale, int *overflow){
3637 const uint8_t *scantable= s->intra_scantable.scantable;
3638 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3640 unsigned int threshold1, threshold2;
3652 int coeff_count[64];
3653 int qmul, qadd, start_i, last_non_zero, i, dc;
3654 const int esc_length= s->ac_esc_length;
3656 uint8_t * last_length;
3657 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3659 s->dsp.fdct (block);
3661 if(s->dct_error_sum)
3662 s->denoise_dct(s, block);
3664 qadd= ((qscale-1)|1)*8;
3675 /* For AIC we skip quant/dequant of INTRADC */
3680 /* note: block[0] is assumed to be positive */
3681 block[0] = (block[0] + (q >> 1)) / q;
3684 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3685 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3686 bias= 1<<(QMAT_SHIFT-1);
3687 length = s->intra_ac_vlc_length;
3688 last_length= s->intra_ac_vlc_last_length;
3692 qmat = s->q_inter_matrix[qscale];
3693 length = s->inter_ac_vlc_length;
3694 last_length= s->inter_ac_vlc_last_length;
3698 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3699 threshold2= (threshold1<<1);
3701 for(i=63; i>=start_i; i--) {
3702 const int j = scantable[i];
3703 int level = block[j] * qmat[j];
3705 if(((unsigned)(level+threshold1))>threshold2){
3711 for(i=start_i; i<=last_non_zero; i++) {
3712 const int j = scantable[i];
3713 int level = block[j] * qmat[j];
3715 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3716 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3717 if(((unsigned)(level+threshold1))>threshold2){
3719 level= (bias + level)>>QMAT_SHIFT;
3721 coeff[1][i]= level-1;
3722 // coeff[2][k]= level-2;
3724 level= (bias - level)>>QMAT_SHIFT;
3725 coeff[0][i]= -level;
3726 coeff[1][i]= -level+1;
3727 // coeff[2][k]= -level+2;
3729 coeff_count[i]= FFMIN(level, 2);
3730 av_assert2(coeff_count[i]);
3733 coeff[0][i]= (level>>31)|1;
3738 *overflow= s->max_qcoeff < max; //overflow might have happened
3740 if(last_non_zero < start_i){
3741 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3742 return last_non_zero;
3745 score_tab[start_i]= 0;
3746 survivor[0]= start_i;
3749 for(i=start_i; i<=last_non_zero; i++){
3750 int level_index, j, zero_distortion;
3751 int dct_coeff= FFABS(block[ scantable[i] ]);
3752 int best_score=256*256*256*120;
3754 if (s->dsp.fdct == ff_fdct_ifast)
3755 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3756 zero_distortion= dct_coeff*dct_coeff;
3758 for(level_index=0; level_index < coeff_count[i]; level_index++){
3760 int level= coeff[level_index][i];
3761 const int alevel= FFABS(level);
3766 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
3767 unquant_coeff= alevel*qmul + qadd;
3769 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3771 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3772 unquant_coeff = (unquant_coeff - 1) | 1;
3774 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3775 unquant_coeff = (unquant_coeff - 1) | 1;
3780 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3782 if((level&(~127)) == 0){
3783 for(j=survivor_count-1; j>=0; j--){
3784 int run= i - survivor[j];
3785 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3786 score += score_tab[i-run];
3788 if(score < best_score){
3791 level_tab[i+1]= level-64;
3795 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
3796 for(j=survivor_count-1; j>=0; j--){
3797 int run= i - survivor[j];
3798 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3799 score += score_tab[i-run];
3800 if(score < last_score){
3803 last_level= level-64;
3809 distortion += esc_length*lambda;
3810 for(j=survivor_count-1; j>=0; j--){
3811 int run= i - survivor[j];
3812 int score= distortion + score_tab[i-run];
3814 if(score < best_score){
3817 level_tab[i+1]= level-64;
3821 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
3822 for(j=survivor_count-1; j>=0; j--){
3823 int run= i - survivor[j];
3824 int score= distortion + score_tab[i-run];
3825 if(score < last_score){
3828 last_level= level-64;
3836 score_tab[i+1]= best_score;
3838 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3839 if(last_non_zero <= 27){
3840 for(; survivor_count; survivor_count--){
3841 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3845 for(; survivor_count; survivor_count--){
3846 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3851 survivor[ survivor_count++ ]= i+1;
3854 if(s->out_format != FMT_H263 && s->out_format != FMT_H261){
3855 last_score= 256*256*256*120;
3856 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3857 int score= score_tab[i];
3858 if(i) score += lambda*2; //FIXME exacter?
3860 if(score < last_score){
3863 last_level= level_tab[i];
3864 last_run= run_tab[i];
3869 s->coded_score[n] = last_score;
3871 dc= FFABS(block[0]);
3872 last_non_zero= last_i - 1;
3873 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3875 if(last_non_zero < start_i)
3876 return last_non_zero;
3878 if(last_non_zero == 0 && start_i == 0){
3880 int best_score= dc * dc;
3882 for(i=0; i<coeff_count[0]; i++){
3883 int level= coeff[i][0];
3884 int alevel= FFABS(level);
3885 int unquant_coeff, score, distortion;
3887 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
3888 unquant_coeff= (alevel*qmul + qadd)>>3;
3890 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3891 unquant_coeff = (unquant_coeff - 1) | 1;
3893 unquant_coeff = (unquant_coeff + 4) >> 3;
3894 unquant_coeff<<= 3 + 3;
3896 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3898 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3899 else score= distortion + esc_length*lambda;
3901 if(score < best_score){
3903 best_level= level - 64;
3906 block[0]= best_level;
3907 s->coded_score[n] = best_score - dc*dc;
3908 if(best_level == 0) return -1;
3909 else return last_non_zero;
3913 av_assert2(last_level);
3915 block[ perm_scantable[last_non_zero] ]= last_level;
3918 for(; i>start_i; i -= run_tab[i] + 1){
3919 block[ perm_scantable[i-1] ]= level_tab[i];
3922 return last_non_zero;
3925 //#define REFINE_STATS 1
3926 static int16_t basis[64][64];
3928 static void build_basis(uint8_t *perm){
3935 double s= 0.25*(1<<BASIS_SHIFT);
3937 int perm_index= perm[index];
3938 if(i==0) s*= sqrt(0.5);
3939 if(j==0) s*= sqrt(0.5);
3940 basis[perm_index][8*x + y]= lrintf(s * cos((M_PI/8.0)*i*(x+0.5)) * cos((M_PI/8.0)*j*(y+0.5)));
3947 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3948 int16_t *block, int16_t *weight, int16_t *orig,
3951 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3952 const uint8_t *scantable= s->intra_scantable.scantable;
3953 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3954 // unsigned int threshold1, threshold2;
3959 int qmul, qadd, start_i, last_non_zero, i, dc;
3961 uint8_t * last_length;
3963 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3966 static int after_last=0;
3967 static int to_zero=0;
3968 static int from_zero=0;
3971 static int messed_sign=0;
3974 if(basis[0][0] == 0)
3975 build_basis(s->dsp.idct_permutation);
3986 /* For AIC we skip quant/dequant of INTRADC */
3990 q <<= RECON_SHIFT-3;
3991 /* note: block[0] is assumed to be positive */
3993 // block[0] = (block[0] + (q >> 1)) / q;
3995 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3996 // bias= 1<<(QMAT_SHIFT-1);
3997 length = s->intra_ac_vlc_length;
3998 last_length= s->intra_ac_vlc_last_length;
4002 length = s->inter_ac_vlc_length;
4003 last_length= s->inter_ac_vlc_last_length;
4005 last_non_zero = s->block_last_index[n];
4010 dc += (1<<(RECON_SHIFT-1));
4011 for(i=0; i<64; i++){
4012 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
4015 STOP_TIMER("memset rem[]")}
4018 for(i=0; i<64; i++){
4023 w= FFABS(weight[i]) + qns*one;
4024 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4027 // w=weight[i] = (63*qns + (w/2)) / w;
4030 av_assert2(w<(1<<6));
4033 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4039 for(i=start_i; i<=last_non_zero; i++){
4040 int j= perm_scantable[i];
4041 const int level= block[j];
4045 if(level<0) coeff= qmul*level - qadd;
4046 else coeff= qmul*level + qadd;
4047 run_tab[rle_index++]=run;
4050 s->dsp.add_8x8basis(rem, basis[j], coeff);
4056 if(last_non_zero>0){
4057 STOP_TIMER("init rem[]")
4064 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
4067 int run2, best_unquant_change=0, analyze_gradient;
4071 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4073 if(analyze_gradient){
4077 for(i=0; i<64; i++){
4080 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4083 STOP_TIMER("rem*w*w")}
4093 const int level= block[0];
4094 int change, old_coeff;
4096 av_assert2(s->mb_intra);
4100 for(change=-1; change<=1; change+=2){
4101 int new_level= level + change;
4102 int score, new_coeff;
4104 new_coeff= q*new_level;
4105 if(new_coeff >= 2048 || new_coeff < 0)
4108 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
4109 if(score<best_score){
4112 best_change= change;
4113 best_unquant_change= new_coeff - old_coeff;
4120 run2= run_tab[rle_index++];
4124 for(i=start_i; i<64; i++){
4125 int j= perm_scantable[i];
4126 const int level= block[j];
4127 int change, old_coeff;
4129 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4133 if(level<0) old_coeff= qmul*level - qadd;
4134 else old_coeff= qmul*level + qadd;
4135 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4139 av_assert2(run2>=0 || i >= last_non_zero );
4142 for(change=-1; change<=1; change+=2){
4143 int new_level= level + change;
4144 int score, new_coeff, unquant_change;
4147 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4151 if(new_level<0) new_coeff= qmul*new_level - qadd;
4152 else new_coeff= qmul*new_level + qadd;
4153 if(new_coeff >= 2048 || new_coeff <= -2048)
4155 //FIXME check for overflow
4158 if(level < 63 && level > -63){
4159 if(i < last_non_zero)
4160 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4161 - length[UNI_AC_ENC_INDEX(run, level+64)];
4163 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4164 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4167 av_assert2(FFABS(new_level)==1);
4169 if(analyze_gradient){
4170 int g= d1[ scantable[i] ];
4171 if(g && (g^new_level) >= 0)
4175 if(i < last_non_zero){
4176 int next_i= i + run2 + 1;
4177 int next_level= block[ perm_scantable[next_i] ] + 64;
4179 if(next_level&(~127))
4182 if(next_i < last_non_zero)
4183 score += length[UNI_AC_ENC_INDEX(run, 65)]
4184 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4185 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4187 score += length[UNI_AC_ENC_INDEX(run, 65)]
4188 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4189 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4191 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4193 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4194 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4200 av_assert2(FFABS(level)==1);
4202 if(i < last_non_zero){
4203 int next_i= i + run2 + 1;
4204 int next_level= block[ perm_scantable[next_i] ] + 64;
4206 if(next_level&(~127))
4209 if(next_i < last_non_zero)
4210 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4211 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4212 - length[UNI_AC_ENC_INDEX(run, 65)];
4214 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4215 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4216 - length[UNI_AC_ENC_INDEX(run, 65)];
4218 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4220 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4221 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4228 unquant_change= new_coeff - old_coeff;
4229 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4231 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
4232 if(score<best_score){
4235 best_change= change;
4236 best_unquant_change= unquant_change;
4240 prev_level= level + 64;
4241 if(prev_level&(~127))
4250 STOP_TIMER("iterative step")}
4254 int j= perm_scantable[ best_coeff ];
4256 block[j] += best_change;
4258 if(best_coeff > last_non_zero){
4259 last_non_zero= best_coeff;
4260 av_assert2(block[j]);
4267 if(block[j] - best_change){
4268 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4280 for(; last_non_zero>=start_i; last_non_zero--){
4281 if(block[perm_scantable[last_non_zero]])
4287 if(256*256*256*64 % count == 0){
4288 av_log(s->avctx, AV_LOG_DEBUG, "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);
4293 for(i=start_i; i<=last_non_zero; i++){
4294 int j= perm_scantable[i];
4295 const int level= block[j];
4298 run_tab[rle_index++]=run;
4305 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
4311 if(last_non_zero>0){
4312 STOP_TIMER("iterative search")
4317 return last_non_zero;
4320 int ff_dct_quantize_c(MpegEncContext *s,
4321 int16_t *block, int n,
4322 int qscale, int *overflow)
4324 int i, j, level, last_non_zero, q, start_i;
4326 const uint8_t *scantable= s->intra_scantable.scantable;
4329 unsigned int threshold1, threshold2;
4331 s->dsp.fdct (block);
4333 if(s->dct_error_sum)
4334 s->denoise_dct(s, block);
4344 /* For AIC we skip quant/dequant of INTRADC */
4347 /* note: block[0] is assumed to be positive */
4348 block[0] = (block[0] + (q >> 1)) / q;
4351 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4352 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4356 qmat = s->q_inter_matrix[qscale];
4357 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4359 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4360 threshold2= (threshold1<<1);
4361 for(i=63;i>=start_i;i--) {
4363 level = block[j] * qmat[j];
4365 if(((unsigned)(level+threshold1))>threshold2){
4372 for(i=start_i; i<=last_non_zero; i++) {
4374 level = block[j] * qmat[j];
4376 // if( bias+level >= (1<<QMAT_SHIFT)
4377 // || bias-level >= (1<<QMAT_SHIFT)){
4378 if(((unsigned)(level+threshold1))>threshold2){
4380 level= (bias + level)>>QMAT_SHIFT;
4383 level= (bias - level)>>QMAT_SHIFT;
4391 *overflow= s->max_qcoeff < max; //overflow might have happened
4393 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4394 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4395 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4397 return last_non_zero;
4400 #define OFFSET(x) offsetof(MpegEncContext, x)
4401 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4402 static const AVOption h263_options[] = {
4403 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4404 { "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},
4405 { "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 },
4410 static const AVClass h263_class = {
4411 .class_name = "H.263 encoder",
4412 .item_name = av_default_item_name,
4413 .option = h263_options,
4414 .version = LIBAVUTIL_VERSION_INT,
4417 AVCodec ff_h263_encoder = {
4419 .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4420 .type = AVMEDIA_TYPE_VIDEO,
4421 .id = AV_CODEC_ID_H263,
4422 .priv_data_size = sizeof(MpegEncContext),
4423 .init = ff_MPV_encode_init,
4424 .encode2 = ff_MPV_encode_picture,
4425 .close = ff_MPV_encode_end,
4426 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4427 .priv_class = &h263_class,
4430 static const AVOption h263p_options[] = {
4431 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4432 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4433 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4434 { "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},
4438 static const AVClass h263p_class = {
4439 .class_name = "H.263p encoder",
4440 .item_name = av_default_item_name,
4441 .option = h263p_options,
4442 .version = LIBAVUTIL_VERSION_INT,
4445 AVCodec ff_h263p_encoder = {
4447 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4448 .type = AVMEDIA_TYPE_VIDEO,
4449 .id = AV_CODEC_ID_H263P,
4450 .priv_data_size = sizeof(MpegEncContext),
4451 .init = ff_MPV_encode_init,
4452 .encode2 = ff_MPV_encode_picture,
4453 .close = ff_MPV_encode_end,
4454 .capabilities = CODEC_CAP_SLICE_THREADS,
4455 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4456 .priv_class = &h263p_class,
4459 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4461 AVCodec ff_msmpeg4v2_encoder = {
4462 .name = "msmpeg4v2",
4463 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4464 .type = AVMEDIA_TYPE_VIDEO,
4465 .id = AV_CODEC_ID_MSMPEG4V2,
4466 .priv_data_size = sizeof(MpegEncContext),
4467 .init = ff_MPV_encode_init,
4468 .encode2 = ff_MPV_encode_picture,
4469 .close = ff_MPV_encode_end,
4470 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4471 .priv_class = &msmpeg4v2_class,
4474 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4476 AVCodec ff_msmpeg4v3_encoder = {
4478 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4479 .type = AVMEDIA_TYPE_VIDEO,
4480 .id = AV_CODEC_ID_MSMPEG4V3,
4481 .priv_data_size = sizeof(MpegEncContext),
4482 .init = ff_MPV_encode_init,
4483 .encode2 = ff_MPV_encode_picture,
4484 .close = ff_MPV_encode_end,
4485 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4486 .priv_class = &msmpeg4v3_class,
4489 FF_MPV_GENERIC_CLASS(wmv1)
4491 AVCodec ff_wmv1_encoder = {
4493 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4494 .type = AVMEDIA_TYPE_VIDEO,
4495 .id = AV_CODEC_ID_WMV1,
4496 .priv_data_size = sizeof(MpegEncContext),
4497 .init = ff_MPV_encode_init,
4498 .encode2 = ff_MPV_encode_picture,
4499 .close = ff_MPV_encode_end,
4500 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4501 .priv_class = &wmv1_class,