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 break;
862#endif
864 s->c.out_format = FMT_SPEEDHQ;
865 m->intra_only = 1; /* force intra only for SHQ */
866 avctx->delay = 0;
867 s->c.low_delay = 1;
868 break;
869 case AV_CODEC_ID_H261:
870 s->c.out_format = FMT_H261;
871 avctx->delay = 0;
872 s->c.low_delay = 1;
873 s->rtp_mode = 0; /* Sliced encoding not supported */
874 break;
875 case AV_CODEC_ID_H263:
876 if (!CONFIG_H263_ENCODER)
879 s->c.width, s->c.height) == 8) {
880 av_log(avctx, AV_LOG_ERROR,
881 "The specified picture size of %dx%d is not valid for "
882 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
883 "352x288, 704x576, and 1408x1152. "
884 "Try H.263+.\n", s->c.width, s->c.height);
885 return AVERROR(EINVAL);
886 }
887 s->c.out_format = FMT_H263;
888 avctx->delay = 0;
889 s->c.low_delay = 1;
890 break;
892 s->c.out_format = FMT_H263;
893 /* Fx */
894 s->c.h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
895 s->modified_quant = s->c.h263_aic;
896 s->loop_filter = !!(avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
897 s->me.unrestricted_mv = s->c.obmc || s->loop_filter || s->umvplus;
898 s->flipflop_rounding = 1;
899
900 /* /Fx */
901 /* These are just to be sure */
902 avctx->delay = 0;
903 s->c.low_delay = 1;
904 break;
905 case AV_CODEC_ID_FLV1:
906 s->c.out_format = FMT_H263;
907 s->me.unrestricted_mv = 1;
908 s->rtp_mode = 0; /* don't allow GOB */
909 avctx->delay = 0;
910 s->c.low_delay = 1;
911 break;
912#if CONFIG_RV10_ENCODER
913 case AV_CODEC_ID_RV10:
914 s->c.out_format = FMT_H263;
915 avctx->delay = 0;
916 s->c.low_delay = 1;
917 break;
918#endif
919#if CONFIG_RV20_ENCODER
920 case AV_CODEC_ID_RV20:
922 s->c.out_format = FMT_H263;
923 avctx->delay = 0;
924 s->c.low_delay = 1;
925 s->modified_quant = 1;
926 // Set here to force allocation of dc_val;
927 // will be set later on a per-frame basis.
928 s->c.h263_aic = 1;
929 s->loop_filter = 1;
930 s->me.unrestricted_mv = 0;
931 break;
932#endif
934 s->c.out_format = FMT_H263;
935 s->c.h263_pred = 1;
936 s->me.unrestricted_mv = 1;
937 s->flipflop_rounding = 1;
938 s->c.low_delay = m->max_b_frames ? 0 : 1;
939 avctx->delay = s->c.low_delay ? 0 : (m->max_b_frames + 1);
940 break;
942 s->c.out_format = FMT_H263;
943 s->c.h263_pred = 1;
944 s->me.unrestricted_mv = 1;
945 s->c.msmpeg4_version = MSMP4_V2;
946 avctx->delay = 0;
947 s->c.low_delay = 1;
948 break;
950 s->c.out_format = FMT_H263;
951 s->c.h263_pred = 1;
952 s->me.unrestricted_mv = 1;
953 s->c.msmpeg4_version = MSMP4_V3;
954 s->flipflop_rounding = 1;
955 avctx->delay = 0;
956 s->c.low_delay = 1;
957 break;
958 case AV_CODEC_ID_WMV1:
959 s->c.out_format = FMT_H263;
960 s->c.h263_pred = 1;
961 s->me.unrestricted_mv = 1;
962 s->c.msmpeg4_version = MSMP4_WMV1;
963 s->flipflop_rounding = 1;
964 avctx->delay = 0;
965 s->c.low_delay = 1;
966 break;
967 case AV_CODEC_ID_WMV2:
968 s->c.out_format = FMT_H263;
969 s->c.h263_pred = 1;
970 s->me.unrestricted_mv = 1;
971 s->c.msmpeg4_version = MSMP4_WMV2;
972 s->flipflop_rounding = 1;
973 avctx->delay = 0;
974 s->c.low_delay = 1;
975 break;
976 default:
977 av_unreachable("List contains all codecs using ff_mpv_encode_init()");
978 }
979
980 avctx->has_b_frames = !s->c.low_delay;
981
982 s->c.encoding = 1;
983
984 s->c.progressive_frame =
985 s->c.progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
987 s->c.alternate_scan);
988
989 if (avctx->flags & AV_CODEC_FLAG_PSNR || avctx->mb_decision == FF_MB_DECISION_RD ||
991 s->frame_reconstruction_bitfield = (1 << AV_PICTURE_TYPE_I) |
992 (1 << AV_PICTURE_TYPE_P) |
993 (1 << AV_PICTURE_TYPE_B);
994 } else if (!m->intra_only) {
995 s->frame_reconstruction_bitfield = (1 << AV_PICTURE_TYPE_I) |
996 (1 << AV_PICTURE_TYPE_P);
997 } else {
998 s->frame_reconstruction_bitfield = 0;
999 }
1000
1001 if (m->lmin > m->lmax) {
1002 av_log(avctx, AV_LOG_WARNING, "Clipping lmin value to %d\n", m->lmax);
1003 m->lmin = m->lmax;
1004 }
1005
1006 /* ff_mpv_init_duplicate_contexts() will copy (memdup) the contents of the
1007 * main slice to the slice contexts, so we initialize various fields of it
1008 * before calling ff_mpv_init_duplicate_contexts(). */
1009 s->parent = m;
1010 ff_mpv_idct_init(&s->c);
1011 init_unquantize(s, avctx);
1012 ff_fdctdsp_init(&s->fdsp, avctx);
1013 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
1014 ff_pixblockdsp_init(&s->pdsp, 8);
1015 ret = me_cmp_init(m, avctx);
1016 if (ret < 0)
1017 return ret;
1018
1019 if (!(avctx->stats_out = av_mallocz(256)) ||
1020 !(s->new_pic = av_frame_alloc()) ||
1021 !(s->c.picture_pool = ff_mpv_alloc_pic_pool(0)))
1022 return AVERROR(ENOMEM);
1023
1024 ret = init_matrices(m, avctx);
1025 if (ret < 0)
1026 return ret;
1027
1029
1030 if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263) {
1032#if CONFIG_MSMPEG4ENC
1033 if (s->c.msmpeg4_version != MSMP4_UNUSED)
1035#endif
1036 }
1037
1038 s->c.slice_ctx_size = sizeof(*s);
1039 ret = ff_mpv_common_init(&s->c);
1040 if (ret < 0)
1041 return ret;
1042 ret = init_buffers(m);
1043 if (ret < 0)
1044 return ret;
1045 if (s->c.slice_context_count > 1) {
1046 s->rtp_mode = 1;
1047 if (avctx->codec_id == AV_CODEC_ID_H263P)
1048 s->h263_slice_structured = 1;
1049 }
1051 if (ret < 0)
1052 return ret;
1053
1054 ret = init_slice_buffers(m);
1055 if (ret < 0)
1056 return ret;
1057
1058 ret = ff_rate_control_init(m);
1059 if (ret < 0)
1060 return ret;
1061
1062 if (m->b_frame_strategy == 2) {
1063 for (int i = 0; i < m->max_b_frames + 2; i++) {
1064 m->tmp_frames[i] = av_frame_alloc();
1065 if (!m->tmp_frames[i])
1066 return AVERROR(ENOMEM);
1067
1069 m->tmp_frames[i]->width = s->c.width >> m->brd_scale;
1070 m->tmp_frames[i]->height = s->c.height >> m->brd_scale;
1071
1072 ret = av_frame_get_buffer(m->tmp_frames[i], 0);
1073 if (ret < 0)
1074 return ret;
1075 }
1076 }
1077
1078 cpb_props = ff_encode_add_cpb_side_data(avctx);
1079 if (!cpb_props)
1080 return AVERROR(ENOMEM);
1081 cpb_props->max_bitrate = avctx->rc_max_rate;
1082 cpb_props->min_bitrate = avctx->rc_min_rate;
1083 cpb_props->avg_bitrate = avctx->bit_rate;
1084 cpb_props->buffer_size = avctx->rc_buffer_size;
1085
1086 return 0;
1087}
1088
1090{
1091 MPVMainEncContext *const m = avctx->priv_data;
1092 MPVEncContext *const s = &m->s;
1093
1095
1096 ff_mpv_common_end(&s->c);
1097 av_refstruct_pool_uninit(&s->c.picture_pool);
1098
1099 for (int i = 0; i < MPVENC_MAX_B_FRAMES + 1; i++) {
1102 }
1103 for (int i = 0; i < FF_ARRAY_ELEMS(m->tmp_frames); i++)
1105
1106 av_frame_free(&s->new_pic);
1107
1108 av_freep(&avctx->stats_out);
1109
1111 av_freep(&s->p_field_select_table[0]);
1113
1114 av_freep(&s->mb_type);
1115 av_freep(&s->lambda_table);
1116
1117 av_freep(&s->q_intra_matrix);
1118 av_freep(&s->q_intra_matrix16);
1119 av_freep(&s->dct_offset);
1120
1121 return 0;
1122}
1123
1124/* put block[] to dest[] */
1125static inline void put_dct(MPVEncContext *const s,
1126 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
1127{
1128 s->c.dct_unquantize_intra(&s->c, block, i, qscale);
1129 s->c.idsp.idct_put(dest, line_size, block);
1130}
1131
1132static inline void add_dequant_dct(MPVEncContext *const s,
1133 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
1134{
1135 if (s->c.block_last_index[i] >= 0) {
1136 s->c.dct_unquantize_inter(&s->c, block, i, qscale);
1137
1138 s->c.idsp.idct_add(dest, line_size, block);
1139 }
1140}
1141
1142/**
1143 * Performs dequantization and IDCT (if necessary)
1144 */
1145static void mpv_reconstruct_mb(MPVEncContext *const s, int16_t block[12][64])
1146{
1147 if (s->c.avctx->debug & FF_DEBUG_DCT_COEFF) {
1148 /* print DCT coefficients */
1149 av_log(s->c.avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->c.mb_x, s->c.mb_y);
1150 for (int i = 0; i < 6; i++) {
1151 for (int j = 0; j < 64; j++) {
1152 av_log(s->c.avctx, AV_LOG_DEBUG, "%5d",
1153 block[i][s->c.idsp.idct_permutation[j]]);
1154 }
1155 av_log(s->c.avctx, AV_LOG_DEBUG, "\n");
1156 }
1157 }
1158
1159 if ((1 << s->c.pict_type) & s->frame_reconstruction_bitfield) {
1160 uint8_t *dest_y = s->c.dest[0], *dest_cb = s->c.dest[1], *dest_cr = s->c.dest[2];
1161 int dct_linesize, dct_offset;
1162 const int linesize = s->c.cur_pic.linesize[0];
1163 const int uvlinesize = s->c.cur_pic.linesize[1];
1164 const int block_size = 8;
1165
1166 dct_linesize = linesize << s->c.interlaced_dct;
1167 dct_offset = s->c.interlaced_dct ? linesize : linesize * block_size;
1168
1169 if (!s->c.mb_intra) {
1170 /* No MC, as that was already done otherwise */
1171 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->c.qscale);
1172 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->c.qscale);
1173 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->c.qscale);
1174 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->c.qscale);
1175
1176 if (!CONFIG_GRAY || !(s->c.avctx->flags & AV_CODEC_FLAG_GRAY)) {
1177 if (s->c.chroma_y_shift) {
1178 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->c.chroma_qscale);
1179 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->c.chroma_qscale);
1180 } else {
1181 dct_linesize >>= 1;
1182 dct_offset >>= 1;
1183 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->c.chroma_qscale);
1184 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->c.chroma_qscale);
1185 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->c.chroma_qscale);
1186 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->c.chroma_qscale);
1187 }
1188 }
1189 } else {
1190 /* dct only in intra block */
1191 put_dct(s, block[0], 0, dest_y , dct_linesize, s->c.qscale);
1192 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->c.qscale);
1193 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->c.qscale);
1194 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->c.qscale);
1195
1196 if (!CONFIG_GRAY || !(s->c.avctx->flags & AV_CODEC_FLAG_GRAY)) {
1197 if (s->c.chroma_y_shift) {
1198 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->c.chroma_qscale);
1199 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->c.chroma_qscale);
1200 } else {
1201 dct_offset >>= 1;
1202 dct_linesize >>= 1;
1203 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->c.chroma_qscale);
1204 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->c.chroma_qscale);
1205 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->c.chroma_qscale);
1206 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->c.chroma_qscale);
1207 }
1208 }
1209 }
1210 }
1211}
1212
1213static int get_sae(const uint8_t *src, int ref, int stride)
1214{
1215 int x,y;
1216 int acc = 0;
1217
1218 for (y = 0; y < 16; y++) {
1219 for (x = 0; x < 16; x++) {
1220 acc += FFABS(src[x + y * stride] - ref);
1221 }
1222 }
1223
1224 return acc;
1225}
1226
1227static int get_intra_count(MPVEncContext *const s, const uint8_t *src,
1228 const uint8_t *ref, int stride)
1229{
1230 int x, y, w, h;
1231 int acc = 0;
1232
1233 w = s->c.width & ~15;
1234 h = s->c.height & ~15;
1235
1236 for (y = 0; y < h; y += 16) {
1237 for (x = 0; x < w; x += 16) {
1238 int offset = x + y * stride;
1239 int sad = s->sad_cmp[0](NULL, src + offset, ref + offset,
1240 stride, 16);
1241 int mean = (s->mpvencdsp.pix_sum(src + offset, stride) + 128) >> 8;
1242 int sae = get_sae(src + offset, mean, stride);
1243
1244 acc += sae + 500 < sad;
1245 }
1246 }
1247 return acc;
1248}
1249
1250/**
1251 * Allocates new buffers for an AVFrame and copies the properties
1252 * from another AVFrame.
1253 */
1254static int prepare_picture(MPVEncContext *const s, AVFrame *f, const AVFrame *props_frame)
1255{
1256 AVCodecContext *avctx = s->c.avctx;
1257 int ret;
1258
1259 f->width = avctx->width + 2 * EDGE_WIDTH;
1260 f->height = avctx->height + 2 * EDGE_WIDTH;
1261
1262 ret = ff_encode_alloc_frame(avctx, f);
1263 if (ret < 0)
1264 return ret;
1265
1266 ret = ff_mpv_pic_check_linesize(avctx, f, &s->c.linesize, &s->c.uvlinesize);
1267 if (ret < 0)
1268 return ret;
1269
1270 for (int i = 0; f->data[i]; i++) {
1271 int offset = (EDGE_WIDTH >> (i ? s->c.chroma_y_shift : 0)) *
1272 f->linesize[i] +
1273 (EDGE_WIDTH >> (i ? s->c.chroma_x_shift : 0));
1274 f->data[i] += offset;
1275 }
1276 f->width = avctx->width;
1277 f->height = avctx->height;
1278
1279 ret = av_frame_copy_props(f, props_frame);
1280 if (ret < 0)
1281 return ret;
1282
1283 return 0;
1284}
1285
1286static int load_input_picture(MPVMainEncContext *const m, const AVFrame *pic_arg)
1287{
1288 MPVEncContext *const s = &m->s;
1289 MPVPicture *pic = NULL;
1290 int64_t pts;
1291 int display_picture_number = 0, ret;
1292 int encoding_delay = m->max_b_frames ? m->max_b_frames
1293 : (s->c.low_delay ? 0 : 1);
1294 int flush_offset = 1;
1295 int direct = 1;
1296
1297 av_assert1(!m->input_picture[0]);
1298
1299 if (pic_arg) {
1300 pts = pic_arg->pts;
1301 display_picture_number = m->input_picture_number++;
1302
1303 if (pts != AV_NOPTS_VALUE) {
1304 if (s->c.codec_id == AV_CODEC_ID_MPEG4 &&
1305 (pts > INT64_MAX / 2 / s->c.avctx->time_base.num ||
1306 pts < INT64_MIN / 2 / s->c.avctx->time_base.num)) {
1307 av_log(s->c.avctx, AV_LOG_ERROR, "pts %"PRId64" is out of the supported range\n", pts);
1308 return AVERROR_PATCHWELCOME;
1309 }
1310
1312 int64_t last = m->user_specified_pts;
1313
1314 if (pts <= last) {
1315 av_log(s->c.avctx, AV_LOG_ERROR,
1316 "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
1317 pts, last);
1318 return AVERROR(EINVAL);
1319 }
1320
1321 if (!s->c.low_delay && display_picture_number == 1)
1322 m->dts_delta = pts - last;
1323 }
1325 } else {
1328 pts = m->user_specified_pts + 1;
1329 av_log(s->c.avctx, AV_LOG_INFO,
1330 "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
1331 pts);
1332 } else {
1333 pts = display_picture_number;
1334 }
1335 }
1336
1337 if (pic_arg->linesize[0] != s->c.linesize ||
1338 pic_arg->linesize[1] != s->c.uvlinesize ||
1339 pic_arg->linesize[2] != s->c.uvlinesize)
1340 direct = 0;
1341 if ((s->c.width & 15) || (s->c.height & 15))
1342 direct = 0;
1343 if (((intptr_t)(pic_arg->data[0])) & (STRIDE_ALIGN-1))
1344 direct = 0;
1345 if (s->c.linesize & (STRIDE_ALIGN-1))
1346 direct = 0;
1347
1348 ff_dlog(s->c.avctx, "%d %d %td %td\n", pic_arg->linesize[0],
1349 pic_arg->linesize[1], s->c.linesize, s->c.uvlinesize);
1350
1351 pic = av_refstruct_pool_get(s->c.picture_pool);
1352 if (!pic)
1353 return AVERROR(ENOMEM);
1354
1355 if (direct) {
1356 if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1357 goto fail;
1358 pic->shared = 1;
1359 } else {
1360 ret = prepare_picture(s, pic->f, pic_arg);
1361 if (ret < 0)
1362 goto fail;
1363
1364 for (int i = 0; i < 3; i++) {
1365 ptrdiff_t src_stride = pic_arg->linesize[i];
1366 ptrdiff_t dst_stride = i ? s->c.uvlinesize : s->c.linesize;
1367 int h_shift = i ? s->c.chroma_x_shift : 0;
1368 int v_shift = i ? s->c.chroma_y_shift : 0;
1369 int w = AV_CEIL_RSHIFT(s->c.width , h_shift);
1370 int h = AV_CEIL_RSHIFT(s->c.height, v_shift);
1371 const uint8_t *src = pic_arg->data[i];
1372 uint8_t *dst = pic->f->data[i];
1373 int vpad = 16;
1374
1375 if ( s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO
1376 && !s->c.progressive_sequence
1377 && FFALIGN(s->c.height, 32) - s->c.height > 16)
1378 vpad = 32;
1379
1380 if (!s->c.avctx->rc_buffer_size)
1382
1383 if (src_stride == dst_stride)
1384 memcpy(dst, src, src_stride * h - src_stride + w);
1385 else {
1386 int h2 = h;
1387 uint8_t *dst2 = dst;
1388 while (h2--) {
1389 memcpy(dst2, src, w);
1390 dst2 += dst_stride;
1391 src += src_stride;
1392 }
1393 }
1394 if ((s->c.width & 15) || (s->c.height & (vpad-1))) {
1395 s->mpvencdsp.draw_edges(dst, dst_stride,
1396 w, h,
1397 16 >> h_shift,
1398 vpad >> v_shift,
1399 EDGE_BOTTOM);
1400 }
1401 }
1402 }
1403
1404 pic->display_picture_number = display_picture_number;
1405 pic->f->pts = pts; // we set this here to avoid modifying pic_arg
1406 } else if (!m->reordered_input_picture[1]) {
1407 /* Flushing: When the above check is true, the encoder is about to run
1408 * out of frames to encode. Check if there are input_pictures left;
1409 * if so, ensure m->input_picture[0] contains the first picture.
1410 * A flush_offset != 1 will only happen if we did not receive enough
1411 * input frames. */
1412 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1413 if (m->input_picture[flush_offset])
1414 break;
1415
1416 encoding_delay -= flush_offset - 1;
1417 }
1418
1419 /* shift buffer entries */
1420 for (int i = flush_offset; i <= MPVENC_MAX_B_FRAMES; i++)
1421 m->input_picture[i - flush_offset] = m->input_picture[i];
1422 for (int i = MPVENC_MAX_B_FRAMES + 1 - flush_offset; i <= MPVENC_MAX_B_FRAMES; i++)
1423 m->input_picture[i] = NULL;
1424
1425 m->input_picture[encoding_delay] = pic;
1426
1427 return 0;
1428fail:
1429 av_refstruct_unref(&pic);
1430 return ret;
1431}
1432
1433static int skip_check(MPVMainEncContext *const m,
1434 const MPVPicture *p, const MPVPicture *ref)
1435{
1436 MPVEncContext *const s = &m->s;
1437 int score = 0;
1438 int64_t score64 = 0;
1439
1440 for (int plane = 0; plane < 3; plane++) {
1441 const int stride = p->f->linesize[plane];
1442 const int bw = plane ? 1 : 2;
1443 for (int y = 0; y < s->c.mb_height * bw; y++) {
1444 for (int x = 0; x < s->c.mb_width * bw; x++) {
1445 int off = p->shared ? 0 : 16;
1446 const uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
1447 const uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1448 int v = m->frame_skip_cmp_fn(s, dptr, rptr, stride, 8);
1449
1450 switch (FFABS(m->frame_skip_exp)) {
1451 case 0: score = FFMAX(score, v); break;
1452 case 1: score += FFABS(v); break;
1453 case 2: score64 += v * (int64_t)v; break;
1454 case 3: score64 += FFABS(v * (int64_t)v * v); break;
1455 case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v); break;
1456 }
1457 }
1458 }
1459 }
1460 emms_c();
1461
1462 if (score)
1463 score64 = score;
1464 if (m->frame_skip_exp < 0)
1465 score64 = pow(score64 / (double)(s->c.mb_width * s->c.mb_height),
1466 -1.0/m->frame_skip_exp);
1467
1468 if (score64 < m->frame_skip_threshold)
1469 return 1;
1470 if (score64 < ((m->frame_skip_factor * (int64_t) s->lambda) >> 8))
1471 return 1;
1472 return 0;
1473}
1474
1476{
1477 int ret;
1478 int size = 0;
1479
1480 ret = avcodec_send_frame(c, frame);
1481 if (ret < 0)
1482 return ret;
1483
1484 do {
1486 if (ret >= 0) {
1487 size += pkt->size;
1489 } else if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
1490 return ret;
1491 } while (ret >= 0);
1492
1493 return size;
1494}
1495
1497{
1498 MPVEncContext *const s = &m->s;
1499 AVPacket *pkt;
1500 const int scale = m->brd_scale;
1501 int width = s->c.width >> scale;
1502 int height = s->c.height >> scale;
1503 int out_size, p_lambda, b_lambda, lambda2;
1504 int64_t best_rd = INT64_MAX;
1505 int best_b_count = -1;
1506 int ret = 0;
1507
1508 av_assert0(scale >= 0 && scale <= 3);
1509
1510 pkt = av_packet_alloc();
1511 if (!pkt)
1512 return AVERROR(ENOMEM);
1513
1514 p_lambda = m->last_lambda_for[AV_PICTURE_TYPE_P];
1515 //p_lambda * FFABS(s->c.avctx->b_quant_factor) + s->c.avctx->b_quant_offset;
1516 b_lambda = m->last_lambda_for[AV_PICTURE_TYPE_B];
1517 if (!b_lambda) // FIXME we should do this somewhere else
1518 b_lambda = p_lambda;
1519 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1521
1522 for (int i = 0; i < m->max_b_frames + 2; i++) {
1523 const MPVPicture *pre_input_ptr = i ? m->input_picture[i - 1] :
1524 s->c.next_pic.ptr;
1525
1526 if (pre_input_ptr) {
1527 const uint8_t *data[4];
1528 memcpy(data, pre_input_ptr->f->data, sizeof(data));
1529
1530 if (!pre_input_ptr->shared && i) {
1531 data[0] += INPLACE_OFFSET;
1532 data[1] += INPLACE_OFFSET;
1533 data[2] += INPLACE_OFFSET;
1534 }
1535
1536 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[0],
1537 m->tmp_frames[i]->linesize[0],
1538 data[0],
1539 pre_input_ptr->f->linesize[0],
1540 width, height);
1541 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[1],
1542 m->tmp_frames[i]->linesize[1],
1543 data[1],
1544 pre_input_ptr->f->linesize[1],
1545 width >> 1, height >> 1);
1546 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[2],
1547 m->tmp_frames[i]->linesize[2],
1548 data[2],
1549 pre_input_ptr->f->linesize[2],
1550 width >> 1, height >> 1);
1551 }
1552 }
1553
1554 for (int j = 0; j < m->max_b_frames + 1; j++) {
1556 int64_t rd = 0;
1557
1558 if (!m->input_picture[j])
1559 break;
1560
1562 if (!c) {
1563 ret = AVERROR(ENOMEM);
1564 goto fail;
1565 }
1566
1567 c->width = width;
1568 c->height = height;
1570 c->flags |= s->c.avctx->flags & AV_CODEC_FLAG_QPEL;
1571 c->mb_decision = s->c.avctx->mb_decision;
1572 c->me_cmp = s->c.avctx->me_cmp;
1573 c->mb_cmp = s->c.avctx->mb_cmp;
1574 c->me_sub_cmp = s->c.avctx->me_sub_cmp;
1575 c->pix_fmt = AV_PIX_FMT_YUV420P;
1576 c->time_base = s->c.avctx->time_base;
1577 c->max_b_frames = m->max_b_frames;
1578
1579 ret = avcodec_open2(c, s->c.avctx->codec, NULL);
1580 if (ret < 0)
1581 goto fail;
1582
1583
1585 m->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1586
1588 if (out_size < 0) {
1589 ret = out_size;
1590 goto fail;
1591 }
1592
1593 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1594
1595 for (int i = 0; i < m->max_b_frames + 1; i++) {
1596 int is_p = i % (j + 1) == j || i == m->max_b_frames;
1597
1598 m->tmp_frames[i + 1]->pict_type = is_p ?
1600 m->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1601
1602 out_size = encode_frame(c, m->tmp_frames[i + 1], pkt);
1603 if (out_size < 0) {
1604 ret = out_size;
1605 goto fail;
1606 }
1607
1608 rd += (out_size * (uint64_t)lambda2) >> (FF_LAMBDA_SHIFT - 3);
1609 }
1610
1611 /* get the delayed frames */
1613 if (out_size < 0) {
1614 ret = out_size;
1615 goto fail;
1616 }
1617 rd += (out_size * (uint64_t)lambda2) >> (FF_LAMBDA_SHIFT - 3);
1618
1619 rd += c->error[0] + c->error[1] + c->error[2];
1620
1621 if (rd < best_rd) {
1622 best_rd = rd;
1623 best_b_count = j;
1624 }
1625
1626fail:
1629 if (ret < 0) {
1630 best_b_count = ret;
1631 break;
1632 }
1633 }
1634
1636
1637 return best_b_count;
1638}
1639
1640/**
1641 * Determines whether an input picture is discarded or not
1642 * and if not determines the length of the next chain of B frames
1643 * and moves these pictures (including the P frame) into
1644 * reordered_input_picture.
1645 * input_picture[0] is always NULL when exiting this function, even on error;
1646 * reordered_input_picture[0] is always NULL when exiting this function on error.
1647 */
1649{
1650 MPVEncContext *const s = &m->s;
1651
1652 /* Either nothing to do or can't do anything */
1653 if (m->reordered_input_picture[0] || !m->input_picture[0])
1654 return 0;
1655
1656 /* set next picture type & ordering */
1658 if (m->picture_in_gop_number < m->gop_size &&
1659 s->c.next_pic.ptr &&
1660 skip_check(m, m->input_picture[0], s->c.next_pic.ptr)) {
1661 // FIXME check that the gop check above is +-1 correct
1663
1664 ff_vbv_update(m, 0);
1665
1666 return 0;
1667 }
1668 }
1669
1670 if (/* m->picture_in_gop_number >= m->gop_size || */
1671 !s->c.next_pic.ptr || m->intra_only) {
1673 m->input_picture[0] = NULL;
1677 } else {
1678 int b_frames = 0;
1679
1680 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS2) {
1681 for (int i = 0; i < m->max_b_frames + 1; i++) {
1682 int pict_num = m->input_picture[0]->display_picture_number + i;
1683
1684 if (pict_num >= m->rc_context.num_entries)
1685 break;
1686 if (!m->input_picture[i]) {
1688 break;
1689 }
1690
1691 m->input_picture[i]->f->pict_type =
1692 m->rc_context.entry[pict_num].new_pict_type;
1693 }
1694 }
1695
1696 if (m->b_frame_strategy == 0) {
1697 b_frames = m->max_b_frames;
1698 while (b_frames && !m->input_picture[b_frames])
1699 b_frames--;
1700 } else if (m->b_frame_strategy == 1) {
1701 for (int i = 1; i < m->max_b_frames + 1; i++) {
1702 if (m->input_picture[i] &&
1703 m->input_picture[i]->b_frame_score == 0) {
1706 m->input_picture[i ]->f->data[0],
1707 m->input_picture[i - 1]->f->data[0],
1708 s->c.linesize) + 1;
1709 }
1710 }
1711 for (int i = 0;; i++) {
1712 if (i >= m->max_b_frames + 1 ||
1713 !m->input_picture[i] ||
1714 m->input_picture[i]->b_frame_score - 1 >
1715 s->c.mb_num / m->b_sensitivity) {
1716 b_frames = FFMAX(0, i - 1);
1717 break;
1718 }
1719 }
1720
1721 /* reset scores */
1722 for (int i = 0; i < b_frames + 1; i++)
1723 m->input_picture[i]->b_frame_score = 0;
1724 } else if (m->b_frame_strategy == 2) {
1725 b_frames = estimate_best_b_count(m);
1726 if (b_frames < 0) {
1728 return b_frames;
1729 }
1730 }
1731
1732 if (s->c.codec_id == AV_CODEC_ID_MPEG4)
1733 while (b_frames &&
1734 m->input_picture[b_frames]->f->pts * s->c.avctx->time_base.num -
1735 s->c.last_non_b_time > UINT16_MAX)
1736 b_frames--;
1737
1738 for (int i = b_frames - 1; i >= 0; i--) {
1739 int type = m->input_picture[i]->f->pict_type;
1740 if (type && type != AV_PICTURE_TYPE_B)
1741 b_frames = i;
1742 }
1743 if (m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1744 b_frames == m->max_b_frames) {
1745 av_log(s->c.avctx, AV_LOG_ERROR,
1746 "warning, too many B-frames in a row\n");
1747 }
1748
1749 if (m->picture_in_gop_number + b_frames >= m->gop_size) {
1750 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1752 b_frames = m->gop_size - m->picture_in_gop_number - 1;
1753 } else {
1754 if (s->c.avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1755 b_frames = 0;
1756 m->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1757 }
1758 }
1759
1760 if ((s->c.avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1761 m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1762 b_frames--;
1763
1764 m->reordered_input_picture[0] = m->input_picture[b_frames];
1765 m->input_picture[b_frames] = NULL;
1770 for (int i = 0; i < b_frames; i++) {
1772 m->input_picture[i] = NULL;
1777 }
1778 }
1779
1780 return 0;
1781}
1782
1784{
1785 MPVEncContext *const s = &m->s;
1786 int ret;
1787
1789
1790 for (int i = 1; i <= MPVENC_MAX_B_FRAMES; i++)
1793
1794 ret = set_bframe_chain_length(m);
1795 av_assert1(!m->input_picture[0]);
1796 if (ret < 0)
1797 return ret;
1798
1799 av_frame_unref(s->new_pic);
1800
1801 if (m->reordered_input_picture[0]) {
1804
1805 if (m->reordered_input_picture[0]->shared || s->c.avctx->rc_buffer_size) {
1806 // input is a shared pix, so we can't modify it -> allocate a new
1807 // one & ensure that the shared one is reusable
1808 av_frame_move_ref(s->new_pic, m->reordered_input_picture[0]->f);
1809
1810 ret = prepare_picture(s, m->reordered_input_picture[0]->f, s->new_pic);
1811 if (ret < 0)
1812 goto fail;
1813 } else {
1814 // input is not a shared pix -> reuse buffer for current_pix
1815 ret = av_frame_ref(s->new_pic, m->reordered_input_picture[0]->f);
1816 if (ret < 0)
1817 goto fail;
1818 for (int i = 0; i < MPV_MAX_PLANES; i++)
1819 s->new_pic->data[i] += INPLACE_OFFSET;
1820 }
1821 s->c.cur_pic.ptr = m->reordered_input_picture[0];
1823 av_assert1(s->c.mb_width == s->c.buffer_pools.alloc_mb_width);
1824 av_assert1(s->c.mb_height == s->c.buffer_pools.alloc_mb_height);
1825 av_assert1(s->c.mb_stride == s->c.buffer_pools.alloc_mb_stride);
1826 ret = ff_mpv_alloc_pic_accessories(s->c.avctx, &s->c.cur_pic,
1827 &s->c.sc, &s->c.buffer_pools, s->c.mb_height);
1828 if (ret < 0) {
1829 ff_mpv_unref_picture(&s->c.cur_pic);
1830 return ret;
1831 }
1832 s->picture_number = s->c.cur_pic.ptr->display_picture_number;
1833
1834 }
1835 return 0;
1836fail:
1838 return ret;
1839}
1840
1841static void frame_end(MPVMainEncContext *const m)
1842{
1843 MPVEncContext *const s = &m->s;
1844
1845 if (s->me.unrestricted_mv &&
1846 s->c.cur_pic.reference &&
1847 !m->intra_only) {
1848 int hshift = s->c.chroma_x_shift;
1849 int vshift = s->c.chroma_y_shift;
1850 s->mpvencdsp.draw_edges(s->c.cur_pic.data[0],
1851 s->c.cur_pic.linesize[0],
1852 s->c.h_edge_pos, s->c.v_edge_pos,
1855 s->mpvencdsp.draw_edges(s->c.cur_pic.data[1],
1856 s->c.cur_pic.linesize[1],
1857 s->c.h_edge_pos >> hshift,
1858 s->c.v_edge_pos >> vshift,
1859 EDGE_WIDTH >> hshift,
1860 EDGE_WIDTH >> vshift,
1862 s->mpvencdsp.draw_edges(s->c.cur_pic.data[2],
1863 s->c.cur_pic.linesize[2],
1864 s->c.h_edge_pos >> hshift,
1865 s->c.v_edge_pos >> vshift,
1866 EDGE_WIDTH >> hshift,
1867 EDGE_WIDTH >> vshift,
1869 }
1870
1871 m->last_pict_type = s->c.pict_type;
1872 m->last_lambda_for[s->c.pict_type] = s->c.cur_pic.ptr->f->quality;
1873 if (s->c.pict_type != AV_PICTURE_TYPE_B)
1874 m->last_non_b_pict_type = s->c.pict_type;
1875}
1876
1878{
1879 MPVEncContext *const s = &m->s;
1880 int intra, i;
1881
1882 for (intra = 0; intra < 2; intra++) {
1883 if (s->dct_count[intra] > (1 << 16)) {
1884 for (i = 0; i < 64; i++) {
1885 s->dct_error_sum[intra][i] >>= 1;
1886 }
1887 s->dct_count[intra] >>= 1;
1888 }
1889
1890 for (i = 0; i < 64; i++) {
1891 s->dct_offset[intra][i] = (m->noise_reduction *
1892 s->dct_count[intra] +
1893 s->dct_error_sum[intra][i] / 2) /
1894 (s->dct_error_sum[intra][i] + 1);
1895 }
1896 }
1897}
1898
1899static void frame_start(MPVMainEncContext *const m)
1900{
1901 MPVEncContext *const s = &m->s;
1902
1903 s->c.cur_pic.ptr->f->pict_type = s->c.pict_type;
1904
1905 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
1906 ff_mpv_replace_picture(&s->c.last_pic, &s->c.next_pic);
1907 ff_mpv_replace_picture(&s->c.next_pic, &s->c.cur_pic);
1908 }
1909
1910 av_assert2(!!m->noise_reduction == !!s->dct_error_sum);
1911 if (s->dct_error_sum) {
1913 }
1914}
1915
1917 const AVFrame *pic_arg, int *got_packet)
1918{
1919 MPVMainEncContext *const m = avctx->priv_data;
1920 MPVEncContext *const s = &m->s;
1921 int stuffing_count, ret;
1922 int context_count = s->c.slice_context_count;
1923
1924 ff_mpv_unref_picture(&s->c.cur_pic);
1925
1926 m->vbv_ignore_qmax = 0;
1927
1929
1930 ret = load_input_picture(m, pic_arg);
1931 if (ret < 0)
1932 return ret;
1933
1934 ret = select_input_picture(m);
1935 if (ret < 0)
1936 return ret;
1937
1938 /* output? */
1939 if (s->new_pic->data[0]) {
1940 int growing_buffer = context_count == 1 && !s->data_partitioning;
1941 size_t pkt_size = 10000 + s->c.mb_width * s->c.mb_height *
1942 (growing_buffer ? 64 : (MAX_MB_BYTES + 100));
1943 if (CONFIG_MJPEG_ENCODER && avctx->codec_id == AV_CODEC_ID_MJPEG) {
1944 ret = ff_mjpeg_add_icc_profile_size(avctx, s->new_pic, &pkt_size);
1945 if (ret < 0)
1946 return ret;
1947 }
1948 if ((ret = ff_alloc_packet(avctx, pkt, pkt_size)) < 0)
1949 return ret;
1951 if (s->mb_info) {
1952 s->mb_info_ptr = av_packet_new_side_data(pkt,
1954 s->c.mb_width*s->c.mb_height*12);
1955 if (!s->mb_info_ptr)
1956 return AVERROR(ENOMEM);
1957 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1958 }
1959
1960 s->c.pict_type = s->new_pic->pict_type;
1961 frame_start(m);
1962vbv_retry:
1963 ret = encode_picture(m, pkt);
1964 if (growing_buffer) {
1965 av_assert0(s->pb.buf == avctx->internal->byte_buffer);
1966 pkt->data = s->pb.buf;
1967 pkt->size = avctx->internal->byte_buffer_size;
1968 }
1969 if (ret < 0)
1970 return -1;
1971
1972 frame_end(m);
1973
1974 if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) && s->c.out_format == FMT_MJPEG)
1976
1977 if (avctx->rc_buffer_size) {
1978 RateControlContext *rcc = &m->rc_context;
1979 int max_size = FFMAX(rcc->buffer_index * avctx->rc_max_available_vbv_use, rcc->buffer_index - 500);
1980 int hq = (avctx->mb_decision == FF_MB_DECISION_RD || avctx->trellis);
1981 int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139;
1982
1983 if (put_bits_count(&s->pb) > max_size &&
1984 s->lambda < m->lmax) {
1985 m->next_lambda = FFMAX(s->lambda + min_step, s->lambda *
1986 (s->c.qscale + 1) / s->c.qscale);
1987 if (s->adaptive_quant) {
1988 for (int i = 0; i < s->c.mb_height * s->c.mb_stride; i++)
1989 s->lambda_table[i] =
1990 FFMAX(s->lambda_table[i] + min_step,
1991 s->lambda_table[i] * (s->c.qscale + 1) /
1992 s->c.qscale);
1993 }
1994 s->c.mb_skipped = 0; // done in frame_start()
1995 // done in encode_picture() so we must undo it
1996 if (s->c.pict_type == AV_PICTURE_TYPE_P) {
1997 s->c.no_rounding ^= s->flipflop_rounding;
1998 }
1999 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
2000 s->c.time_base = s->c.last_time_base;
2001 s->c.last_non_b_time = s->c.time - s->c.pp_time;
2002 }
2003 m->vbv_ignore_qmax = 1;
2004 av_log(avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n");
2005 goto vbv_retry;
2006 }
2007
2008 av_assert0(avctx->rc_max_rate);
2009 }
2010
2011 if (avctx->flags & AV_CODEC_FLAG_PASS1)
2013
2014 for (int i = 0; i < MPV_MAX_PLANES; i++)
2015 avctx->error[i] += s->encoding_error[i];
2016 ff_encode_add_stats_side_data(pkt, s->c.cur_pic.ptr->f->quality,
2017 s->encoding_error,
2019 s->c.pict_type);
2020
2021 if (avctx->flags & AV_CODEC_FLAG_PASS1)
2022 assert(put_bits_count(&s->pb) == m->header_bits + s->mv_bits +
2023 s->misc_bits + s->i_tex_bits +
2024 s->p_tex_bits);
2025 flush_put_bits(&s->pb);
2026 m->frame_bits = put_bits_count(&s->pb);
2027
2028 stuffing_count = ff_vbv_update(m, m->frame_bits);
2029 m->stuffing_bits = 8*stuffing_count;
2030 if (stuffing_count) {
2031 if (put_bytes_left(&s->pb, 0) < stuffing_count + 50) {
2032 av_log(avctx, AV_LOG_ERROR, "stuffing too large\n");
2033 return -1;
2034 }
2035
2036 switch (s->c.codec_id) {
2039 while (stuffing_count--) {
2040 put_bits(&s->pb, 8, 0);
2041 }
2042 break;
2043 case AV_CODEC_ID_MPEG4:
2044 put_bits(&s->pb, 16, 0);
2045 put_bits(&s->pb, 16, 0x1C3);
2046 stuffing_count -= 4;
2047 while (stuffing_count--) {
2048 put_bits(&s->pb, 8, 0xFF);
2049 }
2050 break;
2051 default:
2052 av_log(avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2053 m->stuffing_bits = 0;
2054 }
2055 flush_put_bits(&s->pb);
2056 m->frame_bits = put_bits_count(&s->pb);
2057 }
2058
2059 /* update MPEG-1/2 vbv_delay for CBR */
2060 if (avctx->rc_max_rate &&
2061 avctx->rc_min_rate == avctx->rc_max_rate &&
2062 s->c.out_format == FMT_MPEG1 &&
2063 90000LL * (avctx->rc_buffer_size - 1) <=
2064 avctx->rc_max_rate * 0xFFFFLL) {
2065 AVCPBProperties *props;
2066 size_t props_size;
2067
2068 int vbv_delay, min_delay;
2069 double inbits = avctx->rc_max_rate *
2070 av_q2d(avctx->time_base);
2071 int minbits = m->frame_bits - 8 *
2072 (m->vbv_delay_pos - 1);
2073 double bits = m->rc_context.buffer_index + minbits - inbits;
2074 uint8_t *const vbv_delay_ptr = s->pb.buf + m->vbv_delay_pos;
2075
2076 if (bits < 0)
2077 av_log(avctx, AV_LOG_ERROR,
2078 "Internal error, negative bits\n");
2079
2080 av_assert1(s->c.repeat_first_field == 0);
2081
2082 vbv_delay = bits * 90000 / avctx->rc_max_rate;
2083 min_delay = (minbits * 90000LL + avctx->rc_max_rate - 1) /
2084 avctx->rc_max_rate;
2085
2086 vbv_delay = FFMAX(vbv_delay, min_delay);
2087
2088 av_assert0(vbv_delay < 0xFFFF);
2089
2090 vbv_delay_ptr[0] &= 0xF8;
2091 vbv_delay_ptr[0] |= vbv_delay >> 13;
2092 vbv_delay_ptr[1] = vbv_delay >> 5;
2093 vbv_delay_ptr[2] &= 0x07;
2094 vbv_delay_ptr[2] |= vbv_delay << 3;
2095
2096 props = av_cpb_properties_alloc(&props_size);
2097 if (!props)
2098 return AVERROR(ENOMEM);
2099 props->vbv_delay = vbv_delay * 300;
2100
2102 (uint8_t*)props, props_size);
2103 if (ret < 0) {
2104 av_freep(&props);
2105 return ret;
2106 }
2107 }
2108 m->total_bits += m->frame_bits;
2109
2110 pkt->pts = s->c.cur_pic.ptr->f->pts;
2111 pkt->duration = s->c.cur_pic.ptr->f->duration;
2112 if (!s->c.low_delay && s->c.pict_type != AV_PICTURE_TYPE_B) {
2113 if (!s->c.cur_pic.ptr->coded_picture_number)
2114 pkt->dts = pkt->pts - m->dts_delta;
2115 else
2116 pkt->dts = m->reordered_pts;
2117 m->reordered_pts = pkt->pts;
2118 } else
2119 pkt->dts = pkt->pts;
2120
2121 // the no-delay case is handled in generic code
2122 if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY) {
2123 ret = ff_encode_reordered_opaque(avctx, pkt, s->c.cur_pic.ptr->f);
2124 if (ret < 0)
2125 return ret;
2126 }
2127
2128 if (s->c.cur_pic.ptr->f->flags & AV_FRAME_FLAG_KEY)
2129 pkt->flags |= AV_PKT_FLAG_KEY;
2130 if (s->mb_info)
2132 } else {
2133 m->frame_bits = 0;
2134 }
2135
2136 ff_mpv_unref_picture(&s->c.cur_pic);
2137
2138 av_assert1((m->frame_bits & 7) == 0);
2139
2140 pkt->size = m->frame_bits / 8;
2141 *got_packet = !!pkt->size;
2142 return 0;
2143}
2144
2146 int n, int threshold)
2147{
2148 static const char tab[64] = {
2149 3, 2, 2, 1, 1, 1, 1, 1,
2150 1, 1, 1, 1, 1, 1, 1, 1,
2151 1, 1, 1, 1, 1, 1, 1, 1,
2152 0, 0, 0, 0, 0, 0, 0, 0,
2153 0, 0, 0, 0, 0, 0, 0, 0,
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 };
2158 int score = 0;
2159 int run = 0;
2160 int i;
2161 int16_t *block = s->block[n];
2162 const int last_index = s->c.block_last_index[n];
2163 int skip_dc;
2164
2165 if (threshold < 0) {
2166 skip_dc = 0;
2167 threshold = -threshold;
2168 } else
2169 skip_dc = 1;
2170
2171 /* Are all we could set to zero already zero? */
2172 if (last_index <= skip_dc - 1)
2173 return;
2174
2175 for (i = 0; i <= last_index; i++) {
2176 const int j = s->c.intra_scantable.permutated[i];
2177 const int level = FFABS(block[j]);
2178 if (level == 1) {
2179 if (skip_dc && i == 0)
2180 continue;
2181 score += tab[run];
2182 run = 0;
2183 } else if (level > 1) {
2184 return;
2185 } else {
2186 run++;
2187 }
2188 }
2189 if (score >= threshold)
2190 return;
2191 for (i = skip_dc; i <= last_index; i++) {
2192 const int j = s->c.intra_scantable.permutated[i];
2193 block[j] = 0;
2194 }
2195 if (block[0])
2196 s->c.block_last_index[n] = 0;
2197 else
2198 s->c.block_last_index[n] = -1;
2199}
2200
2201static inline void clip_coeffs(const MPVEncContext *const s, int16_t block[],
2202 int last_index)
2203{
2204 int i;
2205 const int maxlevel = s->max_qcoeff;
2206 const int minlevel = s->min_qcoeff;
2207 int overflow = 0;
2208
2209 if (s->c.mb_intra) {
2210 i = 1; // skip clipping of intra dc
2211 } else
2212 i = 0;
2213
2214 for (; i <= last_index; i++) {
2215 const int j = s->c.intra_scantable.permutated[i];
2216 int level = block[j];
2217
2218 if (level > maxlevel) {
2219 level = maxlevel;
2220 overflow++;
2221 } else if (level < minlevel) {
2222 level = minlevel;
2223 overflow++;
2224 }
2225
2226 block[j] = level;
2227 }
2228
2229 if (overflow && s->c.avctx->mb_decision == FF_MB_DECISION_SIMPLE)
2230 av_log(s->c.avctx, AV_LOG_INFO,
2231 "warning, clipping %d dct coefficients to %d..%d\n",
2232 overflow, minlevel, maxlevel);
2233}
2234
2235static void get_visual_weight(int16_t *weight, const uint8_t *ptr, int stride)
2236{
2237 int x, y;
2238 // FIXME optimize
2239 for (y = 0; y < 8; y++) {
2240 for (x = 0; x < 8; x++) {
2241 int x2, y2;
2242 int sum = 0;
2243 int sqr = 0;
2244 int count = 0;
2245
2246 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
2247 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
2248 int v = ptr[x2 + y2 * stride];
2249 sum += v;
2250 sqr += v * v;
2251 count++;
2252 }
2253 }
2254 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2255 }
2256 }
2257}
2258
2260 int motion_x, int motion_y,
2261 int mb_block_height,
2262 int mb_block_width,
2263 int mb_block_count,
2264 int chroma_x_shift,
2265 int chroma_y_shift,
2266 int chroma_format)
2267{
2268/* Interlaced DCT is only possible with MPEG-2 and MPEG-4
2269 * and neither of these encoders currently supports 444. */
2270#define INTERLACED_DCT(s) ((chroma_format == CHROMA_420 || chroma_format == CHROMA_422) && \
2271 (s)->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT)
2272 DECLARE_ALIGNED(16, int16_t, weight)[12][64];
2273 int16_t orig[12][64];
2274 const int mb_x = s->c.mb_x;
2275 const int mb_y = s->c.mb_y;
2276 int i;
2277 int skip_dct[12];
2278 int dct_offset = s->c.linesize * 8; // default for progressive frames
2279 int uv_dct_offset = s->c.uvlinesize * 8;
2280 const uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2281 ptrdiff_t wrap_y, wrap_c;
2282
2283 for (i = 0; i < mb_block_count; i++)
2284 skip_dct[i] = s->skipdct;
2285
2286 if (s->adaptive_quant) {
2287 const int last_qp = s->c.qscale;
2288 const int mb_xy = mb_x + mb_y * s->c.mb_stride;
2289
2290 s->lambda = s->lambda_table[mb_xy];
2291 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
2293
2294 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2295 s->dquant = s->c.cur_pic.qscale_table[mb_xy] - last_qp;
2296
2297 if (s->c.out_format == FMT_H263) {
2298 s->dquant = av_clip(s->dquant, -2, 2);
2299
2300 if (s->c.codec_id == AV_CODEC_ID_MPEG4) {
2301 if (!s->c.mb_intra) {
2302 if (s->c.pict_type == AV_PICTURE_TYPE_B) {
2303 if (s->dquant & 1 || s->c.mv_dir & MV_DIRECT)
2304 s->dquant = 0;
2305 }
2306 if (s->c.mv_type == MV_TYPE_8X8)
2307 s->dquant = 0;
2308 }
2309 }
2310 }
2311 }
2312 ff_set_qscale(&s->c, last_qp + s->dquant);
2313 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2314 ff_set_qscale(&s->c, s->c.qscale + s->dquant);
2315
2316 wrap_y = s->c.linesize;
2317 wrap_c = s->c.uvlinesize;
2318 ptr_y = s->new_pic->data[0] +
2319 (mb_y * 16 * wrap_y) + mb_x * 16;
2320 ptr_cb = s->new_pic->data[1] +
2321 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2322 ptr_cr = s->new_pic->data[2] +
2323 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2324
2325 if ((mb_x * 16 + 16 > s->c.width || mb_y * 16 + 16 > s->c.height) &&
2326 s->c.codec_id != AV_CODEC_ID_AMV) {
2327 uint8_t *ebuf = s->c.sc.edge_emu_buffer + 38 * wrap_y;
2328 int cw = (s->c.width + chroma_x_shift) >> chroma_x_shift;
2329 int ch = (s->c.height + chroma_y_shift) >> chroma_y_shift;
2330 s->c.vdsp.emulated_edge_mc(ebuf, ptr_y,
2331 wrap_y, wrap_y,
2332 16, 16, mb_x * 16, mb_y * 16,
2333 s->c.width, s->c.height);
2334 ptr_y = ebuf;
2335 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y, ptr_cb,
2336 wrap_c, wrap_c,
2337 mb_block_width, mb_block_height,
2338 mb_x * mb_block_width, mb_y * mb_block_height,
2339 cw, ch);
2340 ptr_cb = ebuf + 16 * wrap_y;
2341 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y + 16, ptr_cr,
2342 wrap_c, wrap_c,
2343 mb_block_width, mb_block_height,
2344 mb_x * mb_block_width, mb_y * mb_block_height,
2345 cw, ch);
2346 ptr_cr = ebuf + 16 * wrap_y + 16;
2347 }
2348
2349 if (s->c.mb_intra) {
2350 if (INTERLACED_DCT(s)) {
2351 int progressive_score, interlaced_score;
2352
2353 s->c.interlaced_dct = 0;
2354 progressive_score = s->ildct_cmp[1](s, ptr_y, NULL, wrap_y, 8) +
2355 s->ildct_cmp[1](s, ptr_y + wrap_y * 8,
2356 NULL, wrap_y, 8) - 400;
2357
2358 if (progressive_score > 0) {
2359 interlaced_score = s->ildct_cmp[1](s, ptr_y,
2360 NULL, wrap_y * 2, 8) +
2361 s->ildct_cmp[1](s, ptr_y + wrap_y,
2362 NULL, wrap_y * 2, 8);
2363 if (progressive_score > interlaced_score) {
2364 s->c.interlaced_dct = 1;
2365
2366 dct_offset = wrap_y;
2367 uv_dct_offset = wrap_c;
2368 wrap_y <<= 1;
2369 if (chroma_format == CHROMA_422 ||
2370 chroma_format == CHROMA_444)
2371 wrap_c <<= 1;
2372 }
2373 }
2374 }
2375
2376 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2377 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2378 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2379 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2380
2381 if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) {
2382 skip_dct[4] = 1;
2383 skip_dct[5] = 1;
2384 } else {
2385 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2386 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2387 if (chroma_format == CHROMA_422) {
2388 s->pdsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2389 s->pdsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2390 } else if (chroma_format == CHROMA_444) {
2391 s->pdsp.get_pixels(s->block[ 6], ptr_cb + 8, wrap_c);
2392 s->pdsp.get_pixels(s->block[ 7], ptr_cr + 8, wrap_c);
2393 s->pdsp.get_pixels(s->block[ 8], ptr_cb + uv_dct_offset, wrap_c);
2394 s->pdsp.get_pixels(s->block[ 9], ptr_cr + uv_dct_offset, wrap_c);
2395 s->pdsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2396 s->pdsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2397 }
2398 }
2399 } else {
2400 op_pixels_func (*op_pix)[4];
2401 qpel_mc_func (*op_qpix)[16];
2402 uint8_t *dest_y, *dest_cb, *dest_cr;
2403
2404 dest_y = s->c.dest[0];
2405 dest_cb = s->c.dest[1];
2406 dest_cr = s->c.dest[2];
2407
2408 if ((!s->c.no_rounding) || s->c.pict_type == AV_PICTURE_TYPE_B) {
2409 op_pix = s->c.hdsp.put_pixels_tab;
2410 op_qpix = s->c.qdsp.put_qpel_pixels_tab;
2411 } else {
2412 op_pix = s->c.hdsp.put_no_rnd_pixels_tab;
2413 op_qpix = s->c.qdsp.put_no_rnd_qpel_pixels_tab;
2414 }
2415
2416 if (s->c.mv_dir & MV_DIR_FORWARD) {
2417 ff_mpv_motion(&s->c, dest_y, dest_cb, dest_cr, 0,
2418 s->c.last_pic.data,
2419 op_pix, op_qpix);
2420 op_pix = s->c.hdsp.avg_pixels_tab;
2421 op_qpix = s->c.qdsp.avg_qpel_pixels_tab;
2422 }
2423 if (s->c.mv_dir & MV_DIR_BACKWARD) {
2424 ff_mpv_motion(&s->c, dest_y, dest_cb, dest_cr, 1,
2425 s->c.next_pic.data,
2426 op_pix, op_qpix);
2427 }
2428
2429 if (INTERLACED_DCT(s)) {
2430 int progressive_score, interlaced_score;
2431
2432 s->c.interlaced_dct = 0;
2433 progressive_score = s->ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2434 s->ildct_cmp[0](s, dest_y + wrap_y * 8,
2435 ptr_y + wrap_y * 8,
2436 wrap_y, 8) - 400;
2437
2438 if (s->c.avctx->ildct_cmp == FF_CMP_VSSE)
2439 progressive_score -= 400;
2440
2441 if (progressive_score > 0) {
2442 interlaced_score = s->ildct_cmp[0](s, dest_y, ptr_y,
2443 wrap_y * 2, 8) +
2444 s->ildct_cmp[0](s, dest_y + wrap_y,
2445 ptr_y + wrap_y,
2446 wrap_y * 2, 8);
2447
2448 if (progressive_score > interlaced_score) {
2449 s->c.interlaced_dct = 1;
2450
2451 dct_offset = wrap_y;
2452 uv_dct_offset = wrap_c;
2453 wrap_y <<= 1;
2454 if (chroma_format == CHROMA_422)
2455 wrap_c <<= 1;
2456 }
2457 }
2458 }
2459
2460 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2461 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2462 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2463 dest_y + dct_offset, wrap_y);
2464 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2465 dest_y + dct_offset + 8, wrap_y);
2466
2467 if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) {
2468 skip_dct[4] = 1;
2469 skip_dct[5] = 1;
2470 } else {
2471 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2472 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2473 if (!chroma_y_shift) { /* 422 */
2474 s->pdsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
2475 dest_cb + uv_dct_offset, wrap_c);
2476 s->pdsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
2477 dest_cr + uv_dct_offset, wrap_c);
2478 }
2479 }
2480 /* pre quantization */
2481 if (s->mc_mb_var[s->c.mb_stride * mb_y + mb_x] < 2 * s->c.qscale * s->c.qscale) {
2482 // FIXME optimize
2483 if (s->sad_cmp[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->c.qscale)
2484 skip_dct[0] = 1;
2485 if (s->sad_cmp[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->c.qscale)
2486 skip_dct[1] = 1;
2487 if (s->sad_cmp[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2488 wrap_y, 8) < 20 * s->c.qscale)
2489 skip_dct[2] = 1;
2490 if (s->sad_cmp[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2491 wrap_y, 8) < 20 * s->c.qscale)
2492 skip_dct[3] = 1;
2493 if (s->sad_cmp[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->c.qscale)
2494 skip_dct[4] = 1;
2495 if (s->sad_cmp[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->c.qscale)
2496 skip_dct[5] = 1;
2497 if (!chroma_y_shift) { /* 422 */
2498 if (s->sad_cmp[1](NULL, ptr_cb + uv_dct_offset,
2499 dest_cb + uv_dct_offset,
2500 wrap_c, 8) < 20 * s->c.qscale)
2501 skip_dct[6] = 1;
2502 if (s->sad_cmp[1](NULL, ptr_cr + uv_dct_offset,
2503 dest_cr + uv_dct_offset,
2504 wrap_c, 8) < 20 * s->c.qscale)
2505 skip_dct[7] = 1;
2506 }
2507 }
2508 }
2509
2510 if (s->quantizer_noise_shaping) {
2511 if (!skip_dct[0])
2512 get_visual_weight(weight[0], ptr_y , wrap_y);
2513 if (!skip_dct[1])
2514 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2515 if (!skip_dct[2])
2516 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2517 if (!skip_dct[3])
2518 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2519 if (!skip_dct[4])
2520 get_visual_weight(weight[4], ptr_cb , wrap_c);
2521 if (!skip_dct[5])
2522 get_visual_weight(weight[5], ptr_cr , wrap_c);
2523 if (!chroma_y_shift) { /* 422 */
2524 if (!skip_dct[6])
2525 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2526 wrap_c);
2527 if (!skip_dct[7])
2528 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2529 wrap_c);
2530 }
2531 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2532 }
2533
2534 /* DCT & quantize */
2535 av_assert2(s->c.out_format != FMT_MJPEG || s->c.qscale == 8);
2536 {
2537 for (i = 0; i < mb_block_count; i++) {
2538 if (!skip_dct[i]) {
2539 int overflow;
2540 s->c.block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->c.qscale, &overflow);
2541 // FIXME we could decide to change to quantizer instead of
2542 // clipping
2543 // JS: I don't think that would be a good idea it could lower
2544 // quality instead of improve it. Just INTRADC clipping
2545 // deserves changes in quantizer
2546 if (overflow)
2547 clip_coeffs(s, s->block[i], s->c.block_last_index[i]);
2548 } else
2549 s->c.block_last_index[i] = -1;
2550 }
2551 if (s->quantizer_noise_shaping) {
2552 for (i = 0; i < mb_block_count; i++) {
2553 if (!skip_dct[i]) {
2554 s->c.block_last_index[i] =
2555 dct_quantize_refine(s, s->block[i], weight[i],
2556 orig[i], i, s->c.qscale);
2557 }
2558 }
2559 }
2560
2561 if (s->luma_elim_threshold && !s->c.mb_intra)
2562 for (i = 0; i < 4; i++)
2563 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2564 if (s->chroma_elim_threshold && !s->c.mb_intra)
2565 for (i = 4; i < mb_block_count; i++)
2566 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2567
2568 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2569 for (i = 0; i < mb_block_count; i++) {
2570 if (s->c.block_last_index[i] == -1)
2571 s->coded_score[i] = INT_MAX / 256;
2572 }
2573 }
2574 }
2575
2576 if ((s->c.avctx->flags & AV_CODEC_FLAG_GRAY) && s->c.mb_intra) {
2577 s->c.block_last_index[4] =
2578 s->c.block_last_index[5] = 0;
2579 s->block[4][0] =
2580 s->block[5][0] = (1024 + s->c.c_dc_scale / 2) / s->c.c_dc_scale;
2581 if (!chroma_y_shift) { /* 422 / 444 */
2582 for (i=6; i<12; i++) {
2583 s->c.block_last_index[i] = 0;
2584 s->block[i][0] = s->block[4][0];
2585 }
2586 }
2587 }
2588
2589 // non c quantize code returns incorrect block_last_index FIXME
2590 if (s->c.alternate_scan && s->dct_quantize != dct_quantize_c) {
2591 for (i = 0; i < mb_block_count; i++) {
2592 int j;
2593 if (s->c.block_last_index[i] > 0) {
2594 for (j = 63; j > 0; j--) {
2595 if (s->block[i][s->c.intra_scantable.permutated[j]])
2596 break;
2597 }
2598 s->c.block_last_index[i] = j;
2599 }
2600 }
2601 }
2602
2603 s->encode_mb(s, s->block, motion_x, motion_y);
2604}
2605
2606static void encode_mb(MPVEncContext *const s, int motion_x, int motion_y)
2607{
2608 if (s->c.chroma_format == CHROMA_420)
2609 encode_mb_internal(s, motion_x, motion_y, 8, 8, 6, 1, 1, CHROMA_420);
2610 else if (s->c.chroma_format == CHROMA_422)
2611 encode_mb_internal(s, motion_x, motion_y, 16, 8, 8, 1, 0, CHROMA_422);
2612 else
2613 encode_mb_internal(s, motion_x, motion_y, 16, 16, 12, 0, 0, CHROMA_444);
2614}
2615
2634
2635#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE) \
2636static inline void BEFORE ##_context_before_encode(DST_TYPE *const d, \
2637 const SRC_TYPE *const s) \
2638{ \
2639 /* FIXME is memcpy faster than a loop? */ \
2640 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2641 \
2642 /* MPEG-1 */ \
2643 d->mb_skip_run = s->mb_skip_run; \
2644 for (int i = 0; i < 3; i++) \
2645 d->last_dc[i] = s->last_dc[i]; \
2646 \
2647 /* statistics */ \
2648 d->mv_bits = s->mv_bits; \
2649 d->i_tex_bits = s->i_tex_bits; \
2650 d->p_tex_bits = s->p_tex_bits; \
2651 d->i_count = s->i_count; \
2652 d->misc_bits = s->misc_bits; \
2653 d->last_bits = 0; \
2654 \
2655 d->c.mb_skipped = 0; \
2656 d->c.qscale = s->c.qscale; \
2657 d->dquant = s->dquant; \
2658 \
2659 d->esc3_level_length = s->esc3_level_length; \
2660} \
2661 \
2662static inline void AFTER ## _context_after_encode(DST_TYPE *const d, \
2663 const SRC_TYPE *const s, \
2664 int data_partitioning) \
2665{ \
2666 /* FIXME is memcpy faster than a loop? */ \
2667 memcpy(d->c.mv, s->c.mv, 2*4*2*sizeof(int)); \
2668 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2669 \
2670 /* MPEG-1 */ \
2671 d->mb_skip_run = s->mb_skip_run; \
2672 for (int i = 0; i < 3; i++) \
2673 d->last_dc[i] = s->last_dc[i]; \
2674 \
2675 /* statistics */ \
2676 d->mv_bits = s->mv_bits; \
2677 d->i_tex_bits = s->i_tex_bits; \
2678 d->p_tex_bits = s->p_tex_bits; \
2679 d->i_count = s->i_count; \
2680 d->misc_bits = s->misc_bits; \
2681 \
2682 d->c.mb_intra = s->c.mb_intra; \
2683 d->c.mb_skipped = s->c.mb_skipped; \
2684 d->c.mv_type = s->c.mv_type; \
2685 d->c.mv_dir = s->c.mv_dir; \
2686 d->pb = s->pb; \
2687 if (data_partitioning) { \
2688 d->pb2 = s->pb2; \
2689 d->tex_pb = s->tex_pb; \
2690 } \
2691 d->block = s->block; \
2692 for (int i = 0; i < 8; i++) \
2693 d->c.block_last_index[i] = s->c.block_last_index[i]; \
2694 d->c.interlaced_dct = s->c.interlaced_dct; \
2695 d->c.qscale = s->c.qscale; \
2696 \
2697 d->esc3_level_length = s->esc3_level_length; \
2698}
2699
2700COPY_CONTEXT(backup, save, MBBackup, MPVEncContext)
2701COPY_CONTEXT(reset, store, MPVEncContext, MBBackup)
2702
2703static void encode_mb_hq(MPVEncContext *const s, MBBackup *const backup, MBBackup *const best,
2704 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2705 int *dmin, int *next_block, int motion_x, int motion_y)
2706{
2707 int score;
2708 uint8_t *dest_backup[3];
2709
2710 reset_context_before_encode(s, backup);
2711
2712 s->block = s->blocks[*next_block];
2713 s->pb = pb[*next_block];
2714 if (s->data_partitioning) {
2715 s->pb2 = pb2 [*next_block];
2716 s->tex_pb= tex_pb[*next_block];
2717 }
2718
2719 if(*next_block){
2720 memcpy(dest_backup, s->c.dest, sizeof(s->c.dest));
2721 s->c.dest[0] = s->c.sc.rd_scratchpad;
2722 s->c.dest[1] = s->c.sc.rd_scratchpad + 16*s->c.linesize;
2723 s->c.dest[2] = s->c.sc.rd_scratchpad + 16*s->c.linesize + 8;
2724 av_assert0(s->c.linesize >= 32); //FIXME
2725 }
2726
2727 encode_mb(s, motion_x, motion_y);
2728
2729 score= put_bits_count(&s->pb);
2730 if (s->data_partitioning) {
2731 score+= put_bits_count(&s->pb2);
2732 score+= put_bits_count(&s->tex_pb);
2733 }
2734
2735 if (s->c.avctx->mb_decision == FF_MB_DECISION_RD) {
2736 mpv_reconstruct_mb(s, s->block);
2737
2738 score *= s->lambda2;
2739 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2740 }
2741
2742 if(*next_block){
2743 memcpy(s->c.dest, dest_backup, sizeof(s->c.dest));
2744 }
2745
2746 if(score<*dmin){
2747 *dmin= score;
2748 *next_block^=1;
2749
2750 save_context_after_encode(best, s, s->data_partitioning);
2751 }
2752}
2753
2754static int sse(const MPVEncContext *const s, const uint8_t *src1, const uint8_t *src2, int w, int h, int stride)
2755{
2756 const uint32_t *sq = ff_square_tab + 256;
2757 int acc=0;
2758 int x,y;
2759
2760 if(w==16 && h==16)
2761 return s->sse_cmp[0](NULL, src1, src2, stride, 16);
2762 else if(w==8 && h==8)
2763 return s->sse_cmp[1](NULL, src1, src2, stride, 8);
2764
2765 for(y=0; y<h; y++){
2766 for(x=0; x<w; x++){
2767 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2768 }
2769 }
2770
2771 av_assert2(acc>=0);
2772
2773 return acc;
2774}
2775
2776static int sse_mb(MPVEncContext *const s)
2777{
2778 int w= 16;
2779 int h= 16;
2780 int chroma_mb_w = w >> s->c.chroma_x_shift;
2781 int chroma_mb_h = h >> s->c.chroma_y_shift;
2782
2783 if (s->c.mb_x*16 + 16 > s->c.width ) w = s->c.width - s->c.mb_x*16;
2784 if (s->c.mb_y*16 + 16 > s->c.height) h = s->c.height- s->c.mb_y*16;
2785
2786 if(w==16 && h==16)
2787 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,
2788 s->c.dest[0], s->c.linesize, 16) +
2789 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,
2790 s->c.dest[1], s->c.uvlinesize, chroma_mb_h) +
2791 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,
2792 s->c.dest[2], s->c.uvlinesize, chroma_mb_h);
2793 else
2794 return sse(s, s->new_pic->data[0] + s->c.mb_x * 16 + s->c.mb_y * s->c.linesize * 16,
2795 s->c.dest[0], w, h, s->c.linesize) +
2796 sse(s, s->new_pic->data[1] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2797 s->c.dest[1], w >> s->c.chroma_x_shift, h >> s->c.chroma_y_shift, s->c.uvlinesize) +
2798 sse(s, s->new_pic->data[2] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2799 s->c.dest[2], w >> s->c.chroma_x_shift, h >> s->c.chroma_y_shift, s->c.uvlinesize);
2800}
2801
2803 MPVEncContext *const s = *(void**)arg;
2804
2805
2806 s->me.pre_pass = 1;
2807 s->me.dia_size = s->c.avctx->pre_dia_size;
2808 s->c.first_slice_line = 1;
2809 for (s->c.mb_y = s->c.end_mb_y - 1; s->c.mb_y >= s->c.start_mb_y; s->c.mb_y--) {
2810 for (s->c.mb_x = s->c.mb_width - 1; s->c.mb_x >=0 ; s->c.mb_x--)
2811 ff_pre_estimate_p_frame_motion(s, s->c.mb_x, s->c.mb_y);
2812 s->c.first_slice_line = 0;
2813 }
2814
2815 s->me.pre_pass = 0;
2816
2817 return 0;
2818}
2819
2821 MPVEncContext *const s = *(void**)arg;
2822
2823 s->me.dia_size = s->c.avctx->dia_size;
2824 s->c.first_slice_line = 1;
2825 for (s->c.mb_y = s->c.start_mb_y; s->c.mb_y < s->c.end_mb_y; s->c.mb_y++) {
2826 s->c.mb_x = 0; //for block init below
2828 for (s->c.mb_x = 0; s->c.mb_x < s->c.mb_width; s->c.mb_x++) {
2829 s->c.block_index[0] += 2;
2830 s->c.block_index[1] += 2;
2831 s->c.block_index[2] += 2;
2832 s->c.block_index[3] += 2;
2833
2834 /* compute motion vector & mb_type and store in context */
2835 if (s->c.pict_type == AV_PICTURE_TYPE_B)
2836 ff_estimate_b_frame_motion(s, s->c.mb_x, s->c.mb_y);
2837 else
2838 ff_estimate_p_frame_motion(s, s->c.mb_x, s->c.mb_y);
2839 }
2840 s->c.first_slice_line = 0;
2841 }
2842 return 0;
2843}
2844
2845static int mb_var_thread(AVCodecContext *c, void *arg){
2846 MPVEncContext *const s = *(void**)arg;
2847
2848 for (int mb_y = s->c.start_mb_y; mb_y < s->c.end_mb_y; mb_y++) {
2849 for (int mb_x = 0; mb_x < s->c.mb_width; mb_x++) {
2850 int xx = mb_x * 16;
2851 int yy = mb_y * 16;
2852 const uint8_t *pix = s->new_pic->data[0] + (yy * s->c.linesize) + xx;
2853 int varc;
2854 int sum = s->mpvencdsp.pix_sum(pix, s->c.linesize);
2855
2856 varc = (s->mpvencdsp.pix_norm1(pix, s->c.linesize) -
2857 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2858
2859 s->mb_var [s->c.mb_stride * mb_y + mb_x] = varc;
2860 s->mb_mean[s->c.mb_stride * mb_y + mb_x] = (sum+128)>>8;
2861 s->me.mb_var_sum_temp += varc;
2862 }
2863 }
2864 return 0;
2865}
2866
2868{
2869 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4) {
2870 if (s->partitioned_frame)
2872
2873 ff_mpeg4_stuffing(&s->pb);
2874 } else if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
2875 s->c.out_format == FMT_MJPEG) {
2877 } else if (CONFIG_SPEEDHQ_ENCODER && s->c.out_format == FMT_SPEEDHQ) {
2879 }
2880
2881 flush_put_bits(&s->pb);
2882
2883 if ((s->c.avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2884 s->misc_bits+= get_bits_diff(s);
2885}
2886
2887static void write_mb_info(MPVEncContext *const s)
2888{
2889 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2890 int offset = put_bits_count(&s->pb);
2891 int mba = s->c.mb_x + s->c.mb_width * (s->c.mb_y % s->gob_index);
2892 int gobn = s->c.mb_y / s->gob_index;
2893 int pred_x, pred_y;
2894 if (CONFIG_H263_ENCODER)
2895 ff_h263_pred_motion(&s->c, 0, 0, &pred_x, &pred_y);
2896 bytestream_put_le32(&ptr, offset);
2897 bytestream_put_byte(&ptr, s->c.qscale);
2898 bytestream_put_byte(&ptr, gobn);
2899 bytestream_put_le16(&ptr, mba);
2900 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2901 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2902 /* 4MV not implemented */
2903 bytestream_put_byte(&ptr, 0); /* hmv2 */
2904 bytestream_put_byte(&ptr, 0); /* vmv2 */
2905}
2906
2907static void update_mb_info(MPVEncContext *const s)
2908{
2909 if (!s->mb_info)
2910 return;
2911 if (put_bytes_count(&s->pb, 0) - s->prev_mb_info >= s->mb_info) {
2912 s->mb_info_size += 12;
2913 s->prev_mb_info = s->last_mb_info;
2914 }
2915
2916 s->last_mb_info = put_bytes_count(&s->pb, 0);
2917 if (!s->mb_info_size)
2918 s->mb_info_size += 12;
2920}
2921
2922int ff_mpv_reallocate_putbitbuffer(MPVEncContext *const s, size_t threshold, size_t size_increase)
2923{
2924 if (put_bytes_left(&s->pb, 0) < threshold
2925 && s->c.slice_context_count == 1
2926 && s->pb.buf == s->c.avctx->internal->byte_buffer) {
2927 int lastgob_pos = s->ptr_lastgob - s->pb.buf;
2928
2929 uint8_t *new_buffer = NULL;
2930 int new_buffer_size = 0;
2931
2932 if ((s->c.avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
2933 av_log(s->c.avctx, AV_LOG_ERROR, "Cannot reallocate putbit buffer\n");
2934 return AVERROR(ENOMEM);
2935 }
2936
2937 emms_c();
2938
2939 av_fast_padded_malloc(&new_buffer, &new_buffer_size,
2940 s->c.avctx->internal->byte_buffer_size + size_increase);
2941 if (!new_buffer)
2942 return AVERROR(ENOMEM);
2943
2944 memcpy(new_buffer, s->c.avctx->internal->byte_buffer, s->c.avctx->internal->byte_buffer_size);
2945 av_free(s->c.avctx->internal->byte_buffer);
2946 s->c.avctx->internal->byte_buffer = new_buffer;
2947 s->c.avctx->internal->byte_buffer_size = new_buffer_size;
2948 rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
2949 s->ptr_lastgob = s->pb.buf + lastgob_pos;
2950 }
2951 if (put_bytes_left(&s->pb, 0) < threshold)
2952 return AVERROR(EINVAL);
2953 return 0;
2954}
2955
2956static int encode_thread(AVCodecContext *c, void *arg){
2957 MPVEncContext *const s = *(void**)arg;
2958 int chr_h = 16 >> s->c.chroma_y_shift;
2959 int i;
2960 MBBackup best_s = { 0 }, backup_s;
2961 uint8_t bit_buf[2][MAX_MB_BYTES];
2962 // + 2 because ff_copy_bits() overreads
2963 uint8_t bit_buf2[2][MAX_PB2_MB_SIZE + 2];
2964 uint8_t bit_buf_tex[2][MAX_AC_TEX_MB_SIZE + 2];
2965 PutBitContext pb[2], pb2[2], tex_pb[2];
2966
2967 for(i=0; i<2; i++){
2968 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2969 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_PB2_MB_SIZE);
2970 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_AC_TEX_MB_SIZE);
2971 }
2972
2973 s->last_bits= put_bits_count(&s->pb);
2974 s->mv_bits=0;
2975 s->misc_bits=0;
2976 s->i_tex_bits=0;
2977 s->p_tex_bits=0;
2978 s->i_count=0;
2979
2980 for(i=0; i<3; i++){
2981 /* init last dc values */
2982 /* note: quant matrix value (8) is implied here */
2983 s->last_dc[i] = 128 << s->c.intra_dc_precision;
2984
2985 s->encoding_error[i] = 0;
2986 }
2987 if (s->c.codec_id == AV_CODEC_ID_AMV) {
2988 s->last_dc[0] = 128 * 8 / 13;
2989 s->last_dc[1] = 128 * 8 / 14;
2990 s->last_dc[2] = 128 * 8 / 14;
2991#if CONFIG_MPEG4_ENCODER
2992 } else if (s->partitioned_frame) {
2993 av_assert1(s->c.codec_id == AV_CODEC_ID_MPEG4);
2995#endif
2996 }
2997 s->mb_skip_run = 0;
2998 memset(s->c.last_mv, 0, sizeof(s->c.last_mv));
2999
3000 s->last_mv_dir = 0;
3001
3002 s->c.resync_mb_x = 0;
3003 s->c.resync_mb_y = 0;
3004 s->c.first_slice_line = 1;
3005 s->ptr_lastgob = s->pb.buf;
3006 for (int mb_y_order = s->c.start_mb_y; mb_y_order < s->c.end_mb_y; mb_y_order++) {
3007 int mb_y;
3008 if (CONFIG_SPEEDHQ_ENCODER && s->c.codec_id == AV_CODEC_ID_SPEEDHQ) {
3009 int first_in_slice;
3010 mb_y = ff_speedhq_mb_y_order_to_mb(mb_y_order, s->c.mb_height, &first_in_slice);
3011 if (first_in_slice && mb_y_order != s->c.start_mb_y)
3013 s->last_dc[0] = s->last_dc[1] = s->last_dc[2] = 1024;
3014 } else {
3015 mb_y = mb_y_order;
3016 }
3017 s->c.mb_x = 0;
3018 s->c.mb_y = mb_y;
3019
3020 ff_set_qscale(&s->c, s->c.qscale);
3022
3023 for (int mb_x = 0; mb_x < s->c.mb_width; mb_x++) {
3024 int mb_type, xy;
3025// int d;
3026 int dmin= INT_MAX;
3027 int dir;
3028 int size_increase = s->c.avctx->internal->byte_buffer_size/4
3029 + s->c.mb_width*MAX_MB_BYTES;
3030
3032 if (put_bytes_left(&s->pb, 0) < MAX_MB_BYTES){
3033 av_log(s->c.avctx, AV_LOG_ERROR, "encoded frame too large\n");
3034 return -1;
3035 }
3036 if (s->data_partitioning) {
3037 if (put_bytes_left(&s->pb2, 0) < MAX_MB_BYTES ||
3038 put_bytes_left(&s->tex_pb, 0) < MAX_MB_BYTES) {
3039 av_log(s->c.avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
3040 return -1;
3041 }
3042 }
3043
3044 s->c.mb_x = mb_x;
3045 s->c.mb_y = mb_y; // moved into loop, can get changed by H.261
3046 ff_update_block_index(&s->c, 8, 0, s->c.chroma_x_shift);
3047
3048 if (CONFIG_H261_ENCODER && s->c.codec_id == AV_CODEC_ID_H261)
3050 xy = s->c.mb_y * s->c.mb_stride + s->c.mb_x;
3051 mb_type = s->mb_type[xy];
3052
3053 /* write gob / video packet header */
3054 if(s->rtp_mode){
3055 int current_packet_size, is_gob_start;
3056
3057 current_packet_size = put_bytes_count(&s->pb, 1)
3058 - (s->ptr_lastgob - s->pb.buf);
3059
3060 is_gob_start = s->rtp_payload_size &&
3061 current_packet_size >= s->rtp_payload_size &&
3062 mb_y + mb_x > 0;
3063
3064 if (s->c.start_mb_y == mb_y && mb_y > 0 && mb_x == 0) is_gob_start = 1;
3065
3066 switch (s->c.codec_id) {
3067 case AV_CODEC_ID_H263:
3068 case AV_CODEC_ID_H263P:
3069 if (!s->h263_slice_structured)
3070 if (s->c.mb_x || s->c.mb_y % s->gob_index) is_gob_start = 0;
3071 break;
3073 if (s->c.mb_x == 0 && s->c.mb_y != 0) is_gob_start = 1;
3076 if (s->c.codec_id == AV_CODEC_ID_MPEG1VIDEO && s->c.mb_y >= 175 ||
3077 s->mb_skip_run)
3078 is_gob_start=0;
3079 break;
3080 case AV_CODEC_ID_MJPEG:
3081 if (s->c.mb_x == 0 && s->c.mb_y != 0) is_gob_start = 1;
3082 break;
3083 }
3084
3085 if(is_gob_start){
3086 if (s->c.start_mb_y != mb_y || mb_x != 0) {
3088
3089 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4 && s->partitioned_frame)
3091 }
3092
3093 av_assert2((put_bits_count(&s->pb)&7) == 0);
3094 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
3095
3096 if (s->error_rate && s->c.resync_mb_x + s->c.resync_mb_y > 0) {
3097 int r = put_bytes_count(&s->pb, 0) + s->picture_number + 16 + s->c.mb_x + s->c.mb_y;
3098 int d = 100 / s->error_rate;
3099 if(r % d == 0){
3100 current_packet_size=0;
3101 s->pb.buf_ptr= s->ptr_lastgob;
3102 av_assert1(put_bits_ptr(&s->pb) == s->ptr_lastgob);
3103 }
3104 }
3105
3106 switch (s->c.codec_id) {
3107 case AV_CODEC_ID_MPEG4:
3108 if (CONFIG_MPEG4_ENCODER) {
3112 }
3113 break;
3116 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
3119 }
3120 break;
3121#if CONFIG_H263P_ENCODER
3122 case AV_CODEC_ID_H263P:
3123 if (s->c.dc_val)
3126#endif
3127 case AV_CODEC_ID_H263:
3128 if (CONFIG_H263_ENCODER) {
3129 if (s->mb_info && put_bytes_count(&s->pb, 0) - s->prev_mb_info >= s->mb_info)
3130 s->mb_info_size += 12;
3131
3133 s->prev_mb_info = put_bits_count(&s->pb)/8;
3134 }
3135 break;
3136 }
3137
3138 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS1) {
3139 int bits= put_bits_count(&s->pb);
3140 s->misc_bits+= bits - s->last_bits;
3141 s->last_bits= bits;
3142 }
3143
3144 s->ptr_lastgob += current_packet_size;
3145 s->c.first_slice_line = 1;
3146 s->c.resync_mb_x = mb_x;
3147 s->c.resync_mb_y = mb_y;
3148 }
3149 }
3150
3151 if (s->c.resync_mb_x == s->c.mb_x &&
3152 s->c.resync_mb_y+1 == s->c.mb_y)
3153 s->c.first_slice_line = 0;
3154
3155 s->c.mb_skipped = 0;
3156 s->dquant=0; //only for QP_RD
3157
3159
3160 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
3161 int next_block=0;
3162 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3163
3164 backup_context_before_encode(&backup_s, s);
3165 backup_s.pb= s->pb;
3166 if (s->data_partitioning) {
3167 backup_s.pb2= s->pb2;
3168 backup_s.tex_pb= s->tex_pb;
3169 }
3170
3171 if(mb_type&CANDIDATE_MB_TYPE_INTER){
3172 s->c.mv_dir = MV_DIR_FORWARD;
3173 s->c.mv_type = MV_TYPE_16X16;
3174 s->c.mb_intra = 0;
3175 s->c.mv[0][0][0] = s->p_mv_table[xy][0];
3176 s->c.mv[0][0][1] = s->p_mv_table[xy][1];
3177 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3178 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3179 }
3180 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
3181 s->c.mv_dir = MV_DIR_FORWARD;
3182 s->c.mv_type = MV_TYPE_FIELD;
3183 s->c.mb_intra = 0;
3184 for(i=0; i<2; i++){
3185 int j = s->c.field_select[0][i] = s->p_field_select_table[i][xy];
3186 s->c.mv[0][i][0] = s->c.p_field_mv_table[i][j][xy][0];
3187 s->c.mv[0][i][1] = s->c.p_field_mv_table[i][j][xy][1];
3188 }
3189 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3190 &dmin, &next_block, 0, 0);
3191 }
3192 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
3193 s->c.mv_dir = MV_DIR_FORWARD;
3194 s->c.mv_type = MV_TYPE_16X16;
3195 s->c.mb_intra = 0;
3196 s->c.mv[0][0][0] = 0;
3197 s->c.mv[0][0][1] = 0;
3198 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3199 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3200 }
3201 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
3202 s->c.mv_dir = MV_DIR_FORWARD;
3203 s->c.mv_type = MV_TYPE_8X8;
3204 s->c.mb_intra = 0;
3205 for(i=0; i<4; i++){
3206 s->c.mv[0][i][0] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
3207 s->c.mv[0][i][1] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
3208 }
3209 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3210 &dmin, &next_block, 0, 0);
3211 }
3212 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
3213 s->c.mv_dir = MV_DIR_FORWARD;
3214 s->c.mv_type = MV_TYPE_16X16;
3215 s->c.mb_intra = 0;
3216 s->c.mv[0][0][0] = s->b_forw_mv_table[xy][0];
3217 s->c.mv[0][0][1] = s->b_forw_mv_table[xy][1];
3218 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3219 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3220 }
3221 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
3222 s->c.mv_dir = MV_DIR_BACKWARD;
3223 s->c.mv_type = MV_TYPE_16X16;
3224 s->c.mb_intra = 0;
3225 s->c.mv[1][0][0] = s->b_back_mv_table[xy][0];
3226 s->c.mv[1][0][1] = s->b_back_mv_table[xy][1];
3227 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3228 &dmin, &next_block, s->c.mv[1][0][0], s->c.mv[1][0][1]);
3229 }
3230 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
3231 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3232 s->c.mv_type = MV_TYPE_16X16;
3233 s->c.mb_intra = 0;
3234 s->c.mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3235 s->c.mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3236 s->c.mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3237 s->c.mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3238 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3239 &dmin, &next_block, 0, 0);
3240 }
3241 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
3242 s->c.mv_dir = MV_DIR_FORWARD;
3243 s->c.mv_type = MV_TYPE_FIELD;
3244 s->c.mb_intra = 0;
3245 for(i=0; i<2; i++){
3246 int j = s->c.field_select[0][i] = s->b_field_select_table[0][i][xy];
3247 s->c.mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3248 s->c.mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3249 }
3250 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3251 &dmin, &next_block, 0, 0);
3252 }
3253 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
3254 s->c.mv_dir = MV_DIR_BACKWARD;
3255 s->c.mv_type = MV_TYPE_FIELD;
3256 s->c.mb_intra = 0;
3257 for(i=0; i<2; i++){
3258 int j = s->c.field_select[1][i] = s->b_field_select_table[1][i][xy];
3259 s->c.mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3260 s->c.mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3261 }
3262 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3263 &dmin, &next_block, 0, 0);
3264 }
3265 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
3266 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3267 s->c.mv_type = MV_TYPE_FIELD;
3268 s->c.mb_intra = 0;
3269 for(dir=0; dir<2; dir++){
3270 for(i=0; i<2; i++){
3271 int j = s->c.field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3272 s->c.mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3273 s->c.mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3274 }
3275 }
3276 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3277 &dmin, &next_block, 0, 0);
3278 }
3279 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
3280 s->c.mv_dir = 0;
3281 s->c.mv_type = MV_TYPE_16X16;
3282 s->c.mb_intra = 1;
3283 s->c.mv[0][0][0] = 0;
3284 s->c.mv[0][0][1] = 0;
3285 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3286 &dmin, &next_block, 0, 0);
3287 s->c.mbintra_table[xy] = 1;
3288 }
3289
3290 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
3291 if (best_s.c.mv_type == MV_TYPE_16X16) { //FIXME move 4mv after QPRD
3292 const int last_qp = backup_s.c.qscale;
3293 int qpi, qp, dc[6];
3294 int16_t ac[6][16];
3295 const int mvdir = (best_s.c.mv_dir & MV_DIR_BACKWARD) ? 1 : 0;
3296 static const int dquant_tab[4]={-1,1,-2,2};
3297 int storecoefs = s->c.mb_intra && s->c.dc_val;
3298
3299 av_assert2(backup_s.dquant == 0);
3300
3301 //FIXME intra
3302 s->c.mv_dir = best_s.c.mv_dir;
3303 s->c.mv_type = MV_TYPE_16X16;
3304 s->c.mb_intra = best_s.c.mb_intra;
3305 s->c.mv[0][0][0] = best_s.c.mv[0][0][0];
3306 s->c.mv[0][0][1] = best_s.c.mv[0][0][1];
3307 s->c.mv[1][0][0] = best_s.c.mv[1][0][0];
3308 s->c.mv[1][0][1] = best_s.c.mv[1][0][1];
3309
3310 qpi = s->c.pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3311 for(; qpi<4; qpi++){
3312 int dquant= dquant_tab[qpi];
3313 qp= last_qp + dquant;
3314 if (qp < s->c.avctx->qmin || qp > s->c.avctx->qmax)
3315 continue;
3316 backup_s.dquant= dquant;
3317 if(storecoefs){
3318 for(i=0; i<6; i++){
3319 dc[i] = s->c.dc_val[s->c.block_index[i]];
3320 memcpy(ac[i], s->c.ac_val[s->c.block_index[i]], sizeof(*s->c.ac_val));
3321 }
3322 }
3323
3324 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3325 &dmin, &next_block, s->c.mv[mvdir][0][0], s->c.mv[mvdir][0][1]);
3326 if (best_s.c.qscale != qp) {
3327 if(storecoefs){
3328 for(i=0; i<6; i++){
3329 s->c.dc_val[s->c.block_index[i]] = dc[i];
3330 memcpy(s->c.ac_val[s->c.block_index[i]], ac[i], sizeof(*s->c.ac_val));
3331 }
3332 }
3333 }
3334 }
3335 }
3336 }
3337 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3338 int mx= s->b_direct_mv_table[xy][0];
3339 int my= s->b_direct_mv_table[xy][1];
3340
3341 backup_s.dquant = 0;
3342 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3343 s->c.mb_intra = 0;
3345 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3346 &dmin, &next_block, mx, my);
3347 }
3348 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3349 backup_s.dquant = 0;
3350 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3351 s->c.mb_intra = 0;
3352 ff_mpeg4_set_direct_mv(&s->c, 0, 0);
3353 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3354 &dmin, &next_block, 0, 0);
3355 }
3356 if (!best_s.c.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3357 int coded=0;
3358 for(i=0; i<6; i++)
3359 coded |= s->c.block_last_index[i];
3360 if(coded){
3361 int mx,my;
3362 memcpy(s->c.mv, best_s.c.mv, sizeof(s->c.mv));
3363 if (CONFIG_MPEG4_ENCODER && best_s.c.mv_dir & MV_DIRECT) {
3364 mx=my=0; //FIXME find the one we actually used
3366 } else if (best_s.c.mv_dir & MV_DIR_BACKWARD) {
3367 mx = s->c.mv[1][0][0];
3368 my = s->c.mv[1][0][1];
3369 }else{
3370 mx = s->c.mv[0][0][0];
3371 my = s->c.mv[0][0][1];
3372 }
3373
3374 s->c.mv_dir = best_s.c.mv_dir;
3375 s->c.mv_type = best_s.c.mv_type;
3376 s->c.mb_intra = 0;
3377/* s->c.mv[0][0][0] = best_s.mv[0][0][0];
3378 s->c.mv[0][0][1] = best_s.mv[0][0][1];
3379 s->c.mv[1][0][0] = best_s.mv[1][0][0];
3380 s->c.mv[1][0][1] = best_s.mv[1][0][1];*/
3381 backup_s.dquant= 0;
3382 s->skipdct=1;
3383 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3384 &dmin, &next_block, mx, my);
3385 s->skipdct=0;
3386 }
3387 }
3388
3389 store_context_after_encode(s, &best_s, s->data_partitioning);
3390
3391 pb_bits_count= put_bits_count(&s->pb);
3392 flush_put_bits(&s->pb);
3393 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3394 s->pb= backup_s.pb;
3395
3396 if (s->data_partitioning) {
3397 pb2_bits_count= put_bits_count(&s->pb2);
3398 flush_put_bits(&s->pb2);
3399 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3400 s->pb2= backup_s.pb2;
3401
3402 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3403 flush_put_bits(&s->tex_pb);
3404 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3405 s->tex_pb= backup_s.tex_pb;
3406 }
3407 s->last_bits= put_bits_count(&s->pb);
3408
3409 if (CONFIG_H263_ENCODER &&
3410 s->c.out_format == FMT_H263 && s->c.pict_type != AV_PICTURE_TYPE_B)
3412
3413 if(next_block==0){ //FIXME 16 vs linesize16
3414 s->c.hdsp.put_pixels_tab[0][0](s->c.dest[0], s->c.sc.rd_scratchpad , s->c.linesize ,16);
3415 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);
3416 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);
3417 }
3418
3419 if (s->c.avctx->mb_decision == FF_MB_DECISION_BITS)
3420 mpv_reconstruct_mb(s, s->block);
3421 } else {
3422 int motion_x = 0, motion_y = 0;
3423 s->c.mv_type = MV_TYPE_16X16;
3424 // only one MB-Type possible
3425
3426 switch(mb_type){
3428 s->c.mv_dir = 0;
3429 s->c.mb_intra = 1;
3430 motion_x= s->c.mv[0][0][0] = 0;
3431 motion_y= s->c.mv[0][0][1] = 0;
3432 s->c.mbintra_table[xy] = 1;
3433 break;
3435 s->c.mv_dir = MV_DIR_FORWARD;
3436 s->c.mb_intra = 0;
3437 motion_x= s->c.mv[0][0][0] = s->p_mv_table[xy][0];
3438 motion_y= s->c.mv[0][0][1] = s->p_mv_table[xy][1];
3439 break;
3441 s->c.mv_dir = MV_DIR_FORWARD;
3442 s->c.mv_type = MV_TYPE_FIELD;
3443 s->c.mb_intra = 0;
3444 for(i=0; i<2; i++){
3445 int j = s->c.field_select[0][i] = s->p_field_select_table[i][xy];
3446 s->c.mv[0][i][0] = s->c.p_field_mv_table[i][j][xy][0];
3447 s->c.mv[0][i][1] = s->c.p_field_mv_table[i][j][xy][1];
3448 }
3449 break;
3451 s->c.mv_dir = MV_DIR_FORWARD;
3452 s->c.mv_type = MV_TYPE_8X8;
3453 s->c.mb_intra = 0;
3454 for(i=0; i<4; i++){
3455 s->c.mv[0][i][0] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
3456 s->c.mv[0][i][1] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
3457 }
3458 break;
3460 if (CONFIG_MPEG4_ENCODER) {
3462 s->c.mb_intra = 0;
3463 motion_x=s->b_direct_mv_table[xy][0];
3464 motion_y=s->b_direct_mv_table[xy][1];
3465 ff_mpeg4_set_direct_mv(&s->c, motion_x, motion_y);
3466 }
3467 break;
3469 if (CONFIG_MPEG4_ENCODER) {
3471 s->c.mb_intra = 0;
3472 ff_mpeg4_set_direct_mv(&s->c, 0, 0);
3473 }
3474 break;
3476 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3477 s->c.mb_intra = 0;
3478 s->c.mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3479 s->c.mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3480 s->c.mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3481 s->c.mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3482 break;
3484 s->c.mv_dir = MV_DIR_BACKWARD;
3485 s->c.mb_intra = 0;
3486 motion_x= s->c.mv[1][0][0] = s->b_back_mv_table[xy][0];
3487 motion_y= s->c.mv[1][0][1] = s->b_back_mv_table[xy][1];
3488 break;
3490 s->c.mv_dir = MV_DIR_FORWARD;
3491 s->c.mb_intra = 0;
3492 motion_x= s->c.mv[0][0][0] = s->b_forw_mv_table[xy][0];
3493 motion_y= s->c.mv[0][0][1] = s->b_forw_mv_table[xy][1];
3494 break;
3496 s->c.mv_dir = MV_DIR_FORWARD;
3497 s->c.mv_type = MV_TYPE_FIELD;
3498 s->c.mb_intra = 0;
3499 for(i=0; i<2; i++){
3500 int j = s->c.field_select[0][i] = s->b_field_select_table[0][i][xy];
3501 s->c.mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3502 s->c.mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3503 }
3504 break;
3506 s->c.mv_dir = MV_DIR_BACKWARD;
3507 s->c.mv_type = MV_TYPE_FIELD;
3508 s->c.mb_intra = 0;
3509 for(i=0; i<2; i++){
3510 int j = s->c.field_select[1][i] = s->b_field_select_table[1][i][xy];
3511 s->c.mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3512 s->c.mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3513 }
3514 break;
3516 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3517 s->c.mv_type = MV_TYPE_FIELD;
3518 s->c.mb_intra = 0;
3519 for(dir=0; dir<2; dir++){
3520 for(i=0; i<2; i++){
3521 int j = s->c.field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3522 s->c.mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3523 s->c.mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3524 }
3525 }
3526 break;
3527 default:
3528 av_unreachable("There is a case for every CANDIDATE_MB_TYPE_* "
3529 "except CANDIDATE_MB_TYPE_SKIPPED which is never "
3530 "the only candidate (always coupled with INTER) "
3531 "so that it never reaches this switch");
3532 }
3533
3534 encode_mb(s, motion_x, motion_y);
3535
3536 // RAL: Update last macroblock type
3537 s->last_mv_dir = s->c.mv_dir;
3538
3539 if (CONFIG_H263_ENCODER &&
3540 s->c.out_format == FMT_H263 && s->c.pict_type != AV_PICTURE_TYPE_B)
3542
3543 mpv_reconstruct_mb(s, s->block);
3544 }
3545
3546 s->c.cur_pic.qscale_table[xy] = s->c.qscale;
3547
3548 /* clean the MV table in IPS frames for direct mode in B-frames */
3549 if (s->c.mb_intra /* && I,P,S_TYPE */) {
3550 s->p_mv_table[xy][0]=0;
3551 s->p_mv_table[xy][1]=0;
3552#if CONFIG_H263_ENCODER
3553 } else if (s->c.h263_pred || s->c.h263_aic) {
3555#endif
3556 }
3557
3558 if (s->c.avctx->flags & AV_CODEC_FLAG_PSNR) {
3559 int w= 16;
3560 int h= 16;
3561
3562 if (s->c.mb_x*16 + 16 > s->c.width ) w = s->c.width - s->c.mb_x*16;
3563 if (s->c.mb_y*16 + 16 > s->c.height) h = s->c.height- s->c.mb_y*16;
3564
3565 s->encoding_error[0] += sse(
3566 s, s->new_pic->data[0] + s->c.mb_x*16 + s->c.mb_y*s->c.linesize*16,
3567 s->c.dest[0], w, h, s->c.linesize);
3568 s->encoding_error[1] += sse(
3569 s, s->new_pic->data[1] + s->c.mb_x*8 + s->c.mb_y*s->c.uvlinesize*chr_h,
3570 s->c.dest[1], w>>1, h>>s->c.chroma_y_shift, s->c.uvlinesize);
3571 s->encoding_error[2] += sse(
3572 s, s->new_pic->data[2] + s->c.mb_x*8 + s->c.mb_y*s->c.uvlinesize*chr_h,
3573 s->c.dest[2], w>>1, h>>s->c.chroma_y_shift, s->c.uvlinesize);
3574 }
3575 if (s->loop_filter) {
3576 if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263)
3578 }
3579 ff_dlog(s->c.avctx, "MB %d %d bits\n",
3580 s->c.mb_x + s->c.mb_y * s->c.mb_stride, put_bits_count(&s->pb));
3581 }
3582 }
3583
3584#if CONFIG_MSMPEG4ENC
3585 //not beautiful here but we must write it before flushing so it has to be here
3586 if (s->c.msmpeg4_version != MSMP4_UNUSED && s->c.msmpeg4_version < MSMP4_WMV1 &&
3587 s->c.pict_type == AV_PICTURE_TYPE_I)
3589#endif
3590
3592
3593 return 0;
3594}
3595
3596#define ADD(field) dst->field += src->field;
3597#define MERGE(field) dst->field += src->field; src->field=0
3599{
3600 ADD(me.scene_change_score);
3601 ADD(me.mc_mb_var_sum_temp);
3602 ADD(me.mb_var_sum_temp);
3603}
3604
3606{
3607 int i;
3608
3609 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3610 MERGE(dct_count[1]);
3611 ADD(mv_bits);
3612 ADD(i_tex_bits);
3613 ADD(p_tex_bits);
3614 ADD(i_count);
3615 ADD(misc_bits);
3616 ADD(encoding_error[0]);
3617 ADD(encoding_error[1]);
3618 ADD(encoding_error[2]);
3619
3620 if (dst->dct_error_sum) {
3621 for(i=0; i<64; i++){
3622 MERGE(dct_error_sum[0][i]);
3623 MERGE(dct_error_sum[1][i]);
3624 }
3625 }
3626
3627 av_assert1(put_bits_count(&src->pb) % 8 ==0);
3628 av_assert1(put_bits_count(&dst->pb) % 8 ==0);
3629 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3630 flush_put_bits(&dst->pb);
3631}
3632
3633static int estimate_qp(MPVMainEncContext *const m, int dry_run)
3634{
3635 MPVEncContext *const s = &m->s;
3636
3637 if (m->next_lambda){
3638 s->c.cur_pic.ptr->f->quality = m->next_lambda;
3639 if(!dry_run) m->next_lambda= 0;
3640 } else if (!m->fixed_qscale) {
3641 int quality = ff_rate_estimate_qscale(m, dry_run);
3642 s->c.cur_pic.ptr->f->quality = quality;
3643 if (s->c.cur_pic.ptr->f->quality < 0)
3644 return -1;
3645 }
3646
3647 if(s->adaptive_quant){
3649
3650 switch (s->c.codec_id) {
3651 case AV_CODEC_ID_MPEG4:
3652 if (CONFIG_MPEG4_ENCODER)
3654 break;
3655 case AV_CODEC_ID_H263:
3656 case AV_CODEC_ID_H263P:
3657 case AV_CODEC_ID_FLV1:
3658 if (CONFIG_H263_ENCODER)
3660 break;
3661 }
3662
3663 s->lambda = s->lambda_table[0];
3664 //FIXME broken
3665 }else
3666 s->lambda = s->c.cur_pic.ptr->f->quality;
3667 update_qscale(m);
3668 return 0;
3669}
3670
3671/* must be called before writing the header */
3673{
3674 av_assert1(s->c.cur_pic.ptr->f->pts != AV_NOPTS_VALUE);
3675 s->c.time = s->c.cur_pic.ptr->f->pts * s->c.avctx->time_base.num;
3676
3677 if (s->c.pict_type == AV_PICTURE_TYPE_B) {
3678 s->c.pb_time = s->c.pp_time - (s->c.last_non_b_time - s->c.time);
3679 av_assert1(s->c.pb_time > 0 && s->c.pb_time < s->c.pp_time);
3680 }else{
3681 av_assert1(s->picture_number == 0 || s->c.time > s->c.last_non_b_time);
3682 s->c.pp_time = s->c.time - s->c.last_non_b_time;
3683 s->c.last_non_b_time = s->c.time;
3684 }
3685}
3686
3687static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
3688{
3689 MPVEncContext *const s = &m->s;
3690 int ret;
3691 int bits;
3692 int context_count = s->c.slice_context_count;
3693
3694 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4) {
3697 }
3698
3699// s->lambda = s->c.cur_pic.ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3700
3701 if (s->c.pict_type == AV_PICTURE_TYPE_I) {
3702 s->c.no_rounding = s->c.msmpeg4_version >= MSMP4_V3;
3703 } else if (s->c.pict_type != AV_PICTURE_TYPE_B) {
3704 s->c.no_rounding ^= s->flipflop_rounding;
3705 }
3706
3707 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS2) {
3708 ret = estimate_qp(m, 1);
3709 if (ret < 0)
3710 return ret;
3712 } else if (!(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3713 if (s->c.pict_type == AV_PICTURE_TYPE_B)
3714 s->lambda = m->last_lambda_for[s->c.pict_type];
3715 else
3716 s->lambda = m->last_lambda_for[m->last_non_b_pict_type];
3717 update_qscale(m);
3718 }
3719
3720 s->c.mb_intra = 0; //for the rate distortion & bit compare functions
3721 for (int i = 0; i < context_count; i++) {
3722 MPVEncContext *const slice = s->c.enc_contexts[i];
3723 int h = s->c.mb_height;
3724 uint8_t *start = pkt->data + (int64_t)pkt->size * slice->c.start_mb_y / h;
3725 uint8_t *end = pkt->data + (int64_t)pkt->size * slice->c. end_mb_y / h;
3726
3727 init_put_bits(&slice->pb, start, end - start);
3728
3729 if (i) {
3730 ret = ff_update_duplicate_context(&slice->c, &s->c);
3731 if (ret < 0)
3732 return ret;
3733 slice->lambda = s->lambda;
3734 slice->lambda2 = s->lambda2;
3735 }
3736 slice->me.temp = slice->me.scratchpad = slice->c.sc.scratchpad_buf;
3737 ff_me_init_pic(slice);
3738 }
3739
3740 /* Estimate motion for every MB */
3741 if (s->c.pict_type != AV_PICTURE_TYPE_I) {
3742 s->lambda = (s->lambda * m->me_penalty_compensation + 128) >> 8;
3743 s->lambda2 = (s->lambda2 * (int64_t) m->me_penalty_compensation + 128) >> 8;
3744 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
3745 if ((m->me_pre && m->last_non_b_pict_type == AV_PICTURE_TYPE_I) ||
3746 m->me_pre == 2) {
3747 s->c.avctx->execute(s->c.avctx, pre_estimate_motion_thread,
3748 &s->c.enc_contexts[0], NULL,
3749 context_count, sizeof(void*));
3750 }
3751 }
3752
3753 s->c.avctx->execute(s->c.avctx, estimate_motion_thread, &s->c.enc_contexts[0],
3754 NULL, context_count, sizeof(void*));
3755 }else /* if (s->c.pict_type == AV_PICTURE_TYPE_I) */{
3756 /* I-Frame */
3757 for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
3758 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3759
3760 if (!m->fixed_qscale) {
3761 /* finding spatial complexity for I-frame rate control */
3762 s->c.avctx->execute(s->c.avctx, mb_var_thread, &s->c.enc_contexts[0],
3763 NULL, context_count, sizeof(void*));
3764 }
3765 }
3766 for (int i = 1; i < context_count; i++)
3767 merge_context_after_me(s, s->c.enc_contexts[i]);
3768 m->mc_mb_var_sum = s->me.mc_mb_var_sum_temp;
3769 m->mb_var_sum = s->me. mb_var_sum_temp;
3770 emms_c();
3771
3772 if (s->me.scene_change_score > m->scenechange_threshold &&
3773 s->c.pict_type == AV_PICTURE_TYPE_P) {
3774 s->c.pict_type = AV_PICTURE_TYPE_I;
3775 for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
3776 s->mb_type[i] = CANDIDATE_MB_TYPE_INTRA;
3777 if (s->c.msmpeg4_version >= MSMP4_V3)
3778 s->c.no_rounding = 1;
3779 ff_dlog(s->c.avctx, "Scene change detected, encoding as I Frame %"PRId64" %"PRId64"\n",
3780 m->mb_var_sum, m->mc_mb_var_sum);
3781 }
3782
3783 if (!s->umvplus) {
3784 if (s->c.pict_type == AV_PICTURE_TYPE_P || s->c.pict_type == AV_PICTURE_TYPE_S) {
3785 s->f_code = ff_get_best_fcode(m, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3786
3787 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3788 int a,b;
3789 a = ff_get_best_fcode(m, s->c.p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3790 b = ff_get_best_fcode(m, s->c.p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3791 s->f_code = FFMAX3(s->f_code, a, b);
3792 }
3793
3795 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, !!s->intra_penalty);
3796 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3797 int j;
3798 for (int i = 0; i < 2; i++) {
3799 for(j=0; j<2; j++)
3800 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3801 s->c.p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, !!s->intra_penalty);
3802 }
3803 }
3804 } else if (s->c.pict_type == AV_PICTURE_TYPE_B) {
3805 int a, b;
3806
3807 a = ff_get_best_fcode(m, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3808 b = ff_get_best_fcode(m, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3809 s->f_code = FFMAX(a, b);
3810
3811 a = ff_get_best_fcode(m, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3812 b = ff_get_best_fcode(m, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3813 s->b_code = FFMAX(a, b);
3814
3815 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3816 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3817 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3818 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3819 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3820 int dir, j;
3821 for(dir=0; dir<2; dir++){
3822 for (int i = 0; i < 2; i++) {
3823 for(j=0; j<2; j++){
3826 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3827 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3828 }
3829 }
3830 }
3831 }
3832 }
3833 }
3834
3835 ret = estimate_qp(m, 0);
3836 if (ret < 0)
3837 return ret;
3838
3839 if (s->c.qscale < 3 && s->max_qcoeff <= 128 &&
3840 s->c.pict_type == AV_PICTURE_TYPE_I &&
3841 !(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE))
3842 s->c.qscale = 3; //reduce clipping problems
3843
3844 if (s->c.out_format == FMT_MJPEG) {
3846 (7 + s->c.qscale) / s->c.qscale, 65535);
3847 if (ret < 0)
3848 return ret;
3849
3850 if (s->c.codec_id != AV_CODEC_ID_AMV) {
3851 const uint16_t * luma_matrix = ff_mpeg1_default_intra_matrix;
3852 const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix;
3853
3854 if (s->c.avctx->intra_matrix) {
3855 chroma_matrix =
3856 luma_matrix = s->c.avctx->intra_matrix;
3857 }
3858 if (s->c.avctx->chroma_intra_matrix)
3859 chroma_matrix = s->c.avctx->chroma_intra_matrix;
3860
3861 /* for mjpeg, we do include qscale in the matrix */
3862 for (int i = 1; i < 64; i++) {
3863 int j = s->c.idsp.idct_permutation[i];
3864
3865 s->c.chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->c.qscale) >> 3);
3866 s->c. intra_matrix[j] = av_clip_uint8(( luma_matrix[i] * s->c.qscale) >> 3);
3867 }
3868 s->c.y_dc_scale_table =
3869 s->c.c_dc_scale_table = ff_mpeg12_dc_scale_table[0];
3870 s->c.chroma_intra_matrix[0] = s->c.intra_matrix[0] = 8;
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:57
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition dsp.h:57
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
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:975
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:144
#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:164
@ 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:381
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
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:650
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:687
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
cl_device_type type
@ 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
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:850
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:264
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_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
const char data[16]
Definition mxf.c:149
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:120
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:297
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:291
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
Definition defs.h:306
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition defs.h:296
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
Definition defs.h:312
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:321
int64_t min_bitrate
Minimum bitrate of the stream, in bits per second.
Definition defs.h:301
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:472
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition frame.h:574
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
int width
Definition frame.h:544
int height
Definition frame.h:544
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
Definition frame.h:594
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:517
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition frame.h:559
enum AVPictureType pict_type
Picture type of the frame.
Definition frame.h:564
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
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:89
#define width
Definition dsp.h:89
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]