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!).
30 #include "libavutil/intmath.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
35 #include "mpegvideo.h"
41 #include "aandcttab.h"
43 #include "mpeg4video.h"
45 #include "bytestream.h"
52 static int encode_picture(MpegEncContext *s, int picture_number);
53 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
54 static int sse_mb(MpegEncContext *s);
55 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
56 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
58 /* enable all paranoid tests for rounding, overflows, etc... */
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] * 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.f.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 copy_picture_attributes(MpegEncContext *s,
193 dst->pict_type = src->pict_type;
194 dst->quality = src->quality;
195 dst->coded_picture_number = src->coded_picture_number;
196 dst->display_picture_number = src->display_picture_number;
197 //dst->reference = src->reference;
199 dst->interlaced_frame = src->interlaced_frame;
200 dst->top_field_first = src->top_field_first;
202 if (s->avctx->me_threshold) {
203 if (!src->motion_val[0])
204 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
206 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
207 if (!src->ref_index[0])
208 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
209 if (src->motion_subsample_log2 != dst->motion_subsample_log2)
210 av_log(s->avctx, AV_LOG_ERROR,
211 "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
212 src->motion_subsample_log2, dst->motion_subsample_log2);
214 memcpy(dst->mb_type, src->mb_type,
215 s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
217 for (i = 0; i < 2; i++) {
218 int stride = ((16 * s->mb_width ) >>
219 src->motion_subsample_log2) + 1;
220 int height = ((16 * s->mb_height) >> src->motion_subsample_log2);
222 if (src->motion_val[i] &&
223 src->motion_val[i] != dst->motion_val[i]) {
224 memcpy(dst->motion_val[i], src->motion_val[i],
225 2 * stride * height * sizeof(int16_t));
227 if (src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]) {
228 memcpy(dst->ref_index[i], src->ref_index[i],
229 s->mb_stride * 4 * s->mb_height * sizeof(int8_t));
235 static void update_duplicate_context_after_me(MpegEncContext *dst,
238 #define COPY(a) dst->a= src->a
240 COPY(current_picture);
246 COPY(picture_in_gop_number);
247 COPY(gop_picture_number);
248 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
249 COPY(progressive_frame); // FIXME don't set in encode_header
250 COPY(partitioned_frame); // FIXME don't set in encode_header
255 * Set the given MpegEncContext to defaults for encoding.
256 * the changed fields will not depend upon the prior state of the MpegEncContext.
258 static void MPV_encode_defaults(MpegEncContext *s)
261 ff_MPV_common_defaults(s);
263 for (i = -16; i < 16; i++) {
264 default_fcode_tab[i + MAX_MV] = 1;
266 s->me.mv_penalty = default_mv_penalty;
267 s->fcode_tab = default_fcode_tab;
270 av_cold int ff_dct_encode_init(MpegEncContext *s) {
272 ff_dct_encode_init_x86(s);
274 if (!s->dct_quantize)
275 s->dct_quantize = ff_dct_quantize_c;
277 s->denoise_dct = denoise_dct_c;
278 s->fast_dct_quantize = s->dct_quantize;
279 if (s->avctx->trellis)
280 s->dct_quantize = dct_quantize_trellis_c;
285 /* init video encoder */
286 av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
288 MpegEncContext *s = avctx->priv_data;
290 int chroma_h_shift, chroma_v_shift;
292 MPV_encode_defaults(s);
294 switch (avctx->codec_id) {
295 case AV_CODEC_ID_MPEG2VIDEO:
296 if (avctx->pix_fmt != PIX_FMT_YUV420P &&
297 avctx->pix_fmt != PIX_FMT_YUV422P) {
298 av_log(avctx, AV_LOG_ERROR,
299 "only YUV420 and YUV422 are supported\n");
303 case AV_CODEC_ID_LJPEG:
304 if (avctx->pix_fmt != PIX_FMT_YUVJ420P &&
305 avctx->pix_fmt != PIX_FMT_YUVJ422P &&
306 avctx->pix_fmt != PIX_FMT_YUVJ444P &&
307 avctx->pix_fmt != PIX_FMT_BGR0 &&
308 avctx->pix_fmt != PIX_FMT_BGRA &&
309 avctx->pix_fmt != PIX_FMT_BGR24 &&
310 ((avctx->pix_fmt != PIX_FMT_YUV420P &&
311 avctx->pix_fmt != PIX_FMT_YUV422P &&
312 avctx->pix_fmt != PIX_FMT_YUV444P) ||
313 avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL)) {
314 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in LJPEG\n");
318 case AV_CODEC_ID_MJPEG:
319 case AV_CODEC_ID_AMV:
320 if (avctx->pix_fmt != PIX_FMT_YUVJ420P &&
321 avctx->pix_fmt != PIX_FMT_YUVJ422P &&
322 ((avctx->pix_fmt != PIX_FMT_YUV420P &&
323 avctx->pix_fmt != PIX_FMT_YUV422P) ||
324 avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL)) {
325 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
330 if (avctx->pix_fmt != PIX_FMT_YUV420P) {
331 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
336 switch (avctx->pix_fmt) {
337 case PIX_FMT_YUVJ422P:
338 case PIX_FMT_YUV422P:
339 s->chroma_format = CHROMA_422;
341 case PIX_FMT_YUVJ420P:
342 case PIX_FMT_YUV420P:
344 s->chroma_format = CHROMA_420;
348 s->bit_rate = avctx->bit_rate;
349 s->width = avctx->width;
350 s->height = avctx->height;
351 if (avctx->gop_size > 600 &&
352 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
353 av_log(avctx, AV_LOG_WARNING,
354 "keyframe interval too large!, reducing it from %d to %d\n",
355 avctx->gop_size, 600);
356 avctx->gop_size = 600;
358 s->gop_size = avctx->gop_size;
360 s->flags = avctx->flags;
361 s->flags2 = avctx->flags2;
362 s->max_b_frames = avctx->max_b_frames;
363 s->codec_id = avctx->codec->id;
364 #if FF_API_MPV_GLOBAL_OPTS
365 if (avctx->luma_elim_threshold)
366 s->luma_elim_threshold = avctx->luma_elim_threshold;
367 if (avctx->chroma_elim_threshold)
368 s->chroma_elim_threshold = avctx->chroma_elim_threshold;
370 s->strict_std_compliance = avctx->strict_std_compliance;
371 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
372 s->mpeg_quant = avctx->mpeg_quant;
373 s->rtp_mode = !!avctx->rtp_payload_size;
374 s->intra_dc_precision = avctx->intra_dc_precision;
375 s->user_specified_pts = AV_NOPTS_VALUE;
377 if (s->gop_size <= 1) {
384 s->me_method = avctx->me_method;
387 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
389 #if FF_API_MPV_GLOBAL_OPTS
390 if (s->flags & CODEC_FLAG_QP_RD)
391 s->mpv_flags |= FF_MPV_FLAG_QP_RD;
394 s->adaptive_quant = (s->avctx->lumi_masking ||
395 s->avctx->dark_masking ||
396 s->avctx->temporal_cplx_masking ||
397 s->avctx->spatial_cplx_masking ||
398 s->avctx->p_masking ||
399 s->avctx->border_masking ||
400 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
403 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
405 if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
406 av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
407 if (avctx->rc_max_rate && !avctx->rc_buffer_size)
411 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
412 av_log(avctx, AV_LOG_INFO,
413 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
416 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
417 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
421 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
422 av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
426 if (avctx->rc_max_rate &&
427 avctx->rc_max_rate == avctx->bit_rate &&
428 avctx->rc_max_rate != avctx->rc_min_rate) {
429 av_log(avctx, AV_LOG_INFO,
430 "impossible bitrate constraints, this will fail\n");
433 if (avctx->rc_buffer_size &&
434 avctx->bit_rate * (int64_t)avctx->time_base.num >
435 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
436 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
440 if (!s->fixed_qscale &&
441 avctx->bit_rate * av_q2d(avctx->time_base) >
442 avctx->bit_rate_tolerance) {
443 av_log(avctx, AV_LOG_ERROR,
444 "bitrate tolerance too small for bitrate\n");
448 if (s->avctx->rc_max_rate &&
449 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
450 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
451 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
452 90000LL * (avctx->rc_buffer_size - 1) >
453 s->avctx->rc_max_rate * 0xFFFFLL) {
454 av_log(avctx, AV_LOG_INFO,
455 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
456 "specified vbv buffer is too large for the given bitrate!\n");
459 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
460 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
461 s->codec_id != AV_CODEC_ID_FLV1) {
462 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
466 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
467 av_log(avctx, AV_LOG_ERROR,
468 "OBMC is only supported with simple mb decision\n");
472 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
473 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
477 if (s->max_b_frames &&
478 s->codec_id != AV_CODEC_ID_MPEG4 &&
479 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
480 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
481 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
485 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
486 s->codec_id == AV_CODEC_ID_H263 ||
487 s->codec_id == AV_CODEC_ID_H263P) &&
488 (avctx->sample_aspect_ratio.num > 255 ||
489 avctx->sample_aspect_ratio.den > 255)) {
490 av_log(avctx, AV_LOG_WARNING,
491 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
492 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
493 av_reduce(&avctx->sample_aspect_ratio.num, &avctx->sample_aspect_ratio.den,
494 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 255);
497 if ((s->codec_id == AV_CODEC_ID_H263 ||
498 s->codec_id == AV_CODEC_ID_H263P) &&
499 (avctx->width > 2048 ||
500 avctx->height > 1152 )) {
501 av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
504 if ((s->codec_id == AV_CODEC_ID_H263 ||
505 s->codec_id == AV_CODEC_ID_H263P) &&
506 ((avctx->width &3) ||
507 (avctx->height&3) )) {
508 av_log(avctx, AV_LOG_ERROR, "w/h must be a multiple of 4\n");
512 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
513 (avctx->width > 4095 ||
514 avctx->height > 4095 )) {
515 av_log(avctx, AV_LOG_ERROR, "MPEG-1 does not support resolutions above 4095x4095\n");
519 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
520 (avctx->width > 16383 ||
521 avctx->height > 16383 )) {
522 av_log(avctx, AV_LOG_ERROR, "MPEG-2 does not support resolutions above 16383x16383\n");
526 if ((s->codec_id == AV_CODEC_ID_WMV1 ||
527 s->codec_id == AV_CODEC_ID_WMV2) &&
529 av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
533 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
534 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
535 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
539 // FIXME mpeg2 uses that too
540 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
541 av_log(avctx, AV_LOG_ERROR,
542 "mpeg2 style quantization not supported by codec\n");
546 #if FF_API_MPV_GLOBAL_OPTS
547 if (s->flags & CODEC_FLAG_CBP_RD)
548 s->mpv_flags |= FF_MPV_FLAG_CBP_RD;
551 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
552 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
556 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
557 s->avctx->mb_decision != FF_MB_DECISION_RD) {
558 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
562 if (s->avctx->scenechange_threshold < 1000000000 &&
563 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
564 av_log(avctx, AV_LOG_ERROR,
565 "closed gop with scene change detection are not supported yet, "
566 "set threshold to 1000000000\n");
570 if (s->flags & CODEC_FLAG_LOW_DELAY) {
571 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
572 av_log(avctx, AV_LOG_ERROR,
573 "low delay forcing is only available for mpeg2\n");
576 if (s->max_b_frames != 0) {
577 av_log(avctx, AV_LOG_ERROR,
578 "b frames cannot be used with low delay\n");
583 if (s->q_scale_type == 1) {
584 if (avctx->qmax > 12) {
585 av_log(avctx, AV_LOG_ERROR,
586 "non linear quant only supports qmax <= 12 currently\n");
591 if (s->avctx->thread_count > 1 &&
592 s->codec_id != AV_CODEC_ID_MPEG4 &&
593 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
594 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
595 s->codec_id != AV_CODEC_ID_MJPEG &&
596 (s->codec_id != AV_CODEC_ID_H263P)) {
597 av_log(avctx, AV_LOG_ERROR,
598 "multi threaded encoding not supported by codec\n");
602 if (s->avctx->thread_count < 1) {
603 av_log(avctx, AV_LOG_ERROR,
604 "automatic thread number detection not supported by codec, "
609 if (s->avctx->thread_count > 1)
612 if (s->avctx->thread_count > 1 && s->codec_id == AV_CODEC_ID_H263P)
613 s->h263_slice_structured = 1;
615 if (!avctx->time_base.den || !avctx->time_base.num) {
616 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
620 i = (INT_MAX / 2 + 128) >> 8;
621 if (avctx->me_threshold >= i) {
622 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n",
626 if (avctx->mb_threshold >= i) {
627 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
632 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
633 av_log(avctx, AV_LOG_INFO,
634 "notice: b_frame_strategy only affects the first pass\n");
635 avctx->b_frame_strategy = 0;
638 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
640 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
641 avctx->time_base.den /= i;
642 avctx->time_base.num /= i;
646 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) {
647 // (a + x * 3 / 8) / x
648 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
649 s->inter_quant_bias = 0;
651 s->intra_quant_bias = 0;
653 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
656 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
657 s->intra_quant_bias = avctx->intra_quant_bias;
658 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
659 s->inter_quant_bias = avctx->inter_quant_bias;
661 av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
663 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift,
666 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
667 s->avctx->time_base.den > (1 << 16) - 1) {
668 av_log(avctx, AV_LOG_ERROR,
669 "timebase %d/%d not supported by MPEG 4 standard, "
670 "the maximum admitted value for the timebase denominator "
671 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
675 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
677 #if FF_API_MPV_GLOBAL_OPTS
678 if (avctx->flags2 & CODEC_FLAG2_SKIP_RD)
679 s->mpv_flags |= FF_MPV_FLAG_SKIP_RD;
680 if (avctx->flags2 & CODEC_FLAG2_STRICT_GOP)
681 s->mpv_flags |= FF_MPV_FLAG_STRICT_GOP;
682 if (avctx->quantizer_noise_shaping)
683 s->quantizer_noise_shaping = avctx->quantizer_noise_shaping;
686 switch (avctx->codec->id) {
687 case AV_CODEC_ID_MPEG1VIDEO:
688 s->out_format = FMT_MPEG1;
689 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
690 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
692 case AV_CODEC_ID_MPEG2VIDEO:
693 s->out_format = FMT_MPEG1;
694 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
695 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
698 case AV_CODEC_ID_LJPEG:
699 case AV_CODEC_ID_MJPEG:
700 case AV_CODEC_ID_AMV:
701 s->out_format = FMT_MJPEG;
702 s->intra_only = 1; /* force intra only for jpeg */
703 if (avctx->codec->id == AV_CODEC_ID_LJPEG &&
704 (avctx->pix_fmt == PIX_FMT_BGR0
705 || s->avctx->pix_fmt == PIX_FMT_BGRA
706 || s->avctx->pix_fmt == PIX_FMT_BGR24)) {
707 s->mjpeg_vsample[0] = s->mjpeg_hsample[0] =
708 s->mjpeg_vsample[1] = s->mjpeg_hsample[1] =
709 s->mjpeg_vsample[2] = s->mjpeg_hsample[2] = 1;
711 s->mjpeg_vsample[0] = 2;
712 s->mjpeg_vsample[1] = 2 >> chroma_v_shift;
713 s->mjpeg_vsample[2] = 2 >> chroma_v_shift;
714 s->mjpeg_hsample[0] = 2;
715 s->mjpeg_hsample[1] = 2 >> chroma_h_shift;
716 s->mjpeg_hsample[2] = 2 >> chroma_h_shift;
718 if (!(CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) ||
719 ff_mjpeg_encode_init(s) < 0)
724 case AV_CODEC_ID_H261:
725 if (!CONFIG_H261_ENCODER)
727 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
728 av_log(avctx, AV_LOG_ERROR,
729 "The specified picture size of %dx%d is not valid for the "
730 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
731 s->width, s->height);
734 s->out_format = FMT_H261;
738 case AV_CODEC_ID_H263:
739 if (!CONFIG_H263_ENCODER)
741 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
742 s->width, s->height) == 8) {
743 av_log(avctx, AV_LOG_ERROR,
744 "The specified picture size of %dx%d is not valid for "
745 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
746 "352x288, 704x576, and 1408x1152. "
747 "Try H.263+.\n", s->width, s->height);
750 s->out_format = FMT_H263;
754 case AV_CODEC_ID_H263P:
755 s->out_format = FMT_H263;
758 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
759 s->modified_quant = s->h263_aic;
760 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
761 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
764 /* These are just to be sure */
768 case AV_CODEC_ID_FLV1:
769 s->out_format = FMT_H263;
770 s->h263_flv = 2; /* format = 1; 11-bit codes */
771 s->unrestricted_mv = 1;
772 s->rtp_mode = 0; /* don't allow GOB */
776 case AV_CODEC_ID_RV10:
777 s->out_format = FMT_H263;
781 case AV_CODEC_ID_RV20:
782 s->out_format = FMT_H263;
785 s->modified_quant = 1;
789 s->unrestricted_mv = 0;
791 case AV_CODEC_ID_MPEG4:
792 s->out_format = FMT_H263;
794 s->unrestricted_mv = 1;
795 s->low_delay = s->max_b_frames ? 0 : 1;
796 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
798 case AV_CODEC_ID_MSMPEG4V2:
799 s->out_format = FMT_H263;
801 s->unrestricted_mv = 1;
802 s->msmpeg4_version = 2;
806 case AV_CODEC_ID_MSMPEG4V3:
807 s->out_format = FMT_H263;
809 s->unrestricted_mv = 1;
810 s->msmpeg4_version = 3;
811 s->flipflop_rounding = 1;
815 case AV_CODEC_ID_WMV1:
816 s->out_format = FMT_H263;
818 s->unrestricted_mv = 1;
819 s->msmpeg4_version = 4;
820 s->flipflop_rounding = 1;
824 case AV_CODEC_ID_WMV2:
825 s->out_format = FMT_H263;
827 s->unrestricted_mv = 1;
828 s->msmpeg4_version = 5;
829 s->flipflop_rounding = 1;
837 avctx->has_b_frames = !s->low_delay;
841 s->progressive_frame =
842 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
843 CODEC_FLAG_INTERLACED_ME) ||
847 if (ff_MPV_common_init(s) < 0)
850 ff_dct_encode_init(s);
852 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
853 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
855 s->quant_precision = 5;
857 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
858 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
860 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
861 ff_h261_encode_init(s);
862 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
863 ff_h263_encode_init(s);
864 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
865 ff_msmpeg4_encode_init(s);
866 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
867 && s->out_format == FMT_MPEG1)
868 ff_mpeg1_encode_init(s);
871 for (i = 0; i < 64; i++) {
872 int j = s->dsp.idct_permutation[i];
873 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
875 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
876 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
877 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
879 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
882 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
883 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
885 if (s->avctx->intra_matrix)
886 s->intra_matrix[j] = s->avctx->intra_matrix[i];
887 if (s->avctx->inter_matrix)
888 s->inter_matrix[j] = s->avctx->inter_matrix[i];
891 /* precompute matrix */
892 /* for mjpeg, we do include qscale in the matrix */
893 if (s->out_format != FMT_MJPEG) {
894 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
895 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
897 ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
898 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
902 if (ff_rate_control_init(s) < 0)
908 av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
910 MpegEncContext *s = avctx->priv_data;
912 ff_rate_control_uninit(s);
914 ff_MPV_common_end(s);
915 if ((CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) &&
916 s->out_format == FMT_MJPEG)
917 ff_mjpeg_encode_close(s);
919 av_freep(&avctx->extradata);
924 static int get_sae(uint8_t *src, int ref, int stride)
929 for (y = 0; y < 16; y++) {
930 for (x = 0; x < 16; x++) {
931 acc += FFABS(src[x + y * stride] - ref);
938 static int get_intra_count(MpegEncContext *s, uint8_t *src,
939 uint8_t *ref, int stride)
947 for (y = 0; y < h; y += 16) {
948 for (x = 0; x < w; x += 16) {
949 int offset = x + y * stride;
950 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
952 int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
953 int sae = get_sae(src + offset, mean, stride);
955 acc += sae + 500 < sad;
962 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg)
967 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
968 (s->low_delay ? 0 : 1);
973 pic_arg->display_picture_number = s->input_picture_number++;
975 if (pts != AV_NOPTS_VALUE) {
976 if (s->user_specified_pts != AV_NOPTS_VALUE) {
978 int64_t last = s->user_specified_pts;
981 av_log(s->avctx, AV_LOG_ERROR,
982 "Error, Invalid timestamp=%"PRId64", "
983 "last=%"PRId64"\n", pts, s->user_specified_pts);
987 if (!s->low_delay && pic_arg->display_picture_number == 1)
988 s->dts_delta = time - last;
990 s->user_specified_pts = pts;
992 if (s->user_specified_pts != AV_NOPTS_VALUE) {
993 s->user_specified_pts =
994 pts = s->user_specified_pts + 1;
995 av_log(s->avctx, AV_LOG_INFO,
996 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
999 pts = pic_arg->display_picture_number;
1005 if (encoding_delay && !(s->flags & CODEC_FLAG_INPUT_PRESERVED))
1007 if (pic_arg->linesize[0] != s->linesize)
1009 if (pic_arg->linesize[1] != s->uvlinesize)
1011 if (pic_arg->linesize[2] != s->uvlinesize)
1014 //av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0],
1015 // pic_arg->linesize[1], s->linesize, s->uvlinesize);
1018 i = ff_find_unused_picture(s, 1);
1022 pic = &s->picture[i].f;
1025 for (i = 0; i < 4; i++) {
1026 pic->data[i] = pic_arg->data[i];
1027 pic->linesize[i] = pic_arg->linesize[i];
1029 if (ff_alloc_picture(s, (Picture *) pic, 1) < 0) {
1033 i = ff_find_unused_picture(s, 0);
1037 pic = &s->picture[i].f;
1040 if (ff_alloc_picture(s, (Picture *) pic, 0) < 0) {
1044 if (pic->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1045 pic->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1046 pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1049 int h_chroma_shift, v_chroma_shift;
1050 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift,
1053 for (i = 0; i < 3; i++) {
1054 int src_stride = pic_arg->linesize[i];
1055 int dst_stride = i ? s->uvlinesize : s->linesize;
1056 int h_shift = i ? h_chroma_shift : 0;
1057 int v_shift = i ? v_chroma_shift : 0;
1058 int w = s->width >> h_shift;
1059 int h = s->height >> v_shift;
1060 uint8_t *src = pic_arg->data[i];
1061 uint8_t *dst = pic->data[i];
1063 if(s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)){
1064 h= ((s->height+15)/16*16)>>v_shift;
1067 if (!s->avctx->rc_buffer_size)
1068 dst += INPLACE_OFFSET;
1070 if (src_stride == dst_stride)
1071 memcpy(dst, src, src_stride * h);
1074 memcpy(dst, src, w);
1082 copy_picture_attributes(s, pic, pic_arg);
1083 pic->pts = pts; // we set this here to avoid modifiying pic_arg
1086 /* shift buffer entries */
1087 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1088 s->input_picture[i - 1] = s->input_picture[i];
1090 s->input_picture[encoding_delay] = (Picture*) pic;
1095 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1099 int64_t score64 = 0;
1101 for (plane = 0; plane < 3; plane++) {
1102 const int stride = p->f.linesize[plane];
1103 const int bw = plane ? 1 : 2;
1104 for (y = 0; y < s->mb_height * bw; y++) {
1105 for (x = 0; x < s->mb_width * bw; x++) {
1106 int off = p->f.type == FF_BUFFER_TYPE_SHARED ? 0 : 16;
1107 uint8_t *dptr = p->f.data[plane] + 8 * (x + y * stride) + off;
1108 uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride);
1109 int v = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1111 switch (s->avctx->frame_skip_exp) {
1112 case 0: score = FFMAX(score, v); break;
1113 case 1: score += FFABS(v); break;
1114 case 2: score += v * v; break;
1115 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1116 case 4: score64 += v * v * (int64_t)(v * v); break;
1125 if (score64 < s->avctx->frame_skip_threshold)
1127 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1132 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1134 AVPacket pkt = { 0 };
1135 int ret, got_output;
1137 av_init_packet(&pkt);
1138 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1143 av_free_packet(&pkt);
1147 static int estimate_best_b_count(MpegEncContext *s)
1149 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1150 AVCodecContext *c = avcodec_alloc_context3(NULL);
1151 AVFrame input[FF_MAX_B_FRAMES + 2];
1152 const int scale = s->avctx->brd_scale;
1153 int i, j, out_size, p_lambda, b_lambda, lambda2;
1154 int64_t best_rd = INT64_MAX;
1155 int best_b_count = -1;
1157 av_assert0(scale >= 0 && scale <= 3);
1160 //s->next_picture_ptr->quality;
1161 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1162 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1163 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1164 if (!b_lambda) // FIXME we should do this somewhere else
1165 b_lambda = p_lambda;
1166 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1169 c->width = s->width >> scale;
1170 c->height = s->height >> scale;
1171 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR |
1172 CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
1173 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1174 c->mb_decision = s->avctx->mb_decision;
1175 c->me_cmp = s->avctx->me_cmp;
1176 c->mb_cmp = s->avctx->mb_cmp;
1177 c->me_sub_cmp = s->avctx->me_sub_cmp;
1178 c->pix_fmt = PIX_FMT_YUV420P;
1179 c->time_base = s->avctx->time_base;
1180 c->max_b_frames = s->max_b_frames;
1182 if (avcodec_open2(c, codec, NULL) < 0)
1185 for (i = 0; i < s->max_b_frames + 2; i++) {
1186 int ysize = c->width * c->height;
1187 int csize = (c->width / 2) * (c->height / 2);
1188 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1189 s->next_picture_ptr;
1191 avcodec_get_frame_defaults(&input[i]);
1192 input[i].data[0] = av_malloc(ysize + 2 * csize);
1193 input[i].data[1] = input[i].data[0] + ysize;
1194 input[i].data[2] = input[i].data[1] + csize;
1195 input[i].linesize[0] = c->width;
1196 input[i].linesize[1] =
1197 input[i].linesize[2] = c->width / 2;
1199 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1200 pre_input = *pre_input_ptr;
1202 if (pre_input.f.type != FF_BUFFER_TYPE_SHARED && i) {
1203 pre_input.f.data[0] += INPLACE_OFFSET;
1204 pre_input.f.data[1] += INPLACE_OFFSET;
1205 pre_input.f.data[2] += INPLACE_OFFSET;
1208 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0],
1209 pre_input.f.data[0], pre_input.f.linesize[0],
1210 c->width, c->height);
1211 s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1],
1212 pre_input.f.data[1], pre_input.f.linesize[1],
1213 c->width >> 1, c->height >> 1);
1214 s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2],
1215 pre_input.f.data[2], pre_input.f.linesize[2],
1216 c->width >> 1, c->height >> 1);
1220 for (j = 0; j < s->max_b_frames + 1; j++) {
1223 if (!s->input_picture[j])
1226 c->error[0] = c->error[1] = c->error[2] = 0;
1228 input[0].pict_type = AV_PICTURE_TYPE_I;
1229 input[0].quality = 1 * FF_QP2LAMBDA;
1231 out_size = encode_frame(c, &input[0]);
1233 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1235 for (i = 0; i < s->max_b_frames + 1; i++) {
1236 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1238 input[i + 1].pict_type = is_p ?
1239 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1240 input[i + 1].quality = is_p ? p_lambda : b_lambda;
1242 out_size = encode_frame(c, &input[i + 1]);
1244 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1247 /* get the delayed frames */
1249 out_size = encode_frame(c, NULL);
1250 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1253 rd += c->error[0] + c->error[1] + c->error[2];
1264 for (i = 0; i < s->max_b_frames + 2; i++) {
1265 av_freep(&input[i].data[0]);
1268 return best_b_count;
1271 static int select_input_picture(MpegEncContext *s)
1275 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1276 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1277 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1279 /* set next picture type & ordering */
1280 if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1281 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1282 s->next_picture_ptr == NULL || s->intra_only) {
1283 s->reordered_input_picture[0] = s->input_picture[0];
1284 s->reordered_input_picture[0]->f.pict_type = AV_PICTURE_TYPE_I;
1285 s->reordered_input_picture[0]->f.coded_picture_number =
1286 s->coded_picture_number++;
1290 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1291 if (s->picture_in_gop_number < s->gop_size &&
1292 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1293 // FIXME check that te gop check above is +-1 correct
1294 //av_log(NULL, AV_LOG_DEBUG, "skip %p %"PRId64"\n",
1295 // s->input_picture[0]->f.data[0],
1296 // s->input_picture[0]->pts);
1298 if (s->input_picture[0]->f.type == FF_BUFFER_TYPE_SHARED) {
1299 for (i = 0; i < 4; i++)
1300 s->input_picture[0]->f.data[i] = NULL;
1301 s->input_picture[0]->f.type = 0;
1303 assert(s->input_picture[0]->f.type == FF_BUFFER_TYPE_USER ||
1304 s->input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL);
1306 s->avctx->release_buffer(s->avctx,
1307 &s->input_picture[0]->f);
1311 ff_vbv_update(s, 0);
1317 if (s->flags & CODEC_FLAG_PASS2) {
1318 for (i = 0; i < s->max_b_frames + 1; i++) {
1319 int pict_num = s->input_picture[0]->f.display_picture_number + i;
1321 if (pict_num >= s->rc_context.num_entries)
1323 if (!s->input_picture[i]) {
1324 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1328 s->input_picture[i]->f.pict_type =
1329 s->rc_context.entry[pict_num].new_pict_type;
1333 if (s->avctx->b_frame_strategy == 0) {
1334 b_frames = s->max_b_frames;
1335 while (b_frames && !s->input_picture[b_frames])
1337 } else if (s->avctx->b_frame_strategy == 1) {
1338 for (i = 1; i < s->max_b_frames + 1; i++) {
1339 if (s->input_picture[i] &&
1340 s->input_picture[i]->b_frame_score == 0) {
1341 s->input_picture[i]->b_frame_score =
1343 s->input_picture[i ]->f.data[0],
1344 s->input_picture[i - 1]->f.data[0],
1348 for (i = 0; i < s->max_b_frames + 1; i++) {
1349 if (s->input_picture[i] == NULL ||
1350 s->input_picture[i]->b_frame_score - 1 >
1351 s->mb_num / s->avctx->b_sensitivity)
1355 b_frames = FFMAX(0, i - 1);
1358 for (i = 0; i < b_frames + 1; i++) {
1359 s->input_picture[i]->b_frame_score = 0;
1361 } else if (s->avctx->b_frame_strategy == 2) {
1362 b_frames = estimate_best_b_count(s);
1364 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1369 //static int b_count = 0;
1370 //b_count += b_frames;
1371 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
1373 for (i = b_frames - 1; i >= 0; i--) {
1374 int type = s->input_picture[i]->f.pict_type;
1375 if (type && type != AV_PICTURE_TYPE_B)
1378 if (s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_B &&
1379 b_frames == s->max_b_frames) {
1380 av_log(s->avctx, AV_LOG_ERROR,
1381 "warning, too many b frames in a row\n");
1384 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1385 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1386 s->gop_size > s->picture_in_gop_number) {
1387 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1389 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1391 s->input_picture[b_frames]->f.pict_type = AV_PICTURE_TYPE_I;
1395 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1396 s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_I)
1399 s->reordered_input_picture[0] = s->input_picture[b_frames];
1400 if (s->reordered_input_picture[0]->f.pict_type != AV_PICTURE_TYPE_I)
1401 s->reordered_input_picture[0]->f.pict_type = AV_PICTURE_TYPE_P;
1402 s->reordered_input_picture[0]->f.coded_picture_number =
1403 s->coded_picture_number++;
1404 for (i = 0; i < b_frames; i++) {
1405 s->reordered_input_picture[i + 1] = s->input_picture[i];
1406 s->reordered_input_picture[i + 1]->f.pict_type =
1408 s->reordered_input_picture[i + 1]->f.coded_picture_number =
1409 s->coded_picture_number++;
1414 if (s->reordered_input_picture[0]) {
1415 s->reordered_input_picture[0]->f.reference =
1416 s->reordered_input_picture[0]->f.pict_type !=
1417 AV_PICTURE_TYPE_B ? 3 : 0;
1419 ff_copy_picture(&s->new_picture, s->reordered_input_picture[0]);
1421 if (s->reordered_input_picture[0]->f.type == FF_BUFFER_TYPE_SHARED ||
1422 s->avctx->rc_buffer_size) {
1423 // input is a shared pix, so we can't modifiy it -> alloc a new
1424 // one & ensure that the shared one is reuseable
1427 int i = ff_find_unused_picture(s, 0);
1430 pic = &s->picture[i];
1432 pic->f.reference = s->reordered_input_picture[0]->f.reference;
1433 if (ff_alloc_picture(s, pic, 0) < 0) {
1437 /* mark us unused / free shared pic */
1438 if (s->reordered_input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL)
1439 s->avctx->release_buffer(s->avctx,
1440 &s->reordered_input_picture[0]->f);
1441 for (i = 0; i < 4; i++)
1442 s->reordered_input_picture[0]->f.data[i] = NULL;
1443 s->reordered_input_picture[0]->f.type = 0;
1445 copy_picture_attributes(s, &pic->f,
1446 &s->reordered_input_picture[0]->f);
1448 s->current_picture_ptr = pic;
1450 // input is not a shared pix -> reuse buffer for current_pix
1452 assert(s->reordered_input_picture[0]->f.type ==
1453 FF_BUFFER_TYPE_USER ||
1454 s->reordered_input_picture[0]->f.type ==
1455 FF_BUFFER_TYPE_INTERNAL);
1457 s->current_picture_ptr = s->reordered_input_picture[0];
1458 for (i = 0; i < 4; i++) {
1459 s->new_picture.f.data[i] += INPLACE_OFFSET;
1462 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1464 s->picture_number = s->new_picture.f.display_picture_number;
1465 //printf("dpn:%d\n", s->picture_number);
1467 memset(&s->new_picture, 0, sizeof(Picture));
1472 int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1473 AVFrame *pic_arg, int *got_packet)
1475 MpegEncContext *s = avctx->priv_data;
1476 int i, stuffing_count, ret;
1477 int context_count = s->slice_context_count;
1479 s->picture_in_gop_number++;
1481 if (load_input_picture(s, pic_arg) < 0)
1484 if (select_input_picture(s) < 0) {
1489 if (s->new_picture.f.data[0]) {
1490 if ((ret = ff_alloc_packet2(avctx, pkt, s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000)) < 0)
1493 s->mb_info_ptr = av_packet_new_side_data(pkt,
1494 AV_PKT_DATA_H263_MB_INFO,
1495 s->mb_width*s->mb_height*12);
1496 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1499 for (i = 0; i < context_count; i++) {
1500 int start_y = s->thread_context[i]->start_mb_y;
1501 int end_y = s->thread_context[i]-> end_mb_y;
1502 int h = s->mb_height;
1503 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1504 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1506 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1509 s->pict_type = s->new_picture.f.pict_type;
1511 //printf("qs:%f %f %d\n", s->new_picture.quality,
1512 // s->current_picture.quality, s->qscale);
1513 ff_MPV_frame_start(s, avctx);
1515 if (encode_picture(s, s->picture_number) < 0)
1518 avctx->header_bits = s->header_bits;
1519 avctx->mv_bits = s->mv_bits;
1520 avctx->misc_bits = s->misc_bits;
1521 avctx->i_tex_bits = s->i_tex_bits;
1522 avctx->p_tex_bits = s->p_tex_bits;
1523 avctx->i_count = s->i_count;
1524 // FIXME f/b_count in avctx
1525 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1526 avctx->skip_count = s->skip_count;
1528 ff_MPV_frame_end(s);
1530 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1531 ff_mjpeg_encode_picture_trailer(s);
1533 if (avctx->rc_buffer_size) {
1534 RateControlContext *rcc = &s->rc_context;
1535 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1537 if (put_bits_count(&s->pb) > max_size &&
1538 s->lambda < s->avctx->lmax) {
1539 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1540 (s->qscale + 1) / s->qscale);
1541 if (s->adaptive_quant) {
1543 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1544 s->lambda_table[i] =
1545 FFMAX(s->lambda_table[i] + 1,
1546 s->lambda_table[i] * (s->qscale + 1) /
1549 s->mb_skipped = 0; // done in MPV_frame_start()
1550 // done in encode_picture() so we must undo it
1551 if (s->pict_type == AV_PICTURE_TYPE_P) {
1552 if (s->flipflop_rounding ||
1553 s->codec_id == AV_CODEC_ID_H263P ||
1554 s->codec_id == AV_CODEC_ID_MPEG4)
1555 s->no_rounding ^= 1;
1557 if (s->pict_type != AV_PICTURE_TYPE_B) {
1558 s->time_base = s->last_time_base;
1559 s->last_non_b_time = s->time - s->pp_time;
1561 //av_log(NULL, AV_LOG_ERROR, "R:%d ", s->next_lambda);
1562 for (i = 0; i < context_count; i++) {
1563 PutBitContext *pb = &s->thread_context[i]->pb;
1564 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1569 assert(s->avctx->rc_max_rate);
1572 if (s->flags & CODEC_FLAG_PASS1)
1573 ff_write_pass1_stats(s);
1575 for (i = 0; i < 4; i++) {
1576 s->current_picture_ptr->f.error[i] = s->current_picture.f.error[i];
1577 avctx->error[i] += s->current_picture_ptr->f.error[i];
1580 if (s->flags & CODEC_FLAG_PASS1)
1581 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1582 avctx->i_tex_bits + avctx->p_tex_bits ==
1583 put_bits_count(&s->pb));
1584 flush_put_bits(&s->pb);
1585 s->frame_bits = put_bits_count(&s->pb);
1587 stuffing_count = ff_vbv_update(s, s->frame_bits);
1588 s->stuffing_bits = 8*stuffing_count;
1589 if (stuffing_count) {
1590 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1591 stuffing_count + 50) {
1592 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1596 switch (s->codec_id) {
1597 case AV_CODEC_ID_MPEG1VIDEO:
1598 case AV_CODEC_ID_MPEG2VIDEO:
1599 while (stuffing_count--) {
1600 put_bits(&s->pb, 8, 0);
1603 case AV_CODEC_ID_MPEG4:
1604 put_bits(&s->pb, 16, 0);
1605 put_bits(&s->pb, 16, 0x1C3);
1606 stuffing_count -= 4;
1607 while (stuffing_count--) {
1608 put_bits(&s->pb, 8, 0xFF);
1612 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1614 flush_put_bits(&s->pb);
1615 s->frame_bits = put_bits_count(&s->pb);
1618 /* update mpeg1/2 vbv_delay for CBR */
1619 if (s->avctx->rc_max_rate &&
1620 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1621 s->out_format == FMT_MPEG1 &&
1622 90000LL * (avctx->rc_buffer_size - 1) <=
1623 s->avctx->rc_max_rate * 0xFFFFLL) {
1624 int vbv_delay, min_delay;
1625 double inbits = s->avctx->rc_max_rate *
1626 av_q2d(s->avctx->time_base);
1627 int minbits = s->frame_bits - 8 *
1628 (s->vbv_delay_ptr - s->pb.buf - 1);
1629 double bits = s->rc_context.buffer_index + minbits - inbits;
1632 av_log(s->avctx, AV_LOG_ERROR,
1633 "Internal error, negative bits\n");
1635 assert(s->repeat_first_field == 0);
1637 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1638 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1639 s->avctx->rc_max_rate;
1641 vbv_delay = FFMAX(vbv_delay, min_delay);
1643 av_assert0(vbv_delay < 0xFFFF);
1645 s->vbv_delay_ptr[0] &= 0xF8;
1646 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1647 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1648 s->vbv_delay_ptr[2] &= 0x07;
1649 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1650 avctx->vbv_delay = vbv_delay * 300;
1652 s->total_bits += s->frame_bits;
1653 avctx->frame_bits = s->frame_bits;
1655 pkt->pts = s->current_picture.f.pts;
1656 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1657 if (!s->current_picture.f.coded_picture_number)
1658 pkt->dts = pkt->pts - s->dts_delta;
1660 pkt->dts = s->reordered_pts;
1661 s->reordered_pts = pkt->pts;
1663 pkt->dts = pkt->pts;
1664 if (s->current_picture.f.key_frame)
1665 pkt->flags |= AV_PKT_FLAG_KEY;
1667 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1671 assert((s->frame_bits & 7) == 0);
1673 pkt->size = s->frame_bits / 8;
1674 *got_packet = !!pkt->size;
1678 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1679 int n, int threshold)
1681 static const char tab[64] = {
1682 3, 2, 2, 1, 1, 1, 1, 1,
1683 1, 1, 1, 1, 1, 1, 1, 1,
1684 1, 1, 1, 1, 1, 1, 1, 1,
1685 0, 0, 0, 0, 0, 0, 0, 0,
1686 0, 0, 0, 0, 0, 0, 0, 0,
1687 0, 0, 0, 0, 0, 0, 0, 0,
1688 0, 0, 0, 0, 0, 0, 0, 0,
1689 0, 0, 0, 0, 0, 0, 0, 0
1694 DCTELEM *block = s->block[n];
1695 const int last_index = s->block_last_index[n];
1698 if (threshold < 0) {
1700 threshold = -threshold;
1704 /* Are all we could set to zero already zero? */
1705 if (last_index <= skip_dc - 1)
1708 for (i = 0; i <= last_index; i++) {
1709 const int j = s->intra_scantable.permutated[i];
1710 const int level = FFABS(block[j]);
1712 if (skip_dc && i == 0)
1716 } else if (level > 1) {
1722 if (score >= threshold)
1724 for (i = skip_dc; i <= last_index; i++) {
1725 const int j = s->intra_scantable.permutated[i];
1729 s->block_last_index[n] = 0;
1731 s->block_last_index[n] = -1;
1734 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block,
1738 const int maxlevel = s->max_qcoeff;
1739 const int minlevel = s->min_qcoeff;
1743 i = 1; // skip clipping of intra dc
1747 for (; i <= last_index; i++) {
1748 const int j = s->intra_scantable.permutated[i];
1749 int level = block[j];
1751 if (level > maxlevel) {
1754 } else if (level < minlevel) {
1762 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1763 av_log(s->avctx, AV_LOG_INFO,
1764 "warning, clipping %d dct coefficients to %d..%d\n",
1765 overflow, minlevel, maxlevel);
1768 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1772 for (y = 0; y < 8; y++) {
1773 for (x = 0; x < 8; x++) {
1779 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1780 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1781 int v = ptr[x2 + y2 * stride];
1787 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1792 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1793 int motion_x, int motion_y,
1794 int mb_block_height,
1797 int16_t weight[8][64];
1798 DCTELEM orig[8][64];
1799 const int mb_x = s->mb_x;
1800 const int mb_y = s->mb_y;
1803 int dct_offset = s->linesize * 8; // default for progressive frames
1804 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1807 for (i = 0; i < mb_block_count; i++)
1808 skip_dct[i] = s->skipdct;
1810 if (s->adaptive_quant) {
1811 const int last_qp = s->qscale;
1812 const int mb_xy = mb_x + mb_y * s->mb_stride;
1814 s->lambda = s->lambda_table[mb_xy];
1817 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1818 s->qscale = s->current_picture_ptr->f.qscale_table[mb_xy];
1819 s->dquant = s->qscale - last_qp;
1821 if (s->out_format == FMT_H263) {
1822 s->dquant = av_clip(s->dquant, -2, 2);
1824 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1826 if (s->pict_type == AV_PICTURE_TYPE_B) {
1827 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1830 if (s->mv_type == MV_TYPE_8X8)
1836 ff_set_qscale(s, last_qp + s->dquant);
1837 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1838 ff_set_qscale(s, s->qscale + s->dquant);
1840 wrap_y = s->linesize;
1841 wrap_c = s->uvlinesize;
1842 ptr_y = s->new_picture.f.data[0] +
1843 (mb_y * 16 * wrap_y) + mb_x * 16;
1844 ptr_cb = s->new_picture.f.data[1] +
1845 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1846 ptr_cr = s->new_picture.f.data[2] +
1847 (mb_y * mb_block_height * wrap_c) + mb_x * 8;
1849 if((mb_x*16+16 > s->width || mb_y*16+16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
1850 uint8_t *ebuf = s->edge_emu_buffer + 32;
1851 s->dsp.emulated_edge_mc(ebuf, ptr_y, wrap_y, 16, 16, mb_x * 16,
1852 mb_y * 16, s->width, s->height);
1854 s->dsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb, wrap_c, 8,
1855 mb_block_height, mb_x * 8, mb_y * 8,
1856 (s->width+1) >> 1, (s->height+1) >> 1);
1857 ptr_cb = ebuf + 18 * wrap_y;
1858 s->dsp.emulated_edge_mc(ebuf + 18 * wrap_y + 8, ptr_cr, wrap_c, 8,
1859 mb_block_height, mb_x * 8, mb_y * 8,
1860 (s->width+1) >> 1, (s->height+1) >> 1);
1861 ptr_cr = ebuf + 18 * wrap_y + 8;
1865 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1866 int progressive_score, interlaced_score;
1868 s->interlaced_dct = 0;
1869 progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
1871 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1872 NULL, wrap_y, 8) - 400;
1874 if (progressive_score > 0) {
1875 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
1876 NULL, wrap_y * 2, 8) +
1877 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
1878 NULL, wrap_y * 2, 8);
1879 if (progressive_score > interlaced_score) {
1880 s->interlaced_dct = 1;
1882 dct_offset = wrap_y;
1884 if (s->chroma_format == CHROMA_422)
1890 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
1891 s->dsp.get_pixels(s->block[1], ptr_y + 8 , wrap_y);
1892 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
1893 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
1895 if (s->flags & CODEC_FLAG_GRAY) {
1899 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1900 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1901 if (!s->chroma_y_shift) { /* 422 */
1902 s->dsp.get_pixels(s->block[6],
1903 ptr_cb + (dct_offset >> 1), wrap_c);
1904 s->dsp.get_pixels(s->block[7],
1905 ptr_cr + (dct_offset >> 1), wrap_c);
1909 op_pixels_func (*op_pix)[4];
1910 qpel_mc_func (*op_qpix)[16];
1911 uint8_t *dest_y, *dest_cb, *dest_cr;
1913 dest_y = s->dest[0];
1914 dest_cb = s->dest[1];
1915 dest_cr = s->dest[2];
1917 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1918 op_pix = s->dsp.put_pixels_tab;
1919 op_qpix = s->dsp.put_qpel_pixels_tab;
1921 op_pix = s->dsp.put_no_rnd_pixels_tab;
1922 op_qpix = s->dsp.put_no_rnd_qpel_pixels_tab;
1925 if (s->mv_dir & MV_DIR_FORWARD) {
1926 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
1927 s->last_picture.f.data,
1929 op_pix = s->dsp.avg_pixels_tab;
1930 op_qpix = s->dsp.avg_qpel_pixels_tab;
1932 if (s->mv_dir & MV_DIR_BACKWARD) {
1933 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
1934 s->next_picture.f.data,
1938 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1939 int progressive_score, interlaced_score;
1941 s->interlaced_dct = 0;
1942 progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
1945 s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
1946 ptr_y + wrap_y * 8, wrap_y,
1949 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
1950 progressive_score -= 400;
1952 if (progressive_score > 0) {
1953 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
1956 s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
1960 if (progressive_score > interlaced_score) {
1961 s->interlaced_dct = 1;
1963 dct_offset = wrap_y;
1965 if (s->chroma_format == CHROMA_422)
1971 s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
1972 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
1973 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
1974 dest_y + dct_offset, wrap_y);
1975 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
1976 dest_y + dct_offset + 8, wrap_y);
1978 if (s->flags & CODEC_FLAG_GRAY) {
1982 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
1983 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
1984 if (!s->chroma_y_shift) { /* 422 */
1985 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset >> 1),
1986 dest_cb + (dct_offset >> 1), wrap_c);
1987 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset >> 1),
1988 dest_cr + (dct_offset >> 1), wrap_c);
1991 /* pre quantization */
1992 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
1993 2 * s->qscale * s->qscale) {
1995 if (s->dsp.sad[1](NULL, ptr_y , dest_y,
1996 wrap_y, 8) < 20 * s->qscale)
1998 if (s->dsp.sad[1](NULL, ptr_y + 8,
1999 dest_y + 8, wrap_y, 8) < 20 * s->qscale)
2001 if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
2002 dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
2004 if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
2005 dest_y + dct_offset + 8,
2006 wrap_y, 8) < 20 * s->qscale)
2008 if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
2009 wrap_c, 8) < 20 * s->qscale)
2011 if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
2012 wrap_c, 8) < 20 * s->qscale)
2014 if (!s->chroma_y_shift) { /* 422 */
2015 if (s->dsp.sad[1](NULL, ptr_cb + (dct_offset >> 1),
2016 dest_cb + (dct_offset >> 1),
2017 wrap_c, 8) < 20 * s->qscale)
2019 if (s->dsp.sad[1](NULL, ptr_cr + (dct_offset >> 1),
2020 dest_cr + (dct_offset >> 1),
2021 wrap_c, 8) < 20 * s->qscale)
2027 if (s->quantizer_noise_shaping) {
2029 get_visual_weight(weight[0], ptr_y , wrap_y);
2031 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2033 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2035 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2037 get_visual_weight(weight[4], ptr_cb , wrap_c);
2039 get_visual_weight(weight[5], ptr_cr , wrap_c);
2040 if (!s->chroma_y_shift) { /* 422 */
2042 get_visual_weight(weight[6], ptr_cb + (dct_offset >> 1),
2045 get_visual_weight(weight[7], ptr_cr + (dct_offset >> 1),
2048 memcpy(orig[0], s->block[0], sizeof(DCTELEM) * 64 * mb_block_count);
2051 /* DCT & quantize */
2052 av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
2054 for (i = 0; i < mb_block_count; i++) {
2057 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2058 // FIXME we could decide to change to quantizer instead of
2060 // JS: I don't think that would be a good idea it could lower
2061 // quality instead of improve it. Just INTRADC clipping
2062 // deserves changes in quantizer
2064 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2066 s->block_last_index[i] = -1;
2068 if (s->quantizer_noise_shaping) {
2069 for (i = 0; i < mb_block_count; i++) {
2071 s->block_last_index[i] =
2072 dct_quantize_refine(s, s->block[i], weight[i],
2073 orig[i], i, s->qscale);
2078 if (s->luma_elim_threshold && !s->mb_intra)
2079 for (i = 0; i < 4; i++)
2080 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2081 if (s->chroma_elim_threshold && !s->mb_intra)
2082 for (i = 4; i < mb_block_count; i++)
2083 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2085 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2086 for (i = 0; i < mb_block_count; i++) {
2087 if (s->block_last_index[i] == -1)
2088 s->coded_score[i] = INT_MAX / 256;
2093 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2094 s->block_last_index[4] =
2095 s->block_last_index[5] = 0;
2097 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2100 // non c quantize code returns incorrect block_last_index FIXME
2101 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2102 for (i = 0; i < mb_block_count; i++) {
2104 if (s->block_last_index[i] > 0) {
2105 for (j = 63; j > 0; j--) {
2106 if (s->block[i][s->intra_scantable.permutated[j]])
2109 s->block_last_index[i] = j;
2114 /* huffman encode */
2115 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2116 case AV_CODEC_ID_MPEG1VIDEO:
2117 case AV_CODEC_ID_MPEG2VIDEO:
2118 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2119 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2121 case AV_CODEC_ID_MPEG4:
2122 if (CONFIG_MPEG4_ENCODER)
2123 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2125 case AV_CODEC_ID_MSMPEG4V2:
2126 case AV_CODEC_ID_MSMPEG4V3:
2127 case AV_CODEC_ID_WMV1:
2128 if (CONFIG_MSMPEG4_ENCODER)
2129 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2131 case AV_CODEC_ID_WMV2:
2132 if (CONFIG_WMV2_ENCODER)
2133 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2135 case AV_CODEC_ID_H261:
2136 if (CONFIG_H261_ENCODER)
2137 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2139 case AV_CODEC_ID_H263:
2140 case AV_CODEC_ID_H263P:
2141 case AV_CODEC_ID_FLV1:
2142 case AV_CODEC_ID_RV10:
2143 case AV_CODEC_ID_RV20:
2144 if (CONFIG_H263_ENCODER)
2145 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2147 case AV_CODEC_ID_MJPEG:
2148 case AV_CODEC_ID_AMV:
2149 if (CONFIG_MJPEG_ENCODER)
2150 ff_mjpeg_encode_mb(s, s->block);
2157 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2159 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
2160 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
2163 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2166 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2169 d->mb_skip_run= s->mb_skip_run;
2171 d->last_dc[i] = s->last_dc[i];
2174 d->mv_bits= s->mv_bits;
2175 d->i_tex_bits= s->i_tex_bits;
2176 d->p_tex_bits= s->p_tex_bits;
2177 d->i_count= s->i_count;
2178 d->f_count= s->f_count;
2179 d->b_count= s->b_count;
2180 d->skip_count= s->skip_count;
2181 d->misc_bits= s->misc_bits;
2185 d->qscale= s->qscale;
2186 d->dquant= s->dquant;
2188 d->esc3_level_length= s->esc3_level_length;
2191 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2194 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2195 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2198 d->mb_skip_run= s->mb_skip_run;
2200 d->last_dc[i] = s->last_dc[i];
2203 d->mv_bits= s->mv_bits;
2204 d->i_tex_bits= s->i_tex_bits;
2205 d->p_tex_bits= s->p_tex_bits;
2206 d->i_count= s->i_count;
2207 d->f_count= s->f_count;
2208 d->b_count= s->b_count;
2209 d->skip_count= s->skip_count;
2210 d->misc_bits= s->misc_bits;
2212 d->mb_intra= s->mb_intra;
2213 d->mb_skipped= s->mb_skipped;
2214 d->mv_type= s->mv_type;
2215 d->mv_dir= s->mv_dir;
2217 if(s->data_partitioning){
2219 d->tex_pb= s->tex_pb;
2223 d->block_last_index[i]= s->block_last_index[i];
2224 d->interlaced_dct= s->interlaced_dct;
2225 d->qscale= s->qscale;
2227 d->esc3_level_length= s->esc3_level_length;
2230 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2231 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2232 int *dmin, int *next_block, int motion_x, int motion_y)
2235 uint8_t *dest_backup[3];
2237 copy_context_before_encode(s, backup, type);
2239 s->block= s->blocks[*next_block];
2240 s->pb= pb[*next_block];
2241 if(s->data_partitioning){
2242 s->pb2 = pb2 [*next_block];
2243 s->tex_pb= tex_pb[*next_block];
2247 memcpy(dest_backup, s->dest, sizeof(s->dest));
2248 s->dest[0] = s->rd_scratchpad;
2249 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2250 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2251 assert(s->linesize >= 32); //FIXME
2254 encode_mb(s, motion_x, motion_y);
2256 score= put_bits_count(&s->pb);
2257 if(s->data_partitioning){
2258 score+= put_bits_count(&s->pb2);
2259 score+= put_bits_count(&s->tex_pb);
2262 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2263 ff_MPV_decode_mb(s, s->block);
2265 score *= s->lambda2;
2266 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2270 memcpy(s->dest, dest_backup, sizeof(s->dest));
2277 copy_context_after_encode(best, s, type);
2281 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2282 uint32_t *sq = ff_squareTbl + 256;
2287 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
2288 else if(w==8 && h==8)
2289 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
2293 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2302 static int sse_mb(MpegEncContext *s){
2306 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2307 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2310 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2311 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)
2312 +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)
2313 +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);
2315 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)
2316 +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)
2317 +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);
2320 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)
2321 +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)
2322 +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);
2325 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2326 MpegEncContext *s= *(void**)arg;
2330 s->me.dia_size= s->avctx->pre_dia_size;
2331 s->first_slice_line=1;
2332 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2333 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2334 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2336 s->first_slice_line=0;
2344 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2345 MpegEncContext *s= *(void**)arg;
2347 ff_check_alignment();
2349 s->me.dia_size= s->avctx->dia_size;
2350 s->first_slice_line=1;
2351 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2352 s->mb_x=0; //for block init below
2353 ff_init_block_index(s);
2354 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2355 s->block_index[0]+=2;
2356 s->block_index[1]+=2;
2357 s->block_index[2]+=2;
2358 s->block_index[3]+=2;
2360 /* compute motion vector & mb_type and store in context */
2361 if(s->pict_type==AV_PICTURE_TYPE_B)
2362 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2364 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2366 s->first_slice_line=0;
2371 static int mb_var_thread(AVCodecContext *c, void *arg){
2372 MpegEncContext *s= *(void**)arg;
2375 ff_check_alignment();
2377 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2378 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2381 uint8_t *pix = s->new_picture.f.data[0] + (yy * s->linesize) + xx;
2383 int sum = s->dsp.pix_sum(pix, s->linesize);
2385 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
2387 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2388 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2389 s->me.mb_var_sum_temp += varc;
2395 static void write_slice_end(MpegEncContext *s){
2396 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2397 if(s->partitioned_frame){
2398 ff_mpeg4_merge_partitions(s);
2401 ff_mpeg4_stuffing(&s->pb);
2402 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2403 ff_mjpeg_encode_stuffing(s);
2406 avpriv_align_put_bits(&s->pb);
2407 flush_put_bits(&s->pb);
2409 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2410 s->misc_bits+= get_bits_diff(s);
2413 static void write_mb_info(MpegEncContext *s)
2415 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2416 int offset = put_bits_count(&s->pb);
2417 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2418 int gobn = s->mb_y / s->gob_index;
2420 if (CONFIG_H263_ENCODER)
2421 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2422 bytestream_put_le32(&ptr, offset);
2423 bytestream_put_byte(&ptr, s->qscale);
2424 bytestream_put_byte(&ptr, gobn);
2425 bytestream_put_le16(&ptr, mba);
2426 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2427 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2428 /* 4MV not implemented */
2429 bytestream_put_byte(&ptr, 0); /* hmv2 */
2430 bytestream_put_byte(&ptr, 0); /* vmv2 */
2433 static void update_mb_info(MpegEncContext *s, int startcode)
2437 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2438 s->mb_info_size += 12;
2439 s->prev_mb_info = s->last_mb_info;
2442 s->prev_mb_info = put_bits_count(&s->pb)/8;
2443 /* This might have incremented mb_info_size above, and we return without
2444 * actually writing any info into that slot yet. But in that case,
2445 * this will be called again at the start of the after writing the
2446 * start code, actually writing the mb info. */
2450 s->last_mb_info = put_bits_count(&s->pb)/8;
2451 if (!s->mb_info_size)
2452 s->mb_info_size += 12;
2456 static int encode_thread(AVCodecContext *c, void *arg){
2457 MpegEncContext *s= *(void**)arg;
2458 int mb_x, mb_y, pdif = 0;
2459 int chr_h= 16>>s->chroma_y_shift;
2461 MpegEncContext best_s, backup_s;
2462 uint8_t bit_buf[2][MAX_MB_BYTES];
2463 uint8_t bit_buf2[2][MAX_MB_BYTES];
2464 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2465 PutBitContext pb[2], pb2[2], tex_pb[2];
2466 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
2468 ff_check_alignment();
2471 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2472 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2473 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2476 s->last_bits= put_bits_count(&s->pb);
2487 /* init last dc values */
2488 /* note: quant matrix value (8) is implied here */
2489 s->last_dc[i] = 128 << s->intra_dc_precision;
2491 s->current_picture.f.error[i] = 0;
2493 if(s->codec_id==AV_CODEC_ID_AMV){
2494 s->last_dc[0] = 128*8/13;
2495 s->last_dc[1] = 128*8/14;
2496 s->last_dc[2] = 128*8/14;
2499 memset(s->last_mv, 0, sizeof(s->last_mv));
2503 switch(s->codec_id){
2504 case AV_CODEC_ID_H263:
2505 case AV_CODEC_ID_H263P:
2506 case AV_CODEC_ID_FLV1:
2507 if (CONFIG_H263_ENCODER)
2508 s->gob_index = ff_h263_get_gob_height(s);
2510 case AV_CODEC_ID_MPEG4:
2511 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2512 ff_mpeg4_init_partitions(s);
2518 s->first_slice_line = 1;
2519 s->ptr_lastgob = s->pb.buf;
2520 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2521 // printf("row %d at %X\n", s->mb_y, (int)s);
2525 ff_set_qscale(s, s->qscale);
2526 ff_init_block_index(s);
2528 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2529 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2530 int mb_type= s->mb_type[xy];
2535 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2536 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2539 if(s->data_partitioning){
2540 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2541 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2542 av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
2548 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2549 ff_update_block_index(s);
2551 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2552 ff_h261_reorder_mb_index(s);
2553 xy= s->mb_y*s->mb_stride + s->mb_x;
2554 mb_type= s->mb_type[xy];
2557 /* write gob / video packet header */
2559 int current_packet_size, is_gob_start;
2561 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2563 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2565 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2567 switch(s->codec_id){
2568 case AV_CODEC_ID_H263:
2569 case AV_CODEC_ID_H263P:
2570 if(!s->h263_slice_structured)
2571 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2573 case AV_CODEC_ID_MPEG2VIDEO:
2574 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2575 case AV_CODEC_ID_MPEG1VIDEO:
2576 if(s->mb_skip_run) is_gob_start=0;
2578 case AV_CODEC_ID_MJPEG:
2579 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2584 if(s->start_mb_y != mb_y || mb_x!=0){
2586 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2587 ff_mpeg4_init_partitions(s);
2591 av_assert2((put_bits_count(&s->pb)&7) == 0);
2592 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2594 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
2595 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2596 int d= 100 / s->avctx->error_rate;
2598 current_packet_size=0;
2599 s->pb.buf_ptr= s->ptr_lastgob;
2600 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2604 if (s->avctx->rtp_callback){
2605 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2606 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2608 update_mb_info(s, 1);
2610 switch(s->codec_id){
2611 case AV_CODEC_ID_MPEG4:
2612 if (CONFIG_MPEG4_ENCODER) {
2613 ff_mpeg4_encode_video_packet_header(s);
2614 ff_mpeg4_clean_buffers(s);
2617 case AV_CODEC_ID_MPEG1VIDEO:
2618 case AV_CODEC_ID_MPEG2VIDEO:
2619 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2620 ff_mpeg1_encode_slice_header(s);
2621 ff_mpeg1_clean_buffers(s);
2624 case AV_CODEC_ID_H263:
2625 case AV_CODEC_ID_H263P:
2626 if (CONFIG_H263_ENCODER)
2627 ff_h263_encode_gob_header(s, mb_y);
2631 if(s->flags&CODEC_FLAG_PASS1){
2632 int bits= put_bits_count(&s->pb);
2633 s->misc_bits+= bits - s->last_bits;
2637 s->ptr_lastgob += current_packet_size;
2638 s->first_slice_line=1;
2639 s->resync_mb_x=mb_x;
2640 s->resync_mb_y=mb_y;
2644 if( (s->resync_mb_x == s->mb_x)
2645 && s->resync_mb_y+1 == s->mb_y){
2646 s->first_slice_line=0;
2650 s->dquant=0; //only for QP_RD
2652 update_mb_info(s, 0);
2654 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
2656 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2658 copy_context_before_encode(&backup_s, s, -1);
2660 best_s.data_partitioning= s->data_partitioning;
2661 best_s.partitioned_frame= s->partitioned_frame;
2662 if(s->data_partitioning){
2663 backup_s.pb2= s->pb2;
2664 backup_s.tex_pb= s->tex_pb;
2667 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2668 s->mv_dir = MV_DIR_FORWARD;
2669 s->mv_type = MV_TYPE_16X16;
2671 s->mv[0][0][0] = s->p_mv_table[xy][0];
2672 s->mv[0][0][1] = s->p_mv_table[xy][1];
2673 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2674 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2676 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2677 s->mv_dir = MV_DIR_FORWARD;
2678 s->mv_type = MV_TYPE_FIELD;
2681 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2682 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2683 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2685 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2686 &dmin, &next_block, 0, 0);
2688 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2689 s->mv_dir = MV_DIR_FORWARD;
2690 s->mv_type = MV_TYPE_16X16;
2694 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2695 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2697 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2698 s->mv_dir = MV_DIR_FORWARD;
2699 s->mv_type = MV_TYPE_8X8;
2702 s->mv[0][i][0] = s->current_picture.f.motion_val[0][s->block_index[i]][0];
2703 s->mv[0][i][1] = s->current_picture.f.motion_val[0][s->block_index[i]][1];
2705 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2706 &dmin, &next_block, 0, 0);
2708 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2709 s->mv_dir = MV_DIR_FORWARD;
2710 s->mv_type = MV_TYPE_16X16;
2712 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2713 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2714 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2715 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2717 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2718 s->mv_dir = MV_DIR_BACKWARD;
2719 s->mv_type = MV_TYPE_16X16;
2721 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2722 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2723 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2724 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2726 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2727 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2728 s->mv_type = MV_TYPE_16X16;
2730 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2731 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2732 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2733 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2734 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2735 &dmin, &next_block, 0, 0);
2737 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2738 s->mv_dir = MV_DIR_FORWARD;
2739 s->mv_type = MV_TYPE_FIELD;
2742 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2743 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2744 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2746 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2747 &dmin, &next_block, 0, 0);
2749 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2750 s->mv_dir = MV_DIR_BACKWARD;
2751 s->mv_type = MV_TYPE_FIELD;
2754 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2755 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2756 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2758 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2759 &dmin, &next_block, 0, 0);
2761 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2762 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2763 s->mv_type = MV_TYPE_FIELD;
2765 for(dir=0; dir<2; dir++){
2767 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2768 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2769 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2772 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2773 &dmin, &next_block, 0, 0);
2775 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2777 s->mv_type = MV_TYPE_16X16;
2781 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2782 &dmin, &next_block, 0, 0);
2783 if(s->h263_pred || s->h263_aic){
2785 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2787 ff_clean_intra_table_entries(s); //old mode?
2791 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2792 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2793 const int last_qp= backup_s.qscale;
2796 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2797 static const int dquant_tab[4]={-1,1,-2,2};
2799 av_assert2(backup_s.dquant == 0);
2802 s->mv_dir= best_s.mv_dir;
2803 s->mv_type = MV_TYPE_16X16;
2804 s->mb_intra= best_s.mb_intra;
2805 s->mv[0][0][0] = best_s.mv[0][0][0];
2806 s->mv[0][0][1] = best_s.mv[0][0][1];
2807 s->mv[1][0][0] = best_s.mv[1][0][0];
2808 s->mv[1][0][1] = best_s.mv[1][0][1];
2810 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2811 for(; qpi<4; qpi++){
2812 int dquant= dquant_tab[qpi];
2813 qp= last_qp + dquant;
2814 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2816 backup_s.dquant= dquant;
2817 if(s->mb_intra && s->dc_val[0]){
2819 dc[i]= s->dc_val[0][ s->block_index[i] ];
2820 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
2824 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2825 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2826 if(best_s.qscale != qp){
2827 if(s->mb_intra && s->dc_val[0]){
2829 s->dc_val[0][ s->block_index[i] ]= dc[i];
2830 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
2837 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2838 int mx= s->b_direct_mv_table[xy][0];
2839 int my= s->b_direct_mv_table[xy][1];
2841 backup_s.dquant = 0;
2842 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2844 ff_mpeg4_set_direct_mv(s, mx, my);
2845 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2846 &dmin, &next_block, mx, my);
2848 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2849 backup_s.dquant = 0;
2850 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2852 ff_mpeg4_set_direct_mv(s, 0, 0);
2853 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2854 &dmin, &next_block, 0, 0);
2856 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2859 coded |= s->block_last_index[i];
2862 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2863 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2864 mx=my=0; //FIXME find the one we actually used
2865 ff_mpeg4_set_direct_mv(s, mx, my);
2866 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2874 s->mv_dir= best_s.mv_dir;
2875 s->mv_type = best_s.mv_type;
2877 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2878 s->mv[0][0][1] = best_s.mv[0][0][1];
2879 s->mv[1][0][0] = best_s.mv[1][0][0];
2880 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2883 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2884 &dmin, &next_block, mx, my);
2889 s->current_picture.f.qscale_table[xy] = best_s.qscale;
2891 copy_context_after_encode(s, &best_s, -1);
2893 pb_bits_count= put_bits_count(&s->pb);
2894 flush_put_bits(&s->pb);
2895 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2898 if(s->data_partitioning){
2899 pb2_bits_count= put_bits_count(&s->pb2);
2900 flush_put_bits(&s->pb2);
2901 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2902 s->pb2= backup_s.pb2;
2904 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2905 flush_put_bits(&s->tex_pb);
2906 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2907 s->tex_pb= backup_s.tex_pb;
2909 s->last_bits= put_bits_count(&s->pb);
2911 if (CONFIG_H263_ENCODER &&
2912 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2913 ff_h263_update_motion_val(s);
2915 if(next_block==0){ //FIXME 16 vs linesize16
2916 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2917 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2918 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2921 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2922 ff_MPV_decode_mb(s, s->block);
2924 int motion_x = 0, motion_y = 0;
2925 s->mv_type=MV_TYPE_16X16;
2926 // only one MB-Type possible
2929 case CANDIDATE_MB_TYPE_INTRA:
2932 motion_x= s->mv[0][0][0] = 0;
2933 motion_y= s->mv[0][0][1] = 0;
2935 case CANDIDATE_MB_TYPE_INTER:
2936 s->mv_dir = MV_DIR_FORWARD;
2938 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2939 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2941 case CANDIDATE_MB_TYPE_INTER_I:
2942 s->mv_dir = MV_DIR_FORWARD;
2943 s->mv_type = MV_TYPE_FIELD;
2946 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2947 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2948 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2951 case CANDIDATE_MB_TYPE_INTER4V:
2952 s->mv_dir = MV_DIR_FORWARD;
2953 s->mv_type = MV_TYPE_8X8;
2956 s->mv[0][i][0] = s->current_picture.f.motion_val[0][s->block_index[i]][0];
2957 s->mv[0][i][1] = s->current_picture.f.motion_val[0][s->block_index[i]][1];
2960 case CANDIDATE_MB_TYPE_DIRECT:
2961 if (CONFIG_MPEG4_ENCODER) {
2962 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2964 motion_x=s->b_direct_mv_table[xy][0];
2965 motion_y=s->b_direct_mv_table[xy][1];
2966 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
2969 case CANDIDATE_MB_TYPE_DIRECT0:
2970 if (CONFIG_MPEG4_ENCODER) {
2971 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2973 ff_mpeg4_set_direct_mv(s, 0, 0);
2976 case CANDIDATE_MB_TYPE_BIDIR:
2977 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2979 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2980 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2981 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2982 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2984 case CANDIDATE_MB_TYPE_BACKWARD:
2985 s->mv_dir = MV_DIR_BACKWARD;
2987 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2988 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2990 case CANDIDATE_MB_TYPE_FORWARD:
2991 s->mv_dir = MV_DIR_FORWARD;
2993 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2994 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2995 // printf(" %d %d ", motion_x, motion_y);
2997 case CANDIDATE_MB_TYPE_FORWARD_I:
2998 s->mv_dir = MV_DIR_FORWARD;
2999 s->mv_type = MV_TYPE_FIELD;
3002 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
3003 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3004 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3007 case CANDIDATE_MB_TYPE_BACKWARD_I:
3008 s->mv_dir = MV_DIR_BACKWARD;
3009 s->mv_type = MV_TYPE_FIELD;
3012 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3013 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3014 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3017 case CANDIDATE_MB_TYPE_BIDIR_I:
3018 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3019 s->mv_type = MV_TYPE_FIELD;
3021 for(dir=0; dir<2; dir++){
3023 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3024 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3025 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3030 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3033 encode_mb(s, motion_x, motion_y);
3035 // RAL: Update last macroblock type
3036 s->last_mv_dir = s->mv_dir;
3038 if (CONFIG_H263_ENCODER &&
3039 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3040 ff_h263_update_motion_val(s);
3042 ff_MPV_decode_mb(s, s->block);
3045 /* clean the MV table in IPS frames for direct mode in B frames */
3046 if(s->mb_intra /* && I,P,S_TYPE */){
3047 s->p_mv_table[xy][0]=0;
3048 s->p_mv_table[xy][1]=0;
3051 if(s->flags&CODEC_FLAG_PSNR){
3055 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3056 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3058 s->current_picture.f.error[0] += sse(
3059 s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3060 s->dest[0], w, h, s->linesize);
3061 s->current_picture.f.error[1] += sse(
3062 s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3063 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3064 s->current_picture.f.error[2] += sse(
3065 s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3066 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3069 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3070 ff_h263_loop_filter(s);
3072 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
3076 //not beautiful here but we must write it before flushing so it has to be here
3077 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3078 ff_msmpeg4_encode_ext_header(s);
3082 /* Send the last GOB if RTP */
3083 if (s->avctx->rtp_callback) {
3084 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3085 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3086 /* Call the RTP callback to send the last GOB */
3088 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3094 #define MERGE(field) dst->field += src->field; src->field=0
3095 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3096 MERGE(me.scene_change_score);
3097 MERGE(me.mc_mb_var_sum_temp);
3098 MERGE(me.mb_var_sum_temp);
3101 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3104 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3105 MERGE(dct_count[1]);
3115 MERGE(padding_bug_score);
3116 MERGE(current_picture.f.error[0]);
3117 MERGE(current_picture.f.error[1]);
3118 MERGE(current_picture.f.error[2]);
3120 if(dst->avctx->noise_reduction){
3121 for(i=0; i<64; i++){
3122 MERGE(dct_error_sum[0][i]);
3123 MERGE(dct_error_sum[1][i]);
3127 assert(put_bits_count(&src->pb) % 8 ==0);
3128 assert(put_bits_count(&dst->pb) % 8 ==0);
3129 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3130 flush_put_bits(&dst->pb);
3133 static int estimate_qp(MpegEncContext *s, int dry_run){
3134 if (s->next_lambda){
3135 s->current_picture_ptr->f.quality =
3136 s->current_picture.f.quality = s->next_lambda;
3137 if(!dry_run) s->next_lambda= 0;
3138 } else if (!s->fixed_qscale) {
3139 s->current_picture_ptr->f.quality =
3140 s->current_picture.f.quality = ff_rate_estimate_qscale(s, dry_run);
3141 if (s->current_picture.f.quality < 0)
3145 if(s->adaptive_quant){
3146 switch(s->codec_id){
3147 case AV_CODEC_ID_MPEG4:
3148 if (CONFIG_MPEG4_ENCODER)
3149 ff_clean_mpeg4_qscales(s);
3151 case AV_CODEC_ID_H263:
3152 case AV_CODEC_ID_H263P:
3153 case AV_CODEC_ID_FLV1:
3154 if (CONFIG_H263_ENCODER)
3155 ff_clean_h263_qscales(s);
3158 ff_init_qscale_tab(s);
3161 s->lambda= s->lambda_table[0];
3164 s->lambda = s->current_picture.f.quality;
3165 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
3170 /* must be called before writing the header */
3171 static void set_frame_distances(MpegEncContext * s){
3172 assert(s->current_picture_ptr->f.pts != AV_NOPTS_VALUE);
3173 s->time = s->current_picture_ptr->f.pts * s->avctx->time_base.num;
3175 if(s->pict_type==AV_PICTURE_TYPE_B){
3176 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3177 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3179 s->pp_time= s->time - s->last_non_b_time;
3180 s->last_non_b_time= s->time;
3181 assert(s->picture_number==0 || s->pp_time > 0);
3185 static int encode_picture(MpegEncContext *s, int picture_number)
3189 int context_count = s->slice_context_count;
3191 s->picture_number = picture_number;
3193 /* Reset the average MB variance */
3194 s->me.mb_var_sum_temp =
3195 s->me.mc_mb_var_sum_temp = 0;
3197 /* we need to initialize some time vars before we can encode b-frames */
3198 // RAL: Condition added for MPEG1VIDEO
3199 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3200 set_frame_distances(s);
3201 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3202 ff_set_mpeg4_time(s);
3204 s->me.scene_change_score=0;
3206 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3208 if(s->pict_type==AV_PICTURE_TYPE_I){
3209 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3210 else s->no_rounding=0;
3211 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3212 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3213 s->no_rounding ^= 1;
3216 if(s->flags & CODEC_FLAG_PASS2){
3217 if (estimate_qp(s,1) < 0)
3219 ff_get_2pass_fcode(s);
3220 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3221 if(s->pict_type==AV_PICTURE_TYPE_B)
3222 s->lambda= s->last_lambda_for[s->pict_type];
3224 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3228 if(s->codec_id != AV_CODEC_ID_AMV){
3229 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
3230 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
3231 s->q_chroma_intra_matrix = s->q_intra_matrix;
3232 s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
3235 s->mb_intra=0; //for the rate distortion & bit compare functions
3236 for(i=1; i<context_count; i++){
3237 ff_update_duplicate_context(s->thread_context[i], s);
3243 /* Estimate motion for every MB */
3244 if(s->pict_type != AV_PICTURE_TYPE_I){
3245 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3246 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3247 if(s->pict_type != AV_PICTURE_TYPE_B && s->avctx->me_threshold==0){
3248 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3249 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3253 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3254 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3256 for(i=0; i<s->mb_stride*s->mb_height; i++)
3257 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3259 if(!s->fixed_qscale){
3260 /* finding spatial complexity for I-frame rate control */
3261 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3264 for(i=1; i<context_count; i++){
3265 merge_context_after_me(s, s->thread_context[i]);
3267 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3268 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3271 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3272 s->pict_type= AV_PICTURE_TYPE_I;
3273 for(i=0; i<s->mb_stride*s->mb_height; i++)
3274 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3275 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3276 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3280 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3281 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3283 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3285 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3286 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3287 s->f_code= FFMAX3(s->f_code, a, b);
3290 ff_fix_long_p_mvs(s);
3291 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3292 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3296 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3297 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3302 if(s->pict_type==AV_PICTURE_TYPE_B){
3305 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3306 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3307 s->f_code = FFMAX(a, b);
3309 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3310 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3311 s->b_code = FFMAX(a, b);
3313 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3314 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3315 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3316 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3317 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3319 for(dir=0; dir<2; dir++){
3322 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3323 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3324 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3325 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3333 if (estimate_qp(s, 0) < 0)
3336 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3337 s->qscale= 3; //reduce clipping problems
3339 if (s->out_format == FMT_MJPEG) {
3340 /* for mjpeg, we do include qscale in the matrix */
3342 int j= s->dsp.idct_permutation[i];
3344 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3346 s->y_dc_scale_table=
3347 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3348 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3349 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3350 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3353 if(s->codec_id == AV_CODEC_ID_AMV){
3354 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};
3355 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};
3357 int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];
3359 s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
3360 s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
3362 s->y_dc_scale_table= y;
3363 s->c_dc_scale_table= c;
3364 s->intra_matrix[0] = 13;
3365 s->chroma_intra_matrix[0] = 14;
3366 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3367 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3368 ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3369 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3373 //FIXME var duplication
3374 s->current_picture_ptr->f.key_frame =
3375 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3376 s->current_picture_ptr->f.pict_type =
3377 s->current_picture.f.pict_type = s->pict_type;
3379 if (s->current_picture.f.key_frame)
3380 s->picture_in_gop_number=0;
3382 s->mb_x = s->mb_y = 0;
3383 s->last_bits= put_bits_count(&s->pb);
3384 switch(s->out_format) {
3386 if (CONFIG_MJPEG_ENCODER)
3387 ff_mjpeg_encode_picture_header(s);
3390 if (CONFIG_H261_ENCODER)
3391 ff_h261_encode_picture_header(s, picture_number);
3394 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3395 ff_wmv2_encode_picture_header(s, picture_number);
3396 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3397 ff_msmpeg4_encode_picture_header(s, picture_number);
3398 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3399 ff_mpeg4_encode_picture_header(s, picture_number);
3400 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3401 ff_rv10_encode_picture_header(s, picture_number);
3402 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3403 ff_rv20_encode_picture_header(s, picture_number);
3404 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3405 ff_flv_encode_picture_header(s, picture_number);
3406 else if (CONFIG_H263_ENCODER)
3407 ff_h263_encode_picture_header(s, picture_number);
3410 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3411 ff_mpeg1_encode_picture_header(s, picture_number);
3418 bits= put_bits_count(&s->pb);
3419 s->header_bits= bits - s->last_bits;
3421 for(i=1; i<context_count; i++){
3422 update_duplicate_context_after_me(s->thread_context[i], s);
3424 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3425 for(i=1; i<context_count; i++){
3426 merge_context_after_encode(s, s->thread_context[i]);
3432 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
3433 const int intra= s->mb_intra;
3436 s->dct_count[intra]++;
3438 for(i=0; i<64; i++){
3439 int level= block[i];
3443 s->dct_error_sum[intra][i] += level;
3444 level -= s->dct_offset[intra][i];
3445 if(level<0) level=0;
3447 s->dct_error_sum[intra][i] -= level;
3448 level += s->dct_offset[intra][i];
3449 if(level>0) level=0;
3456 static int dct_quantize_trellis_c(MpegEncContext *s,
3457 DCTELEM *block, int n,
3458 int qscale, int *overflow){
3460 const uint8_t *scantable= s->intra_scantable.scantable;
3461 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3463 unsigned int threshold1, threshold2;
3475 int coeff_count[64];
3476 int qmul, qadd, start_i, last_non_zero, i, dc;
3477 const int esc_length= s->ac_esc_length;
3479 uint8_t * last_length;
3480 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3482 s->dsp.fdct (block);
3484 if(s->dct_error_sum)
3485 s->denoise_dct(s, block);
3487 qadd= ((qscale-1)|1)*8;
3498 /* For AIC we skip quant/dequant of INTRADC */
3503 /* note: block[0] is assumed to be positive */
3504 block[0] = (block[0] + (q >> 1)) / q;
3507 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3508 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3509 bias= 1<<(QMAT_SHIFT-1);
3510 length = s->intra_ac_vlc_length;
3511 last_length= s->intra_ac_vlc_last_length;
3515 qmat = s->q_inter_matrix[qscale];
3516 length = s->inter_ac_vlc_length;
3517 last_length= s->inter_ac_vlc_last_length;
3521 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3522 threshold2= (threshold1<<1);
3524 for(i=63; i>=start_i; i--) {
3525 const int j = scantable[i];
3526 int level = block[j] * qmat[j];
3528 if(((unsigned)(level+threshold1))>threshold2){
3534 for(i=start_i; i<=last_non_zero; i++) {
3535 const int j = scantable[i];
3536 int level = block[j] * qmat[j];
3538 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3539 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3540 if(((unsigned)(level+threshold1))>threshold2){
3542 level= (bias + level)>>QMAT_SHIFT;
3544 coeff[1][i]= level-1;
3545 // coeff[2][k]= level-2;
3547 level= (bias - level)>>QMAT_SHIFT;
3548 coeff[0][i]= -level;
3549 coeff[1][i]= -level+1;
3550 // coeff[2][k]= -level+2;
3552 coeff_count[i]= FFMIN(level, 2);
3553 av_assert2(coeff_count[i]);
3556 coeff[0][i]= (level>>31)|1;
3561 *overflow= s->max_qcoeff < max; //overflow might have happened
3563 if(last_non_zero < start_i){
3564 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
3565 return last_non_zero;
3568 score_tab[start_i]= 0;
3569 survivor[0]= start_i;
3572 for(i=start_i; i<=last_non_zero; i++){
3573 int level_index, j, zero_distortion;
3574 int dct_coeff= FFABS(block[ scantable[i] ]);
3575 int best_score=256*256*256*120;
3577 if (s->dsp.fdct == ff_fdct_ifast)
3578 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3579 zero_distortion= dct_coeff*dct_coeff;
3581 for(level_index=0; level_index < coeff_count[i]; level_index++){
3583 int level= coeff[level_index][i];
3584 const int alevel= FFABS(level);
3589 if(s->out_format == FMT_H263){
3590 unquant_coeff= alevel*qmul + qadd;
3592 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3594 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3595 unquant_coeff = (unquant_coeff - 1) | 1;
3597 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3598 unquant_coeff = (unquant_coeff - 1) | 1;
3603 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3605 if((level&(~127)) == 0){
3606 for(j=survivor_count-1; j>=0; j--){
3607 int run= i - survivor[j];
3608 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3609 score += score_tab[i-run];
3611 if(score < best_score){
3614 level_tab[i+1]= level-64;
3618 if(s->out_format == FMT_H263){
3619 for(j=survivor_count-1; j>=0; j--){
3620 int run= i - survivor[j];
3621 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3622 score += score_tab[i-run];
3623 if(score < last_score){
3626 last_level= level-64;
3632 distortion += esc_length*lambda;
3633 for(j=survivor_count-1; j>=0; j--){
3634 int run= i - survivor[j];
3635 int score= distortion + score_tab[i-run];
3637 if(score < best_score){
3640 level_tab[i+1]= level-64;
3644 if(s->out_format == FMT_H263){
3645 for(j=survivor_count-1; j>=0; j--){
3646 int run= i - survivor[j];
3647 int score= distortion + score_tab[i-run];
3648 if(score < last_score){
3651 last_level= level-64;
3659 score_tab[i+1]= best_score;
3661 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3662 if(last_non_zero <= 27){
3663 for(; survivor_count; survivor_count--){
3664 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3668 for(; survivor_count; survivor_count--){
3669 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3674 survivor[ survivor_count++ ]= i+1;
3677 if(s->out_format != FMT_H263){
3678 last_score= 256*256*256*120;
3679 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3680 int score= score_tab[i];
3681 if(i) score += lambda*2; //FIXME exacter?
3683 if(score < last_score){
3686 last_level= level_tab[i];
3687 last_run= run_tab[i];
3692 s->coded_score[n] = last_score;
3694 dc= FFABS(block[0]);
3695 last_non_zero= last_i - 1;
3696 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
3698 if(last_non_zero < start_i)
3699 return last_non_zero;
3701 if(last_non_zero == 0 && start_i == 0){
3703 int best_score= dc * dc;
3705 for(i=0; i<coeff_count[0]; i++){
3706 int level= coeff[i][0];
3707 int alevel= FFABS(level);
3708 int unquant_coeff, score, distortion;
3710 if(s->out_format == FMT_H263){
3711 unquant_coeff= (alevel*qmul + qadd)>>3;
3713 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3714 unquant_coeff = (unquant_coeff - 1) | 1;
3716 unquant_coeff = (unquant_coeff + 4) >> 3;
3717 unquant_coeff<<= 3 + 3;
3719 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3721 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3722 else score= distortion + esc_length*lambda;
3724 if(score < best_score){
3726 best_level= level - 64;
3729 block[0]= best_level;
3730 s->coded_score[n] = best_score - dc*dc;
3731 if(best_level == 0) return -1;
3732 else return last_non_zero;
3736 av_assert2(last_level);
3738 block[ perm_scantable[last_non_zero] ]= last_level;
3741 for(; i>start_i; i -= run_tab[i] + 1){
3742 block[ perm_scantable[i-1] ]= level_tab[i];
3745 return last_non_zero;
3748 //#define REFINE_STATS 1
3749 static int16_t basis[64][64];
3751 static void build_basis(uint8_t *perm){
3758 double s= 0.25*(1<<BASIS_SHIFT);
3760 int perm_index= perm[index];
3761 if(i==0) s*= sqrt(0.5);
3762 if(j==0) s*= sqrt(0.5);
3763 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)));
3770 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3771 DCTELEM *block, int16_t *weight, DCTELEM *orig,
3774 LOCAL_ALIGNED_16(DCTELEM, d1, [64]);
3775 const uint8_t *scantable= s->intra_scantable.scantable;
3776 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3777 // unsigned int threshold1, threshold2;
3782 int qmul, qadd, start_i, last_non_zero, i, dc;
3784 uint8_t * last_length;
3786 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3789 static int after_last=0;
3790 static int to_zero=0;
3791 static int from_zero=0;
3794 static int messed_sign=0;
3797 if(basis[0][0] == 0)
3798 build_basis(s->dsp.idct_permutation);
3809 /* For AIC we skip quant/dequant of INTRADC */
3813 q <<= RECON_SHIFT-3;
3814 /* note: block[0] is assumed to be positive */
3816 // block[0] = (block[0] + (q >> 1)) / q;
3818 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3819 // bias= 1<<(QMAT_SHIFT-1);
3820 length = s->intra_ac_vlc_length;
3821 last_length= s->intra_ac_vlc_last_length;
3825 length = s->inter_ac_vlc_length;
3826 last_length= s->inter_ac_vlc_last_length;
3828 last_non_zero = s->block_last_index[n];
3833 dc += (1<<(RECON_SHIFT-1));
3834 for(i=0; i<64; i++){
3835 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3838 STOP_TIMER("memset rem[]")}
3841 for(i=0; i<64; i++){
3846 w= FFABS(weight[i]) + qns*one;
3847 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3850 // w=weight[i] = (63*qns + (w/2)) / w;
3853 av_assert2(w<(1<<6));
3856 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3862 for(i=start_i; i<=last_non_zero; i++){
3863 int j= perm_scantable[i];
3864 const int level= block[j];
3868 if(level<0) coeff= qmul*level - qadd;
3869 else coeff= qmul*level + qadd;
3870 run_tab[rle_index++]=run;
3873 s->dsp.add_8x8basis(rem, basis[j], coeff);
3879 if(last_non_zero>0){
3880 STOP_TIMER("init rem[]")
3887 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
3890 int run2, best_unquant_change=0, analyze_gradient;
3894 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3896 if(analyze_gradient){
3900 for(i=0; i<64; i++){
3903 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3906 STOP_TIMER("rem*w*w")}
3916 const int level= block[0];
3917 int change, old_coeff;
3919 av_assert2(s->mb_intra);
3923 for(change=-1; change<=1; change+=2){
3924 int new_level= level + change;
3925 int score, new_coeff;
3927 new_coeff= q*new_level;
3928 if(new_coeff >= 2048 || new_coeff < 0)
3931 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
3932 if(score<best_score){
3935 best_change= change;
3936 best_unquant_change= new_coeff - old_coeff;
3943 run2= run_tab[rle_index++];
3947 for(i=start_i; i<64; i++){
3948 int j= perm_scantable[i];
3949 const int level= block[j];
3950 int change, old_coeff;
3952 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3956 if(level<0) old_coeff= qmul*level - qadd;
3957 else old_coeff= qmul*level + qadd;
3958 run2= run_tab[rle_index++]; //FIXME ! maybe after last
3962 av_assert2(run2>=0 || i >= last_non_zero );
3965 for(change=-1; change<=1; change+=2){
3966 int new_level= level + change;
3967 int score, new_coeff, unquant_change;
3970 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
3974 if(new_level<0) new_coeff= qmul*new_level - qadd;
3975 else new_coeff= qmul*new_level + qadd;
3976 if(new_coeff >= 2048 || new_coeff <= -2048)
3978 //FIXME check for overflow
3981 if(level < 63 && level > -63){
3982 if(i < last_non_zero)
3983 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
3984 - length[UNI_AC_ENC_INDEX(run, level+64)];
3986 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
3987 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
3990 av_assert2(FFABS(new_level)==1);
3992 if(analyze_gradient){
3993 int g= d1[ scantable[i] ];
3994 if(g && (g^new_level) >= 0)
3998 if(i < last_non_zero){
3999 int next_i= i + run2 + 1;
4000 int next_level= block[ perm_scantable[next_i] ] + 64;
4002 if(next_level&(~127))
4005 if(next_i < last_non_zero)
4006 score += length[UNI_AC_ENC_INDEX(run, 65)]
4007 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4008 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4010 score += length[UNI_AC_ENC_INDEX(run, 65)]
4011 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4012 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4014 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4016 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4017 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4023 av_assert2(FFABS(level)==1);
4025 if(i < last_non_zero){
4026 int next_i= i + run2 + 1;
4027 int next_level= block[ perm_scantable[next_i] ] + 64;
4029 if(next_level&(~127))
4032 if(next_i < last_non_zero)
4033 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4034 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4035 - length[UNI_AC_ENC_INDEX(run, 65)];
4037 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4038 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4039 - length[UNI_AC_ENC_INDEX(run, 65)];
4041 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4043 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4044 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4051 unquant_change= new_coeff - old_coeff;
4052 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4054 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
4055 if(score<best_score){
4058 best_change= change;
4059 best_unquant_change= unquant_change;
4063 prev_level= level + 64;
4064 if(prev_level&(~127))
4073 STOP_TIMER("iterative step")}
4077 int j= perm_scantable[ best_coeff ];
4079 block[j] += best_change;
4081 if(best_coeff > last_non_zero){
4082 last_non_zero= best_coeff;
4083 av_assert2(block[j]);
4090 if(block[j] - best_change){
4091 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4103 for(; last_non_zero>=start_i; last_non_zero--){
4104 if(block[perm_scantable[last_non_zero]])
4110 if(256*256*256*64 % count == 0){
4111 printf("after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
4116 for(i=start_i; i<=last_non_zero; i++){
4117 int j= perm_scantable[i];
4118 const int level= block[j];
4121 run_tab[rle_index++]=run;
4128 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
4134 if(last_non_zero>0){
4135 STOP_TIMER("iterative search")
4140 return last_non_zero;
4143 int ff_dct_quantize_c(MpegEncContext *s,
4144 DCTELEM *block, int n,
4145 int qscale, int *overflow)
4147 int i, j, level, last_non_zero, q, start_i;
4149 const uint8_t *scantable= s->intra_scantable.scantable;
4152 unsigned int threshold1, threshold2;
4154 s->dsp.fdct (block);
4156 if(s->dct_error_sum)
4157 s->denoise_dct(s, block);
4167 /* For AIC we skip quant/dequant of INTRADC */
4170 /* note: block[0] is assumed to be positive */
4171 block[0] = (block[0] + (q >> 1)) / q;
4174 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4175 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4179 qmat = s->q_inter_matrix[qscale];
4180 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4182 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4183 threshold2= (threshold1<<1);
4184 for(i=63;i>=start_i;i--) {
4186 level = block[j] * qmat[j];
4188 if(((unsigned)(level+threshold1))>threshold2){
4195 for(i=start_i; i<=last_non_zero; i++) {
4197 level = block[j] * qmat[j];
4199 // if( bias+level >= (1<<QMAT_SHIFT)
4200 // || bias-level >= (1<<QMAT_SHIFT)){
4201 if(((unsigned)(level+threshold1))>threshold2){
4203 level= (bias + level)>>QMAT_SHIFT;
4206 level= (bias - level)>>QMAT_SHIFT;
4214 *overflow= s->max_qcoeff < max; //overflow might have happened
4216 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4217 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4218 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4220 return last_non_zero;
4223 #define OFFSET(x) offsetof(MpegEncContext, x)
4224 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4225 static const AVOption h263_options[] = {
4226 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4227 { "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},
4228 { "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 },
4233 static const AVClass h263_class = {
4234 .class_name = "H.263 encoder",
4235 .item_name = av_default_item_name,
4236 .option = h263_options,
4237 .version = LIBAVUTIL_VERSION_INT,
4240 AVCodec ff_h263_encoder = {
4242 .type = AVMEDIA_TYPE_VIDEO,
4243 .id = AV_CODEC_ID_H263,
4244 .priv_data_size = sizeof(MpegEncContext),
4245 .init = ff_MPV_encode_init,
4246 .encode2 = ff_MPV_encode_picture,
4247 .close = ff_MPV_encode_end,
4248 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
4249 .long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4250 .priv_class = &h263_class,
4253 static const AVOption h263p_options[] = {
4254 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4255 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4256 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4257 { "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},
4261 static const AVClass h263p_class = {
4262 .class_name = "H.263p encoder",
4263 .item_name = av_default_item_name,
4264 .option = h263p_options,
4265 .version = LIBAVUTIL_VERSION_INT,
4268 AVCodec ff_h263p_encoder = {
4270 .type = AVMEDIA_TYPE_VIDEO,
4271 .id = AV_CODEC_ID_H263P,
4272 .priv_data_size = sizeof(MpegEncContext),
4273 .init = ff_MPV_encode_init,
4274 .encode2 = ff_MPV_encode_picture,
4275 .close = ff_MPV_encode_end,
4276 .capabilities = CODEC_CAP_SLICE_THREADS,
4277 .pix_fmts = (const enum PixelFormat[]){ PIX_FMT_YUV420P, PIX_FMT_NONE },
4278 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4279 .priv_class = &h263p_class,
4282 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4284 AVCodec ff_msmpeg4v2_encoder = {
4285 .name = "msmpeg4v2",
4286 .type = AVMEDIA_TYPE_VIDEO,
4287 .id = AV_CODEC_ID_MSMPEG4V2,
4288 .priv_data_size = sizeof(MpegEncContext),
4289 .init = ff_MPV_encode_init,
4290 .encode2 = ff_MPV_encode_picture,
4291 .close = ff_MPV_encode_end,
4292 .pix_fmts = (const enum PixelFormat[]){ PIX_FMT_YUV420P, PIX_FMT_NONE },
4293 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4294 .priv_class = &msmpeg4v2_class,
4297 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4299 AVCodec ff_msmpeg4v3_encoder = {
4301 .type = AVMEDIA_TYPE_VIDEO,
4302 .id = AV_CODEC_ID_MSMPEG4V3,
4303 .priv_data_size = sizeof(MpegEncContext),
4304 .init = ff_MPV_encode_init,
4305 .encode2 = ff_MPV_encode_picture,
4306 .close = ff_MPV_encode_end,
4307 .pix_fmts = (const enum PixelFormat[]){ PIX_FMT_YUV420P, PIX_FMT_NONE },
4308 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4309 .priv_class = &msmpeg4v3_class,
4312 FF_MPV_GENERIC_CLASS(wmv1)
4314 AVCodec ff_wmv1_encoder = {
4316 .type = AVMEDIA_TYPE_VIDEO,
4317 .id = AV_CODEC_ID_WMV1,
4318 .priv_data_size = sizeof(MpegEncContext),
4319 .init = ff_MPV_encode_init,
4320 .encode2 = ff_MPV_encode_picture,
4321 .close = ff_MPV_encode_end,
4322 .pix_fmts = (const enum PixelFormat[]){ PIX_FMT_YUV420P, PIX_FMT_NONE },
4323 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4324 .priv_class = &wmv1_class,