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 int vpad = 16;
1373
1374 if ( s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO
1375 && !s->c.progressive_sequence
1376 && FFALIGN(s->c.height, 32) - s->c.height > 16)
1377 vpad = 32;
1378
1379 if (!s->c.avctx->rc_buffer_size)
1380 pic->f->data[i] += INPLACE_OFFSET;
1381 uint8_t *dst = pic->f->data[i];
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 const uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride);
1446 const uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
1447 int v = m->frame_skip_cmp_fn(s, dptr, rptr, stride, 8);
1448
1449 switch (FFABS(m->frame_skip_exp)) {
1450 case 0: score = FFMAX(score, v); break;
1451 case 1: score += FFABS(v); break;
1452 case 2: score64 += v * (int64_t)v; break;
1453 case 3: score64 += FFABS(v * (int64_t)v * v); break;
1454 case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v); break;
1455 }
1456 }
1457 }
1458 }
1459 emms_c();
1460
1461 if (score)
1462 score64 = score;
1463 if (m->frame_skip_exp < 0)
1464 score64 = pow(score64 / (double)(s->c.mb_width * s->c.mb_height),
1465 -1.0/m->frame_skip_exp);
1466
1467 if (score64 < m->frame_skip_threshold)
1468 return 1;
1469 if (score64 < ((m->frame_skip_factor * (int64_t) s->lambda) >> 8))
1470 return 1;
1471 return 0;
1472}
1473
1475{
1476 int ret;
1477 int size = 0;
1478
1479 ret = avcodec_send_frame(c, frame);
1480 if (ret < 0)
1481 return ret;
1482
1483 do {
1485 if (ret >= 0) {
1486 size += pkt->size;
1488 } else if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
1489 return ret;
1490 } while (ret >= 0);
1491
1492 return size;
1493}
1494
1496{
1497 MPVEncContext *const s = &m->s;
1498 AVPacket *pkt;
1499 const int scale = m->brd_scale;
1500 int width = s->c.width >> scale;
1501 int height = s->c.height >> scale;
1502 int out_size, p_lambda, b_lambda, lambda2;
1503 int64_t best_rd = INT64_MAX;
1504 int best_b_count = -1;
1505 int ret = 0;
1506
1507 av_assert0(scale >= 0 && scale <= 3);
1508
1509 pkt = av_packet_alloc();
1510 if (!pkt)
1511 return AVERROR(ENOMEM);
1512
1513 p_lambda = m->last_lambda_for[AV_PICTURE_TYPE_P];
1514 //p_lambda * FFABS(s->c.avctx->b_quant_factor) + s->c.avctx->b_quant_offset;
1515 b_lambda = m->last_lambda_for[AV_PICTURE_TYPE_B];
1516 if (!b_lambda) // FIXME we should do this somewhere else
1517 b_lambda = p_lambda;
1518 lambda2 = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
1520
1521 for (int i = 0; i < m->max_b_frames + 2; i++) {
1522 const MPVPicture *pre_input_ptr = i ? m->input_picture[i - 1] :
1523 s->c.next_pic.ptr;
1524
1525 if (pre_input_ptr) {
1526 const AVFrame *const pre_input = pre_input_ptr->f;
1527
1528 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[0],
1529 m->tmp_frames[i]->linesize[0],
1530 pre_input->data[0],
1531 pre_input->linesize[0],
1532 width, height);
1533 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[1],
1534 m->tmp_frames[i]->linesize[1],
1535 pre_input->data[1],
1536 pre_input->linesize[1],
1537 width >> 1, height >> 1);
1538 s->mpvencdsp.shrink[scale](m->tmp_frames[i]->data[2],
1539 m->tmp_frames[i]->linesize[2],
1540 pre_input->data[2],
1541 pre_input->linesize[2],
1542 width >> 1, height >> 1);
1543 }
1544 }
1545
1546 for (int j = 0; j < m->max_b_frames + 1; j++) {
1548 int64_t rd = 0;
1549
1550 if (!m->input_picture[j])
1551 break;
1552
1554 if (!c) {
1555 ret = AVERROR(ENOMEM);
1556 goto fail;
1557 }
1558
1559 c->width = width;
1560 c->height = height;
1562 c->flags |= s->c.avctx->flags & AV_CODEC_FLAG_QPEL;
1563 c->mb_decision = s->c.avctx->mb_decision;
1564 c->me_cmp = s->c.avctx->me_cmp;
1565 c->mb_cmp = s->c.avctx->mb_cmp;
1566 c->me_sub_cmp = s->c.avctx->me_sub_cmp;
1567 c->pix_fmt = AV_PIX_FMT_YUV420P;
1568 c->time_base = s->c.avctx->time_base;
1569 c->max_b_frames = m->max_b_frames;
1570
1571 ret = avcodec_open2(c, s->c.avctx->codec, NULL);
1572 if (ret < 0)
1573 goto fail;
1574
1575
1577 m->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
1578
1580 if (out_size < 0) {
1581 ret = out_size;
1582 goto fail;
1583 }
1584
1585 //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
1586
1587 for (int i = 0; i < m->max_b_frames + 1; i++) {
1588 int is_p = i % (j + 1) == j || i == m->max_b_frames;
1589
1590 m->tmp_frames[i + 1]->pict_type = is_p ?
1592 m->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
1593
1594 out_size = encode_frame(c, m->tmp_frames[i + 1], pkt);
1595 if (out_size < 0) {
1596 ret = out_size;
1597 goto fail;
1598 }
1599
1600 rd += (out_size * (uint64_t)lambda2) >> (FF_LAMBDA_SHIFT - 3);
1601 }
1602
1603 /* get the delayed frames */
1605 if (out_size < 0) {
1606 ret = out_size;
1607 goto fail;
1608 }
1609 rd += (out_size * (uint64_t)lambda2) >> (FF_LAMBDA_SHIFT - 3);
1610
1611 rd += c->error[0] + c->error[1] + c->error[2];
1612
1613 if (rd < best_rd) {
1614 best_rd = rd;
1615 best_b_count = j;
1616 }
1617
1618fail:
1621 if (ret < 0) {
1622 best_b_count = ret;
1623 break;
1624 }
1625 }
1626
1628
1629 return best_b_count;
1630}
1631
1632/**
1633 * Determines whether an input picture is discarded or not
1634 * and if not determines the length of the next chain of B frames
1635 * and moves these pictures (including the P frame) into
1636 * reordered_input_picture.
1637 * input_picture[0] is always NULL when exiting this function, even on error;
1638 * reordered_input_picture[0] is always NULL when exiting this function on error.
1639 */
1641{
1642 MPVEncContext *const s = &m->s;
1643
1644 /* Either nothing to do or can't do anything */
1645 if (m->reordered_input_picture[0] || !m->input_picture[0])
1646 return 0;
1647
1648 /* set next picture type & ordering */
1650 if (m->picture_in_gop_number < m->gop_size &&
1651 s->c.next_pic.ptr &&
1652 skip_check(m, m->input_picture[0], s->c.next_pic.ptr)) {
1653 // FIXME check that the gop check above is +-1 correct
1655
1656 ff_vbv_update(m, 0);
1657
1658 return 0;
1659 }
1660 }
1661
1662 if (/* m->picture_in_gop_number >= m->gop_size || */
1663 !s->c.next_pic.ptr || m->intra_only) {
1665 m->input_picture[0] = NULL;
1669 } else {
1670 int b_frames = 0;
1671
1672 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS2) {
1673 for (int i = 0; i < m->max_b_frames + 1; i++) {
1674 int pict_num = m->input_picture[0]->display_picture_number + i;
1675
1676 if (pict_num >= m->rc_context.num_entries)
1677 break;
1678 if (!m->input_picture[i]) {
1680 break;
1681 }
1682
1683 m->input_picture[i]->f->pict_type =
1684 m->rc_context.entry[pict_num].new_pict_type;
1685 }
1686 }
1687
1688 if (m->b_frame_strategy == 0) {
1689 b_frames = m->max_b_frames;
1690 while (b_frames && !m->input_picture[b_frames])
1691 b_frames--;
1692 } else if (m->b_frame_strategy == 1) {
1693 for (int i = 1; i < m->max_b_frames + 1; i++) {
1694 if (m->input_picture[i] &&
1695 m->input_picture[i]->b_frame_score == 0) {
1698 m->input_picture[i ]->f->data[0],
1699 m->input_picture[i - 1]->f->data[0],
1700 s->c.linesize) + 1;
1701 }
1702 }
1703 for (int i = 0;; i++) {
1704 if (i >= m->max_b_frames + 1 ||
1705 !m->input_picture[i] ||
1706 m->input_picture[i]->b_frame_score - 1 >
1707 s->c.mb_num / m->b_sensitivity) {
1708 b_frames = FFMAX(0, i - 1);
1709 break;
1710 }
1711 }
1712
1713 /* reset scores */
1714 for (int i = 0; i < b_frames + 1; i++)
1715 m->input_picture[i]->b_frame_score = 0;
1716 } else if (m->b_frame_strategy == 2) {
1717 b_frames = estimate_best_b_count(m);
1718 if (b_frames < 0) {
1720 return b_frames;
1721 }
1722 }
1723
1724 if (s->c.codec_id == AV_CODEC_ID_MPEG4)
1725 while (b_frames &&
1726 m->input_picture[b_frames]->f->pts * s->c.avctx->time_base.num -
1727 s->c.last_non_b_time > UINT16_MAX)
1728 b_frames--;
1729
1730 for (int i = b_frames - 1; i >= 0; i--) {
1731 int type = m->input_picture[i]->f->pict_type;
1732 if (type && type != AV_PICTURE_TYPE_B)
1733 b_frames = i;
1734 }
1735 if (m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1736 b_frames == m->max_b_frames) {
1737 av_log(s->c.avctx, AV_LOG_ERROR,
1738 "warning, too many B-frames in a row\n");
1739 }
1740
1741 if (m->picture_in_gop_number + b_frames >= m->gop_size) {
1742 if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1744 b_frames = m->gop_size - m->picture_in_gop_number - 1;
1745 } else {
1746 if (s->c.avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
1747 b_frames = 0;
1748 m->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1749 }
1750 }
1751
1752 if ((s->c.avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
1753 m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
1754 b_frames--;
1755
1756 m->reordered_input_picture[0] = m->input_picture[b_frames];
1757 m->input_picture[b_frames] = NULL;
1762 for (int i = 0; i < b_frames; i++) {
1764 m->input_picture[i] = NULL;
1769 }
1770 }
1771
1772 return 0;
1773}
1774
1776{
1777 MPVEncContext *const s = &m->s;
1778 int ret;
1779
1781
1782 for (int i = 1; i <= MPVENC_MAX_B_FRAMES; i++)
1785
1786 ret = set_bframe_chain_length(m);
1787 av_assert1(!m->input_picture[0]);
1788 if (ret < 0)
1789 return ret;
1790
1791 av_frame_unref(s->new_pic);
1792
1793 if (m->reordered_input_picture[0]) {
1796
1797 if (m->reordered_input_picture[0]->shared || s->c.avctx->rc_buffer_size) {
1798 // input is a shared pix, so we can't modify it -> allocate a new
1799 // one & ensure that the shared one is reusable
1800 av_frame_move_ref(s->new_pic, m->reordered_input_picture[0]->f);
1801
1802 ret = prepare_picture(s, m->reordered_input_picture[0]->f, s->new_pic);
1803 if (ret < 0)
1804 goto fail;
1805 } else {
1806 // input is not a shared pix -> reuse buffer for current_pix
1807 ret = av_frame_ref(s->new_pic, m->reordered_input_picture[0]->f);
1808 if (ret < 0)
1809 goto fail;
1810 // The input was stored INPLACE_OFFSET into the buffer, which
1811 // new_pic now points at. Point the frame back at the start of
1812 // the buffer for the reconstruction.
1813 for (int i = 0; i < MPV_MAX_PLANES; i++)
1815 }
1816 s->c.cur_pic.ptr = m->reordered_input_picture[0];
1818 av_assert1(s->c.mb_width == s->c.buffer_pools.alloc_mb_width);
1819 av_assert1(s->c.mb_height == s->c.buffer_pools.alloc_mb_height);
1820 av_assert1(s->c.mb_stride == s->c.buffer_pools.alloc_mb_stride);
1821 ret = ff_mpv_alloc_pic_accessories(s->c.avctx, &s->c.cur_pic,
1822 &s->c.sc, &s->c.buffer_pools, s->c.mb_height);
1823 if (ret < 0) {
1824 ff_mpv_unref_picture(&s->c.cur_pic);
1825 return ret;
1826 }
1827 s->picture_number = s->c.cur_pic.ptr->display_picture_number;
1828
1829 }
1830 return 0;
1831fail:
1833 return ret;
1834}
1835
1836static void frame_end(MPVMainEncContext *const m)
1837{
1838 MPVEncContext *const s = &m->s;
1839
1840 if (s->me.unrestricted_mv &&
1841 s->c.cur_pic.reference &&
1842 !m->intra_only) {
1843 int hshift = s->c.chroma_x_shift;
1844 int vshift = s->c.chroma_y_shift;
1845 s->mpvencdsp.draw_edges(s->c.cur_pic.data[0],
1846 s->c.cur_pic.linesize[0],
1847 s->c.h_edge_pos, s->c.v_edge_pos,
1850 s->mpvencdsp.draw_edges(s->c.cur_pic.data[1],
1851 s->c.cur_pic.linesize[1],
1852 s->c.h_edge_pos >> hshift,
1853 s->c.v_edge_pos >> vshift,
1854 EDGE_WIDTH >> hshift,
1855 EDGE_WIDTH >> vshift,
1857 s->mpvencdsp.draw_edges(s->c.cur_pic.data[2],
1858 s->c.cur_pic.linesize[2],
1859 s->c.h_edge_pos >> hshift,
1860 s->c.v_edge_pos >> vshift,
1861 EDGE_WIDTH >> hshift,
1862 EDGE_WIDTH >> vshift,
1864 }
1865
1866 m->last_pict_type = s->c.pict_type;
1867 m->last_lambda_for[s->c.pict_type] = s->c.cur_pic.ptr->f->quality;
1868 if (s->c.pict_type != AV_PICTURE_TYPE_B)
1869 m->last_non_b_pict_type = s->c.pict_type;
1870}
1871
1873{
1874 MPVEncContext *const s = &m->s;
1875 int intra, i;
1876
1877 for (intra = 0; intra < 2; intra++) {
1878 if (s->dct_count[intra] > (1 << 16)) {
1879 for (i = 0; i < 64; i++) {
1880 s->dct_error_sum[intra][i] >>= 1;
1881 }
1882 s->dct_count[intra] >>= 1;
1883 }
1884
1885 for (i = 0; i < 64; i++) {
1886 s->dct_offset[intra][i] = (m->noise_reduction *
1887 s->dct_count[intra] +
1888 s->dct_error_sum[intra][i] / 2) /
1889 (s->dct_error_sum[intra][i] + 1);
1890 }
1891 }
1892}
1893
1894static void frame_start(MPVMainEncContext *const m)
1895{
1896 MPVEncContext *const s = &m->s;
1897
1898 s->c.cur_pic.ptr->f->pict_type = s->c.pict_type;
1899
1900 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
1901 ff_mpv_replace_picture(&s->c.last_pic, &s->c.next_pic);
1902 ff_mpv_replace_picture(&s->c.next_pic, &s->c.cur_pic);
1903 }
1904
1905 av_assert2(!!m->noise_reduction == !!s->dct_error_sum);
1906 if (s->dct_error_sum) {
1908 }
1909}
1910
1912 const AVFrame *pic_arg, int *got_packet)
1913{
1914 MPVMainEncContext *const m = avctx->priv_data;
1915 MPVEncContext *const s = &m->s;
1916 int stuffing_count, ret;
1917 int context_count = s->c.slice_context_count;
1918
1919 ff_mpv_unref_picture(&s->c.cur_pic);
1920
1921 m->vbv_ignore_qmax = 0;
1922
1924
1925 ret = load_input_picture(m, pic_arg);
1926 if (ret < 0)
1927 return ret;
1928
1929 ret = select_input_picture(m);
1930 if (ret < 0)
1931 return ret;
1932
1933 /* output? */
1934 if (s->new_pic->data[0]) {
1935 int growing_buffer = context_count == 1 && !s->data_partitioning;
1936 size_t pkt_size = 10000 + s->c.mb_width * s->c.mb_height *
1937 (growing_buffer ? 64 : (MAX_MB_BYTES + 100));
1938 if (CONFIG_MJPEG_ENCODER && avctx->codec_id == AV_CODEC_ID_MJPEG) {
1939 ret = ff_mjpeg_add_icc_profile_size(avctx, s->new_pic, &pkt_size);
1940 if (ret < 0)
1941 return ret;
1942 }
1943 if ((ret = ff_alloc_packet(avctx, pkt, pkt_size)) < 0)
1944 return ret;
1946 if (s->mb_info) {
1947 s->mb_info_ptr = av_packet_new_side_data(pkt,
1949 s->c.mb_width*s->c.mb_height*12);
1950 if (!s->mb_info_ptr)
1951 return AVERROR(ENOMEM);
1952 s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
1953 }
1954
1955 s->c.pict_type = s->new_pic->pict_type;
1956 frame_start(m);
1957vbv_retry:
1958 ret = encode_picture(m, pkt);
1959 if (growing_buffer) {
1960 av_assert0(s->pb.buf == avctx->internal->byte_buffer);
1961 pkt->data = s->pb.buf;
1962 pkt->size = avctx->internal->byte_buffer_size;
1963 }
1964 if (ret < 0)
1965 return -1;
1966
1967 frame_end(m);
1968
1969 if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) && s->c.out_format == FMT_MJPEG)
1971
1972 if (avctx->rc_buffer_size) {
1973 RateControlContext *rcc = &m->rc_context;
1974 int max_size = FFMAX(rcc->buffer_index * avctx->rc_max_available_vbv_use, rcc->buffer_index - 500);
1975 int hq = (avctx->mb_decision == FF_MB_DECISION_RD || avctx->trellis);
1976 int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139;
1977
1978 if (put_bits_count(&s->pb) > max_size &&
1979 s->lambda < m->lmax) {
1980 m->next_lambda = FFMAX(s->lambda + min_step, s->lambda *
1981 (s->c.qscale + 1) / s->c.qscale);
1982 if (s->adaptive_quant) {
1983 for (int i = 0; i < s->c.mb_height * s->c.mb_stride; i++)
1984 s->lambda_table[i] =
1985 FFMAX(s->lambda_table[i] + min_step,
1986 s->lambda_table[i] * (s->c.qscale + 1) /
1987 s->c.qscale);
1988 }
1989 s->c.mb_skipped = 0; // done in frame_start()
1990 // done in encode_picture() so we must undo it
1991 if (s->c.pict_type == AV_PICTURE_TYPE_P) {
1992 s->c.no_rounding ^= s->flipflop_rounding;
1993 }
1994 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
1995 s->c.time_base = s->c.last_time_base;
1996 s->c.last_non_b_time = s->c.time - s->c.pp_time;
1997 }
1998 m->vbv_ignore_qmax = 1;
1999 av_log(avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n");
2000 goto vbv_retry;
2001 }
2002
2003 av_assert0(avctx->rc_max_rate);
2004 }
2005
2006 if (avctx->flags & AV_CODEC_FLAG_PASS1)
2008
2009 for (int i = 0; i < MPV_MAX_PLANES; i++)
2010 avctx->error[i] += s->encoding_error[i];
2011 ff_encode_add_stats_side_data(pkt, s->c.cur_pic.ptr->f->quality,
2012 s->encoding_error,
2014 s->c.pict_type);
2015
2016 if (avctx->flags & AV_CODEC_FLAG_PASS1)
2017 assert(put_bits_count(&s->pb) == m->header_bits + s->mv_bits +
2018 s->misc_bits + s->i_tex_bits +
2019 s->p_tex_bits);
2020 flush_put_bits(&s->pb);
2021 m->frame_bits = put_bits_count(&s->pb);
2022
2023 stuffing_count = ff_vbv_update(m, m->frame_bits);
2024 m->stuffing_bits = 8*stuffing_count;
2025 if (stuffing_count) {
2026 if (put_bytes_left(&s->pb, 0) < stuffing_count + 50) {
2027 av_log(avctx, AV_LOG_ERROR, "stuffing too large\n");
2028 return -1;
2029 }
2030
2031 switch (s->c.codec_id) {
2034 while (stuffing_count--) {
2035 put_bits(&s->pb, 8, 0);
2036 }
2037 break;
2038 case AV_CODEC_ID_MPEG4:
2039 put_bits(&s->pb, 16, 0);
2040 put_bits(&s->pb, 16, 0x1C3);
2041 stuffing_count -= 4;
2042 while (stuffing_count--) {
2043 put_bits(&s->pb, 8, 0xFF);
2044 }
2045 break;
2046 default:
2047 av_log(avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2048 m->stuffing_bits = 0;
2049 }
2050 flush_put_bits(&s->pb);
2051 m->frame_bits = put_bits_count(&s->pb);
2052 }
2053
2054 /* update MPEG-1/2 vbv_delay for CBR */
2055 if (avctx->rc_max_rate &&
2056 avctx->rc_min_rate == avctx->rc_max_rate &&
2057 s->c.out_format == FMT_MPEG1 &&
2058 90000LL * (avctx->rc_buffer_size - 1) <=
2059 avctx->rc_max_rate * 0xFFFFLL) {
2060 AVCPBProperties *props;
2061 size_t props_size;
2062
2063 int vbv_delay, min_delay;
2064 double inbits = avctx->rc_max_rate *
2065 av_q2d(avctx->time_base);
2066 int minbits = m->frame_bits - 8 *
2067 (m->vbv_delay_pos - 1);
2068 double bits = m->rc_context.buffer_index + minbits - inbits;
2069 uint8_t *const vbv_delay_ptr = s->pb.buf + m->vbv_delay_pos;
2070
2071 if (bits < 0)
2072 av_log(avctx, AV_LOG_ERROR,
2073 "Internal error, negative bits\n");
2074
2075 av_assert1(s->c.repeat_first_field == 0);
2076
2077 vbv_delay = bits * 90000 / avctx->rc_max_rate;
2078 min_delay = (minbits * 90000LL + avctx->rc_max_rate - 1) /
2079 avctx->rc_max_rate;
2080
2081 vbv_delay = FFMAX(vbv_delay, min_delay);
2082
2083 av_assert0(vbv_delay < 0xFFFF);
2084
2085 vbv_delay_ptr[0] &= 0xF8;
2086 vbv_delay_ptr[0] |= vbv_delay >> 13;
2087 vbv_delay_ptr[1] = vbv_delay >> 5;
2088 vbv_delay_ptr[2] &= 0x07;
2089 vbv_delay_ptr[2] |= vbv_delay << 3;
2090
2091 props = av_cpb_properties_alloc(&props_size);
2092 if (!props)
2093 return AVERROR(ENOMEM);
2094 props->vbv_delay = vbv_delay * 300;
2095
2097 (uint8_t*)props, props_size);
2098 if (ret < 0) {
2099 av_freep(&props);
2100 return ret;
2101 }
2102 }
2103 m->total_bits += m->frame_bits;
2104
2105 pkt->pts = s->c.cur_pic.ptr->f->pts;
2106 pkt->duration = s->c.cur_pic.ptr->f->duration;
2107 if (!s->c.low_delay && s->c.pict_type != AV_PICTURE_TYPE_B) {
2108 if (!s->c.cur_pic.ptr->coded_picture_number)
2109 pkt->dts = pkt->pts - m->dts_delta;
2110 else
2111 pkt->dts = m->reordered_pts;
2112 m->reordered_pts = pkt->pts;
2113 } else
2114 pkt->dts = pkt->pts;
2115
2116 // the no-delay case is handled in generic code
2117 if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY) {
2118 ret = ff_encode_reordered_opaque(avctx, pkt, s->c.cur_pic.ptr->f);
2119 if (ret < 0)
2120 return ret;
2121 }
2122
2123 if (s->c.cur_pic.ptr->f->flags & AV_FRAME_FLAG_KEY)
2124 pkt->flags |= AV_PKT_FLAG_KEY;
2125 if (s->mb_info)
2127 } else {
2128 m->frame_bits = 0;
2129 }
2130
2131 ff_mpv_unref_picture(&s->c.cur_pic);
2132
2133 av_assert1((m->frame_bits & 7) == 0);
2134
2135 pkt->size = m->frame_bits / 8;
2136 *got_packet = !!pkt->size;
2137 return 0;
2138}
2139
2141 int n, int threshold)
2142{
2143 static const char tab[64] = {
2144 3, 2, 2, 1, 1, 1, 1, 1,
2145 1, 1, 1, 1, 1, 1, 1, 1,
2146 1, 1, 1, 1, 1, 1, 1, 1,
2147 0, 0, 0, 0, 0, 0, 0, 0,
2148 0, 0, 0, 0, 0, 0, 0, 0,
2149 0, 0, 0, 0, 0, 0, 0, 0,
2150 0, 0, 0, 0, 0, 0, 0, 0,
2151 0, 0, 0, 0, 0, 0, 0, 0
2152 };
2153 int score = 0;
2154 int run = 0;
2155 int i;
2156 int16_t *block = s->block[n];
2157 const int last_index = s->c.block_last_index[n];
2158 int skip_dc;
2159
2160 if (threshold < 0) {
2161 skip_dc = 0;
2162 threshold = -threshold;
2163 } else
2164 skip_dc = 1;
2165
2166 /* Are all we could set to zero already zero? */
2167 if (last_index <= skip_dc - 1)
2168 return;
2169
2170 for (i = 0; i <= last_index; i++) {
2171 const int j = s->c.intra_scantable.permutated[i];
2172 const int level = FFABS(block[j]);
2173 if (level == 1) {
2174 if (skip_dc && i == 0)
2175 continue;
2176 score += tab[run];
2177 run = 0;
2178 } else if (level > 1) {
2179 return;
2180 } else {
2181 run++;
2182 }
2183 }
2184 if (score >= threshold)
2185 return;
2186 for (i = skip_dc; i <= last_index; i++) {
2187 const int j = s->c.intra_scantable.permutated[i];
2188 block[j] = 0;
2189 }
2190 if (block[0])
2191 s->c.block_last_index[n] = 0;
2192 else
2193 s->c.block_last_index[n] = -1;
2194}
2195
2196static inline void clip_coeffs(const MPVEncContext *const s, int16_t block[],
2197 int last_index)
2198{
2199 int i;
2200 const int maxlevel = s->max_qcoeff;
2201 const int minlevel = s->min_qcoeff;
2202 int overflow = 0;
2203
2204 if (s->c.mb_intra) {
2205 i = 1; // skip clipping of intra dc
2206 } else
2207 i = 0;
2208
2209 for (; i <= last_index; i++) {
2210 const int j = s->c.intra_scantable.permutated[i];
2211 int level = block[j];
2212
2213 if (level > maxlevel) {
2214 level = maxlevel;
2215 overflow++;
2216 } else if (level < minlevel) {
2217 level = minlevel;
2218 overflow++;
2219 }
2220
2221 block[j] = level;
2222 }
2223
2224 if (overflow && s->c.avctx->mb_decision == FF_MB_DECISION_SIMPLE)
2225 av_log(s->c.avctx, AV_LOG_INFO,
2226 "warning, clipping %d dct coefficients to %d..%d\n",
2227 overflow, minlevel, maxlevel);
2228}
2229
2230static void get_visual_weight(int16_t *weight, const uint8_t *ptr, int stride)
2231{
2232 int x, y;
2233 // FIXME optimize
2234 for (y = 0; y < 8; y++) {
2235 for (x = 0; x < 8; x++) {
2236 int x2, y2;
2237 int sum = 0;
2238 int sqr = 0;
2239 int count = 0;
2240
2241 for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
2242 for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
2243 int v = ptr[x2 + y2 * stride];
2244 sum += v;
2245 sqr += v * v;
2246 count++;
2247 }
2248 }
2249 weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
2250 }
2251 }
2252}
2253
2255 int motion_x, int motion_y,
2256 int mb_block_height,
2257 int mb_block_width,
2258 int mb_block_count,
2259 int chroma_x_shift,
2260 int chroma_y_shift,
2261 int chroma_format)
2262{
2263/* Interlaced DCT is only possible with MPEG-2 and MPEG-4
2264 * and neither of these encoders currently supports 444. */
2265#define INTERLACED_DCT(s) ((chroma_format == CHROMA_420 || chroma_format == CHROMA_422) && \
2266 (s)->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT)
2267 DECLARE_ALIGNED(16, int16_t, weight)[12][64];
2268 int16_t orig[12][64];
2269 const int mb_x = s->c.mb_x;
2270 const int mb_y = s->c.mb_y;
2271 int i;
2272 int skip_dct[12];
2273 int dct_offset = s->c.linesize * 8; // default for progressive frames
2274 int uv_dct_offset = s->c.uvlinesize * 8;
2275 const uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2276 ptrdiff_t wrap_y, wrap_c;
2277
2278 for (i = 0; i < mb_block_count; i++)
2279 skip_dct[i] = s->skipdct;
2280
2281 if (s->adaptive_quant) {
2282 const int last_qp = s->c.qscale;
2283 const int mb_xy = mb_x + mb_y * s->c.mb_stride;
2284
2285 s->lambda = s->lambda_table[mb_xy];
2286 s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
2288
2289 if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
2290 s->dquant = s->c.cur_pic.qscale_table[mb_xy] - last_qp;
2291
2292 if (s->c.out_format == FMT_H263) {
2293 s->dquant = av_clip(s->dquant, -2, 2);
2294
2295 if (s->c.codec_id == AV_CODEC_ID_MPEG4) {
2296 if (!s->c.mb_intra) {
2297 if (s->c.pict_type == AV_PICTURE_TYPE_B) {
2298 if (s->dquant & 1 || s->c.mv_dir & MV_DIRECT)
2299 s->dquant = 0;
2300 }
2301 if (s->c.mv_type == MV_TYPE_8X8)
2302 s->dquant = 0;
2303 }
2304 }
2305 }
2306 }
2307 ff_set_qscale(&s->c, last_qp + s->dquant);
2308 } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
2309 ff_set_qscale(&s->c, s->c.qscale + s->dquant);
2310
2311 wrap_y = s->c.linesize;
2312 wrap_c = s->c.uvlinesize;
2313 ptr_y = s->new_pic->data[0] +
2314 (mb_y * 16 * wrap_y) + mb_x * 16;
2315 ptr_cb = s->new_pic->data[1] +
2316 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2317 ptr_cr = s->new_pic->data[2] +
2318 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2319
2320 if ((mb_x * 16 + 16 > s->c.width || mb_y * 16 + 16 > s->c.height) &&
2321 s->c.codec_id != AV_CODEC_ID_AMV) {
2322 uint8_t *ebuf = s->c.sc.edge_emu_buffer + 38 * wrap_y;
2323 int cw = (s->c.width + chroma_x_shift) >> chroma_x_shift;
2324 int ch = (s->c.height + chroma_y_shift) >> chroma_y_shift;
2325 s->c.vdsp.emulated_edge_mc(ebuf, ptr_y,
2326 wrap_y, wrap_y,
2327 16, 16, mb_x * 16, mb_y * 16,
2328 s->c.width, s->c.height);
2329 ptr_y = ebuf;
2330 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y, ptr_cb,
2331 wrap_c, wrap_c,
2332 mb_block_width, mb_block_height,
2333 mb_x * mb_block_width, mb_y * mb_block_height,
2334 cw, ch);
2335 ptr_cb = ebuf + 16 * wrap_y;
2336 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y + 16, ptr_cr,
2337 wrap_c, wrap_c,
2338 mb_block_width, mb_block_height,
2339 mb_x * mb_block_width, mb_y * mb_block_height,
2340 cw, ch);
2341 ptr_cr = ebuf + 16 * wrap_y + 16;
2342 }
2343
2344 if (s->c.mb_intra) {
2345 if (INTERLACED_DCT(s)) {
2346 int progressive_score, interlaced_score;
2347
2348 s->c.interlaced_dct = 0;
2349 progressive_score = s->ildct_cmp[1](s, ptr_y, NULL, wrap_y, 8) +
2350 s->ildct_cmp[1](s, ptr_y + wrap_y * 8,
2351 NULL, wrap_y, 8) - 400;
2352
2353 if (progressive_score > 0) {
2354 interlaced_score = s->ildct_cmp[1](s, ptr_y,
2355 NULL, wrap_y * 2, 8) +
2356 s->ildct_cmp[1](s, ptr_y + wrap_y,
2357 NULL, wrap_y * 2, 8);
2358 if (progressive_score > interlaced_score) {
2359 s->c.interlaced_dct = 1;
2360
2361 dct_offset = wrap_y;
2362 uv_dct_offset = wrap_c;
2363 wrap_y <<= 1;
2364 if (chroma_format == CHROMA_422 ||
2365 chroma_format == CHROMA_444)
2366 wrap_c <<= 1;
2367 }
2368 }
2369 }
2370
2371 s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y);
2372 s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
2373 s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
2374 s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
2375
2376 if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) {
2377 skip_dct[4] = 1;
2378 skip_dct[5] = 1;
2379 } else {
2380 s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c);
2381 s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c);
2382 if (chroma_format == CHROMA_422) {
2383 s->pdsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2384 s->pdsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2385 } else if (chroma_format == CHROMA_444) {
2386 s->pdsp.get_pixels(s->block[ 6], ptr_cb + 8, wrap_c);
2387 s->pdsp.get_pixels(s->block[ 7], ptr_cr + 8, wrap_c);
2388 s->pdsp.get_pixels(s->block[ 8], ptr_cb + uv_dct_offset, wrap_c);
2389 s->pdsp.get_pixels(s->block[ 9], ptr_cr + uv_dct_offset, wrap_c);
2390 s->pdsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2391 s->pdsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2392 }
2393 }
2394 } else {
2395 op_pixels_func (*op_pix)[4];
2396 qpel_mc_func (*op_qpix)[16];
2397 uint8_t *dest_y, *dest_cb, *dest_cr;
2398
2399 dest_y = s->c.dest[0];
2400 dest_cb = s->c.dest[1];
2401 dest_cr = s->c.dest[2];
2402
2403 if ((!s->c.no_rounding) || s->c.pict_type == AV_PICTURE_TYPE_B) {
2404 op_pix = s->c.hdsp.put_pixels_tab;
2405 op_qpix = s->c.qdsp.put_qpel_pixels_tab;
2406 } else {
2407 op_pix = s->c.hdsp.put_no_rnd_pixels_tab;
2408 op_qpix = s->c.qdsp.put_no_rnd_qpel_pixels_tab;
2409 }
2410
2411 if (s->c.mv_dir & MV_DIR_FORWARD) {
2412 ff_mpv_motion(&s->c, dest_y, dest_cb, dest_cr, 0,
2413 s->c.last_pic.data,
2414 op_pix, op_qpix);
2415 op_pix = s->c.hdsp.avg_pixels_tab;
2416 op_qpix = s->c.qdsp.avg_qpel_pixels_tab;
2417 }
2418 if (s->c.mv_dir & MV_DIR_BACKWARD) {
2419 ff_mpv_motion(&s->c, dest_y, dest_cb, dest_cr, 1,
2420 s->c.next_pic.data,
2421 op_pix, op_qpix);
2422 }
2423
2424 if (INTERLACED_DCT(s)) {
2425 int progressive_score, interlaced_score;
2426
2427 s->c.interlaced_dct = 0;
2428 progressive_score = s->ildct_cmp[0](s, dest_y, ptr_y, wrap_y, 8) +
2429 s->ildct_cmp[0](s, dest_y + wrap_y * 8,
2430 ptr_y + wrap_y * 8,
2431 wrap_y, 8) - 400;
2432
2433 if (s->c.avctx->ildct_cmp == FF_CMP_VSSE)
2434 progressive_score -= 400;
2435
2436 if (progressive_score > 0) {
2437 interlaced_score = s->ildct_cmp[0](s, dest_y, ptr_y,
2438 wrap_y * 2, 8) +
2439 s->ildct_cmp[0](s, dest_y + wrap_y,
2440 ptr_y + wrap_y,
2441 wrap_y * 2, 8);
2442
2443 if (progressive_score > interlaced_score) {
2444 s->c.interlaced_dct = 1;
2445
2446 dct_offset = wrap_y;
2447 uv_dct_offset = wrap_c;
2448 wrap_y <<= 1;
2449 if (chroma_format == CHROMA_422)
2450 wrap_c <<= 1;
2451 }
2452 }
2453 }
2454
2455 s->pdsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
2456 s->pdsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2457 s->pdsp.diff_pixels(s->block[2], ptr_y + dct_offset,
2458 dest_y + dct_offset, wrap_y);
2459 s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
2460 dest_y + dct_offset + 8, wrap_y);
2461
2462 if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) {
2463 skip_dct[4] = 1;
2464 skip_dct[5] = 1;
2465 } else {
2466 s->pdsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2467 s->pdsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2468 if (!chroma_y_shift) { /* 422 */
2469 s->pdsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
2470 dest_cb + uv_dct_offset, wrap_c);
2471 s->pdsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
2472 dest_cr + uv_dct_offset, wrap_c);
2473 }
2474 }
2475 /* pre quantization */
2476 if (s->mc_mb_var[s->c.mb_stride * mb_y + mb_x] < 2 * s->c.qscale * s->c.qscale) {
2477 // FIXME optimize
2478 if (s->sad_cmp[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->c.qscale)
2479 skip_dct[0] = 1;
2480 if (s->sad_cmp[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 * s->c.qscale)
2481 skip_dct[1] = 1;
2482 if (s->sad_cmp[1](NULL, ptr_y + dct_offset, dest_y + dct_offset,
2483 wrap_y, 8) < 20 * s->c.qscale)
2484 skip_dct[2] = 1;
2485 if (s->sad_cmp[1](NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2486 wrap_y, 8) < 20 * s->c.qscale)
2487 skip_dct[3] = 1;
2488 if (s->sad_cmp[1](NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 * s->c.qscale)
2489 skip_dct[4] = 1;
2490 if (s->sad_cmp[1](NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 * s->c.qscale)
2491 skip_dct[5] = 1;
2492 if (!chroma_y_shift) { /* 422 */
2493 if (s->sad_cmp[1](NULL, ptr_cb + uv_dct_offset,
2494 dest_cb + uv_dct_offset,
2495 wrap_c, 8) < 20 * s->c.qscale)
2496 skip_dct[6] = 1;
2497 if (s->sad_cmp[1](NULL, ptr_cr + uv_dct_offset,
2498 dest_cr + uv_dct_offset,
2499 wrap_c, 8) < 20 * s->c.qscale)
2500 skip_dct[7] = 1;
2501 }
2502 }
2503 }
2504
2505 if (s->quantizer_noise_shaping) {
2506 if (!skip_dct[0])
2507 get_visual_weight(weight[0], ptr_y , wrap_y);
2508 if (!skip_dct[1])
2509 get_visual_weight(weight[1], ptr_y + 8, wrap_y);
2510 if (!skip_dct[2])
2511 get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
2512 if (!skip_dct[3])
2513 get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
2514 if (!skip_dct[4])
2515 get_visual_weight(weight[4], ptr_cb , wrap_c);
2516 if (!skip_dct[5])
2517 get_visual_weight(weight[5], ptr_cr , wrap_c);
2518 if (!chroma_y_shift) { /* 422 */
2519 if (!skip_dct[6])
2520 get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2521 wrap_c);
2522 if (!skip_dct[7])
2523 get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2524 wrap_c);
2525 }
2526 memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
2527 }
2528
2529 /* DCT & quantize */
2530 av_assert2(s->c.out_format != FMT_MJPEG || s->c.qscale == 8);
2531 {
2532 for (i = 0; i < mb_block_count; i++) {
2533 if (!skip_dct[i]) {
2534 int overflow;
2535 s->c.block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->c.qscale, &overflow);
2536 // FIXME we could decide to change to quantizer instead of
2537 // clipping
2538 // JS: I don't think that would be a good idea it could lower
2539 // quality instead of improve it. Just INTRADC clipping
2540 // deserves changes in quantizer
2541 if (overflow)
2542 clip_coeffs(s, s->block[i], s->c.block_last_index[i]);
2543 } else
2544 s->c.block_last_index[i] = -1;
2545 }
2546 if (s->quantizer_noise_shaping) {
2547 for (i = 0; i < mb_block_count; i++) {
2548 if (!skip_dct[i]) {
2549 s->c.block_last_index[i] =
2550 dct_quantize_refine(s, s->block[i], weight[i],
2551 orig[i], i, s->c.qscale);
2552 }
2553 }
2554 }
2555
2556 if (s->luma_elim_threshold && !s->c.mb_intra)
2557 for (i = 0; i < 4; i++)
2558 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2559 if (s->chroma_elim_threshold && !s->c.mb_intra)
2560 for (i = 4; i < mb_block_count; i++)
2561 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2562
2563 if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2564 for (i = 0; i < mb_block_count; i++) {
2565 if (s->c.block_last_index[i] == -1)
2566 s->coded_score[i] = INT_MAX / 256;
2567 }
2568 }
2569 }
2570
2571 if ((s->c.avctx->flags & AV_CODEC_FLAG_GRAY) && s->c.mb_intra) {
2572 s->c.block_last_index[4] =
2573 s->c.block_last_index[5] = 0;
2574 s->block[4][0] =
2575 s->block[5][0] = (1024 + s->c.c_dc_scale / 2) / s->c.c_dc_scale;
2576 if (!chroma_y_shift) { /* 422 / 444 */
2577 for (i=6; i<12; i++) {
2578 s->c.block_last_index[i] = 0;
2579 s->block[i][0] = s->block[4][0];
2580 }
2581 }
2582 }
2583
2584 // non c quantize code returns incorrect block_last_index FIXME
2585 if (s->c.alternate_scan && s->dct_quantize != dct_quantize_c) {
2586 for (i = 0; i < mb_block_count; i++) {
2587 int j;
2588 if (s->c.block_last_index[i] > 0) {
2589 for (j = 63; j > 0; j--) {
2590 if (s->block[i][s->c.intra_scantable.permutated[j]])
2591 break;
2592 }
2593 s->c.block_last_index[i] = j;
2594 }
2595 }
2596 }
2597
2598 s->encode_mb(s, s->block, motion_x, motion_y);
2599}
2600
2601static void encode_mb(MPVEncContext *const s, int motion_x, int motion_y)
2602{
2603 if (s->c.chroma_format == CHROMA_420)
2604 encode_mb_internal(s, motion_x, motion_y, 8, 8, 6, 1, 1, CHROMA_420);
2605 else if (s->c.chroma_format == CHROMA_422)
2606 encode_mb_internal(s, motion_x, motion_y, 16, 8, 8, 1, 0, CHROMA_422);
2607 else
2608 encode_mb_internal(s, motion_x, motion_y, 16, 16, 12, 0, 0, CHROMA_444);
2609}
2610
2629
2630#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE) \
2631static inline void BEFORE ##_context_before_encode(DST_TYPE *const d, \
2632 const SRC_TYPE *const s) \
2633{ \
2634 /* FIXME is memcpy faster than a loop? */ \
2635 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2636 \
2637 /* MPEG-1 */ \
2638 d->mb_skip_run = s->mb_skip_run; \
2639 for (int i = 0; i < 3; i++) \
2640 d->last_dc[i] = s->last_dc[i]; \
2641 \
2642 /* statistics */ \
2643 d->mv_bits = s->mv_bits; \
2644 d->i_tex_bits = s->i_tex_bits; \
2645 d->p_tex_bits = s->p_tex_bits; \
2646 d->i_count = s->i_count; \
2647 d->misc_bits = s->misc_bits; \
2648 d->last_bits = 0; \
2649 \
2650 d->c.mb_skipped = 0; \
2651 d->c.qscale = s->c.qscale; \
2652 d->dquant = s->dquant; \
2653 \
2654 d->esc3_level_length = s->esc3_level_length; \
2655} \
2656 \
2657static inline void AFTER ## _context_after_encode(DST_TYPE *const d, \
2658 const SRC_TYPE *const s, \
2659 int data_partitioning) \
2660{ \
2661 /* FIXME is memcpy faster than a loop? */ \
2662 memcpy(d->c.mv, s->c.mv, 2*4*2*sizeof(int)); \
2663 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2664 \
2665 /* MPEG-1 */ \
2666 d->mb_skip_run = s->mb_skip_run; \
2667 for (int i = 0; i < 3; i++) \
2668 d->last_dc[i] = s->last_dc[i]; \
2669 \
2670 /* statistics */ \
2671 d->mv_bits = s->mv_bits; \
2672 d->i_tex_bits = s->i_tex_bits; \
2673 d->p_tex_bits = s->p_tex_bits; \
2674 d->i_count = s->i_count; \
2675 d->misc_bits = s->misc_bits; \
2676 \
2677 d->c.mb_intra = s->c.mb_intra; \
2678 d->c.mb_skipped = s->c.mb_skipped; \
2679 d->c.mv_type = s->c.mv_type; \
2680 d->c.mv_dir = s->c.mv_dir; \
2681 d->pb = s->pb; \
2682 if (data_partitioning) { \
2683 d->pb2 = s->pb2; \
2684 d->tex_pb = s->tex_pb; \
2685 } \
2686 d->block = s->block; \
2687 for (int i = 0; i < 8; i++) \
2688 d->c.block_last_index[i] = s->c.block_last_index[i]; \
2689 d->c.interlaced_dct = s->c.interlaced_dct; \
2690 d->c.qscale = s->c.qscale; \
2691 \
2692 d->esc3_level_length = s->esc3_level_length; \
2693}
2694
2695COPY_CONTEXT(backup, save, MBBackup, MPVEncContext)
2696COPY_CONTEXT(reset, store, MPVEncContext, MBBackup)
2697
2698static void encode_mb_hq(MPVEncContext *const s, MBBackup *const backup, MBBackup *const best,
2699 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2700 int *dmin, int *next_block, int motion_x, int motion_y)
2701{
2702 int score;
2703 uint8_t *dest_backup[3];
2704
2705 reset_context_before_encode(s, backup);
2706
2707 s->block = s->blocks[*next_block];
2708 s->pb = pb[*next_block];
2709 if (s->data_partitioning) {
2710 s->pb2 = pb2 [*next_block];
2711 s->tex_pb= tex_pb[*next_block];
2712 }
2713
2714 if(*next_block){
2715 memcpy(dest_backup, s->c.dest, sizeof(s->c.dest));
2716 s->c.dest[0] = s->c.sc.rd_scratchpad;
2717 s->c.dest[1] = s->c.sc.rd_scratchpad + 16*s->c.linesize;
2718 s->c.dest[2] = s->c.sc.rd_scratchpad + 16*s->c.linesize + 8;
2719 av_assert0(s->c.linesize >= 32); //FIXME
2720 }
2721
2722 encode_mb(s, motion_x, motion_y);
2723
2724 score= put_bits_count(&s->pb);
2725 if (s->data_partitioning) {
2726 score+= put_bits_count(&s->pb2);
2727 score+= put_bits_count(&s->tex_pb);
2728 }
2729
2730 if (s->c.avctx->mb_decision == FF_MB_DECISION_RD) {
2731 mpv_reconstruct_mb(s, s->block);
2732
2733 score *= s->lambda2;
2734 score += sse_mb(s) << FF_LAMBDA_SHIFT;
2735 }
2736
2737 if(*next_block){
2738 memcpy(s->c.dest, dest_backup, sizeof(s->c.dest));
2739 }
2740
2741 if(score<*dmin){
2742 *dmin= score;
2743 *next_block^=1;
2744
2745 save_context_after_encode(best, s, s->data_partitioning);
2746 }
2747}
2748
2749static int sse(const MPVEncContext *const s, const uint8_t *src1, const uint8_t *src2, int w, int h, int stride)
2750{
2751 const uint32_t *sq = ff_square_tab + 256;
2752 int acc=0;
2753 int x,y;
2754
2755 if(w==16 && h==16)
2756 return s->sse_cmp[0](NULL, src1, src2, stride, 16);
2757 else if(w==8 && h==8)
2758 return s->sse_cmp[1](NULL, src1, src2, stride, 8);
2759
2760 for(y=0; y<h; y++){
2761 for(x=0; x<w; x++){
2762 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2763 }
2764 }
2765
2766 av_assert2(acc>=0);
2767
2768 return acc;
2769}
2770
2771static int sse_mb(MPVEncContext *const s)
2772{
2773 int w= 16;
2774 int h= 16;
2775 int chroma_mb_w = w >> s->c.chroma_x_shift;
2776 int chroma_mb_h = h >> s->c.chroma_y_shift;
2777
2778 if (s->c.mb_x*16 + 16 > s->c.width ) w = s->c.width - s->c.mb_x*16;
2779 if (s->c.mb_y*16 + 16 > s->c.height) h = s->c.height- s->c.mb_y*16;
2780
2781 if(w==16 && h==16)
2782 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,
2783 s->c.dest[0], s->c.linesize, 16) +
2784 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,
2785 s->c.dest[1], s->c.uvlinesize, chroma_mb_h) +
2786 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,
2787 s->c.dest[2], s->c.uvlinesize, chroma_mb_h);
2788 else
2789 return sse(s, s->new_pic->data[0] + s->c.mb_x * 16 + s->c.mb_y * s->c.linesize * 16,
2790 s->c.dest[0], w, h, s->c.linesize) +
2791 sse(s, s->new_pic->data[1] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2792 s->c.dest[1], w >> s->c.chroma_x_shift, h >> s->c.chroma_y_shift, s->c.uvlinesize) +
2793 sse(s, s->new_pic->data[2] + s->c.mb_x * chroma_mb_w + s->c.mb_y * s->c.uvlinesize * chroma_mb_h,
2794 s->c.dest[2], w >> s->c.chroma_x_shift, h >> s->c.chroma_y_shift, s->c.uvlinesize);
2795}
2796
2798 MPVEncContext *const s = *(void**)arg;
2799
2800
2801 s->me.pre_pass = 1;
2802 s->me.dia_size = s->c.avctx->pre_dia_size;
2803 s->c.first_slice_line = 1;
2804 for (s->c.mb_y = s->c.end_mb_y - 1; s->c.mb_y >= s->c.start_mb_y; s->c.mb_y--) {
2805 for (s->c.mb_x = s->c.mb_width - 1; s->c.mb_x >=0 ; s->c.mb_x--)
2806 ff_pre_estimate_p_frame_motion(s, s->c.mb_x, s->c.mb_y);
2807 s->c.first_slice_line = 0;
2808 }
2809
2810 s->me.pre_pass = 0;
2811
2812 return 0;
2813}
2814
2816 MPVEncContext *const s = *(void**)arg;
2817
2818 s->me.dia_size = s->c.avctx->dia_size;
2819 s->c.first_slice_line = 1;
2820 for (s->c.mb_y = s->c.start_mb_y; s->c.mb_y < s->c.end_mb_y; s->c.mb_y++) {
2821 s->c.mb_x = 0; //for block init below
2823 for (s->c.mb_x = 0; s->c.mb_x < s->c.mb_width; s->c.mb_x++) {
2824 s->c.block_index[0] += 2;
2825 s->c.block_index[1] += 2;
2826 s->c.block_index[2] += 2;
2827 s->c.block_index[3] += 2;
2828
2829 /* compute motion vector & mb_type and store in context */
2830 if (s->c.pict_type == AV_PICTURE_TYPE_B)
2831 ff_estimate_b_frame_motion(s, s->c.mb_x, s->c.mb_y);
2832 else
2833 ff_estimate_p_frame_motion(s, s->c.mb_x, s->c.mb_y);
2834 }
2835 s->c.first_slice_line = 0;
2836 }
2837 return 0;
2838}
2839
2840static int mb_var_thread(AVCodecContext *c, void *arg){
2841 MPVEncContext *const s = *(void**)arg;
2842
2843 for (int mb_y = s->c.start_mb_y; mb_y < s->c.end_mb_y; mb_y++) {
2844 for (int mb_x = 0; mb_x < s->c.mb_width; mb_x++) {
2845 int xx = mb_x * 16;
2846 int yy = mb_y * 16;
2847 const uint8_t *pix = s->new_pic->data[0] + (yy * s->c.linesize) + xx;
2848 int varc;
2849 int sum = s->mpvencdsp.pix_sum(pix, s->c.linesize);
2850
2851 varc = (s->mpvencdsp.pix_norm1(pix, s->c.linesize) -
2852 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2853
2854 s->mb_var [s->c.mb_stride * mb_y + mb_x] = varc;
2855 s->mb_mean[s->c.mb_stride * mb_y + mb_x] = (sum+128)>>8;
2856 s->me.mb_var_sum_temp += varc;
2857 }
2858 }
2859 return 0;
2860}
2861
2863{
2864 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4) {
2865 if (s->partitioned_frame)
2867
2868 ff_mpeg4_stuffing(&s->pb);
2869 } else if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
2870 s->c.out_format == FMT_MJPEG) {
2872 } else if (CONFIG_SPEEDHQ_ENCODER && s->c.out_format == FMT_SPEEDHQ) {
2874 }
2875
2876 flush_put_bits(&s->pb);
2877
2878 if ((s->c.avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
2879 s->misc_bits+= get_bits_diff(s);
2880}
2881
2882static void write_mb_info(MPVEncContext *const s)
2883{
2884 uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
2885 int offset = put_bits_count(&s->pb);
2886 int mba = s->c.mb_x + s->c.mb_width * (s->c.mb_y % s->gob_index);
2887 int gobn = s->c.mb_y / s->gob_index;
2888 int pred_x, pred_y;
2889 if (CONFIG_H263_ENCODER)
2890 ff_h263_pred_motion(&s->c, 0, 0, &pred_x, &pred_y);
2891 bytestream_put_le32(&ptr, offset);
2892 bytestream_put_byte(&ptr, s->c.qscale);
2893 bytestream_put_byte(&ptr, gobn);
2894 bytestream_put_le16(&ptr, mba);
2895 bytestream_put_byte(&ptr, pred_x); /* hmv1 */
2896 bytestream_put_byte(&ptr, pred_y); /* vmv1 */
2897 /* 4MV not implemented */
2898 bytestream_put_byte(&ptr, 0); /* hmv2 */
2899 bytestream_put_byte(&ptr, 0); /* vmv2 */
2900}
2901
2902static void update_mb_info(MPVEncContext *const s)
2903{
2904 if (!s->mb_info)
2905 return;
2906 if (put_bytes_count(&s->pb, 0) - s->prev_mb_info >= s->mb_info) {
2907 s->mb_info_size += 12;
2908 s->prev_mb_info = s->last_mb_info;
2909 }
2910
2911 s->last_mb_info = put_bytes_count(&s->pb, 0);
2912 if (!s->mb_info_size)
2913 s->mb_info_size += 12;
2915}
2916
2917int ff_mpv_reallocate_putbitbuffer(MPVEncContext *const s, size_t threshold, size_t size_increase)
2918{
2919 if (put_bytes_left(&s->pb, 0) < threshold
2920 && s->c.slice_context_count == 1
2921 && s->pb.buf == s->c.avctx->internal->byte_buffer) {
2922 int lastgob_pos = s->ptr_lastgob - s->pb.buf;
2923
2924 uint8_t *new_buffer = NULL;
2925 int new_buffer_size = 0;
2926
2927 if ((s->c.avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
2928 av_log(s->c.avctx, AV_LOG_ERROR, "Cannot reallocate putbit buffer\n");
2929 return AVERROR(ENOMEM);
2930 }
2931
2932 emms_c();
2933
2934 av_fast_padded_malloc(&new_buffer, &new_buffer_size,
2935 s->c.avctx->internal->byte_buffer_size + size_increase);
2936 if (!new_buffer)
2937 return AVERROR(ENOMEM);
2938
2939 memcpy(new_buffer, s->c.avctx->internal->byte_buffer, s->c.avctx->internal->byte_buffer_size);
2940 av_free(s->c.avctx->internal->byte_buffer);
2941 s->c.avctx->internal->byte_buffer = new_buffer;
2942 s->c.avctx->internal->byte_buffer_size = new_buffer_size;
2943 rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
2944 s->ptr_lastgob = s->pb.buf + lastgob_pos;
2945 }
2946 if (put_bytes_left(&s->pb, 0) < threshold)
2947 return AVERROR(EINVAL);
2948 return 0;
2949}
2950
2951static int encode_thread(AVCodecContext *c, void *arg){
2952 MPVEncContext *const s = *(void**)arg;
2953 int chr_h = 16 >> s->c.chroma_y_shift;
2954 int i;
2955 MBBackup best_s = { 0 }, backup_s;
2956 uint8_t bit_buf[2][MAX_MB_BYTES];
2957 // + 2 because ff_copy_bits() overreads
2958 uint8_t bit_buf2[2][MAX_PB2_MB_SIZE + 2];
2959 uint8_t bit_buf_tex[2][MAX_AC_TEX_MB_SIZE + 2];
2960 PutBitContext pb[2], pb2[2], tex_pb[2];
2961
2962 for(i=0; i<2; i++){
2963 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
2964 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_PB2_MB_SIZE);
2965 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_AC_TEX_MB_SIZE);
2966 }
2967
2968 s->last_bits= put_bits_count(&s->pb);
2969 s->mv_bits=0;
2970 s->misc_bits=0;
2971 s->i_tex_bits=0;
2972 s->p_tex_bits=0;
2973 s->i_count=0;
2974
2975 for(i=0; i<3; i++){
2976 /* init last dc values */
2977 /* note: quant matrix value (8) is implied here */
2978 s->last_dc[i] = 128 << s->c.intra_dc_precision;
2979
2980 s->encoding_error[i] = 0;
2981 }
2982 if (s->c.codec_id == AV_CODEC_ID_AMV) {
2983 s->last_dc[0] = 128 * 8 / 13;
2984 s->last_dc[1] = 128 * 8 / 14;
2985 s->last_dc[2] = 128 * 8 / 14;
2986#if CONFIG_MPEG4_ENCODER
2987 } else if (s->partitioned_frame) {
2988 av_assert1(s->c.codec_id == AV_CODEC_ID_MPEG4);
2990#endif
2991 }
2992 s->mb_skip_run = 0;
2993 memset(s->c.last_mv, 0, sizeof(s->c.last_mv));
2994
2995 s->last_mv_dir = 0;
2996
2997 s->c.resync_mb_x = 0;
2998 s->c.resync_mb_y = 0;
2999 s->c.first_slice_line = 1;
3000 s->ptr_lastgob = s->pb.buf;
3001 for (int mb_y_order = s->c.start_mb_y; mb_y_order < s->c.end_mb_y; mb_y_order++) {
3002 int mb_y;
3003 if (CONFIG_SPEEDHQ_ENCODER && s->c.codec_id == AV_CODEC_ID_SPEEDHQ) {
3004 int first_in_slice;
3005 mb_y = ff_speedhq_mb_y_order_to_mb(mb_y_order, s->c.mb_height, &first_in_slice);
3006 if (first_in_slice && mb_y_order != s->c.start_mb_y)
3008 s->last_dc[0] = s->last_dc[1] = s->last_dc[2] = 1024;
3009 } else {
3010 mb_y = mb_y_order;
3011 }
3012 s->c.mb_x = 0;
3013 s->c.mb_y = mb_y;
3014
3015 ff_set_qscale(&s->c, s->c.qscale);
3017
3018 for (int mb_x = 0; mb_x < s->c.mb_width; mb_x++) {
3019 int mb_type, xy;
3020// int d;
3021 int dmin= INT_MAX;
3022 int dir;
3023 int size_increase = s->c.avctx->internal->byte_buffer_size/4
3024 + s->c.mb_width*MAX_MB_BYTES;
3025
3027 if (put_bytes_left(&s->pb, 0) < MAX_MB_BYTES){
3028 av_log(s->c.avctx, AV_LOG_ERROR, "encoded frame too large\n");
3029 return -1;
3030 }
3031 if (s->data_partitioning) {
3032 if (put_bytes_left(&s->pb2, 0) < MAX_MB_BYTES ||
3033 put_bytes_left(&s->tex_pb, 0) < MAX_MB_BYTES) {
3034 av_log(s->c.avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
3035 return -1;
3036 }
3037 }
3038
3039 s->c.mb_x = mb_x;
3040 s->c.mb_y = mb_y; // moved into loop, can get changed by H.261
3041 ff_update_block_index(&s->c, 8, 0, s->c.chroma_x_shift);
3042
3043 if (CONFIG_H261_ENCODER && s->c.codec_id == AV_CODEC_ID_H261)
3045 xy = s->c.mb_y * s->c.mb_stride + s->c.mb_x;
3046 mb_type = s->mb_type[xy];
3047
3048 /* write gob / video packet header */
3049 if(s->rtp_mode){
3050 int current_packet_size, is_gob_start;
3051
3052 current_packet_size = put_bytes_count(&s->pb, 1)
3053 - (s->ptr_lastgob - s->pb.buf);
3054
3055 is_gob_start = s->rtp_payload_size &&
3056 current_packet_size >= s->rtp_payload_size &&
3057 mb_y + mb_x > 0;
3058
3059 if (s->c.start_mb_y == mb_y && mb_y > 0 && mb_x == 0) is_gob_start = 1;
3060
3061 switch (s->c.codec_id) {
3062 case AV_CODEC_ID_H263:
3063 case AV_CODEC_ID_H263P:
3064 if (!s->h263_slice_structured)
3065 if (s->c.mb_x || s->c.mb_y % s->gob_index) is_gob_start = 0;
3066 break;
3068 if (s->c.mb_x == 0 && s->c.mb_y != 0) is_gob_start = 1;
3071 if (s->c.codec_id == AV_CODEC_ID_MPEG1VIDEO && s->c.mb_y >= 175 ||
3072 s->mb_skip_run)
3073 is_gob_start=0;
3074 break;
3075 case AV_CODEC_ID_MJPEG:
3076 if (s->c.mb_x == 0 && s->c.mb_y != 0) is_gob_start = 1;
3077 break;
3078 }
3079
3080 if(is_gob_start){
3081 if (s->c.start_mb_y != mb_y || mb_x != 0) {
3083
3084 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4 && s->partitioned_frame)
3086 }
3087
3088 av_assert2((put_bits_count(&s->pb)&7) == 0);
3089 current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
3090
3091 if (s->error_rate && s->c.resync_mb_x + s->c.resync_mb_y > 0) {
3092 int r = put_bytes_count(&s->pb, 0) + s->picture_number + 16 + s->c.mb_x + s->c.mb_y;
3093 int d = 100 / s->error_rate;
3094 if(r % d == 0){
3095 current_packet_size=0;
3096 s->pb.buf_ptr= s->ptr_lastgob;
3097 av_assert1(put_bits_ptr(&s->pb) == s->ptr_lastgob);
3098 }
3099 }
3100
3101 switch (s->c.codec_id) {
3102 case AV_CODEC_ID_MPEG4:
3103 if (CONFIG_MPEG4_ENCODER) {
3107 }
3108 break;
3111 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
3114 }
3115 break;
3116#if CONFIG_H263P_ENCODER
3117 case AV_CODEC_ID_H263P:
3118 if (s->c.dc_val)
3121#endif
3122 case AV_CODEC_ID_H263:
3123 if (CONFIG_H263_ENCODER) {
3124 if (s->mb_info && put_bytes_count(&s->pb, 0) - s->prev_mb_info >= s->mb_info)
3125 s->mb_info_size += 12;
3126
3128 s->prev_mb_info = put_bits_count(&s->pb)/8;
3129 }
3130 break;
3131 }
3132
3133 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS1) {
3134 int bits= put_bits_count(&s->pb);
3135 s->misc_bits+= bits - s->last_bits;
3136 s->last_bits= bits;
3137 }
3138
3139 s->ptr_lastgob += current_packet_size;
3140 s->c.first_slice_line = 1;
3141 s->c.resync_mb_x = mb_x;
3142 s->c.resync_mb_y = mb_y;
3143 }
3144 }
3145
3146 if (s->c.resync_mb_x == s->c.mb_x &&
3147 s->c.resync_mb_y+1 == s->c.mb_y)
3148 s->c.first_slice_line = 0;
3149
3150 s->c.mb_skipped = 0;
3151 s->dquant=0; //only for QP_RD
3152
3154
3155 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
3156 int next_block=0;
3157 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3158
3159 backup_context_before_encode(&backup_s, s);
3160 backup_s.pb= s->pb;
3161 if (s->data_partitioning) {
3162 backup_s.pb2= s->pb2;
3163 backup_s.tex_pb= s->tex_pb;
3164 }
3165
3166 if(mb_type&CANDIDATE_MB_TYPE_INTER){
3167 s->c.mv_dir = MV_DIR_FORWARD;
3168 s->c.mv_type = MV_TYPE_16X16;
3169 s->c.mb_intra = 0;
3170 s->c.mv[0][0][0] = s->p_mv_table[xy][0];
3171 s->c.mv[0][0][1] = s->p_mv_table[xy][1];
3172 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3173 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3174 }
3175 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
3176 s->c.mv_dir = MV_DIR_FORWARD;
3177 s->c.mv_type = MV_TYPE_FIELD;
3178 s->c.mb_intra = 0;
3179 for(i=0; i<2; i++){
3180 int j = s->c.field_select[0][i] = s->p_field_select_table[i][xy];
3181 s->c.mv[0][i][0] = s->c.p_field_mv_table[i][j][xy][0];
3182 s->c.mv[0][i][1] = s->c.p_field_mv_table[i][j][xy][1];
3183 }
3184 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3185 &dmin, &next_block, 0, 0);
3186 }
3187 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
3188 s->c.mv_dir = MV_DIR_FORWARD;
3189 s->c.mv_type = MV_TYPE_16X16;
3190 s->c.mb_intra = 0;
3191 s->c.mv[0][0][0] = 0;
3192 s->c.mv[0][0][1] = 0;
3193 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3194 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3195 }
3196 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
3197 s->c.mv_dir = MV_DIR_FORWARD;
3198 s->c.mv_type = MV_TYPE_8X8;
3199 s->c.mb_intra = 0;
3200 for(i=0; i<4; i++){
3201 s->c.mv[0][i][0] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
3202 s->c.mv[0][i][1] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
3203 }
3204 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3205 &dmin, &next_block, 0, 0);
3206 }
3207 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
3208 s->c.mv_dir = MV_DIR_FORWARD;
3209 s->c.mv_type = MV_TYPE_16X16;
3210 s->c.mb_intra = 0;
3211 s->c.mv[0][0][0] = s->b_forw_mv_table[xy][0];
3212 s->c.mv[0][0][1] = s->b_forw_mv_table[xy][1];
3213 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3214 &dmin, &next_block, s->c.mv[0][0][0], s->c.mv[0][0][1]);
3215 }
3216 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
3217 s->c.mv_dir = MV_DIR_BACKWARD;
3218 s->c.mv_type = MV_TYPE_16X16;
3219 s->c.mb_intra = 0;
3220 s->c.mv[1][0][0] = s->b_back_mv_table[xy][0];
3221 s->c.mv[1][0][1] = s->b_back_mv_table[xy][1];
3222 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3223 &dmin, &next_block, s->c.mv[1][0][0], s->c.mv[1][0][1]);
3224 }
3225 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
3226 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3227 s->c.mv_type = MV_TYPE_16X16;
3228 s->c.mb_intra = 0;
3229 s->c.mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3230 s->c.mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3231 s->c.mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3232 s->c.mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3233 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3234 &dmin, &next_block, 0, 0);
3235 }
3236 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
3237 s->c.mv_dir = MV_DIR_FORWARD;
3238 s->c.mv_type = MV_TYPE_FIELD;
3239 s->c.mb_intra = 0;
3240 for(i=0; i<2; i++){
3241 int j = s->c.field_select[0][i] = s->b_field_select_table[0][i][xy];
3242 s->c.mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3243 s->c.mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3244 }
3245 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3246 &dmin, &next_block, 0, 0);
3247 }
3248 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
3249 s->c.mv_dir = MV_DIR_BACKWARD;
3250 s->c.mv_type = MV_TYPE_FIELD;
3251 s->c.mb_intra = 0;
3252 for(i=0; i<2; i++){
3253 int j = s->c.field_select[1][i] = s->b_field_select_table[1][i][xy];
3254 s->c.mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3255 s->c.mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3256 }
3257 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3258 &dmin, &next_block, 0, 0);
3259 }
3260 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
3261 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3262 s->c.mv_type = MV_TYPE_FIELD;
3263 s->c.mb_intra = 0;
3264 for(dir=0; dir<2; dir++){
3265 for(i=0; i<2; i++){
3266 int j = s->c.field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3267 s->c.mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3268 s->c.mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3269 }
3270 }
3271 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3272 &dmin, &next_block, 0, 0);
3273 }
3274 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
3275 s->c.mv_dir = 0;
3276 s->c.mv_type = MV_TYPE_16X16;
3277 s->c.mb_intra = 1;
3278 s->c.mv[0][0][0] = 0;
3279 s->c.mv[0][0][1] = 0;
3280 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3281 &dmin, &next_block, 0, 0);
3282 s->c.mbintra_table[xy] = 1;
3283 }
3284
3285 if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
3286 if (best_s.c.mv_type == MV_TYPE_16X16) { //FIXME move 4mv after QPRD
3287 const int last_qp = backup_s.c.qscale;
3288 int qpi, qp, dc[6];
3289 int16_t ac[6][16];
3290 const int mvdir = (best_s.c.mv_dir & MV_DIR_BACKWARD) ? 1 : 0;
3291 static const int dquant_tab[4]={-1,1,-2,2};
3292 int storecoefs = s->c.mb_intra && s->c.dc_val;
3293
3294 av_assert2(backup_s.dquant == 0);
3295
3296 //FIXME intra
3297 s->c.mv_dir = best_s.c.mv_dir;
3298 s->c.mv_type = MV_TYPE_16X16;
3299 s->c.mb_intra = best_s.c.mb_intra;
3300 s->c.mv[0][0][0] = best_s.c.mv[0][0][0];
3301 s->c.mv[0][0][1] = best_s.c.mv[0][0][1];
3302 s->c.mv[1][0][0] = best_s.c.mv[1][0][0];
3303 s->c.mv[1][0][1] = best_s.c.mv[1][0][1];
3304
3305 qpi = s->c.pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
3306 for(; qpi<4; qpi++){
3307 int dquant= dquant_tab[qpi];
3308 qp= last_qp + dquant;
3309 if (qp < s->c.avctx->qmin || qp > s->c.avctx->qmax)
3310 continue;
3311 backup_s.dquant= dquant;
3312 if(storecoefs){
3313 for(i=0; i<6; i++){
3314 dc[i] = s->c.dc_val[s->c.block_index[i]];
3315 memcpy(ac[i], s->c.ac_val[s->c.block_index[i]], sizeof(*s->c.ac_val));
3316 }
3317 }
3318
3319 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3320 &dmin, &next_block, s->c.mv[mvdir][0][0], s->c.mv[mvdir][0][1]);
3321 if (best_s.c.qscale != qp) {
3322 if(storecoefs){
3323 for(i=0; i<6; i++){
3324 s->c.dc_val[s->c.block_index[i]] = dc[i];
3325 memcpy(s->c.ac_val[s->c.block_index[i]], ac[i], sizeof(*s->c.ac_val));
3326 }
3327 }
3328 }
3329 }
3330 }
3331 }
3332 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
3333 int mx= s->b_direct_mv_table[xy][0];
3334 int my= s->b_direct_mv_table[xy][1];
3335
3336 backup_s.dquant = 0;
3337 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3338 s->c.mb_intra = 0;
3340 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3341 &dmin, &next_block, mx, my);
3342 }
3343 if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
3344 backup_s.dquant = 0;
3345 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3346 s->c.mb_intra = 0;
3347 ff_mpeg4_set_direct_mv(&s->c, 0, 0);
3348 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3349 &dmin, &next_block, 0, 0);
3350 }
3351 if (!best_s.c.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
3352 int coded=0;
3353 for(i=0; i<6; i++)
3354 coded |= s->c.block_last_index[i];
3355 if(coded){
3356 int mx,my;
3357 memcpy(s->c.mv, best_s.c.mv, sizeof(s->c.mv));
3358 if (CONFIG_MPEG4_ENCODER && best_s.c.mv_dir & MV_DIRECT) {
3359 mx=my=0; //FIXME find the one we actually used
3361 } else if (best_s.c.mv_dir & MV_DIR_BACKWARD) {
3362 mx = s->c.mv[1][0][0];
3363 my = s->c.mv[1][0][1];
3364 }else{
3365 mx = s->c.mv[0][0][0];
3366 my = s->c.mv[0][0][1];
3367 }
3368
3369 s->c.mv_dir = best_s.c.mv_dir;
3370 s->c.mv_type = best_s.c.mv_type;
3371 s->c.mb_intra = 0;
3372/* s->c.mv[0][0][0] = best_s.mv[0][0][0];
3373 s->c.mv[0][0][1] = best_s.mv[0][0][1];
3374 s->c.mv[1][0][0] = best_s.mv[1][0][0];
3375 s->c.mv[1][0][1] = best_s.mv[1][0][1];*/
3376 backup_s.dquant= 0;
3377 s->skipdct=1;
3378 encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb,
3379 &dmin, &next_block, mx, my);
3380 s->skipdct=0;
3381 }
3382 }
3383
3384 store_context_after_encode(s, &best_s, s->data_partitioning);
3385
3386 pb_bits_count= put_bits_count(&s->pb);
3387 flush_put_bits(&s->pb);
3388 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3389 s->pb= backup_s.pb;
3390
3391 if (s->data_partitioning) {
3392 pb2_bits_count= put_bits_count(&s->pb2);
3393 flush_put_bits(&s->pb2);
3394 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3395 s->pb2= backup_s.pb2;
3396
3397 tex_pb_bits_count= put_bits_count(&s->tex_pb);
3398 flush_put_bits(&s->tex_pb);
3399 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3400 s->tex_pb= backup_s.tex_pb;
3401 }
3402 s->last_bits= put_bits_count(&s->pb);
3403
3404 if (CONFIG_H263_ENCODER &&
3405 s->c.out_format == FMT_H263 && s->c.pict_type != AV_PICTURE_TYPE_B)
3407
3408 if(next_block==0){ //FIXME 16 vs linesize16
3409 s->c.hdsp.put_pixels_tab[0][0](s->c.dest[0], s->c.sc.rd_scratchpad , s->c.linesize ,16);
3410 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);
3411 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);
3412 }
3413
3414 if (s->c.avctx->mb_decision == FF_MB_DECISION_BITS)
3415 mpv_reconstruct_mb(s, s->block);
3416 } else {
3417 int motion_x = 0, motion_y = 0;
3418 s->c.mv_type = MV_TYPE_16X16;
3419 // only one MB-Type possible
3420
3421 switch(mb_type){
3423 s->c.mv_dir = 0;
3424 s->c.mb_intra = 1;
3425 motion_x= s->c.mv[0][0][0] = 0;
3426 motion_y= s->c.mv[0][0][1] = 0;
3427 s->c.mbintra_table[xy] = 1;
3428 break;
3430 s->c.mv_dir = MV_DIR_FORWARD;
3431 s->c.mb_intra = 0;
3432 motion_x= s->c.mv[0][0][0] = s->p_mv_table[xy][0];
3433 motion_y= s->c.mv[0][0][1] = s->p_mv_table[xy][1];
3434 break;
3436 s->c.mv_dir = MV_DIR_FORWARD;
3437 s->c.mv_type = MV_TYPE_FIELD;
3438 s->c.mb_intra = 0;
3439 for(i=0; i<2; i++){
3440 int j = s->c.field_select[0][i] = s->p_field_select_table[i][xy];
3441 s->c.mv[0][i][0] = s->c.p_field_mv_table[i][j][xy][0];
3442 s->c.mv[0][i][1] = s->c.p_field_mv_table[i][j][xy][1];
3443 }
3444 break;
3446 s->c.mv_dir = MV_DIR_FORWARD;
3447 s->c.mv_type = MV_TYPE_8X8;
3448 s->c.mb_intra = 0;
3449 for(i=0; i<4; i++){
3450 s->c.mv[0][i][0] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][0];
3451 s->c.mv[0][i][1] = s->c.cur_pic.motion_val[0][s->c.block_index[i]][1];
3452 }
3453 break;
3455 if (CONFIG_MPEG4_ENCODER) {
3457 s->c.mb_intra = 0;
3458 motion_x=s->b_direct_mv_table[xy][0];
3459 motion_y=s->b_direct_mv_table[xy][1];
3460 ff_mpeg4_set_direct_mv(&s->c, motion_x, motion_y);
3461 }
3462 break;
3464 if (CONFIG_MPEG4_ENCODER) {
3466 s->c.mb_intra = 0;
3467 ff_mpeg4_set_direct_mv(&s->c, 0, 0);
3468 }
3469 break;
3471 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3472 s->c.mb_intra = 0;
3473 s->c.mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3474 s->c.mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3475 s->c.mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3476 s->c.mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3477 break;
3479 s->c.mv_dir = MV_DIR_BACKWARD;
3480 s->c.mb_intra = 0;
3481 motion_x= s->c.mv[1][0][0] = s->b_back_mv_table[xy][0];
3482 motion_y= s->c.mv[1][0][1] = s->b_back_mv_table[xy][1];
3483 break;
3485 s->c.mv_dir = MV_DIR_FORWARD;
3486 s->c.mb_intra = 0;
3487 motion_x= s->c.mv[0][0][0] = s->b_forw_mv_table[xy][0];
3488 motion_y= s->c.mv[0][0][1] = s->b_forw_mv_table[xy][1];
3489 break;
3491 s->c.mv_dir = MV_DIR_FORWARD;
3492 s->c.mv_type = MV_TYPE_FIELD;
3493 s->c.mb_intra = 0;
3494 for(i=0; i<2; i++){
3495 int j = s->c.field_select[0][i] = s->b_field_select_table[0][i][xy];
3496 s->c.mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
3497 s->c.mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
3498 }
3499 break;
3501 s->c.mv_dir = MV_DIR_BACKWARD;
3502 s->c.mv_type = MV_TYPE_FIELD;
3503 s->c.mb_intra = 0;
3504 for(i=0; i<2; i++){
3505 int j = s->c.field_select[1][i] = s->b_field_select_table[1][i][xy];
3506 s->c.mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
3507 s->c.mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
3508 }
3509 break;
3511 s->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3512 s->c.mv_type = MV_TYPE_FIELD;
3513 s->c.mb_intra = 0;
3514 for(dir=0; dir<2; dir++){
3515 for(i=0; i<2; i++){
3516 int j = s->c.field_select[dir][i] = s->b_field_select_table[dir][i][xy];
3517 s->c.mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
3518 s->c.mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
3519 }
3520 }
3521 break;
3522 default:
3523 av_unreachable("There is a case for every CANDIDATE_MB_TYPE_* "
3524 "except CANDIDATE_MB_TYPE_SKIPPED which is never "
3525 "the only candidate (always coupled with INTER) "
3526 "so that it never reaches this switch");
3527 }
3528
3529 encode_mb(s, motion_x, motion_y);
3530
3531 // RAL: Update last macroblock type
3532 s->last_mv_dir = s->c.mv_dir;
3533
3534 if (CONFIG_H263_ENCODER &&
3535 s->c.out_format == FMT_H263 && s->c.pict_type != AV_PICTURE_TYPE_B)
3537
3538 mpv_reconstruct_mb(s, s->block);
3539 }
3540
3541 s->c.cur_pic.qscale_table[xy] = s->c.qscale;
3542
3543 /* clean the MV table in IPS frames for direct mode in B-frames */
3544 if (s->c.mb_intra /* && I,P,S_TYPE */) {
3545 s->p_mv_table[xy][0]=0;
3546 s->p_mv_table[xy][1]=0;
3547#if CONFIG_H263_ENCODER
3548 } else if (s->c.h263_pred || s->c.h263_aic) {
3550#endif
3551 }
3552
3553 if (s->c.avctx->flags & AV_CODEC_FLAG_PSNR) {
3554 int w= 16;
3555 int h= 16;
3556
3557 if (s->c.mb_x*16 + 16 > s->c.width ) w = s->c.width - s->c.mb_x*16;
3558 if (s->c.mb_y*16 + 16 > s->c.height) h = s->c.height- s->c.mb_y*16;
3559
3560 s->encoding_error[0] += sse(
3561 s, s->new_pic->data[0] + s->c.mb_x*16 + s->c.mb_y*s->c.linesize*16,
3562 s->c.dest[0], w, h, s->c.linesize);
3563 s->encoding_error[1] += sse(
3564 s, s->new_pic->data[1] + s->c.mb_x*8 + s->c.mb_y*s->c.uvlinesize*chr_h,
3565 s->c.dest[1], w>>1, h>>s->c.chroma_y_shift, s->c.uvlinesize);
3566 s->encoding_error[2] += sse(
3567 s, s->new_pic->data[2] + s->c.mb_x*8 + s->c.mb_y*s->c.uvlinesize*chr_h,
3568 s->c.dest[2], w>>1, h>>s->c.chroma_y_shift, s->c.uvlinesize);
3569 }
3570 if (s->loop_filter) {
3571 if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263)
3573 }
3574 ff_dlog(s->c.avctx, "MB %d %d bits\n",
3575 s->c.mb_x + s->c.mb_y * s->c.mb_stride, put_bits_count(&s->pb));
3576 }
3577 }
3578
3579#if CONFIG_MSMPEG4ENC
3580 //not beautiful here but we must write it before flushing so it has to be here
3581 if (s->c.msmpeg4_version != MSMP4_UNUSED && s->c.msmpeg4_version < MSMP4_WMV1 &&
3582 s->c.pict_type == AV_PICTURE_TYPE_I)
3584#endif
3585
3587
3588 return 0;
3589}
3590
3591#define ADD(field) dst->field += src->field;
3592#define MERGE(field) dst->field += src->field; src->field=0
3594{
3595 ADD(me.scene_change_score);
3596 ADD(me.mc_mb_var_sum_temp);
3597 ADD(me.mb_var_sum_temp);
3598}
3599
3601{
3602 int i;
3603
3604 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
3605 MERGE(dct_count[1]);
3606 ADD(mv_bits);
3607 ADD(i_tex_bits);
3608 ADD(p_tex_bits);
3609 ADD(i_count);
3610 ADD(misc_bits);
3611 ADD(encoding_error[0]);
3612 ADD(encoding_error[1]);
3613 ADD(encoding_error[2]);
3614
3615 if (dst->dct_error_sum) {
3616 for(i=0; i<64; i++){
3617 MERGE(dct_error_sum[0][i]);
3618 MERGE(dct_error_sum[1][i]);
3619 }
3620 }
3621
3622 av_assert1(put_bits_count(&src->pb) % 8 ==0);
3623 av_assert1(put_bits_count(&dst->pb) % 8 ==0);
3624 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
3625 flush_put_bits(&dst->pb);
3626}
3627
3628static int estimate_qp(MPVMainEncContext *const m, int dry_run)
3629{
3630 MPVEncContext *const s = &m->s;
3631
3632 if (m->next_lambda){
3633 s->c.cur_pic.ptr->f->quality = m->next_lambda;
3634 if(!dry_run) m->next_lambda= 0;
3635 } else if (!m->fixed_qscale) {
3636 int quality = ff_rate_estimate_qscale(m, dry_run);
3637 s->c.cur_pic.ptr->f->quality = quality;
3638 if (s->c.cur_pic.ptr->f->quality < 0)
3639 return -1;
3640 }
3641
3642 if(s->adaptive_quant){
3644
3645 switch (s->c.codec_id) {
3646 case AV_CODEC_ID_MPEG4:
3647 if (CONFIG_MPEG4_ENCODER)
3649 break;
3650 case AV_CODEC_ID_H263:
3651 case AV_CODEC_ID_H263P:
3652 case AV_CODEC_ID_FLV1:
3653 if (CONFIG_H263_ENCODER)
3655 break;
3656 }
3657
3658 s->lambda = s->lambda_table[0];
3659 //FIXME broken
3660 }else
3661 s->lambda = s->c.cur_pic.ptr->f->quality;
3662 update_qscale(m);
3663 return 0;
3664}
3665
3666/* must be called before writing the header */
3668{
3669 av_assert1(s->c.cur_pic.ptr->f->pts != AV_NOPTS_VALUE);
3670 s->c.time = s->c.cur_pic.ptr->f->pts * s->c.avctx->time_base.num;
3671
3672 if (s->c.pict_type == AV_PICTURE_TYPE_B) {
3673 s->c.pb_time = s->c.pp_time - (s->c.last_non_b_time - s->c.time);
3674 av_assert1(s->c.pb_time > 0 && s->c.pb_time < s->c.pp_time);
3675 }else{
3676 av_assert1(s->picture_number == 0 || s->c.time > s->c.last_non_b_time);
3677 s->c.pp_time = s->c.time - s->c.last_non_b_time;
3678 s->c.last_non_b_time = s->c.time;
3679 }
3680}
3681
3682static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
3683{
3684 MPVEncContext *const s = &m->s;
3685 int ret;
3686 int bits;
3687 int context_count = s->c.slice_context_count;
3688
3689 if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4) {
3692 }
3693
3694// s->lambda = s->c.cur_pic.ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
3695
3696 if (s->c.pict_type == AV_PICTURE_TYPE_I) {
3697 s->c.no_rounding = s->c.msmpeg4_version >= MSMP4_V3;
3698 } else if (s->c.pict_type != AV_PICTURE_TYPE_B) {
3699 s->c.no_rounding ^= s->flipflop_rounding;
3700 }
3701
3702 if (s->c.avctx->flags & AV_CODEC_FLAG_PASS2) {
3703 ret = estimate_qp(m, 1);
3704 if (ret < 0)
3705 return ret;
3707 } else if (!(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE)) {
3708 if (s->c.pict_type == AV_PICTURE_TYPE_B)
3709 s->lambda = m->last_lambda_for[s->c.pict_type];
3710 else
3711 s->lambda = m->last_lambda_for[m->last_non_b_pict_type];
3712 update_qscale(m);
3713 }
3714
3715 s->c.mb_intra = 0; //for the rate distortion & bit compare functions
3716 for (int i = 0; i < context_count; i++) {
3717 MPVEncContext *const slice = s->c.enc_contexts[i];
3718 int h = s->c.mb_height;
3719 uint8_t *start = pkt->data + (int64_t)pkt->size * slice->c.start_mb_y / h;
3720 uint8_t *end = pkt->data + (int64_t)pkt->size * slice->c. end_mb_y / h;
3721
3722 init_put_bits(&slice->pb, start, end - start);
3723
3724 if (i) {
3725 ret = ff_update_duplicate_context(&slice->c, &s->c);
3726 if (ret < 0)
3727 return ret;
3728 slice->lambda = s->lambda;
3729 slice->lambda2 = s->lambda2;
3730 }
3731 slice->me.temp = slice->me.scratchpad = slice->c.sc.scratchpad_buf;
3732 ff_me_init_pic(slice);
3733 }
3734
3735 /* Estimate motion for every MB */
3736 if (s->c.pict_type != AV_PICTURE_TYPE_I) {
3737 s->lambda = (s->lambda * m->me_penalty_compensation + 128) >> 8;
3738 s->lambda2 = (s->lambda2 * (int64_t) m->me_penalty_compensation + 128) >> 8;
3739 if (s->c.pict_type != AV_PICTURE_TYPE_B) {
3740 if ((m->me_pre && m->last_non_b_pict_type == AV_PICTURE_TYPE_I) ||
3741 m->me_pre == 2) {
3742 s->c.avctx->execute(s->c.avctx, pre_estimate_motion_thread,
3743 &s->c.enc_contexts[0], NULL,
3744 context_count, sizeof(void*));
3745 }
3746 }
3747
3748 s->c.avctx->execute(s->c.avctx, estimate_motion_thread, &s->c.enc_contexts[0],
3749 NULL, context_count, sizeof(void*));
3750 }else /* if (s->c.pict_type == AV_PICTURE_TYPE_I) */{
3751 /* I-Frame */
3752 for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
3753 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3754
3755 if (!m->fixed_qscale) {
3756 /* finding spatial complexity for I-frame rate control */
3757 s->c.avctx->execute(s->c.avctx, mb_var_thread, &s->c.enc_contexts[0],
3758 NULL, context_count, sizeof(void*));
3759 }
3760 }
3761 for (int i = 1; i < context_count; i++)
3762 merge_context_after_me(s, s->c.enc_contexts[i]);
3763 m->mc_mb_var_sum = s->me.mc_mb_var_sum_temp;
3764 m->mb_var_sum = s->me. mb_var_sum_temp;
3765 emms_c();
3766
3767 if (s->me.scene_change_score > m->scenechange_threshold &&
3768 s->c.pict_type == AV_PICTURE_TYPE_P) {
3769 s->c.pict_type = AV_PICTURE_TYPE_I;
3770 for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
3771 s->mb_type[i] = CANDIDATE_MB_TYPE_INTRA;
3772 if (s->c.msmpeg4_version >= MSMP4_V3)
3773 s->c.no_rounding = 1;
3774 ff_dlog(s->c.avctx, "Scene change detected, encoding as I Frame %"PRId64" %"PRId64"\n",
3775 m->mb_var_sum, m->mc_mb_var_sum);
3776 }
3777
3778 if (!s->umvplus) {
3779 if (s->c.pict_type == AV_PICTURE_TYPE_P || s->c.pict_type == AV_PICTURE_TYPE_S) {
3780 s->f_code = ff_get_best_fcode(m, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3781
3782 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3783 int a,b;
3784 a = ff_get_best_fcode(m, s->c.p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3785 b = ff_get_best_fcode(m, s->c.p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3786 s->f_code = FFMAX3(s->f_code, a, b);
3787 }
3788
3790 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, !!s->intra_penalty);
3791 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3792 int j;
3793 for (int i = 0; i < 2; i++) {
3794 for(j=0; j<2; j++)
3795 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3796 s->c.p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, !!s->intra_penalty);
3797 }
3798 }
3799 } else if (s->c.pict_type == AV_PICTURE_TYPE_B) {
3800 int a, b;
3801
3802 a = ff_get_best_fcode(m, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3803 b = ff_get_best_fcode(m, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3804 s->f_code = FFMAX(a, b);
3805
3806 a = ff_get_best_fcode(m, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3807 b = ff_get_best_fcode(m, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3808 s->b_code = FFMAX(a, b);
3809
3810 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3811 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3812 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3813 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3814 if (s->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
3815 int dir, j;
3816 for(dir=0; dir<2; dir++){
3817 for (int i = 0; i < 2; i++) {
3818 for(j=0; j<2; j++){
3821 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3822 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3823 }
3824 }
3825 }
3826 }
3827 }
3828 }
3829
3830 ret = estimate_qp(m, 0);
3831 if (ret < 0)
3832 return ret;
3833
3834 if (s->c.qscale < 3 && s->max_qcoeff <= 128 &&
3835 s->c.pict_type == AV_PICTURE_TYPE_I &&
3836 !(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE))
3837 s->c.qscale = 3; //reduce clipping problems
3838
3839 if (s->c.out_format == FMT_MJPEG) {
3841 (7 + s->c.qscale) / s->c.qscale, 65535);
3842 if (ret < 0)
3843 return ret;
3844
3845 if (s->c.codec_id != AV_CODEC_ID_AMV) {
3846 const uint16_t * luma_matrix = ff_mpeg1_default_intra_matrix;
3847 const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix;
3848
3849 if (s->c.avctx->intra_matrix) {
3850 chroma_matrix =
3851 luma_matrix = s->c.avctx->intra_matrix;
3852 }
3853 if (s->c.avctx->chroma_intra_matrix)
3854 chroma_matrix = s->c.avctx->chroma_intra_matrix;
3855
3856 /* for mjpeg, we do include qscale in the matrix */
3857 for (int i = 1; i < 64; i++) {
3858 int j = s->c.idsp.idct_permutation[i];
3859
3860 s->c.chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->c.qscale) >> 3);
3861 s->c. intra_matrix[j] = av_clip_uint8(( luma_matrix[i] * s->c.qscale) >> 3);
3862 }
3863 s->c.y_dc_scale_table =
3864 s->c.c_dc_scale_table = ff_mpeg12_dc_scale_table[0];
3865 s->c.chroma_intra_matrix[0] = s->c.intra_matrix[0] = 8;
3866 } else {
3867 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};
3868 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};
3869 for (int i = 1; i < 64; i++) {
3870 int j = s->c.idsp.idct_permutation[ff_zigzag_direct[i]];
3871
3872 s->c.intra_matrix[j] = sp5x_qscale_five_quant_table[0][i];
3873 s->c.chroma_intra_matrix[j] = sp5x_qscale_five_quant_table[1][i];
3874 }
3875 s->c.y_dc_scale_table = y;
3876 s->c.c_dc_scale_table = c;
3877 s->c.intra_matrix[0] = 13;
3878 s->c.chroma_intra_matrix[0] = 14;
3879 }
3880 ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3881 s->c.intra_matrix, s->intra_quant_bias, 8, 8, 1);
3882 ff_convert_matrix(s, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
3883 s->c.chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
3884 s->c.qscale = 8;
3885 }
3886
3887 if (s->c.pict_type == AV_PICTURE_TYPE_I) {
3888 s->c.cur_pic.ptr->f->flags |= AV_FRAME_FLAG_KEY;
3889 } else {
3890 s->c.cur_pic.ptr->f->flags &= ~AV_FRAME_FLAG_KEY;
3891 }
3892 s->c.cur_pic.ptr->f->pict_type = s->c.pict_type;
3893
3894 if (s->c.cur_pic.ptr->f->flags & AV_FRAME_FLAG_KEY)
3895 m->picture_in_gop_number = 0;
3896
3897 s->c.mb_x = s->c.mb_y = 0;
3898 s->last_bits= put_bits_count(&s->pb);
3899 ret = m->encode_picture_header(m);
3900 if (ret < 0)
3901 return ret;
3902 bits= put_bits_count(&s->pb);
3903 m->header_bits = bits - s->last_bits;
3904
3905 for (int i = 1; i < context_count; i++)
3906 update_duplicate_context_after_me(s->c.enc_contexts[i], s);
3907 s->c.avctx->execute(s->c.avctx, encode_thread, &s->c.enc_contexts[0],
3908 NULL, context_count, sizeof(void*));
3909 for (int i = 1; i < context_count; i++) {
3910 if (s->pb.buf_end == s->c.enc_contexts[i]->pb.buf)
3911 set_put_bits_buffer_size(&s->pb, FFMIN(s->c.enc_contexts[i]->pb.buf_end - s->pb.buf, INT_MAX/8-BUF_BITS));
3912 merge_context_after_encode(s, s->c.enc_contexts[i]);
3913 }
3914 emms_c();
3915 return 0;
3916}
3917
3918static inline void denoise_dct(MPVEncContext *const s, int16_t block[])
3919{
3920 if (!s->dct_error_sum)
3921 return;
3922
3923 const int intra = s->c.mb_intra;
3924 s->dct_count[intra]++;
3925 s->mpvencdsp.denoise_dct(block, s->dct_error_sum[intra], s->dct_offset[intra]);
3926}
3927
3929 int16_t *block, int n,
3930 int qscale, int *overflow){
3931 const int *qmat;
3932 const uint16_t *matrix;
3933 const uint8_t *scantable;
3934 const uint8_t *perm_scantable;
3935 int max=0;
3936 unsigned int threshold1, threshold2;
3937 int bias=0;
3938 int run_tab[65];
3939 int level_tab[65];
3940 int score_tab[65];
3941 int survivor[65];
3942 int survivor_count;
3943 int last_run=0;
3944 int last_level=0;
3945 int last_score= 0;
3946 int last_i;
3947 int coeff[2][64];
3948 int coeff_count[64];
3949 int qmul, qadd, start_i, last_non_zero, i, dc;
3950 const int esc_length= s->ac_esc_length;
3951 const uint8_t *length, *last_length;
3952 const int lambda = s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
3953 int mpeg2_qscale;
3954
3955 s->fdsp.fdct(block);
3956
3958
3959 qmul= qscale*16;
3960 qadd= ((qscale-1)|1)*8;
3961
3962 if (s->c.q_scale_type) mpeg2_qscale = ff_mpeg2_non_linear_qscale[qscale];
3963 else mpeg2_qscale = qscale << 1;
3964
3965 if (s->c.mb_intra) {
3966 int q;
3967 scantable = s->c.intra_scantable.scantable;
3968 perm_scantable = s->c.intra_scantable.permutated;
3969 if (!s->c.h263_aic) {
3970 if (n < 4)
3971 q = s->c.y_dc_scale;
3972 else
3973 q = s->c.c_dc_scale;
3974 q = q << 3;
3975 } else{
3976 /* For AIC we skip quant/dequant of INTRADC */
3977 q = 1 << 3;
3978 qadd=0;
3979 }
3980
3981 /* note: block[0] is assumed to be positive */
3982 block[0] = (block[0] + (q >> 1)) / q;
3983 start_i = 1;
3984 last_non_zero = 0;
3985 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
3986 matrix = n < 4 ? s->c.intra_matrix : s->c.chroma_intra_matrix;
3987 if (s->mpeg_quant || s->c.out_format == FMT_MPEG1 || s->c.out_format == FMT_MJPEG)
3988 bias= 1<<(QMAT_SHIFT-1);
3989
3990 if (n > 3 && s->intra_chroma_ac_vlc_length) {
3991 length = s->intra_chroma_ac_vlc_length;
3992 last_length= s->intra_chroma_ac_vlc_last_length;
3993 } else {
3994 length = s->intra_ac_vlc_length;
3995 last_length= s->intra_ac_vlc_last_length;
3996 }
3997 } else {
3998 scantable = s->c.inter_scantable.scantable;
3999 perm_scantable = s->c.inter_scantable.permutated;
4000 start_i = 0;
4001 last_non_zero = -1;
4002 qmat = s->q_inter_matrix[qscale];
4003 matrix = s->c.inter_matrix;
4004 length = s->inter_ac_vlc_length;
4005 last_length= s->inter_ac_vlc_last_length;
4006 }
4007 last_i= start_i;
4008
4009 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4010 threshold2= (threshold1<<1);
4011
4012 for(i=63; i>=start_i; i--) {
4013 const int j = scantable[i];
4014 int64_t level = (int64_t)block[j] * qmat[j];
4015
4016 if(((uint64_t)(level+threshold1))>threshold2){
4017 last_non_zero = i;
4018 break;
4019 }
4020 }
4021
4022 for(i=start_i; i<=last_non_zero; i++) {
4023 const int j = scantable[i];
4024 int64_t level = (int64_t)block[j] * qmat[j];
4025
4026// if( bias+level >= (1<<(QMAT_SHIFT - 3))
4027// || bias-level >= (1<<(QMAT_SHIFT - 3))){
4028 if(((uint64_t)(level+threshold1))>threshold2){
4029 if(level>0){
4030 level= (bias + level)>>QMAT_SHIFT;
4031 coeff[0][i]= level;
4032 coeff[1][i]= level-1;
4033// coeff[2][k]= level-2;
4034 }else{
4035 level= (bias - level)>>QMAT_SHIFT;
4036 coeff[0][i]= -level;
4037 coeff[1][i]= -level+1;
4038// coeff[2][k]= -level+2;
4039 }
4040 coeff_count[i]= FFMIN(level, 2);
4041 av_assert2(coeff_count[i]);
4042 max |=level;
4043 }else{
4044 coeff[0][i]= (level>>31)|1;
4045 coeff_count[i]= 1;
4046 }
4047 }
4048
4049 *overflow= s->max_qcoeff < max; //overflow might have happened
4050
4051 if(last_non_zero < start_i){
4052 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
4053 return last_non_zero;
4054 }
4055
4056 score_tab[start_i]= 0;
4057 survivor[0]= start_i;
4058 survivor_count= 1;
4059
4060 for(i=start_i; i<=last_non_zero; i++){
4061 int level_index, j, zero_distortion;
4062 int dct_coeff= FFABS(block[ scantable[i] ]);
4063 int best_score=256*256*256*120;
4064
4065 if (s->fdsp.fdct == ff_fdct_ifast)
4066 dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
4067 zero_distortion= dct_coeff*dct_coeff;
4068
4069 for(level_index=0; level_index < coeff_count[i]; level_index++){
4070 int distortion;
4071 int level= coeff[level_index][i];
4072 const int alevel= FFABS(level);
4073 int unquant_coeff;
4074
4076
4077 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4078 unquant_coeff= alevel*qmul + qadd;
4079 } else if (s->c.out_format == FMT_MJPEG) {
4080 j = s->c.idsp.idct_permutation[scantable[i]];
4081 unquant_coeff = alevel * matrix[j] * 8;
4082 }else{ // MPEG-1
4083 j = s->c.idsp.idct_permutation[scantable[i]]; // FIXME: optimize
4084 if (s->c.mb_intra) {
4085 unquant_coeff = (int)( alevel * mpeg2_qscale * matrix[j]) >> 4;
4086 unquant_coeff = (unquant_coeff - 1) | 1;
4087 }else{
4088 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int) matrix[j])) >> 5;
4089 unquant_coeff = (unquant_coeff - 1) | 1;
4090 }
4091 unquant_coeff<<= 3;
4092 }
4093
4094 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
4095 level+=64;
4096 if((level&(~127)) == 0){
4097 for(j=survivor_count-1; j>=0; j--){
4098 int run= i - survivor[j];
4099 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4100 score += score_tab[i-run];
4101
4102 if(score < best_score){
4103 best_score= score;
4104 run_tab[i+1]= run;
4105 level_tab[i+1]= level-64;
4106 }
4107 }
4108
4109 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4110 for(j=survivor_count-1; j>=0; j--){
4111 int run= i - survivor[j];
4112 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4113 score += score_tab[i-run];
4114 if(score < last_score){
4115 last_score= score;
4116 last_run= run;
4117 last_level= level-64;
4118 last_i= i+1;
4119 }
4120 }
4121 }
4122 }else{
4123 distortion += esc_length*lambda;
4124 for(j=survivor_count-1; j>=0; j--){
4125 int run= i - survivor[j];
4126 int score= distortion + score_tab[i-run];
4127
4128 if(score < best_score){
4129 best_score= score;
4130 run_tab[i+1]= run;
4131 level_tab[i+1]= level-64;
4132 }
4133 }
4134
4135 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4136 for(j=survivor_count-1; j>=0; j--){
4137 int run= i - survivor[j];
4138 int score= distortion + score_tab[i-run];
4139 if(score < last_score){
4140 last_score= score;
4141 last_run= run;
4142 last_level= level-64;
4143 last_i= i+1;
4144 }
4145 }
4146 }
4147 }
4148 }
4149
4150 score_tab[i+1]= best_score;
4151
4152 // 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
4153 if(last_non_zero <= 27){
4154 for(; survivor_count; survivor_count--){
4155 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
4156 break;
4157 }
4158 }else{
4159 for(; survivor_count; survivor_count--){
4160 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
4161 break;
4162 }
4163 }
4164
4165 survivor[ survivor_count++ ]= i+1;
4166 }
4167
4168 if (s->c.out_format != FMT_H263 && s->c.out_format != FMT_H261) {
4169 last_score= 256*256*256*120;
4170 for(i= survivor[0]; i<=last_non_zero + 1; i++){
4171 int score= score_tab[i];
4172 if (i)
4173 score += lambda * 2; // FIXME more exact?
4174
4175 if(score < last_score){
4176 last_score= score;
4177 last_i= i;
4178 last_level= level_tab[i];
4179 last_run= run_tab[i];
4180 }
4181 }
4182 }
4183
4184 s->coded_score[n] = last_score;
4185
4186 dc= FFABS(block[0]);
4187 last_non_zero= last_i - 1;
4188 memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
4189
4190 if(last_non_zero < start_i)
4191 return last_non_zero;
4192
4193 if(last_non_zero == 0 && start_i == 0){
4194 int best_level= 0;
4195 int best_score= dc * dc;
4196
4197 for(i=0; i<coeff_count[0]; i++){
4198 int level= coeff[i][0];
4199 int alevel= FFABS(level);
4200 int unquant_coeff, score, distortion;
4201
4202 if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
4203 unquant_coeff= (alevel*qmul + qadd)>>3;
4204 } else{ // MPEG-1
4205 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int) matrix[0])) >> 5;
4206 unquant_coeff = (unquant_coeff - 1) | 1;
4207 }
4208 unquant_coeff = (unquant_coeff + 4) >> 3;
4209 unquant_coeff<<= 3 + 3;
4210
4211 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
4212 level+=64;
4213 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
4214 else score= distortion + esc_length*lambda;
4215
4216 if(score < best_score){
4217 best_score= score;
4218 best_level= level - 64;
4219 }
4220 }
4221 block[0]= best_level;
4222 s->coded_score[n] = best_score - dc*dc;
4223 if(best_level == 0) return -1;
4224 else return last_non_zero;
4225 }
4226
4227 i= last_i;
4228 av_assert2(last_level);
4229
4230 block[ perm_scantable[last_non_zero] ]= last_level;
4231 i -= last_run + 1;
4232
4233 for(; i>start_i; i -= run_tab[i] + 1){
4234 block[ perm_scantable[i-1] ]= level_tab[i];
4235 }
4236
4237 return last_non_zero;
4238}
4239
4240static DECLARE_ALIGNED(16, int16_t, basis)[64][64];
4241
4242static void build_basis(uint8_t *perm){
4243 int i, j, x, y;
4244 emms_c();
4245 for(i=0; i<8; i++){
4246 for(j=0; j<8; j++){
4247 for(y=0; y<8; y++){
4248 for(x=0; x<8; x++){
4249 double s= 0.25*(1<<BASIS_SHIFT);
4250 int index= 8*i + j;
4251 int perm_index= perm[index];
4252 if(i==0) s*= sqrt(0.5);
4253 if(j==0) s*= sqrt(0.5);
4254 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)));
4255 }
4256 }
4257 }
4258 }
4259}
4260
4261static int dct_quantize_refine(MPVEncContext *const s, //FIXME breaks denoise?
4262 int16_t *block, int16_t *weight, int16_t *orig,
4263 int n, int qscale){
4264 DECLARE_ALIGNED(16, int16_t, rem)[64];
4265 LOCAL_ALIGNED_16(int16_t, d1, [64]);
4266 const uint8_t *scantable;
4267 const uint8_t *perm_scantable;
4268// unsigned int threshold1, threshold2;
4269// int bias=0;
4270 int run_tab[65];
4271 int prev_run=0;
4272 int prev_level=0;
4273 int qmul, qadd, start_i, last_non_zero, i, dc;
4274 const uint8_t *length;
4275 const uint8_t *last_length;
4276 int lambda;
4277 int rle_index, run, q = 1, sum; //q is only used when s->c.mb_intra is true
4278
4279 if(basis[0][0] == 0)
4280 build_basis(s->c.idsp.idct_permutation);
4281
4282 qmul= qscale*2;
4283 qadd= (qscale-1)|1;
4284 if (s->c.mb_intra) {
4285 scantable = s->c.intra_scantable.scantable;
4286 perm_scantable = s->c.intra_scantable.permutated;
4287 if (!s->c.h263_aic) {
4288 if (n < 4)
4289 q = s->c.y_dc_scale;
4290 else
4291 q = s->c.c_dc_scale;
4292 } else{
4293 /* For AIC we skip quant/dequant of INTRADC */
4294 q = 1;
4295 qadd=0;
4296 }
4297 q <<= RECON_SHIFT-3;
4298 /* note: block[0] is assumed to be positive */
4299 dc= block[0]*q;
4300// block[0] = (block[0] + (q >> 1)) / q;
4301 start_i = 1;
4302// if (s->mpeg_quant || s->c.out_format == FMT_MPEG1)
4303// bias= 1<<(QMAT_SHIFT-1);
4304 if (n > 3 && s->intra_chroma_ac_vlc_length) {
4305 length = s->intra_chroma_ac_vlc_length;
4306 last_length= s->intra_chroma_ac_vlc_last_length;
4307 } else {
4308 length = s->intra_ac_vlc_length;
4309 last_length= s->intra_ac_vlc_last_length;
4310 }
4311 } else {
4312 scantable = s->c.inter_scantable.scantable;
4313 perm_scantable = s->c.inter_scantable.permutated;
4314 dc= 0;
4315 start_i = 0;
4316 length = s->inter_ac_vlc_length;
4317 last_length= s->inter_ac_vlc_last_length;
4318 }
4319 last_non_zero = s->c.block_last_index[n];
4320
4321 dc += (1<<(RECON_SHIFT-1));
4322 for(i=0; i<64; i++){
4323 rem[i] = dc - (orig[i] << RECON_SHIFT); // FIXME use orig directly instead of copying to rem[]
4324 }
4325
4326 sum=0;
4327 for(i=0; i<64; i++){
4328 int one= 36;
4329 int qns=4;
4330 int w;
4331
4332 w= FFABS(weight[i]) + qns*one;
4333 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
4334
4335 weight[i] = w;
4336// w=weight[i] = (63*qns + (w/2)) / w;
4337
4338 av_assert2(w>0);
4339 av_assert2(w<(1<<6));
4340 sum += w*w;
4341 }
4342 lambda = sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
4343
4344 run=0;
4345 rle_index=0;
4346 for(i=start_i; i<=last_non_zero; i++){
4347 int j= perm_scantable[i];
4348 const int level= block[j];
4349 int coeff;
4350
4351 if(level){
4352 if(level<0) coeff= qmul*level - qadd;
4353 else coeff= qmul*level + qadd;
4354 run_tab[rle_index++]=run;
4355 run=0;
4356
4357 s->mpvencdsp.add_8x8basis(rem, basis[j], coeff);
4358 }else{
4359 run++;
4360 }
4361 }
4362
4363 for(;;){
4364 int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
4365 int best_coeff=0;
4366 int best_change=0;
4367 int run2, best_unquant_change=0, analyze_gradient;
4368 analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
4369
4370 if(analyze_gradient){
4371 for(i=0; i<64; i++){
4372 int w= weight[i];
4373
4374 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
4375 }
4376 s->fdsp.fdct(d1);
4377 }
4378
4379 if(start_i){
4380 const int level= block[0];
4381 int change, old_coeff;
4382
4383 av_assert2(s->c.mb_intra);
4384
4385 old_coeff= q*level;
4386
4387 for(change=-1; change<=1; change+=2){
4388 int new_level= level + change;
4389 int score, new_coeff;
4390
4391 new_coeff= q*new_level;
4392 if(new_coeff >= 2048 || new_coeff < 0)
4393 continue;
4394
4395 score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0],
4396 new_coeff - old_coeff);
4397 if(score<best_score){
4398 best_score= score;
4399 best_coeff= 0;
4400 best_change= change;
4401 best_unquant_change= new_coeff - old_coeff;
4402 }
4403 }
4404 }
4405
4406 run=0;
4407 rle_index=0;
4408 run2= run_tab[rle_index++];
4409 prev_level=0;
4410 prev_run=0;
4411
4412 for(i=start_i; i<64; i++){
4413 int j= perm_scantable[i];
4414 const int level= block[j];
4415 int change, old_coeff;
4416
4417 if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
4418 break;
4419
4420 if(level){
4421 if(level<0) old_coeff= qmul*level - qadd;
4422 else old_coeff= qmul*level + qadd;
4423 run2= run_tab[rle_index++]; //FIXME ! maybe after last
4424 }else{
4425 old_coeff=0;
4426 run2--;
4427 av_assert2(run2>=0 || i >= last_non_zero );
4428 }
4429
4430 for(change=-1; change<=1; change+=2){
4431 int new_level= level + change;
4432 int score, new_coeff, unquant_change;
4433
4434 score=0;
4435 if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
4436 continue;
4437
4438 if(new_level){
4439 if(new_level<0) new_coeff= qmul*new_level - qadd;
4440 else new_coeff= qmul*new_level + qadd;
4441 if(new_coeff >= 2048 || new_coeff <= -2048)
4442 continue;
4443 //FIXME check for overflow
4444
4445 if(level){
4446 if(level < 63 && level > -63){
4447 if(i < last_non_zero)
4448 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
4449 - length[UNI_AC_ENC_INDEX(run, level+64)];
4450 else
4451 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
4452 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
4453 }
4454 }else{
4455 av_assert2(FFABS(new_level)==1);
4456
4457 if(analyze_gradient){
4458 int g= d1[ scantable[i] ];
4459 if(g && (g^new_level) >= 0)
4460 continue;
4461 }
4462
4463 if(i < last_non_zero){
4464 int next_i= i + run2 + 1;
4465 int next_level= block[ perm_scantable[next_i] ] + 64;
4466
4467 if(next_level&(~127))
4468 next_level= 0;
4469
4470 if(next_i < last_non_zero)
4471 score += length[UNI_AC_ENC_INDEX(run, 65)]
4472 + length[UNI_AC_ENC_INDEX(run2, next_level)]
4473 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4474 else
4475 score += length[UNI_AC_ENC_INDEX(run, 65)]
4476 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4477 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
4478 }else{
4479 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
4480 if(prev_level){
4481 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4482 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4483 }
4484 }
4485 }
4486 }else{
4487 new_coeff=0;
4488 av_assert2(FFABS(level)==1);
4489
4490 if(i < last_non_zero){
4491 int next_i= i + run2 + 1;
4492 int next_level= block[ perm_scantable[next_i] ] + 64;
4493
4494 if(next_level&(~127))
4495 next_level= 0;
4496
4497 if(next_i < last_non_zero)
4498 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4499 - length[UNI_AC_ENC_INDEX(run2, next_level)]
4500 - length[UNI_AC_ENC_INDEX(run, 65)];
4501 else
4502 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
4503 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
4504 - length[UNI_AC_ENC_INDEX(run, 65)];
4505 }else{
4506 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
4507 if(prev_level){
4508 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
4509 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
4510 }
4511 }
4512 }
4513
4514 score *= lambda;
4515
4516 unquant_change= new_coeff - old_coeff;
4517 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4518
4519 score += s->mpvencdsp.try_8x8basis(rem, weight, basis[j],
4520 unquant_change);
4521 if(score<best_score){
4522 best_score= score;
4523 best_coeff= i;
4524 best_change= change;
4525 best_unquant_change= unquant_change;
4526 }
4527 }
4528 if(level){
4529 prev_level= level + 64;
4530 if(prev_level&(~127))
4531 prev_level= 0;
4532 prev_run= run;
4533 run=0;
4534 }else{
4535 run++;
4536 }
4537 }
4538
4539 if(best_change){
4540 int j= perm_scantable[ best_coeff ];
4541
4542 block[j] += best_change;
4543
4544 if(best_coeff > last_non_zero){
4545 last_non_zero= best_coeff;
4546 av_assert2(block[j]);
4547 }else{
4548 for(; last_non_zero>=start_i; last_non_zero--){
4549 if(block[perm_scantable[last_non_zero]])
4550 break;
4551 }
4552 }
4553
4554 run=0;
4555 rle_index=0;
4556 for(i=start_i; i<=last_non_zero; i++){
4557 const int level = block[perm_scantable[i]];
4558
4559 if(level){
4560 run_tab[rle_index++]=run;
4561 run=0;
4562 }else{
4563 run++;
4564 }
4565 }
4566
4567 s->mpvencdsp.add_8x8basis(rem, basis[j], best_unquant_change);
4568 }else{
4569 break;
4570 }
4571 }
4572
4573 return last_non_zero;
4574}
4575
4576/**
4577 * Permute an 8x8 block according to permutation.
4578 * @param block the block which will be permuted according to
4579 * the given permutation vector
4580 * @param permutation the permutation vector
4581 * @param last the last non zero coefficient in scantable order, used to
4582 * speed the permutation up
4583 * @param scantable the used scantable, this is only used to speed the
4584 * permutation up, the block is not (inverse) permutated
4585 * to scantable order!
4586 */
4587void ff_block_permute(int16_t *block, const uint8_t *permutation,
4588 const uint8_t *scantable, int last)
4589{
4590 int i;
4591 int16_t temp[64];
4592
4593 if (last <= 0)
4594 return;
4595 //FIXME it is ok but not clean and might fail for some permutations
4596 // if (permutation[1] == 1)
4597 // return;
4598
4599 for (i = 0; i <= last; i++) {
4600 const int j = scantable[i];
4601 temp[j] = block[j];
4602 block[j] = 0;
4603 }
4604
4605 for (i = 0; i <= last; i++) {
4606 const int j = scantable[i];
4607 const int perm_j = permutation[j];
4608 block[perm_j] = temp[j];
4609 }
4610}
4611
4613 int16_t *block, int n,
4614 int qscale, int *overflow)
4615{
4616 int i, last_non_zero, q, start_i;
4617 const int *qmat;
4618 const uint8_t *scantable;
4619 int bias;
4620 int max=0;
4621 unsigned int threshold1, threshold2;
4622
4623 s->fdsp.fdct(block);
4624
4626
4627 if (s->c.mb_intra) {
4628 scantable = s->c.intra_scantable.scantable;
4629 if (!s->c.h263_aic) {
4630 if (n < 4)
4631 q = s->c.y_dc_scale;
4632 else
4633 q = s->c.c_dc_scale;
4634 q = q << 3;
4635 } else
4636 /* For AIC we skip quant/dequant of INTRADC */
4637 q = 1 << 3;
4638
4639 /* note: block[0] is assumed to be positive */
4640 block[0] = (block[0] + (q >> 1)) / q;
4641 start_i = 1;
4642 last_non_zero = 0;
4643 qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
4644 bias= s->intra_quant_bias*(1<<(QMAT_SHIFT - QUANT_BIAS_SHIFT));
4645 } else {
4646 scantable = s->c.inter_scantable.scantable;
4647 start_i = 0;
4648 last_non_zero = -1;
4649 qmat = s->q_inter_matrix[qscale];
4650 bias= s->inter_quant_bias*(1<<(QMAT_SHIFT - QUANT_BIAS_SHIFT));
4651 }
4652 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4653 threshold2= (threshold1<<1);
4654 for(i=63;i>=start_i;i--) {
4655 const int j = scantable[i];
4656 int64_t level = (int64_t)block[j] * qmat[j];
4657
4658 if(((uint64_t)(level+threshold1))>threshold2){
4659 last_non_zero = i;
4660 break;
4661 }else{
4662 block[j]=0;
4663 }
4664 }
4665 for(i=start_i; i<=last_non_zero; i++) {
4666 const int j = scantable[i];
4667 int64_t level = (int64_t)block[j] * qmat[j];
4668
4669// if( bias+level >= (1<<QMAT_SHIFT)
4670// || bias-level >= (1<<QMAT_SHIFT)){
4671 if(((uint64_t)(level+threshold1))>threshold2){
4672 if(level>0){
4673 level= (bias + level)>>QMAT_SHIFT;
4674 block[j]= level;
4675 }else{
4676 level= (bias - level)>>QMAT_SHIFT;
4677 block[j]= -level;
4678 }
4679 max |=level;
4680 }else{
4681 block[j]=0;
4682 }
4683 }
4684 *overflow= s->max_qcoeff < max; //overflow might have happened
4685
4686 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4687 if (s->c.idsp.perm_type != FF_IDCT_PERM_NONE)
4688 ff_block_permute(block, s->c.idsp.idct_permutation,
4689 scantable, last_non_zero);
4690
4691 return last_non_zero;
4692}
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
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]