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 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO)) {
540 av_log(avctx, AV_LOG_ERROR,
541 "mpeg2 style quantization not supported by codec\n");
545 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
546 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
550 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
551 s->avctx->mb_decision != FF_MB_DECISION_RD) {
552 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
556 if (s->avctx->scenechange_threshold < 1000000000 &&
557 (s->flags & CODEC_FLAG_CLOSED_GOP)) {
558 av_log(avctx, AV_LOG_ERROR,
559 "closed gop with scene change detection are not supported yet, "
560 "set threshold to 1000000000\n");
564 if (s->flags & CODEC_FLAG_LOW_DELAY) {
565 if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
566 av_log(avctx, AV_LOG_ERROR,
567 "low delay forcing is only available for mpeg2\n");
570 if (s->max_b_frames != 0) {
571 av_log(avctx, AV_LOG_ERROR,
572 "b frames cannot be used with low delay\n");
577 if (s->q_scale_type == 1) {
578 if (avctx->qmax > 12) {
579 av_log(avctx, AV_LOG_ERROR,
580 "non linear quant only supports qmax <= 12 currently\n");
585 if (s->avctx->thread_count > 1 &&
586 s->codec_id != AV_CODEC_ID_MPEG4 &&
587 s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
588 s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
589 s->codec_id != AV_CODEC_ID_MJPEG &&
590 (s->codec_id != AV_CODEC_ID_H263P)) {
591 av_log(avctx, AV_LOG_ERROR,
592 "multi threaded encoding not supported by codec\n");
596 if (s->avctx->thread_count < 1) {
597 av_log(avctx, AV_LOG_ERROR,
598 "automatic thread number detection not supported by codec, "
603 if (s->avctx->slices > 1 || s->avctx->thread_count > 1)
606 if (s->avctx->thread_count > 1 && s->codec_id == AV_CODEC_ID_H263P)
607 s->h263_slice_structured = 1;
609 if (!avctx->time_base.den || !avctx->time_base.num) {
610 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
614 i = (INT_MAX / 2 + 128) >> 8;
615 if (avctx->mb_threshold >= i) {
616 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
621 if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
622 av_log(avctx, AV_LOG_INFO,
623 "notice: b_frame_strategy only affects the first pass\n");
624 avctx->b_frame_strategy = 0;
627 i = av_gcd(avctx->time_base.den, avctx->time_base.num);
629 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
630 avctx->time_base.den /= i;
631 avctx->time_base.num /= i;
635 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) {
636 // (a + x * 3 / 8) / x
637 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
638 s->inter_quant_bias = 0;
640 s->intra_quant_bias = 0;
642 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
645 if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
646 s->intra_quant_bias = avctx->intra_quant_bias;
647 if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
648 s->inter_quant_bias = avctx->inter_quant_bias;
650 av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
652 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
654 if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
655 s->avctx->time_base.den > (1 << 16) - 1) {
656 av_log(avctx, AV_LOG_ERROR,
657 "timebase %d/%d not supported by MPEG 4 standard, "
658 "the maximum admitted value for the timebase denominator "
659 "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
663 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
665 switch (avctx->codec->id) {
666 case AV_CODEC_ID_MPEG1VIDEO:
667 s->out_format = FMT_MPEG1;
668 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
669 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
671 case AV_CODEC_ID_MPEG2VIDEO:
672 s->out_format = FMT_MPEG1;
673 s->low_delay = !!(s->flags & CODEC_FLAG_LOW_DELAY);
674 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
677 case AV_CODEC_ID_LJPEG:
678 case AV_CODEC_ID_MJPEG:
679 case AV_CODEC_ID_AMV:
680 s->out_format = FMT_MJPEG;
681 s->intra_only = 1; /* force intra only for jpeg */
682 if (avctx->codec->id == AV_CODEC_ID_LJPEG &&
683 (avctx->pix_fmt == AV_PIX_FMT_BGR0
684 || s->avctx->pix_fmt == AV_PIX_FMT_BGRA
685 || s->avctx->pix_fmt == AV_PIX_FMT_BGR24)) {
686 s->mjpeg_vsample[0] = s->mjpeg_hsample[0] =
687 s->mjpeg_vsample[1] = s->mjpeg_hsample[1] =
688 s->mjpeg_vsample[2] = s->mjpeg_hsample[2] = 1;
689 } else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUVJ444P) {
690 s->mjpeg_vsample[0] = s->mjpeg_vsample[1] = s->mjpeg_vsample[2] = 2;
691 s->mjpeg_hsample[0] = s->mjpeg_hsample[1] = s->mjpeg_hsample[2] = 1;
693 s->mjpeg_vsample[0] = 2;
694 s->mjpeg_vsample[1] = 2 >> chroma_v_shift;
695 s->mjpeg_vsample[2] = 2 >> chroma_v_shift;
696 s->mjpeg_hsample[0] = 2;
697 s->mjpeg_hsample[1] = 2 >> chroma_h_shift;
698 s->mjpeg_hsample[2] = 2 >> chroma_h_shift;
700 if (!(CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) ||
701 ff_mjpeg_encode_init(s) < 0)
706 case AV_CODEC_ID_H261:
707 if (!CONFIG_H261_ENCODER)
709 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
710 av_log(avctx, AV_LOG_ERROR,
711 "The specified picture size of %dx%d is not valid for the "
712 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
713 s->width, s->height);
716 s->out_format = FMT_H261;
720 case AV_CODEC_ID_H263:
721 if (!CONFIG_H263_ENCODER)
723 if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
724 s->width, s->height) == 8) {
725 av_log(avctx, AV_LOG_ERROR,
726 "The specified picture size of %dx%d is not valid for "
727 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
728 "352x288, 704x576, and 1408x1152. "
729 "Try H.263+.\n", s->width, s->height);
732 s->out_format = FMT_H263;
736 case AV_CODEC_ID_H263P:
737 s->out_format = FMT_H263;
740 s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
741 s->modified_quant = s->h263_aic;
742 s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
743 s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
746 /* These are just to be sure */
750 case AV_CODEC_ID_FLV1:
751 s->out_format = FMT_H263;
752 s->h263_flv = 2; /* format = 1; 11-bit codes */
753 s->unrestricted_mv = 1;
754 s->rtp_mode = 0; /* don't allow GOB */
758 case AV_CODEC_ID_RV10:
759 s->out_format = FMT_H263;
763 case AV_CODEC_ID_RV20:
764 s->out_format = FMT_H263;
767 s->modified_quant = 1;
771 s->unrestricted_mv = 0;
773 case AV_CODEC_ID_MPEG4:
774 s->out_format = FMT_H263;
776 s->unrestricted_mv = 1;
777 s->low_delay = s->max_b_frames ? 0 : 1;
778 avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
780 case AV_CODEC_ID_MSMPEG4V2:
781 s->out_format = FMT_H263;
783 s->unrestricted_mv = 1;
784 s->msmpeg4_version = 2;
788 case AV_CODEC_ID_MSMPEG4V3:
789 s->out_format = FMT_H263;
791 s->unrestricted_mv = 1;
792 s->msmpeg4_version = 3;
793 s->flipflop_rounding = 1;
797 case AV_CODEC_ID_WMV1:
798 s->out_format = FMT_H263;
800 s->unrestricted_mv = 1;
801 s->msmpeg4_version = 4;
802 s->flipflop_rounding = 1;
806 case AV_CODEC_ID_WMV2:
807 s->out_format = FMT_H263;
809 s->unrestricted_mv = 1;
810 s->msmpeg4_version = 5;
811 s->flipflop_rounding = 1;
819 avctx->has_b_frames = !s->low_delay;
823 s->progressive_frame =
824 s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
825 CODEC_FLAG_INTERLACED_ME) ||
829 if (ff_MPV_common_init(s) < 0)
832 ff_dct_encode_init(s);
834 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
835 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
837 s->quant_precision = 5;
839 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
840 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
842 if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
843 ff_h261_encode_init(s);
844 if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
845 ff_h263_encode_init(s);
846 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
847 ff_msmpeg4_encode_init(s);
848 if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
849 && s->out_format == FMT_MPEG1)
850 ff_mpeg1_encode_init(s);
853 for (i = 0; i < 64; i++) {
854 int j = s->dsp.idct_permutation[i];
855 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
857 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
858 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
859 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
861 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
864 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
865 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
867 if (s->avctx->intra_matrix)
868 s->intra_matrix[j] = s->avctx->intra_matrix[i];
869 if (s->avctx->inter_matrix)
870 s->inter_matrix[j] = s->avctx->inter_matrix[i];
873 /* precompute matrix */
874 /* for mjpeg, we do include qscale in the matrix */
875 if (s->out_format != FMT_MJPEG) {
876 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
877 s->intra_matrix, s->intra_quant_bias, avctx->qmin,
879 ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
880 s->inter_matrix, s->inter_quant_bias, avctx->qmin,
884 if (ff_rate_control_init(s) < 0)
890 av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
892 MpegEncContext *s = avctx->priv_data;
894 ff_rate_control_uninit(s);
896 ff_MPV_common_end(s);
897 if ((CONFIG_MJPEG_ENCODER || CONFIG_LJPEG_ENCODER) &&
898 s->out_format == FMT_MJPEG)
899 ff_mjpeg_encode_close(s);
901 av_freep(&avctx->extradata);
906 static int get_sae(uint8_t *src, int ref, int stride)
911 for (y = 0; y < 16; y++) {
912 for (x = 0; x < 16; x++) {
913 acc += FFABS(src[x + y * stride] - ref);
920 static int get_intra_count(MpegEncContext *s, uint8_t *src,
921 uint8_t *ref, int stride)
929 for (y = 0; y < h; y += 16) {
930 for (x = 0; x < w; x += 16) {
931 int offset = x + y * stride;
932 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
934 int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
935 int sae = get_sae(src + offset, mean, stride);
937 acc += sae + 500 < sad;
944 static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
948 int i, display_picture_number = 0, ret;
949 const int encoding_delay = s->max_b_frames ? s->max_b_frames :
950 (s->low_delay ? 0 : 1);
955 display_picture_number = s->input_picture_number++;
957 if (pts != AV_NOPTS_VALUE) {
958 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 "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
965 return AVERROR(EINVAL);
968 if (!s->low_delay && display_picture_number == 1)
969 s->dts_delta = pts - 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);
1636 /* release non-reference frames */
1637 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1638 if (!s->picture[i].reference)
1639 ff_mpeg_unref_picture(s, &s->picture[i]);
1642 assert((s->frame_bits & 7) == 0);
1644 pkt->size = s->frame_bits / 8;
1645 *got_packet = !!pkt->size;
1649 static inline void dct_single_coeff_elimination(MpegEncContext *s,
1650 int n, int threshold)
1652 static const char tab[64] = {
1653 3, 2, 2, 1, 1, 1, 1, 1,
1654 1, 1, 1, 1, 1, 1, 1, 1,
1655 1, 1, 1, 1, 1, 1, 1, 1,
1656 0, 0, 0, 0, 0, 0, 0, 0,
1657 0, 0, 0, 0, 0, 0, 0, 0,
1658 0, 0, 0, 0, 0, 0, 0, 0,
1659 0, 0, 0, 0, 0, 0, 0, 0,
1660 0, 0, 0, 0, 0, 0, 0, 0
1665 int16_t *block = s->block[n];
1666 const int last_index = s->block_last_index[n];
1669 if (threshold < 0) {
1671 threshold = -threshold;
1675 /* Are all we could set to zero already zero? */
1676 if (last_index <= skip_dc - 1)
1679 for (i = 0; i <= last_index; i++) {
1680 const int j = s->intra_scantable.permutated[i];
1681 const int level = FFABS(block[j]);
1683 if (skip_dc && i == 0)
1687 } else if (level > 1) {
1693 if (score >= threshold)
1695 for (i = skip_dc; i <= last_index; i++) {
1696 const int j = s->intra_scantable.permutated[i];
1700 s->block_last_index[n] = 0;
1702 s->block_last_index[n] = -1;
1705 static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1709 const int maxlevel = s->max_qcoeff;
1710 const int minlevel = s->min_qcoeff;
1714 i = 1; // skip clipping of intra dc
1718 for (; i <= last_index; i++) {
1719 const int j = s->intra_scantable.permutated[i];
1720 int level = block[j];
1722 if (level > maxlevel) {
1725 } else if (level < minlevel) {
1733 if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1734 av_log(s->avctx, AV_LOG_INFO,
1735 "warning, clipping %d dct coefficients to %d..%d\n",
1736 overflow, minlevel, maxlevel);
1739 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
1743 for (y = 0; y < 8; y++) {
1744 for (x = 0; x < 8; x++) {
1750 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
1751 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
1752 int v = ptr[x2 + y2 * stride];
1758 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
1763 static av_always_inline void encode_mb_internal(MpegEncContext *s,
1764 int motion_x, int motion_y,
1765 int mb_block_height,
1769 int16_t weight[12][64];
1770 int16_t orig[12][64];
1771 const int mb_x = s->mb_x;
1772 const int mb_y = s->mb_y;
1775 int dct_offset = s->linesize * 8; // default for progressive frames
1776 int uv_dct_offset = s->uvlinesize * 8;
1777 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1780 for (i = 0; i < mb_block_count; i++)
1781 skip_dct[i] = s->skipdct;
1783 if (s->adaptive_quant) {
1784 const int last_qp = s->qscale;
1785 const int mb_xy = mb_x + mb_y * s->mb_stride;
1787 s->lambda = s->lambda_table[mb_xy];
1790 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1791 s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1792 s->dquant = s->qscale - last_qp;
1794 if (s->out_format == FMT_H263) {
1795 s->dquant = av_clip(s->dquant, -2, 2);
1797 if (s->codec_id == AV_CODEC_ID_MPEG4) {
1799 if (s->pict_type == AV_PICTURE_TYPE_B) {
1800 if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
1803 if (s->mv_type == MV_TYPE_8X8)
1809 ff_set_qscale(s, last_qp + s->dquant);
1810 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
1811 ff_set_qscale(s, s->qscale + s->dquant);
1813 wrap_y = s->linesize;
1814 wrap_c = s->uvlinesize;
1815 ptr_y = s->new_picture.f.data[0] +
1816 (mb_y * 16 * wrap_y) + mb_x * 16;
1817 ptr_cb = s->new_picture.f.data[1] +
1818 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1819 ptr_cr = s->new_picture.f.data[2] +
1820 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
1822 if((mb_x*16+16 > s->width || mb_y*16+16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
1823 uint8_t *ebuf = s->edge_emu_buffer + 32;
1824 int cw = (s->width + s->chroma_x_shift) >> s->chroma_x_shift;
1825 int ch = (s->height + s->chroma_y_shift) >> s->chroma_y_shift;
1826 s->vdsp.emulated_edge_mc(ebuf, ptr_y, wrap_y, 16, 16, mb_x * 16,
1827 mb_y * 16, s->width, s->height);
1829 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb, wrap_c, mb_block_width,
1830 mb_block_height, mb_x * mb_block_width, mb_y * mb_block_height,
1832 ptr_cb = ebuf + 18 * wrap_y;
1833 s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 16, ptr_cr, wrap_c, mb_block_width,
1834 mb_block_height, mb_x * mb_block_width, mb_y * mb_block_height,
1836 ptr_cr = ebuf + 18 * wrap_y + 16;
1840 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1841 int progressive_score, interlaced_score;
1843 s->interlaced_dct = 0;
1844 progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
1846 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
1847 NULL, wrap_y, 8) - 400;
1849 if (progressive_score > 0) {
1850 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
1851 NULL, wrap_y * 2, 8) +
1852 s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
1853 NULL, wrap_y * 2, 8);
1854 if (progressive_score > interlaced_score) {
1855 s->interlaced_dct = 1;
1857 dct_offset = wrap_y;
1858 uv_dct_offset = wrap_c;
1860 if (s->chroma_format == CHROMA_422 ||
1861 s->chroma_format == CHROMA_444)
1867 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
1868 s->dsp.get_pixels(s->block[1], ptr_y + 8 , wrap_y);
1869 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
1870 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
1872 if (s->flags & CODEC_FLAG_GRAY) {
1876 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
1877 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
1878 if (!s->chroma_y_shift && s->chroma_x_shift) { /* 422 */
1879 s->dsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
1880 s->dsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
1881 } else if (!s->chroma_y_shift && !s->chroma_x_shift) { /* 444 */
1882 s->dsp.get_pixels(s->block[6], ptr_cb + 8, wrap_c);
1883 s->dsp.get_pixels(s->block[7], ptr_cr + 8, wrap_c);
1884 s->dsp.get_pixels(s->block[8], ptr_cb + uv_dct_offset, wrap_c);
1885 s->dsp.get_pixels(s->block[9], ptr_cr + uv_dct_offset, wrap_c);
1886 s->dsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
1887 s->dsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
1891 op_pixels_func (*op_pix)[4];
1892 qpel_mc_func (*op_qpix)[16];
1893 uint8_t *dest_y, *dest_cb, *dest_cr;
1895 dest_y = s->dest[0];
1896 dest_cb = s->dest[1];
1897 dest_cr = s->dest[2];
1899 if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
1900 op_pix = s->hdsp.put_pixels_tab;
1901 op_qpix = s->dsp.put_qpel_pixels_tab;
1903 op_pix = s->hdsp.put_no_rnd_pixels_tab;
1904 op_qpix = s->dsp.put_no_rnd_qpel_pixels_tab;
1907 if (s->mv_dir & MV_DIR_FORWARD) {
1908 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
1909 s->last_picture.f.data,
1911 op_pix = s->hdsp.avg_pixels_tab;
1912 op_qpix = s->dsp.avg_qpel_pixels_tab;
1914 if (s->mv_dir & MV_DIR_BACKWARD) {
1915 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
1916 s->next_picture.f.data,
1920 if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
1921 int progressive_score, interlaced_score;
1923 s->interlaced_dct = 0;
1924 progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
1927 s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
1928 ptr_y + wrap_y * 8, wrap_y,
1931 if (s->avctx->ildct_cmp == FF_CMP_VSSE)
1932 progressive_score -= 400;
1934 if (progressive_score > 0) {
1935 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
1938 s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
1942 if (progressive_score > interlaced_score) {
1943 s->interlaced_dct = 1;
1945 dct_offset = wrap_y;
1946 uv_dct_offset = wrap_c;
1948 if (s->chroma_format == CHROMA_422)
1954 s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
1955 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
1956 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
1957 dest_y + dct_offset, wrap_y);
1958 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
1959 dest_y + dct_offset + 8, wrap_y);
1961 if (s->flags & CODEC_FLAG_GRAY) {
1965 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
1966 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
1967 if (!s->chroma_y_shift) { /* 422 */
1968 s->dsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
1969 dest_cb + uv_dct_offset, wrap_c);
1970 s->dsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
1971 dest_cr + uv_dct_offset, wrap_c);
1974 /* pre quantization */
1975 if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
1976 2 * s->qscale * s->qscale) {
1978 if (s->dsp.sad[1](NULL, ptr_y , dest_y,
1979 wrap_y, 8) < 20 * s->qscale)
1981 if (s->dsp.sad[1](NULL, ptr_y + 8,
1982 dest_y + 8, wrap_y, 8) < 20 * s->qscale)
1984 if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
1985 dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
1987 if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
1988 dest_y + dct_offset + 8,
1989 wrap_y, 8) < 20 * s->qscale)
1991 if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
1992 wrap_c, 8) < 20 * s->qscale)
1994 if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
1995 wrap_c, 8) < 20 * s->qscale)
1997 if (!s->chroma_y_shift) { /* 422 */
1998 if (s->dsp.sad[1](NULL, ptr_cb + uv_dct_offset,
1999 dest_cb + uv_dct_offset,
2000 wrap_c, 8) < 20 * s->qscale)
2002 if (s->dsp.sad[1](NULL, ptr_cr + uv_dct_offset,
2003 dest_cr + uv_dct_offset,
2004 wrap_c, 8) < 20 * s->qscale)
2010 if (s->quantizer_noise_shaping) {
2012 get_visual_weight(weight[0], ptr_y , wrap_y);
2014 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2016 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2018 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2020 get_visual_weight(weight[4], ptr_cb , wrap_c);
2022 get_visual_weight(weight[5], ptr_cr , wrap_c);
2023 if (!s->chroma_y_shift) { /* 422 */
2025 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2028 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2031 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2034 /* DCT & quantize */
2035 av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
2037 for (i = 0; i < mb_block_count; i++) {
2040 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2041 // FIXME we could decide to change to quantizer instead of
2043 // JS: I don't think that would be a good idea it could lower
2044 // quality instead of improve it. Just INTRADC clipping
2045 // deserves changes in quantizer
2047 clip_coeffs(s, s->block[i], s->block_last_index[i]);
2049 s->block_last_index[i] = -1;
2051 if (s->quantizer_noise_shaping) {
2052 for (i = 0; i < mb_block_count; i++) {
2054 s->block_last_index[i] =
2055 dct_quantize_refine(s, s->block[i], weight[i],
2056 orig[i], i, s->qscale);
2061 if (s->luma_elim_threshold && !s->mb_intra)
2062 for (i = 0; i < 4; i++)
2063 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2064 if (s->chroma_elim_threshold && !s->mb_intra)
2065 for (i = 4; i < mb_block_count; i++)
2066 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2068 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2069 for (i = 0; i < mb_block_count; i++) {
2070 if (s->block_last_index[i] == -1)
2071 s->coded_score[i] = INT_MAX / 256;
2076 if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
2077 s->block_last_index[4] =
2078 s->block_last_index[5] = 0;
2080 s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2081 if (!s->chroma_y_shift) { /* 422 / 444 */
2082 for (i=6; i<12; i++) {
2083 s->block_last_index[i] = 0;
2084 s->block[i][0] = s->block[4][0];
2089 // non c quantize code returns incorrect block_last_index FIXME
2090 if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2091 for (i = 0; i < mb_block_count; i++) {
2093 if (s->block_last_index[i] > 0) {
2094 for (j = 63; j > 0; j--) {
2095 if (s->block[i][s->intra_scantable.permutated[j]])
2098 s->block_last_index[i] = j;
2103 /* huffman encode */
2104 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2105 case AV_CODEC_ID_MPEG1VIDEO:
2106 case AV_CODEC_ID_MPEG2VIDEO:
2107 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2108 ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2110 case AV_CODEC_ID_MPEG4:
2111 if (CONFIG_MPEG4_ENCODER)
2112 ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2114 case AV_CODEC_ID_MSMPEG4V2:
2115 case AV_CODEC_ID_MSMPEG4V3:
2116 case AV_CODEC_ID_WMV1:
2117 if (CONFIG_MSMPEG4_ENCODER)
2118 ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2120 case AV_CODEC_ID_WMV2:
2121 if (CONFIG_WMV2_ENCODER)
2122 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
2124 case AV_CODEC_ID_H261:
2125 if (CONFIG_H261_ENCODER)
2126 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
2128 case AV_CODEC_ID_H263:
2129 case AV_CODEC_ID_H263P:
2130 case AV_CODEC_ID_FLV1:
2131 case AV_CODEC_ID_RV10:
2132 case AV_CODEC_ID_RV20:
2133 if (CONFIG_H263_ENCODER)
2134 ff_h263_encode_mb(s, s->block, motion_x, motion_y);
2136 case AV_CODEC_ID_MJPEG:
2137 case AV_CODEC_ID_AMV:
2138 if (CONFIG_MJPEG_ENCODER)
2139 ff_mjpeg_encode_mb(s, s->block);
2146 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2148 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 8, 6);
2149 else if (s->chroma_format == CHROMA_422) encode_mb_internal(s, motion_x, motion_y, 16, 8, 8);
2150 else encode_mb_internal(s, motion_x, motion_y, 16, 16, 12);
2153 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2156 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2159 d->mb_skip_run= s->mb_skip_run;
2161 d->last_dc[i] = s->last_dc[i];
2164 d->mv_bits= s->mv_bits;
2165 d->i_tex_bits= s->i_tex_bits;
2166 d->p_tex_bits= s->p_tex_bits;
2167 d->i_count= s->i_count;
2168 d->f_count= s->f_count;
2169 d->b_count= s->b_count;
2170 d->skip_count= s->skip_count;
2171 d->misc_bits= s->misc_bits;
2175 d->qscale= s->qscale;
2176 d->dquant= s->dquant;
2178 d->esc3_level_length= s->esc3_level_length;
2181 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2184 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2185 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
2188 d->mb_skip_run= s->mb_skip_run;
2190 d->last_dc[i] = s->last_dc[i];
2193 d->mv_bits= s->mv_bits;
2194 d->i_tex_bits= s->i_tex_bits;
2195 d->p_tex_bits= s->p_tex_bits;
2196 d->i_count= s->i_count;
2197 d->f_count= s->f_count;
2198 d->b_count= s->b_count;
2199 d->skip_count= s->skip_count;
2200 d->misc_bits= s->misc_bits;
2202 d->mb_intra= s->mb_intra;
2203 d->mb_skipped= s->mb_skipped;
2204 d->mv_type= s->mv_type;
2205 d->mv_dir= s->mv_dir;
2207 if(s->data_partitioning){
2209 d->tex_pb= s->tex_pb;
2213 d->block_last_index[i]= s->block_last_index[i];
2214 d->interlaced_dct= s->interlaced_dct;
2215 d->qscale= s->qscale;
2217 d->esc3_level_length= s->esc3_level_length;
2220 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2221 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2222 int *dmin, int *next_block, int motion_x, int motion_y)
2225 uint8_t *dest_backup[3];
2227 copy_context_before_encode(s, backup, type);
2229 s->block= s->blocks[*next_block];
2230 s->pb= pb[*next_block];
2231 if(s->data_partitioning){
2232 s->pb2 = pb2 [*next_block];
2233 s->tex_pb= tex_pb[*next_block];
2237 memcpy(dest_backup, s->dest, sizeof(s->dest));
2238 s->dest[0] = s->rd_scratchpad;
2239 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
2240 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2241 assert(s->linesize >= 32); //FIXME
2244 encode_mb(s, motion_x, motion_y);
2246 score= put_bits_count(&s->pb);
2247 if(s->data_partitioning){
2248 score+= put_bits_count(&s->pb2);
2249 score+= put_bits_count(&s->tex_pb);
2252 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2253 ff_MPV_decode_mb(s, s->block);
2255 score *= s->lambda2;
2256 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2260 memcpy(s->dest, dest_backup, sizeof(s->dest));
2267 copy_context_after_encode(best, s, type);
2271 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2272 uint32_t *sq = ff_squareTbl + 256;
2277 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
2278 else if(w==8 && h==8)
2279 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
2283 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2292 static int sse_mb(MpegEncContext *s){
2296 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
2297 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
2300 if(s->avctx->mb_cmp == FF_CMP_NSSE){
2301 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)
2302 +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)
2303 +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);
2305 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)
2306 +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)
2307 +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);
2310 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)
2311 +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)
2312 +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);
2315 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2316 MpegEncContext *s= *(void**)arg;
2320 s->me.dia_size= s->avctx->pre_dia_size;
2321 s->first_slice_line=1;
2322 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
2323 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
2324 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2326 s->first_slice_line=0;
2334 static int estimate_motion_thread(AVCodecContext *c, void *arg){
2335 MpegEncContext *s= *(void**)arg;
2337 ff_check_alignment();
2339 s->me.dia_size= s->avctx->dia_size;
2340 s->first_slice_line=1;
2341 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2342 s->mb_x=0; //for block init below
2343 ff_init_block_index(s);
2344 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
2345 s->block_index[0]+=2;
2346 s->block_index[1]+=2;
2347 s->block_index[2]+=2;
2348 s->block_index[3]+=2;
2350 /* compute motion vector & mb_type and store in context */
2351 if(s->pict_type==AV_PICTURE_TYPE_B)
2352 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
2354 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
2356 s->first_slice_line=0;
2361 static int mb_var_thread(AVCodecContext *c, void *arg){
2362 MpegEncContext *s= *(void**)arg;
2365 ff_check_alignment();
2367 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2368 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2371 uint8_t *pix = s->new_picture.f.data[0] + (yy * s->linesize) + xx;
2373 int sum = s->dsp.pix_sum(pix, s->linesize);
2375 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
2377 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
2378 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
2379 s->me.mb_var_sum_temp += varc;
2385 static void write_slice_end(MpegEncContext *s){
2386 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
2387 if(s->partitioned_frame){
2388 ff_mpeg4_merge_partitions(s);
2391 ff_mpeg4_stuffing(&s->pb);
2392 }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2393 ff_mjpeg_encode_stuffing(s);
2396 avpriv_align_put_bits(&s->pb);
2397 flush_put_bits(&s->pb);
2399 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
2400 s->misc_bits+= get_bits_diff(s);
2403 static void write_mb_info(MpegEncContext *s)
2405 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2406 int offset = put_bits_count(&s->pb);
2407 int mba = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
2408 int gobn = s->mb_y / s->gob_index;
2410 if (CONFIG_H263_ENCODER)
2411 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
2412 bytestream_put_le32(&ptr, offset);
2413 bytestream_put_byte(&ptr, s->qscale);
2414 bytestream_put_byte(&ptr, gobn);
2415 bytestream_put_le16(&ptr, mba);
2416 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2417 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2418 /* 4MV not implemented */
2419 bytestream_put_byte(&ptr, 0); /* hmv2 */
2420 bytestream_put_byte(&ptr, 0); /* vmv2 */
2423 static void update_mb_info(MpegEncContext *s, int startcode)
2427 if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
2428 s->mb_info_size += 12;
2429 s->prev_mb_info = s->last_mb_info;
2432 s->prev_mb_info = put_bits_count(&s->pb)/8;
2433 /* This might have incremented mb_info_size above, and we return without
2434 * actually writing any info into that slot yet. But in that case,
2435 * this will be called again at the start of the after writing the
2436 * start code, actually writing the mb info. */
2440 s->last_mb_info = put_bits_count(&s->pb)/8;
2441 if (!s->mb_info_size)
2442 s->mb_info_size += 12;
2446 static int encode_thread(AVCodecContext *c, void *arg){
2447 MpegEncContext *s= *(void**)arg;
2448 int mb_x, mb_y, pdif = 0;
2449 int chr_h= 16>>s->chroma_y_shift;
2451 MpegEncContext best_s, backup_s;
2452 uint8_t bit_buf[2][MAX_MB_BYTES];
2453 uint8_t bit_buf2[2][MAX_MB_BYTES];
2454 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
2455 PutBitContext pb[2], pb2[2], tex_pb[2];
2457 ff_check_alignment();
2460 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2461 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
2462 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
2465 s->last_bits= put_bits_count(&s->pb);
2476 /* init last dc values */
2477 /* note: quant matrix value (8) is implied here */
2478 s->last_dc[i] = 128 << s->intra_dc_precision;
2480 s->current_picture.f.error[i] = 0;
2482 if(s->codec_id==AV_CODEC_ID_AMV){
2483 s->last_dc[0] = 128*8/13;
2484 s->last_dc[1] = 128*8/14;
2485 s->last_dc[2] = 128*8/14;
2488 memset(s->last_mv, 0, sizeof(s->last_mv));
2492 switch(s->codec_id){
2493 case AV_CODEC_ID_H263:
2494 case AV_CODEC_ID_H263P:
2495 case AV_CODEC_ID_FLV1:
2496 if (CONFIG_H263_ENCODER)
2497 s->gob_index = ff_h263_get_gob_height(s);
2499 case AV_CODEC_ID_MPEG4:
2500 if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
2501 ff_mpeg4_init_partitions(s);
2507 s->first_slice_line = 1;
2508 s->ptr_lastgob = s->pb.buf;
2509 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
2513 ff_set_qscale(s, s->qscale);
2514 ff_init_block_index(s);
2516 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2517 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
2518 int mb_type= s->mb_type[xy];
2523 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
2524 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2527 if(s->data_partitioning){
2528 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
2529 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2530 av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
2536 s->mb_y = mb_y; // moved into loop, can get changed by H.261
2537 ff_update_block_index(s);
2539 if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
2540 ff_h261_reorder_mb_index(s);
2541 xy= s->mb_y*s->mb_stride + s->mb_x;
2542 mb_type= s->mb_type[xy];
2545 /* write gob / video packet header */
2547 int current_packet_size, is_gob_start;
2549 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
2551 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
2553 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
2555 switch(s->codec_id){
2556 case AV_CODEC_ID_H263:
2557 case AV_CODEC_ID_H263P:
2558 if(!s->h263_slice_structured)
2559 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
2561 case AV_CODEC_ID_MPEG2VIDEO:
2562 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2563 case AV_CODEC_ID_MPEG1VIDEO:
2564 if(s->mb_skip_run) is_gob_start=0;
2566 case AV_CODEC_ID_MJPEG:
2567 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2572 if(s->start_mb_y != mb_y || mb_x!=0){
2574 if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
2575 ff_mpeg4_init_partitions(s);
2579 av_assert2((put_bits_count(&s->pb)&7) == 0);
2580 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
2582 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
2583 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2584 int d= 100 / s->avctx->error_rate;
2586 current_packet_size=0;
2587 s->pb.buf_ptr= s->ptr_lastgob;
2588 assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
2592 if (s->avctx->rtp_callback){
2593 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
2594 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
2596 update_mb_info(s, 1);
2598 switch(s->codec_id){
2599 case AV_CODEC_ID_MPEG4:
2600 if (CONFIG_MPEG4_ENCODER) {
2601 ff_mpeg4_encode_video_packet_header(s);
2602 ff_mpeg4_clean_buffers(s);
2605 case AV_CODEC_ID_MPEG1VIDEO:
2606 case AV_CODEC_ID_MPEG2VIDEO:
2607 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2608 ff_mpeg1_encode_slice_header(s);
2609 ff_mpeg1_clean_buffers(s);
2612 case AV_CODEC_ID_H263:
2613 case AV_CODEC_ID_H263P:
2614 if (CONFIG_H263_ENCODER)
2615 ff_h263_encode_gob_header(s, mb_y);
2619 if(s->flags&CODEC_FLAG_PASS1){
2620 int bits= put_bits_count(&s->pb);
2621 s->misc_bits+= bits - s->last_bits;
2625 s->ptr_lastgob += current_packet_size;
2626 s->first_slice_line=1;
2627 s->resync_mb_x=mb_x;
2628 s->resync_mb_y=mb_y;
2632 if( (s->resync_mb_x == s->mb_x)
2633 && s->resync_mb_y+1 == s->mb_y){
2634 s->first_slice_line=0;
2638 s->dquant=0; //only for QP_RD
2640 update_mb_info(s, 0);
2642 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
2644 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2646 copy_context_before_encode(&backup_s, s, -1);
2648 best_s.data_partitioning= s->data_partitioning;
2649 best_s.partitioned_frame= s->partitioned_frame;
2650 if(s->data_partitioning){
2651 backup_s.pb2= s->pb2;
2652 backup_s.tex_pb= s->tex_pb;
2655 if(mb_type&CANDIDATE_MB_TYPE_INTER){
2656 s->mv_dir = MV_DIR_FORWARD;
2657 s->mv_type = MV_TYPE_16X16;
2659 s->mv[0][0][0] = s->p_mv_table[xy][0];
2660 s->mv[0][0][1] = s->p_mv_table[xy][1];
2661 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
2662 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2664 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
2665 s->mv_dir = MV_DIR_FORWARD;
2666 s->mv_type = MV_TYPE_FIELD;
2669 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2670 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2671 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2673 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
2674 &dmin, &next_block, 0, 0);
2676 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
2677 s->mv_dir = MV_DIR_FORWARD;
2678 s->mv_type = MV_TYPE_16X16;
2682 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
2683 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2685 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
2686 s->mv_dir = MV_DIR_FORWARD;
2687 s->mv_type = MV_TYPE_8X8;
2690 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2691 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2693 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
2694 &dmin, &next_block, 0, 0);
2696 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
2697 s->mv_dir = MV_DIR_FORWARD;
2698 s->mv_type = MV_TYPE_16X16;
2700 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2701 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2702 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
2703 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2705 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
2706 s->mv_dir = MV_DIR_BACKWARD;
2707 s->mv_type = MV_TYPE_16X16;
2709 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2710 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2711 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2712 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2714 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
2715 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2716 s->mv_type = MV_TYPE_16X16;
2718 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2719 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2720 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2721 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2722 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
2723 &dmin, &next_block, 0, 0);
2725 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
2726 s->mv_dir = MV_DIR_FORWARD;
2727 s->mv_type = MV_TYPE_FIELD;
2730 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2731 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2732 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2734 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
2735 &dmin, &next_block, 0, 0);
2737 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
2738 s->mv_dir = MV_DIR_BACKWARD;
2739 s->mv_type = MV_TYPE_FIELD;
2742 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
2743 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
2744 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
2746 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
2747 &dmin, &next_block, 0, 0);
2749 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
2750 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2751 s->mv_type = MV_TYPE_FIELD;
2753 for(dir=0; dir<2; dir++){
2755 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
2756 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
2757 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
2760 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
2761 &dmin, &next_block, 0, 0);
2763 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
2765 s->mv_type = MV_TYPE_16X16;
2769 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
2770 &dmin, &next_block, 0, 0);
2771 if(s->h263_pred || s->h263_aic){
2773 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
2775 ff_clean_intra_table_entries(s); //old mode?
2779 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
2780 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
2781 const int last_qp= backup_s.qscale;
2784 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
2785 static const int dquant_tab[4]={-1,1,-2,2};
2786 int storecoefs = s->mb_intra && s->dc_val[0];
2788 av_assert2(backup_s.dquant == 0);
2791 s->mv_dir= best_s.mv_dir;
2792 s->mv_type = MV_TYPE_16X16;
2793 s->mb_intra= best_s.mb_intra;
2794 s->mv[0][0][0] = best_s.mv[0][0][0];
2795 s->mv[0][0][1] = best_s.mv[0][0][1];
2796 s->mv[1][0][0] = best_s.mv[1][0][0];
2797 s->mv[1][0][1] = best_s.mv[1][0][1];
2799 qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
2800 for(; qpi<4; qpi++){
2801 int dquant= dquant_tab[qpi];
2802 qp= last_qp + dquant;
2803 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
2805 backup_s.dquant= dquant;
2808 dc[i]= s->dc_val[0][ s->block_index[i] ];
2809 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
2813 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2814 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
2815 if(best_s.qscale != qp){
2818 s->dc_val[0][ s->block_index[i] ]= dc[i];
2819 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
2826 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
2827 int mx= s->b_direct_mv_table[xy][0];
2828 int my= s->b_direct_mv_table[xy][1];
2830 backup_s.dquant = 0;
2831 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2833 ff_mpeg4_set_direct_mv(s, mx, my);
2834 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2835 &dmin, &next_block, mx, my);
2837 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
2838 backup_s.dquant = 0;
2839 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2841 ff_mpeg4_set_direct_mv(s, 0, 0);
2842 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
2843 &dmin, &next_block, 0, 0);
2845 if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
2848 coded |= s->block_last_index[i];
2851 memcpy(s->mv, best_s.mv, sizeof(s->mv));
2852 if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
2853 mx=my=0; //FIXME find the one we actually used
2854 ff_mpeg4_set_direct_mv(s, mx, my);
2855 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
2863 s->mv_dir= best_s.mv_dir;
2864 s->mv_type = best_s.mv_type;
2866 /* s->mv[0][0][0] = best_s.mv[0][0][0];
2867 s->mv[0][0][1] = best_s.mv[0][0][1];
2868 s->mv[1][0][0] = best_s.mv[1][0][0];
2869 s->mv[1][0][1] = best_s.mv[1][0][1];*/
2872 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
2873 &dmin, &next_block, mx, my);
2878 s->current_picture.qscale_table[xy] = best_s.qscale;
2880 copy_context_after_encode(s, &best_s, -1);
2882 pb_bits_count= put_bits_count(&s->pb);
2883 flush_put_bits(&s->pb);
2884 avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2887 if(s->data_partitioning){
2888 pb2_bits_count= put_bits_count(&s->pb2);
2889 flush_put_bits(&s->pb2);
2890 avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2891 s->pb2= backup_s.pb2;
2893 tex_pb_bits_count= put_bits_count(&s->tex_pb);
2894 flush_put_bits(&s->tex_pb);
2895 avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2896 s->tex_pb= backup_s.tex_pb;
2898 s->last_bits= put_bits_count(&s->pb);
2900 if (CONFIG_H263_ENCODER &&
2901 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
2902 ff_h263_update_motion_val(s);
2904 if(next_block==0){ //FIXME 16 vs linesize16
2905 s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
2906 s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
2907 s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
2910 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
2911 ff_MPV_decode_mb(s, s->block);
2913 int motion_x = 0, motion_y = 0;
2914 s->mv_type=MV_TYPE_16X16;
2915 // only one MB-Type possible
2918 case CANDIDATE_MB_TYPE_INTRA:
2921 motion_x= s->mv[0][0][0] = 0;
2922 motion_y= s->mv[0][0][1] = 0;
2924 case CANDIDATE_MB_TYPE_INTER:
2925 s->mv_dir = MV_DIR_FORWARD;
2927 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2928 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2930 case CANDIDATE_MB_TYPE_INTER_I:
2931 s->mv_dir = MV_DIR_FORWARD;
2932 s->mv_type = MV_TYPE_FIELD;
2935 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
2936 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
2937 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
2940 case CANDIDATE_MB_TYPE_INTER4V:
2941 s->mv_dir = MV_DIR_FORWARD;
2942 s->mv_type = MV_TYPE_8X8;
2945 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
2946 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
2949 case CANDIDATE_MB_TYPE_DIRECT:
2950 if (CONFIG_MPEG4_ENCODER) {
2951 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2953 motion_x=s->b_direct_mv_table[xy][0];
2954 motion_y=s->b_direct_mv_table[xy][1];
2955 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
2958 case CANDIDATE_MB_TYPE_DIRECT0:
2959 if (CONFIG_MPEG4_ENCODER) {
2960 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
2962 ff_mpeg4_set_direct_mv(s, 0, 0);
2965 case CANDIDATE_MB_TYPE_BIDIR:
2966 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2968 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2969 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2970 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2971 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2973 case CANDIDATE_MB_TYPE_BACKWARD:
2974 s->mv_dir = MV_DIR_BACKWARD;
2976 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2977 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2979 case CANDIDATE_MB_TYPE_FORWARD:
2980 s->mv_dir = MV_DIR_FORWARD;
2982 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2983 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2985 case CANDIDATE_MB_TYPE_FORWARD_I:
2986 s->mv_dir = MV_DIR_FORWARD;
2987 s->mv_type = MV_TYPE_FIELD;
2990 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
2991 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
2992 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
2995 case CANDIDATE_MB_TYPE_BACKWARD_I:
2996 s->mv_dir = MV_DIR_BACKWARD;
2997 s->mv_type = MV_TYPE_FIELD;
3000 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
3001 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3002 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3005 case CANDIDATE_MB_TYPE_BIDIR_I:
3006 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3007 s->mv_type = MV_TYPE_FIELD;
3009 for(dir=0; dir<2; dir++){
3011 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3012 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3013 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3018 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
3021 encode_mb(s, motion_x, motion_y);
3023 // RAL: Update last macroblock type
3024 s->last_mv_dir = s->mv_dir;
3026 if (CONFIG_H263_ENCODER &&
3027 s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
3028 ff_h263_update_motion_val(s);
3030 ff_MPV_decode_mb(s, s->block);
3033 /* clean the MV table in IPS frames for direct mode in B frames */
3034 if(s->mb_intra /* && I,P,S_TYPE */){
3035 s->p_mv_table[xy][0]=0;
3036 s->p_mv_table[xy][1]=0;
3039 if(s->flags&CODEC_FLAG_PSNR){
3043 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3044 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3046 s->current_picture.f.error[0] += sse(
3047 s, s->new_picture.f.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3048 s->dest[0], w, h, s->linesize);
3049 s->current_picture.f.error[1] += sse(
3050 s, s->new_picture.f.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3051 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3052 s->current_picture.f.error[2] += sse(
3053 s, s->new_picture.f.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
3054 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3057 if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
3058 ff_h263_loop_filter(s);
3060 av_dlog(s->avctx, "MB %d %d bits\n",
3061 s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
3065 //not beautiful here but we must write it before flushing so it has to be here
3066 if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3067 ff_msmpeg4_encode_ext_header(s);
3071 /* Send the last GOB if RTP */
3072 if (s->avctx->rtp_callback) {
3073 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3074 pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
3075 /* Call the RTP callback to send the last GOB */
3077 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
3083 #define MERGE(field) dst->field += src->field; src->field=0
3084 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
3085 MERGE(me.scene_change_score);
3086 MERGE(me.mc_mb_var_sum_temp);
3087 MERGE(me.mb_var_sum_temp);
3090 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
3093 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3094 MERGE(dct_count[1]);
3103 MERGE(er.error_count);
3104 MERGE(padding_bug_score);
3105 MERGE(current_picture.f.error[0]);
3106 MERGE(current_picture.f.error[1]);
3107 MERGE(current_picture.f.error[2]);
3109 if(dst->avctx->noise_reduction){
3110 for(i=0; i<64; i++){
3111 MERGE(dct_error_sum[0][i]);
3112 MERGE(dct_error_sum[1][i]);
3116 assert(put_bits_count(&src->pb) % 8 ==0);
3117 assert(put_bits_count(&dst->pb) % 8 ==0);
3118 avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3119 flush_put_bits(&dst->pb);
3122 static int estimate_qp(MpegEncContext *s, int dry_run){
3123 if (s->next_lambda){
3124 s->current_picture_ptr->f.quality =
3125 s->current_picture.f.quality = s->next_lambda;
3126 if(!dry_run) s->next_lambda= 0;
3127 } else if (!s->fixed_qscale) {
3128 s->current_picture_ptr->f.quality =
3129 s->current_picture.f.quality = ff_rate_estimate_qscale(s, dry_run);
3130 if (s->current_picture.f.quality < 0)
3134 if(s->adaptive_quant){
3135 switch(s->codec_id){
3136 case AV_CODEC_ID_MPEG4:
3137 if (CONFIG_MPEG4_ENCODER)
3138 ff_clean_mpeg4_qscales(s);
3140 case AV_CODEC_ID_H263:
3141 case AV_CODEC_ID_H263P:
3142 case AV_CODEC_ID_FLV1:
3143 if (CONFIG_H263_ENCODER)
3144 ff_clean_h263_qscales(s);
3147 ff_init_qscale_tab(s);
3150 s->lambda= s->lambda_table[0];
3153 s->lambda = s->current_picture.f.quality;
3158 /* must be called before writing the header */
3159 static void set_frame_distances(MpegEncContext * s){
3160 assert(s->current_picture_ptr->f.pts != AV_NOPTS_VALUE);
3161 s->time = s->current_picture_ptr->f.pts * s->avctx->time_base.num;
3163 if(s->pict_type==AV_PICTURE_TYPE_B){
3164 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
3165 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
3167 s->pp_time= s->time - s->last_non_b_time;
3168 s->last_non_b_time= s->time;
3169 assert(s->picture_number==0 || s->pp_time > 0);
3173 static int encode_picture(MpegEncContext *s, int picture_number)
3177 int context_count = s->slice_context_count;
3179 s->picture_number = picture_number;
3181 /* Reset the average MB variance */
3182 s->me.mb_var_sum_temp =
3183 s->me.mc_mb_var_sum_temp = 0;
3185 /* we need to initialize some time vars before we can encode b-frames */
3186 // RAL: Condition added for MPEG1VIDEO
3187 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3188 set_frame_distances(s);
3189 if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3190 ff_set_mpeg4_time(s);
3192 s->me.scene_change_score=0;
3194 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3196 if(s->pict_type==AV_PICTURE_TYPE_I){
3197 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3198 else s->no_rounding=0;
3199 }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3200 if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
3201 s->no_rounding ^= 1;
3204 if(s->flags & CODEC_FLAG_PASS2){
3205 if (estimate_qp(s,1) < 0)
3207 ff_get_2pass_fcode(s);
3208 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3209 if(s->pict_type==AV_PICTURE_TYPE_B)
3210 s->lambda= s->last_lambda_for[s->pict_type];
3212 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
3216 if(s->codec_id != AV_CODEC_ID_AMV){
3217 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
3218 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
3219 s->q_chroma_intra_matrix = s->q_intra_matrix;
3220 s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
3223 s->mb_intra=0; //for the rate distortion & bit compare functions
3224 for(i=1; i<context_count; i++){
3225 ret = ff_update_duplicate_context(s->thread_context[i], s);
3233 /* Estimate motion for every MB */
3234 if(s->pict_type != AV_PICTURE_TYPE_I){
3235 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
3236 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3237 if (s->pict_type != AV_PICTURE_TYPE_B) {
3238 if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3239 s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3243 s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3244 }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
3246 for(i=0; i<s->mb_stride*s->mb_height; i++)
3247 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3249 if(!s->fixed_qscale){
3250 /* finding spatial complexity for I-frame rate control */
3251 s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3254 for(i=1; i<context_count; i++){
3255 merge_context_after_me(s, s->thread_context[i]);
3257 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
3258 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
3261 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
3262 s->pict_type= AV_PICTURE_TYPE_I;
3263 for(i=0; i<s->mb_stride*s->mb_height; i++)
3264 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3265 if(s->msmpeg4_version >= 3)
3267 av_dlog(s, "Scene change detected, encoding as I Frame %d %d\n",
3268 s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3272 if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
3273 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3275 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3277 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3278 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3279 s->f_code= FFMAX3(s->f_code, a, b);
3282 ff_fix_long_p_mvs(s);
3283 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3284 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3288 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3289 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3294 if(s->pict_type==AV_PICTURE_TYPE_B){
3297 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3298 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3299 s->f_code = FFMAX(a, b);
3301 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3302 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3303 s->b_code = FFMAX(a, b);
3305 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3306 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3307 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3308 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3309 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3311 for(dir=0; dir<2; dir++){
3314 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3315 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3316 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3317 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3325 if (estimate_qp(s, 0) < 0)
3328 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
3329 s->qscale= 3; //reduce clipping problems
3331 if (s->out_format == FMT_MJPEG) {
3332 /* for mjpeg, we do include qscale in the matrix */
3334 int j= s->dsp.idct_permutation[i];
3336 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3338 s->y_dc_scale_table=
3339 s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3340 s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3341 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3342 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3345 if(s->codec_id == AV_CODEC_ID_AMV){
3346 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};
3347 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};
3349 int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];
3351 s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
3352 s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
3354 s->y_dc_scale_table= y;
3355 s->c_dc_scale_table= c;
3356 s->intra_matrix[0] = 13;
3357 s->chroma_intra_matrix[0] = 14;
3358 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
3359 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3360 ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3361 s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3365 //FIXME var duplication
3366 s->current_picture_ptr->f.key_frame =
3367 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
3368 s->current_picture_ptr->f.pict_type =
3369 s->current_picture.f.pict_type = s->pict_type;
3371 if (s->current_picture.f.key_frame)
3372 s->picture_in_gop_number=0;
3374 s->mb_x = s->mb_y = 0;
3375 s->last_bits= put_bits_count(&s->pb);
3376 switch(s->out_format) {
3378 if (CONFIG_MJPEG_ENCODER)
3379 ff_mjpeg_encode_picture_header(s);
3382 if (CONFIG_H261_ENCODER)
3383 ff_h261_encode_picture_header(s, picture_number);
3386 if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
3387 ff_wmv2_encode_picture_header(s, picture_number);
3388 else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3389 ff_msmpeg4_encode_picture_header(s, picture_number);
3390 else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3391 ff_mpeg4_encode_picture_header(s, picture_number);
3392 else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3393 ff_rv10_encode_picture_header(s, picture_number);
3394 else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3395 ff_rv20_encode_picture_header(s, picture_number);
3396 else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
3397 ff_flv_encode_picture_header(s, picture_number);
3398 else if (CONFIG_H263_ENCODER)
3399 ff_h263_encode_picture_header(s, picture_number);
3402 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3403 ff_mpeg1_encode_picture_header(s, picture_number);
3408 bits= put_bits_count(&s->pb);
3409 s->header_bits= bits - s->last_bits;
3411 for(i=1; i<context_count; i++){
3412 update_duplicate_context_after_me(s->thread_context[i], s);
3414 s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3415 for(i=1; i<context_count; i++){
3416 merge_context_after_encode(s, s->thread_context[i]);
3422 static void denoise_dct_c(MpegEncContext *s, int16_t *block){
3423 const int intra= s->mb_intra;
3426 s->dct_count[intra]++;
3428 for(i=0; i<64; i++){
3429 int level= block[i];
3433 s->dct_error_sum[intra][i] += level;
3434 level -= s->dct_offset[intra][i];
3435 if(level<0) level=0;
3437 s->dct_error_sum[intra][i] -= level;
3438 level += s->dct_offset[intra][i];
3439 if(level>0) level=0;
3446 static int dct_quantize_trellis_c(MpegEncContext *s,
3447 int16_t *block, int n,
3448 int qscale, int *overflow){
3450 const uint8_t *scantable= s->intra_scantable.scantable;
3451 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3453 unsigned int threshold1, threshold2;
3465 int coeff_count[64];
3466 int qmul, qadd, start_i, last_non_zero, i, dc;
3467 const int esc_length= s->ac_esc_length;
3469 uint8_t * last_length;
3470 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3472 s->dsp.fdct (block);
3474 if(s->dct_error_sum)
3475 s->denoise_dct(s, block);
3477 qadd= ((qscale-1)|1)*8;
3488 /* For AIC we skip quant/dequant of INTRADC */
3493 /* note: block[0] is assumed to be positive */
3494 block[0] = (block[0] + (q >> 1)) / q;
3497 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3498 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3499 bias= 1<<(QMAT_SHIFT-1);
3500 length = s->intra_ac_vlc_length;
3501 last_length= s->intra_ac_vlc_last_length;
3505 qmat = s->q_inter_matrix[qscale];
3506 length = s->inter_ac_vlc_length;
3507 last_length= s->inter_ac_vlc_last_length;
3511 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3512 threshold2= (threshold1<<1);
3514 for(i=63; i>=start_i; i--) {
3515 const int j = scantable[i];
3516 int level = block[j] * qmat[j];
3518 if(((unsigned)(level+threshold1))>threshold2){
3524 for(i=start_i; i<=last_non_zero; i++) {
3525 const int j = scantable[i];
3526 int level = block[j] * qmat[j];
3528 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3529 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3530 if(((unsigned)(level+threshold1))>threshold2){
3532 level= (bias + level)>>QMAT_SHIFT;
3534 coeff[1][i]= level-1;
3535 // coeff[2][k]= level-2;
3537 level= (bias - level)>>QMAT_SHIFT;
3538 coeff[0][i]= -level;
3539 coeff[1][i]= -level+1;
3540 // coeff[2][k]= -level+2;
3542 coeff_count[i]= FFMIN(level, 2);
3543 av_assert2(coeff_count[i]);
3546 coeff[0][i]= (level>>31)|1;
3551 *overflow= s->max_qcoeff < max; //overflow might have happened
3553 if(last_non_zero < start_i){
3554 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3555 return last_non_zero;
3558 score_tab[start_i]= 0;
3559 survivor[0]= start_i;
3562 for(i=start_i; i<=last_non_zero; i++){
3563 int level_index, j, zero_distortion;
3564 int dct_coeff= FFABS(block[ scantable[i] ]);
3565 int best_score=256*256*256*120;
3567 if (s->dsp.fdct == ff_fdct_ifast)
3568 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
3569 zero_distortion= dct_coeff*dct_coeff;
3571 for(level_index=0; level_index < coeff_count[i]; level_index++){
3573 int level= coeff[level_index][i];
3574 const int alevel= FFABS(level);
3579 if(s->out_format == FMT_H263){
3580 unquant_coeff= alevel*qmul + qadd;
3582 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3584 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
3585 unquant_coeff = (unquant_coeff - 1) | 1;
3587 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
3588 unquant_coeff = (unquant_coeff - 1) | 1;
3593 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3595 if((level&(~127)) == 0){
3596 for(j=survivor_count-1; j>=0; j--){
3597 int run= i - survivor[j];
3598 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3599 score += score_tab[i-run];
3601 if(score < best_score){
3604 level_tab[i+1]= level-64;
3608 if(s->out_format == FMT_H263){
3609 for(j=survivor_count-1; j>=0; j--){
3610 int run= i - survivor[j];
3611 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
3612 score += score_tab[i-run];
3613 if(score < last_score){
3616 last_level= level-64;
3622 distortion += esc_length*lambda;
3623 for(j=survivor_count-1; j>=0; j--){
3624 int run= i - survivor[j];
3625 int score= distortion + score_tab[i-run];
3627 if(score < best_score){
3630 level_tab[i+1]= level-64;
3634 if(s->out_format == FMT_H263){
3635 for(j=survivor_count-1; j>=0; j--){
3636 int run= i - survivor[j];
3637 int score= distortion + score_tab[i-run];
3638 if(score < last_score){
3641 last_level= level-64;
3649 score_tab[i+1]= best_score;
3651 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
3652 if(last_non_zero <= 27){
3653 for(; survivor_count; survivor_count--){
3654 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
3658 for(; survivor_count; survivor_count--){
3659 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
3664 survivor[ survivor_count++ ]= i+1;
3667 if(s->out_format != FMT_H263){
3668 last_score= 256*256*256*120;
3669 for(i= survivor[0]; i<=last_non_zero + 1; i++){
3670 int score= score_tab[i];
3671 if(i) score += lambda*2; //FIXME exacter?
3673 if(score < last_score){
3676 last_level= level_tab[i];
3677 last_run= run_tab[i];
3682 s->coded_score[n] = last_score;
3684 dc= FFABS(block[0]);
3685 last_non_zero= last_i - 1;
3686 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
3688 if(last_non_zero < start_i)
3689 return last_non_zero;
3691 if(last_non_zero == 0 && start_i == 0){
3693 int best_score= dc * dc;
3695 for(i=0; i<coeff_count[0]; i++){
3696 int level= coeff[i][0];
3697 int alevel= FFABS(level);
3698 int unquant_coeff, score, distortion;
3700 if(s->out_format == FMT_H263){
3701 unquant_coeff= (alevel*qmul + qadd)>>3;
3703 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
3704 unquant_coeff = (unquant_coeff - 1) | 1;
3706 unquant_coeff = (unquant_coeff + 4) >> 3;
3707 unquant_coeff<<= 3 + 3;
3709 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
3711 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
3712 else score= distortion + esc_length*lambda;
3714 if(score < best_score){
3716 best_level= level - 64;
3719 block[0]= best_level;
3720 s->coded_score[n] = best_score - dc*dc;
3721 if(best_level == 0) return -1;
3722 else return last_non_zero;
3726 av_assert2(last_level);
3728 block[ perm_scantable[last_non_zero] ]= last_level;
3731 for(; i>start_i; i -= run_tab[i] + 1){
3732 block[ perm_scantable[i-1] ]= level_tab[i];
3735 return last_non_zero;
3738 //#define REFINE_STATS 1
3739 static int16_t basis[64][64];
3741 static void build_basis(uint8_t *perm){
3748 double s= 0.25*(1<<BASIS_SHIFT);
3750 int perm_index= perm[index];
3751 if(i==0) s*= sqrt(0.5);
3752 if(j==0) s*= sqrt(0.5);
3753 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)));
3760 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
3761 int16_t *block, int16_t *weight, int16_t *orig,
3764 LOCAL_ALIGNED_16(int16_t, d1, [64]);
3765 const uint8_t *scantable= s->intra_scantable.scantable;
3766 const uint8_t *perm_scantable= s->intra_scantable.permutated;
3767 // unsigned int threshold1, threshold2;
3772 int qmul, qadd, start_i, last_non_zero, i, dc;
3774 uint8_t * last_length;
3776 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
3779 static int after_last=0;
3780 static int to_zero=0;
3781 static int from_zero=0;
3784 static int messed_sign=0;
3787 if(basis[0][0] == 0)
3788 build_basis(s->dsp.idct_permutation);
3799 /* For AIC we skip quant/dequant of INTRADC */
3803 q <<= RECON_SHIFT-3;
3804 /* note: block[0] is assumed to be positive */
3806 // block[0] = (block[0] + (q >> 1)) / q;
3808 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
3809 // bias= 1<<(QMAT_SHIFT-1);
3810 length = s->intra_ac_vlc_length;
3811 last_length= s->intra_ac_vlc_last_length;
3815 length = s->inter_ac_vlc_length;
3816 last_length= s->inter_ac_vlc_last_length;
3818 last_non_zero = s->block_last_index[n];
3823 dc += (1<<(RECON_SHIFT-1));
3824 for(i=0; i<64; i++){
3825 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
3828 STOP_TIMER("memset rem[]")}
3831 for(i=0; i<64; i++){
3836 w= FFABS(weight[i]) + qns*one;
3837 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
3840 // w=weight[i] = (63*qns + (w/2)) / w;
3843 av_assert2(w<(1<<6));
3846 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
3852 for(i=start_i; i<=last_non_zero; i++){
3853 int j= perm_scantable[i];
3854 const int level= block[j];
3858 if(level<0) coeff= qmul*level - qadd;
3859 else coeff= qmul*level + qadd;
3860 run_tab[rle_index++]=run;
3863 s->dsp.add_8x8basis(rem, basis[j], coeff);
3869 if(last_non_zero>0){
3870 STOP_TIMER("init rem[]")
3877 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
3880 int run2, best_unquant_change=0, analyze_gradient;
3884 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
3886 if(analyze_gradient){
3890 for(i=0; i<64; i++){
3893 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
3896 STOP_TIMER("rem*w*w")}
3906 const int level= block[0];
3907 int change, old_coeff;
3909 av_assert2(s->mb_intra);
3913 for(change=-1; change<=1; change+=2){
3914 int new_level= level + change;
3915 int score, new_coeff;
3917 new_coeff= q*new_level;
3918 if(new_coeff >= 2048 || new_coeff < 0)
3921 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
3922 if(score<best_score){
3925 best_change= change;
3926 best_unquant_change= new_coeff - old_coeff;
3933 run2= run_tab[rle_index++];
3937 for(i=start_i; i<64; i++){
3938 int j= perm_scantable[i];
3939 const int level= block[j];
3940 int change, old_coeff;
3942 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
3946 if(level<0) old_coeff= qmul*level - qadd;
3947 else old_coeff= qmul*level + qadd;
3948 run2= run_tab[rle_index++]; //FIXME ! maybe after last
3952 av_assert2(run2>=0 || i >= last_non_zero );
3955 for(change=-1; change<=1; change+=2){
3956 int new_level= level + change;
3957 int score, new_coeff, unquant_change;
3960 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
3964 if(new_level<0) new_coeff= qmul*new_level - qadd;
3965 else new_coeff= qmul*new_level + qadd;
3966 if(new_coeff >= 2048 || new_coeff <= -2048)
3968 //FIXME check for overflow
3971 if(level < 63 && level > -63){
3972 if(i < last_non_zero)
3973 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
3974 - length[UNI_AC_ENC_INDEX(run, level+64)];
3976 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
3977 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
3980 av_assert2(FFABS(new_level)==1);
3982 if(analyze_gradient){
3983 int g= d1[ scantable[i] ];
3984 if(g && (g^new_level) >= 0)
3988 if(i < last_non_zero){
3989 int next_i= i + run2 + 1;
3990 int next_level= block[ perm_scantable[next_i] ] + 64;
3992 if(next_level&(~127))
3995 if(next_i < last_non_zero)
3996 score += length[UNI_AC_ENC_INDEX(run, 65)]
3997 + length[UNI_AC_ENC_INDEX(run2, next_level)]
3998 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4000 score += length[UNI_AC_ENC_INDEX(run, 65)]
4001 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4002 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4004 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4006 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4007 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4013 av_assert2(FFABS(level)==1);
4015 if(i < last_non_zero){
4016 int next_i= i + run2 + 1;
4017 int next_level= block[ perm_scantable[next_i] ] + 64;
4019 if(next_level&(~127))
4022 if(next_i < last_non_zero)
4023 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4024 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4025 - length[UNI_AC_ENC_INDEX(run, 65)];
4027 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4028 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4029 - length[UNI_AC_ENC_INDEX(run, 65)];
4031 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4033 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4034 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4041 unquant_change= new_coeff - old_coeff;
4042 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4044 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
4045 if(score<best_score){
4048 best_change= change;
4049 best_unquant_change= unquant_change;
4053 prev_level= level + 64;
4054 if(prev_level&(~127))
4063 STOP_TIMER("iterative step")}
4067 int j= perm_scantable[ best_coeff ];
4069 block[j] += best_change;
4071 if(best_coeff > last_non_zero){
4072 last_non_zero= best_coeff;
4073 av_assert2(block[j]);
4080 if(block[j] - best_change){
4081 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
4093 for(; last_non_zero>=start_i; last_non_zero--){
4094 if(block[perm_scantable[last_non_zero]])
4100 if(256*256*256*64 % count == 0){
4101 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);
4106 for(i=start_i; i<=last_non_zero; i++){
4107 int j= perm_scantable[i];
4108 const int level= block[j];
4111 run_tab[rle_index++]=run;
4118 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
4124 if(last_non_zero>0){
4125 STOP_TIMER("iterative search")
4130 return last_non_zero;
4133 int ff_dct_quantize_c(MpegEncContext *s,
4134 int16_t *block, int n,
4135 int qscale, int *overflow)
4137 int i, j, level, last_non_zero, q, start_i;
4139 const uint8_t *scantable= s->intra_scantable.scantable;
4142 unsigned int threshold1, threshold2;
4144 s->dsp.fdct (block);
4146 if(s->dct_error_sum)
4147 s->denoise_dct(s, block);
4157 /* For AIC we skip quant/dequant of INTRADC */
4160 /* note: block[0] is assumed to be positive */
4161 block[0] = (block[0] + (q >> 1)) / q;
4164 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4165 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4169 qmat = s->q_inter_matrix[qscale];
4170 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4172 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4173 threshold2= (threshold1<<1);
4174 for(i=63;i>=start_i;i--) {
4176 level = block[j] * qmat[j];
4178 if(((unsigned)(level+threshold1))>threshold2){
4185 for(i=start_i; i<=last_non_zero; i++) {
4187 level = block[j] * qmat[j];
4189 // if( bias+level >= (1<<QMAT_SHIFT)
4190 // || bias-level >= (1<<QMAT_SHIFT)){
4191 if(((unsigned)(level+threshold1))>threshold2){
4193 level= (bias + level)>>QMAT_SHIFT;
4196 level= (bias - level)>>QMAT_SHIFT;
4204 *overflow= s->max_qcoeff < max; //overflow might have happened
4206 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4207 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4208 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4210 return last_non_zero;
4213 #define OFFSET(x) offsetof(MpegEncContext, x)
4214 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4215 static const AVOption h263_options[] = {
4216 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4217 { "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},
4218 { "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 },
4223 static const AVClass h263_class = {
4224 .class_name = "H.263 encoder",
4225 .item_name = av_default_item_name,
4226 .option = h263_options,
4227 .version = LIBAVUTIL_VERSION_INT,
4230 AVCodec ff_h263_encoder = {
4232 .type = AVMEDIA_TYPE_VIDEO,
4233 .id = AV_CODEC_ID_H263,
4234 .priv_data_size = sizeof(MpegEncContext),
4235 .init = ff_MPV_encode_init,
4236 .encode2 = ff_MPV_encode_picture,
4237 .close = ff_MPV_encode_end,
4238 .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4239 .long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4240 .priv_class = &h263_class,
4243 static const AVOption h263p_options[] = {
4244 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4245 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4246 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
4247 { "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},
4251 static const AVClass h263p_class = {
4252 .class_name = "H.263p encoder",
4253 .item_name = av_default_item_name,
4254 .option = h263p_options,
4255 .version = LIBAVUTIL_VERSION_INT,
4258 AVCodec ff_h263p_encoder = {
4260 .type = AVMEDIA_TYPE_VIDEO,
4261 .id = AV_CODEC_ID_H263P,
4262 .priv_data_size = sizeof(MpegEncContext),
4263 .init = ff_MPV_encode_init,
4264 .encode2 = ff_MPV_encode_picture,
4265 .close = ff_MPV_encode_end,
4266 .capabilities = CODEC_CAP_SLICE_THREADS,
4267 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4268 .long_name = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4269 .priv_class = &h263p_class,
4272 FF_MPV_GENERIC_CLASS(msmpeg4v2)
4274 AVCodec ff_msmpeg4v2_encoder = {
4275 .name = "msmpeg4v2",
4276 .type = AVMEDIA_TYPE_VIDEO,
4277 .id = AV_CODEC_ID_MSMPEG4V2,
4278 .priv_data_size = sizeof(MpegEncContext),
4279 .init = ff_MPV_encode_init,
4280 .encode2 = ff_MPV_encode_picture,
4281 .close = ff_MPV_encode_end,
4282 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4283 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4284 .priv_class = &msmpeg4v2_class,
4287 FF_MPV_GENERIC_CLASS(msmpeg4v3)
4289 AVCodec ff_msmpeg4v3_encoder = {
4291 .type = AVMEDIA_TYPE_VIDEO,
4292 .id = AV_CODEC_ID_MSMPEG4V3,
4293 .priv_data_size = sizeof(MpegEncContext),
4294 .init = ff_MPV_encode_init,
4295 .encode2 = ff_MPV_encode_picture,
4296 .close = ff_MPV_encode_end,
4297 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4298 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4299 .priv_class = &msmpeg4v3_class,
4302 FF_MPV_GENERIC_CLASS(wmv1)
4304 AVCodec ff_wmv1_encoder = {
4306 .type = AVMEDIA_TYPE_VIDEO,
4307 .id = AV_CODEC_ID_WMV1,
4308 .priv_data_size = sizeof(MpegEncContext),
4309 .init = ff_MPV_encode_init,
4310 .encode2 = ff_MPV_encode_picture,
4311 .close = ff_MPV_encode_end,
4312 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4313 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4314 .priv_class = &wmv1_class,