FFmpeg
Loading...
Searching...
No Matches
mpegvideo_enc.c
Go to the documentation of this file.
1/*
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>
5 *
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
7 *
8 * This file is part of FFmpeg.
9 *
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.
14 *
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.
19 *
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
23 */
24
25/*
26 * non linear quantizers with large QPs and VBV with restrictive qmin fixes sponsored by NOA GmbH
27 */
28
29/**
30 * @file
31 * The simplest mpeg encoder (well, it was the simplest!).
32 */
33
34#include "config_components.h"
35
36#include <assert.h>
37#include <stdint.h>
38
40#include "libavutil/emms.h"
41#include "libavutil/internal.h"
42#include "libavutil/intmath.h"
44#include "libavutil/mem.h"
46#include "libavutil/opt.h"
47#include "libavutil/thread.h"
48#include "avcodec.h"
49#include "encode.h"
50#include "idctdsp.h"
51#include "mpeg12data.h"
52#include "mpeg12enc.h"
53#include "mpegvideo.h"
54#include "mpegvideodata.h"
55#include "mpegvideoenc.h"
56#include "h261enc.h"
57#include "h263.h"
58#include "h263data.h"
59#include "h263enc.h"
60#include "mjpegenc_common.h"
61#include "mathops.h"
62#include "mpegutils.h"
64#include "mjpegenc.h"
65#include "speedhqenc.h"
66#include "msmpeg4enc.h"
67#include "pixblockdsp.h"
68#include "qpeldsp.h"
69#include "faandct.h"
70#include "aandcttab.h"
71#include "mpeg4video.h"
72#include "mpeg4videodata.h"
73#include "mpeg4videoenc.h"
74#include "internal.h"
75#include "bytestream.h"
76#include "rv20enc.h"
77#include "libavutil/refstruct.h"
78#include <limits.h>
79#include "sp5x.h"
80
81#define QUANT_BIAS_SHIFT 8
82
83#define QMAT_SHIFT_MMX 16
84#define QMAT_SHIFT 21
85
86static int encode_picture(MPVMainEncContext *const s, const AVPacket *pkt);
87static int dct_quantize_refine(MPVEncContext *const s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
88static int sse_mb(MPVEncContext *const s);
89static int dct_quantize_c(MPVEncContext *const s,
90 int16_t *block, int n,
91 int qscale, int *overflow);
92static int dct_quantize_trellis_c(MPVEncContext *const s, int16_t *block, int n, int qscale, int *overflow);
93
94static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
95
101
103 .class_name = "generic mpegvideo encoder",
104 .item_name = av_default_item_name,
105 .option = mpv_generic_options,
106 .version = LIBAVUTIL_VERSION_INT,
107};
108
109void ff_convert_matrix(MPVEncContext *const s, int (*qmat)[64],
110 uint16_t (*qmat16)[2][64],
111 const uint16_t *quant_matrix,
112 int bias, int qmin, int qmax, int intra)
113{
114 FDCTDSPContext *fdsp = &s->fdsp;
115 int qscale;
116 int shift = 0;
117
118 for (qscale = qmin; qscale <= qmax; qscale++) {
119 int i;
120 int qscale2;
121
122 if (s->c.q_scale_type) qscale2 = ff_mpeg2_non_linear_qscale[qscale];
123 else qscale2 = qscale << 1;
124
125 if (fdsp->fdct == ff_jpeg_fdct_islow_8 ||
126#if CONFIG_FAANDCT
127 fdsp->fdct == ff_faandct ||
128#endif /* CONFIG_FAANDCT */
129 fdsp->fdct == ff_jpeg_fdct_islow_10) {
130 for (i = 0; i < 64; i++) {
131 const int j = s->c.idsp.idct_permutation[i];
132 int64_t den = (int64_t) qscale2 * quant_matrix[j];
133 /* 1 * 1 <= qscale2 * quant_matrix[j] <= 112 * 255
134 * Assume x = qscale2 * quant_matrix[j]
135 * 1 <= x <= 28560
136 * (1 << 22) / 1 >= (1 << 22) / (x) >= (1 << 22) / 28560
137 * 4194304 >= (1 << 22) / (x) >= 146 */
138
139 qmat[qscale][i] = (int)((UINT64_C(2) << QMAT_SHIFT) / den);
140 }
141 } else if (fdsp->fdct == ff_fdct_ifast) {
142 for (i = 0; i < 64; i++) {
143 const int j = s->c.idsp.idct_permutation[i];
144 int64_t den = ff_aanscales[i] * (int64_t) qscale2 * quant_matrix[j];
145 /* 1247 * 1 * 1 <= ff_aanscales[i] * qscale2 * quant_matrix[j] <= 31521 * 112 * 255
146 * Assume x = ff_aanscales[i] * qscale2 * quant_matrix[j]
147 * 1247 <= x <= 900239760
148 * (1 << 36) / 1247 >= (1 << 36) / (x) >= (1 << 36) / 900239760
149 * 55107840 >= (1 << 36) / (x) >= 76 */
150
151 qmat[qscale][i] = (int)((UINT64_C(2) << (QMAT_SHIFT + 14)) / den);
152 }
153 } else {
154 for (i = 0; i < 64; i++) {
155 const int j = s->c.idsp.idct_permutation[i];
156 int64_t den = (int64_t) qscale2 * quant_matrix[j];
157 /* 1 * 1 <= qscale2 * quant_matrix[j] <= 112 * 255
158 * Assume x = qscale2 * quant_matrix[j]
159 * 1 <= x <= 28560
160 * (1 << 22) / 1 >= (1 << 22) / (x) >= (1 << 22) / 28560
161 * 4194304 >= (1 << 22) / (x) >= 146
162 *
163 * 1 <= x <= 28560
164 * (1 << 17) / 1 >= (1 << 17) / (x) >= (1 << 17) / 28560
165 * 131072 >= (1 << 17) / (x) >= 4 */
166
167 qmat[qscale][i] = (int)((UINT64_C(2) << QMAT_SHIFT) / den);
168 qmat16[qscale][0][i] = (2 << QMAT_SHIFT_MMX) / den;
169
170 if (qmat16[qscale][0][i] == 0 ||
171 qmat16[qscale][0][i] == 128 * 256)
172 qmat16[qscale][0][i] = 128 * 256 - 1;
173 qmat16[qscale][1][i] =
174 ROUNDED_DIV(bias * (1<<(16 - QUANT_BIAS_SHIFT)),
175 qmat16[qscale][0][i]);
176 }
177 }
178
179 for (i = intra; i < 64; i++) {
180 int64_t max = 8191;
181 if (fdsp->fdct == ff_fdct_ifast) {
182 max = (8191LL * ff_aanscales[i]) >> 14;
183 }
184 while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
185 shift++;
186 }
187 }
188 }
189 if (shift) {
190 av_log(s->c.avctx, AV_LOG_INFO,
191 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
192 QMAT_SHIFT - shift);
193 }
194}
195
196static inline void update_qscale(MPVMainEncContext *const m)
197{
198 MPVEncContext *const s = &m->s;
199
200 if (s->c.q_scale_type == 1 && 0) {
201 int i;
202 int bestdiff=INT_MAX;
203 int best = 1;
204
206 int diff = FFABS((ff_mpeg2_non_linear_qscale[i]<<(FF_LAMBDA_SHIFT + 6)) - (int)s->lambda * 139);
207 if (ff_mpeg2_non_linear_qscale[i] < s->c.avctx->qmin ||
208 (ff_mpeg2_non_linear_qscale[i] > s->c.avctx->qmax && !m->vbv_ignore_qmax))
209 continue;
210 if (diff < bestdiff) {
211 bestdiff = diff;
212 best = i;
213 }
214 }
215 s->c.qscale = best;
216 } else {
217 s->c.qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
218 (FF_LAMBDA_SHIFT + 7);
219 s->c.qscale = av_clip(s->c.qscale, s->c.avctx->qmin, m->vbv_ignore_qmax ? 31 : s->c.avctx->qmax);
220 }
221
222 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
224}
225
227{
228 int i;
229
230 if (matrix) {
231 put_bits(pb, 1, 1);
232 for (i = 0; i < 64; i++) {
234 }
235 } else
236 put_bits(pb, 1, 0);
237}
238
239/**
240 * init s->c.cur_pic.qscale_table from s->lambda_table
241 */
242static void init_qscale_tab(MPVEncContext *const s)
243{
244 int8_t *const qscale_table = s->c.cur_pic.qscale_table;
245
246 for (int i = 0; i < s->c.mb_num; i++) {
247 unsigned int lam = s->lambda_table[s->c.mb_index2xy[i]];
248 int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
249 qscale_table[s->c.mb_index2xy[i]] = av_clip(qp, s->c.avctx->qmin,
250 s->c.avctx->qmax);
251 }
252}
253
255 const MPVEncContext *const src)
256{
257#define COPY(a) dst->a = src->a
258 COPY(c.pict_type);
259 COPY(f_code);
260 COPY(b_code);
261 COPY(c.qscale);
262 COPY(lambda);
263 COPY(lambda2);
264 COPY(c.frame_pred_frame_dct); // FIXME don't set in encode_header
265 COPY(c.progressive_frame); // FIXME don't set in encode_header
266 COPY(partitioned_frame); // FIXME don't set in encode_header
267#undef COPY
268}
269
271{
272 for (int i = -16; i < 16; i++)
274}
275
276/**
277 * Set the given MPVEncContext to defaults for encoding.
278 */
280{
281 MPVEncContext *const s = &m->s;
282 static AVOnce init_static_once = AV_ONCE_INIT;
283
285
286 s->f_code = 1;
287 s->b_code = 1;
288
289 if (!m->fcode_tab) {
291 ff_thread_once(&init_static_once, mpv_encode_init_static);
292 }
293 if (!s->c.y_dc_scale_table) {
294 s->c.y_dc_scale_table =
295 s->c.c_dc_scale_table = ff_mpeg1_dc_scale_table;
296 }
297}
298
300{
301 s->dct_quantize = dct_quantize_c;
302
303#if ARCH_X86
305#endif
306
307 if (s->c.avctx->trellis)
308 s->dct_quantize = dct_quantize_trellis_c;
309}
310
312{
313 MpegEncContext *const s = &s2->c;
314 MPVUnquantDSPContext unquant_dsp_ctx;
315
316 ff_mpv_unquantize_init(&unquant_dsp_ctx,
317 avctx->flags & AV_CODEC_FLAG_BITEXACT, s->q_scale_type);
318
319 if (s2->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
320 s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra;
321 s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter;
322 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
323 s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra;
324 s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter;
325 } else {
326 s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg1_intra;
327 s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg1_inter;
328 }
329}
330
332{
333 MPVEncContext *const s = &m->s;
334 MECmpContext mecc;
335 me_cmp_func me_cmp[6];
336 int ret;
337
338 ff_me_cmp_init(&mecc, avctx);
339 ret = ff_me_init(&s->me, avctx, &mecc, 1);
340 if (ret < 0)
341 return ret;
342 ret = ff_set_cmp(&mecc, me_cmp, m->frame_skip_cmp, 1);
343 if (ret < 0)
344 return ret;
345 m->frame_skip_cmp_fn = me_cmp[1];
346 if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
347 ret = ff_set_cmp(&mecc, me_cmp, avctx->ildct_cmp, 1);
348 if (ret < 0)
349 return ret;
350 if (!me_cmp[0] || !me_cmp[4])
351 return AVERROR(EINVAL);
352 s->ildct_cmp[0] = me_cmp[0];
353 s->ildct_cmp[1] = me_cmp[4];
354 }
355
356 s->sum_abs_dctelem = mecc.sum_abs_dctelem;
357
358 s->sse_cmp[0] = mecc.sse[0];
359 s->sse_cmp[1] = mecc.sse[1];
360 s->sad_cmp[0] = mecc.sad[0];
361 s->sad_cmp[1] = mecc.sad[1];
362 if (avctx->mb_cmp == FF_CMP_NSSE) {
363 s->n_sse_cmp[0] = mecc.nsse[0];
364 s->n_sse_cmp[1] = mecc.nsse[1];
365 } else {
366 s->n_sse_cmp[0] = mecc.sse[0];
367 s->n_sse_cmp[1] = mecc.sse[1];
368 }
369
370 return 0;
371}
372
373#define ALLOCZ_ARRAYS(p, mult, numb) ((p) = av_calloc(numb, mult * sizeof(*(p))))
375{
376 MPVEncContext *const s = &m->s;
377 const int nb_matrices = 1 + (s->c.out_format == FMT_MJPEG) + !m->intra_only;
378 const uint16_t *intra_matrix, *inter_matrix;
379 int ret;
380
381 if (!ALLOCZ_ARRAYS(s->q_intra_matrix, 32, nb_matrices) ||
382 !ALLOCZ_ARRAYS(s->q_intra_matrix16, 32, nb_matrices))
383 return AVERROR(ENOMEM);
384
385 if (s->c.out_format == FMT_MJPEG) {
386 s->q_chroma_intra_matrix = s->q_intra_matrix + 32;
387 s->q_chroma_intra_matrix16 = s->q_intra_matrix16 + 32;
388 // No need to set q_inter_matrix
390 // intra_matrix, chroma_intra_matrix will be set later for MJPEG.
391 return 0;
392 } else {
393 s->q_chroma_intra_matrix = s->q_intra_matrix;
394 s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
395 }
396 if (!m->intra_only) {
397 s->q_inter_matrix = s->q_intra_matrix + 32;
398 s->q_inter_matrix16 = s->q_intra_matrix16 + 32;
399 }
400
401 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4 &&
402 s->mpeg_quant) {
403 intra_matrix = ff_mpeg4_default_intra_matrix;
405 } else if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
406 intra_matrix =
408 } else {
409 /* MPEG-1/2, SpeedHQ */
410 intra_matrix = ff_mpeg1_default_intra_matrix;
412 }
413 if (avctx->intra_matrix)
414 intra_matrix = avctx->intra_matrix;
415 if (avctx->inter_matrix)
416 inter_matrix = avctx->inter_matrix;
417
418 /* init q matrix */
419 for (int i = 0; i < 64; i++) {
420 int j = s->c.idsp.idct_permutation[i];
421
422 s->c.intra_matrix[j] = s->c.chroma_intra_matrix[j] = intra_matrix[i];
423 s->c.inter_matrix[j] = inter_matrix[i];
424 }
425
426 /* precompute matrix */
428 if (ret < 0)
429 return ret;
430
431 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
432 s->c.intra_matrix, s->intra_quant_bias, avctx->qmin,
433 31, 1);
434 if (s->q_inter_matrix)
435 ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
436 s->c.inter_matrix, s->inter_quant_bias, avctx->qmin,
437 31, 0);
438
439 return 0;
440}
441
443{
444 MPVEncContext *const s = &m->s;
445 int has_b_frames = !!m->max_b_frames;
446 int16_t (*mv_table)[2];
447
448 /* Allocate MB type table */
449 unsigned mb_array_size = s->c.mb_stride * s->c.mb_height;
450 s->mb_type = av_calloc(mb_array_size, 3 * sizeof(*s->mb_type) + sizeof(*s->mb_mean));
451 if (!s->mb_type)
452 return AVERROR(ENOMEM);
453 s->mc_mb_var = s->mb_type + mb_array_size;
454 s->mb_var = s->mc_mb_var + mb_array_size;
455 s->mb_mean = (uint8_t*)(s->mb_var + mb_array_size);
456
457 if (!FF_ALLOCZ_TYPED_ARRAY(s->lambda_table, mb_array_size))
458 return AVERROR(ENOMEM);
459
460 unsigned mv_table_size = (s->c.mb_height + 2) * s->c.mb_stride + 1;
461 unsigned nb_mv_tables = 1 + 5 * has_b_frames;
462 if (s->c.codec_id == AV_CODEC_ID_MPEG4 ||
463 (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) {
464 nb_mv_tables += 8 * has_b_frames;
465 s->p_field_select_table[0] = av_calloc(mv_table_size, 2 * (2 + 4 * has_b_frames));
466 if (!s->p_field_select_table[0])
467 return AVERROR(ENOMEM);
468 s->p_field_select_table[1] = s->p_field_select_table[0] + 2 * mv_table_size;
469 }
470
471 mv_table = av_calloc(mv_table_size, nb_mv_tables * sizeof(*mv_table));
472 if (!mv_table)
473 return AVERROR(ENOMEM);
474 m->mv_table_base = mv_table;
475 mv_table += s->c.mb_stride + 1;
476
477 s->p_mv_table = mv_table;
478 if (has_b_frames) {
479 s->b_forw_mv_table = mv_table += mv_table_size;
480 s->b_back_mv_table = mv_table += mv_table_size;
481 s->b_bidir_forw_mv_table = mv_table += mv_table_size;
482 s->b_bidir_back_mv_table = mv_table += mv_table_size;
483 s->b_direct_mv_table = mv_table += mv_table_size;
484
485 if (s->p_field_select_table[1]) { // MPEG-4 or INTERLACED_ME above
486 uint8_t *field_select = s->p_field_select_table[1];
487 for (int j = 0; j < 2; j++) {
488 for (int k = 0; k < 2; k++) {
489 for (int l = 0; l < 2; l++)
490 s->b_field_mv_table[j][k][l] = mv_table += mv_table_size;
491 s->b_field_select_table[j][k] = field_select += 2 * mv_table_size;
492 }
493 }
494 }
495 }
496
497 return 0;
498}
499
501{
502 MPVEncContext *const s = &m->s;
503 // Align the following per-thread buffers to avoid false sharing.
504 enum {
505#ifndef _MSC_VER
506 /// The number is supposed to match/exceed the cache-line size.
507 ALIGN = FFMAX(128, _Alignof(max_align_t)),
508#else
509 ALIGN = 128,
510#endif
511 DCT_ERROR_SIZE = FFALIGN(2 * sizeof(*s->dct_error_sum), ALIGN),
512 };
513 static_assert(DCT_ERROR_SIZE * MAX_THREADS + ALIGN - 1 <= SIZE_MAX,
514 "Need checks for potential overflow.");
515 unsigned nb_slices = s->c.slice_context_count;
516 char *dct_error = NULL;
517
518 if (m->noise_reduction) {
519 if (!FF_ALLOCZ_TYPED_ARRAY(s->dct_offset, 2))
520 return AVERROR(ENOMEM);
521 dct_error = av_mallocz(ALIGN - 1 + nb_slices * DCT_ERROR_SIZE);
522 if (!dct_error)
523 return AVERROR(ENOMEM);
525 dct_error += FFALIGN((uintptr_t)dct_error, ALIGN) - (uintptr_t)dct_error;
526 }
527
528 const int y_size = s->c.b8_stride * (2 * s->c.mb_height + 1);
529 const int c_size = s->c.mb_stride * (s->c.mb_height + 1);
530 const int yc_size = y_size + 2 * c_size;
531 ptrdiff_t offset = 0;
532
533 for (unsigned i = 0; i < nb_slices; ++i) {
534 MPVEncContext *const s2 = s->c.enc_contexts[i];
535
536 s2->block = s2->blocks[0];
537
538 if (dct_error) {
539 s2->dct_offset = s->dct_offset;
540 s2->dct_error_sum = (void*)dct_error;
541 dct_error += DCT_ERROR_SIZE;
542 }
543
544 if (s2->c.ac_val) {
545 s2->c.dc_val += offset + i;
546 s2->c.ac_val += offset;
547 offset += yc_size;
548 }
549 }
550 return 0;
551}
552
553/* init video encoder */
555{
556 MPVMainEncContext *const m = avctx->priv_data;
557 MPVEncContext *const s = &m->s;
558 AVCPBProperties *cpb_props;
559 int gcd, ret;
560
562
563 switch (avctx->pix_fmt) {
566 s->c.chroma_format = CHROMA_444;
567 break;
570 s->c.chroma_format = CHROMA_422;
571 break;
572 default:
573 av_unreachable("Already checked via CODEC_PIXFMTS");
576 s->c.chroma_format = CHROMA_420;
577 break;
578 }
579
580 avctx->bits_per_raw_sample = av_clip(avctx->bits_per_raw_sample, 0, 8);
581
582 m->bit_rate = avctx->bit_rate;
583 s->c.width = avctx->width;
584 s->c.height = avctx->height;
585 if (avctx->gop_size > 600 &&
587 av_log(avctx, AV_LOG_WARNING,
588 "keyframe interval too large!, reducing it from %d to %d\n",
589 avctx->gop_size, 600);
590 avctx->gop_size = 600;
591 }
592 m->gop_size = avctx->gop_size;
593 s->c.avctx = avctx;
594 if (avctx->max_b_frames > MPVENC_MAX_B_FRAMES) {
595 av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
596 "is " AV_STRINGIFY(MPVENC_MAX_B_FRAMES) ".\n");
598 } else if (avctx->max_b_frames < 0) {
599 av_log(avctx, AV_LOG_ERROR,
600 "max b frames must be 0 or positive for mpegvideo based encoders\n");
601 return AVERROR(EINVAL);
602 }
603 m->max_b_frames = avctx->max_b_frames;
604 s->c.codec_id = avctx->codec->id;
605 if (m->max_b_frames && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) {
606 av_log(avctx, AV_LOG_ERROR, "B-frames not supported by codec\n");
607 return AVERROR(EINVAL);
608 }
609
610 s->c.quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
611 s->rtp_mode = !!s->rtp_payload_size;
613
614 if (m->gop_size <= 1) {
615 m->intra_only = 1;
616 m->gop_size = 12;
617 } else {
618 m->intra_only = 0;
619 }
620
621 /* Fixed QSCALE */
622 m->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
623
624 s->adaptive_quant = (avctx->lumi_masking ||
625 avctx->dark_masking ||
626 avctx->temporal_cplx_masking ||
627 avctx->spatial_cplx_masking ||
628 avctx->p_masking ||
629 m->border_masking ||
630 (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
631 !m->fixed_qscale;
632
633 s->loop_filter = !!(avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
634
635 if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
636 switch(avctx->codec_id) {
639 avctx->rc_buffer_size = FFMAX(avctx->rc_max_rate, 15000000) * 112LL / 15000000 * 16384;
640 break;
645 if (avctx->rc_max_rate >= 15000000) {
646 avctx->rc_buffer_size = 320 + (avctx->rc_max_rate - 15000000LL) * (760-320) / (38400000 - 15000000);
647 } else if(avctx->rc_max_rate >= 2000000) {
648 avctx->rc_buffer_size = 80 + (avctx->rc_max_rate - 2000000LL) * (320- 80) / (15000000 - 2000000);
649 } else if(avctx->rc_max_rate >= 384000) {
650 avctx->rc_buffer_size = 40 + (avctx->rc_max_rate - 384000LL) * ( 80- 40) / ( 2000000 - 384000);
651 } else
652 avctx->rc_buffer_size = 40;
653 avctx->rc_buffer_size *= 16384;
654 break;
655 }
656 if (avctx->rc_buffer_size) {
657 av_log(avctx, AV_LOG_INFO, "Automatically choosing VBV buffer size of %d kbyte\n", avctx->rc_buffer_size/8192);
658 }
659 }
660
661 if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
662 av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
663 return AVERROR(EINVAL);
664 }
665
666 if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
667 av_log(avctx, AV_LOG_INFO,
668 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
669 }
670
671 if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
672 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
673 return AVERROR(EINVAL);
674 }
675
676 if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
677 av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
678 return AVERROR(EINVAL);
679 }
680
681 if (avctx->rc_max_rate &&
682 avctx->rc_max_rate == avctx->bit_rate &&
683 avctx->rc_max_rate != avctx->rc_min_rate) {
684 av_log(avctx, AV_LOG_INFO,
685 "impossible bitrate constraints, this will fail\n");
686 }
687
688 if (avctx->rc_buffer_size &&
689 avctx->bit_rate * (int64_t)avctx->time_base.num >
690 avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
691 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
692 return AVERROR(EINVAL);
693 }
694
695 if (!m->fixed_qscale &&
696 avctx->bit_rate * av_q2d(avctx->time_base) >
697 avctx->bit_rate_tolerance) {
698 double nbt = avctx->bit_rate * av_q2d(avctx->time_base) * 5;
699 av_log(avctx, AV_LOG_WARNING,
700 "bitrate tolerance %d too small for bitrate %"PRId64", overriding\n", avctx->bit_rate_tolerance, avctx->bit_rate);
701 if (nbt <= INT_MAX) {
702 avctx->bit_rate_tolerance = nbt;
703 } else
704 avctx->bit_rate_tolerance = INT_MAX;
705 }
706
707 if ((avctx->flags & AV_CODEC_FLAG_4MV) && s->c.codec_id != AV_CODEC_ID_MPEG4 &&
708 s->c.codec_id != AV_CODEC_ID_H263 && s->c.codec_id != AV_CODEC_ID_H263P &&
709 s->c.codec_id != AV_CODEC_ID_FLV1) {
710 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
711 return AVERROR(EINVAL);
712 }
713
714 if (s->c.obmc && avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
715 av_log(avctx, AV_LOG_ERROR,
716 "OBMC is only supported with simple mb decision\n");
717 return AVERROR(EINVAL);
718 }
719
720 if (s->c.quarter_sample && s->c.codec_id != AV_CODEC_ID_MPEG4) {
721 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
722 return AVERROR(EINVAL);
723 }
724
725 if ((s->c.codec_id == AV_CODEC_ID_MPEG4 ||
726 s->c.codec_id == AV_CODEC_ID_H263 ||
727 s->c.codec_id == AV_CODEC_ID_H263P) &&
728 (avctx->sample_aspect_ratio.num > 255 ||
729 avctx->sample_aspect_ratio.den > 255)) {
730 av_log(avctx, AV_LOG_WARNING,
731 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
734 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 255);
735 }
736
737 if ((s->c.codec_id == AV_CODEC_ID_H263 ||
738 s->c.codec_id == AV_CODEC_ID_H263P) &&
739 (avctx->width > 2048 ||
740 avctx->height > 1152 )) {
741 av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
742 return AVERROR(EINVAL);
743 }
744 if (s->c.codec_id == AV_CODEC_ID_FLV1 &&
745 (avctx->width > 65535 ||
746 avctx->height > 65535 )) {
747 av_log(avctx, AV_LOG_ERROR, "FLV does not support resolutions above 16bit\n");
748 return AVERROR(EINVAL);
749 }
750 if ((s->c.codec_id == AV_CODEC_ID_H263 ||
751 s->c.codec_id == AV_CODEC_ID_H263P ||
752 s->c.codec_id == AV_CODEC_ID_RV20) &&
753 ((avctx->width &3) ||
754 (avctx->height&3) )) {
755 av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 4\n");
756 return AVERROR(EINVAL);
757 }
758
759 if ((s->c.codec_id == AV_CODEC_ID_WMV1 ||
760 s->c.codec_id == AV_CODEC_ID_WMV2) &&
761 avctx->width & 1) {
762 av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
763 return AVERROR(EINVAL);
764 }
765
767 s->c.codec_id != AV_CODEC_ID_MPEG4 && s->c.codec_id != AV_CODEC_ID_MPEG2VIDEO) {
768 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
769 return AVERROR(EINVAL);
770 }
771
772 if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
773 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
774 return AVERROR(EINVAL);
775 }
776
777 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
778 avctx->mb_decision != FF_MB_DECISION_RD) {
779 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=rd\n");
780 return AVERROR(EINVAL);
781 }
782
783 if (m->scenechange_threshold < 1000000000 &&
784 (avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
785 av_log(avctx, AV_LOG_ERROR,
786 "closed gop with scene change detection are not supported yet, "
787 "set threshold to 1000000000\n");
789 }
790
791 if (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
792 if (s->c.codec_id != AV_CODEC_ID_MPEG2VIDEO &&
794 av_log(avctx, AV_LOG_ERROR,
795 "low delay forcing is only available for mpeg2, "
796 "set strict_std_compliance to 'unofficial' or lower in order to allow it\n");
797 return AVERROR(EINVAL);
798 }
799 if (m->max_b_frames != 0) {
800 av_log(avctx, AV_LOG_ERROR,
801 "B-frames cannot be used with low delay\n");
802 return AVERROR(EINVAL);
803 }
804 }
805
806 if (avctx->slices > 1 &&
808 av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
809 return AVERROR(EINVAL);
810 }
811
812 if (m->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
813 av_log(avctx, AV_LOG_INFO,
814 "notice: b_frame_strategy only affects the first pass\n");
815 m->b_frame_strategy = 0;
816 }
817
818 gcd = av_gcd(avctx->time_base.den, avctx->time_base.num);
819 if (gcd > 1) {
820 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
821 avctx->time_base.den /= gcd;
822 avctx->time_base.num /= gcd;
823 //return -1;
824 }
825
826 if (s->mpeg_quant || s->c.codec_id == AV_CODEC_ID_MPEG1VIDEO || s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO || s->c.codec_id == AV_CODEC_ID_MJPEG || s->c.codec_id == AV_CODEC_ID_AMV || s->c.codec_id == AV_CODEC_ID_SPEEDHQ) {
827 // (a + x * 3 / 8) / x
828 s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
829 s->inter_quant_bias = 0;
830 } else {
831 s->intra_quant_bias = 0;
832 // (a - x / 4) / x
833 s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
834 }
835
836 if (avctx->qmin > avctx->qmax || avctx->qmin <= 0) {
837 av_log(avctx, AV_LOG_ERROR, "qmin and or qmax are invalid, they must be 0 < min <= max\n");
838 return AVERROR(EINVAL);
839 }
840
841 av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);
842
843 switch (avctx->codec->id) {
844#if CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER
846 s->rtp_mode = 1;
849 s->c.out_format = FMT_MPEG1;
850 s->c.low_delay = !!(avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
851 avctx->delay = s->c.low_delay ? 0 : (m->max_b_frames + 1);
852 break;
853#endif
854#if CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER
856 case AV_CODEC_ID_AMV:
857 s->c.out_format = FMT_MJPEG;
858 m->intra_only = 1; /* force intra only for jpeg */
859 avctx->delay = 0;
860 s->c.low_delay = 1;
861 if (avctx->codec_id == AV_CODEC_ID_MJPEG) {
862 s->c.y_dc_scale_table =
863 s->c.c_dc_scale_table = ff_mpeg12_dc_scale_table[s->c.intra_dc_precision];
864 }
865 break;
866#endif
868 s->c.out_format = FMT_SPEEDHQ;
869 m->intra_only = 1; /* force intra only for SHQ */
870 avctx->delay = 0;
871 s->c.low_delay = 1;
872 break;
873 case AV_CODEC_ID_H261:
874 s->c.out_format = FMT_H261;
875 avctx->delay = 0;
876 s->c.low_delay = 1;
877 s->rtp_mode = 0; /* Sliced encoding not supported */
878 break;
879 case AV_CODEC_ID_H263:
880 if (!CONFIG_H263_ENCODER)
883 s->c.width, s->c.height) == 8) {
884 av_log(avctx, AV_LOG_ERROR,
885 "The specified picture size of %dx%d is not valid for "
886 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
887 "352x288, 704x576, and 1408x1152. "
888 "Try H.263+.\n", s->c.width, s->c.height);
889 return AVERROR(EINVAL);
890 }
891 s->c.out_format = FMT_H263;
892 avctx->delay = 0;
893 s->c.low_delay = 1;
894 break;
896 s->c.out_format = FMT_H263;
897 /* Fx */
898 s->c.h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
899 s->modified_quant = s->c.h263_aic;
900 s->loop_filter = !!(avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
901 s->me.unrestricted_mv = s->c.obmc || s->loop_filter || s->umvplus;
902 s->flipflop_rounding = 1;
903
904 /* /Fx */
905 /* These are just to be sure */
906 avctx->delay = 0;
907 s->c.low_delay = 1;
908 break;
909 case AV_CODEC_ID_FLV1:
910 s->c.out_format = FMT_H263;
911 s->me.unrestricted_mv = 1;
912 s->rtp_mode = 0; /* don't allow GOB */
913 avctx->delay = 0;
914 s->c.low_delay = 1;
915 break;
916#if CONFIG_RV10_ENCODER
917 case AV_CODEC_ID_RV10:
918 s->c.out_format = FMT_H263;
919 avctx->delay = 0;
920 s->c.low_delay = 1;
921 break;
922#endif
923#if CONFIG_RV20_ENCODER
924 case AV_CODEC_ID_RV20:
926 s->c.out_format = FMT_H263;
927 avctx->delay = 0;
928 s->c.low_delay = 1;
929 s->modified_quant = 1;
930 // Set here to force allocation of dc_val;
931 // will be set later on a per-frame basis.
932 s->c.h263_aic = 1;
933 s->loop_filter = 1;
934 s->me.unrestricted_mv = 0;
935 break;
936#endif
938 s->c.out_format = FMT_H263;
939 s->c.h263_pred = 1;
940 s->me.unrestricted_mv = 1;
941 s->flipflop_rounding = 1;
942 s->c.low_delay = m->max_b_frames ? 0 : 1;
943 avctx->delay = s->c.low_delay ? 0 : (m->max_b_frames + 1);
944 break;
946 s->c.out_format = FMT_H263;
947 s->c.h263_pred = 1;
948 s->me.unrestricted_mv = 1;
949 s->c.msmpeg4_version = MSMP4_V2;
950 avctx->delay = 0;
951 s->c.low_delay = 1;
952 break;
954 s->c.out_format = FMT_H263;
955 s->c.h263_pred = 1;
956 s->me.unrestricted_mv = 1;
957 s->c.msmpeg4_version = MSMP4_V3;
958 s->flipflop_rounding = 1;
959 avctx->delay = 0;
960 s->c.low_delay = 1;
961 break;
962 case AV_CODEC_ID_WMV1:
963 s->c.out_format = FMT_H263;
964 s->c.h263_pred = 1;
965 s->me.unrestricted_mv = 1;
966 s->c.msmpeg4_version = MSMP4_WMV1;
967 s->flipflop_rounding = 1;
968 avctx->delay = 0;
969 s->c.low_delay = 1;
970 break;
971 case AV_CODEC_ID_WMV2:
972 s->c.out_format = FMT_H263;
973 s->c.h263_pred = 1;
974 s->me.unrestricted_mv = 1;
975 s->c.msmpeg4_version = MSMP4_WMV2;
976 s->flipflop_rounding = 1;
977 avctx->delay = 0;
978 s->c.low_delay = 1;
979 break;
980 default:
981 av_unreachable("List contains all codecs using ff_mpv_encode_init()");
982 }
983
984 avctx->has_b_frames = !s->c.low_delay;
985
986 s->c.encoding = 1;
987
988 s->c.progressive_frame =
989 s->c.progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
991 s->c.alternate_scan);
992
993 if (avctx->flags & AV_CODEC_FLAG_PSNR || avctx->mb_decision == FF_MB_DECISION_RD ||
995 s->frame_reconstruction_bitfield = (1 << AV_PICTURE_TYPE_I) |
996 (1 << AV_PICTURE_TYPE_P) |
997 (1 << AV_PICTURE_TYPE_B);
998 } else if (!m->intra_only) {
999 s->frame_reconstruction_bitfield = (1 << AV_PICTURE_TYPE_I) |
1000 (1 << AV_PICTURE_TYPE_P);
1001 } else {
1002 s->frame_reconstruction_bitfield = 0;
1003 }
1004
1005 if (m->lmin > m->lmax) {
1006 av_log(avctx, AV_LOG_WARNING, "Clipping lmin value to %d\n", m->lmax);
1007 m->lmin = m->lmax;
1008 }
1009
1010 /* ff_mpv_init_duplicate_contexts() will copy (memdup) the contents of the
1011 * main slice to the slice contexts, so we initialize various fields of it
1012 * before calling ff_mpv_init_duplicate_contexts(). */
1013 s->parent = m;
1014 ff_mpv_idct_init(&s->c);
1015 init_unquantize(s, avctx);
1016 ff_fdctdsp_init(&s->fdsp, avctx);
1017 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
1018 ff_pixblockdsp_init(&s->pdsp, 8);
1019 ret = me_cmp_init(m, avctx);
1020 if (ret < 0)
1021 return ret;
1022
1023 if (!(avctx->stats_out = av_mallocz(256)) ||
1024 !(s->new_pic = av_frame_alloc()) ||
1025 !(s->c.picture_pool = ff_mpv_alloc_pic_pool(0)))
1026 return AVERROR(ENOMEM);
1027
1028 ret = init_matrices(m, avctx);
1029 if (ret < 0)
1030 return ret;
1031
1033
1034 if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263) {
1036#if CONFIG_MSMPEG4ENC
1037 if (s->c.msmpeg4_version != MSMP4_UNUSED)
1039#endif
1040 }
1041
1042 s->c.slice_ctx_size = sizeof(*s);
1043 ret = ff_mpv_common_init(&s->c);
1044 if (ret < 0)
1045 return ret;
1046 ret = init_buffers(m);
1047 if (ret < 0)
1048 return ret;
1049 if (s->c.slice_context_count > 1) {
1050 s->rtp_mode = 1;
1051 if (avctx->codec_id == AV_CODEC_ID_H263P)
1052 s->h263_slice_structured = 1;
1053 }
1055 if (ret < 0)
1056 return ret;
1057
1058 ret = init_slice_buffers(m);
1059 if (ret < 0)
1060 return ret;
1061
1062 ret = ff_rate_control_init(m);
1063 if (ret < 0)
1064 return ret;
1065
1066 if (m->b_frame_strategy == 2) {
1067 for (int i = 0; i < m->max_b_frames + 2; i++) {
1068 m->tmp_frames[i] = av_frame_alloc();
1069 if (!m->tmp_frames[i])
1070 return AVERROR(ENOMEM);
1071
1073 m->tmp_frames[i]->width = s->c.width >> m->brd_scale;
1074 m->tmp_frames[i]->height = s->c.height >> m->brd_scale;
1075
1076 ret = av_frame_get_buffer(m->tmp_frames[i], 0);
1077 if (ret < 0)
1078 return ret;
1079 }
1080 }
1081
1082 cpb_props = ff_encode_add_cpb_side_data(avctx);
1083 if (!cpb_props)
1084 return AVERROR(ENOMEM);
1085 cpb_props->max_bitrate = avctx->rc_max_rate;
1086 cpb_props->min_bitrate = avctx->rc_min_rate;
1087 cpb_props->avg_bitrate = avctx->bit_rate;
1088 cpb_props->buffer_size = avctx->rc_buffer_size;
1089
1090 return 0;
1091}
1092
1094{
1095 MPVMainEncContext *const m = avctx->priv_data;
1096 MPVEncContext *const s = &m->s;
1097
1099
1100 ff_mpv_common_end(&s->c);
1101 av_refstruct_pool_uninit(&s->c.picture_pool);
1102
1103 for (int i = 0; i < MPVENC_MAX_B_FRAMES + 1; i++) {
1106 }
1107 for (int i = 0; i < FF_ARRAY_ELEMS(m->tmp_frames); i++)
1109
1110 av_frame_free(&s->new_pic);
1111
1112 av_freep(&avctx->stats_out);
1113
1115 av_freep(&s->p_field_select_table[0]);
1117
1118 av_freep(&s->mb_type);
1119 av_freep(&s->lambda_table);
1120
1121 av_freep(&s->q_intra_matrix);
1122 av_freep(&s->q_intra_matrix16);
1123 av_freep(&s->dct_offset);
1124
1125 return 0;
1126}
1127
1128/* put block[] to dest[] */
1129static inline void put_dct(MPVEncContext *const s,
1130 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
1131{
1132 s->c.dct_unquantize_intra(&s->c, block, i, qscale);
1133 s->c.idsp.idct_put(dest, line_size, block);
1134}
1135
1136static inline void add_dequant_dct(MPVEncContext *const s,
1137 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
1138{
1139 if (s->c.block_last_index[i] >= 0) {
1140 s->c.dct_unquantize_inter(&s->c, block, i, qscale);
1141
1142 s->c.idsp.idct_add(dest, line_size, block);
1143 }
1144}
1145
1146/**
1147 * Performs dequantization and IDCT (if necessary)
1148 */
1149static void mpv_reconstruct_mb(MPVEncContext *const s, int16_t block[12][64])
1150{
1151 if (s->c.avctx->debug & FF_DEBUG_DCT_COEFF) {
1152 /* print DCT coefficients */
1153 av_log(s->c.avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->c.mb_x, s->c.mb_y);
1154 for (int i = 0; i < 6; i++) {
1155 for (int j = 0; j < 64; j++) {
1156 av_log(s->c.avctx, AV_LOG_DEBUG, "%5d",
1157 block[i][s->c.idsp.idct_permutation[j]]);
1158 }
1159 av_log(s->c.avctx, AV_LOG_DEBUG, "\n");
1160 }
1161 }
1162
1163 if ((1 << s->c.pict_type) & s->frame_reconstruction_bitfield) {
1164 uint8_t *dest_y = s->c.dest[0], *dest_cb = s->c.dest[1], *dest_cr = s->c.dest[2];
1165 int dct_linesize, dct_offset;
1166 const int linesize = s->c.cur_pic.linesize[0];
1167 const int uvlinesize = s->c.cur_pic.linesize[1];
1168 const int block_size = 8;
1169
1170 dct_linesize = linesize << s->c.interlaced_dct;
1171 dct_offset = s->c.interlaced_dct ? linesize : linesize * block_size;
1172
1173 if (!s->c.mb_intra) {
1174 /* No MC, as that was already done otherwise */
1175 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->c.qscale);
1176 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->c.qscale);
1177 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->c.qscale);
1178 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->c.qscale);
1179
1180 if (!CONFIG_GRAY || !(s->c.avctx->flags & AV_CODEC_FLAG_GRAY)) {
1181 if (s->c.chroma_y_shift) {
1182 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->c.chroma_qscale);
1183 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->c.chroma_qscale);
1184 } else {
1185 dct_linesize >>= 1;
1186 dct_offset >>= 1;
1187 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->c.chroma_qscale);
1188 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->c.chroma_qscale);
1189 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->c.chroma_qscale);
1190 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->c.chroma_qscale);
1191 }
1192 }
1193 } else {
1194 /* dct only in intra block */
1195 put_dct(s, block[0], 0, dest_y , dct_linesize, s->c.qscale);
1196 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->c.qscale);
1197 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->c.qscale);
1198 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->c.qscale);
1199
1200 if (!CONFIG_GRAY || !(s->c.avctx->flags & AV_CODEC_FLAG_GRAY)) {
1201 if (s->c.chroma_y_shift) {
1202 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->c.chroma_qscale);
1203 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->c.chroma_qscale);
1204 } else {
1205 dct_offset >>= 1;
1206 dct_linesize >>= 1;
1207 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->c.chroma_qscale);
1208 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->c.chroma_qscale);
1209 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->c.chroma_qscale);
1210 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->c.chroma_qscale);
1211 }
1212 }
1213 }
1214 }
1215}
1216
1217static int get_sae(const uint8_t *src, int ref, int stride)
1218{
1219 int x,y;
1220 int acc = 0;
1221
1222 for (y = 0; y < 16; y++) {
1223 for (x = 0; x < 16; x++) {
1224 acc += FFABS(src[x + y * stride] - ref);
1225 }
1226 }
1227
1228 return acc;
1229}
1230
1231static int get_intra_count(MPVEncContext *const s, const uint8_t *src,
1232 const uint8_t *ref, int stride)
1233{
1234 int x, y, w, h;
1235 int acc = 0;
1236
1237 w = s->c.width & ~15;
1238 h = s->c.height & ~15;
1239
1240 for (y = 0; y < h; y += 16) {
1241 for (x = 0; x < w; x += 16) {
1242 int offset = x + y * stride;
1243 int sad = s->sad_cmp[0](NULL, src + offset, ref + offset,
1244 stride, 16);
1245 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
1246 int sae = get_sae(src + offset, mean, stride);
1247
1248 acc += sae + 500 < sad;
1249 }
1250 }
1251 return acc;
1252}
1253
1254/**
1255 * Allocates new buffers for an AVFrame and copies the properties
1256 * from another AVFrame.
1257 */
1258static int prepare_picture(MPVEncContext *const s, AVFrame *f, const AVFrame *props_frame)
1259{
1260 AVCodecContext *avctx = s->c.avctx;
1261 int ret;
1262
1263 f->width = avctx->width + 2 * EDGE_WIDTH;
1264 f->height = avctx->height + 2 * EDGE_WIDTH;
1265
1266 ret = ff_encode_alloc_frame(avctx, f);
1267 if (ret < 0)
1268 return ret;
1269
1270 ret = ff_mpv_pic_check_linesize(avctx, f, &s->c.linesize, &s->c.uvlinesize);
1271 if (ret < 0)
1272 return ret;
1273
1274 for (int i = 0; f->data[i]; i++) {
1275 int offset = (EDGE_WIDTH >> (i ? s->c.chroma_y_shift : 0)) *
1276 f->linesize[i] +
1277 (EDGE_WIDTH >> (i ? s->c.chroma_x_shift : 0));
1278 f->data[i] += offset;
1279 }
1280 f->width = avctx->width;
1281 f->height = avctx->height;
1282
1283 ret = av_frame_copy_props(f, props_frame);
1284 if (ret < 0)
1285 return ret;
1286
1287 return 0;
1288}
1289
1290static int load_input_picture(MPVMainEncContext *const m, const AVFrame *pic_arg)
1291{
1292 MPVEncContext *const s = &m->s;
1293 MPVPicture *pic = NULL;
1294 int64_t pts;
1295 int display_picture_number = 0, ret;
1296 int encoding_delay = m->max_b_frames ? m->max_b_frames
1297 : (s->c.low_delay ? 0 : 1);
1298 int flush_offset = 1;
1299 int direct = 1;
1300
1301 av_assert1(!m->input_picture[0]);
1302
1303 if (pic_arg) {
1304 pts = pic_arg->pts;
1305 display_picture_number = m->input_picture_number++;
1306
1307 if (pts != AV_NOPTS_VALUE) {
1308 if (s->c.codec_id == AV_CODEC_ID_MPEG4 &&
1309 (pts > INT64_MAX / 2 / s->c.avctx->time_base.num ||
1310 pts < INT64_MIN / 2 / s->c.avctx->time_base.num)) {
1311 av_log(s->c.avctx, AV_LOG_ERROR, "pts %"PRId64" is out of the supported range\n", pts);
1312 return AVERROR_PATCHWELCOME;
1313 }
1314
1316 int64_t last = m->user_specified_pts;
1317
1318 if (pts <= last) {
1319 av_log(s->c.avctx, AV_LOG_ERROR,
1320 "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
1321 pts, last);
1322 return AVERROR(EINVAL);
1323 }
1324
1325 if (!s->c.low_delay && display_picture_number == 1)
1326 m->dts_delta = pts - last;
1327 }
1329 } else {
1332 pts = m->user_specified_pts + 1;
1333 av_log(s->c.avctx, AV_LOG_INFO,
1334 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1335 pts);
1336 } else {
1337 pts = display_picture_number;
1338 }
1339 }
1340
1341 if (pic_arg->linesize[0] != s->c.linesize ||
1342 pic_arg->linesize[1] != s->c.uvlinesize ||
1343 pic_arg->linesize[2] != s->c.uvlinesize)
1344 direct = 0;
1345 if ((s->c.width & 15) || (s->c.height & 15))
1346 direct = 0;
1347 if (((intptr_t)(pic_arg->data[0])) & (STRIDE_ALIGN-1))
1348 direct = 0;
1349 if (s->c.linesize & (STRIDE_ALIGN-1))
1350 direct = 0;
1351
1352 ff_dlog(s->c.avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1353 pic_arg->linesize[1], s->c.linesize, s->c.uvlinesize);
1354
1355 pic = av_refstruct_pool_get(s->c.picture_pool);
1356 if (!pic)
1357 return AVERROR(ENOMEM);
1358
1359 if (direct) {
1360 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1361 goto fail;
1362 pic->shared = 1;
1363 } else {
1364 ret = prepare_picture(s, pic->f, pic_arg);
1365 if (ret < 0)
1366 goto fail;
1367
1368 for (int i = 0; i < 3; i++) {
1369 ptrdiff_t src_stride = pic_arg->linesize[i];
1370 ptrdiff_t dst_stride = i ? s->c.uvlinesize : s->c.linesize;
1371 int h_shift = i ? s->c.chroma_x_shift : 0;
1372 int v_shift = i ? s->c.chroma_y_shift : 0;
1373 int w = AV_CEIL_RSHIFT(s->c.width , h_shift);
1374 int h = AV_CEIL_RSHIFT(s->c.height, v_shift);
1375 const uint8_t *src = pic_arg->data[i];
1376 int vpad = 16;
1377
1378 if ( s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO
1379 && !s->c.progressive_sequence
1380 && FFALIGN(s->c.height, 32) - s->c.height > 16)
1381 vpad = 32;
1382
1383 if (!s->c.avctx->rc_buffer_size)
1384 pic->f->data[i] += INPLACE_OFFSET;
1385 uint8_t *dst = pic->f->data[i];
1386
1387 if (src_stride == dst_stride)
1388 memcpy(dst, src, src_stride * h - src_stride + w);
1389 else {
1390 int h2 = h;
1391 uint8_t *dst2 = dst;
1392 while (h2--) {
1393 memcpy(dst2, src, w);
1394 dst2 += dst_stride;
1395 src += src_stride;
1396 }
1397 }
1398 if ((s->c.width & 15) || (s->c.height & (vpad-1))) {
1399 s->mpvencdsp.draw_edges(dst, dst_stride,
1400 w, h,
1401 16 >> h_shift,
1402 vpad >> v_shift,
1403 EDGE_BOTTOM);
1404 }
1405 }
1406 }
1407
1408 pic->display_picture_number = display_picture_number;
1409 pic->f->pts = pts; // we set this here to avoid modifying pic_arg
1410 } else if (!m->reordered_input_picture[1]) {
1411 /* Flushing: When the above check is true, the encoder is about to run
1412 * out of frames to encode. Check if there are input_pictures left;
1413 * if so, ensure m->input_picture[0] contains the first picture.
1414 * A flush_offset != 1 will only happen if we did not receive enough
1415 * input frames. */
1416 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1417 if (m->input_picture[flush_offset])
1418 break;
1419
1420 encoding_delay -= flush_offset - 1;
1421 }
1422
1423 /* shift buffer entries */
1424 for (int i = flush_offset; i <= MPVENC_MAX_B_FRAMES; i++)
1425 m->input_picture[i - flush_offset] = m->input_picture[i];
1426 for (int i = MPVENC_MAX_B_FRAMES + 1 - flush_offset; i <= MPVENC_MAX_B_FRAMES; i++)
1427 m->input_picture[i] = NULL;
1428
1429 m->input_picture[encoding_delay] = pic;
1430
1431 return 0;
1432fail:
1433 av_refstruct_unref(&pic);
1434 return ret;
1435}
1436
1437static int skip_check(MPVMainEncContext *const m,
1438 const MPVPicture *p, const MPVPicture *ref)
1439{
1440 MPVEncContext *const s = &m->s;
1441 int score = 0;
1442 int64_t score64 = 0;
1443
1444 for (int plane = 0; plane < 3; plane++) {
1445 const int stride = p->f->linesize[plane];
1446 const int bw = plane ? 1 : 2;
1447 for (int y = 0; y < s->c.mb_height * bw; y++) {
1448 for (int x = 0; x < s->c.mb_width * bw; x++) {
1449 const uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride);
1450 const uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1451 int v = m->frame_skip_cmp_fn(s, dptr, rptr, stride, 8);
1452
1453 switch (FFABS(m->frame_skip_exp)) {
1454 case 0: score = FFMAX(score, v); break;
1455 case 1: score += FFABS(v); break;
1456 case 2: score64 += v * (int64_t)v; break;
1457 case 3: score64 += FFABS(v * (int64_t)v * v); break;
1458 case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v); break;
1459 }
1460 }
1461 }
1462 }
1463 emms_c();
1464
1465 if (score)
1466 score64 = score;
1467 if (m->frame_skip_exp < 0)
1468 score64 = pow(score64 / (double)(s->c.mb_width * s->c.mb_height),
1469 -1.0/m->frame_skip_exp);
1470
1471 if (score64 < m->frame_skip_threshold)
1472 return 1;
1473 if (score64 < ((m->frame_skip_factor * (int64_t) s->lambda) >> 8))
1474 return 1;
1475 return 0;
1476}
1477
1479{
1480 int ret;
1481 int size = 0;
1482
1483 ret = avcodec_send_frame(c, frame);
1484 if (ret < 0)
1485 return ret;
1486
1487 do {
1489 if (ret >= 0) {
1490 size += pkt->size;
1492 } else if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
1493 return ret;
1494 } while (ret >= 0);
1495
1496 return size;
1497}
1498
1500{
1501 MPVEncContext *const s = &m->s;
1502 AVPacket *pkt;
1503 const int scale = m->brd_scale;
1504 int width = s->c.width >> scale;
1505 int height = s->c.height >> scale;
1506 int out_size, p_lambda, b_lambda, lambda2;
1507 int64_t best_rd = INT64_MAX;
1508 int best_b_count = -1;
1509 int ret = 0;
1510
1511 av_assert0(scale >= 0 && scale <= 3);
1512
1513 pkt = av_packet_alloc();
1514 if (!pkt)
1515 return AVERROR(ENOMEM);
1516
1517 p_lambda = m->last_lambda_for[AV_PICTURE_TYPE_P];
1518 //p_lambda * FFABS(s->c.avctx->b_quant_factor) + s->c.avctx->b_quant_offset;
1519 b_lambda = m->last_lambda_for[AV_PICTURE_TYPE_B];
1520 if (!b_lambda) // FIXME we should do this somewhere else
1521 b_lambda = p_lambda;
1522 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1524
1525 for (int i = 0; i < m->max_b_frames + 2; i++) {
1526 const MPVPicture *pre_input_ptr = i ? m->input_picture[i - 1] :
1527 s->c.next_pic.ptr;
1528
1529 if (pre_input_ptr) {
1530 const AVFrame *const pre_input = pre_input_ptr->f;
1531
1532 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[0],
1533 m->tmp_frames[i]->linesize[0],
1534 pre_input->data[0],
1535 pre_input->linesize[0],
1536 width, height);
1537 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[1],
1538 m->tmp_frames[i]->linesize[1],
1539 pre_input->data[1],
1540 pre_input->linesize[1],
1541 width >> 1, height >> 1);
1542 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[2],
1543 m->tmp_frames[i]->linesize[2],
1544 pre_input->data[2],
1545 pre_input->linesize[2],
1546 width >> 1, height >> 1);
1547 }
1548 }
1549
1550 for (int j = 0; j < m->max_b_frames + 1; j++) {
1552 int64_t rd = 0;
1553
1554 if (!m->input_picture[j])
1555 break;
1556
1558 if (!c) {
1559 ret = AVERROR(ENOMEM);
1560 goto fail;
1561 }
1562
1563 c->width = width;
1564 c->height = height;
1566 c->flags |= s->c.avctx->flags & AV_CODEC_FLAG_QPEL;
1567 c->mb_decision = s->c.avctx->mb_decision;
1568 c->me_cmp = s->c.avctx->me_cmp;
1569 c->mb_cmp = s->c.avctx->mb_cmp;
1570 c->me_sub_cmp = s->c.avctx->me_sub_cmp;
1571 c->pix_fmt = AV_PIX_FMT_YUV420P;
1572 c->time_base = s->c.avctx->time_base;
1573 c->max_b_frames = m->max_b_frames;
1574
1575 ret = avcodec_open2(c, s->c.avctx->codec, NULL);
1576 if (ret < 0)
1577 goto fail;
1578
1579
1581 m->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1582
1584 if (out_size < 0) {
1585 ret = out_size;
1586 goto fail;
1587 }
1588
1589 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1590
1591 for (int i = 0; i < m->max_b_frames + 1; i++) {
1592 int is_p = i % (j + 1) == j || i == m->max_b_frames;
1593
1594 m->tmp_frames[i + 1]->pict_type = is_p ?
1596 m->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1597
1598 out_size = encode_frame(c, m->tmp_frames[i + 1], pkt);
1599 if (out_size < 0) {
1600 ret = out_size;
1601 goto fail;
1602 }
1603
1604 rd += (out_size * (uint64_t)lambda2) >> (FF_LAMBDA_SHIFT - 3);
1605 }
1606
1607 /* get the delayed frames */
1609 if (out_size < 0) {
1610 ret = out_size;
1611 goto fail;
1612 }
1613 rd += (out_size * (uint64_t)lambda2) >> (FF_LAMBDA_SHIFT - 3);
1614
1615 rd += c->error[0] + c->error[1] + c->error[2];
1616
1617 if (rd < best_rd) {
1618 best_rd = rd;
1619 best_b_count = j;
1620 }
1621
1622fail:
1625 if (ret < 0) {
1626 best_b_count = ret;
1627 break;
1628 }
1629 }
1630
1632
1633 return best_b_count;
1634}
1635
1636/**
1637 * Determines whether an input picture is discarded or not
1638 * and if not determines the length of the next chain of B frames
1639 * and moves these pictures (including the P frame) into
1640 * reordered_input_picture.
1641 * input_picture[0] is always NULL when exiting this function, even on error;
1642 * reordered_input_picture[0] is always NULL when exiting this function on error.
1643 */
1645{
1646 MPVEncContext *const s = &m->s;
1647
1648 /* Either nothing to do or can't do anything */
1649 if (m->reordered_input_picture[0] || !m->input_picture[0])
1650 return 0;
1651
1652 /* set next picture type & ordering */
1654 if (m->picture_in_gop_number < m->gop_size &&
1655 s->c.next_pic.ptr &&
1656 skip_check(m, m->input_picture[0], s->c.next_pic.ptr)) {
1657 // FIXME check that the gop check above is +-1 correct
1659
1660 ff_vbv_update(m, 0);
1661
1662 return 0;
1663 }
1664 }
1665
1666 if (/* m->picture_in_gop_number >= m->gop_size || */
1667 !s->c.next_pic.ptr || m->intra_only) {
1669 m->input_picture[0] = NULL;
1673 } else {
1674 int b_frames = 0;
1675
1676 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS2) {
1677 for (int i = 0; i < m->max_b_frames + 1; i++) {
1678 int pict_num = m->input_picture[0]->display_picture_number + i;
1679
1680 if (pict_num >= m->rc_context.num_entries)
1681 break;
1682 if (!m->input_picture[i]) {
1684 break;
1685 }
1686
1687 m->input_picture[i]->f->pict_type =
1688 m->rc_context.entry[pict_num].new_pict_type;
1689 }
1690 }
1691
1692 if (m->b_frame_strategy == 0) {
1693 b_frames = m->max_b_frames;
1694 while (b_frames && !m->input_picture[b_frames])
1695 b_frames--;
1696 } else if (m->b_frame_strategy == 1) {
1697 for (int i = 1; i < m->max_b_frames + 1; i++) {
1698 if (m->input_picture[i] &&
1699 m->input_picture[i]->b_frame_score == 0) {
1702 m->input_picture[i ]->f->data[0],
1703 m->input_picture[i - 1]->f->data[0],
1704 s->c.linesize) + 1;
1705 }
1706 }
1707 for (int i = 0;; i++) {
1708 if (i >= m->max_b_frames + 1 ||
1709 !m->input_picture[i] ||
1710 m->input_picture[i]->b_frame_score - 1 >
1711 s->c.mb_num / m->b_sensitivity) {
1712 b_frames = FFMAX(0, i - 1);
1713 break;
1714 }
1715 }
1716
1717 /* reset scores */
1718 for (int i = 0; i < b_frames + 1; i++)
1719 m->input_picture[i]->b_frame_score = 0;
1720 } else if (m->b_frame_strategy == 2) {
1721 b_frames = estimate_best_b_count(m);
1722 if (b_frames < 0) {
1724 return b_frames;
1725 }
1726 }
1727
1728 if (s->c.codec_id == AV_CODEC_ID_MPEG4)
1729 while (b_frames &&
1730 m->input_picture[b_frames]->f->pts * s->c.avctx->time_base.num -
1731 s->c.last_non_b_time > UINT16_MAX)
1732 b_frames--;
1733
1734 for (int i = b_frames - 1; i >= 0; i--) {
1735 int type = m->input_picture[i]->f->pict_type;
1736 if (type && type != AV_PICTURE_TYPE_B)
1737 b_frames = i;
1738 }
1739 if (m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1740 b_frames == m->max_b_frames) {
1741 av_log(s->c.avctx, AV_LOG_ERROR,
1742 "warning, too many B-frames in a row\n");
1743 }
1744
1745 if (m->picture_in_gop_number + b_frames >= m->gop_size) {
1746 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1748 b_frames = m->gop_size - m->picture_in_gop_number - 1;
1749 } else {
1750 if (s->c.avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1751 b_frames = 0;
1752 m->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1753 }
1754 }
1755
1756 if ((s->c.avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1757 m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1758 b_frames--;
1759
1760 m->reordered_input_picture[0] = m->input_picture[b_frames];
1761 m->input_picture[b_frames] = NULL;
1766 for (int i = 0; i < b_frames; i++) {
1768 m->input_picture[i] = NULL;
1773 }
1774 }
1775
1776 return 0;
1777}
1778
1780{
1781 MPVEncContext *const s = &m->s;
1782 int ret;
1783
1785
1786 for (int i = 1; i <= MPVENC_MAX_B_FRAMES; i++)
1789
1790 ret = set_bframe_chain_length(m);
1791 av_assert1(!m->input_picture[0]);
1792 if (ret < 0)
1793 return ret;
1794
1795 av_frame_unref(s->new_pic);
1796
1797 if (m->reordered_input_picture[0]) {
1800
1801 if (m->reordered_input_picture[0]->shared || s->c.avctx->rc_buffer_size) {
1802 // input is a shared pix, so we can't modify it -> allocate a new
1803 // one & ensure that the shared one is reusable
1804 av_frame_move_ref(s->new_pic, m->reordered_input_picture[0]->f);
1805
1806 ret = prepare_picture(s, m->reordered_input_picture[0]->f, s->new_pic);
1807 if (ret < 0)
1808 goto fail;
1809 } else {
1810 // input is not a shared pix -> reuse buffer for current_pix
1811 ret = av_frame_ref(s->new_pic, m->reordered_input_picture[0]->f);
1812 if (ret < 0)
1813 goto fail;
1814 // The input was stored INPLACE_OFFSET into the buffer, which
1815 // new_pic now points at. Point the frame back at the start of
1816 // the buffer for the reconstruction.
1817 for (int i = 0; i < MPV_MAX_PLANES; i++)
1819 }
1820 s->c.cur_pic.ptr = m->reordered_input_picture[0];
1822 av_assert1(s->c.mb_width == s->c.buffer_pools.alloc_mb_width);
1823 av_assert1(s->c.mb_height == s->c.buffer_pools.alloc_mb_height);
1824 av_assert1(s->c.mb_stride == s->c.buffer_pools.alloc_mb_stride);
1825 ret = ff_mpv_alloc_pic_accessories(s->c.avctx, &s->c.cur_pic,
1826 &s->c.sc, &s->c.buffer_pools, s->c.mb_height);
1827 if (ret < 0) {
1828 ff_mpv_unref_picture(&s->c.cur_pic);
1829 return ret;
1830 }
1831 s->picture_number = s->c.cur_pic.ptr->display_picture_number;
1832
1833 }
1834 return 0;
1835fail:
1837 return ret;
1838}
1839
1840static void frame_end(MPVMainEncContext *const m)
1841{
1842 MPVEncContext *const s = &m->s;
1843
1844 if (s->me.unrestricted_mv &&
1845 s->c.cur_pic.reference &&
1846 !m->intra_only) {
1847 int hshift = s->c.chroma_x_shift;
1848 int vshift = s->c.chroma_y_shift;
1849 s->mpvencdsp.draw_edges(s->c.cur_pic.data[0],
1850 s->c.cur_pic.linesize[0],
1851 s->c.h_edge_pos, s->c.v_edge_pos,
1854 s->mpvencdsp.draw_edges(s->c.cur_pic.data[1],
1855 s->c.cur_pic.linesize[1],
1856 s->c.h_edge_pos >> hshift,
1857 s->c.v_edge_pos >> vshift,
1858 EDGE_WIDTH >> hshift,
1859 EDGE_WIDTH >> vshift,
1861 s->mpvencdsp.draw_edges(s->c.cur_pic.data[2],
1862 s->c.cur_pic.linesize[2],
1863 s->c.h_edge_pos >> hshift,
1864 s->c.v_edge_pos >> vshift,
1865 EDGE_WIDTH >> hshift,
1866 EDGE_WIDTH >> vshift,
1868 }
1869
1870 m->last_pict_type = s->c.pict_type;
1871 m->last_lambda_for[s->c.pict_type] = s->c.cur_pic.ptr->f->quality;
1872 if (s->c.pict_type != AV_PICTURE_TYPE_B)
1873 m->last_non_b_pict_type = s->c.pict_type;
1874}
1875
1877{
1878 MPVEncContext *const s = &m->s;
1879 int intra, i;
1880
1881 for (intra = 0; intra < 2; intra++) {
1882 if (s->dct_count[intra] > (1 << 16)) {
1883 for (i = 0; i < 64; i++) {
1884 s->dct_error_sum[intra][i] >>= 1;
1885 }
1886 s->dct_count[intra] >>= 1;
1887 }
1888
1889 for (i = 0; i < 64; i++) {
1890 s->dct_offset[intra][i] = (m->noise_reduction *
1891 s->dct_count[intra] +
1892 s->dct_error_sum[intra][i] / 2) /
1893 (s->dct_error_sum[intra][i] + 1);
1894 }
1895 }
1896}
1897
1898static void frame_start(MPVMainEncContext *const m)
1899{
1900 MPVEncContext *const s = &m->s;
1901
1902 s->c.cur_pic.ptr->f->pict_type = s->c.pict_type;
1903
1904 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
1905 ff_mpv_replace_picture(&s->c.last_pic, &s->c.next_pic);
1906 ff_mpv_replace_picture(&s->c.next_pic, &s->c.cur_pic);
1907 }
1908
1909 av_assert2(!!m->noise_reduction == !!s->dct_error_sum);
1910 if (s->dct_error_sum) {
1912 }
1913}
1914
1916 const AVFrame *pic_arg, int *got_packet)
1917{
1918 MPVMainEncContext *const m = avctx->priv_data;
1919 MPVEncContext *const s = &m->s;
1920 int stuffing_count, ret;
1921 int context_count = s->c.slice_context_count;
1922
1923 ff_mpv_unref_picture(&s->c.cur_pic);
1924
1925 m->vbv_ignore_qmax = 0;
1926
1928
1929 ret = load_input_picture(m, pic_arg);
1930 if (ret < 0)
1931 return ret;
1932
1933 ret = select_input_picture(m);
1934 if (ret < 0)
1935 return ret;
1936
1937 /* output? */
1938 if (s->new_pic->data[0]) {
1939 int growing_buffer = context_count == 1 && !s->data_partitioning;
1940 size_t pkt_size = 10000 + s->c.mb_width * s->c.mb_height *
1941 (growing_buffer ? 64 : (MAX_MB_BYTES + 100));
1942 if (CONFIG_MJPEG_ENCODER && avctx->codec_id == AV_CODEC_ID_MJPEG) {
1943 ret = ff_mjpeg_add_icc_profile_size(avctx, s->new_pic, &pkt_size);
1944 if (ret < 0)
1945 return ret;
1946 ret = ff_mjpeg_add_gain_map_size(avctx, s->mjpeg_ctx, s->new_pic, &pkt_size);
1947 if (ret < 0)
1948 return ret;
1949 }
1950 if ((ret = ff_alloc_packet(avctx, pkt, pkt_size)) < 0)
1951 return ret;
1953 if (s->mb_info) {
1954 s->mb_info_ptr = av_packet_new_side_data(pkt,
1956 s->c.mb_width*s->c.mb_height*12);
1957 if (!s->mb_info_ptr)
1958 return AVERROR(ENOMEM);
1959 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1960 }
1961
1962 s->c.pict_type = s->new_pic->pict_type;
1963 frame_start(m);
1964vbv_retry:
1965 ret = encode_picture(m, pkt);
1966 if (growing_buffer) {
1967 av_assert0(s->pb.buf == avctx->internal->byte_buffer);
1968 pkt->data = s->pb.buf;
1969 pkt->size = avctx->internal->byte_buffer_size;
1970 }
1971 if (ret < 0)
1972 return -1;
1973
1974 frame_end(m);
1975
1976 if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) && s->c.out_format == FMT_MJPEG)
1978
1979 if (avctx->rc_buffer_size) {
1980 RateControlContext *rcc = &m->rc_context;
1981 int max_size = FFMAX(rcc->buffer_index * avctx->rc_max_available_vbv_use, rcc->buffer_index - 500);
1982 int hq = (avctx->mb_decision == FF_MB_DECISION_RD || avctx->trellis);
1983 int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139;
1984
1985 if (put_bits_count(&s->pb) > max_size &&
1986 s->lambda < m->lmax) {
1987 m->next_lambda = FFMAX(s->lambda + min_step, s->lambda *
1988 (s->c.qscale + 1) / s->c.qscale);
1989 if (s->adaptive_quant) {
1990 for (int i = 0; i < s->c.mb_height * s->c.mb_stride; i++)
1991 s->lambda_table[i] =
1992 FFMAX(s->lambda_table[i] + min_step,
1993 s->lambda_table[i] * (s->c.qscale + 1) /
1994 s->c.qscale);
1995 }
1996 s->c.mb_skipped = 0; // done in frame_start()
1997 // done in encode_picture() so we must undo it
1998 if (s->c.pict_type == AV_PICTURE_TYPE_P) {
1999 s->c.no_rounding ^= s->flipflop_rounding;
2000 }
2001 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
2002 s->c.time_base = s->c.last_time_base;
2003 s->c.last_non_b_time = s->c.time - s->c.pp_time;
2004 }
2005 m->vbv_ignore_qmax = 1;
2006 av_log(avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n");
2007 goto vbv_retry;
2008 }
2009
2010 av_assert0(avctx->rc_max_rate);
2011 }
2012
2013 if (avctx->flags & AV_CODEC_FLAG_PASS1)
2015
2016 for (int i = 0; i < MPV_MAX_PLANES; i++)
2017 avctx->error[i] += s->encoding_error[i];
2018 ff_encode_add_stats_side_data(pkt, s->c.cur_pic.ptr->f->quality,
2019 s->encoding_error,
2021 s->c.pict_type);
2022
2023 if (avctx->flags & AV_CODEC_FLAG_PASS1)
2024 assert(put_bits_count(&s->pb) == m->header_bits + s->mv_bits +
2025 s->misc_bits + s->i_tex_bits +
2026 s->p_tex_bits);
2027 flush_put_bits(&s->pb);
2028 m->frame_bits = put_bits_count(&s->pb);
2029
2030 stuffing_count = ff_vbv_update(m, m->frame_bits);
2031 m->stuffing_bits = 8*stuffing_count;
2032 if (stuffing_count) {
2033 if (put_bytes_left(&s->pb, 0) < stuffing_count + 50) {
2034 av_log(avctx, AV_LOG_ERROR, "stuffing too large\n");
2035 return -1;
2036 }
2037
2038 switch (s->c.codec_id) {
2041 while (stuffing_count--) {
2042 put_bits(&s->pb, 8, 0);
2043 }
2044 break;
2045 case AV_CODEC_ID_MPEG4:
2046 put_bits(&s->pb, 16, 0);
2047 put_bits(&s->pb, 16, 0x1C3);
2048 stuffing_count -= 4;
2049 while (stuffing_count--) {
2050 put_bits(&s->pb, 8, 0xFF);
2051 }
2052 break;
2053 default:
2054 av_log(avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2055 m->stuffing_bits = 0;
2056 }
2057 flush_put_bits(&s->pb);
2058 m->frame_bits = put_bits_count(&s->pb);
2059 }
2060
2061 /* update MPEG-1/2 vbv_delay for CBR */
2062 if (avctx->rc_max_rate &&
2063 avctx->rc_min_rate == avctx->rc_max_rate &&
2064 s->c.out_format == FMT_MPEG1 &&
2065 90000LL * (avctx->rc_buffer_size - 1) <=
2066 avctx->rc_max_rate * 0xFFFFLL) {
2067 AVCPBProperties *props;
2068 size_t props_size;
2069
2070 int vbv_delay, min_delay;
2071 double inbits = avctx->rc_max_rate *
2072 av_q2d(avctx->time_base);
2073 int minbits = m->frame_bits - 8 *
2074 (m->vbv_delay_pos - 1);
2075 double bits = m->rc_context.buffer_index + minbits - inbits;
2076 uint8_t *const vbv_delay_ptr = s->pb.buf + m->vbv_delay_pos;
2077
2078 if (bits < 0)
2079 av_log(avctx, AV_LOG_ERROR,
2080 "Internal error, negative bits\n");
2081
2082 av_assert1(s->c.repeat_first_field == 0);
2083
2084 vbv_delay = bits * 90000 / avctx->rc_max_rate;
2085 min_delay = (minbits * 90000LL + avctx->rc_max_rate - 1) /
2086 avctx->rc_max_rate;
2087
2088 vbv_delay = FFMAX(vbv_delay, min_delay);
2089
2090 av_assert0(vbv_delay < 0xFFFF);
2091
2092 vbv_delay_ptr[0] &= 0xF8;
2093 vbv_delay_ptr[0] |= vbv_delay >> 13;
2094 vbv_delay_ptr[1] = vbv_delay >> 5;
2095 vbv_delay_ptr[2] &= 0x07;
2096 vbv_delay_ptr[2] |= vbv_delay << 3;
2097
2098 props = av_cpb_properties_alloc(&props_size);
2099 if (!props)
2100 return AVERROR(ENOMEM);
2101 props->vbv_delay = vbv_delay * 300;
2102
2104 (uint8_t*)props, props_size);
2105 if (ret < 0) {
2106 av_freep(&props);
2107 return ret;
2108 }
2109 }
2110 m->total_bits += m->frame_bits;
2111
2112 pkt->pts = s->c.cur_pic.ptr->f->pts;
2113 pkt->duration = s->c.cur_pic.ptr->f->duration;
2114 if (!s->c.low_delay && s->c.pict_type != AV_PICTURE_TYPE_B) {
2115 if (!s->c.cur_pic.ptr->coded_picture_number)
2116 pkt->dts = pkt->pts - m->dts_delta;
2117 else
2118 pkt->dts = m->reordered_pts;
2119 m->reordered_pts = pkt->pts;
2120 } else
2121 pkt->dts = pkt->pts;
2122
2123 // the no-delay case is handled in generic code
2124 if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY) {
2125 ret = ff_encode_reordered_opaque(avctx, pkt, s->c.cur_pic.ptr->f);
2126 if (ret < 0)
2127 return ret;
2128 }
2129
2130 if (s->c.cur_pic.ptr->f->flags & AV_FRAME_FLAG_KEY)
2131 pkt->flags |= AV_PKT_FLAG_KEY;
2132 if (s->mb_info)
2134 } else {
2135 m->frame_bits = 0;
2136 }
2137
2138 ff_mpv_unref_picture(&s->c.cur_pic);
2139
2140 av_assert1((m->frame_bits & 7) == 0);
2141
2142 pkt->size = m->frame_bits / 8;
2143 *got_packet = !!pkt->size;
2144 return 0;
2145}
2146
2148 int n, int threshold)
2149{
2150 static const char tab[64] = {
2151 3, 2, 2, 1, 1, 1, 1, 1,
2152 1, 1, 1, 1, 1, 1, 1, 1,
2153 1, 1, 1, 1, 1, 1, 1, 1,
2154 0, 0, 0, 0, 0, 0, 0, 0,
2155 0, 0, 0, 0, 0, 0, 0, 0,
2156 0, 0, 0, 0, 0, 0, 0, 0,
2157 0, 0, 0, 0, 0, 0, 0, 0,
2158 0, 0, 0, 0, 0, 0, 0, 0
2159 };
2160 int score = 0;
2161 int run = 0;
2162 int i;
2163 int16_t *block = s->block[n];
2164 const int last_index = s->c.block_last_index[n];
2165 int skip_dc;
2166
2167 if (threshold < 0) {
2168 skip_dc = 0;
2169 threshold = -threshold;
2170 } else
2171 skip_dc = 1;
2172
2173 /* Are all we could set to zero already zero? */
2174 if (last_index <= skip_dc - 1)
2175 return;
2176
2177 for (i = 0; i <= last_index; i++) {
2178 const int j = s->c.intra_scantable.permutated[i];
2179 const int level = FFABS(block[j]);
2180 if (level == 1) {
2181 if (skip_dc && i == 0)
2182 continue;
2183 score += tab[run];
2184 run = 0;
2185 } else if (level > 1) {
2186 return;
2187 } else {
2188 run++;
2189 }
2190 }
2191 if (score >= threshold)
2192 return;
2193 for (i = skip_dc; i <= last_index; i++) {
2194 const int j = s->c.intra_scantable.permutated[i];
2195 block[j] = 0;
2196 }
2197 if (block[0])
2198 s->c.block_last_index[n] = 0;
2199 else
2200 s->c.block_last_index[n] = -1;
2201}
2202
2203static inline void clip_coeffs(const MPVEncContext *const s, int16_t block[],
2204 int last_index)
2205{
2206 int i;
2207 const int maxlevel = s->max_qcoeff;
2208 const int minlevel = s->min_qcoeff;
2209 int overflow = 0;
2210
2211 if (s->c.mb_intra) {
2212 i = 1; // skip clipping of intra dc
2213 } else
2214 i = 0;
2215
2216 for (; i <= last_index; i++) {
2217 const int j = s->c.intra_scantable.permutated[i];
2218 int level = block[j];
2219
2220 if (level > maxlevel) {
2221 level = maxlevel;
2222 overflow++;
2223 } else if (level < minlevel) {
2224 level = minlevel;
2225 overflow++;
2226 }
2227
2228 block[j] = level;
2229 }
2230
2231 if (overflow && s->c.avctx->mb_decision == FF_MB_DECISION_SIMPLE)
2232 av_log(s->c.avctx, AV_LOG_INFO,
2233 "warning, clipping %d dct coefficients to %d..%d\n",
2234 overflow, minlevel, maxlevel);
2235}
2236
2237static void get_visual_weight(int16_t *weight, const uint8_t *ptr, int stride)
2238{
2239 int x, y;
2240 // FIXME optimize
2241 for (y = 0; y < 8; y++) {
2242 for (x = 0; x < 8; x++) {
2243 int x2, y2;
2244 int sum = 0;
2245 int sqr = 0;
2246 int count = 0;
2247
2248 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
2249 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
2250 int v = ptr[x2 + y2 * stride];
2251 sum += v;
2252 sqr += v * v;
2253 count++;
2254 }
2255 }
2256 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2257 }
2258 }
2259}
2260
2262 int motion_x, int motion_y,
2263 int mb_block_height,
2264 int mb_block_width,
2265 int mb_block_count,
2266 int chroma_x_shift,
2267 int chroma_y_shift,
2268 int chroma_format)
2269{
2270/* Interlaced DCT is only possible with MPEG-2 and MPEG-4
2271 * and neither of these encoders currently supports 444. */
2272#define INTERLACED_DCT(s) ((chroma_format == CHROMA_420 || chroma_format == CHROMA_422) && \
2273 (s)->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT)
2274 DECLARE_ALIGNED(16, int16_t, weight)[12][64];
2275 int16_t orig[12][64];
2276 const int mb_x = s->c.mb_x;
2277 const int mb_y = s->c.mb_y;
2278 int i;
2279 int skip_dct[12];
2280 int dct_offset = s->c.linesize * 8; // default for progressive frames
2281 int uv_dct_offset = s->c.uvlinesize * 8;
2282 const uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2283 ptrdiff_t wrap_y, wrap_c;
2284
2285 for (i = 0; i < mb_block_count; i++)
2286 skip_dct[i] = s->skipdct;
2287
2288 if (s->adaptive_quant) {
2289 const int last_qp = s->c.qscale;
2290 const int mb_xy = mb_x + mb_y * s->c.mb_stride;
2291
2292 s->lambda = s->lambda_table[mb_xy];
2293 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
2295
2296 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2297 s->dquant = s->c.cur_pic.qscale_table[mb_xy] - last_qp;
2298
2299 if (s->c.out_format == FMT_H263) {
2300 s->dquant = av_clip(s->dquant, -2, 2);
2301
2302 if (s->c.codec_id == AV_CODEC_ID_MPEG4) {
2303 if (!s->c.mb_intra) {
2304 if (s->c.pict_type == AV_PICTURE_TYPE_B) {
2305 if (s->dquant & 1 || s->c.mv_dir & MV_DIRECT)
2306 s->dquant = 0;
2307 }
2308 if (s->c.mv_type == MV_TYPE_8X8)
2309 s->dquant = 0;
2310 }
2311 }
2312 }
2313 }
2314 ff_set_qscale(&s->c, last_qp + s->dquant);
2315 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2316 ff_set_qscale(&s->c, s->c.qscale + s->dquant);
2317
2318 wrap_y = s->c.linesize;
2319 wrap_c = s->c.uvlinesize;
2320 ptr_y = s->new_pic->data[0] +
2321 (mb_y * 16 * wrap_y) + mb_x * 16;
2322 ptr_cb = s->new_pic->data[1] +
2323 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2324 ptr_cr = s->new_pic->data[2] +
2325 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2326
2327 if ((mb_x * 16 + 16 > s->c.width || mb_y * 16 + 16 > s->c.height) &&
2328 s->c.codec_id != AV_CODEC_ID_AMV) {
2329 uint8_t *ebuf = s->c.sc.edge_emu_buffer + 38 * wrap_y;
2330 int cw = (s->c.width + chroma_x_shift) >> chroma_x_shift;
2331 int ch = (s->c.height + chroma_y_shift) >> chroma_y_shift;
2332 s->c.vdsp.emulated_edge_mc(ebuf, ptr_y,
2333 wrap_y, wrap_y,
2334 16, 16, mb_x * 16, mb_y * 16,
2335 s->c.width, s->c.height);
2336 ptr_y = ebuf;
2337 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y, ptr_cb,
2338 wrap_c, wrap_c,
2339 mb_block_width, mb_block_height,
2340 mb_x * mb_block_width, mb_y * mb_block_height,
2341 cw, ch);
2342 ptr_cb = ebuf + 16 * wrap_y;
2343 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y + 16, ptr_cr,
2344 wrap_c, wrap_c,
2345 mb_block_width, mb_block_height,
2346 mb_x * mb_block_width, mb_y * mb_block_height,
2347 cw, ch);
2348 ptr_cr = ebuf + 16 * wrap_y + 16;
2349 }
2350
2351 if (s->c.mb_intra) {
2352 if (INTERLACED_DCT(s)) {
2353 int progressive_score, interlaced_score;
2354
2355 s->c.interlaced_dct = 0;
2356 progressive_score = s->ildct_cmp[1](s, ptr_y, NULL, wrap_y, 8) +
2357 s->ildct_cmp[1](s, ptr_y + wrap_y * 8,
2358 NULL, wrap_y, 8) - 400;
2359
2360 if (progressive_score > 0) {
2361 interlaced_score = s->ildct_cmp[1](s, ptr_y,
2362 NULL, wrap_y * 2, 8) +
2363 s->ildct_cmp[1](s, ptr_y + wrap_y,
2364 NULL, wrap_y * 2, 8);
2365 if (progressive_score > interlaced_score) {
2366 s->c.interlaced_dct = 1;
2367
2368 dct_offset = wrap_y;
2369 uv_dct_offset = wrap_c;
2370 wrap_y <<= 1;
2371 if (chroma_format == CHROMA_422 ||
2372 chroma_format == CHROMA_444)
2373 wrap_c <<= 1;
2374 }
2375 }
2376 }
2377
2378 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2379 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2380 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2381 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2382
2383 if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) {
2384 skip_dct[4] = 1;
2385 skip_dct[5] = 1;
2386 } else {
2387 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2388 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2389 if (chroma_format == CHROMA_422) {
2390 s->pdsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2391 s->pdsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2392 } else if (chroma_format == CHROMA_444) {
2393 s->pdsp.get_pixels(s->block[ 6], ptr_cb + 8, wrap_c);
2394 s->pdsp.get_pixels(s->block[ 7], ptr_cr + 8, wrap_c);
2395 s->pdsp.get_pixels(s->block[ 8], ptr_cb + uv_dct_offset, wrap_c);
2396 s->pdsp.get_pixels(s->block[ 9], ptr_cr + uv_dct_offset, wrap_c);
2397 s->pdsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2398 s->pdsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2399 }
2400 }
2401 } else {
2402 op_pixels_func (*op_pix)[4];
2403 qpel_mc_func (*op_qpix)[16];
2404 uint8_t *dest_y, *dest_cb, *dest_cr;
2405
2406 dest_y = s->c.dest[0];
2407 dest_cb = s->c.dest[1];
2408 dest_cr = s->c.dest[2];
2409
2410 if ((!s->c.no_rounding) || s->c.pict_type == AV_PICTURE_TYPE_B) {
2411 op_pix = s->c.hdsp.put_pixels_tab;
2412 op_qpix = s->c.qdsp.put_qpel_pixels_tab;
2413 } else {
2414 op_pix = s->c.hdsp.put_no_rnd_pixels_tab;
2415 op_qpix = s->c.qdsp.put_no_rnd_qpel_pixels_tab;
2416 }
2417
2418 if (s->c.mv_dir & MV_DIR_FORWARD) {
2419 ff_mpv_motion(&s->c, dest_y, dest_cb, dest_cr, 0,
2420 s->c.last_pic.data,
2421 op_pix, op_qpix);
2422 op_pix = s->c.hdsp.avg_pixels_tab;
2423 op_qpix = s->c.qdsp.avg_qpel_pixels_tab;
2424 }
2425 if (s->c.mv_dir & MV_DIR_BACKWARD) {
2426 ff_mpv_motion(&s->c, dest_y, dest_cb, dest_cr, 1,
2427 s->c.next_pic.data,
2428 op_pix, op_qpix);
2429 }
2430
2431 if (INTERLACED_DCT(s)) {
2432 int progressive_score, interlaced_score;
2433
2434 s->c.interlaced_dct = 0;
2435 progressive_score = s->ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2436 s->ildct_cmp[0](s, dest_y + wrap_y * 8,
2437 ptr_y + wrap_y * 8,
2438 wrap_y, 8) - 400;
2439
2440 if (s->c.avctx->ildct_cmp == FF_CMP_VSSE)
2441 progressive_score -= 400;
2442
2443 if (progressive_score > 0) {
2444 interlaced_score = s->ildct_cmp[0](s, dest_y, ptr_y,
2445 wrap_y * 2, 8) +
2446 s->ildct_cmp[0](s, dest_y + wrap_y,
2447 ptr_y + wrap_y,
2448 wrap_y * 2, 8);
2449
2450 if (progressive_score > interlaced_score) {
2451 s->c.interlaced_dct = 1;
2452
2453 dct_offset = wrap_y;
2454 uv_dct_offset = wrap_c;
2455 wrap_y <<= 1;
2456 if (chroma_format == CHROMA_422)
2457 wrap_c <<= 1;
2458 }
2459 }
2460 }
2461
2462 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2463 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2464 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2465 dest_y + dct_offset, wrap_y);
2466 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2467 dest_y + dct_offset + 8, wrap_y);
2468
2469 if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) {
2470 skip_dct[4] = 1;
2471 skip_dct[5] = 1;
2472 } else {
2473 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2474 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2475 if (!chroma_y_shift) { /* 422 */
2476 s->pdsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
2477 dest_cb + uv_dct_offset, wrap_c);
2478 s->pdsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
2479 dest_cr + uv_dct_offset, wrap_c);
2480 }
2481 }
2482 /* pre quantization */
2483 if (s->mc_mb_var[s->c.mb_stride * mb_y + mb_x] < 2 * s->c.qscale * s->c.qscale) {
2484 // FIXME optimize
2485 if (s->sad_cmp[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->c.qscale)
2486 skip_dct[0] = 1;
2487 if (s->sad_cmp[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->c.qscale)
2488 skip_dct[1] = 1;
2489 if (s->sad_cmp[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2490 wrap_y, 8) < 20 * s->c.qscale)
2491 skip_dct[2] = 1;
2492 if (s->sad_cmp[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2493 wrap_y, 8) < 20 * s->c.qscale)
2494 skip_dct[3] = 1;
2495 if (s->sad_cmp[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->c.qscale)
2496 skip_dct[4] = 1;
2497 if (s->sad_cmp[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->c.qscale)
2498 skip_dct[5] = 1;
2499 if (!chroma_y_shift) { /* 422 */
2500 if (s->sad_cmp[1](NULL, ptr_cb + uv_dct_offset,
2501 dest_cb + uv_dct_offset,
2502 wrap_c, 8) < 20 * s->c.qscale)
2503 skip_dct[6] = 1;
2504 if (s->sad_cmp[1](NULL, ptr_cr + uv_dct_offset,
2505 dest_cr + uv_dct_offset,
2506 wrap_c, 8) < 20 * s->c.qscale)
2507 skip_dct[7] = 1;
2508 }
2509 }
2510 }
2511
2512 if (s->quantizer_noise_shaping) {
2513 if (!skip_dct[0])
2514 get_visual_weight(weight[0], ptr_y , wrap_y);
2515 if (!skip_dct[1])
2516 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2517 if (!skip_dct[2])
2518 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2519 if (!skip_dct[3])
2520 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2521 if (!skip_dct[4])
2522 get_visual_weight(weight[4], ptr_cb , wrap_c);
2523 if (!skip_dct[5])
2524 get_visual_weight(weight[5], ptr_cr , wrap_c);
2525 if (!chroma_y_shift) { /* 422 */
2526 if (!skip_dct[6])
2527 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2528 wrap_c);
2529 if (!skip_dct[7])
2530 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2531 wrap_c);
2532 }
2533 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2534 }
2535
2536 /* DCT & quantize */
2537 av_assert2(s->c.out_format != FMT_MJPEG || s->c.qscale == 8);
2538 {
2539 for (i = 0; i < mb_block_count; i++) {
2540 if (!skip_dct[i]) {
2541 int overflow;
2542 s->c.block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->c.qscale, &overflow);
2543 // FIXME we could decide to change to quantizer instead of
2544 // clipping
2545 // JS: I don't think that would be a good idea it could lower
2546 // quality instead of improve it. Just INTRADC clipping
2547 // deserves changes in quantizer
2548 if (overflow)
2549 clip_coeffs(s, s->block[i], s->c.block_last_index[i]);
2550 } else
2551 s->c.block_last_index[i] = -1;
2552 }
2553 if (s->quantizer_noise_shaping) {
2554 for (i = 0; i < mb_block_count; i++) {
2555 if (!skip_dct[i]) {
2556 s->c.block_last_index[i] =
2557 dct_quantize_refine(s, s->block[i], weight[i],
2558 orig[i], i, s->c.qscale);
2559 }
2560 }
2561 }
2562
2563 if (s->luma_elim_threshold && !s->c.mb_intra)
2564 for (i = 0; i < 4; i++)
2565 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2566 if (s->chroma_elim_threshold && !s->c.mb_intra)
2567 for (i = 4; i < mb_block_count; i++)
2568 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2569
2570 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2571 for (i = 0; i < mb_block_count; i++) {
2572 if (s->c.block_last_index[i] == -1)
2573 s->coded_score[i] = INT_MAX / 256;
2574 }
2575 }
2576 }
2577
2578 if ((s->c.avctx->flags & AV_CODEC_FLAG_GRAY) && s->c.mb_intra) {
2579 s->c.block_last_index[4] =
2580 s->c.block_last_index[5] = 0;
2581 s->block[4][0] =
2582 s->block[5][0] = (1024 + s->c.c_dc_scale / 2) / s->c.c_dc_scale;
2583 if (!chroma_y_shift) { /* 422 / 444 */
2584 for (i=6; i<12; i++) {
2585 s->c.block_last_index[i] = 0;
2586 s->block[i][0] = s->block[4][0];
2587 }
2588 }
2589 }
2590
2591 // non c quantize code returns incorrect block_last_index FIXME
2592 if (s->c.alternate_scan && s->dct_quantize != dct_quantize_c) {
2593 for (i = 0; i < mb_block_count; i++) {
2594 int j;
2595 if (s->c.block_last_index[i] > 0) {
2596 for (j = 63; j > 0; j--) {
2597 if (s->block[i][s->c.intra_scantable.permutated[j]])
2598 break;
2599 }
2600 s->c.block_last_index[i] = j;
2601 }
2602 }
2603 }
2604
2605 s->encode_mb(s, s->block, motion_x, motion_y);
2606}
2607
2608static void encode_mb(MPVEncContext *const s, int motion_x, int motion_y)
2609{
2610 if (s->c.chroma_format == CHROMA_420)
2611 encode_mb_internal(s, motion_x, motion_y, 8, 8, 6, 1, 1, CHROMA_420);
2612 else if (s->c.chroma_format == CHROMA_422)
2613 encode_mb_internal(s, motion_x, motion_y, 16, 8, 8, 1, 0, CHROMA_422);
2614 else
2615 encode_mb_internal(s, motion_x, motion_y, 16, 16, 12, 0, 0, CHROMA_444);
2616}
2617
2636
2637#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE) \
2638static inline void BEFORE ##_context_before_encode(DST_TYPE *const d, \
2639 const SRC_TYPE *const s) \
2640{ \
2641 /* FIXME is memcpy faster than a loop? */ \
2642 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2643 \
2644 /* MPEG-1 */ \
2645 d->mb_skip_run = s->mb_skip_run; \
2646 for (int i = 0; i < 3; i++) \
2647 d->last_dc[i] = s->last_dc[i]; \
2648 \
2649 /* statistics */ \
2650 d->mv_bits = s->mv_bits; \
2651 d->i_tex_bits = s->i_tex_bits; \
2652 d->p_tex_bits = s->p_tex_bits; \
2653 d->i_count = s->i_count; \
2654 d->misc_bits = s->misc_bits; \
2655 d->last_bits = 0; \
2656 \
2657 d->c.mb_skipped = 0; \
2658 d->c.qscale = s->c.qscale; \
2659 d->dquant = s->dquant; \
2660 \
2661 d->esc3_level_length = s->esc3_level_length; \
2662} \
2663 \
2664static inline void AFTER ## _context_after_encode(DST_TYPE *const d, \
2665 const SRC_TYPE *const s, \
2666 int data_partitioning) \
2667{ \
2668 /* FIXME is memcpy faster than a loop? */ \
2669 memcpy(d->c.mv, s->c.mv, 2*4*2*sizeof(int)); \
2670 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2671 \
2672 /* MPEG-1 */ \
2673 d->mb_skip_run = s->mb_skip_run; \
2674 for (int i = 0; i < 3; i++) \
2675 d->last_dc[i] = s->last_dc[i]; \
2676 \
2677 /* statistics */ \
2678 d->mv_bits = s->mv_bits; \
2679 d->i_tex_bits = s->i_tex_bits; \
2680 d->p_tex_bits = s->p_tex_bits; \
2681 d->i_count = s->i_count; \
2682 d->misc_bits = s->misc_bits; \
2683 \
2684 d->c.mb_intra = s->c.mb_intra; \
2685 d->c.mb_skipped = s->c.mb_skipped; \
2686 d->c.mv_type = s->c.mv_type; \
2687 d->c.mv_dir = s->c.mv_dir; \
2688 d->pb = s->pb; \
2689 if (data_partitioning) { \
2690 d->pb2 = s->pb2; \
2691 d->tex_pb = s->tex_pb; \
2692 } \
2693 d->block = s->block; \
2694 for (int i = 0; i < 8; i++) \
2695 d->c.block_last_index[i] = s->c.block_last_index[i]; \
2696 d->c.interlaced_dct = s->c.interlaced_dct; \
2697 d->c.qscale = s->c.qscale; \
2698 \
2699 d->esc3_level_length = s->esc3_level_length; \
2700}
2701
2702COPY_CONTEXT(backup, save, MBBackup, MPVEncContext)
2703COPY_CONTEXT(reset, store, MPVEncContext, MBBackup)
2704
2705static void encode_mb_hq(MPVEncContext *const s, MBBackup *const backup, MBBackup *const best,
2706 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2707 int *dmin, int *next_block, int motion_x, int motion_y)
2708{
2709 int score;
2710 uint8_t *dest_backup[3];
2711
2712 reset_context_before_encode(s, backup);
2713
2714 s->block = s->blocks[*next_block];
2715 s->pb = pb[*next_block];
2716 if (s->data_partitioning) {
2717 s->pb2 = pb2 [*next_block];
2718 s->tex_pb= tex_pb[*next_block];
2719 }
2720
2721 if(*next_block){
2722 memcpy(dest_backup, s->c.dest, sizeof(s->c.dest));
2723 s->c.dest[0] = s->c.sc.rd_scratchpad;
2724 s->c.dest[1] = s->c.sc.rd_scratchpad + 16*s->c.linesize;
2725 s->c.dest[2] = s->c.sc.rd_scratchpad + 16*s->c.linesize + 8;
2726 av_assert0(s->c.linesize >= 32); //FIXME
2727 }
2728
2729 encode_mb(s, motion_x, motion_y);
2730
2731 score= put_bits_count(&s->pb);
2732 if (s->data_partitioning) {
2733 score+= put_bits_count(&s->pb2);
2734 score+= put_bits_count(&s->tex_pb);
2735 }
2736
2737 if (s->c.avctx->mb_decision == FF_MB_DECISION_RD) {
2738 mpv_reconstruct_mb(s, s->block);
2739
2740 score *= s->lambda2;
2741 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2742 }
2743
2744 if(*next_block){
2745 memcpy(s->c.dest, dest_backup, sizeof(s->c.dest));
2746 }
2747
2748 if(score<*dmin){
2749 *dmin= score;
2750 *next_block^=1;
2751
2752 save_context_after_encode(best, s, s->data_partitioning);
2753 }
2754}
2755
2756static int sse(const MPVEncContext *const s, const uint8_t *src1, const uint8_t *src2, int w, int h, int stride)
2757{
2758 const uint32_t *sq = ff_square_tab + 256;
2759 int acc=0;
2760 int x,y;
2761
2762 if(w==16 && h==16)
2763 return s->sse_cmp[0](NULL, src1, src2, stride, 16);
2764 else if(w==8 && h==8)
2765 return s->sse_cmp[1](NULL, src1, src2, stride, 8);
2766
2767 for(y=0; y<h; y++){
2768 for(x=0; x<w; x++){
2769 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2770 }
2771 }
2772
2773 av_assert2(acc>=0);
2774
2775 return acc;
2776}
2777
2778static int sse_mb(MPVEncContext *const s)
2779{
2780 int w= 16;
2781 int h= 16;
2782 int chroma_mb_w = w >> s->c.chroma_x_shift;
2783 int chroma_mb_h = h >> s->c.chroma_y_shift;
2784
2785 if (s->c.mb_x*16 + 16 > s->c.width ) w = s->c.width - s->c.mb_x*16;
2786 if (s->c.mb_y*16 + 16 > s->c.height) h = s->c.height- s->c.mb_y*16;
2787
2788 if(w==16 && h==16)
2789 return s->n_sse_cmp[0](s, s->new_pic->data[0] + s->c.mb_x * 16 + s->c.mb_y * s->c.linesize * 16,
2790 s->c.dest[0], s->c.linesize, 16) +
2791 s->n_sse_cmp[1](s, s->new_pic->data[1] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2792 s->c.dest[1], s->c.uvlinesize, chroma_mb_h) +
2793 s->n_sse_cmp[1](s, s->new_pic->data[2] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2794 s->c.dest[2], s->c.uvlinesize, chroma_mb_h);
2795 else
2796 return sse(s, s->new_pic->data[0] + s->c.mb_x * 16 + s->c.mb_y * s->c.linesize * 16,
2797 s->c.dest[0], w, h, s->c.linesize) +
2798 sse(s, s->new_pic->data[1] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2799 s->c.dest[1], w >> s->c.chroma_x_shift, h >> s->c.chroma_y_shift, s->c.uvlinesize) +
2800 sse(s, s->new_pic->data[2] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2801 s->c.dest[2], w >> s->c.chroma_x_shift, h >> s->c.chroma_y_shift, s->c.uvlinesize);
2802}
2803
2805 MPVEncContext *const s = *(void**)arg;
2806
2807
2808 s->me.pre_pass = 1;
2809 s->me.dia_size = s->c.avctx->pre_dia_size;
2810 s->c.first_slice_line = 1;
2811 for (s->c.mb_y = s->c.end_mb_y - 1; s->c.mb_y >= s->c.start_mb_y; s->c.mb_y--) {
2812 for (s->c.mb_x = s->c.mb_width - 1; s->c.mb_x >=0 ; s->c.mb_x--)
2813 ff_pre_estimate_p_frame_motion(s, s->c.mb_x, s->c.mb_y);
2814 s->c.first_slice_line = 0;
2815 }
2816
2817 s->me.pre_pass = 0;
2818
2819 return 0;
2820}
2821
2823 MPVEncContext *const s = *(void**)arg;
2824
2825 s->me.dia_size = s->c.avctx->dia_size;
2826 s->c.first_slice_line = 1;
2827 for (s->c.mb_y = s->c.start_mb_y; s->c.mb_y < s->c.end_mb_y; s->c.mb_y++) {
2828 s->c.mb_x = 0; //for block init below
2830 for (s->c.mb_x = 0; s->c.mb_x < s->c.mb_width; s->c.mb_x++) {
2831 s->c.block_index[0] += 2;
2832 s->c.block_index[1] += 2;
2833 s->c.block_index[2] += 2;
2834 s->c.block_index[3] += 2;
2835
2836 /* compute motion vector & mb_type and store in context */
2837 if (s->c.pict_type == AV_PICTURE_TYPE_B)
2838 ff_estimate_b_frame_motion(s, s->c.mb_x, s->c.mb_y);
2839 else
2840 ff_estimate_p_frame_motion(s, s->c.mb_x, s->c.mb_y);
2841 }
2842 s->c.first_slice_line = 0;
2843 }
2844 return 0;
2845}
2846
2847static int mb_var_thread(AVCodecContext *c, void *arg){
2848 MPVEncContext *const s = *(void**)arg;
2849
2850 for (int mb_y = s->c.start_mb_y; mb_y < s->c.end_mb_y; mb_y++) {
2851 for (int mb_x = 0; mb_x < s->c.mb_width; mb_x++) {
2852 int xx = mb_x * 16;
2853 int yy = mb_y * 16;
2854 const uint8_t *pix = s->new_pic->data[0] + (yy * s->c.linesize) + xx;
2855 int varc;
2856 int sum = s->mpvencdsp.pix_sum(pix, s->c.linesize);
2857
2858 varc = (s->mpvencdsp.pix_norm1(pix, s->c.linesize) -
2859 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2860
2861 s->mb_var [s->c.mb_stride * mb_y + mb_x] = varc;
2862 s->mb_mean[s->c.mb_stride * mb_y + mb_x] = (sum+128)>>8;
2863 s->me.mb_var_sum_temp += varc;
2864 }
2865 }
2866 return 0;
2867}
2868
2870{
2871 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4) {
2872 if (s->partitioned_frame)
2874
2875 ff_mpeg4_stuffing(&s->pb);
2876 } else if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
2877 s->c.out_format == FMT_MJPEG) {
2879 } else if (CONFIG_SPEEDHQ_ENCODER && s->c.out_format == FMT_SPEEDHQ) {
2881 }
2882
2883 flush_put_bits(&s->pb);
2884
2885 if ((s->c.avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2886 s->misc_bits+= get_bits_diff(s);
2887}
2888
2889static void write_mb_info(MPVEncContext *const s)
2890{
2891 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2892 int offset = put_bits_count(&s->pb);
2893 int mba = s->c.mb_x + s->c.mb_width * (s->c.mb_y % s->gob_index);
2894 int gobn = s->c.mb_y / s->gob_index;
2895 int pred_x, pred_y;
2896 if (CONFIG_H263_ENCODER)
2897 ff_h263_pred_motion(&s->c, 0, 0, &pred_x, &pred_y);
2898 bytestream_put_le32(&ptr, offset);
2899 bytestream_put_byte(&ptr, s->c.qscale);
2900 bytestream_put_byte(&ptr, gobn);
2901 bytestream_put_le16(&ptr, mba);
2902 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2903 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2904 /* 4MV not implemented */
2905 bytestream_put_byte(&ptr, 0); /* hmv2 */
2906 bytestream_put_byte(&ptr, 0); /* vmv2 */
2907}
2908
2909static void update_mb_info(MPVEncContext *const s)
2910{
2911 if (!s->mb_info)
2912 return;
2913 if (put_bytes_count(&s->pb, 0) - s->prev_mb_info >= s->mb_info) {
2914 s->mb_info_size += 12;
2915 s->prev_mb_info = s->last_mb_info;
2916 }
2917
2918 s->last_mb_info = put_bytes_count(&s->pb, 0);
2919 if (!s->mb_info_size)
2920 s->mb_info_size += 12;
2922}
2923
2924int ff_mpv_reallocate_putbitbuffer(MPVEncContext *const s, size_t threshold, size_t size_increase)
2925{
2926 if (put_bytes_left(&s->pb, 0) < threshold
2927 && s->c.slice_context_count == 1
2928 && s->pb.buf == s->c.avctx->internal->byte_buffer) {
2929 int lastgob_pos = s->ptr_lastgob - s->pb.buf;
2930
2931 uint8_t *new_buffer = NULL;
2932 int new_buffer_size = 0;
2933
2934 if ((s->c.avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
2935 av_log(s->c.avctx, AV_LOG_ERROR, "Cannot reallocate putbit buffer\n");
2936 return AVERROR(ENOMEM);
2937 }
2938
2939 emms_c();
2940
2941 av_fast_padded_malloc(&new_buffer, &new_buffer_size,
2942 s->c.avctx->internal->byte_buffer_size + size_increase);
2943 if (!new_buffer)
2944 return AVERROR(ENOMEM);
2945
2946 memcpy(new_buffer, s->c.avctx->internal->byte_buffer, s->c.avctx->internal->byte_buffer_size);
2947 av_free(s->c.avctx->internal->byte_buffer);
2948 s->c.avctx->internal->byte_buffer = new_buffer;
2949 s->c.avctx->internal->byte_buffer_size = new_buffer_size;
2950 rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
2951 s->ptr_lastgob = s->pb.buf + lastgob_pos;
2952 }
2953 if (put_bytes_left(&s->pb, 0) < threshold)
2954 return AVERROR(EINVAL);
2955 return 0;
2956}
2957
2958static int encode_thread(AVCodecContext *c, void *arg){
2959 MPVEncContext *const s = *(void**)arg;
2960 int chr_h = 16 >> s->c.chroma_y_shift;
2961 int i;
2962 MBBackup best_s = { 0 }, backup_s;
2963 uint8_t bit_buf[2][MAX_MB_BYTES];
2964 // + 2 because ff_copy_bits() overreads
2965 uint8_t bit_buf2[2][MAX_PB2_MB_SIZE + 2];
2966 uint8_t bit_buf_tex[2][MAX_AC_TEX_MB_SIZE + 2];
2967 PutBitContext pb[2], pb2[2], tex_pb[2];
2968
2969 for(i=0; i<2; i++){
2970 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2971 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_PB2_MB_SIZE);
2972 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_AC_TEX_MB_SIZE);
2973 }
2974
2975 s->last_bits= put_bits_count(&s->pb);
2976 s->mv_bits=0;
2977 s->misc_bits=0;
2978 s->i_tex_bits=0;
2979 s->p_tex_bits=0;
2980 s->i_count=0;
2981
2982 for(i=0; i<3; i++){
2983 /* init last dc values */
2984 /* note: quant matrix value (8) is implied here */
2985 s->last_dc[i] = 128 << s->c.intra_dc_precision;
2986
2987 s->encoding_error[i] = 0;
2988 }
2989 if (s->c.codec_id == AV_CODEC_ID_AMV) {
2990 s->last_dc[0] = 128 * 8 / 13;
2991 s->last_dc[1] = 128 * 8 / 14;
2992 s->last_dc[2] = 128 * 8 / 14;
2993#if CONFIG_MPEG4_ENCODER
2994 } else if (s->partitioned_frame) {
2995 av_assert1(s->c.codec_id == AV_CODEC_ID_MPEG4);
2997#endif
2998 }
2999 s->mb_skip_run = 0;
3000 memset(s->c.last_mv, 0, sizeof(s->c.last_mv));
3001
3002 s->last_mv_dir = 0;
3003
3004 s->c.resync_mb_x = 0;
3005 s->c.resync_mb_y = 0;
3006 s->c.first_slice_line = 1;
3007 s->ptr_lastgob = s->pb.buf;
3008 for (int mb_y_order = s->c.start_mb_y; mb_y_order < s->c.end_mb_y; mb_y_order++) {
3009 int mb_y;
3010 if (CONFIG_SPEEDHQ_ENCODER && s->c.codec_id == AV_CODEC_ID_SPEEDHQ) {
3011 int first_in_slice;
3012 mb_y = ff_speedhq_mb_y_order_to_mb(mb_y_order, s->c.mb_height, &first_in_slice);
3013 if (first_in_slice && mb_y_order != s->c.start_mb_y)
3015 s->last_dc[0] = s->last_dc[1] = s->last_dc[2] = 1024;
3016 } else {
3017 mb_y = mb_y_order;
3018 }
3019 s->c.mb_x = 0;
3020 s->c.mb_y = mb_y;
3021
3022 ff_set_qscale(&s->c, s->c.qscale);
3024
3025 for (int mb_x = 0; mb_x < s->c.mb_width; mb_x++) {
3026 int mb_type, xy;
3027// int d;
3028 int dmin= INT_MAX;
3029 int dir;
3030 int size_increase = s->c.avctx->internal->byte_buffer_size/4
3031 + s->c.mb_width*MAX_MB_BYTES;
3032
3034 if (put_bytes_left(&s->pb, 0) < MAX_MB_BYTES){
3035 av_log(s->c.avctx, AV_LOG_ERROR, "encoded frame too large\n");
3036 return -1;
3037 }
3038 if (s->data_partitioning) {
3039 if (put_bytes_left(&s->pb2, 0) < MAX_MB_BYTES ||
3040 put_bytes_left(&s->tex_pb, 0) < MAX_MB_BYTES) {
3041 av_log(s->c.avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
3042 return -1;
3043 }
3044 }
3045
3046 s->c.mb_x = mb_x;
3047 s->c.mb_y = mb_y; // moved into loop, can get changed by H.261
3048 ff_update_block_index(&s->c, 8, 0, s->c.chroma_x_shift);
3049
3050 if (CONFIG_H261_ENCODER && s->c.codec_id == AV_CODEC_ID_H261)
3052 xy = s->c.mb_y * s->c.mb_stride + s->c.mb_x;
3053 mb_type = s->mb_type[xy];
3054
3055 /* write gob / video packet header */
3056 if(s->rtp_mode){
3057 int current_packet_size, is_gob_start;
3058
3059 current_packet_size = put_bytes_count(&s->pb, 1)
3060 - (s->ptr_lastgob - s->pb.buf);
3061
3062 is_gob_start = s->rtp_payload_size &&
3063 current_packet_size >= s->rtp_payload_size &&
3064 mb_y + mb_x > 0;
3065
3066 if (s->c.start_mb_y == mb_y && mb_y > 0 && mb_x == 0) is_gob_start = 1;
3067
3068 switch (s->c.codec_id) {
3069 case AV_CODEC_ID_H263:
3070 case AV_CODEC_ID_H263P:
3071 if (!s->h263_slice_structured)
3072 if (s->c.mb_x || s->c.mb_y % s->gob_index) is_gob_start = 0;
3073 break;
3075 if (s->c.mb_x == 0 && s->c.mb_y != 0) is_gob_start = 1;
3078 if (s->c.codec_id == AV_CODEC_ID_MPEG1VIDEO && s->c.mb_y >= 175 ||
3079 s->mb_skip_run)
3080 is_gob_start=0;
3081 break;
3082 case AV_CODEC_ID_MJPEG:
3083 if (s->c.mb_x == 0 && s->c.mb_y != 0) is_gob_start = 1;
3084 break;
3085 }
3086
3087 if(is_gob_start){
3088 if (s->c.start_mb_y != mb_y || mb_x != 0) {
3090
3091 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4 && s->partitioned_frame)
3093 }
3094
3095 av_assert2((put_bits_count(&s->pb)&7) == 0);
3096 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
3097
3098 if (s->error_rate && s->c.resync_mb_x + s->c.resync_mb_y > 0) {
3099 int r = put_bytes_count(&s->pb, 0) + s->picture_number + 16 + s->c.mb_x + s->c.mb_y;
3100 int d = 100 / s->error_rate;
3101 if(r % d == 0){
3102 current_packet_size=0;
3103 s->pb.buf_ptr= s->ptr_lastgob;
3104 av_assert1(put_bits_ptr(&s->pb) == s->ptr_lastgob);
3105 }
3106 }
3107
3108 switch (s->c.codec_id) {
3109 case AV_CODEC_ID_MPEG4:
3110 if (CONFIG_MPEG4_ENCODER) {
3114 }
3115 break;
3118 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
3121 }
3122 break;
3123#if CONFIG_H263P_ENCODER
3124 case AV_CODEC_ID_H263P:
3125 if (s->c.dc_val)
3128#endif
3129 case AV_CODEC_ID_H263:
3130 if (CONFIG_H263_ENCODER) {
3131 if (s->mb_info && put_bytes_count(&s->pb, 0) - s->prev_mb_info >= s->mb_info)
3132 s->mb_info_size += 12;
3133
3135 s->prev_mb_info = put_bits_count(&s->pb)/8;
3136 }
3137 break;
3138 }
3139
3140 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS1) {
3141 int bits= put_bits_count(&s->pb);
3142 s->misc_bits+= bits - s->last_bits;
3143 s->last_bits= bits;
3144 }
3145
3146 s->ptr_lastgob += current_packet_size;
3147 s->c.first_slice_line = 1;
3148 s->c.resync_mb_x = mb_x;
3149 s->c.resync_mb_y = mb_y;
3150 }
3151 }
3152
3153 if (s->c.resync_mb_x == s->c.mb_x &&
3154 s->c.resync_mb_y+1 == s->c.mb_y)
3155 s->c.first_slice_line = 0;
3156
3157 s->c.mb_skipped = 0;
3158 s->dquant=0; //only for QP_RD
3159
3161
3162 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
3163 int next_block=0;
3164 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3165
3166 backup_context_before_encode(&backup_s, s);
3167 backup_s.pb= s->pb;
3168 if (s->data_partitioning) {
3169 backup_s.pb2= s->pb2;
3170 backup_s.tex_pb= s->tex_pb;
3171 }
3172
3173 if(mb_type&CANDIDATE_MB_TYPE_INTER){
3174 s->c.mv_dir = MV_DIR_FORWARD;
3175 s->c.mv_type = MV_TYPE_16X16;
3176 s->c.mb_intra = 0;
3177 s->c.mv[0][0][0] = s->p_mv_table[xy][0];
3178 s->c.mv[0][0][1] = s->p_mv_table[xy][1];
3179 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3180 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3181 }
3182 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
3183 s->c.mv_dir = MV_DIR_FORWARD;
3184 s->c.mv_type = MV_TYPE_FIELD;
3185 s->c.mb_intra = 0;
3186 for(i=0; i<2; i++){
3187 int j = s->c.field_select[0][i] = s->p_field_select_table[i][xy];
3188 s->c.mv[0][i][0] = s->c.p_field_mv_table[i][j][xy][0];
3189 s->c.mv[0][i][1] = s->c.p_field_mv_table[i][j][xy][1];
3190 }
3191 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3192 &dmin, &next_block, 0, 0);
3193 }
3194 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
3195 s->c.mv_dir = MV_DIR_FORWARD;
3196 s->c.mv_type = MV_TYPE_16X16;
3197 s->c.mb_intra = 0;
3198 s->c.mv[0][0][0] = 0;
3199 s->c.mv[0][0][1] = 0;
3200 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3201 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3202 }
3203 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
3204 s->c.mv_dir = MV_DIR_FORWARD;
3205 s->c.mv_type = MV_TYPE_8X8;
3206 s->c.mb_intra = 0;
3207 for(i=0; i<4; i++){
3208 s->c.mv[0][i][0] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
3209 s->c.mv[0][i][1] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
3210 }
3211 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3212 &dmin, &next_block, 0, 0);
3213 }
3214 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
3215 s->c.mv_dir = MV_DIR_FORWARD;
3216 s->c.mv_type = MV_TYPE_16X16;
3217 s->c.mb_intra = 0;
3218 s->c.mv[0][0][0] = s->b_forw_mv_table[xy][0];
3219 s->c.mv[0][0][1] = s->b_forw_mv_table[xy][1];
3220 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3221 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3222 }
3223 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
3224 s->c.mv_dir = MV_DIR_BACKWARD;
3225 s->c.mv_type = MV_TYPE_16X16;
3226 s->c.mb_intra = 0;
3227 s->c.mv[1][0][0] = s->b_back_mv_table[xy][0];
3228 s->c.mv[1][0][1] = s->b_back_mv_table[xy][1];
3229 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3230 &dmin, &next_block, s->c.mv[1][0][0], s->c.mv[1][0][1]);
3231 }
3232 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
3233 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3234 s->c.mv_type = MV_TYPE_16X16;
3235 s->c.mb_intra = 0;
3236 s->c.mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3237 s->c.mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3238 s->c.mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3239 s->c.mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3240 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3241 &dmin, &next_block, 0, 0);
3242 }
3243 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
3244 s->c.mv_dir = MV_DIR_FORWARD;
3245 s->c.mv_type = MV_TYPE_FIELD;
3246 s->c.mb_intra = 0;
3247 for(i=0; i<2; i++){
3248 int j = s->c.field_select[0][i] = s->b_field_select_table[0][i][xy];
3249 s->c.mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3250 s->c.mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3251 }
3252 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3253 &dmin, &next_block, 0, 0);
3254 }
3255 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
3256 s->c.mv_dir = MV_DIR_BACKWARD;
3257 s->c.mv_type = MV_TYPE_FIELD;
3258 s->c.mb_intra = 0;
3259 for(i=0; i<2; i++){
3260 int j = s->c.field_select[1][i] = s->b_field_select_table[1][i][xy];
3261 s->c.mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3262 s->c.mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3263 }
3264 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3265 &dmin, &next_block, 0, 0);
3266 }
3267 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
3268 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3269 s->c.mv_type = MV_TYPE_FIELD;
3270 s->c.mb_intra = 0;
3271 for(dir=0; dir<2; dir++){
3272 for(i=0; i<2; i++){
3273 int j = s->c.field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3274 s->c.mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3275 s->c.mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3276 }
3277 }
3278 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3279 &dmin, &next_block, 0, 0);
3280 }
3281 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
3282 s->c.mv_dir = 0;
3283 s->c.mv_type = MV_TYPE_16X16;
3284 s->c.mb_intra = 1;
3285 s->c.mv[0][0][0] = 0;
3286 s->c.mv[0][0][1] = 0;
3287 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3288 &dmin, &next_block, 0, 0);
3289 s->c.mbintra_table[xy] = 1;
3290 }
3291
3292 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
3293 if (best_s.c.mv_type == MV_TYPE_16X16) { //FIXME move 4mv after QPRD
3294 const int last_qp = backup_s.c.qscale;
3295 int qpi, qp, dc[6];
3296 int16_t ac[6][16];
3297 const int mvdir = (best_s.c.mv_dir & MV_DIR_BACKWARD) ? 1 : 0;
3298 static const int dquant_tab[4]={-1,1,-2,2};
3299 int storecoefs = s->c.mb_intra && s->c.dc_val;
3300
3301 av_assert2(backup_s.dquant == 0);
3302
3303 //FIXME intra
3304 s->c.mv_dir = best_s.c.mv_dir;
3305 s->c.mv_type = MV_TYPE_16X16;
3306 s->c.mb_intra = best_s.c.mb_intra;
3307 s->c.mv[0][0][0] = best_s.c.mv[0][0][0];
3308 s->c.mv[0][0][1] = best_s.c.mv[0][0][1];
3309 s->c.mv[1][0][0] = best_s.c.mv[1][0][0];
3310 s->c.mv[1][0][1] = best_s.c.mv[1][0][1];
3311
3312 qpi = s->c.pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3313 for(; qpi<4; qpi++){
3314 int dquant= dquant_tab[qpi];
3315 qp= last_qp + dquant;
3316 if (qp < s->c.avctx->qmin || qp > s->c.avctx->qmax)
3317 continue;
3318 backup_s.dquant= dquant;
3319 if(storecoefs){
3320 for(i=0; i<6; i++){
3321 dc[i] = s->c.dc_val[s->c.block_index[i]];
3322 memcpy(ac[i], s->c.ac_val[s->c.block_index[i]], sizeof(*s->c.ac_val));
3323 }
3324 }
3325
3326 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3327 &dmin, &next_block, s->c.mv[mvdir][0][0], s->c.mv[mvdir][0][1]);
3328 if (best_s.c.qscale != qp) {
3329 if(storecoefs){
3330 for(i=0; i<6; i++){
3331 s->c.dc_val[s->c.block_index[i]] = dc[i];
3332 memcpy(s->c.ac_val[s->c.block_index[i]], ac[i], sizeof(*s->c.ac_val));
3333 }
3334 }
3335 }
3336 }
3337 }
3338 }
3339 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3340 int mx= s->b_direct_mv_table[xy][0];
3341 int my= s->b_direct_mv_table[xy][1];
3342
3343 backup_s.dquant = 0;
3344 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3345 s->c.mb_intra = 0;
3347 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3348 &dmin, &next_block, mx, my);
3349 }
3350 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3351 backup_s.dquant = 0;
3352 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3353 s->c.mb_intra = 0;
3354 ff_mpeg4_set_direct_mv(&s->c, 0, 0);
3355 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3356 &dmin, &next_block, 0, 0);
3357 }
3358 if (!best_s.c.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3359 int coded=0;
3360 for(i=0; i<6; i++)
3361 coded |= s->c.block_last_index[i];
3362 if(coded){
3363 int mx,my;
3364 memcpy(s->c.mv, best_s.c.mv, sizeof(s->c.mv));
3365 if (CONFIG_MPEG4_ENCODER && best_s.c.mv_dir & MV_DIRECT) {
3366 mx=my=0; //FIXME find the one we actually used
3368 } else if (best_s.c.mv_dir & MV_DIR_BACKWARD) {
3369 mx = s->c.mv[1][0][0];
3370 my = s->c.mv[1][0][1];
3371 }else{
3372 mx = s->c.mv[0][0][0];
3373 my = s->c.mv[0][0][1];
3374 }
3375
3376 s->c.mv_dir = best_s.c.mv_dir;
3377 s->c.mv_type = best_s.c.mv_type;
3378 s->c.mb_intra = 0;
3379/* s->c.mv[0][0][0] = best_s.mv[0][0][0];
3380 s->c.mv[0][0][1] = best_s.mv[0][0][1];
3381 s->c.mv[1][0][0] = best_s.mv[1][0][0];
3382 s->c.mv[1][0][1] = best_s.mv[1][0][1];*/
3383 backup_s.dquant= 0;
3384 s->skipdct=1;
3385 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3386 &dmin, &next_block, mx, my);
3387 s->skipdct=0;
3388 }
3389 }
3390
3391 store_context_after_encode(s, &best_s, s->data_partitioning);
3392
3393 pb_bits_count= put_bits_count(&s->pb);
3394 flush_put_bits(&s->pb);
3395 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3396 s->pb= backup_s.pb;
3397
3398 if (s->data_partitioning) {
3399 pb2_bits_count= put_bits_count(&s->pb2);
3400 flush_put_bits(&s->pb2);
3401 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3402 s->pb2= backup_s.pb2;
3403
3404 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3405 flush_put_bits(&s->tex_pb);
3406 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3407 s->tex_pb= backup_s.tex_pb;
3408 }
3409 s->last_bits= put_bits_count(&s->pb);
3410
3411 if (CONFIG_H263_ENCODER &&
3412 s->c.out_format == FMT_H263 && s->c.pict_type != AV_PICTURE_TYPE_B)
3414
3415 if(next_block==0){ //FIXME 16 vs linesize16
3416 s->c.hdsp.put_pixels_tab[0][0](s->c.dest[0], s->c.sc.rd_scratchpad , s->c.linesize ,16);
3417 s->c.hdsp.put_pixels_tab[1][0](s->c.dest[1], s->c.sc.rd_scratchpad + 16*s->c.linesize , s->c.uvlinesize, 8);
3418 s->c.hdsp.put_pixels_tab[1][0](s->c.dest[2], s->c.sc.rd_scratchpad + 16*s->c.linesize + 8, s->c.uvlinesize, 8);
3419 }
3420
3421 if (s->c.avctx->mb_decision == FF_MB_DECISION_BITS)
3422 mpv_reconstruct_mb(s, s->block);
3423 } else {
3424 int motion_x = 0, motion_y = 0;
3425 s->c.mv_type = MV_TYPE_16X16;
3426 // only one MB-Type possible
3427
3428 switch(mb_type){
3430 s->c.mv_dir = 0;
3431 s->c.mb_intra = 1;
3432 motion_x= s->c.mv[0][0][0] = 0;
3433 motion_y= s->c.mv[0][0][1] = 0;
3434 s->c.mbintra_table[xy] = 1;
3435 break;
3437 s->c.mv_dir = MV_DIR_FORWARD;
3438 s->c.mb_intra = 0;
3439 motion_x= s->c.mv[0][0][0] = s->p_mv_table[xy][0];
3440 motion_y= s->c.mv[0][0][1] = s->p_mv_table[xy][1];
3441 break;
3443 s->c.mv_dir = MV_DIR_FORWARD;
3444 s->c.mv_type = MV_TYPE_FIELD;
3445 s->c.mb_intra = 0;
3446 for(i=0; i<2; i++){
3447 int j = s->c.field_select[0][i] = s->p_field_select_table[i][xy];
3448 s->c.mv[0][i][0] = s->c.p_field_mv_table[i][j][xy][0];
3449 s->c.mv[0][i][1] = s->c.p_field_mv_table[i][j][xy][1];
3450 }
3451 break;
3453 s->c.mv_dir = MV_DIR_FORWARD;
3454 s->c.mv_type = MV_TYPE_8X8;
3455 s->c.mb_intra = 0;
3456 for(i=0; i<4; i++){
3457 s->c.mv[0][i][0] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
3458 s->c.mv[0][i][1] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
3459 }
3460 break;
3462 if (CONFIG_MPEG4_ENCODER) {
3464 s->c.mb_intra = 0;
3465 motion_x=s->b_direct_mv_table[xy][0];
3466 motion_y=s->b_direct_mv_table[xy][1];
3467 ff_mpeg4_set_direct_mv(&s->c, motion_x, motion_y);
3468 }
3469 break;
3471 if (CONFIG_MPEG4_ENCODER) {
3473 s->c.mb_intra = 0;
3474 ff_mpeg4_set_direct_mv(&s->c, 0, 0);
3475 }
3476 break;
3478 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3479 s->c.mb_intra = 0;
3480 s->c.mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3481 s->c.mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3482 s->c.mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3483 s->c.mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3484 break;
3486 s->c.mv_dir = MV_DIR_BACKWARD;
3487 s->c.mb_intra = 0;
3488 motion_x= s->c.mv[1][0][0] = s->b_back_mv_table[xy][0];
3489 motion_y= s->c.mv[1][0][1] = s->b_back_mv_table[xy][1];
3490 break;
3492 s->c.mv_dir = MV_DIR_FORWARD;
3493 s->c.mb_intra = 0;
3494 motion_x= s->c.mv[0][0][0] = s->b_forw_mv_table[xy][0];
3495 motion_y= s->c.mv[0][0][1] = s->b_forw_mv_table[xy][1];
3496 break;
3498 s->c.mv_dir = MV_DIR_FORWARD;
3499 s->c.mv_type = MV_TYPE_FIELD;
3500 s->c.mb_intra = 0;
3501 for(i=0; i<2; i++){
3502 int j = s->c.field_select[0][i] = s->b_field_select_table[0][i][xy];
3503 s->c.mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3504 s->c.mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3505 }
3506 break;
3508 s->c.mv_dir = MV_DIR_BACKWARD;
3509 s->c.mv_type = MV_TYPE_FIELD;
3510 s->c.mb_intra = 0;
3511 for(i=0; i<2; i++){
3512 int j = s->c.field_select[1][i] = s->b_field_select_table[1][i][xy];
3513 s->c.mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3514 s->c.mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3515 }
3516 break;
3518 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3519 s->c.mv_type = MV_TYPE_FIELD;
3520 s->c.mb_intra = 0;
3521 for(dir=0; dir<2; dir++){
3522 for(i=0; i<2; i++){
3523 int j = s->c.field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3524 s->c.mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3525 s->c.mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3526 }
3527 }
3528 break;
3529 default:
3530 av_unreachable("There is a case for every CANDIDATE_MB_TYPE_* "
3531 "except CANDIDATE_MB_TYPE_SKIPPED which is never "
3532 "the only candidate (always coupled with INTER) "
3533 "so that it never reaches this switch");
3534 }
3535
3536 encode_mb(s, motion_x, motion_y);
3537
3538 // RAL: Update last macroblock type
3539 s->last_mv_dir = s->c.mv_dir;
3540
3541 if (CONFIG_H263_ENCODER &&
3542 s->c.out_format == FMT_H263 && s->c.pict_type != AV_PICTURE_TYPE_B)
3544
3545 mpv_reconstruct_mb(s, s->block);
3546 }
3547
3548 s->c.cur_pic.qscale_table[xy] = s->c.qscale;
3549
3550 /* clean the MV table in IPS frames for direct mode in B-frames */
3551 if (s->c.mb_intra /* && I,P,S_TYPE */) {
3552 s->p_mv_table[xy][0]=0;
3553 s->p_mv_table[xy][1]=0;
3554#if CONFIG_H263_ENCODER
3555 } else if (s->c.h263_pred || s->c.h263_aic) {
3557#endif
3558 }
3559
3560 if (s->c.avctx->flags & AV_CODEC_FLAG_PSNR) {
3561 int w= 16;
3562 int h= 16;
3563
3564 if (s->c.mb_x*16 + 16 > s->c.width ) w = s->c.width - s->c.mb_x*16;
3565 if (s->c.mb_y*16 + 16 > s->c.height) h = s->c.height- s->c.mb_y*16;
3566
3567 s->encoding_error[0] += sse(
3568 s, s->new_pic->data[0] + s->c.mb_x*16 + s->c.mb_y*s->c.linesize*16,
3569 s->c.dest[0], w, h, s->c.linesize);
3570 s->encoding_error[1] += sse(
3571 s, s->new_pic->data[1] + s->c.mb_x*8 + s->c.mb_y*s->c.uvlinesize*chr_h,
3572 s->c.dest[1], w>>1, h>>s->c.chroma_y_shift, s->c.uvlinesize);
3573 s->encoding_error[2] += sse(
3574 s, s->new_pic->data[2] + s->c.mb_x*8 + s->c.mb_y*s->c.uvlinesize*chr_h,
3575 s->c.dest[2], w>>1, h>>s->c.chroma_y_shift, s->c.uvlinesize);
3576 }
3577 if (s->loop_filter) {
3578 if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263)
3580 }
3581 ff_dlog(s->c.avctx, "MB %d %d bits\n",
3582 s->c.mb_x + s->c.mb_y * s->c.mb_stride, put_bits_count(&s->pb));
3583 }
3584 }
3585
3586#if CONFIG_MSMPEG4ENC
3587 //not beautiful here but we must write it before flushing so it has to be here
3588 if (s->c.msmpeg4_version != MSMP4_UNUSED && s->c.msmpeg4_version < MSMP4_WMV1 &&
3589 s->c.pict_type == AV_PICTURE_TYPE_I)
3591#endif
3592
3594
3595 return 0;
3596}
3597
3598#define ADD(field) dst->field += src->field;
3599#define MERGE(field) dst->field += src->field; src->field=0
3601{
3602 ADD(me.scene_change_score);
3603 ADD(me.mc_mb_var_sum_temp);
3604 ADD(me.mb_var_sum_temp);
3605}
3606
3608{
3609 int i;
3610
3611 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3612 MERGE(dct_count[1]);
3613 ADD(mv_bits);
3614 ADD(i_tex_bits);
3615 ADD(p_tex_bits);
3616 ADD(i_count);
3617 ADD(misc_bits);
3618 ADD(encoding_error[0]);
3619 ADD(encoding_error[1]);
3620 ADD(encoding_error[2]);
3621
3622 if (dst->dct_error_sum) {
3623 for(i=0; i<64; i++){
3624 MERGE(dct_error_sum[0][i]);
3625 MERGE(dct_error_sum[1][i]);
3626 }
3627 }
3628
3629 av_assert1(put_bits_count(&src->pb) % 8 ==0);
3630 av_assert1(put_bits_count(&dst->pb) % 8 ==0);
3631 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3632 flush_put_bits(&dst->pb);
3633}
3634
3635static int estimate_qp(MPVMainEncContext *const m, int dry_run)
3636{
3637 MPVEncContext *const s = &m->s;
3638
3639 if (m->next_lambda){
3640 s->c.cur_pic.ptr->f->quality = m->next_lambda;
3641 if(!dry_run) m->next_lambda= 0;
3642 } else if (!m->fixed_qscale) {
3643 int quality = ff_rate_estimate_qscale(m, dry_run);
3644 s->c.cur_pic.ptr->f->quality = quality;
3645 if (s->c.cur_pic.ptr->f->quality < 0)
3646 return -1;
3647 }
3648
3649 if(s->adaptive_quant){
3651
3652 switch (s->c.codec_id) {
3653 case AV_CODEC_ID_MPEG4:
3654 if (CONFIG_MPEG4_ENCODER)
3656 break;
3657 case AV_CODEC_ID_H263:
3658 case AV_CODEC_ID_H263P:
3659 case AV_CODEC_ID_FLV1:
3660 if (CONFIG_H263_ENCODER)
3662 break;
3663 }
3664
3665 s->lambda = s->lambda_table[0];
3666 //FIXME broken
3667 }else
3668 s->lambda = s->c.cur_pic.ptr->f->quality;
3669 update_qscale(m);
3670 return 0;
3671}
3672
3673/* must be called before writing the header */
3675{
3676 av_assert1(s->c.cur_pic.ptr->f->pts != AV_NOPTS_VALUE);
3677 s->c.time = s->c.cur_pic.ptr->f->pts * s->c.avctx->time_base.num;
3678
3679 if (s->c.pict_type == AV_PICTURE_TYPE_B) {
3680 s->c.pb_time = s->c.pp_time - (s->c.last_non_b_time - s->c.time);
3681 av_assert1(s->c.pb_time > 0 && s->c.pb_time < s->c.pp_time);
3682 }else{
3683 av_assert1(s->picture_number == 0 || s->c.time > s->c.last_non_b_time);
3684 s->c.pp_time = s->c.time - s->c.last_non_b_time;
3685 s->c.last_non_b_time = s->c.time;
3686 }
3687}
3688
3689static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
3690{
3691 MPVEncContext *const s = &m->s;
3692 int ret;
3693 int bits;
3694 int context_count = s->c.slice_context_count;
3695
3696 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4) {
3699 }
3700
3701// s->lambda = s->c.cur_pic.ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3702
3703 if (s->c.pict_type == AV_PICTURE_TYPE_I) {
3704 s->c.no_rounding = s->c.msmpeg4_version >= MSMP4_V3;
3705 } else if (s->c.pict_type != AV_PICTURE_TYPE_B) {
3706 s->c.no_rounding ^= s->flipflop_rounding;
3707 }
3708
3709 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS2) {
3710 ret = estimate_qp(m, 1);
3711 if (ret < 0)
3712 return ret;
3714 } else if (!(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3715 if (s->c.pict_type == AV_PICTURE_TYPE_B)
3716 s->lambda = m->last_lambda_for[s->c.pict_type];
3717 else
3718 s->lambda = m->last_lambda_for[m->last_non_b_pict_type];
3719 update_qscale(m);
3720 }
3721
3722 s->c.mb_intra = 0; //for the rate distortion & bit compare functions
3723 for (int i = 0; i < context_count; i++) {
3724 MPVEncContext *const slice = s->c.enc_contexts[i];
3725 int h = s->c.mb_height;
3726 uint8_t *start = pkt->data + (int64_t)pkt->size * slice->c.start_mb_y / h;
3727 uint8_t *end = pkt->data + (int64_t)pkt->size * slice->c. end_mb_y / h;
3728
3729 init_put_bits(&slice->pb, start, end - start);
3730
3731 if (i) {
3732 ret = ff_update_duplicate_context(&slice->c, &s->c);
3733 if (ret < 0)
3734 return ret;
3735 slice->lambda = s->lambda;
3736 slice->lambda2 = s->lambda2;
3737 }
3738 slice->me.temp = slice->me.scratchpad = slice->c.sc.scratchpad_buf;
3739 ff_me_init_pic(slice);
3740 }
3741
3742 /* Estimate motion for every MB */
3743 if (s->c.pict_type != AV_PICTURE_TYPE_I) {
3744 s->lambda = (s->lambda * m->me_penalty_compensation + 128) >> 8;
3745 s->lambda2 = (s->lambda2 * (int64_t) m->me_penalty_compensation + 128) >> 8;
3746 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
3747 if ((m->me_pre && m->last_non_b_pict_type == AV_PICTURE_TYPE_I) ||
3748 m->me_pre == 2) {
3749 s->c.avctx->execute(s->c.avctx, pre_estimate_motion_thread,
3750 &s->c.enc_contexts[0], NULL,
3751 context_count, sizeof(void*));
3752 }
3753 }
3754
3755 s->c.avctx->execute(s->c.avctx, estimate_motion_thread, &s->c.enc_contexts[0],
3756 NULL, context_count, sizeof(void*));
3757 }else /* if (s->c.pict_type == AV_PICTURE_TYPE_I) */{
3758 /* I-Frame */
3759 for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
3760 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3761
3762 if (!m->fixed_qscale) {
3763 /* finding spatial complexity for I-frame rate control */
3764 s->c.avctx->execute(s->c.avctx, mb_var_thread, &s->c.enc_contexts[0],
3765 NULL, context_count, sizeof(void*));
3766 }
3767 }
3768 for (int i = 1; i < context_count; i++)
3769 merge_context_after_me(s, s->c.enc_contexts[i]);
3770 m->mc_mb_var_sum = s->me.mc_mb_var_sum_temp;
3771 m->mb_var_sum = s->me. mb_var_sum_temp;
3772 emms_c();
3773
3774 if (s->me.scene_change_score > m->scenechange_threshold &&
3775 s->c.pict_type == AV_PICTURE_TYPE_P) {
3776 s->c.pict_type = AV_PICTURE_TYPE_I;
3777 for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
3778 s->mb_type[i] = CANDIDATE_MB_TYPE_INTRA;
3779 if (s->c.msmpeg4_version >= MSMP4_V3)
3780 s->c.no_rounding = 1;
3781 ff_dlog(s->c.avctx, "Scene change detected, encoding as I Frame %"PRId64" %"PRId64"\n",
3782 m->mb_var_sum, m->mc_mb_var_sum);
3783 }
3784
3785 if (!s->umvplus) {
3786 if (s->c.pict_type == AV_PICTURE_TYPE_P || s->c.pict_type == AV_PICTURE_TYPE_S) {
3787 s->f_code = ff_get_best_fcode(m, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3788
3789 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3790 int a,b;
3791 a = ff_get_best_fcode(m, s->c.p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3792 b = ff_get_best_fcode(m, s->c.p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3793 s->f_code = FFMAX3(s->f_code, a, b);
3794 }
3795
3797 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, !!s->intra_penalty);
3798 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3799 int j;
3800 for (int i = 0; i < 2; i++) {
3801 for(j=0; j<2; j++)
3802 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3803 s->c.p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, !!s->intra_penalty);
3804 }
3805 }
3806 } else if (s->c.pict_type == AV_PICTURE_TYPE_B) {
3807 int a, b;
3808
3809 a = ff_get_best_fcode(m, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3810 b = ff_get_best_fcode(m, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3811 s->f_code = FFMAX(a, b);
3812
3813 a = ff_get_best_fcode(m, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3814 b = ff_get_best_fcode(m, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3815 s->b_code = FFMAX(a, b);
3816
3817 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3818 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3819 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3820 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3821 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3822 int dir, j;
3823 for(dir=0; dir<2; dir++){
3824 for (int i = 0; i < 2; i++) {
3825 for(j=0; j<2; j++){
3828 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3829 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3830 }
3831 }
3832 }
3833 }
3834 }
3835 }
3836
3837 ret = estimate_qp(m, 0);
3838 if (ret < 0)
3839 return ret;
3840
3841 if (s->c.qscale < 3 && s->max_qcoeff <= 128 &&
3842 s->c.pict_type == AV_PICTURE_TYPE_I &&
3843 !(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE))
3844 s->c.qscale = 3; //reduce clipping problems
3845
3846 if (s->c.out_format == FMT_MJPEG) {
3848 (7 + s->c.qscale) / s->c.qscale, 65535);
3849 if (ret < 0)
3850 return ret;
3851
3852 if (s->c.codec_id != AV_CODEC_ID_AMV) {
3853 const uint16_t * luma_matrix = ff_mpeg1_default_intra_matrix;
3854 const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix;
3855
3856 if (s->c.avctx->intra_matrix) {
3857 chroma_matrix =
3858 luma_matrix = s->c.avctx->intra_matrix;
3859 }
3860 if (s->c.avctx->chroma_intra_matrix)
3861 chroma_matrix = s->c.avctx->chroma_intra_matrix;
3862
3863 /* for mjpeg, we do include qscale in the matrix */
3864 for (int i = 1; i < 64; i++) {
3865 int j = s->c.idsp.idct_permutation[i];
3866
3867 s->c.chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->c.qscale) >> 3);
3868 s->c. intra_matrix[j] = av_clip_uint8(( luma_matrix[i] * s->c.qscale) >> 3);
3869 }
3870 s->c.chroma_intra_matrix[0] = s->c.intra_matrix[0] = 8 >> s->c.intra_dc_precision;
3871 } else {
3872 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};
3873 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};
3874 for (int i = 1; i < 64; i++) {
3875 int j = s->c.idsp.idct_permutation[ff_zigzag_direct[i]];
3876
3877 s->c.intra_matrix[j] = sp5x_qscale_five_quant_table[0][i];
3878 s->c.chroma_intra_matrix[j] = sp5x_qscale_five_quant_table[1][i];
3879 }
3880 s->c.y_dc_scale_table = y;
3881 s->c.c_dc_scale_table = c;
3882 s->c.intra_matrix[0] = 13;
3883 s->c.chroma_intra_matrix[0] = 14;
3884 }
3885 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3886 s->c.intra_matrix, s->intra_quant_bias, 8, 8, 1);
3887 ff_convert_matrix(s, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3888 s->c.chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3889 s->c.qscale = 8;
3890 }
3891
3892 if (s->c.pict_type == AV_PICTURE_TYPE_I) {
3893 s->c.cur_pic.ptr->f->flags |= AV_FRAME_FLAG_KEY;
3894 } else {
3895 s->c.cur_pic.ptr->f->flags &= ~AV_FRAME_FLAG_KEY;
3896 }
3897 s->c.cur_pic.ptr->f->pict_type = s->c.pict_type;
3898
3899 if (s->c.cur_pic.ptr->f->flags & AV_FRAME_FLAG_KEY)
3900 m->picture_in_gop_number = 0;
3901
3902 s->c.mb_x = s->c.mb_y = 0;
3903 s->last_bits= put_bits_count(&s->pb);
3904 ret = m->encode_picture_header(m);
3905 if (ret < 0)
3906 return ret;
3907 bits= put_bits_count(&s->pb);
3908 m->header_bits = bits - s->last_bits;
3909
3910 for (int i = 1; i < context_count; i++)
3911 update_duplicate_context_after_me(s->c.enc_contexts[i], s);
3912 s->c.avctx->execute(s->c.avctx, encode_thread, &s->c.enc_contexts[0],
3913 NULL, context_count, sizeof(void*));
3914 for (int i = 1; i < context_count; i++) {
3915 if (s->pb.buf_end == s->c.enc_contexts[i]->pb.buf)
3916 set_put_bits_buffer_size(&s->pb, FFMIN(s->c.enc_contexts[i]->pb.buf_end - s->pb.buf, INT_MAX/8-BUF_BITS));
3917 merge_context_after_encode(s, s->c.enc_contexts[i]);
3918 }
3919 emms_c();
3920 return 0;
3921}
3922
3923static inline void denoise_dct(MPVEncContext *const s, int16_t block[])
3924{
3925 if (!s->dct_error_sum)
3926 return;
3927
3928 const int intra = s->c.mb_intra;
3929 s->dct_count[intra]++;
3930 s->mpvencdsp.denoise_dct(block, s->dct_error_sum[intra], s->dct_offset[intra]);
3931}
3932
3934 int16_t *block, int n,
3935 int qscale, int *overflow){
3936 const int *qmat;
3937 const uint16_t *matrix;
3938 const uint8_t *scantable;
3939 const uint8_t *perm_scantable;
3940 int max=0;
3941 unsigned int threshold1, threshold2;
3942 int bias=0;
3943 int run_tab[65];
3944 int level_tab[65];
3945 int score_tab[65];
3946 int survivor[65];
3947 int survivor_count;
3948 int last_run=0;
3949 int last_level=0;
3950 int last_score= 0;
3951 int last_i;
3952 int coeff[2][64];
3953 int coeff_count[64];
3954 int qmul, qadd, start_i, last_non_zero, i, dc;
3955 const int esc_length= s->ac_esc_length;
3956 const uint8_t *length, *last_length;
3957 const int lambda = s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3958 int mpeg2_qscale;
3959
3960 s->fdsp.fdct(block);
3961
3963
3964 qmul= qscale*16;
3965 qadd= ((qscale-1)|1)*8;
3966
3967 if (s->c.q_scale_type) mpeg2_qscale = ff_mpeg2_non_linear_qscale[qscale];
3968 else mpeg2_qscale = qscale << 1;
3969
3970 if (s->c.mb_intra) {
3971 int q;
3972 scantable = s->c.intra_scantable.scantable;
3973 perm_scantable = s->c.intra_scantable.permutated;
3974 if (!s->c.h263_aic) {
3975 if (n < 4)
3976 q = s->c.y_dc_scale;
3977 else
3978 q = s->c.c_dc_scale;
3979 q = q << 3;
3980 } else{
3981 /* For AIC we skip quant/dequant of INTRADC */
3982 q = 1 << 3;
3983 qadd=0;
3984 }
3985
3986 /* note: block[0] is assumed to be positive */
3987 block[0] = (block[0] + (q >> 1)) / q;
3988 start_i = 1;
3989 last_non_zero = 0;
3990 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3991 matrix = n < 4 ? s->c.intra_matrix : s->c.chroma_intra_matrix;
3992 if (s->mpeg_quant || s->c.out_format == FMT_MPEG1 || s->c.out_format == FMT_MJPEG)
3993 bias= 1<<(QMAT_SHIFT-1);
3994
3995 if (n > 3 && s->intra_chroma_ac_vlc_length) {
3996 length = s->intra_chroma_ac_vlc_length;
3997 last_length= s->intra_chroma_ac_vlc_last_length;
3998 } else {
3999 length = s->intra_ac_vlc_length;
4000 last_length= s->intra_ac_vlc_last_length;
4001 }
4002 } else {
4003 scantable = s->c.inter_scantable.scantable;
4004 perm_scantable = s->c.inter_scantable.permutated;
4005 start_i = 0;
4006 last_non_zero = -1;
4007 qmat = s->q_inter_matrix[qscale];
4008 matrix = s->c.inter_matrix;
4009 length = s->inter_ac_vlc_length;
4010 last_length= s->inter_ac_vlc_last_length;
4011 }
4012 last_i= start_i;
4013
4014 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4015 threshold2= (threshold1<<1);
4016
4017 for(i=63; i>=start_i; i--) {
4018 const int j = scantable[i];
4019 int64_t level = (int64_t)block[j] * qmat[j];
4020
4021 if(((uint64_t)(level+threshold1))>threshold2){
4022 last_non_zero = i;
4023 break;
4024 }
4025 }
4026
4027 for(i=start_i; i<=last_non_zero; i++) {
4028 const int j = scantable[i];
4029 int64_t level = (int64_t)block[j] * qmat[j];
4030
4031// if( bias+level >= (1<<(QMAT_SHIFT - 3))
4032// || bias-level >= (1<<(QMAT_SHIFT - 3))){
4033 if(((uint64_t)(level+threshold1))>threshold2){
4034 if(level>0){
4035 level= (bias + level)>>QMAT_SHIFT;
4036 coeff[0][i]= level;
4037 coeff[1][i]= level-1;
4038// coeff[2][k]= level-2;
4039 }else{
4040 level= (bias - level)>>QMAT_SHIFT;
4041 coeff[0][i]= -level;
4042 coeff[1][i]= -level+1;
4043// coeff[2][k]= -level+2;
4044 }
4045 coeff_count[i]= FFMIN(level, 2);
4046 av_assert2(coeff_count[i]);
4047 max |=level;
4048 }else{
4049 coeff[0][i]= (level>>31)|1;
4050 coeff_count[i]= 1;
4051 }
4052 }
4053
4054 *overflow= s->max_qcoeff < max; //overflow might have happened
4055
4056 if(last_non_zero < start_i){
4057 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
4058 return last_non_zero;
4059 }
4060
4061 score_tab[start_i]= 0;
4062 survivor[0]= start_i;
4063 survivor_count= 1;
4064
4065 for(i=start_i; i<=last_non_zero; i++){
4066 int level_index, j, zero_distortion;
4067 int dct_coeff= FFABS(block[ scantable[i] ]);
4068 int best_score=256*256*256*120;
4069
4070 if (s->fdsp.fdct == ff_fdct_ifast)
4071 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
4072 zero_distortion= dct_coeff*dct_coeff;
4073
4074 for(level_index=0; level_index < coeff_count[i]; level_index++){
4075 int distortion;
4076 int level= coeff[level_index][i];
4077 const int alevel= FFABS(level);
4078 int unquant_coeff;
4079
4081
4082 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4083 unquant_coeff= alevel*qmul + qadd;
4084 } else if (s->c.out_format == FMT_MJPEG) {
4085 j = s->c.idsp.idct_permutation[scantable[i]];
4086 unquant_coeff = alevel * matrix[j] * 8;
4087 }else{ // MPEG-1
4088 j = s->c.idsp.idct_permutation[scantable[i]]; // FIXME: optimize
4089 if (s->c.mb_intra) {
4090 unquant_coeff = (int)( alevel * mpeg2_qscale * matrix[j]) >> 4;
4091 unquant_coeff = (unquant_coeff - 1) | 1;
4092 }else{
4093 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int) matrix[j])) >> 5;
4094 unquant_coeff = (unquant_coeff - 1) | 1;
4095 }
4096 unquant_coeff<<= 3;
4097 }
4098
4099 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
4100 level+=64;
4101 if((level&(~127)) == 0){
4102 for(j=survivor_count-1; j>=0; j--){
4103 int run= i - survivor[j];
4104 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4105 score += score_tab[i-run];
4106
4107 if(score < best_score){
4108 best_score= score;
4109 run_tab[i+1]= run;
4110 level_tab[i+1]= level-64;
4111 }
4112 }
4113
4114 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4115 for(j=survivor_count-1; j>=0; j--){
4116 int run= i - survivor[j];
4117 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4118 score += score_tab[i-run];
4119 if(score < last_score){
4120 last_score= score;
4121 last_run= run;
4122 last_level= level-64;
4123 last_i= i+1;
4124 }
4125 }
4126 }
4127 }else{
4128 distortion += esc_length*lambda;
4129 for(j=survivor_count-1; j>=0; j--){
4130 int run= i - survivor[j];
4131 int score= distortion + score_tab[i-run];
4132
4133 if(score < best_score){
4134 best_score= score;
4135 run_tab[i+1]= run;
4136 level_tab[i+1]= level-64;
4137 }
4138 }
4139
4140 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4141 for(j=survivor_count-1; j>=0; j--){
4142 int run= i - survivor[j];
4143 int score= distortion + score_tab[i-run];
4144 if(score < last_score){
4145 last_score= score;
4146 last_run= run;
4147 last_level= level-64;
4148 last_i= i+1;
4149 }
4150 }
4151 }
4152 }
4153 }
4154
4155 score_tab[i+1]= best_score;
4156
4157 // Note: there is a vlc code in MPEG-4 which is 1 bit shorter then another one with a shorter run and the same level
4158 if(last_non_zero <= 27){
4159 for(; survivor_count; survivor_count--){
4160 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
4161 break;
4162 }
4163 }else{
4164 for(; survivor_count; survivor_count--){
4165 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
4166 break;
4167 }
4168 }
4169
4170 survivor[ survivor_count++ ]= i+1;
4171 }
4172
4173 if (s->c.out_format != FMT_H263 && s->c.out_format != FMT_H261) {
4174 last_score= 256*256*256*120;
4175 for(i= survivor[0]; i<=last_non_zero + 1; i++){
4176 int score= score_tab[i];
4177 if (i)
4178 score += lambda * 2; // FIXME more exact?
4179
4180 if(score < last_score){
4181 last_score= score;
4182 last_i= i;
4183 last_level= level_tab[i];
4184 last_run= run_tab[i];
4185 }
4186 }
4187 }
4188
4189 s->coded_score[n] = last_score;
4190
4191 dc= FFABS(block[0]);
4192 last_non_zero= last_i - 1;
4193 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
4194
4195 if(last_non_zero < start_i)
4196 return last_non_zero;
4197
4198 if(last_non_zero == 0 && start_i == 0){
4199 int best_level= 0;
4200 int best_score= dc * dc;
4201
4202 for(i=0; i<coeff_count[0]; i++){
4203 int level= coeff[i][0];
4204 int alevel= FFABS(level);
4205 int unquant_coeff, score, distortion;
4206
4207 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4208 unquant_coeff= (alevel*qmul + qadd)>>3;
4209 } else{ // MPEG-1
4210 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int) matrix[0])) >> 5;
4211 unquant_coeff = (unquant_coeff - 1) | 1;
4212 }
4213 unquant_coeff = (unquant_coeff + 4) >> 3;
4214 unquant_coeff<<= 3 + 3;
4215
4216 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
4217 level+=64;
4218 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
4219 else score= distortion + esc_length*lambda;
4220
4221 if(score < best_score){
4222 best_score= score;
4223 best_level= level - 64;
4224 }
4225 }
4226 block[0]= best_level;
4227 s->coded_score[n] = best_score - dc*dc;
4228 if(best_level == 0) return -1;
4229 else return last_non_zero;
4230 }
4231
4232 i= last_i;
4233 av_assert2(last_level);
4234
4235 block[ perm_scantable[last_non_zero] ]= last_level;
4236 i -= last_run + 1;
4237
4238 for(; i>start_i; i -= run_tab[i] + 1){
4239 block[ perm_scantable[i-1] ]= level_tab[i];
4240 }
4241
4242 return last_non_zero;
4243}
4244
4245static DECLARE_ALIGNED(16, int16_t, basis)[64][64];
4246
4247static void build_basis(uint8_t *perm){
4248 int i, j, x, y;
4249 emms_c();
4250 for(i=0; i<8; i++){
4251 for(j=0; j<8; j++){
4252 for(y=0; y<8; y++){
4253 for(x=0; x<8; x++){
4254 double s= 0.25*(1<<BASIS_SHIFT);
4255 int index= 8*i + j;
4256 int perm_index= perm[index];
4257 if(i==0) s*= sqrt(0.5);
4258 if(j==0) s*= sqrt(0.5);
4259 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)));
4260 }
4261 }
4262 }
4263 }
4264}
4265
4266static int dct_quantize_refine(MPVEncContext *const s, //FIXME breaks denoise?
4267 int16_t *block, int16_t *weight, int16_t *orig,
4268 int n, int qscale){
4269 DECLARE_ALIGNED(16, int16_t, rem)[64];
4270 LOCAL_ALIGNED_16(int16_t, d1, [64]);
4271 const uint8_t *scantable;
4272 const uint8_t *perm_scantable;
4273// unsigned int threshold1, threshold2;
4274// int bias=0;
4275 int run_tab[65];
4276 int prev_run=0;
4277 int prev_level=0;
4278 int qmul, qadd, start_i, last_non_zero, i, dc;
4279 const uint8_t *length;
4280 const uint8_t *last_length;
4281 int lambda;
4282 int rle_index, run, q = 1, sum; //q is only used when s->c.mb_intra is true
4283
4284 if(basis[0][0] == 0)
4285 build_basis(s->c.idsp.idct_permutation);
4286
4287 qmul= qscale*2;
4288 qadd= (qscale-1)|1;
4289 if (s->c.mb_intra) {
4290 scantable = s->c.intra_scantable.scantable;
4291 perm_scantable = s->c.intra_scantable.permutated;
4292 if (!s->c.h263_aic) {
4293 if (n < 4)
4294 q = s->c.y_dc_scale;
4295 else
4296 q = s->c.c_dc_scale;
4297 } else{
4298 /* For AIC we skip quant/dequant of INTRADC */
4299 q = 1;
4300 qadd=0;
4301 }
4302 q <<= RECON_SHIFT-3;
4303 /* note: block[0] is assumed to be positive */
4304 dc= block[0]*q;
4305// block[0] = (block[0] + (q >> 1)) / q;
4306 start_i = 1;
4307// if (s->mpeg_quant || s->c.out_format == FMT_MPEG1)
4308// bias= 1<<(QMAT_SHIFT-1);
4309 if (n > 3 && s->intra_chroma_ac_vlc_length) {
4310 length = s->intra_chroma_ac_vlc_length;
4311 last_length= s->intra_chroma_ac_vlc_last_length;
4312 } else {
4313 length = s->intra_ac_vlc_length;
4314 last_length= s->intra_ac_vlc_last_length;
4315 }
4316 } else {
4317 scantable = s->c.inter_scantable.scantable;
4318 perm_scantable = s->c.inter_scantable.permutated;
4319 dc= 0;
4320 start_i = 0;
4321 length = s->inter_ac_vlc_length;
4322 last_length= s->inter_ac_vlc_last_length;
4323 }
4324 last_non_zero = s->c.block_last_index[n];
4325
4326 dc += (1<<(RECON_SHIFT-1));
4327 for(i=0; i<64; i++){
4328 rem[i] = dc - (orig[i] << RECON_SHIFT); // FIXME use orig directly instead of copying to rem[]
4329 }
4330
4331 sum=0;
4332 for(i=0; i<64; i++){
4333 int one= 36;
4334 int qns=4;
4335 int w;
4336
4337 w= FFABS(weight[i]) + qns*one;
4338 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4339
4340 weight[i] = w;
4341// w=weight[i] = (63*qns + (w/2)) / w;
4342
4343 av_assert2(w>0);
4344 av_assert2(w<(1<<6));
4345 sum += w*w;
4346 }
4347 lambda = sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4348
4349 run=0;
4350 rle_index=0;
4351 for(i=start_i; i<=last_non_zero; i++){
4352 int j= perm_scantable[i];
4353 const int level= block[j];
4354 int coeff;
4355
4356 if(level){
4357 if(level<0) coeff= qmul*level - qadd;
4358 else coeff= qmul*level + qadd;
4359 run_tab[rle_index++]=run;
4360 run=0;
4361
4362 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4363 }else{
4364 run++;
4365 }
4366 }
4367
4368 for(;;){
4369 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4370 int best_coeff=0;
4371 int best_change=0;
4372 int run2, best_unquant_change=0, analyze_gradient;
4373 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4374
4375 if(analyze_gradient){
4376 for(i=0; i<64; i++){
4377 int w= weight[i];
4378
4379 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4380 }
4381 s->fdsp.fdct(d1);
4382 }
4383
4384 if(start_i){
4385 const int level= block[0];
4386 int change, old_coeff;
4387
4388 av_assert2(s->c.mb_intra);
4389
4390 old_coeff= q*level;
4391
4392 for(change=-1; change<=1; change+=2){
4393 int new_level= level + change;
4394 int score, new_coeff;
4395
4396 new_coeff= q*new_level;
4397 if(new_coeff >= 2048 || new_coeff < 0)
4398 continue;
4399
4400 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4401 new_coeff - old_coeff);
4402 if(score<best_score){
4403 best_score= score;
4404 best_coeff= 0;
4405 best_change= change;
4406 best_unquant_change= new_coeff - old_coeff;
4407 }
4408 }
4409 }
4410
4411 run=0;
4412 rle_index=0;
4413 run2= run_tab[rle_index++];
4414 prev_level=0;
4415 prev_run=0;
4416
4417 for(i=start_i; i<64; i++){
4418 int j= perm_scantable[i];
4419 const int level= block[j];
4420 int change, old_coeff;
4421
4422 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4423 break;
4424
4425 if(level){
4426 if(level<0) old_coeff= qmul*level - qadd;
4427 else old_coeff= qmul*level + qadd;
4428 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4429 }else{
4430 old_coeff=0;
4431 run2--;
4432 av_assert2(run2>=0 || i >= last_non_zero );
4433 }
4434
4435 for(change=-1; change<=1; change+=2){
4436 int new_level= level + change;
4437 int score, new_coeff, unquant_change;
4438
4439 score=0;
4440 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4441 continue;
4442
4443 if(new_level){
4444 if(new_level<0) new_coeff= qmul*new_level - qadd;
4445 else new_coeff= qmul*new_level + qadd;
4446 if(new_coeff >= 2048 || new_coeff <= -2048)
4447 continue;
4448 //FIXME check for overflow
4449
4450 if(level){
4451 if(level < 63 && level > -63){
4452 if(i < last_non_zero)
4453 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4454 - length[UNI_AC_ENC_INDEX(run, level+64)];
4455 else
4456 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4457 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4458 }
4459 }else{
4460 av_assert2(FFABS(new_level)==1);
4461
4462 if(analyze_gradient){
4463 int g= d1[ scantable[i] ];
4464 if(g && (g^new_level) >= 0)
4465 continue;
4466 }
4467
4468 if(i < last_non_zero){
4469 int next_i= i + run2 + 1;
4470 int next_level= block[ perm_scantable[next_i] ] + 64;
4471
4472 if(next_level&(~127))
4473 next_level= 0;
4474
4475 if(next_i < last_non_zero)
4476 score += length[UNI_AC_ENC_INDEX(run, 65)]
4477 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4478 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4479 else
4480 score += length[UNI_AC_ENC_INDEX(run, 65)]
4481 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4482 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4483 }else{
4484 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4485 if(prev_level){
4486 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4487 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4488 }
4489 }
4490 }
4491 }else{
4492 new_coeff=0;
4493 av_assert2(FFABS(level)==1);
4494
4495 if(i < last_non_zero){
4496 int next_i= i + run2 + 1;
4497 int next_level= block[ perm_scantable[next_i] ] + 64;
4498
4499 if(next_level&(~127))
4500 next_level= 0;
4501
4502 if(next_i < last_non_zero)
4503 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4504 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4505 - length[UNI_AC_ENC_INDEX(run, 65)];
4506 else
4507 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4508 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4509 - length[UNI_AC_ENC_INDEX(run, 65)];
4510 }else{
4511 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4512 if(prev_level){
4513 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4514 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4515 }
4516 }
4517 }
4518
4519 score *= lambda;
4520
4521 unquant_change= new_coeff - old_coeff;
4522 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4523
4524 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4525 unquant_change);
4526 if(score<best_score){
4527 best_score= score;
4528 best_coeff= i;
4529 best_change= change;
4530 best_unquant_change= unquant_change;
4531 }
4532 }
4533 if(level){
4534 prev_level= level + 64;
4535 if(prev_level&(~127))
4536 prev_level= 0;
4537 prev_run= run;
4538 run=0;
4539 }else{
4540 run++;
4541 }
4542 }
4543
4544 if(best_change){
4545 int j= perm_scantable[ best_coeff ];
4546
4547 block[j] += best_change;
4548
4549 if(best_coeff > last_non_zero){
4550 last_non_zero= best_coeff;
4551 av_assert2(block[j]);
4552 }else{
4553 for(; last_non_zero>=start_i; last_non_zero--){
4554 if(block[perm_scantable[last_non_zero]])
4555 break;
4556 }
4557 }
4558
4559 run=0;
4560 rle_index=0;
4561 for(i=start_i; i<=last_non_zero; i++){
4562 const int level = block[perm_scantable[i]];
4563
4564 if(level){
4565 run_tab[rle_index++]=run;
4566 run=0;
4567 }else{
4568 run++;
4569 }
4570 }
4571
4572 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4573 }else{
4574 break;
4575 }
4576 }
4577
4578 return last_non_zero;
4579}
4580
4581/**
4582 * Permute an 8x8 block according to permutation.
4583 * @param block the block which will be permuted according to
4584 * the given permutation vector
4585 * @param permutation the permutation vector
4586 * @param last the last non zero coefficient in scantable order, used to
4587 * speed the permutation up
4588 * @param scantable the used scantable, this is only used to speed the
4589 * permutation up, the block is not (inverse) permutated
4590 * to scantable order!
4591 */
4592void ff_block_permute(int16_t *block, const uint8_t *permutation,
4593 const uint8_t *scantable, int last)
4594{
4595 int i;
4596 int16_t temp[64];
4597
4598 if (last <= 0)
4599 return;
4600 //FIXME it is ok but not clean and might fail for some permutations
4601 // if (permutation[1] == 1)
4602 // return;
4603
4604 for (i = 0; i <= last; i++) {
4605 const int j = scantable[i];
4606 temp[j] = block[j];
4607 block[j] = 0;
4608 }
4609
4610 for (i = 0; i <= last; i++) {
4611 const int j = scantable[i];
4612 const int perm_j = permutation[j];
4613 block[perm_j] = temp[j];
4614 }
4615}
4616
4618 int16_t *block, int n,
4619 int qscale, int *overflow)
4620{
4621 int i, last_non_zero, q, start_i;
4622 const int *qmat;
4623 const uint8_t *scantable;
4624 int bias;
4625 int max=0;
4626 unsigned int threshold1, threshold2;
4627
4628 s->fdsp.fdct(block);
4629
4631
4632 if (s->c.mb_intra) {
4633 scantable = s->c.intra_scantable.scantable;
4634 if (!s->c.h263_aic) {
4635 if (n < 4)
4636 q = s->c.y_dc_scale;
4637 else
4638 q = s->c.c_dc_scale;
4639 q = q << 3;
4640 } else
4641 /* For AIC we skip quant/dequant of INTRADC */
4642 q = 1 << 3;
4643
4644 /* note: block[0] is assumed to be positive */
4645 block[0] = (block[0] + (q >> 1)) / q;
4646 start_i = 1;
4647 last_non_zero = 0;
4648 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4649 bias= s->intra_quant_bias*(1<<(QMAT_SHIFT - QUANT_BIAS_SHIFT));
4650 } else {
4651 scantable = s->c.inter_scantable.scantable;
4652 start_i = 0;
4653 last_non_zero = -1;
4654 qmat = s->q_inter_matrix[qscale];
4655 bias= s->inter_quant_bias*(1<<(QMAT_SHIFT - QUANT_BIAS_SHIFT));
4656 }
4657 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4658 threshold2= (threshold1<<1);
4659 for(i=63;i>=start_i;i--) {
4660 const int j = scantable[i];
4661 int64_t level = (int64_t)block[j] * qmat[j];
4662
4663 if(((uint64_t)(level+threshold1))>threshold2){
4664 last_non_zero = i;
4665 break;
4666 }else{
4667 block[j]=0;
4668 }
4669 }
4670 for(i=start_i; i<=last_non_zero; i++) {
4671 const int j = scantable[i];
4672 int64_t level = (int64_t)block[j] * qmat[j];
4673
4674// if( bias+level >= (1<<QMAT_SHIFT)
4675// || bias-level >= (1<<QMAT_SHIFT)){
4676 if(((uint64_t)(level+threshold1))>threshold2){
4677 if(level>0){
4678 level= (bias + level)>>QMAT_SHIFT;
4679 block[j]= level;
4680 }else{
4681 level= (bias - level)>>QMAT_SHIFT;
4682 block[j]= -level;
4683 }
4684 max |=level;
4685 }else{
4686 block[j]=0;
4687 }
4688 }
4689 *overflow= s->max_qcoeff < max; //overflow might have happened
4690
4691 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4692 if (s->c.idsp.perm_type != FF_IDCT_PERM_NONE)
4693 ff_block_permute(block, s->c.idsp.idct_permutation,
4694 scantable, last_non_zero);
4695
4696 return last_non_zero;
4697}
const uint16_t ff_aanscales[64]
Definition aandcttab.c:26
const uint16_t ff_inv_aanscales[64]
Definition aandcttab.c:38
AAN (Arai, Agui and Nakajima) (I)DCT tables.
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition dsp.h:67
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition dsp.h:67
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:97
static double sqr(double in)
Definition af_afwtdn.c:872
static int out_size
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition avassert.h:68
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition avassert.h:109
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define FF_CMP_VSSE
Definition avcodec.h:890
#define FF_CMP_NSSE
Definition avcodec.h:891
#define FF_MB_DECISION_RD
rate distortion
Definition avcodec.h:951
#define FF_DEBUG_DCT_COEFF
Definition avcodec.h:1399
#define FF_MB_DECISION_BITS
chooses the one which needs the fewest bits
Definition avcodec.h:950
#define FF_MB_DECISION_SIMPLE
uses mb_cmp
Definition avcodec.h:949
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
Definition bitstream.c:49
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define av_clip
Definition common.h:100
#define ROUNDED_DIV(a, b)
Definition common.h:58
#define av_clip_uint8
Definition common.h:106
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
#define max(a, b)
static int16_t block[64]
Definition dct.c:125
static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
Definition dct.c:188
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition defs.h:62
#define FF_COMPLIANCE_NORMAL
Definition defs.h:60
AVCPBProperties * av_cpb_properties_alloc(size_t *size)
Allocate a CPB properties structure and initialize its fields to default values.
Definition utils.c:982
static AVPacket * pkt
static AVFrame * frame
#define emms_c()
Definition emms.h:88
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition encode.c:62
AVCPBProperties * ff_encode_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
Definition encode.c:1039
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
Definition encode.c:1070
int ff_encode_reordered_opaque(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame)
Propagate user opaque values from the frame to avctx/pkt as needed.
Definition encode.c:280
int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame)
Allocate buffers for a frame.
Definition encode.c:989
int ff_check_codec_matrices(AVCodecContext *avctx, unsigned types, uint16_t min, uint16_t max)
Definition encode.c:1095
#define FF_MATRIX_TYPE_INTER
Definition encode.h:122
#define FF_MATRIX_TYPE_CHROMA_INTRA
Definition encode.h:123
#define FF_MATRIX_TYPE_INTRA
Check if the elements of codec context matrices (intra_matrix, inter_matrix or chroma_intra_matrix) a...
Definition encode.h:121
perm
Definition f_perms.c:75
void ff_faandct(int16_t *data)
Definition faandct.c:117
Floating point AAN DCT.
static const uint8_t bits[8]
Definition fastaudio.c:100
void ff_fdct_ifast(int16_t *data)
Definition jfdctfst.c:207
void ff_jpeg_fdct_islow_10(int16_t *data)
void ff_jpeg_fdct_islow_8(int16_t *data)
#define MAX_THREADS
#define fail
Definition test.h:479
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
Definition avcodec.h:225
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
Definition avcodec.c:145
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition avcodec.h:322
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition avcodec.h:294
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
Definition options.c:149
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_FLAG_CLOSED_GOP
Definition avcodec.h:332
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition avcodec.h:310
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
Definition avcodec.h:213
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition avcodec.h:302
#define AV_CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
Definition avcodec.h:327
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition codec.h:102
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition avcodec.h:290
#define AV_CODEC_FLAG_LOOP_FILTER
loop filter.
Definition avcodec.h:298
#define AV_CODEC_FLAG_INTERLACED_ME
interlaced motion estimation
Definition avcodec.h:331
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
Definition avcodec.h:314
#define AV_CODEC_FLAG_PSNR
error[?
Definition avcodec.h:306
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
Definition avcodec.h:217
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
Definition options.c:168
@ AV_CODEC_ID_MSMPEG4V1
Definition codec_id.h:64
@ AV_CODEC_ID_H261
Definition codec_id.h:53
@ AV_CODEC_ID_FLV1
Definition codec_id.h:71
@ AV_CODEC_ID_WMV2
Definition codec_id.h:68
@ AV_CODEC_ID_MSMPEG4V2
Definition codec_id.h:65
@ AV_CODEC_ID_WMV1
Definition codec_id.h:67
@ AV_CODEC_ID_RV10
Definition codec_id.h:55
@ AV_CODEC_ID_SPEEDHQ
Definition codec_id.h:270
@ AV_CODEC_ID_RV20
Definition codec_id.h:56
@ AV_CODEC_ID_H263
Definition codec_id.h:54
@ AV_CODEC_ID_MPEG4
Definition codec_id.h:62
@ AV_CODEC_ID_MJPEG
Definition codec_id.h:57
@ AV_CODEC_ID_MPEG1VIDEO
Definition codec_id.h:51
@ AV_CODEC_ID_H263P
Definition codec_id.h:69
@ AV_CODEC_ID_MSMPEG4V3
Definition codec_id.h:66
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition codec_id.h:52
@ AV_CODEC_ID_AMV
Definition codec_id.h:157
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
Definition encode.c:578
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Supply a raw video or audio frame to the encoder.
Definition encode.c:545
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition utils.c:53
@ AV_PKT_DATA_H263_MB_INFO
An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of structures with info about macroblo...
Definition packet.h:90
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
Definition packet.h:142
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Shrink the already allocated side data buffer.
Definition packet.c:382
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:435
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition packet.c:231
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:657
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
Definition packet.c:197
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition packet.c:63
#define FF_LAMBDA_SCALE
Definition avutil.h:225
#define FF_LAMBDA_SHIFT
Definition avutil.h:224
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition avutil.h:226
#define AVERROR_ENCODER_NOT_FOUND
Encoder not found.
Definition error.h:56
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:694
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition frame.c:206
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition frame.c:523
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_INFO
Standard information.
Definition log.h:221
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
Definition mathematics.c:37
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
Definition avutil.h:281
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition avutil.h:280
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
#define AV_STRINGIFY(s)
Definition macros.h:66
int index
Definition gxfenc.c:90
void ff_h261_reorder_mb_index(MPVEncContext *const s)
Definition h261enc.c:118
H.261 encoder header.
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Definition h263.c:182
void ff_h263_loop_filter(MpegEncContext *s)
Definition h263.c:97
static void ff_h263_clean_intra_table_entries(MpegEncContext *s, int xy)
Definition h263.h:47
const uint16_t ff_h263_format[8][2]
Definition h263data.c:236
H.263 tables.
void ff_h263_mpeg4_reset_dc(MPVEncContext *s)
void ff_h263_encode_gob_header(MPVEncContext *s, int mb_line)
void ff_clean_h263_qscales(MPVEncContext *s)
void ff_h263_encode_init(MPVMainEncContext *m)
void ff_h263_update_mb(MPVEncContext *s)
int a
const pixel * src2
#define ALIGN
Definition hashtable.c:32
void(* op_pixels_func)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Average and put pixel Widths can be 16, 8, 4 or 2.
Definition hpeldsp.h:39
@ FF_IDCT_PERM_NONE
Definition idctdsp.h:28
#define r
Definition input.c:42
#define b
Definition input.c:43
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition j2kenc.c:154
uint32_t type
Definition jpegmpfenc.c:80
unsigned offset
Definition libaomenc.c:763
static int shift(int a, int b)
Definition bonk.c:261
#define EDGE_WIDTH
Definition diracdec.c:47
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
Definition fdctdsp.c:25
common internal api header.
#define STRIDE_ALIGN
Definition internal.h:46
int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
Definition utils.c:857
const char * arg
Definition jacosubdec.c:65
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, int bits_per_raw_sample)
Definition pixblockdsp.c:87
Macro definitions for various function/variable attributes.
#define av_always_inline
Definition attributes.h:72
#define av_fallthrough
Definition attributes.h:67
#define av_cold
Definition attributes.h:117
common internal API header
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
Definition internal.h:81
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
#define lrintf(x)
Definition libm_mips.h:74
uint8_t w
Definition llvidencdsp.c:39
#define FFMAX3(a, b, c)
Definition macros.h:48
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define FFALIGN(x, a)
Definition macros.h:78
#define M_PI
Definition mathematics.h:67
const uint8_t ff_zigzag_direct[64]
Definition mathtables.c:137
#define ff_sqrt
Definition mathops.h:220
EXTERN const uint32_t ff_square_tab[512]
Definition mathops.h:35
av_cold int ff_set_cmp(const MECmpContext *c, me_cmp_func *cmp, int type, int mpvenc)
Fill the function pointer array cmp[6] with me_cmp_funcs from c based upon type.
Definition me_cmp.c:443
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
Definition me_cmp.c:961
int(* me_cmp_func)(MPVEncContext *c, const uint8_t *blk1, const uint8_t *blk2, ptrdiff_t stride, int h)
Definition me_cmp.h:45
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:370
Memory handling functions.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
#define LOCAL_ALIGNED_16(t, v,...)
int ff_mjpeg_encode_stuffing(MPVEncContext *const s)
Writes the complete JPEG frame when optimal huffman tables are enabled, otherwise writes the stuffing...
Definition mjpegenc.c:238
MJPEG encoder.
int ff_mjpeg_add_gain_map_size(AVCodecContext *avctx, struct MJpegContext *m, const AVFrame *frame, size_t *max_pkt_size)
int ff_mjpeg_add_icc_profile_size(AVCodecContext *avctx, const AVFrame *frame, size_t *max_pkt_size)
void ff_mjpeg_encode_picture_trailer(PutBitContext *pb, int header_bits)
static const uint8_t mv_bits[2][16][10]
Definition mobiclip.c:165
int ff_get_best_fcode(MPVMainEncContext *const m, const int16_t(*mv_table)[2], int type)
void ff_estimate_p_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
Definition motion_est.c:888
void ff_me_init_pic(MPVEncContext *const s)
Definition motion_est.c:371
void ff_fix_long_p_mvs(MPVEncContext *const s, int type)
void ff_estimate_b_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
int ff_pre_estimate_p_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
void ff_fix_long_mvs(MPVEncContext *const s, uint8_t *field_select_table, int field_select, int16_t(*mv_table)[2], int f_code, int type, int truncate)
av_cold int ff_me_init(MotionEstContext *c, AVCodecContext *avctx, const MECmpContext *mecc, int mpvenc)
Definition motion_est.c:309
#define MAX_MV
Definition motion_est.h:37
const uint16_t ff_mpeg1_default_intra_matrix[256]
Definition mpeg12data.c:31
const uint16_t ff_mpeg1_default_non_intra_matrix[64]
Definition mpeg12data.c:42
MPEG-1/2 tables.
static void ff_mpeg1_clean_buffers(MPVEncContext *s)
Definition mpeg12enc.h:29
void ff_mpeg1_encode_slice_header(MPVEncContext *s)
const int16_t ff_mpeg4_default_intra_matrix[64]
Definition mpeg4data.h:334
const int16_t ff_mpeg4_default_non_intra_matrix[64]
Definition mpeg4data.h:345
void ff_mpeg4_clean_buffers(MpegEncContext *s)
Definition mpeg4video.c:44
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
Definition mpeg4video.c:119
void ff_mpeg4_stuffing(PutBitContext *pbc)
add MPEG-4 stuffing bits (01...1)
void ff_mpeg4_init_partitions(MPVEncContext *const s)
void ff_clean_mpeg4_qscales(MPVEncContext *const s)
modify mb_type & qscale so that encoding is actually possible in MPEG-4
void ff_mpeg4_merge_partitions(MPVEncContext *const s)
void ff_set_mpeg4_time(MPVEncContext *const s)
void ff_mpeg4_encode_video_packet_header(MPVEncContext *const s)
@ MAX_PB2_MB_SIZE
@ MAX_AC_TEX_MB_SIZE
void ff_mpv_unref_picture(MPVWorkPicture *pic)
Definition mpegpicture.c:98
int ff_mpv_pic_check_linesize(void *logctx, const AVFrame *f, ptrdiff_t *linesizep, ptrdiff_t *uvlinesizep)
int ff_mpv_alloc_pic_accessories(AVCodecContext *avctx, MPVWorkPicture *wpic, ScratchpadContext *sc, BufferPoolContext *pools, int mb_height)
Allocate an MPVPicture's accessories (but not the AVFrame's buffer itself) and set the MPVWorkPicture...
av_cold AVRefStructPool * ff_mpv_alloc_pic_pool(int init_progress)
Allocate a pool of MPVPictures.
Definition mpegpicture.c:90
void ff_mpv_replace_picture(MPVWorkPicture *dst, const MPVWorkPicture *src)
#define MPV_MAX_PLANES
Definition mpegpicture.h:31
#define MAX_MB_BYTES
Definition mpegutils.h:35
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
Definition mpegvideo.c:359
av_cold int ff_mpv_init_duplicate_contexts(MpegEncContext *s)
Initialize an MpegEncContext's thread contexts.
Definition mpegvideo.c:99
av_cold void ff_mpv_idct_init(MpegEncContext *s)
Definition mpegvideo.c:81
av_cold void ff_mpv_common_end(MpegEncContext *s)
Definition mpegvideo.c:428
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
Definition mpegvideo.c:505
void ff_init_block_index(MpegEncContext *s)
Definition mpegvideo.c:472
av_cold void ff_mpv_common_defaults(MpegEncContext *s)
Set the given MpegEncContext to common defaults (same for encoding and decoding).
Definition mpegvideo.c:171
int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src)
Definition mpegvideo.c:139
mpegvideo header.
void ff_mpv_motion(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dir, uint8_t *const *ref_picture, const op_pixels_func(*pix_op)[4], const qpel_mc_func(*qpix_op)[16])
#define MV_DIR_BACKWARD
Definition mpegvideo.h:169
static void ff_update_block_index(MpegEncContext *s, int bits_per_raw_sample, int lowres, int chroma_x_shift)
Definition mpegvideo.h:335
#define MV_DIR_FORWARD
Definition mpegvideo.h:168
#define MV_TYPE_FIELD
2 vectors, one per field
Definition mpegvideo.h:175
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
Definition mpegvideo.h:173
#define CHROMA_420
Definition mpegvideo.h:264
#define CHROMA_444
Definition mpegvideo.h:266
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
Definition mpegvideo.h:170
#define MV_TYPE_16X16
1 vector for the whole mb
Definition mpegvideo.h:172
@ FMT_H261
Definition mpegvideo.h:56
@ FMT_MPEG1
Definition mpegvideo.h:55
@ FMT_SPEEDHQ
Definition mpegvideo.h:59
@ FMT_H263
Definition mpegvideo.h:57
@ FMT_MJPEG
Definition mpegvideo.h:58
#define CHROMA_422
Definition mpegvideo.h:265
static av_cold void mpv_encode_defaults(MPVMainEncContext *const m)
Set the given MPVEncContext to defaults for encoding.
static av_cold int init_matrices(MPVMainEncContext *const m, AVCodecContext *avctx)
static int sse(const MPVEncContext *const s, const uint8_t *src1, const uint8_t *src2, int w, int h, int stride)
static int encode_frame(AVCodecContext *c, const AVFrame *frame, AVPacket *pkt)
static int set_bframe_chain_length(MPVMainEncContext *const m)
Determines whether an input picture is discarded or not and if not determines the length of the next ...
static void merge_context_after_encode(MPVEncContext *const dst, MPVEncContext *const src)
#define QMAT_SHIFT_MMX
static int dct_quantize_c(MPVEncContext *const s, int16_t *block, int n, int qscale, int *overflow)
static void put_dct(MPVEncContext *const s, int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
static av_cold void mpv_encode_init_static(void)
static const AVOption mpv_generic_options[]
void ff_block_permute(int16_t *block, const uint8_t *permutation, const uint8_t *scantable, int last)
Permute an 8x8 block according to permutation.
#define MERGE(field)
static av_cold void init_unquantize(MPVEncContext *const s2, AVCodecContext *avctx)
static void clip_coeffs(const MPVEncContext *const s, int16_t block[], int last_index)
static int dct_quantize_refine(MPVEncContext *const s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale)
static int mb_var_thread(AVCodecContext *c, void *arg)
static int estimate_best_b_count(MPVMainEncContext *const m)
static void add_dequant_dct(MPVEncContext *const s, int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
static int estimate_motion_thread(AVCodecContext *c, void *arg)
static int skip_check(MPVMainEncContext *const m, const MPVPicture *p, const MPVPicture *ref)
const AVClass ff_mpv_enc_class
int ff_mpv_reallocate_putbitbuffer(MPVEncContext *const s, size_t threshold, size_t size_increase)
static void merge_context_after_me(MPVEncContext *const dst, MPVEncContext *const src)
#define ALLOCZ_ARRAYS(p, mult, numb)
static void encode_mb_hq(MPVEncContext *const s, MBBackup *const backup, MBBackup *const best, PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2], int *dmin, int *next_block, int motion_x, int motion_y)
av_cold void ff_dct_encode_init(MPVEncContext *const s)
static int pre_estimate_motion_thread(AVCodecContext *c, void *arg)
static int prepare_picture(MPVEncContext *const s, AVFrame *f, const AVFrame *props_frame)
Allocates new buffers for an AVFrame and copies the properties from another AVFrame.
static void encode_mb(MPVEncContext *const s, int motion_x, int motion_y)
static uint8_t default_fcode_tab[MAX_MV *2+1]
static void build_basis(uint8_t *perm)
static int sse_mb(MPVEncContext *const s)
static void update_noise_reduction(MPVMainEncContext *const m)
#define QUANT_BIAS_SHIFT
static int get_intra_count(MPVEncContext *const s, const uint8_t *src, const uint8_t *ref, int stride)
static int dct_quantize_trellis_c(MPVEncContext *const s, int16_t *block, int n, int qscale, int *overflow)
#define ADD(field)
static void dct_single_coeff_elimination(MPVEncContext *const s, int n, int threshold)
static void update_duplicate_context_after_me(MPVEncContext *const dst, const MPVEncContext *const src)
static void write_slice_end(MPVEncContext *const s)
void ff_convert_matrix(MPVEncContext *const s, int(*qmat)[64], uint16_t(*qmat16)[2][64], const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
static void get_visual_weight(int16_t *weight, const uint8_t *ptr, int stride)
static void mpv_reconstruct_mb(MPVEncContext *const s, int16_t block[12][64])
Performs dequantization and IDCT (if necessary)
static int encode_picture(MPVMainEncContext *const s, const AVPacket *pkt)
av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
static void update_mb_info(MPVEncContext *const s)
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet)
static int16_t basis[64][64]
static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx)
#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE)
static av_cold int init_buffers(MPVMainEncContext *const m)
static av_always_inline void encode_mb_internal(MPVEncContext *const s, int motion_x, int motion_y, int mb_block_height, int mb_block_width, int mb_block_count, int chroma_x_shift, int chroma_y_shift, int chroma_format)
static void write_mb_info(MPVEncContext *const s)
static void init_qscale_tab(MPVEncContext *const s)
init s->c.cur_pic.qscale_table from s->lambda_table
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
static void frame_end(MPVMainEncContext *const m)
static int select_input_picture(MPVMainEncContext *const m)
#define COPY(a)
static int encode_thread(AVCodecContext *c, void *arg)
static void denoise_dct(MPVEncContext *const s, int16_t block[])
av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
#define INTERLACED_DCT(s)
static int get_sae(const uint8_t *src, int ref, int stride)
static int estimate_qp(MPVMainEncContext *const m, int dry_run)
static void update_qscale(MPVMainEncContext *const m)
static int load_input_picture(MPVMainEncContext *const m, const AVFrame *pic_arg)
static av_cold int init_slice_buffers(MPVMainEncContext *const m)
static void frame_start(MPVMainEncContext *const m)
static void set_frame_distances(MPVEncContext *const s)
#define QMAT_SHIFT
#define ff_mpv_unquantize_init(s, bitexact, q_scale_type)
const uint8_t ff_mpeg2_non_linear_qscale[32]
const uint8_t ff_mpeg12_dc_scale_table[4][32]
static const uint8_t *const ff_mpeg1_dc_scale_table
mpegvideo header.
static int get_bits_diff(MPVEncContext *s)
#define CANDIDATE_MB_TYPE_INTRA
#define MPVENC_MAX_B_FRAMES
#define FF_MPV_FLAG_CBP_RD
#define CANDIDATE_MB_TYPE_BACKWARD
#define CANDIDATE_MB_TYPE_FORWARD_I
#define CANDIDATE_MB_TYPE_INTER_I
#define CANDIDATE_MB_TYPE_BIDIR_I
#define CANDIDATE_MB_TYPE_BACKWARD_I
#define CANDIDATE_MB_TYPE_SKIPPED
#define CANDIDATE_MB_TYPE_INTER
#define CANDIDATE_MB_TYPE_DIRECT
#define CANDIDATE_MB_TYPE_BIDIR
#define CANDIDATE_MB_TYPE_FORWARD
void ff_dct_encode_init_x86(MPVEncContext *s)
#define FF_MPV_FLAG_QP_RD
#define UNI_AC_ENC_INDEX(run, level)
#define CANDIDATE_MB_TYPE_INTER4V
#define FF_MPV_COMMON_OPTS
#define CANDIDATE_MB_TYPE_DIRECT0
#define INPLACE_OFFSET
#define FF_MPV_FLAG_SKIP_RD
#define FF_MPV_COMMON_MOTION_EST_OPTS
#define FF_MPV_FLAG_STRICT_GOP
#define BASIS_SHIFT
#define EDGE_BOTTOM
#define RECON_SHIFT
#define EDGE_TOP
void ff_msmpeg4_encode_ext_header(MPVEncContext *const s)
Definition msmpeg4enc.c:285
av_cold void ff_msmpeg4_encode_init(MPVMainEncContext *const m)
Definition msmpeg4enc.c:673
enum AVPixelFormat pix
Definition ohcodec.c:55
AVOptions.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition pixfmt.h:87
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition put_bits.h:62
static void rebase_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Rebase the bit writer onto a reallocated buffer.
Definition put_bits.h:122
static void set_put_bits_buffer_size(PutBitContext *s, int size)
Change the end of the buffer.
Definition put_bits.h:436
static int put_bits_count(PutBitContext *s)
Definition put_bits.h:90
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
Definition put_bits.h:402
static int put_bytes_count(const PutBitContext *s, int round_up)
Definition put_bits.h:110
static int put_bytes_left(const PutBitContext *s, int round_up)
Definition put_bits.h:145
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition put_bits.h:153
#define BUF_BITS
Definition put_bits.h:47
quarterpel DSP functions
void(* qpel_mc_func)(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
Definition qpeldsp.h:65
void ff_write_pass1_stats(MPVMainEncContext *const m)
Definition ratecontrol.c:37
void ff_get_2pass_fcode(MPVMainEncContext *const m)
av_cold void ff_rate_control_uninit(RateControlContext *rcc)
float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run)
int ff_vbv_update(MPVMainEncContext *m, int frame_size)
av_cold int ff_rate_control_init(MPVMainEncContext *const m)
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:121
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition refstruct.c:315
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition refstruct.h:292
const h264_weight_func weight
int ff_rv20_encode_picture_header(MPVMainEncContext *const m)
Definition rv20enc.c:37
#define FF_ARRAY_ELEMS(a)
static const uint8_t sp5x_qscale_five_quant_table[][64]
Definition sp5x.h:135
void ff_speedhq_end_slice(MPVEncContext *const s)
Definition speedhqenc.c:118
SpeedHQ encoder.
static int ff_speedhq_mb_y_order_to_mb(int mb_y_order, int mb_height, int *first_in_slice)
Definition speedhqenc.h:41
This structure describes the bitrate properties of an encoded bitstream.
Definition defs.h:296
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
Definition defs.h:311
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition defs.h:301
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
Definition defs.h:317
uint64_t vbv_delay
The delay between the time the packet this structure is associated with is received and the time when...
Definition defs.h:326
int64_t min_bitrate
Minimum bitrate of the stream, in bits per second.
Definition defs.h:306
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
float rc_max_available_vbv_use
Ratecontrol attempt to use, at maximum, of what can be used without an underflow.
Definition avcodec.h:1302
int trellis
trellis RD quantization
Definition avcodec.h:1323
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
char * stats_out
pass1 encoding statistics output buffer
Definition avcodec.h:1330
int rc_buffer_size
decoder bitstream buffer size
Definition avcodec.h:1273
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition avcodec.h:1376
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
Definition avcodec.h:781
int qmin
minimum quantizer
Definition avcodec.h:1252
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition avcodec.h:628
uint16_t * inter_matrix
custom inter quantization matrix Must be allocated with the av_malloc() family of functions,...
Definition avcodec.h:969
int bit_rate_tolerance
number of bits the bitstream is allowed to diverge from the reference.
Definition avcodec.h:1227
int mb_decision
macroblock decision mode
Definition avcodec.h:948
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition avcodec.h:709
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
const struct AVCodec * codec
Definition avcodec.h:452
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition avcodec.h:1576
float temporal_cplx_masking
temporary complexity masking (0-> disabled)
Definition avcodec.h:827
float p_masking
p block masking (0-> disabled)
Definition avcodec.h:841
int delay
Codec delay.
Definition avcodec.h:587
float dark_masking
darkness masking (0-> disabled)
Definition avcodec.h:848
int mb_cmp
macroblock comparison function (not supported yet)
Definition avcodec.h:874
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition avcodec.h:1021
int ildct_cmp
interlaced DCT comparison function
Definition avcodec.h:880
int64_t rc_max_rate
maximum bitrate
Definition avcodec.h:1288
int qmax
maximum quantizer
Definition avcodec.h:1259
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions,...
Definition avcodec.h:960
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avcodec.h:547
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
int64_t rc_min_rate
minimum bitrate
Definition avcodec.h:1295
uint64_t error[AV_NUM_DATA_POINTERS]
error
Definition avcodec.h:1524
enum AVCodecID codec_id
Definition avcodec.h:453
float lumi_masking
luminance masking (0-> disabled)
Definition avcodec.h:820
struct AVCodecInternal * internal
Private context used for internal data.
Definition avcodec.h:478
void * priv_data
Definition avcodec.h:470
float spatial_cplx_masking
spatial complexity masking (0-> disabled)
Definition avcodec.h:834
int slices
Number of slices.
Definition avcodec.h:1037
unsigned int byte_buffer_size
Definition internal.h:96
uint8_t * byte_buffer
temporary buffer used for encoders to store their bitstream
Definition internal.h:95
enum AVCodecID id
Definition codec.h:189
int capabilities
Codec capabilities.
Definition codec.h:194
This structure describes decoded (raw) audio or video data.
Definition frame.h:479
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition frame.h:581
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:500
int width
Definition frame.h:551
int height
Definition frame.h:551
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
Definition frame.h:601
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition frame.h:524
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition frame.h:566
enum AVPictureType pict_type
Picture type of the frame.
Definition frame.h:571
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:587
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
void(* fdct)(int16_t *block)
Definition fdctdsp.h:29
int block_last_index[8]
int last_dc[3]
int16_t(* block)[64]
int esc3_level_length
PutBitContext pb
int mv[2][4][2]
int last_mv[2][2][2]
PutBitContext tex_pb
struct MBBackup::@342113007365243263012337326261363212055053105164 c
PutBitContext pb2
int(* sum_abs_dctelem)(const int16_t *block)
Definition me_cmp.h:51
me_cmp_func sad[6]
Definition me_cmp.h:53
me_cmp_func sse[6]
Definition me_cmp.h:54
me_cmp_func nsse[6]
Definition me_cmp.h:62
int(* dct_error_sum)[64]
MotionEstContext me
PutBitContext pb
bit output
MpegEncContext c
the common base context
uint16_t(* dct_offset)[64]
unsigned int lambda
Lagrange multiplier used in rate distortion.
int16_t(* block)[64]
points into blocks below
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT
int max_b_frames
max number of B-frames
int frame_bits
bits used for the current frame
int stuffing_bits
bits used for stuffing
MPVEncContext s
The main slicecontext.
RateControlContext rc_context
contains stuff only accessed in ratecontrol.c
int16_t(* mv_table_base)[2]
int vbv_delay_pos
offset of vbv_delay in the bitstream
int last_non_b_pict_type
used for MPEG-4 gmc B-frames & ratecontrol
int64_t mc_mb_var_sum
motion compensated MB variance for current frame
int last_lambda_for[5]
last lambda for a specific pict type
int64_t dts_delta
pts difference between the first and second input frame, used for calculating dts of the first frame ...
const uint8_t * fcode_tab
smallest fcode needed for each MV
int64_t mb_var_sum
sum of MB variance for current frame
char * dct_error_sum_base
backs dct_error_sum
AVFrame * tmp_frames[MPVENC_MAX_B_FRAMES+2]
temporary frames used by b_frame_strategy = 2
int picture_in_gop_number
0-> first pic in gop, ...
int coded_picture_number
used to set pic->coded_picture_number
int fixed_qscale
fixed qscale if non zero
int next_lambda
next lambda used for retrying to encode a frame
int64_t user_specified_pts
last non-zero pts from user-supplied AVFrame
int input_picture_number
used to set pic->display_picture_number
int64_t reordered_pts
reordered pts to be used as dts for the next output frame when there's a delay
MPVPicture * reordered_input_picture[MPVENC_MAX_B_FRAMES+1]
next pictures in coded order
MPVPicture * input_picture[MPVENC_MAX_B_FRAMES+1]
next pictures in display order
me_cmp_func frame_skip_cmp_fn
int intra_only
if true, only intra pictures are generated
int me_pre
prepass for motion estimation
int(* encode_picture_header)(struct MPVMainEncContext *m)
MPVPicture.
Definition mpegpicture.h:58
int b_frame_score
Definition mpegpicture.h:84
struct AVFrame * f
Definition mpegpicture.h:59
int display_picture_number
Definition mpegpicture.h:89
int coded_picture_number
Definition mpegpicture.h:90
void(* dct_unquantize_mpeg2_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_mpeg1_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_mpeg2_inter)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_h263_inter)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_h263_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_mpeg1_inter)(const MPVContext *s, int16_t *block, int n, int qscale)
uint8_t * scratchpad
data area for the ME algo, so that the ME does not need to malloc/free.
Definition motion_est.h:55
uint8_t * temp
Definition motion_est.h:57
MpegEncContext.
Definition mpegvideo.h:67
int16_t * dc_val
used for H.263 AIC/MPEG-4 DC prediction and ER
Definition mpegvideo.h:141
ScratchpadContext sc
Definition mpegvideo.h:150
int start_mb_y
start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
Definition mpegvideo.h:107
int16_t(* ac_val)[16]
used for H.263 AIC, MPEG-4 AC prediction
Definition mpegvideo.h:142
rate control context.
Definition ratecontrol.h:60
RateControlEntry * entry
Definition ratecontrol.h:62
double buffer_index
amount of bits in the video/audio buffer
Definition ratecontrol.h:63
int num_entries
number of RateControlEntries
Definition ratecontrol.h:61
uint8_t * scratchpad_buf
the other *_scratchpad point into this buffer
Definition mpegpicture.h:38
uint8_t run
Definition svq3.c:207
uint8_t level
Definition svq3.c:208
#define stride
#define av_free(p)
#define av_mallocz(s)
#define ff_dlog(a,...)
#define av_freep(p)
#define av_log(a,...)
#define src1
Definition h264pred.c:141
#define src
Definition vp8dsp.c:248
static int ref[MAX_W *MAX_W]
#define height
Definition dsp.h:99
#define width
Definition dsp.h:99
static int64_t pts
int size
static const struct twinvq_data tab
#define me
const char * g
Definition vf_curves.c:128
else temp
Definition vf_mcdeint.c:275
static float mean(const float *input, int size)
Definition vf_nnedi.c:861
static const double coeff[2][5]
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static const uint8_t quality[]
Definition vmixdec.c:58
static int bias(int x, int c)
Definition vqcdec.c:115
static double c[64]