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/internal.h"
31 #include "libavutil/intmath.h"
32 #include "libavutil/mathematics.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/opt.h"
39 #include "mpegvideo.h"
47 #include "aandcttab.h"
49 #include "mpeg4video.h"
51 #include "bytestream.h"
55 static int encode_picture(MpegEncContext *s, int picture_number);
56 static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
57 static int sse_mb(MpegEncContext *s);
58 static void denoise_dct_c(MpegEncContext *s, int16_t *block);
59 static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
61 static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
62 static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
64 const AVOption ff_mpv_generic_options[] = {
69 void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64],
70 uint16_t (*qmat16)[2][64],
71 const uint16_t *quant_matrix,
72 int bias, int qmin, int qmax, int intra)
77 for (qscale = qmin; qscale <= qmax; qscale++) {
79 if (dsp->fdct == ff_jpeg_fdct_islow_8 ||
80 dsp->fdct == ff_jpeg_fdct_islow_10 ||
81 dsp->fdct == ff_faandct) {
82 for (i = 0; i < 64; i++) {
83 const int j = dsp->idct_permutation[i];
84 /* 16 <= qscale * quant_matrix[i] <= 7905
85 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
86 * 19952 <= x <= 249205026
87 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
88 * 3444240 >= (1 << 36) / (x) >= 275 */
90 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
91 (qscale * quant_matrix[j]));
93 } else if (dsp->fdct == ff_fdct_ifast) {
94 for (i = 0; i < 64; i++) {
95 const int j = dsp->idct_permutation[i];
96 /* 16 <= qscale * quant_matrix[i] <= 7905
97 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
98 * 19952 <= x <= 249205026
99 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
100 * 3444240 >= (1 << 36) / (x) >= 275 */
102 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
103 (ff_aanscales[i] * (int64_t)qscale * quant_matrix[j]));
106 for (i = 0; i < 64; i++) {
107 const int j = dsp->idct_permutation[i];
108 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
109 * Assume x = qscale * quant_matrix[i]
111 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
112 * so 32768 >= (1 << 19) / (x) >= 67 */
113 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
114 (qscale * quant_matrix[j]));
115 //qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) /
116 // (qscale * quant_matrix[i]);
117 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
118 (qscale * quant_matrix[j]);
120 if (qmat16[qscale][0][i] == 0 ||
121 qmat16[qscale][0][i] == 128 * 256)
122 qmat16[qscale][0][i] = 128 * 256 - 1;
123 qmat16[qscale][1][i] =
124 ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
125 qmat16[qscale][0][i]);
129 for (i = intra; i < 64; i++) {
131 if (dsp->fdct == ff_fdct_ifast) {
132 max = (8191LL * ff_aanscales[i]) >> 14;
134 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
140 av_log(NULL, AV_LOG_INFO,
141 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
146 static inline void update_qscale(MpegEncContext *s)
148 s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
149 (FF_LAMBDA_SHIFT + 7);
150 s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
152 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
156 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
162 for (i = 0; i < 64; i++) {
163 put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
170 * init s->current_picture.qscale_table from s->lambda_table
172 void ff_init_qscale_tab(MpegEncContext *s)
174 int8_t * const qscale_table = s->current_picture.qscale_table;
177 for (i = 0; i < s->mb_num; i++) {
178 unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
179 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
180 qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
185 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst,
188 dst->pict_type = src->pict_type;
189 dst->quality = src->quality;
190 dst->coded_picture_number = src->coded_picture_number;
191 dst->display_picture_number = src->display_picture_number;
192 //dst->reference = src->reference;
194 dst->interlaced_frame = src->interlaced_frame;
195 dst->top_field_first = src->top_field_first;
198 static void update_duplicate_context_after_me(MpegEncContext *dst,
201 #define COPY(a) dst->a= src->a
203 COPY(current_picture);
209 COPY(picture_in_gop_number);
210 COPY(gop_picture_number);
211 COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
212 COPY(progressive_frame); // FIXME don't set in encode_header
213 COPY(partitioned_frame); // FIXME don't set in encode_header
218 * Set the given MpegEncContext to defaults for encoding.
219 * the changed fields will not depend upon the prior state of the MpegEncContext.
221 static void MPV_encode_defaults(MpegEncContext *s)
224 ff_MPV_common_defaults(s);
226 for (i = -16; i < 16; i++) {
227 default_fcode_tab[i + MAX_MV] = 1;
229 s->me.mv_penalty = default_mv_penalty;
230 s->fcode_tab = default_fcode_tab;
233 av_cold int ff_dct_encode_init(MpegEncContext *s) {
235 ff_dct_encode_init_x86(s);
237 if (!s->dct_quantize)
238 s->dct_quantize = ff_dct_quantize_c;
240 s->denoise_dct = denoise_dct_c;
241 s->fast_dct_quantize = s->dct_quantize;
242 if (s->avctx->trellis)
243 s->dct_quantize = dct_quantize_trellis_c;
248 /* init video encoder */
249 av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
251 MpegEncContext *s = avctx->priv_data;
253 int chroma_h_shift, chroma_v_shift;
255 MPV_encode_defaults(s);
257 switch (avctx->codec_id) {
258 case AV_CODEC_ID_MPEG2VIDEO:
259 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
260 avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
261 av_log(avctx, AV_LOG_ERROR,
262 "only YUV420 and YUV422 are supported\n");
266 case AV_CODEC_ID_LJPEG:
267 if (avctx->pix_fmt != AV_PIX_FMT_YUVJ420P &&
268 avctx->pix_fmt != AV_PIX_FMT_YUVJ422P &&
269 avctx->pix_fmt != AV_PIX_FMT_YUVJ444P &&
270 avctx->pix_fmt != AV_PIX_FMT_BGR0 &&
271 avctx->pix_fmt != AV_PIX_FMT_BGRA &&
272 avctx->pix_fmt != AV_PIX_FMT_BGR24 &&
273 ((avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
274 avctx->pix_fmt != AV_PIX_FMT_YUV422P &&
275 avctx->pix_fmt != AV_PIX_FMT_YUV444P) ||
276 avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL)) {
277 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in LJPEG\n");
281 case AV_CODEC_ID_MJPEG:
282 case AV_CODEC_ID_AMV:
283 if (avctx->pix_fmt != AV_PIX_FMT_YUVJ420P &&
284 avctx->pix_fmt != AV_PIX_FMT_YUVJ422P &&
285 avctx->pix_fmt != AV_PIX_FMT_YUVJ444P &&
286 ((avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
287 avctx->pix_fmt != AV_PIX_FMT_YUV422P &&
288 avctx->pix_fmt != AV_PIX_FMT_YUV444P) ||
289 avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL)) {
290 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
295 if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
296 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
301 switch (avctx->pix_fmt) {
302 case AV_PIX_FMT_YUVJ444P:
303 case AV_PIX_FMT_YUV444P:
304 s->chroma_format = CHROMA_444;
306 case AV_PIX_FMT_YUVJ422P:
307 case AV_PIX_FMT_YUV422P:
308 s->chroma_format = CHROMA_422;
310 case AV_PIX_FMT_YUVJ420P:
311 case AV_PIX_FMT_YUV420P:
313 s->chroma_format = CHROMA_420;
317 s->bit_rate = avctx->bit_rate;
318 s->width = avctx->width;
319 s->height = avctx->height;
320 if (avctx->gop_size > 600 &&
321 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
322 av_log(avctx, AV_LOG_WARNING,
323 "keyframe interval too large!, reducing it from %d to %d\n",
324 avctx->gop_size, 600);
325 avctx->gop_size = 600;
327 s->gop_size = avctx->gop_size;
329 s->flags = avctx->flags;
330 s->flags2 = avctx->flags2;
331 s->max_b_frames = avctx->max_b_frames;
332 s->codec_id = avctx->codec->id;
333 s->strict_std_compliance = avctx->strict_std_compliance;
334 s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
335 s->mpeg_quant = avctx->mpeg_quant;
336 s->rtp_mode = !!avctx->rtp_payload_size;
337 s->intra_dc_precision = avctx->intra_dc_precision;
338 s->user_specified_pts = AV_NOPTS_VALUE;
340 if (s->gop_size <= 1) {
347 s->me_method = avctx->me_method;
350 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
352 s->adaptive_quant = (s->avctx->lumi_masking ||
353 s->avctx->dark_masking ||
354 s->avctx->temporal_cplx_masking ||
355 s->avctx->spatial_cplx_masking ||
356 s->avctx->p_masking ||
357 s->avctx->border_masking ||
358 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
361 s->loop_filter = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
363 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
364 switch(avctx->codec_id) {
365 case AV_CODEC_ID_MPEG1VIDEO:
366 case AV_CODEC_ID_MPEG2VIDEO:
367 avctx->rc_buffer_size = FFMAX(avctx->rc_max_rate, 15000000) * 112L / 15000000 * 16384;
369 case AV_CODEC_ID_MPEG4:
370 case AV_CODEC_ID_MSMPEG4V1:
371 case AV_CODEC_ID_MSMPEG4V2:
372 case AV_CODEC_ID_MSMPEG4V3:
373 if (avctx->rc_max_rate >= 15000000) {
374 avctx->rc_buffer_size = 320 + (avctx->rc_max_rate - 15000000L) * (760-320) / (38400000 - 15000000);
375 } else if(avctx->rc_max_rate >= 2000000) {
376 avctx->rc_buffer_size = 80 + (avctx->rc_max_rate - 2000000L) * (320- 80) / (15000000 - 2000000);
377 } else if(avctx->rc_max_rate >= 384000) {
378 avctx->rc_buffer_size = 40 + (avctx->rc_max_rate - 384000L) * ( 80- 40) / ( 2000000 - 384000);
380 avctx->rc_buffer_size = 40;
381 avctx->rc_buffer_size *= 16384;
384 if (avctx->rc_buffer_size) {
385 av_log(avctx, AV_LOG_INFO, "Automatically choosing VBV buffer size of %d kbyte\n", avctx->rc_buffer_size/8192);
389 if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
390 av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
391 if (avctx->rc_max_rate && !avctx->rc_buffer_size)
395 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
396 av_log(avctx, AV_LOG_INFO,
397 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
400 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
401 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
405 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
406 av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
410 if (avctx->rc_max_rate &&
411 avctx->rc_max_rate == avctx->bit_rate &&
412 avctx->rc_max_rate != avctx->rc_min_rate) {
413 av_log(avctx, AV_LOG_INFO,
414 "impossible bitrate constraints, this will fail\n");
417 if (avctx->rc_buffer_size &&
418 avctx->bit_rate * (int64_t)avctx->time_base.num >
419 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
420 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
424 if (!s->fixed_qscale &&
425 avctx->bit_rate * av_q2d(avctx->time_base) >
426 avctx->bit_rate_tolerance) {
427 av_log(avctx, AV_LOG_ERROR,
428 "bitrate tolerance too small for bitrate\n");
432 if (s->avctx->rc_max_rate &&
433 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
434 (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
435 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
436 90000LL * (avctx->rc_buffer_size - 1) >
437 s->avctx->rc_max_rate * 0xFFFFLL) {
438 av_log(avctx, AV_LOG_INFO,
439 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
440 "specified vbv buffer is too large for the given bitrate!\n");
443 if ((s->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
444 s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
445 s->codec_id != AV_CODEC_ID_FLV1) {
446 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
450 if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
451 av_log(avctx, AV_LOG_ERROR,
452 "OBMC is only supported with simple mb decision\n");
456 if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
457 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
461 if (s->max_b_frames &&
462 s->codec_id != AV_CODEC_ID_MPEG4 &&
463 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
464 s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
465 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
469 if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
470 s->codec_id == AV_CODEC_ID_H263 ||
471 s->codec_id == AV_CODEC_ID_H263P) &&
472 (avctx->sample_aspect_ratio.num > 255 ||
473 avctx->sample_aspect_ratio.den > 255)) {
474 av_log(avctx, AV_LOG_WARNING,
475 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
476 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
477 av_reduce(&avctx->sample_aspect_ratio.num, &avctx->sample_aspect_ratio.den,
478 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 255);
481 if ((s->codec_id == AV_CODEC_ID_H263 ||
482 s->codec_id == AV_CODEC_ID_H263P) &&
483 (avctx->width > 2048 ||
484 avctx->height > 1152 )) {
485 av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
488 if ((s->codec_id == AV_CODEC_ID_H263 ||
489 s->codec_id == AV_CODEC_ID_H263P) &&
490 ((avctx->width &3) ||
491 (avctx->height&3) )) {
492 av_log(avctx, AV_LOG_ERROR, "w/h must be a multiple of 4\n");
496 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
497 (avctx->width > 4095 ||
498 avctx->height > 4095 )) {
499 av_log(avctx, AV_LOG_ERROR, "MPEG-1 does not support resolutions above 4095x4095\n");
503 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
504 (avctx->width > 16383 ||
505 avctx->height > 16383 )) {
506 av_log(avctx, AV_LOG_ERROR, "MPEG-2 does not support resolutions above 16383x16383\n");
510 if (s->codec_id == AV_CODEC_ID_RV10 &&
512 avctx->height&15 )) {
513 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 16\n");
514 return AVERROR(EINVAL);
517 if (s->codec_id == AV_CODEC_ID_RV20 &&
520 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 4\n");
521 return AVERROR(EINVAL);
524 if ((s->codec_id == AV_CODEC_ID_WMV1 ||
525 s->codec_id == AV_CODEC_ID_WMV2) &&
527 av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
531 if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
532 s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
533 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
537 // FIXME mpeg2 uses that too
538 if (s->mpeg_quant && s->codec_id != AV_CODEC_ID_MPEG4) {
539 av_log(avctx, AV_LOG_ERROR,
540 "mpeg2 style quantization not supported by codec\n");
544 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
545 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
549 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
550 s->avctx->mb_decision != FF_MB_DECISION_RD) {
551 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
555 if (s->avctx->scenechange_threshold < 1000000000 &&
556 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
557 av_log(avctx, AV_LOG_ERROR,
558 "closed gop with scene change detection are not supported yet, "
559 "set threshold to 1000000000\n");
563 if (s->flags & CODEC_FLAG_LOW_DELAY) {
564 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
565 av_log(avctx, AV_LOG_ERROR,
566 "low delay forcing is only available for mpeg2\n");
569 if (s->max_b_frames != 0) {
570 av_log(avctx, AV_LOG_ERROR,
571 "b frames cannot be used with low delay\n");
576 if (s->q_scale_type == 1) {
577 if (avctx->qmax > 12) {
578 av_log(avctx, AV_LOG_ERROR,
579 "non linear quant only supports qmax <= 12 currently\n");
584 if (s->avctx->thread_count > 1 &&
585 s->codec_id != AV_CODEC_ID_MPEG4 &&
586 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
587 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
588 s->codec_id != AV_CODEC_ID_MJPEG &&
589 (s->codec_id != AV_CODEC_ID_H263P)) {
590 av_log(avctx, AV_LOG_ERROR,
591 "multi threaded encoding not supported by codec\n");
595 if (s->avctx->thread_count < 1) {
596 av_log(avctx, AV_LOG_ERROR,
597 "automatic thread number detection not supported by codec, "
602 if (s->avctx->slices > 1 || s->avctx->thread_count > 1)
605 if (s->avctx->thread_count > 1 && s->codec_id == AV_CODEC_ID_H263P)
606 s->h263_slice_structured = 1;
608 if (!avctx->time_base.den || !avctx->time_base.num) {
609 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
613 i = (INT_MAX / 2 + 128) >> 8;
614 if (avctx->mb_threshold >= i) {
615 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
620 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
621 av_log(avctx, AV_LOG_INFO,
622 "notice: b_frame_strategy only affects the first pass\n");
623 avctx->b_frame_strategy = 0;
626 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
628 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
629 avctx->time_base.den /= i;
630 avctx->time_base.num /= i;
634 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) {
635 // (a + x * 3 / 8) / x
636 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
637 s->inter_quant_bias = 0;
639 s->intra_quant_bias = 0;
641 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
644 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
645 s->intra_quant_bias = avctx->intra_quant_bias;
646 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
647 s->inter_quant_bias = avctx->inter_quant_bias;
649 av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
651 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
653 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
654 s->avctx->time_base.den > (1 << 16) - 1) {
655 av_log(avctx, AV_LOG_ERROR,
656 "timebase %d/%d not supported by MPEG 4 standard, "
657 "the maximum admitted value for the timebase denominator "
658 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
662 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
664 switch (avctx->codec->id) {
665 case AV_CODEC_ID_MPEG1VIDEO:
666 s->out_format = FMT_MPEG1;
667 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
668 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
670 case AV_CODEC_ID_MPEG2VIDEO:
671 s->out_format = FMT_MPEG1;
672 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
673 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
676 case AV_CODEC_ID_LJPEG:
677 case AV_CODEC_ID_MJPEG:
678 case AV_CODEC_ID_AMV:
679 s->out_format = FMT_MJPEG;
680 s->intra_only = 1; /* force intra only for jpeg */
681 if (avctx->codec->id == AV_CODEC_ID_LJPEG &&
682 (avctx->pix_fmt == AV_PIX_FMT_BGR0
683 || s->avctx->pix_fmt == AV_PIX_FMT_BGRA
684 || s->avctx->pix_fmt == AV_PIX_FMT_BGR24)) {
685 s->mjpeg_vsample[0] = s->mjpeg_hsample[0] =
686 s->mjpeg_vsample[1] = s->mjpeg_hsample[1] =
687 s->mjpeg_vsample[2] = s->mjpeg_hsample[2] = 1;
688 } else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUVJ444P) {
689 s->mjpeg_vsample[0] = s->mjpeg_vsample[1] = s->mjpeg_vsample[2] = 2;
690 s->mjpeg_hsample[0] = s->mjpeg_hsample[1] = s->mjpeg_hsample[2] = 1;
692 s->mjpeg_vsample[0] = 2;
693 s->mjpeg_vsample[1] = 2 >> chroma_v_shift;
694 s->mjpeg_vsample[2] = 2 >> chroma_v_shift;
695 s->mjpeg_hsample[0] = 2;
696 s->mjpeg_hsample[1] = 2 >> chroma_h_shift;
697 s->mjpeg_hsample[2] = 2 >> chroma_h_shift;
699 if (!(CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) ||
700 ff_mjpeg_encode_init(s) < 0)
705 case AV_CODEC_ID_H261:
706 if (!CONFIG_H261_ENCODER)
708 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
709 av_log(avctx, AV_LOG_ERROR,
710 "The specified picture size of %dx%d is not valid for the "
711 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
712 s->width, s->height);
715 s->out_format = FMT_H261;
719 case AV_CODEC_ID_H263:
720 if (!CONFIG_H263_ENCODER)
722 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
723 s->width, s->height) == 8) {
724 av_log(avctx, AV_LOG_ERROR,
725 "The specified picture size of %dx%d is not valid for "
726 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
727 "352x288, 704x576, and 1408x1152. "
728 "Try H.263+.\n", s->width, s->height);
731 s->out_format = FMT_H263;
735 case AV_CODEC_ID_H263P:
736 s->out_format = FMT_H263;
739 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
740 s->modified_quant = s->h263_aic;
741 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
742 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
745 /* These are just to be sure */
749 case AV_CODEC_ID_FLV1:
750 s->out_format = FMT_H263;
751 s->h263_flv = 2; /* format = 1; 11-bit codes */
752 s->unrestricted_mv = 1;
753 s->rtp_mode = 0; /* don't allow GOB */
757 case AV_CODEC_ID_RV10:
758 s->out_format = FMT_H263;
762 case AV_CODEC_ID_RV20:
763 s->out_format = FMT_H263;
766 s->modified_quant = 1;
770 s->unrestricted_mv = 0;
772 case AV_CODEC_ID_MPEG4:
773 s->out_format = FMT_H263;
775 s->unrestricted_mv = 1;
776 s->low_delay = s->max_b_frames ? 0 : 1;
777 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
779 case AV_CODEC_ID_MSMPEG4V2:
780 s->out_format = FMT_H263;
782 s->unrestricted_mv = 1;
783 s->msmpeg4_version = 2;
787 case AV_CODEC_ID_MSMPEG4V3:
788 s->out_format = FMT_H263;
790 s->unrestricted_mv = 1;
791 s->msmpeg4_version = 3;
792 s->flipflop_rounding = 1;
796 case AV_CODEC_ID_WMV1:
797 s->out_format = FMT_H263;
799 s->unrestricted_mv = 1;
800 s->msmpeg4_version = 4;
801 s->flipflop_rounding = 1;
805 case AV_CODEC_ID_WMV2:
806 s->out_format = FMT_H263;
808 s->unrestricted_mv = 1;
809 s->msmpeg4_version = 5;
810 s->flipflop_rounding = 1;
818 avctx->has_b_frames = !s->low_delay;
822 s->progressive_frame =
823 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
824 CODEC_FLAG_INTERLACED_ME) ||
828 if (ff_MPV_common_init(s) < 0)
831 ff_dct_encode_init(s);
833 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
834 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
836 s->quant_precision = 5;
838 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
839 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
841 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
842 ff_h261_encode_init(s);
843 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
844 ff_h263_encode_init(s);
845 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
846 ff_msmpeg4_encode_init(s);
847 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
848 && s->out_format == FMT_MPEG1)
849 ff_mpeg1_encode_init(s);
852 for (i = 0; i < 64; i++) {
853 int j = s->dsp.idct_permutation[i];
854 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
856 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
857 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
858 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
860 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
863 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
864 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
866 if (s->avctx->intra_matrix)
867 s->intra_matrix[j] = s->avctx->intra_matrix[i];
868 if (s->avctx->inter_matrix)
869 s->inter_matrix[j] = s->avctx->inter_matrix[i];
872 /* precompute matrix */
873 /* for mjpeg, we do include qscale in the matrix */
874 if (s->out_format != FMT_MJPEG) {
875 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
876 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
878 ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
879 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
883 if (ff_rate_control_init(s) < 0)
889 av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
891 MpegEncContext *s = avctx->priv_data;
893 ff_rate_control_uninit(s);
895 ff_MPV_common_end(s);
896 if ((CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) &&
897 s->out_format == FMT_MJPEG)
898 ff_mjpeg_encode_close(s);
900 av_freep(&avctx->extradata);
905 static int get_sae(uint8_t *src, int ref, int stride)
910 for (y = 0; y < 16; y++) {
911 for (x = 0; x < 16; x++) {
912 acc += FFABS(src[x + y * stride] - ref);
919 static int get_intra_count(MpegEncContext *s, uint8_t *src,
920 uint8_t *ref, int stride)
928 for (y = 0; y < h; y += 16) {
929 for (x = 0; x < w; x += 16) {
930 int offset = x + y * stride;
931 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
933 int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
934 int sae = get_sae(src + offset, mean, stride);
936 acc += sae + 500 < sad;
943 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
947 int i, display_picture_number = 0, ret;
948 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
949 (s->low_delay ? 0 : 1);
954 display_picture_number = s->input_picture_number++;
956 if (pts != AV_NOPTS_VALUE) {
957 if (s->user_specified_pts != AV_NOPTS_VALUE) {
959 int64_t last = s->user_specified_pts;
962 av_log(s->avctx, AV_LOG_ERROR,
963 "Error, Invalid timestamp=%"PRId64", "
964 "last=%"PRId64"\n", pts, s->user_specified_pts);
968 if (!s->low_delay && display_picture_number == 1)
969 s->dts_delta = time - last;
971 s->user_specified_pts = pts;
973 if (s->user_specified_pts != AV_NOPTS_VALUE) {
974 s->user_specified_pts =
975 pts = s->user_specified_pts + 1;
976 av_log(s->avctx, AV_LOG_INFO,
977 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
980 pts = display_picture_number;
986 if (!pic_arg->buf[0])
988 if (pic_arg->linesize[0] != s->linesize)
990 if (pic_arg->linesize[1] != s->uvlinesize)
992 if (pic_arg->linesize[2] != s->uvlinesize)
995 av_dlog(s->avctx, "%d %d %d %d\n", pic_arg->linesize[0],
996 pic_arg->linesize[1], s->linesize, s->uvlinesize);
999 i = ff_find_unused_picture(s, 1);
1003 pic = &s->picture[i];
1006 if ((ret = av_frame_ref(&pic->f, pic_arg)) < 0)
1008 if (ff_alloc_picture(s, pic, 1) < 0) {
1012 i = ff_find_unused_picture(s, 0);
1016 pic = &s->picture[i];
1019 if (ff_alloc_picture(s, pic, 0) < 0) {
1023 if (pic->f.data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
1024 pic->f.data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
1025 pic->f.data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1028 int h_chroma_shift, v_chroma_shift;
1029 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
1033 for (i = 0; i < 3; i++) {
1034 int src_stride = pic_arg->linesize[i];
1035 int dst_stride = i ? s->uvlinesize : s->linesize;
1036 int h_shift = i ? h_chroma_shift : 0;
1037 int v_shift = i ? v_chroma_shift : 0;
1038 int w = s->width >> h_shift;
1039 int h = s->height >> v_shift;
1040 uint8_t *src = pic_arg->data[i];
1041 uint8_t *dst = pic->f.data[i];
1043 if (s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)) {
1044 h = ((s->height + 15)/16*16) >> v_shift;
1047 if (!s->avctx->rc_buffer_size)
1048 dst += INPLACE_OFFSET;
1050 if (src_stride == dst_stride)
1051 memcpy(dst, src, src_stride * h);
1054 uint8_t *dst2 = dst;
1056 memcpy(dst2, src, w);
1061 if ((s->width & 15) || (s->height & 15)) {
1062 s->dsp.draw_edges(dst, dst_stride,
1071 copy_picture_attributes(s, &pic->f, pic_arg);
1072 pic->f.display_picture_number = display_picture_number;
1073 pic->f.pts = pts; // we set this here to avoid modifiying pic_arg
1076 /* shift buffer entries */
1077 for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
1078 s->input_picture[i - 1] = s->input_picture[i];
1080 s->input_picture[encoding_delay] = (Picture*) pic;
1085 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
1089 int64_t score64 = 0;
1091 for (plane = 0; plane < 3; plane++) {
1092 const int stride = p->f.linesize[plane];
1093 const int bw = plane ? 1 : 2;
1094 for (y = 0; y < s->mb_height * bw; y++) {
1095 for (x = 0; x < s->mb_width * bw; x++) {
1096 int off = p->shared ? 0 : 16;
1097 uint8_t *dptr = p->f.data[plane] + 8 * (x + y * stride) + off;
1098 uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride);
1099 int v = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
1101 switch (s->avctx->frame_skip_exp) {
1102 case 0: score = FFMAX(score, v); break;
1103 case 1: score += FFABS(v); break;
1104 case 2: score += v * v; break;
1105 case 3: score64 += FFABS(v * v * (int64_t)v); break;
1106 case 4: score64 += v * v * (int64_t)(v * v); break;
1115 if (score64 < s->avctx->frame_skip_threshold)
1117 if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
1122 static int encode_frame(AVCodecContext *c, AVFrame *frame)
1124 AVPacket pkt = { 0 };
1125 int ret, got_output;
1127 av_init_packet(&pkt);
1128 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
1133 av_free_packet(&pkt);
1137 static int estimate_best_b_count(MpegEncContext *s)
1139 AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
1140 AVCodecContext *c = avcodec_alloc_context3(NULL);
1141 AVFrame input[FF_MAX_B_FRAMES + 2];
1142 const int scale = s->avctx->brd_scale;
1143 int i, j, out_size, p_lambda, b_lambda, lambda2;
1144 int64_t best_rd = INT64_MAX;
1145 int best_b_count = -1;
1147 av_assert0(scale >= 0 && scale <= 3);
1150 //s->next_picture_ptr->quality;
1151 p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
1152 //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
1153 b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
1154 if (!b_lambda) // FIXME we should do this somewhere else
1155 b_lambda = p_lambda;
1156 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1159 c->width = s->width >> scale;
1160 c->height = s->height >> scale;
1161 c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR |
1162 CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
1163 c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
1164 c->mb_decision = s->avctx->mb_decision;
1165 c->me_cmp = s->avctx->me_cmp;
1166 c->mb_cmp = s->avctx->mb_cmp;
1167 c->me_sub_cmp = s->avctx->me_sub_cmp;
1168 c->pix_fmt = AV_PIX_FMT_YUV420P;
1169 c->time_base = s->avctx->time_base;
1170 c->max_b_frames = s->max_b_frames;
1172 if (avcodec_open2(c, codec, NULL) < 0)
1175 for (i = 0; i < s->max_b_frames + 2; i++) {
1176 int ysize = c->width * c->height;
1177 int csize = (c->width / 2) * (c->height / 2);
1178 Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
1179 s->next_picture_ptr;
1181 avcodec_get_frame_defaults(&input[i]);
1182 input[i].data[0] = av_malloc(ysize + 2 * csize);
1183 input[i].data[1] = input[i].data[0] + ysize;
1184 input[i].data[2] = input[i].data[1] + csize;
1185 input[i].linesize[0] = c->width;
1186 input[i].linesize[1] =
1187 input[i].linesize[2] = c->width / 2;
1189 if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
1190 pre_input = *pre_input_ptr;
1192 if (!pre_input.shared && i) {
1193 pre_input.f.data[0] += INPLACE_OFFSET;
1194 pre_input.f.data[1] += INPLACE_OFFSET;
1195 pre_input.f.data[2] += INPLACE_OFFSET;
1198 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0],
1199 pre_input.f.data[0], pre_input.f.linesize[0],
1200 c->width, c->height);
1201 s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1],
1202 pre_input.f.data[1], pre_input.f.linesize[1],
1203 c->width >> 1, c->height >> 1);
1204 s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2],
1205 pre_input.f.data[2], pre_input.f.linesize[2],
1206 c->width >> 1, c->height >> 1);
1210 for (j = 0; j < s->max_b_frames + 1; j++) {
1213 if (!s->input_picture[j])
1216 c->error[0] = c->error[1] = c->error[2] = 0;
1218 input[0].pict_type = AV_PICTURE_TYPE_I;
1219 input[0].quality = 1 * FF_QP2LAMBDA;
1221 out_size = encode_frame(c, &input[0]);
1223 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1225 for (i = 0; i < s->max_b_frames + 1; i++) {
1226 int is_p = i % (j + 1) == j || i == s->max_b_frames;
1228 input[i + 1].pict_type = is_p ?
1229 AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1230 input[i + 1].quality = is_p ? p_lambda : b_lambda;
1232 out_size = encode_frame(c, &input[i + 1]);
1234 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1237 /* get the delayed frames */
1239 out_size = encode_frame(c, NULL);
1240 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
1243 rd += c->error[0] + c->error[1] + c->error[2];
1254 for (i = 0; i < s->max_b_frames + 2; i++) {
1255 av_freep(&input[i].data[0]);
1258 return best_b_count;
1261 static int select_input_picture(MpegEncContext *s)
1265 for (i = 1; i < MAX_PICTURE_COUNT; i++)
1266 s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
1267 s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
1269 /* set next picture type & ordering */
1270 if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1271 if (/*s->picture_in_gop_number >= s->gop_size ||*/
1272 s->next_picture_ptr == NULL || s->intra_only) {
1273 s->reordered_input_picture[0] = s->input_picture[0];
1274 s->reordered_input_picture[0]->f.pict_type = AV_PICTURE_TYPE_I;
1275 s->reordered_input_picture[0]->f.coded_picture_number =
1276 s->coded_picture_number++;
1280 if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
1281 if (s->picture_in_gop_number < s->gop_size &&
1282 skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
1283 // FIXME check that te gop check above is +-1 correct
1284 av_frame_unref(&s->input_picture[0]->f);
1287 ff_vbv_update(s, 0);
1293 if (s->flags & CODEC_FLAG_PASS2) {
1294 for (i = 0; i < s->max_b_frames + 1; i++) {
1295 int pict_num = s->input_picture[0]->f.display_picture_number + i;
1297 if (pict_num >= s->rc_context.num_entries)
1299 if (!s->input_picture[i]) {
1300 s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
1304 s->input_picture[i]->f.pict_type =
1305 s->rc_context.entry[pict_num].new_pict_type;
1309 if (s->avctx->b_frame_strategy == 0) {
1310 b_frames = s->max_b_frames;
1311 while (b_frames && !s->input_picture[b_frames])
1313 } else if (s->avctx->b_frame_strategy == 1) {
1314 for (i = 1; i < s->max_b_frames + 1; i++) {
1315 if (s->input_picture[i] &&
1316 s->input_picture[i]->b_frame_score == 0) {
1317 s->input_picture[i]->b_frame_score =
1319 s->input_picture[i ]->f.data[0],
1320 s->input_picture[i - 1]->f.data[0],
1324 for (i = 0; i < s->max_b_frames + 1; i++) {
1325 if (s->input_picture[i] == NULL ||
1326 s->input_picture[i]->b_frame_score - 1 >
1327 s->mb_num / s->avctx->b_sensitivity)
1331 b_frames = FFMAX(0, i - 1);
1334 for (i = 0; i < b_frames + 1; i++) {
1335 s->input_picture[i]->b_frame_score = 0;
1337 } else if (s->avctx->b_frame_strategy == 2) {
1338 b_frames = estimate_best_b_count(s);
1340 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1346 for (i = b_frames - 1; i >= 0; i--) {
1347 int type = s->input_picture[i]->f.pict_type;
1348 if (type && type != AV_PICTURE_TYPE_B)
1351 if (s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_B &&
1352 b_frames == s->max_b_frames) {
1353 av_log(s->avctx, AV_LOG_ERROR,
1354 "warning, too many b frames in a row\n");
1357 if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1358 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1359 s->gop_size > s->picture_in_gop_number) {
1360 b_frames = s->gop_size - s->picture_in_gop_number - 1;
1362 if (s->flags & CODEC_FLAG_CLOSED_GOP)
1364 s->input_picture[b_frames]->f.pict_type = AV_PICTURE_TYPE_I;
1368 if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1369 s->input_picture[b_frames]->f.pict_type == AV_PICTURE_TYPE_I)
1372 s->reordered_input_picture[0] = s->input_picture[b_frames];
1373 if (s->reordered_input_picture[0]->f.pict_type != AV_PICTURE_TYPE_I)
1374 s->reordered_input_picture[0]->f.pict_type = AV_PICTURE_TYPE_P;
1375 s->reordered_input_picture[0]->f.coded_picture_number =
1376 s->coded_picture_number++;
1377 for (i = 0; i < b_frames; i++) {
1378 s->reordered_input_picture[i + 1] = s->input_picture[i];
1379 s->reordered_input_picture[i + 1]->f.pict_type =
1381 s->reordered_input_picture[i + 1]->f.coded_picture_number =
1382 s->coded_picture_number++;
1387 if (s->reordered_input_picture[0]) {
1388 s->reordered_input_picture[0]->reference =
1389 s->reordered_input_picture[0]->f.pict_type !=
1390 AV_PICTURE_TYPE_B ? 3 : 0;
1392 ff_mpeg_unref_picture(s, &s->new_picture);
1393 if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
1396 if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1397 // input is a shared pix, so we can't modifiy it -> alloc a new
1398 // one & ensure that the shared one is reuseable
1401 int i = ff_find_unused_picture(s, 0);
1404 pic = &s->picture[i];
1406 pic->reference = s->reordered_input_picture[0]->reference;
1407 if (ff_alloc_picture(s, pic, 0) < 0) {
1411 copy_picture_attributes(s, &pic->f,
1412 &s->reordered_input_picture[0]->f);
1414 /* mark us unused / free shared pic */
1415 av_frame_unref(&s->reordered_input_picture[0]->f);
1416 s->reordered_input_picture[0]->shared = 0;
1418 s->current_picture_ptr = pic;
1420 // input is not a shared pix -> reuse buffer for current_pix
1421 s->current_picture_ptr = s->reordered_input_picture[0];
1422 for (i = 0; i < 4; i++) {
1423 s->new_picture.f.data[i] += INPLACE_OFFSET;
1426 ff_mpeg_unref_picture(s, &s->current_picture);
1427 if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1428 s->current_picture_ptr)) < 0)
1431 s->picture_number = s->new_picture.f.display_picture_number;
1433 ff_mpeg_unref_picture(s, &s->new_picture);
1438 int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1439 AVFrame *pic_arg, int *got_packet)
1441 MpegEncContext *s = avctx->priv_data;
1442 int i, stuffing_count, ret;
1443 int context_count = s->slice_context_count;
1445 s->picture_in_gop_number++;
1447 if (load_input_picture(s, pic_arg) < 0)
1450 if (select_input_picture(s) < 0) {
1455 if (s->new_picture.f.data[0]) {
1456 if ((ret = ff_alloc_packet2(avctx, pkt, s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000)) < 0)
1459 s->mb_info_ptr = av_packet_new_side_data(pkt,
1460 AV_PKT_DATA_H263_MB_INFO,
1461 s->mb_width*s->mb_height*12);
1462 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1465 for (i = 0; i < context_count; i++) {
1466 int start_y = s->thread_context[i]->start_mb_y;
1467 int end_y = s->thread_context[i]-> end_mb_y;
1468 int h = s->mb_height;
1469 uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
1470 uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
1472 init_put_bits(&s->thread_context[i]->pb, start, end - start);
1475 s->pict_type = s->new_picture.f.pict_type;
1477 if (ff_MPV_frame_start(s, avctx) < 0)
1480 if (encode_picture(s, s->picture_number) < 0)
1483 avctx->header_bits = s->header_bits;
1484 avctx->mv_bits = s->mv_bits;
1485 avctx->misc_bits = s->misc_bits;
1486 avctx->i_tex_bits = s->i_tex_bits;
1487 avctx->p_tex_bits = s->p_tex_bits;
1488 avctx->i_count = s->i_count;
1489 // FIXME f/b_count in avctx
1490 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
1491 avctx->skip_count = s->skip_count;
1493 ff_MPV_frame_end(s);
1495 if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1496 ff_mjpeg_encode_picture_trailer(s);
1498 if (avctx->rc_buffer_size) {
1499 RateControlContext *rcc = &s->rc_context;
1500 int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
1502 if (put_bits_count(&s->pb) > max_size &&
1503 s->lambda < s->avctx->lmax) {
1504 s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
1505 (s->qscale + 1) / s->qscale);
1506 if (s->adaptive_quant) {
1508 for (i = 0; i < s->mb_height * s->mb_stride; i++)
1509 s->lambda_table[i] =
1510 FFMAX(s->lambda_table[i] + 1,
1511 s->lambda_table[i] * (s->qscale + 1) /
1514 s->mb_skipped = 0; // done in MPV_frame_start()
1515 // done in encode_picture() so we must undo it
1516 if (s->pict_type == AV_PICTURE_TYPE_P) {
1517 if (s->flipflop_rounding ||
1518 s->codec_id == AV_CODEC_ID_H263P ||
1519 s->codec_id == AV_CODEC_ID_MPEG4)
1520 s->no_rounding ^= 1;
1522 if (s->pict_type != AV_PICTURE_TYPE_B) {
1523 s->time_base = s->last_time_base;
1524 s->last_non_b_time = s->time - s->pp_time;
1526 for (i = 0; i < context_count; i++) {
1527 PutBitContext *pb = &s->thread_context[i]->pb;
1528 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
1533 assert(s->avctx->rc_max_rate);
1536 if (s->flags & CODEC_FLAG_PASS1)
1537 ff_write_pass1_stats(s);
1539 for (i = 0; i < 4; i++) {
1540 s->current_picture_ptr->f.error[i] = s->current_picture.f.error[i];
1541 avctx->error[i] += s->current_picture_ptr->f.error[i];
1544 if (s->flags & CODEC_FLAG_PASS1)
1545 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
1546 avctx->i_tex_bits + avctx->p_tex_bits ==
1547 put_bits_count(&s->pb));
1548 flush_put_bits(&s->pb);
1549 s->frame_bits = put_bits_count(&s->pb);
1551 stuffing_count = ff_vbv_update(s, s->frame_bits);
1552 s->stuffing_bits = 8*stuffing_count;
1553 if (stuffing_count) {
1554 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
1555 stuffing_count + 50) {
1556 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
1560 switch (s->codec_id) {
1561 case AV_CODEC_ID_MPEG1VIDEO:
1562 case AV_CODEC_ID_MPEG2VIDEO:
1563 while (stuffing_count--) {
1564 put_bits(&s->pb, 8, 0);
1567 case AV_CODEC_ID_MPEG4:
1568 put_bits(&s->pb, 16, 0);
1569 put_bits(&s->pb, 16, 0x1C3);
1570 stuffing_count -= 4;
1571 while (stuffing_count--) {
1572 put_bits(&s->pb, 8, 0xFF);
1576 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
1578 flush_put_bits(&s->pb);
1579 s->frame_bits = put_bits_count(&s->pb);
1582 /* update mpeg1/2 vbv_delay for CBR */
1583 if (s->avctx->rc_max_rate &&
1584 s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
1585 s->out_format == FMT_MPEG1 &&
1586 90000LL * (avctx->rc_buffer_size - 1) <=
1587 s->avctx->rc_max_rate * 0xFFFFLL) {
1588 int vbv_delay, min_delay;
1589 double inbits = s->avctx->rc_max_rate *
1590 av_q2d(s->avctx->time_base);
1591 int minbits = s->frame_bits - 8 *
1592 (s->vbv_delay_ptr - s->pb.buf - 1);
1593 double bits = s->rc_context.buffer_index + minbits - inbits;
1596 av_log(s->avctx, AV_LOG_ERROR,
1597 "Internal error, negative bits\n");
1599 assert(s->repeat_first_field == 0);
1601 vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
1602 min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
1603 s->avctx->rc_max_rate;
1605 vbv_delay = FFMAX(vbv_delay, min_delay);
1607 av_assert0(vbv_delay < 0xFFFF);
1609 s->vbv_delay_ptr[0] &= 0xF8;
1610 s->vbv_delay_ptr[0] |= vbv_delay >> 13;
1611 s->vbv_delay_ptr[1] = vbv_delay >> 5;
1612 s->vbv_delay_ptr[2] &= 0x07;
1613 s->vbv_delay_ptr[2] |= vbv_delay << 3;
1614 avctx->vbv_delay = vbv_delay * 300;
1616 s->total_bits += s->frame_bits;
1617 avctx->frame_bits = s->frame_bits;
1619 pkt->pts = s->current_picture.f.pts;
1620 if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1621 if (!s->current_picture.f.coded_picture_number)
1622 pkt->dts = pkt->pts - s->dts_delta;
1624 pkt->dts = s->reordered_pts;
1625 s->reordered_pts = pkt->pts;
1627 pkt->dts = pkt->pts;
1628 if (s->current_picture.f.key_frame)
1629 pkt->flags |= AV_PKT_FLAG_KEY;
1631 av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1635 assert((s->frame_bits & 7) == 0);
1637 pkt->size = s->frame_bits / 8;
1638 *got_packet = !!pkt->size;
1642 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1643 int n, int threshold)
1645 static const char tab[64] = {
1646 3, 2, 2, 1, 1, 1, 1, 1,
1647 1, 1, 1, 1, 1, 1, 1, 1,
1648 1, 1, 1, 1, 1, 1, 1, 1,
1649 0, 0, 0, 0, 0, 0, 0, 0,
1650 0, 0, 0, 0, 0, 0, 0, 0,
1651 0, 0, 0, 0, 0, 0, 0, 0,
1652 0, 0, 0, 0, 0, 0, 0, 0,
1653 0, 0, 0, 0, 0, 0, 0, 0
1658 int16_t *block = s->block[n];
1659 const int last_index = s->block_last_index[n];
1662 if (threshold < 0) {
1664 threshold = -threshold;
1668 /* Are all we could set to zero already zero? */
1669 if (last_index <= skip_dc - 1)
1672 for (i = 0; i <= last_index; i++) {
1673 const int j = s->intra_scantable.permutated[i];
1674 const int level = FFABS(block[j]);
1676 if (skip_dc && i == 0)
1680 } else if (level > 1) {
1686 if (score >= threshold)
1688 for (i = skip_dc; i <= last_index; i++) {
1689 const int j = s->intra_scantable.permutated[i];
1693 s->block_last_index[n] = 0;
1695 s->block_last_index[n] = -1;
1698 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1702 const int maxlevel = s->max_qcoeff;
1703 const int minlevel = s->min_qcoeff;
1707 i = 1; // skip clipping of intra dc
1711 for (; i <= last_index; i++) {
1712 const int j = s->intra_scantable.permutated[i];
1713 int level = block[j];
1715 if (level > maxlevel) {
1718 } else if (level < minlevel) {
1726 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1727 av_log(s->avctx, AV_LOG_INFO,
1728 "warning, clipping %d dct coefficients to %d..%d\n",
1729 overflow, minlevel, maxlevel);
1732 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1736 for (y = 0; y < 8; y++) {
1737 for (x = 0; x < 8; x++) {
1743 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1744 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1745 int v = ptr[x2 + y2 * stride];
1751 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1756 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1757 int motion_x, int motion_y,
1758 int mb_block_height,
1762 int16_t weight[12][64];
1763 int16_t orig[12][64];
1764 const int mb_x = s->mb_x;
1765 const int mb_y = s->mb_y;
1768 int dct_offset = s->linesize * 8; // default for progressive frames
1769 int uv_dct_offset = s->uvlinesize * 8;
1770 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1773 for (i = 0; i < mb_block_count; i++)
1774 skip_dct[i] = s->skipdct;
1776 if (s->adaptive_quant) {
1777 const int last_qp = s->qscale;
1778 const int mb_xy = mb_x + mb_y * s->mb_stride;
1780 s->lambda = s->lambda_table[mb_xy];
1783 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1784 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1785 s->dquant = s->qscale - last_qp;
1787 if (s->out_format == FMT_H263) {
1788 s->dquant = av_clip(s->dquant, -2, 2);
1790 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1792 if (s->pict_type == AV_PICTURE_TYPE_B) {
1793 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1796 if (s->mv_type == MV_TYPE_8X8)
1802 ff_set_qscale(s, last_qp + s->dquant);
1803 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1804 ff_set_qscale(s, s->qscale + s->dquant);
1806 wrap_y = s->linesize;
1807 wrap_c = s->uvlinesize;
1808 ptr_y = s->new_picture.f.data[0] +
1809 (mb_y * 16 * wrap_y) + mb_x * 16;
1810 ptr_cb = s->new_picture.f.data[1] +
1811 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1812 ptr_cr = s->new_picture.f.data[2] +
1813 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1815 if((mb_x*16+16 > s->width || mb_y*16+16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
1816 uint8_t *ebuf = s->edge_emu_buffer + 32;
1817 int cw = (s->width + s->chroma_x_shift) >> s->chroma_x_shift;
1818 int ch = (s->height + s->chroma_y_shift) >> s->chroma_y_shift;
1819 s->vdsp.emulated_edge_mc(ebuf, ptr_y, wrap_y, 16, 16, mb_x * 16,
1820 mb_y * 16, s->width, s->height);
1822 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb, wrap_c, mb_block_width,
1823 mb_block_height, mb_x * mb_block_width, mb_y * mb_block_height,
1825 ptr_cb = ebuf + 18 * wrap_y;
1826 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 16, ptr_cr, wrap_c, mb_block_width,
1827 mb_block_height, mb_x * mb_block_width, mb_y * mb_block_height,
1829 ptr_cr = ebuf + 18 * wrap_y + 16;
1833 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1834 int progressive_score, interlaced_score;
1836 s->interlaced_dct = 0;
1837 progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
1839 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1840 NULL, wrap_y, 8) - 400;
1842 if (progressive_score > 0) {
1843 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
1844 NULL, wrap_y * 2, 8) +
1845 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
1846 NULL, wrap_y * 2, 8);
1847 if (progressive_score > interlaced_score) {
1848 s->interlaced_dct = 1;
1850 dct_offset = wrap_y;
1851 uv_dct_offset = wrap_c;
1853 if (s->chroma_format == CHROMA_422 ||
1854 s->chroma_format == CHROMA_444)
1860 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
1861 s->dsp.get_pixels(s->block[1], ptr_y + 8 , wrap_y);
1862 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
1863 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
1865 if (s->flags & CODEC_FLAG_GRAY) {
1869 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1870 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1871 if (!s->chroma_y_shift && s->chroma_x_shift) { /* 422 */
1872 s->dsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
1873 s->dsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
1874 } else if (!s->chroma_y_shift && !s->chroma_x_shift) { /* 444 */
1875 s->dsp.get_pixels(s->block[6], ptr_cb + 8, wrap_c);
1876 s->dsp.get_pixels(s->block[7], ptr_cr + 8, wrap_c);
1877 s->dsp.get_pixels(s->block[8], ptr_cb + uv_dct_offset, wrap_c);
1878 s->dsp.get_pixels(s->block[9], ptr_cr + uv_dct_offset, wrap_c);
1879 s->dsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
1880 s->dsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
1884 op_pixels_func (*op_pix)[4];
1885 qpel_mc_func (*op_qpix)[16];
1886 uint8_t *dest_y, *dest_cb, *dest_cr;
1888 dest_y = s->dest[0];
1889 dest_cb = s->dest[1];
1890 dest_cr = s->dest[2];
1892 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1893 op_pix = s->hdsp.put_pixels_tab;
1894 op_qpix = s->dsp.put_qpel_pixels_tab;
1896 op_pix = s->hdsp.put_no_rnd_pixels_tab;
1897 op_qpix = s->dsp.put_no_rnd_qpel_pixels_tab;
1900 if (s->mv_dir & MV_DIR_FORWARD) {
1901 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
1902 s->last_picture.f.data,
1904 op_pix = s->hdsp.avg_pixels_tab;
1905 op_qpix = s->dsp.avg_qpel_pixels_tab;
1907 if (s->mv_dir & MV_DIR_BACKWARD) {
1908 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
1909 s->next_picture.f.data,
1913 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1914 int progressive_score, interlaced_score;
1916 s->interlaced_dct = 0;
1917 progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
1920 s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
1921 ptr_y + wrap_y * 8, wrap_y,
1924 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
1925 progressive_score -= 400;
1927 if (progressive_score > 0) {
1928 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
1931 s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
1935 if (progressive_score > interlaced_score) {
1936 s->interlaced_dct = 1;
1938 dct_offset = wrap_y;
1939 uv_dct_offset = wrap_c;
1941 if (s->chroma_format == CHROMA_422)
1947 s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
1948 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
1949 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
1950 dest_y + dct_offset, wrap_y);
1951 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
1952 dest_y + dct_offset + 8, wrap_y);
1954 if (s->flags & CODEC_FLAG_GRAY) {
1958 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
1959 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
1960 if (!s->chroma_y_shift) { /* 422 */
1961 s->dsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
1962 dest_cb + uv_dct_offset, wrap_c);
1963 s->dsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
1964 dest_cr + uv_dct_offset, wrap_c);
1967 /* pre quantization */
1968 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
1969 2 * s->qscale * s->qscale) {
1971 if (s->dsp.sad[1](NULL, ptr_y , dest_y,
1972 wrap_y, 8) < 20 * s->qscale)
1974 if (s->dsp.sad[1](NULL, ptr_y + 8,
1975 dest_y + 8, wrap_y, 8) < 20 * s->qscale)
1977 if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
1978 dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
1980 if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
1981 dest_y + dct_offset + 8,
1982 wrap_y, 8) < 20 * s->qscale)
1984 if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
1985 wrap_c, 8) < 20 * s->qscale)
1987 if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
1988 wrap_c, 8) < 20 * s->qscale)
1990 if (!s->chroma_y_shift) { /* 422 */
1991 if (s->dsp.sad[1](NULL, ptr_cb + uv_dct_offset,
1992 dest_cb + uv_dct_offset,
1993 wrap_c, 8) < 20 * s->qscale)
1995 if (s->dsp.sad[1](NULL, ptr_cr + uv_dct_offset,
1996 dest_cr + uv_dct_offset,
1997 wrap_c, 8) < 20 * s->qscale)
2003 if (s->quantizer_noise_shaping) {
2005 get_visual_weight(weight[0], ptr_y , wrap_y);
2007 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2009 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2011 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2013 get_visual_weight(weight[4], ptr_cb , wrap_c);
2015 get_visual_weight(weight[5], ptr_cr , wrap_c);
2016 if (!s->chroma_y_shift) { /* 422 */
2018 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2021 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2024 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2027 /* DCT & quantize */
2028 av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
2030 for (i = 0; i < mb_block_count; i++) {
2033 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2034 // FIXME we could decide to change to quantizer instead of
2036 // JS: I don't think that would be a good idea it could lower
2037 // quality instead of improve it. Just INTRADC clipping
2038 // deserves changes in quantizer
2040 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2042 s->block_last_index[i] = -1;
2044 if (s->quantizer_noise_shaping) {
2045 for (i = 0; i < mb_block_count; i++) {
2047 s->block_last_index[i] =
2048 dct_quantize_refine(s, s->block[i], weight[i],
2049 orig[i], i, s->qscale);
2054 if (s->luma_elim_threshold && !s->mb_intra)
2055 for (i = 0; i < 4; i++)
2056 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2057 if (s->chroma_elim_threshold && !s->mb_intra)
2058 for (i = 4; i < mb_block_count; i++)
2059 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2061 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2062 for (i = 0; i < mb_block_count; i++) {
2063 if (s->block_last_index[i] == -1)
2064 s->coded_score[i] = INT_MAX / 256;
2069 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2070 s->block_last_index[4] =
2071 s->block_last_index[5] = 0;
2073 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2074 if (!s->chroma_y_shift) { /* 422 / 444 */
2075 for (i=6; i<12; i++) {
2076 s->block_last_index[i] = 0;
2077 s->block[i][0] = s->block[4][0];
2082 // non c quantize code returns incorrect block_last_index FIXME
2083 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2084 for (i = 0; i < mb_block_count; i++) {
2086 if (s->block_last_index[i] > 0) {
2087 for (j = 63; j > 0; j--) {
2088 if (s->block[i][s->intra_scantable.permutated[j]])
2091 s->block_last_index[i] = j;
2096 /* huffman encode */
2097 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2098 case AV_CODEC_ID_MPEG1VIDEO:
2099 case AV_CODEC_ID_MPEG2VIDEO:
2100 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2101 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2103 case AV_CODEC_ID_MPEG4:
2104 if (CONFIG_MPEG4_ENCODER)
2105 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2107 case AV_CODEC_ID_MSMPEG4V2:
2108 case AV_CODEC_ID_MSMPEG4V3:
2109 case AV_CODEC_ID_WMV1:
2110 if (CONFIG_MSMPEG4_ENCODER)
2111 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2113 case AV_CODEC_ID_WMV2:
2114 if (CONFIG_WMV2_ENCODER)
2115 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2117 case AV_CODEC_ID_H261:
2118 if (CONFIG_H261_ENCODER)
2119 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2121 case AV_CODEC_ID_H263:
2122 case AV_CODEC_ID_H263P:
2123 case AV_CODEC_ID_FLV1:
2124 case AV_CODEC_ID_RV10:
2125 case AV_CODEC_ID_RV20:
2126 if (CONFIG_H263_ENCODER)
2127 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2129 case AV_CODEC_ID_MJPEG:
2130 case AV_CODEC_ID_AMV:
2131 if (CONFIG_MJPEG_ENCODER)
2132 ff_mjpeg_encode_mb(s, s->block);
2139 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2141 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 8, 6);
2142 else if (s->chroma_format == CHROMA_422) encode_mb_internal(s, motion_x, motion_y, 16, 8, 8);
2143 else encode_mb_internal(s, motion_x, motion_y, 16, 16, 12);
2146 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2149 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2152 d->mb_skip_run= s->mb_skip_run;
2154 d->last_dc[i] = s->last_dc[i];
2157 d->mv_bits= s->mv_bits;
2158 d->i_tex_bits= s->i_tex_bits;
2159 d->p_tex_bits= s->p_tex_bits;
2160 d->i_count= s->i_count;
2161 d->f_count= s->f_count;
2162 d->b_count= s->b_count;
2163 d->skip_count= s->skip_count;
2164 d->misc_bits= s->misc_bits;
2168 d->qscale= s->qscale;
2169 d->dquant= s->dquant;
2171 d->esc3_level_length= s->esc3_level_length;
2174 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2177 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2178 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2181 d->mb_skip_run= s->mb_skip_run;
2183 d->last_dc[i] = s->last_dc[i];
2186 d->mv_bits= s->mv_bits;
2187 d->i_tex_bits= s->i_tex_bits;
2188 d->p_tex_bits= s->p_tex_bits;
2189 d->i_count= s->i_count;
2190 d->f_count= s->f_count;
2191 d->b_count= s->b_count;
2192 d->skip_count= s->skip_count;
2193 d->misc_bits= s->misc_bits;
2195 d->mb_intra= s->mb_intra;
2196 d->mb_skipped= s->mb_skipped;
2197 d->mv_type= s->mv_type;
2198 d->mv_dir= s->mv_dir;
2200 if(s->data_partitioning){
2202 d->tex_pb= s->tex_pb;
2206 d->block_last_index[i]= s->block_last_index[i];
2207 d->interlaced_dct= s->interlaced_dct;
2208 d->qscale= s->qscale;
2210 d->esc3_level_length= s->esc3_level_length;
2213 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2214 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2215 int *dmin, int *next_block, int motion_x, int motion_y)
2218 uint8_t *dest_backup[3];
2220 copy_context_before_encode(s, backup, type);
2222 s->block= s->blocks[*next_block];
2223 s->pb= pb[*next_block];
2224 if(s->data_partitioning){
2225 s->pb2 = pb2 [*next_block];
2226 s->tex_pb= tex_pb[*next_block];
2230 memcpy(dest_backup, s->dest, sizeof(s->dest));
2231 s->dest[0] = s->rd_scratchpad;
2232 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2233 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2234 assert(s->linesize >= 32); //FIXME
2237 encode_mb(s, motion_x, motion_y);
2239 score= put_bits_count(&s->pb);
2240 if(s->data_partitioning){
2241 score+= put_bits_count(&s->pb2);
2242 score+= put_bits_count(&s->tex_pb);
2245 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2246 ff_MPV_decode_mb(s, s->block);
2248 score *= s->lambda2;
2249 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2253 memcpy(s->dest, dest_backup, sizeof(s->dest));
2260 copy_context_after_encode(best, s, type);
2264 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2265 uint32_t *sq = ff_squareTbl + 256;
2270 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
2271 else if(w==8 && h==8)
2272 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
2276 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2285 static int sse_mb(MpegEncContext *s){
2289 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2290 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2293 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2294 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)
2295 +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)
2296 +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);
2298 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)
2299 +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)
2300 +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);
2303 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)
2304 +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)
2305 +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);
2308 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2309 MpegEncContext *s= *(void**)arg;
2313 s->me.dia_size= s->avctx->pre_dia_size;
2314 s->first_slice_line=1;
2315 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2316 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2317 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2319 s->first_slice_line=0;
2327 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2328 MpegEncContext *s= *(void**)arg;
2330 ff_check_alignment();
2332 s->me.dia_size= s->avctx->dia_size;
2333 s->first_slice_line=1;
2334 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2335 s->mb_x=0; //for block init below
2336 ff_init_block_index(s);
2337 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2338 s->block_index[0]+=2;
2339 s->block_index[1]+=2;
2340 s->block_index[2]+=2;
2341 s->block_index[3]+=2;
2343 /* compute motion vector & mb_type and store in context */
2344 if(s->pict_type==AV_PICTURE_TYPE_B)
2345 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2347 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2349 s->first_slice_line=0;
2354 static int mb_var_thread(AVCodecContext *c, void *arg){
2355 MpegEncContext *s= *(void**)arg;
2358 ff_check_alignment();
2360 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2361 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2364 uint8_t *pix = s->new_picture.f.data[0] + (yy * s->linesize) + xx;
2366 int sum = s->dsp.pix_sum(pix, s->linesize);
2368 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
2370 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2371 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2372 s->me.mb_var_sum_temp += varc;
2378 static void write_slice_end(MpegEncContext *s){
2379 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2380 if(s->partitioned_frame){
2381 ff_mpeg4_merge_partitions(s);
2384 ff_mpeg4_stuffing(&s->pb);
2385 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2386 ff_mjpeg_encode_stuffing(s);
2389 avpriv_align_put_bits(&s->pb);
2390 flush_put_bits(&s->pb);
2392 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2393 s->misc_bits+= get_bits_diff(s);
2396 static void write_mb_info(MpegEncContext *s)
2398 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2399 int offset = put_bits_count(&s->pb);
2400 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2401 int gobn = s->mb_y / s->gob_index;
2403 if (CONFIG_H263_ENCODER)
2404 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2405 bytestream_put_le32(&ptr, offset);
2406 bytestream_put_byte(&ptr, s->qscale);
2407 bytestream_put_byte(&ptr, gobn);
2408 bytestream_put_le16(&ptr, mba);
2409 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2410 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2411 /* 4MV not implemented */
2412 bytestream_put_byte(&ptr, 0); /* hmv2 */
2413 bytestream_put_byte(&ptr, 0); /* vmv2 */
2416 static void update_mb_info(MpegEncContext *s, int startcode)
2420 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2421 s->mb_info_size += 12;
2422 s->prev_mb_info = s->last_mb_info;
2425 s->prev_mb_info = put_bits_count(&s->pb)/8;
2426 /* This might have incremented mb_info_size above, and we return without
2427 * actually writing any info into that slot yet. But in that case,
2428 * this will be called again at the start of the after writing the
2429 * start code, actually writing the mb info. */
2433 s->last_mb_info = put_bits_count(&s->pb)/8;
2434 if (!s->mb_info_size)
2435 s->mb_info_size += 12;
2439 static int encode_thread(AVCodecContext *c, void *arg){
2440 MpegEncContext *s= *(void**)arg;
2441 int mb_x, mb_y, pdif = 0;
2442 int chr_h= 16>>s->chroma_y_shift;
2444 MpegEncContext best_s, backup_s;
2445 uint8_t bit_buf[2][MAX_MB_BYTES];
2446 uint8_t bit_buf2[2][MAX_MB_BYTES];
2447 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2448 PutBitContext pb[2], pb2[2], tex_pb[2];
2450 ff_check_alignment();
2453 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2454 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2455 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2458 s->last_bits= put_bits_count(&s->pb);
2469 /* init last dc values */
2470 /* note: quant matrix value (8) is implied here */
2471 s->last_dc[i] = 128 << s->intra_dc_precision;
2473 s->current_picture.f.error[i] = 0;
2475 if(s->codec_id==AV_CODEC_ID_AMV){
2476 s->last_dc[0] = 128*8/13;
2477 s->last_dc[1] = 128*8/14;
2478 s->last_dc[2] = 128*8/14;
2481 memset(s->last_mv, 0, sizeof(s->last_mv));
2485 switch(s->codec_id){
2486 case AV_CODEC_ID_H263:
2487 case AV_CODEC_ID_H263P:
2488 case AV_CODEC_ID_FLV1:
2489 if (CONFIG_H263_ENCODER)
2490 s->gob_index = ff_h263_get_gob_height(s);
2492 case AV_CODEC_ID_MPEG4:
2493 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2494 ff_mpeg4_init_partitions(s);
2500 s->first_slice_line = 1;
2501 s->ptr_lastgob = s->pb.buf;
2502 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2506 ff_set_qscale(s, s->qscale);
2507 ff_init_block_index(s);
2509 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2510 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2511 int mb_type= s->mb_type[xy];
2516 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2517 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2520 if(s->data_partitioning){
2521 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2522 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2523 av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
2529 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2530 ff_update_block_index(s);
2532 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2533 ff_h261_reorder_mb_index(s);
2534 xy= s->mb_y*s->mb_stride + s->mb_x;
2535 mb_type= s->mb_type[xy];
2538 /* write gob / video packet header */
2540 int current_packet_size, is_gob_start;
2542 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2544 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2546 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2548 switch(s->codec_id){
2549 case AV_CODEC_ID_H263:
2550 case AV_CODEC_ID_H263P:
2551 if(!s->h263_slice_structured)
2552 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2554 case AV_CODEC_ID_MPEG2VIDEO:
2555 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2556 case AV_CODEC_ID_MPEG1VIDEO:
2557 if(s->mb_skip_run) is_gob_start=0;
2559 case AV_CODEC_ID_MJPEG:
2560 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2565 if(s->start_mb_y != mb_y || mb_x!=0){
2567 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2568 ff_mpeg4_init_partitions(s);
2572 av_assert2((put_bits_count(&s->pb)&7) == 0);
2573 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2575 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
2576 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2577 int d= 100 / s->avctx->error_rate;
2579 current_packet_size=0;
2580 s->pb.buf_ptr= s->ptr_lastgob;
2581 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2585 if (s->avctx->rtp_callback){
2586 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2587 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2589 update_mb_info(s, 1);
2591 switch(s->codec_id){
2592 case AV_CODEC_ID_MPEG4:
2593 if (CONFIG_MPEG4_ENCODER) {
2594 ff_mpeg4_encode_video_packet_header(s);
2595 ff_mpeg4_clean_buffers(s);
2598 case AV_CODEC_ID_MPEG1VIDEO:
2599 case AV_CODEC_ID_MPEG2VIDEO:
2600 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2601 ff_mpeg1_encode_slice_header(s);
2602 ff_mpeg1_clean_buffers(s);
2605 case AV_CODEC_ID_H263:
2606 case AV_CODEC_ID_H263P:
2607 if (CONFIG_H263_ENCODER)
2608 ff_h263_encode_gob_header(s, mb_y);
2612 if(s->flags&CODEC_FLAG_PASS1){
2613 int bits= put_bits_count(&s->pb);
2614 s->misc_bits+= bits - s->last_bits;
2618 s->ptr_lastgob += current_packet_size;
2619 s->first_slice_line=1;
2620 s->resync_mb_x=mb_x;
2621 s->resync_mb_y=mb_y;
2625 if( (s->resync_mb_x == s->mb_x)
2626 && s->resync_mb_y+1 == s->mb_y){
2627 s->first_slice_line=0;
2631 s->dquant=0; //only for QP_RD
2633 update_mb_info(s, 0);
2635 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
2637 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2639 copy_context_before_encode(&backup_s, s, -1);
2641 best_s.data_partitioning= s->data_partitioning;
2642 best_s.partitioned_frame= s->partitioned_frame;
2643 if(s->data_partitioning){
2644 backup_s.pb2= s->pb2;
2645 backup_s.tex_pb= s->tex_pb;
2648 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2649 s->mv_dir = MV_DIR_FORWARD;
2650 s->mv_type = MV_TYPE_16X16;
2652 s->mv[0][0][0] = s->p_mv_table[xy][0];
2653 s->mv[0][0][1] = s->p_mv_table[xy][1];
2654 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2655 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2657 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2658 s->mv_dir = MV_DIR_FORWARD;
2659 s->mv_type = MV_TYPE_FIELD;
2662 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2663 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2664 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2666 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2667 &dmin, &next_block, 0, 0);
2669 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2670 s->mv_dir = MV_DIR_FORWARD;
2671 s->mv_type = MV_TYPE_16X16;
2675 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2676 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2678 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2679 s->mv_dir = MV_DIR_FORWARD;
2680 s->mv_type = MV_TYPE_8X8;
2683 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2684 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2686 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2687 &dmin, &next_block, 0, 0);
2689 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2690 s->mv_dir = MV_DIR_FORWARD;
2691 s->mv_type = MV_TYPE_16X16;
2693 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2694 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2695 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2696 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2698 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2699 s->mv_dir = MV_DIR_BACKWARD;
2700 s->mv_type = MV_TYPE_16X16;
2702 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2703 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2704 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2705 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2707 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2708 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2709 s->mv_type = MV_TYPE_16X16;
2711 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2712 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2713 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2714 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2715 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2716 &dmin, &next_block, 0, 0);
2718 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2719 s->mv_dir = MV_DIR_FORWARD;
2720 s->mv_type = MV_TYPE_FIELD;
2723 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2724 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2725 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2727 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2728 &dmin, &next_block, 0, 0);
2730 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2731 s->mv_dir = MV_DIR_BACKWARD;
2732 s->mv_type = MV_TYPE_FIELD;
2735 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2736 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2737 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2739 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2740 &dmin, &next_block, 0, 0);
2742 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2743 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2744 s->mv_type = MV_TYPE_FIELD;
2746 for(dir=0; dir<2; dir++){
2748 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2749 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2750 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2753 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2754 &dmin, &next_block, 0, 0);
2756 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2758 s->mv_type = MV_TYPE_16X16;
2762 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2763 &dmin, &next_block, 0, 0);
2764 if(s->h263_pred || s->h263_aic){
2766 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2768 ff_clean_intra_table_entries(s); //old mode?
2772 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2773 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2774 const int last_qp= backup_s.qscale;
2777 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2778 static const int dquant_tab[4]={-1,1,-2,2};
2779 int storecoefs = s->mb_intra && s->dc_val[0];
2781 av_assert2(backup_s.dquant == 0);
2784 s->mv_dir= best_s.mv_dir;
2785 s->mv_type = MV_TYPE_16X16;
2786 s->mb_intra= best_s.mb_intra;
2787 s->mv[0][0][0] = best_s.mv[0][0][0];
2788 s->mv[0][0][1] = best_s.mv[0][0][1];
2789 s->mv[1][0][0] = best_s.mv[1][0][0];
2790 s->mv[1][0][1] = best_s.mv[1][0][1];
2792 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2793 for(; qpi<4; qpi++){
2794 int dquant= dquant_tab[qpi];
2795 qp= last_qp + dquant;
2796 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2798 backup_s.dquant= dquant;
2801 dc[i]= s->dc_val[0][ s->block_index[i] ];
2802 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2806 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2807 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2808 if(best_s.qscale != qp){
2811 s->dc_val[0][ s->block_index[i] ]= dc[i];
2812 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2819 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2820 int mx= s->b_direct_mv_table[xy][0];
2821 int my= s->b_direct_mv_table[xy][1];
2823 backup_s.dquant = 0;
2824 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2826 ff_mpeg4_set_direct_mv(s, mx, my);
2827 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2828 &dmin, &next_block, mx, my);
2830 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2831 backup_s.dquant = 0;
2832 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2834 ff_mpeg4_set_direct_mv(s, 0, 0);
2835 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2836 &dmin, &next_block, 0, 0);
2838 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2841 coded |= s->block_last_index[i];
2844 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2845 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2846 mx=my=0; //FIXME find the one we actually used
2847 ff_mpeg4_set_direct_mv(s, mx, my);
2848 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2856 s->mv_dir= best_s.mv_dir;
2857 s->mv_type = best_s.mv_type;
2859 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2860 s->mv[0][0][1] = best_s.mv[0][0][1];
2861 s->mv[1][0][0] = best_s.mv[1][0][0];
2862 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2865 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2866 &dmin, &next_block, mx, my);
2871 s->current_picture.qscale_table[xy] = best_s.qscale;
2873 copy_context_after_encode(s, &best_s, -1);
2875 pb_bits_count= put_bits_count(&s->pb);
2876 flush_put_bits(&s->pb);
2877 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2880 if(s->data_partitioning){
2881 pb2_bits_count= put_bits_count(&s->pb2);
2882 flush_put_bits(&s->pb2);
2883 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2884 s->pb2= backup_s.pb2;
2886 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2887 flush_put_bits(&s->tex_pb);
2888 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2889 s->tex_pb= backup_s.tex_pb;
2891 s->last_bits= put_bits_count(&s->pb);
2893 if (CONFIG_H263_ENCODER &&
2894 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2895 ff_h263_update_motion_val(s);
2897 if(next_block==0){ //FIXME 16 vs linesize16
2898 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2899 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2900 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2903 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2904 ff_MPV_decode_mb(s, s->block);
2906 int motion_x = 0, motion_y = 0;
2907 s->mv_type=MV_TYPE_16X16;
2908 // only one MB-Type possible
2911 case CANDIDATE_MB_TYPE_INTRA:
2914 motion_x= s->mv[0][0][0] = 0;
2915 motion_y= s->mv[0][0][1] = 0;
2917 case CANDIDATE_MB_TYPE_INTER:
2918 s->mv_dir = MV_DIR_FORWARD;
2920 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2921 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2923 case CANDIDATE_MB_TYPE_INTER_I:
2924 s->mv_dir = MV_DIR_FORWARD;
2925 s->mv_type = MV_TYPE_FIELD;
2928 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2929 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2930 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2933 case CANDIDATE_MB_TYPE_INTER4V:
2934 s->mv_dir = MV_DIR_FORWARD;
2935 s->mv_type = MV_TYPE_8X8;
2938 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2939 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2942 case CANDIDATE_MB_TYPE_DIRECT:
2943 if (CONFIG_MPEG4_ENCODER) {
2944 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2946 motion_x=s->b_direct_mv_table[xy][0];
2947 motion_y=s->b_direct_mv_table[xy][1];
2948 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
2951 case CANDIDATE_MB_TYPE_DIRECT0:
2952 if (CONFIG_MPEG4_ENCODER) {
2953 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2955 ff_mpeg4_set_direct_mv(s, 0, 0);
2958 case CANDIDATE_MB_TYPE_BIDIR:
2959 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2961 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2962 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2963 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2964 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2966 case CANDIDATE_MB_TYPE_BACKWARD:
2967 s->mv_dir = MV_DIR_BACKWARD;
2969 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2970 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2972 case CANDIDATE_MB_TYPE_FORWARD:
2973 s->mv_dir = MV_DIR_FORWARD;
2975 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2976 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2978 case CANDIDATE_MB_TYPE_FORWARD_I:
2979 s->mv_dir = MV_DIR_FORWARD;
2980 s->mv_type = MV_TYPE_FIELD;
2983 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2984 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2985 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2988 case CANDIDATE_MB_TYPE_BACKWARD_I:
2989 s->mv_dir = MV_DIR_BACKWARD;
2990 s->mv_type = MV_TYPE_FIELD;
2993 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2994 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2995 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2998 case CANDIDATE_MB_TYPE_BIDIR_I:
2999 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3000 s->mv_type = MV_TYPE_FIELD;
3002 for(dir=0; dir<2; dir++){
3004 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3005 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3006 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3011 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3014 encode_mb(s, motion_x, motion_y);
3016 // RAL: Update last macroblock type
3017 s->last_mv_dir = s->mv_dir;
3019 if (CONFIG_H263_ENCODER &&
3020 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3021 ff_h263_update_motion_val(s);
3023 ff_MPV_decode_mb(s, s->block);
3026 /* clean the MV table in IPS frames for direct mode in B frames */
3027 if(s->mb_intra /* && I,P,S_TYPE */){
3028 s->p_mv_table[xy][0]=0;
3029 s->p_mv_table[xy][1]=0;
3032 if(s->flags&CODEC_FLAG_PSNR){
3036 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3037 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3039 s->current_picture.f.error[0] += sse(
3040 s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3041 s->dest[0], w, h, s->linesize);
3042 s->current_picture.f.error[1] += sse(
3043 s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3044 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3045 s->current_picture.f.error[2] += sse(
3046 s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3047 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3050 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3051 ff_h263_loop_filter(s);
3053 av_dlog(s->avctx, "MB %d %d bits\n",
3054 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3058 //not beautiful here but we must write it before flushing so it has to be here
3059 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3060 ff_msmpeg4_encode_ext_header(s);
3064 /* Send the last GOB if RTP */
3065 if (s->avctx->rtp_callback) {
3066 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3067 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3068 /* Call the RTP callback to send the last GOB */
3070 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3076 #define MERGE(field) dst->field += src->field; src->field=0
3077 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3078 MERGE(me.scene_change_score);
3079 MERGE(me.mc_mb_var_sum_temp);
3080 MERGE(me.mb_var_sum_temp);
3083 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3086 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3087 MERGE(dct_count[1]);
3096 MERGE(er.error_count);
3097 MERGE(padding_bug_score);
3098 MERGE(current_picture.f.error[0]);
3099 MERGE(current_picture.f.error[1]);
3100 MERGE(current_picture.f.error[2]);
3102 if(dst->avctx->noise_reduction){
3103 for(i=0; i<64; i++){
3104 MERGE(dct_error_sum[0][i]);
3105 MERGE(dct_error_sum[1][i]);
3109 assert(put_bits_count(&src->pb) % 8 ==0);
3110 assert(put_bits_count(&dst->pb) % 8 ==0);
3111 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3112 flush_put_bits(&dst->pb);
3115 static int estimate_qp(MpegEncContext *s, int dry_run){
3116 if (s->next_lambda){
3117 s->current_picture_ptr->f.quality =
3118 s->current_picture.f.quality = s->next_lambda;
3119 if(!dry_run) s->next_lambda= 0;
3120 } else if (!s->fixed_qscale) {
3121 s->current_picture_ptr->f.quality =
3122 s->current_picture.f.quality = ff_rate_estimate_qscale(s, dry_run);
3123 if (s->current_picture.f.quality < 0)
3127 if(s->adaptive_quant){
3128 switch(s->codec_id){
3129 case AV_CODEC_ID_MPEG4:
3130 if (CONFIG_MPEG4_ENCODER)
3131 ff_clean_mpeg4_qscales(s);
3133 case AV_CODEC_ID_H263:
3134 case AV_CODEC_ID_H263P:
3135 case AV_CODEC_ID_FLV1:
3136 if (CONFIG_H263_ENCODER)
3137 ff_clean_h263_qscales(s);
3140 ff_init_qscale_tab(s);
3143 s->lambda= s->lambda_table[0];
3146 s->lambda = s->current_picture.f.quality;
3151 /* must be called before writing the header */
3152 static void set_frame_distances(MpegEncContext * s){
3153 assert(s->current_picture_ptr->f.pts != AV_NOPTS_VALUE);
3154 s->time = s->current_picture_ptr->f.pts * s->avctx->time_base.num;
3156 if(s->pict_type==AV_PICTURE_TYPE_B){
3157 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3158 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3160 s->pp_time= s->time - s->last_non_b_time;
3161 s->last_non_b_time= s->time;
3162 assert(s->picture_number==0 || s->pp_time > 0);
3166 static int encode_picture(MpegEncContext *s, int picture_number)
3170 int context_count = s->slice_context_count;
3172 s->picture_number = picture_number;
3174 /* Reset the average MB variance */
3175 s->me.mb_var_sum_temp =
3176 s->me.mc_mb_var_sum_temp = 0;
3178 /* we need to initialize some time vars before we can encode b-frames */
3179 // RAL: Condition added for MPEG1VIDEO
3180 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3181 set_frame_distances(s);
3182 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3183 ff_set_mpeg4_time(s);
3185 s->me.scene_change_score=0;
3187 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3189 if(s->pict_type==AV_PICTURE_TYPE_I){
3190 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3191 else s->no_rounding=0;
3192 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3193 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3194 s->no_rounding ^= 1;
3197 if(s->flags & CODEC_FLAG_PASS2){
3198 if (estimate_qp(s,1) < 0)
3200 ff_get_2pass_fcode(s);
3201 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3202 if(s->pict_type==AV_PICTURE_TYPE_B)
3203 s->lambda= s->last_lambda_for[s->pict_type];
3205 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3209 if(s->codec_id != AV_CODEC_ID_AMV){
3210 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
3211 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
3212 s->q_chroma_intra_matrix = s->q_intra_matrix;
3213 s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
3216 s->mb_intra=0; //for the rate distortion & bit compare functions
3217 for(i=1; i<context_count; i++){
3218 ret = ff_update_duplicate_context(s->thread_context[i], s);
3226 /* Estimate motion for every MB */
3227 if(s->pict_type != AV_PICTURE_TYPE_I){
3228 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3229 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3230 if (s->pict_type != AV_PICTURE_TYPE_B) {
3231 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3232 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3236 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3237 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3239 for(i=0; i<s->mb_stride*s->mb_height; i++)
3240 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3242 if(!s->fixed_qscale){
3243 /* finding spatial complexity for I-frame rate control */
3244 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3247 for(i=1; i<context_count; i++){
3248 merge_context_after_me(s, s->thread_context[i]);
3250 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3251 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3254 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3255 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;
3258 if(s->msmpeg4_version >= 3)
3260 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3261 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3265 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3266 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3268 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3270 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3271 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3272 s->f_code= FFMAX3(s->f_code, a, b);
3275 ff_fix_long_p_mvs(s);
3276 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3277 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3281 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3282 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3287 if(s->pict_type==AV_PICTURE_TYPE_B){
3290 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3291 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3292 s->f_code = FFMAX(a, b);
3294 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3295 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3296 s->b_code = FFMAX(a, b);
3298 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3299 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3300 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3301 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3302 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3304 for(dir=0; dir<2; dir++){
3307 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3308 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3309 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3310 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3318 if (estimate_qp(s, 0) < 0)
3321 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3322 s->qscale= 3; //reduce clipping problems
3324 if (s->out_format == FMT_MJPEG) {
3325 /* for mjpeg, we do include qscale in the matrix */
3327 int j= s->dsp.idct_permutation[i];
3329 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3331 s->y_dc_scale_table=
3332 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3333 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3334 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3335 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3338 if(s->codec_id == AV_CODEC_ID_AMV){
3339 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};
3340 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};
3342 int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];
3344 s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
3345 s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
3347 s->y_dc_scale_table= y;
3348 s->c_dc_scale_table= c;
3349 s->intra_matrix[0] = 13;
3350 s->chroma_intra_matrix[0] = 14;
3351 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3352 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3353 ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3354 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3358 //FIXME var duplication
3359 s->current_picture_ptr->f.key_frame =
3360 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3361 s->current_picture_ptr->f.pict_type =
3362 s->current_picture.f.pict_type = s->pict_type;
3364 if (s->current_picture.f.key_frame)
3365 s->picture_in_gop_number=0;
3367 s->mb_x = s->mb_y = 0;
3368 s->last_bits= put_bits_count(&s->pb);
3369 switch(s->out_format) {
3371 if (CONFIG_MJPEG_ENCODER)
3372 ff_mjpeg_encode_picture_header(s);
3375 if (CONFIG_H261_ENCODER)
3376 ff_h261_encode_picture_header(s, picture_number);
3379 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3380 ff_wmv2_encode_picture_header(s, picture_number);
3381 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3382 ff_msmpeg4_encode_picture_header(s, picture_number);
3383 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3384 ff_mpeg4_encode_picture_header(s, picture_number);
3385 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3386 ff_rv10_encode_picture_header(s, picture_number);
3387 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3388 ff_rv20_encode_picture_header(s, picture_number);
3389 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3390 ff_flv_encode_picture_header(s, picture_number);
3391 else if (CONFIG_H263_ENCODER)
3392 ff_h263_encode_picture_header(s, picture_number);
3395 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3396 ff_mpeg1_encode_picture_header(s, picture_number);
3401 bits= put_bits_count(&s->pb);
3402 s->header_bits= bits - s->last_bits;
3404 for(i=1; i<context_count; i++){
3405 update_duplicate_context_after_me(s->thread_context[i], s);
3407 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3408 for(i=1; i<context_count; i++){
3409 merge_context_after_encode(s, s->thread_context[i]);
3415 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3416 const int intra= s->mb_intra;
3419 s->dct_count[intra]++;
3421 for(i=0; i<64; i++){
3422 int level= block[i];
3426 s->dct_error_sum[intra][i] += level;
3427 level -= s->dct_offset[intra][i];
3428 if(level<0) level=0;
3430 s->dct_error_sum[intra][i] -= level;
3431 level += s->dct_offset[intra][i];
3432 if(level>0) level=0;
3439 static int dct_quantize_trellis_c(MpegEncContext *s,
3440 int16_t *block, int n,
3441 int qscale, int *overflow){
3443 const uint8_t *scantable= s->intra_scantable.scantable;
3444 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3446 unsigned int threshold1, threshold2;
3458 int coeff_count[64];
3459 int qmul, qadd, start_i, last_non_zero, i, dc;
3460 const int esc_length= s->ac_esc_length;
3462 uint8_t * last_length;
3463 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3465 s->dsp.fdct (block);
3467 if(s->dct_error_sum)
3468 s->denoise_dct(s, block);
3470 qadd= ((qscale-1)|1)*8;
3481 /* For AIC we skip quant/dequant of INTRADC */
3486 /* note: block[0] is assumed to be positive */
3487 block[0] = (block[0] + (q >> 1)) / q;
3490 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3491 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3492 bias= 1<<(QMAT_SHIFT-1);
3493 length = s->intra_ac_vlc_length;
3494 last_length= s->intra_ac_vlc_last_length;
3498 qmat = s->q_inter_matrix[qscale];
3499 length = s->inter_ac_vlc_length;
3500 last_length= s->inter_ac_vlc_last_length;
3504 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3505 threshold2= (threshold1<<1);
3507 for(i=63; i>=start_i; i--) {
3508 const int j = scantable[i];
3509 int level = block[j] * qmat[j];
3511 if(((unsigned)(level+threshold1))>threshold2){
3517 for(i=start_i; i<=last_non_zero; i++) {
3518 const int j = scantable[i];
3519 int level = block[j] * qmat[j];
3521 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3522 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3523 if(((unsigned)(level+threshold1))>threshold2){
3525 level= (bias + level)>>QMAT_SHIFT;
3527 coeff[1][i]= level-1;
3528 // coeff[2][k]= level-2;
3530 level= (bias - level)>>QMAT_SHIFT;
3531 coeff[0][i]= -level;
3532 coeff[1][i]= -level+1;
3533 // coeff[2][k]= -level+2;
3535 coeff_count[i]= FFMIN(level, 2);
3536 av_assert2(coeff_count[i]);
3539 coeff[0][i]= (level>>31)|1;
3544 *overflow= s->max_qcoeff < max; //overflow might have happened
3546 if(last_non_zero < start_i){
3547 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3548 return last_non_zero;
3551 score_tab[start_i]= 0;
3552 survivor[0]= start_i;
3555 for(i=start_i; i<=last_non_zero; i++){
3556 int level_index, j, zero_distortion;
3557 int dct_coeff= FFABS(block[ scantable[i] ]);
3558 int best_score=256*256*256*120;
3560 if (s->dsp.fdct == ff_fdct_ifast)
3561 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3562 zero_distortion= dct_coeff*dct_coeff;
3564 for(level_index=0; level_index < coeff_count[i]; level_index++){
3566 int level= coeff[level_index][i];
3567 const int alevel= FFABS(level);
3572 if(s->out_format == FMT_H263){
3573 unquant_coeff= alevel*qmul + qadd;
3575 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3577 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3578 unquant_coeff = (unquant_coeff - 1) | 1;
3580 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3581 unquant_coeff = (unquant_coeff - 1) | 1;
3586 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3588 if((level&(~127)) == 0){
3589 for(j=survivor_count-1; j>=0; j--){
3590 int run= i - survivor[j];
3591 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3592 score += score_tab[i-run];
3594 if(score < best_score){
3597 level_tab[i+1]= level-64;
3601 if(s->out_format == FMT_H263){
3602 for(j=survivor_count-1; j>=0; j--){
3603 int run= i - survivor[j];
3604 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3605 score += score_tab[i-run];
3606 if(score < last_score){
3609 last_level= level-64;
3615 distortion += esc_length*lambda;
3616 for(j=survivor_count-1; j>=0; j--){
3617 int run= i - survivor[j];
3618 int score= distortion + score_tab[i-run];
3620 if(score < best_score){
3623 level_tab[i+1]= level-64;
3627 if(s->out_format == FMT_H263){
3628 for(j=survivor_count-1; j>=0; j--){
3629 int run= i - survivor[j];
3630 int score= distortion + score_tab[i-run];
3631 if(score < last_score){
3634 last_level= level-64;
3642 score_tab[i+1]= best_score;
3644 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3645 if(last_non_zero <= 27){
3646 for(; survivor_count; survivor_count--){
3647 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3651 for(; survivor_count; survivor_count--){
3652 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3657 survivor[ survivor_count++ ]= i+1;
3660 if(s->out_format != FMT_H263){
3661 last_score= 256*256*256*120;
3662 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3663 int score= score_tab[i];
3664 if(i) score += lambda*2; //FIXME exacter?
3666 if(score < last_score){
3669 last_level= level_tab[i];
3670 last_run= run_tab[i];
3675 s->coded_score[n] = last_score;
3677 dc= FFABS(block[0]);
3678 last_non_zero= last_i - 1;
3679 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3681 if(last_non_zero < start_i)
3682 return last_non_zero;
3684 if(last_non_zero == 0 && start_i == 0){
3686 int best_score= dc * dc;
3688 for(i=0; i<coeff_count[0]; i++){
3689 int level= coeff[i][0];
3690 int alevel= FFABS(level);
3691 int unquant_coeff, score, distortion;
3693 if(s->out_format == FMT_H263){
3694 unquant_coeff= (alevel*qmul + qadd)>>3;
3696 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3697 unquant_coeff = (unquant_coeff - 1) | 1;
3699 unquant_coeff = (unquant_coeff + 4) >> 3;
3700 unquant_coeff<<= 3 + 3;
3702 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3704 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3705 else score= distortion + esc_length*lambda;
3707 if(score < best_score){
3709 best_level= level - 64;
3712 block[0]= best_level;
3713 s->coded_score[n] = best_score - dc*dc;
3714 if(best_level == 0) return -1;
3715 else return last_non_zero;
3719 av_assert2(last_level);
3721 block[ perm_scantable[last_non_zero] ]= last_level;
3724 for(; i>start_i; i -= run_tab[i] + 1){
3725 block[ perm_scantable[i-1] ]= level_tab[i];
3728 return last_non_zero;
3731 //#define REFINE_STATS 1
3732 static int16_t basis[64][64];
3734 static void build_basis(uint8_t *perm){
3741 double s= 0.25*(1<<BASIS_SHIFT);
3743 int perm_index= perm[index];
3744 if(i==0) s*= sqrt(0.5);
3745 if(j==0) s*= sqrt(0.5);
3746 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)));
3753 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3754 int16_t *block, int16_t *weight, int16_t *orig,
3757 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3758 const uint8_t *scantable= s->intra_scantable.scantable;
3759 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3760 // unsigned int threshold1, threshold2;
3765 int qmul, qadd, start_i, last_non_zero, i, dc;
3767 uint8_t * last_length;
3769 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3772 static int after_last=0;
3773 static int to_zero=0;
3774 static int from_zero=0;
3777 static int messed_sign=0;
3780 if(basis[0][0] == 0)
3781 build_basis(s->dsp.idct_permutation);
3792 /* For AIC we skip quant/dequant of INTRADC */
3796 q <<= RECON_SHIFT-3;
3797 /* note: block[0] is assumed to be positive */
3799 // block[0] = (block[0] + (q >> 1)) / q;
3801 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3802 // bias= 1<<(QMAT_SHIFT-1);
3803 length = s->intra_ac_vlc_length;
3804 last_length= s->intra_ac_vlc_last_length;
3808 length = s->inter_ac_vlc_length;
3809 last_length= s->inter_ac_vlc_last_length;
3811 last_non_zero = s->block_last_index[n];
3816 dc += (1<<(RECON_SHIFT-1));
3817 for(i=0; i<64; i++){
3818 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3821 STOP_TIMER("memset rem[]")}
3824 for(i=0; i<64; i++){
3829 w= FFABS(weight[i]) + qns*one;
3830 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3833 // w=weight[i] = (63*qns + (w/2)) / w;
3836 av_assert2(w<(1<<6));
3839 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3845 for(i=start_i; i<=last_non_zero; i++){
3846 int j= perm_scantable[i];
3847 const int level= block[j];
3851 if(level<0) coeff= qmul*level - qadd;
3852 else coeff= qmul*level + qadd;
3853 run_tab[rle_index++]=run;
3856 s->dsp.add_8x8basis(rem, basis[j], coeff);
3862 if(last_non_zero>0){
3863 STOP_TIMER("init rem[]")
3870 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
3873 int run2, best_unquant_change=0, analyze_gradient;
3877 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3879 if(analyze_gradient){
3883 for(i=0; i<64; i++){
3886 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3889 STOP_TIMER("rem*w*w")}
3899 const int level= block[0];
3900 int change, old_coeff;
3902 av_assert2(s->mb_intra);
3906 for(change=-1; change<=1; change+=2){
3907 int new_level= level + change;
3908 int score, new_coeff;
3910 new_coeff= q*new_level;
3911 if(new_coeff >= 2048 || new_coeff < 0)
3914 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
3915 if(score<best_score){
3918 best_change= change;
3919 best_unquant_change= new_coeff - old_coeff;
3926 run2= run_tab[rle_index++];
3930 for(i=start_i; i<64; i++){
3931 int j= perm_scantable[i];
3932 const int level= block[j];
3933 int change, old_coeff;
3935 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3939 if(level<0) old_coeff= qmul*level - qadd;
3940 else old_coeff= qmul*level + qadd;
3941 run2= run_tab[rle_index++]; //FIXME ! maybe after last
3945 av_assert2(run2>=0 || i >= last_non_zero );
3948 for(change=-1; change<=1; change+=2){
3949 int new_level= level + change;
3950 int score, new_coeff, unquant_change;
3953 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
3957 if(new_level<0) new_coeff= qmul*new_level - qadd;
3958 else new_coeff= qmul*new_level + qadd;
3959 if(new_coeff >= 2048 || new_coeff <= -2048)
3961 //FIXME check for overflow
3964 if(level < 63 && level > -63){
3965 if(i < last_non_zero)
3966 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
3967 - length[UNI_AC_ENC_INDEX(run, level+64)];
3969 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
3970 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
3973 av_assert2(FFABS(new_level)==1);
3975 if(analyze_gradient){
3976 int g= d1[ scantable[i] ];
3977 if(g && (g^new_level) >= 0)
3981 if(i < last_non_zero){
3982 int next_i= i + run2 + 1;
3983 int next_level= block[ perm_scantable[next_i] ] + 64;
3985 if(next_level&(~127))
3988 if(next_i < last_non_zero)
3989 score += length[UNI_AC_ENC_INDEX(run, 65)]
3990 + length[UNI_AC_ENC_INDEX(run2, next_level)]
3991 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
3993 score += length[UNI_AC_ENC_INDEX(run, 65)]
3994 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
3995 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
3997 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
3999 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4000 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4006 av_assert2(FFABS(level)==1);
4008 if(i < last_non_zero){
4009 int next_i= i + run2 + 1;
4010 int next_level= block[ perm_scantable[next_i] ] + 64;
4012 if(next_level&(~127))
4015 if(next_i < last_non_zero)
4016 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4017 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4018 - length[UNI_AC_ENC_INDEX(run, 65)];
4020 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4021 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4022 - length[UNI_AC_ENC_INDEX(run, 65)];
4024 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4026 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4027 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4034 unquant_change= new_coeff - old_coeff;
4035 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4037 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
4038 if(score<best_score){
4041 best_change= change;
4042 best_unquant_change= unquant_change;
4046 prev_level= level + 64;
4047 if(prev_level&(~127))
4056 STOP_TIMER("iterative step")}
4060 int j= perm_scantable[ best_coeff ];
4062 block[j] += best_change;
4064 if(best_coeff > last_non_zero){
4065 last_non_zero= best_coeff;
4066 av_assert2(block[j]);
4073 if(block[j] - best_change){
4074 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4086 for(; last_non_zero>=start_i; last_non_zero--){
4087 if(block[perm_scantable[last_non_zero]])
4093 if(256*256*256*64 % count == 0){
4094 av_log(s->avctx, AV_LOG_DEBUG, "after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
4099 for(i=start_i; i<=last_non_zero; i++){
4100 int j= perm_scantable[i];
4101 const int level= block[j];
4104 run_tab[rle_index++]=run;
4111 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
4117 if(last_non_zero>0){
4118 STOP_TIMER("iterative search")
4123 return last_non_zero;
4126 int ff_dct_quantize_c(MpegEncContext *s,
4127 int16_t *block, int n,
4128 int qscale, int *overflow)
4130 int i, j, level, last_non_zero, q, start_i;
4132 const uint8_t *scantable= s->intra_scantable.scantable;
4135 unsigned int threshold1, threshold2;
4137 s->dsp.fdct (block);
4139 if(s->dct_error_sum)
4140 s->denoise_dct(s, block);
4150 /* For AIC we skip quant/dequant of INTRADC */
4153 /* note: block[0] is assumed to be positive */
4154 block[0] = (block[0] + (q >> 1)) / q;
4157 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4158 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4162 qmat = s->q_inter_matrix[qscale];
4163 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4165 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4166 threshold2= (threshold1<<1);
4167 for(i=63;i>=start_i;i--) {
4169 level = block[j] * qmat[j];
4171 if(((unsigned)(level+threshold1))>threshold2){
4178 for(i=start_i; i<=last_non_zero; i++) {
4180 level = block[j] * qmat[j];
4182 // if( bias+level >= (1<<QMAT_SHIFT)
4183 // || bias-level >= (1<<QMAT_SHIFT)){
4184 if(((unsigned)(level+threshold1))>threshold2){
4186 level= (bias + level)>>QMAT_SHIFT;
4189 level= (bias - level)>>QMAT_SHIFT;
4197 *overflow= s->max_qcoeff < max; //overflow might have happened
4199 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4200 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4201 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4203 return last_non_zero;
4206 #define OFFSET(x) offsetof(MpegEncContext, x)
4207 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4208 static const AVOption h263_options[] = {
4209 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4210 { "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},
4211 { "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 },
4216 static const AVClass h263_class = {
4217 .class_name = "H.263 encoder",
4218 .item_name = av_default_item_name,
4219 .option = h263_options,
4220 .version = LIBAVUTIL_VERSION_INT,
4223 AVCodec ff_h263_encoder = {
4225 .type = AVMEDIA_TYPE_VIDEO,
4226 .id = AV_CODEC_ID_H263,
4227 .priv_data_size = sizeof(MpegEncContext),
4228 .init = ff_MPV_encode_init,
4229 .encode2 = ff_MPV_encode_picture,
4230 .close = ff_MPV_encode_end,
4231 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4232 .long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4233 .priv_class = &h263_class,
4236 static const AVOption h263p_options[] = {
4237 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4238 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4239 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4240 { "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},
4244 static const AVClass h263p_class = {
4245 .class_name = "H.263p encoder",
4246 .item_name = av_default_item_name,
4247 .option = h263p_options,
4248 .version = LIBAVUTIL_VERSION_INT,
4251 AVCodec ff_h263p_encoder = {
4253 .type = AVMEDIA_TYPE_VIDEO,
4254 .id = AV_CODEC_ID_H263P,
4255 .priv_data_size = sizeof(MpegEncContext),
4256 .init = ff_MPV_encode_init,
4257 .encode2 = ff_MPV_encode_picture,
4258 .close = ff_MPV_encode_end,
4259 .capabilities = CODEC_CAP_SLICE_THREADS,
4260 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4261 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4262 .priv_class = &h263p_class,
4265 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4267 AVCodec ff_msmpeg4v2_encoder = {
4268 .name = "msmpeg4v2",
4269 .type = AVMEDIA_TYPE_VIDEO,
4270 .id = AV_CODEC_ID_MSMPEG4V2,
4271 .priv_data_size = sizeof(MpegEncContext),
4272 .init = ff_MPV_encode_init,
4273 .encode2 = ff_MPV_encode_picture,
4274 .close = ff_MPV_encode_end,
4275 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4276 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4277 .priv_class = &msmpeg4v2_class,
4280 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4282 AVCodec ff_msmpeg4v3_encoder = {
4284 .type = AVMEDIA_TYPE_VIDEO,
4285 .id = AV_CODEC_ID_MSMPEG4V3,
4286 .priv_data_size = sizeof(MpegEncContext),
4287 .init = ff_MPV_encode_init,
4288 .encode2 = ff_MPV_encode_picture,
4289 .close = ff_MPV_encode_end,
4290 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4291 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4292 .priv_class = &msmpeg4v3_class,
4295 FF_MPV_GENERIC_CLASS(wmv1)
4297 AVCodec ff_wmv1_encoder = {
4299 .type = AVMEDIA_TYPE_VIDEO,
4300 .id = AV_CODEC_ID_WMV1,
4301 .priv_data_size = sizeof(MpegEncContext),
4302 .init = ff_MPV_encode_init,
4303 .encode2 = ff_MPV_encode_picture,
4304 .close = ff_MPV_encode_end,
4305 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4306 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4307 .priv_class = &wmv1_class,