23#define UNCHECKED_BITSTREAM_READER 1
25#include "config_components.h"
54#define IS_3IV1 (s->codec_tag == AV_RL32("3IV1"))
63#define SPRITE_TRAJ_VLC_BITS 6
65#define MB_TYPE_B_VLC_BITS 4
66#define STUDIO_INTRA_BITS 9
91 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
92 uint8_t *
const *ref_picture)
95 int src_x, src_y, motion_x, motion_y;
96 ptrdiff_t
offset, linesize, uvlinesize;
99 motion_x =
ctx->sprite_offset[0][0];
100 motion_y =
ctx->sprite_offset[0][1];
101 src_x =
s->mb_x * 16 + (motion_x >> (
ctx->sprite_warping_accuracy + 1));
102 src_y =
s->mb_y * 16 + (motion_y >> (
ctx->sprite_warping_accuracy + 1));
103 motion_x *= 1 << (3 -
ctx->sprite_warping_accuracy);
104 motion_y *= 1 << (3 -
ctx->sprite_warping_accuracy);
105 src_x =
av_clip(src_x, -16,
s->width);
106 if (src_x ==
s->width)
108 src_y =
av_clip(src_y, -16,
s->height);
109 if (src_y ==
s->height)
112 linesize =
s->linesize;
113 uvlinesize =
s->uvlinesize;
115 ptr = ref_picture[0] + src_y * linesize + src_x;
117 if ((
unsigned)src_x >=
FFMAX(
s->h_edge_pos - 17, 0) ||
118 (
unsigned)src_y >=
FFMAX(
s->v_edge_pos - 17, 0)) {
119 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
123 s->h_edge_pos,
s->v_edge_pos);
124 ptr =
s->sc.edge_emu_buffer;
127 if ((motion_x | motion_y) & 7) {
128 ctx->mdsp.gmc1(dest_y, ptr, linesize, 16,
129 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
130 ctx->mdsp.gmc1(dest_y + 8, ptr + 8, linesize, 16,
131 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
135 dxy = ((motion_x >> 3) & 1) | ((motion_y >> 2) & 2);
136 if (
s->no_rounding) {
137 s->hdsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
139 s->hdsp.put_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
146 motion_x =
ctx->sprite_offset[1][0];
147 motion_y =
ctx->sprite_offset[1][1];
148 src_x =
s->mb_x * 8 + (motion_x >> (
ctx->sprite_warping_accuracy + 1));
149 src_y =
s->mb_y * 8 + (motion_y >> (
ctx->sprite_warping_accuracy + 1));
150 motion_x *= 1 << (3 -
ctx->sprite_warping_accuracy);
151 motion_y *= 1 << (3 -
ctx->sprite_warping_accuracy);
152 src_x =
av_clip(src_x, -8,
s->width >> 1);
153 if (src_x ==
s->width >> 1)
155 src_y =
av_clip(src_y, -8,
s->height >> 1);
156 if (src_y ==
s->height >> 1)
159 offset = (src_y * uvlinesize) + src_x;
160 ptr = ref_picture[1] +
offset;
161 if ((
unsigned)src_x >=
FFMAX((
s->h_edge_pos >> 1) - 9, 0) ||
162 (
unsigned)src_y >=
FFMAX((
s->v_edge_pos >> 1) - 9, 0)) {
163 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
164 uvlinesize, uvlinesize,
167 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
168 ptr =
s->sc.edge_emu_buffer;
171 ctx->mdsp.gmc1(dest_cb, ptr, uvlinesize, 8,
172 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
174 ptr = ref_picture[2] +
offset;
176 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
177 uvlinesize, uvlinesize,
180 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
181 ptr =
s->sc.edge_emu_buffer;
183 ctx->mdsp.gmc1(dest_cr, ptr, uvlinesize, 8,
184 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
188 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
189 uint8_t *
const *ref_picture)
192 int linesize, uvlinesize;
193 const int a =
ctx->sprite_warping_accuracy;
196 linesize =
s->linesize;
197 uvlinesize =
s->uvlinesize;
199 ptr = ref_picture[0];
201 ox =
ctx->sprite_offset[0][0] +
ctx->sprite_delta[0][0] *
s->mb_x * 16 +
202 ctx->sprite_delta[0][1] *
s->mb_y * 16;
203 oy =
ctx->sprite_offset[0][1] +
ctx->sprite_delta[1][0] *
s->mb_x * 16 +
204 ctx->sprite_delta[1][1] *
s->mb_y * 16;
206 ctx->mdsp.gmc(dest_y, ptr, linesize, 16,
208 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
209 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
210 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
211 s->h_edge_pos,
s->v_edge_pos);
212 ctx->mdsp.gmc(dest_y + 8, ptr, linesize, 16,
213 ox +
ctx->sprite_delta[0][0] * 8,
214 oy +
ctx->sprite_delta[1][0] * 8,
215 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
216 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
217 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
218 s->h_edge_pos,
s->v_edge_pos);
223 ox =
ctx->sprite_offset[1][0] +
ctx->sprite_delta[0][0] *
s->mb_x * 8 +
224 ctx->sprite_delta[0][1] *
s->mb_y * 8;
225 oy =
ctx->sprite_offset[1][1] +
ctx->sprite_delta[1][0] *
s->mb_x * 8 +
226 ctx->sprite_delta[1][1] *
s->mb_y * 8;
228 ptr = ref_picture[1];
229 ctx->mdsp.gmc(dest_cb, ptr, uvlinesize, 8,
231 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
232 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
233 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
234 (
s->h_edge_pos + 1) >> 1, (
s->v_edge_pos + 1) >> 1);
236 ptr = ref_picture[2];
237 ctx->mdsp.gmc(dest_cr, ptr, uvlinesize, 8,
239 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
240 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
241 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
242 (
s->h_edge_pos + 1) >> 1, (
s->v_edge_pos + 1) >> 1);
246 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
247 uint8_t *
const *ref_picture)
251 if (
ctx->real_sprite_warping_points == 1) {
261 uint8_t *dest_cr,
int block_size,
int uvlinesize,
262 int dct_linesize,
int dct_offset)
265 const int act_block_size = block_size * 2;
267 if (
ctx->dpcm_direction == 0) {
268 s->idsp.idct_put(dest_y, dct_linesize, (int16_t*)
ctx->block32[0]);
269 s->idsp.idct_put(dest_y + act_block_size, dct_linesize, (int16_t*)
ctx->block32[1]);
270 s->idsp.idct_put(dest_y + dct_offset, dct_linesize, (int16_t*)
ctx->block32[2]);
271 s->idsp.idct_put(dest_y + dct_offset + act_block_size, dct_linesize, (int16_t*)
ctx->block32[3]);
273 dct_linesize = uvlinesize <<
s->interlaced_dct;
274 dct_offset =
s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
276 s->idsp.idct_put(dest_cb, dct_linesize, (int16_t*)
ctx->block32[4]);
277 s->idsp.idct_put(dest_cr, dct_linesize, (int16_t*)
ctx->block32[5]);
278 s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, (int16_t*)
ctx->block32[6]);
279 s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, (int16_t*)
ctx->block32[7]);
280 if (!
s->chroma_x_shift){
281 s->idsp.idct_put(dest_cb + act_block_size, dct_linesize, (int16_t*)
ctx->block32[8]);
282 s->idsp.idct_put(dest_cr + act_block_size, dct_linesize, (int16_t*)
ctx->block32[9]);
283 s->idsp.idct_put(dest_cb + act_block_size + dct_offset, dct_linesize, (int16_t*)
ctx->block32[10]);
284 s->idsp.idct_put(dest_cr + act_block_size + dct_offset, dct_linesize, (int16_t*)
ctx->block32[11]);
286 }
else if (
ctx->dpcm_direction == 1) {
287 uint16_t *dest_pcm[3] = {(uint16_t*)dest_y, (uint16_t*)dest_cb, (uint16_t*)dest_cr};
288 int linesize[3] = {dct_linesize, uvlinesize, uvlinesize};
289 for (
int i = 0;
i < 3;
i++) {
290 const uint16_t *
src =
ctx->dpcm_macroblock[
i];
291 int vsub =
i ?
s->chroma_y_shift : 0;
292 int hsub =
i ?
s->chroma_x_shift : 0;
295 for (
int h = 0;
h < (16 >> (vsub +
lowres));
h++){
296 for (
int w = 0, idx = 0;
w < (16 >> (
hsub +
lowres));
w++, idx += step)
297 dest_pcm[
i][
w] =
src[idx];
298 dest_pcm[
i] += linesize[
i] / 2;
303 uint16_t *dest_pcm[3] = {(uint16_t*)dest_y, (uint16_t*)dest_cb, (uint16_t*)dest_cr};
304 int linesize[3] = {dct_linesize, uvlinesize, uvlinesize};
306 for (
int i = 0;
i < 3;
i++) {
307 const uint16_t *
src =
ctx->dpcm_macroblock[
i];
308 int vsub =
i ?
s->chroma_y_shift : 0;
309 int hsub =
i ?
s->chroma_x_shift : 0;
312 dest_pcm[
i] += (linesize[
i] / 2) * ((16 >> vsub +
lowres) - 1);
313 for (
int h = (16 >> (vsub +
lowres)) - 1;
h >= 0;
h--){
314 for (
int w = (16 >> (
hsub +
lowres)) - 1, idx = 0;
w >= 0;
w--, idx += step)
315 dest_pcm[
i][
w] =
src[idx];
317 dest_pcm[
i] -= linesize[
i] / 2;
331 int16_t *ac_val, *ac_val1;
332 int8_t *
const qscale_table =
h->c.cur_pic.qscale_table;
335 ac_val = &
h->c.ac_val[0][0] +
h->c.block_index[n] * 16;
339 const int xy =
h->c.mb_x - 1 +
h->c.mb_y *
h->c.mb_stride;
343 if (
h->c.mb_x == 0 ||
h->c.qscale == qscale_table[xy] ||
346 for (
i = 1;
i < 8;
i++)
347 block[
h->c.idsp.idct_permutation[
i << 3]] += ac_val[
i];
350 for (
i = 1;
i < 8;
i++)
351 block[
h->c.idsp.idct_permutation[
i << 3]] +=
ROUNDED_DIV(ac_val[
i] * qscale_table[xy],
h->c.qscale);
354 const int xy =
h->c.mb_x +
h->c.mb_y *
h->c.mb_stride -
h->c.mb_stride;
356 ac_val -= 16 *
h->c.block_wrap[n];
358 if (
h->c.mb_y == 0 ||
h->c.qscale == qscale_table[xy] ||
361 for (
i = 1;
i < 8;
i++)
362 block[
h->c.idsp.idct_permutation[
i]] += ac_val[
i + 8];
365 for (
i = 1;
i < 8;
i++)
366 block[
h->c.idsp.idct_permutation[
i]] +=
ROUNDED_DIV(ac_val[
i + 8] * qscale_table[xy],
h->c.qscale);
371 for (
i = 1;
i < 8;
i++)
372 ac_val1[
i] =
block[
h->c.idsp.idct_permutation[
i << 3]];
375 for (
i = 1;
i < 8;
i++)
376 ac_val1[8 +
i] =
block[
h->c.idsp.idct_permutation[
i]];
394 (v >> (8 -
h->c.pict_type) != 1) ||
h->partitioned_frame)
397 bits_count += 8 +
h->c.pict_type;
401 if (bits_count + 8 >=
h->gb.size_in_bits) {
403 v |= 0x7F >> (7 - (bits_count & 7));
408 static const uint16_t mpeg4_resync_prefix[8] = {
409 0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000
412 if (v == mpeg4_resync_prefix[bits_count & 7]) {
414 int mb_num_bits =
av_log2(
h->c.mb_num - 1) + 1;
425 if (!mb_num || mb_num >
h->c.mb_num ||
get_bits_count(&
h->gb) + 6 >
h->gb.size_in_bits)
440 int a = 2 <<
ctx->sprite_warping_accuracy;
441 int rho = 3 -
ctx->sprite_warping_accuracy;
447 int min_ab,
i, w2, h2, w3, h3;
448 int sprite_ref[4][2];
449 int virtual_ref[2][2];
454 const int vop_ref[4][2] = { { 0, 0 }, {
s->width, 0 },
455 { 0,
s->height }, {
s->width,
s->height } };
456 int d[4][2] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
458 if (
w <= 0 ||
h <= 0)
461 for (
i = 0;
i <
ctx->num_sprite_warping_points;
i++) {
469 if (!(
ctx->divx_version == 500 &&
ctx->divx_build == 413))
477 ctx->sprite_traj[
i][0] = d[
i][0] = x;
478 ctx->sprite_traj[
i][1] = d[
i][1] = y;
481 ctx->sprite_traj[
i][0] =
ctx->sprite_traj[
i][1] = 0;
485 while ((1 << beta) <
h)
491 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413) {
492 sprite_ref[0][0] =
a * vop_ref[0][0] + d[0][0];
493 sprite_ref[0][1] =
a * vop_ref[0][1] + d[0][1];
494 sprite_ref[1][0] =
a * vop_ref[1][0] + d[0][0] + d[1][0];
495 sprite_ref[1][1] =
a * vop_ref[1][1] + d[0][1] + d[1][1];
496 sprite_ref[2][0] =
a * vop_ref[2][0] + d[0][0] + d[2][0];
497 sprite_ref[2][1] =
a * vop_ref[2][1] + d[0][1] + d[2][1];
499 sprite_ref[0][0] = (
a >> 1) * (2 * vop_ref[0][0] + d[0][0]);
500 sprite_ref[0][1] = (
a >> 1) * (2 * vop_ref[0][1] + d[0][1]);
501 sprite_ref[1][0] = (
a >> 1) * (2 * vop_ref[1][0] + d[0][0] + d[1][0]);
502 sprite_ref[1][1] = (
a >> 1) * (2 * vop_ref[1][1] + d[0][1] + d[1][1]);
503 sprite_ref[2][0] = (
a >> 1) * (2 * vop_ref[2][0] + d[0][0] + d[2][0]);
504 sprite_ref[2][1] = (
a >> 1) * (2 * vop_ref[2][1] + d[0][1] + d[2][1]);
514 virtual_ref[0][0] = 16 * (vop_ref[0][0] + w2) +
516 (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
517 w2 * (
r * sprite_ref[1][0] - 16LL * vop_ref[1][0])),
w);
518 virtual_ref[0][1] = 16 * vop_ref[0][1] +
520 (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
521 w2 * (
r * sprite_ref[1][1] - 16LL * vop_ref[1][1])),
w);
522 virtual_ref[1][0] = 16 * vop_ref[0][0] +
523 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
524 h2 * (
r * sprite_ref[2][0] - 16LL * vop_ref[2][0])),
h);
525 virtual_ref[1][1] = 16 * (vop_ref[0][1] + h2) +
526 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
527 h2 * (
r * sprite_ref[2][1] - 16LL * vop_ref[2][1])),
h);
529 switch (
ctx->num_sprite_warping_points) {
531 sprite_offset[0][0] =
532 sprite_offset[0][1] =
533 sprite_offset[1][0] =
534 sprite_offset[1][1] = 0;
535 sprite_delta[0][0] =
a;
537 sprite_delta[1][0] = 0;
538 sprite_delta[1][1] =
a;
539 ctx->sprite_shift[0] =
540 ctx->sprite_shift[1] = 0;
543 sprite_offset[0][0] = sprite_ref[0][0] -
a * vop_ref[0][0];
544 sprite_offset[0][1] = sprite_ref[0][1] -
a * vop_ref[0][1];
545 sprite_offset[1][0] = ((sprite_ref[0][0] >> 1) | (sprite_ref[0][0] & 1)) -
546 a * (vop_ref[0][0] / 2);
547 sprite_offset[1][1] = ((sprite_ref[0][1] >> 1) | (sprite_ref[0][1] & 1)) -
548 a * (vop_ref[0][1] / 2);
549 sprite_delta[0][0] =
a;
551 sprite_delta[1][0] = 0;
552 sprite_delta[1][1] =
a;
553 ctx->sprite_shift[0] =
554 ctx->sprite_shift[1] = 0;
557 sprite_offset[0][0] = ((
int64_t) sprite_ref[0][0] * (1 <<
alpha + rho)) +
558 ((
int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
560 ((
int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
562 sprite_offset[0][1] = ((
int64_t) sprite_ref[0][1] * (1 <<
alpha + rho)) +
563 ((
int64_t) -
r * sprite_ref[0][1] + virtual_ref[0][1]) *
565 ((
int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
567 sprite_offset[1][0] = (((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
568 ((
int64_t)-2 * vop_ref[0][0] + 1) +
569 ((
int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
570 ((
int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
571 (
int64_t) sprite_ref[0][0] - 16 * w2 + (1 << (
alpha + rho + 1)));
572 sprite_offset[1][1] = (((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) *
573 ((
int64_t)-2 * vop_ref[0][0] + 1) +
574 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
575 ((
int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
576 (
int64_t) sprite_ref[0][1] - 16 * w2 + (1 << (
alpha + rho + 1)));
577 sprite_delta[0][0] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
578 sprite_delta[0][1] = (+
r * sprite_ref[0][1] - virtual_ref[0][1]);
579 sprite_delta[1][0] = (-
r * sprite_ref[0][1] + virtual_ref[0][1]);
580 sprite_delta[1][1] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
583 ctx->sprite_shift[1] =
alpha + rho + 2;
589 sprite_offset[0][0] = ((
int64_t)sprite_ref[0][0] * (1 << (
alpha + beta + rho - min_ab))) +
590 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-vop_ref[0][0]) +
591 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-vop_ref[0][1]) +
593 sprite_offset[0][1] = ((
int64_t)sprite_ref[0][1] * (1 << (
alpha + beta + rho - min_ab))) +
594 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-vop_ref[0][0]) +
595 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-vop_ref[0][1]) +
597 sprite_offset[1][0] = ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-2 * vop_ref[0][0] + 1) +
598 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-2 * vop_ref[0][1] + 1) +
599 (
int64_t)2 * w2 * h3 *
r * sprite_ref[0][0] - 16 * w2 * h3 +
601 sprite_offset[1][1] = ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-2 * vop_ref[0][0] + 1) +
602 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-2 * vop_ref[0][1] + 1) +
603 (
int64_t)2 * w2 * h3 *
r * sprite_ref[0][1] - 16 * w2 * h3 +
605 sprite_delta[0][0] = (-
r * (
int64_t)sprite_ref[0][0] + virtual_ref[0][0]) * h3;
606 sprite_delta[0][1] = (-
r * (
int64_t)sprite_ref[0][0] + virtual_ref[1][0]) * w3;
607 sprite_delta[1][0] = (-
r * (
int64_t)sprite_ref[0][1] + virtual_ref[0][1]) * h3;
608 sprite_delta[1][1] = (-
r * (
int64_t)sprite_ref[0][1] + virtual_ref[1][1]) * w3;
610 ctx->sprite_shift[0] =
alpha + beta + rho - min_ab;
611 ctx->sprite_shift[1] =
alpha + beta + rho - min_ab + 2;
614 av_unreachable(
"num_sprite_warping_points outside of 0..3 results in an error"
615 "in which num_sprite_warping_points is reset to zero");
618 if (sprite_delta[0][0] ==
a <<
ctx->sprite_shift[0] &&
619 sprite_delta[0][1] == 0 &&
620 sprite_delta[1][0] == 0 &&
621 sprite_delta[1][1] ==
a <<
ctx->sprite_shift[0]) {
622 sprite_offset[0][0] >>=
ctx->sprite_shift[0];
623 sprite_offset[0][1] >>=
ctx->sprite_shift[0];
624 sprite_offset[1][0] >>=
ctx->sprite_shift[1];
625 sprite_offset[1][1] >>=
ctx->sprite_shift[1];
626 sprite_delta[0][0] =
a;
627 sprite_delta[0][1] = 0;
628 sprite_delta[1][0] = 0;
629 sprite_delta[1][1] =
a;
630 ctx->sprite_shift[0] = 0;
631 ctx->sprite_shift[1] = 0;
632 ctx->real_sprite_warping_points = 1;
634 int shift_y = 16 -
ctx->sprite_shift[0];
635 int shift_c = 16 -
ctx->sprite_shift[1];
637 for (
i = 0;
i < 2;
i++) {
638 if (shift_c < 0 || shift_y < 0 ||
639 FFABS( sprite_offset[0][
i]) >= INT_MAX >> shift_y ||
640 FFABS( sprite_offset[1][
i]) >= INT_MAX >> shift_c ||
641 FFABS( sprite_delta[0][
i]) >= INT_MAX >> shift_y ||
642 FFABS( sprite_delta[1][
i]) >= INT_MAX >> shift_y
649 for (
i = 0;
i < 2;
i++) {
650 sprite_offset[0][
i] *= 1 << shift_y;
651 sprite_offset[1][
i] *= 1 << shift_c;
652 sprite_delta[0][
i] *= 1 << shift_y;
653 sprite_delta[1][
i] *= 1 << shift_y;
654 ctx->sprite_shift[
i] = 16;
657 for (
i = 0;
i < 2;
i++) {
659 sprite_delta[
i][0] -
a * (1LL<<16),
660 sprite_delta[
i][1] -
a * (1LL<<16)
663 if (llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
664 llabs(sprite_offset[0][
i] + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
665 llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL) + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
666 llabs(sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
667 llabs(sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
668 llabs(sd[0]) >= INT_MAX ||
669 llabs(sd[1]) >= INT_MAX ||
670 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL)) >= INT_MAX ||
671 llabs(sprite_offset[0][
i] + sd[1] * (
h+16LL)) >= INT_MAX ||
672 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL) + sd[1] * (
h+16LL)) >= INT_MAX
678 ctx->real_sprite_warping_points =
ctx->num_sprite_warping_points;
681 for (
i = 0;
i < 4;
i++) {
682 ctx->sprite_offset[
i&1][
i>>1] = sprite_offset[
i&1][
i>>1];
683 ctx->sprite_delta [
i&1][
i>>1] = sprite_delta [
i&1][
i>>1];
688 memset(
ctx->sprite_offset, 0,
sizeof(
ctx->sprite_offset));
689 memset(
ctx->sprite_delta, 0,
sizeof(
ctx->sprite_delta));
712 int mb_num_bits =
av_log2(
h->c.mb_num - 1) + 1;
713 int header_extension = 0, mb_num,
len;
734 if (mb_num >=
h->c.mb_num || !mb_num) {
736 "illegal mb_num in video packet (%d %d) \n", mb_num,
h->c.mb_num);
740 h->c.mb_x = mb_num %
h->c.mb_width;
741 h->c.mb_y = mb_num /
h->c.mb_width;
746 h->c.chroma_qscale =
h->c.qscale = qscale;
752 if (header_extension) {
756 check_marker(
h->c.avctx, &
h->gb,
"before time_increment in video packed header");
758 check_marker(
h->c.avctx, &
h->gb,
"before vop_coding_type in video packed header");
779 "Error, video packet header damaged (f_code=0)\n");
785 "Error, video packet header damaged (b_code=0)\n");
801 h->last_dc[2] = 1 << (
h->c.avctx->bits_per_raw_sample +
ctx->dct_precision +
h->c.intra_dc_precision - 1);
816 vlc_len =
av_log2(
h->c.mb_width *
h->c.mb_height) + 1;
819 if (mb_num >=
h->c.mb_num)
822 h->c.mb_x = mb_num %
h->c.mb_width;
823 h->c.mb_y = mb_num /
h->c.mb_width;
852 MPVContext *
const s = &
ctx->h.c;
853 int x, y, mb_v, sum, dx, dy,
shift;
854 int len = 1 << (
ctx->f_code + 4);
855 const int a =
ctx->sprite_warping_accuracy;
858 len >>=
s->quarter_sample;
860 if (
ctx->real_sprite_warping_points == 1) {
861 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413 &&
a >=
s->quarter_sample)
862 sum =
ctx->sprite_offset[0][n] / (1 << (
a -
s->quarter_sample));
864 sum =
RSHIFT(
ctx->sprite_offset[0][n] * (1 <<
s->quarter_sample),
a);
866 dx =
ctx->sprite_delta[n][0];
867 dy =
ctx->sprite_delta[n][1];
870 dy -= 1 << (
shift +
a + 1);
872 dx -= 1 << (
shift +
a + 1);
873 mb_v =
ctx->sprite_offset[0][n] + dx *
s->mb_x * 16U + dy *
s->mb_y * 16U;
876 for (y = 0; y < 16; y++) {
879 v = mb_v + (unsigned)dy * y;
881 for (x = 0; x < 16; x++) {
886 sum =
RSHIFT(sum,
a + 8 -
s->quarter_sample);
904 const int16_t *
const dc_val =
s->dc_val +
s->block_index[n];
905 const int wrap =
s->block_wrap[n];
914 int b = dc_val[-1 -
wrap];
915 int c = dc_val[-
wrap];
919 if (
s->first_slice_line && n != 3) {
922 if (n != 1 &&
s->mb_x ==
s->resync_mb_x)
925 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1) {
926 if (n == 0 || n == 4 || n == 5)
942 int scale = n < 4 ?
s->y_dc_scale :
s->c_dc_scale;
954 if (
level & (~2047)) {
958 "dc<0 at %dx%d\n",
s->mb_x,
s->mb_y);
963 "dc overflow at %dx%d\n",
s->mb_x,
s->mb_y);
972 s->dc_val[
s->block_index[n]] =
level;
1035 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1038 h->c.first_slice_line = 1;
1039 for (;
h->c.mb_y <
h->c.mb_height;
h->c.mb_y++) {
1041 for (;
h->c.mb_x <
h->c.mb_width;
h->c.mb_x++) {
1042 const int xy =
h->c.mb_x +
h->c.mb_y *
h->c.mb_stride;
1048 if (
h->c.mb_x ==
h->c.resync_mb_x &&
h->c.mb_y ==
h->c.resync_mb_y + 1)
1049 h->c.first_slice_line = 0;
1061 "mcbpc corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1064 }
while (cbpc == 8);
1066 h->c.cbp_table[xy] = cbpc & 3;
1073 h->c.cur_pic.qscale_table[xy] =
h->c.qscale;
1075 h->c.mbintra_table[xy] = 1;
1076 for (
i = 0;
i < 6;
i++) {
1081 "DC corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1088 h->c.pred_dir_table[xy] = dir;
1091 int16_t *
const mot_val =
h->c.cur_pic.motion_val[0][
h->c.block_index[0]];
1092 const int stride =
h->c.b8_stride * 2;
1100 if (
bits & 0x10000) {
1132 "mcbpc corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1138 h->c.cbp_table[xy] = cbpc & (8 + 3);
1140 h->c.mb_intra = ((cbpc & 4) != 0);
1142 if (
h->c.mb_intra) {
1144 h->c.mbintra_table[xy] = 1;
1163 if ((cbpc & 16) == 0) {
1197 for (
i = 0;
i < 4;
i++) {
1226 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1228 h->c.mb_x =
h->c.resync_mb_x;
1229 h->c.first_slice_line = 1;
1230 for (
h->c.mb_y =
h->c.resync_mb_y; mb_num < mb_count; h->
c.mb_y++) {
1232 for (; mb_num < mb_count &&
h->c.mb_x <
h->c.mb_width;
h->c.mb_x++) {
1233 const int xy =
h->c.mb_x +
h->c.mb_y *
h->c.mb_stride;
1237 if (
h->c.mb_x ==
h->c.resync_mb_x &&
h->c.mb_y ==
h->c.resync_mb_y + 1)
1238 h->c.first_slice_line = 0;
1245 "cbpy corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1249 h->c.cbp_table[xy] |= cbpy << 2;
1252 if (
IS_INTRA(
h->c.cur_pic.mb_type[xy])) {
1260 "I cbpy corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1264 if (
h->c.cbp_table[xy] & 8)
1266 h->c.cur_pic.qscale_table[xy] =
h->c.qscale;
1268 for (
i = 0;
i < 6;
i++) {
1273 "DC corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1280 h->c.cbp_table[xy] &= 3;
1281 h->c.cbp_table[xy] |= cbpy << 2;
1283 h->c.pred_dir_table[xy] = dir;
1284 }
else if (
IS_SKIP(
h->c.cur_pic.mb_type[xy])) {
1285 h->c.cur_pic.qscale_table[xy] =
h->c.qscale;
1286 h->c.cbp_table[xy] = 0;
1292 "P cbpy corrupted at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1296 if (
h->c.cbp_table[xy] & 8)
1298 h->c.cur_pic.qscale_table[xy] =
h->c.qscale;
1300 h->c.cbp_table[xy] &= 3;
1301 h->c.cbp_table[xy] |= (cbpy ^ 0xf) << 2;
1305 if (mb_num >= mb_count)
1327 h->c.mb_x,
h->c.mb_y, part_a_error);
1331 if (
h->c.resync_mb_x +
h->c.resync_mb_y *
h->c.mb_width + mb_num >
h->c.mb_num) {
1334 h->c.mb_x,
h->c.mb_y, part_a_error);
1338 h->mb_num_left = mb_num;
1345 "marker missing after first I partition at %d %d\n",
1346 h->c.mb_x,
h->c.mb_y);
1354 "marker missing after first P partition at %d %d\n",
1355 h->c.mb_x,
h->c.mb_y);
1360 h->c.mb_x - 1,
h->c.mb_y, part_a_end);
1382 int n,
int coded,
int intra,
1383 int use_intra_dc_vlc,
int rvlc)
1390 const uint8_t *scan_table;
1396 if (use_intra_dc_vlc) {
1398 if (
h->partitioned_frame) {
1399 level =
h->c.dc_val[
h->c.block_index[n]];
1404 dc_pred_dir = (
h->c.pred_dir_table[
h->c.mb_x +
h->c.mb_y *
h->c.mb_stride] << n) & 32;
1427 if (dc_pred_dir == 0)
1428 scan_table =
h->permutated_intra_v_scantable;
1430 scan_table =
h->permutated_intra_h_scantable;
1432 scan_table =
h->c.intra_scantable.permutated;
1439 h->c.block_last_index[n] =
i;
1447 scan_table =
h->c.intra_scantable.permutated;
1449 if (
ctx->mpeg_quant) {
1457 qmul =
h->c.qscale << 1;
1458 qadd = (
h->c.qscale - 1) | 1;
1475 "1. marker bit missing in rvlc esc\n");
1488 "2. marker bit missing in rvlc esc\n");
1514 cache ^= 0xC0000000;
1516 if (cache & 0x80000000) {
1517 if (cache & 0x40000000) {
1532 "1. marker bit missing in 3. esc\n");
1543 "2. marker bit missing in 3. esc\n");
1552 if (
h->c.error_recognition >= FF_ER_COMPLIANT) {
1555 const int run1=
run - rl->
max_run[last][abs_level] - 1;
1556 if (abs_level <= rl->max_level[last][
run]) {
1560 if (
h->c.error_recognition > FF_ER_COMPLIANT) {
1561 if (abs_level <= rl->max_level[last][
run]*2) {
1565 if (run1 >= 0 && abs_level <= rl->max_level[last][run1]) {
1578 if ((
unsigned)(
level + 2048) > 4095) {
1582 "|level| overflow in 3. esc, qp=%d\n",
1616 ff_tlog(
h->c.avctx,
"dct[%d][%d] = %- 4d end?:%d\n", scan_table[
i&63]&7, scan_table[
i&63] >> 3,
level,
i>62);
1621 "ac-tex damaged at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1636 if (!use_intra_dc_vlc) {
1646 h->c.block_last_index[n] =
i;
1657 const int xy =
h->c.mb_x +
h->c.mb_y *
h->c.mb_stride;
1659 const int mb_type =
h->c.cur_pic.mb_type[xy];
1660 int cbp =
h->c.cbp_table[xy];
1662 const int use_intra_dc_vlc =
h->c.qscale <
ctx->intra_dc_threshold;
1664 if (
h->c.cur_pic.qscale_table[xy] !=
h->c.qscale)
1670 for (
i = 0;
i < 4;
i++) {
1671 h->c.mv[0][
i][0] =
h->c.cur_pic.motion_val[0][
h->c.block_index[
i]][0];
1672 h->c.mv[0][
i][1] =
h->c.cur_pic.motion_val[0][
h->c.block_index[
i]][1];
1678 for (
i = 0;
i < 6;
i++)
1679 h->c.block_last_index[
i] = -1;
1685 h->c.mb_skipped = 0;
1686 h->c.cur_pic.mbskip_table[xy] = 0;
1689 h->c.mb_skipped = 1;
1690 h->c.cur_pic.mbskip_table[xy] = 1;
1692 }
else if (
h->c.mb_intra) {
1693 h->c.ac_pred =
IS_ACPRED(
h->c.cur_pic.mb_type[xy]);
1694 }
else if (!
h->c.mb_intra) {
1706 h->c.ac_pred =
IS_ACPRED(
h->c.cur_pic.mb_type[xy]);
1711 h->c.bdsp.clear_blocks(
h->block[0]);
1713 for (
i = 0;
i < 6;
i++) {
1715 use_intra_dc_vlc,
ctx->rvlc) < 0) {
1717 "texture corrupted at %d %d %d\n",
1718 h->c.mb_x,
h->c.mb_y,
h->c.mb_intra);
1726 if (--
h->mb_num_left <= 0) {
1733 const int delta =
h->c.mb_x + 1 ==
h->c.mb_width ? 2 : 1;
1734 if (
h->c.cbp_table[xy +
delta])
1744 int cbpc, cbpy,
i, cbp, pred_x, pred_y,
mx,
my, dquant;
1745 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1746 const int xy =
h->c.mb_x +
h->c.mb_y *
h->c.mb_stride;
1757 for (
i = 0;
i < 6;
i++)
1758 h->c.block_last_index[
i] = -1;
1770 h->c.cur_pic.mbskip_table[xy] = 0;
1771 h->c.mb_skipped = 0;
1776 h->c.mv[0][0][0] = 0;
1777 h->c.mv[0][0][1] = 0;
1778 h->c.cur_pic.mbskip_table[xy] = 1;
1779 h->c.mb_skipped = 1;
1786 "mcbpc damaged at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1789 }
while (cbpc == 20);
1792 h->c.mb_intra = ((cbpc & 4) != 0);
1795 h->c.bdsp.clear_blocks(
h->block[0]);
1805 "P cbpy damaged at %d %d\n",
h->c.mb_x,
h->c.mb_y);
1809 cbp = (cbpc & 3) | (cbpy << 2);
1812 if ((!
h->c.progressive_sequence) &&
1817 if ((cbpc & 16) == 0) {
1825 h->c.mv[0][0][0] =
mx;
1826 h->c.mv[0][0][1] =
my;
1827 }
else if ((!
h->c.progressive_sequence) &&
get_bits1(&
h->gb)) {
1838 for (
i = 0;
i < 2;
i++) {
1847 h->c.mv[0][
i][0] =
mx;
1848 h->c.mv[0][
i][1] =
my;
1864 h->c.mv[0][0][0] =
mx;
1865 h->c.mv[0][0][1] =
my;
1870 for (
i = 0;
i < 4;
i++) {
1879 h->c.mv[0][
i][0] =
mx;
1880 h->c.mv[0][
i][1] =
my;
1893 if (
h->c.mb_x == 0) {
1894 for (
i = 0;
i < 2;
i++) {
1895 h->c.last_mv[
i][0][0] =
1896 h->c.last_mv[
i][0][1] =
1897 h->c.last_mv[
i][1][0] =
1898 h->c.last_mv[
i][1][1] = 0;
1905 h->c.mb_skipped =
h->c.next_pic.mbskip_table[
h->c.mb_y *
h->c.mb_stride +
h->c.mb_x];
1907 if (
h->c.mb_skipped) {
1909 for (
i = 0;
i < 6;
i++)
1910 h->c.block_last_index[
i] = -1;
1917 h->c.mv[1][0][1] = 0;
1939 h->c.bdsp.clear_blocks(
h->block[0]);
1948 if (!
h->c.progressive_sequence) {
1976 h->c.last_mv[0][1][0] =
1977 h->c.last_mv[0][0][0] =
1978 h->c.mv[0][0][0] =
mx;
1979 h->c.last_mv[0][1][1] =
1980 h->c.last_mv[0][0][1] =
1981 h->c.mv[0][0][1] =
my;
1989 h->c.last_mv[1][1][0] =
1990 h->c.last_mv[1][0][0] =
1991 h->c.mv[1][0][0] =
mx;
1992 h->c.last_mv[1][1][1] =
1993 h->c.last_mv[1][0][1] =
1994 h->c.mv[1][0][1] =
my;
2002 for (
i = 0;
i < 2;
i++) {
2005 h->c.last_mv[0][
i][0] =
2006 h->c.mv[0][
i][0] =
mx;
2007 h->c.last_mv[0][
i][1] = (
h->c.mv[0][
i][1] =
my) * 2;
2014 for (
i = 0;
i < 2;
i++) {
2017 h->c.last_mv[1][
i][0] =
2018 h->c.mv[1][
i][0] =
mx;
2019 h->c.last_mv[1][
i][1] = (
h->c.mv[1][
i][1] =
my) * 2;
2037 h->c.cur_pic.mb_type[xy] = mb_type;
2039 int use_intra_dc_vlc;
2045 "I cbpc damaged at %d %d\n",
h->c.mb_x,
h->c.mb_y);
2048 }
while (cbpc == 8);
2063 "I cbpy damaged at %d %d\n",
h->c.mb_x,
h->c.mb_y);
2066 cbp = (cbpc & 3) | (cbpy << 2);
2068 use_intra_dc_vlc =
h->c.qscale <
ctx->intra_dc_threshold;
2073 if (!
h->c.progressive_sequence)
2076 h->c.bdsp.clear_blocks(
h->block[0]);
2078 for (
i = 0;
i < 6;
i++) {
2080 1, use_intra_dc_vlc, 0) < 0)
2088 for (
i = 0;
i < 6;
i++) {
2098 if (
h->c.mb_x +
h->c.mb_y*
h->c.mb_width + 1 > next && (
h->c.avctx->err_recognition &
AV_EF_AGGRESSIVE)) {
2100 }
else if (
h->c.mb_x +
h->c.mb_y*
h->c.mb_width + 1 >= next)
2104 const int delta =
h->c.mb_x + 1 ==
h->c.mb_width ? 2 : 1;
2106 (
h->c.mb_x +
delta >=
h->c.mb_width)
2107 ?
FFMIN(
h->c.mb_y + 1,
h->c.mb_height - 1)
2109 if (
h->c.next_pic.mbskip_table[xy +
delta])
2160 int cc, dct_dc_size, dct_diff,
code, j, idx = 1, group = 0,
run = 0,
2161 additional_code_len, sign, mismatch;
2163 const uint8_t *
const scantable =
h->c.intra_scantable.permutated;
2164 const uint16_t *quant_matrix;
2166 const int min = -1 * (1 << (
h->c.avctx->bits_per_raw_sample + 6));
2167 const int max = ((1 << (
h->c.avctx->bits_per_raw_sample + 6)) - 1);
2168 int shift = 3 -
ctx->dct_precision;
2177 quant_matrix =
h->c.intra_matrix;
2184 quant_matrix =
h->c.chroma_intra_matrix;
2187 if (dct_dc_size == 0) {
2192 if (dct_dc_size > 8) {
2199 h->last_dc[cc] += dct_diff;
2201 if (
ctx->mpeg_quant)
2202 block[0] =
h->last_dc[cc] * (8 >>
h->c.intra_dc_precision);
2204 block[0] =
h->last_dc[cc] * (8 >>
h->c.intra_dc_precision) * (8 >>
ctx->dct_precision);
2208 mismatch ^=
block[0];
2225 }
else if (group >= 1 && group <= 6) {
2227 run = 1 << additional_code_len;
2228 if (additional_code_len)
2232 }
else if (group >= 7 && group <= 12) {
2237 run = (1 << (additional_code_len - 1)) +
code;
2241 j = scantable[idx++];
2242 block[j] = sign ? 1 : -1;
2243 }
else if (group >= 13 && group <= 20) {
2247 j = scantable[idx++];
2249 }
else if (group == 21) {
2253 j = scantable[idx++];
2254 additional_code_len =
h->c.avctx->bits_per_raw_sample +
ctx->dct_precision + 4;
2255 flc =
get_bits(&
h->gb, additional_code_len);
2256 if (flc >> (additional_code_len-1))
2257 block[j] = -1 * (( flc ^ ((1 << additional_code_len) -1)) + 1);
2261 block[j] = ((
block[j] * quant_matrix[j] *
h->c.qscale) * (1 <<
shift)) / 16;
2263 mismatch ^=
block[j];
2266 block[63] ^= mismatch & 1;
2272 int16_t macroblock[256],
int n)
2276 int block_mean, rice_parameter, rice_prefix_code, rice_suffix_code,
2277 dpcm_residual,
left, top, topleft, min_left_top, max_left_top, p, p2, output;
2278 height = 16 >> (n ?
h->c.chroma_y_shift : 0);
2279 w = 16 >> (n ?
h->c.chroma_x_shift : 0);
2281 block_mean =
get_bits(&
h->gb,
h->c.avctx->bits_per_raw_sample);
2282 if (block_mean == 0){
2286 h->last_dc[n] = block_mean * (1 << (
ctx->dct_precision +
h->c.intra_dc_precision));
2289 if (rice_parameter == 0) {
2294 if (rice_parameter == 15)
2297 if (rice_parameter > 11) {
2303 output = 1 << (
h->c.avctx->bits_per_raw_sample - 1);
2304 top = 1 << (
h->c.avctx->bits_per_raw_sample - 1);
2306 for (j = 0; j <
w; j++) {
2313 if (rice_prefix_code == 11)
2314 dpcm_residual =
get_bits(&
h->gb,
h->c.avctx->bits_per_raw_sample);
2316 if (rice_prefix_code == 12) {
2320 rice_suffix_code =
get_bitsz(&
h->gb, rice_parameter);
2321 dpcm_residual = (rice_prefix_code << rice_parameter) + rice_suffix_code;
2325 if (dpcm_residual & 1)
2326 dpcm_residual = (-1 * dpcm_residual) >> 1;
2328 dpcm_residual = (dpcm_residual >> 1);
2331 top = macroblock[idx-
w];
2333 p =
left + top - topleft;
2335 if (p < min_left_top)
2339 if (p > max_left_top)
2342 p2 = (
FFMIN(min_left_top, topleft) +
FFMAX(max_left_top, topleft)) >> 1;
2347 dpcm_residual *= -1;
2349 macroblock[idx++] = output = (dpcm_residual + p) & ((1 <<
h->c.avctx->bits_per_raw_sample) - 1);
2361 ctx->dpcm_direction = 0;
2382 for (
i = 0;
i < 3;
i++) {
2406 int hours, minutes, seconds;
2418 s->time_base = seconds + 60*(minutes + 60*hours);
2442 int visual_object_type;
2443 int is_visual_object_identifier =
get_bits1(gb);
2445 if (is_visual_object_identifier) {
2448 visual_object_type =
get_bits(gb, 4);
2453 if (video_signal_type) {
2454 int video_range, color_description;
2461 if (color_description) {
2462 s->avctx->color_primaries =
get_bits(gb, 8);
2477 for (
i = 0;
i < 64;
i++) {
2478 int j =
s->idsp.idct_permutation[
i];
2480 s->intra_matrix[j] = v;
2481 s->chroma_intra_matrix[j] = v;
2484 s->inter_matrix[j] = v;
2485 s->chroma_inter_matrix[j] = v;
2497 for (
i = 0;
i < 64;
i++) {
2500 s->intra_matrix[j] = v;
2501 s->chroma_intra_matrix[j] = v;
2509 for (
i = 0;
i < 64;
i++) {
2518 for (
i = 0;
i < 64;
i++) {
2521 s->chroma_intra_matrix[j] = v;
2529 for (
i = 0;
i < 64;
i++) {
2541 uint8_t extension_type;
2557 MPVContext *
const s = &
ctx->h.c;
2559 int bits_per_raw_sample;
2560 int rgb, chroma_format;
2580 bits_per_raw_sample =
get_bits(gb, 4);
2581 if (bits_per_raw_sample == 10) {
2591 if (
rgb !=
ctx->rgb ||
s->chroma_format != chroma_format)
2592 s->context_reinit = 1;
2593 s->avctx->bits_per_raw_sample = bits_per_raw_sample;
2595 s->chroma_format = chroma_format;
2598 check_marker(
s->avctx, gb,
"before video_object_layer_width");
2600 check_marker(
s->avctx, gb,
"before video_object_layer_height");
2602 check_marker(
s->avctx, gb,
"after video_object_layer_height");
2606 if (
s->width &&
s->height &&
2608 s->context_reinit = 1;
2613 aspect_ratio_info =
get_bits(gb, 4);
2615 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2616 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2626 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2629 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2631 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2659 h->c.studio_profile = 1;
2662 }
else if (
h->c.studio_profile) {
2672 aspect_ratio_info =
get_bits(gb, 4);
2674 h->c.avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2675 h->c.avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2681 int chroma_format =
get_bits(gb, 2);
2692 check_marker(
h->c.avctx, gb,
"after first_half_vbv_buffer_size");
2695 check_marker(
h->c.avctx, gb,
"after first_half_vbv_occupancy");
2697 check_marker(
h->c.avctx, gb,
"after latter_half_vbv_occupancy");
2702 if (
h->picture_number == 0) {
2703 switch (
ctx->vo_type) {
2722 check_marker(
h->c.avctx, gb,
"before time_increment_resolution");
2724 h->c.avctx->framerate.num =
get_bits(gb, 16);
2725 if (!
h->c.avctx->framerate.num) {
2730 ctx->time_increment_bits =
av_log2(
h->c.avctx->framerate.num - 1) + 1;
2731 if (
ctx->time_increment_bits < 1)
2732 ctx->time_increment_bits = 1;
2737 h->c.avctx->framerate.den =
get_bits(gb,
ctx->time_increment_bits);
2739 h->c.avctx->framerate.den = 1;
2751 !(
h->c.width &&
h->c.codec_tag ==
AV_RL32(
"MP4S"))) {
2752 if (
h->c.width &&
h->c.height &&
2754 h->c.context_reinit = 1;
2760 h->c.progressive_sequence =
2762 h->c.interlaced_dct = 0;
2765 "MPEG-4 OBMC not supported (very likely buggy encoder)\n");
2786 if (
ctx->num_sprite_warping_points > 3) {
2788 "%d sprite_warping_points\n",
2789 ctx->num_sprite_warping_points);
2790 ctx->num_sprite_warping_points = 0;
2804 if (
ctx->quant_precision != 5)
2806 "quant precision %d\n",
ctx->quant_precision);
2807 if (
ctx->quant_precision < 3 ||
ctx->quant_precision > 9)
2808 ctx->quant_precision = 5;
2810 ctx->quant_precision = 5;
2823 for (
i = 0;
i < 64;
i++) {
2835 h->c.intra_matrix[j] = last;
2839 for (;
i < 64;
i++) {
2841 h->c.intra_matrix[j] = last;
2848 for (
i = 0;
i < 64;
i++) {
2860 h->c.inter_matrix[j] = v;
2864 for (;
i < 64;
i++) {
2866 h->c.inter_matrix[j] = last;
2876 h->c.quarter_sample = 0;
2885 int estimation_method =
get_bits(gb, 2);
2886 if (estimation_method < 2) {
2901 if (!
check_marker(
h->c.avctx, gb,
"in complexity estimation part 1")) {
2919 if (!
check_marker(
h->c.avctx, gb,
"in complexity estimation part 2")) {
2923 if (estimation_method == 1) {
2929 "Invalid Complexity estimation method %d\n",
2934 ctx->cplx_estimation_trash_i =
2935 ctx->cplx_estimation_trash_p =
2936 ctx->cplx_estimation_trash_b = 0;
2942 if (
h->data_partitioning)
2945 if (vo_ver_id != 1) {
2947 if (
ctx->new_pred) {
2954 "reduced resolution VOP not supported\n");
2961 if (
ctx->scalability) {
2963 int h_sampling_factor_n;
2964 int h_sampling_factor_m;
2965 int v_sampling_factor_n;
2966 int v_sampling_factor_m;
2971 h_sampling_factor_n =
get_bits(gb, 5);
2972 h_sampling_factor_m =
get_bits(gb, 5);
2973 v_sampling_factor_n =
get_bits(gb, 5);
2974 v_sampling_factor_m =
get_bits(gb, 5);
2977 if (h_sampling_factor_n == 0 || h_sampling_factor_m == 0 ||
2978 v_sampling_factor_n == 0 || v_sampling_factor_m == 0) {
2981 ctx->scalability = 0;
2991 av_log(
h->c.avctx,
AV_LOG_DEBUG,
"tb %d/%d, tincrbits:%d, qp_prec:%d, ps:%d, low_delay:%d %s%s%s%s\n",
2992 h->c.avctx->framerate.den,
h->c.avctx->framerate.num,
2993 ctx->time_increment_bits,
2994 ctx->quant_precision,
2995 h->c.progressive_sequence,
2997 ctx->scalability ?
"scalability " :
"" ,
2998 h->c.quarter_sample ?
"qpel " :
"",
2999 h->data_partitioning ?
"partition " :
"",
3000 ctx->rvlc ?
"rvlc " :
""
3017 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
3028 e = sscanf(buf,
"DivX%dBuild%d%c", &ver, &build, &last);
3030 e = sscanf(buf,
"DivX%db%d%c", &ver, &build, &last);
3032 ctx->divx_version = ver;
3033 ctx->divx_build = build;
3034 h->divx_packed = e == 3 && last ==
'p';
3038 e = sscanf(buf,
"FFmpe%*[^b]b%d", &build) + 3;
3040 e = sscanf(buf,
"FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
3042 e = sscanf(buf,
"Lavc%d.%d.%d", &ver, &ver2, &ver3) + 1;
3044 if (ver > 0xFFU || ver2 > 0xFFU || ver3 > 0xFFU) {
3046 "Unknown Lavc version string encountered, %d.%d.%d; "
3047 "clamping sub-version values to 8-bits.\n",
3050 build = ((ver & 0xFF) << 16) + ((ver2 & 0xFF) << 8) + (ver3 & 0xFF);
3054 if (strcmp(buf,
"ffmpeg") == 0)
3055 ctx->lavc_build = 4600;
3058 ctx->lavc_build = build;
3061 e = sscanf(buf,
"XviD%d", &build);
3063 ctx->xvid_build = build;
3072 int time_incr, time_increment;
3084 if (
h->partitioned_frame)
3095 if (
ctx->time_increment_bits == 0 ||
3098 "time_increment_bits %d is invalid in relation to the current bitstream, this is likely caused by a missing VOL header\n",
ctx->time_increment_bits);
3100 for (
ctx->time_increment_bits = 1;
3101 ctx->time_increment_bits < 16;
3102 ctx->time_increment_bits++) {
3106 if ((
show_bits(gb,
ctx->time_increment_bits + 6) & 0x37) == 0x30)
3108 }
else if ((
show_bits(gb,
ctx->time_increment_bits + 5) & 0x1F) == 0x18)
3113 "time_increment_bits set to %d bits, based on bitstream analysis\n",
ctx->time_increment_bits);
3119 time_increment =
get_bits(gb,
ctx->time_increment_bits);
3122 h->c.last_time_base =
h->c.time_base;
3123 h->c.time_base += time_incr;
3124 h->c.time =
h->c.time_base * (
int64_t)
h->c.avctx->framerate.num + time_increment;
3126 if (
h->c.time <
h->c.last_non_b_time) {
3130 h->c.time +=
h->c.avctx->framerate.num;
3133 h->c.pp_time =
h->c.time -
h->c.last_non_b_time;
3134 h->c.last_non_b_time =
h->c.time;
3136 h->c.time = (
h->c.last_time_base + time_incr) * (
int64_t)
h->c.avctx->framerate.num + time_increment;
3137 h->c.pb_time =
h->c.pp_time - (
h->c.last_non_b_time -
h->c.time);
3138 if (
h->c.pp_time <=
h->c.pb_time ||
3139 h->c.pp_time <=
h->c.pp_time -
h->c.pb_time ||
3140 h->c.pp_time <= 0) {
3146 if (
ctx->t_frame == 0)
3147 ctx->t_frame =
h->c.pb_time;
3148 if (
ctx->t_frame == 0)
3154 if (
h->c.pp_field_time <=
h->c.pb_field_time ||
h->c.pb_field_time <= 1) {
3155 h->c.pb_field_time = 2;
3156 h->c.pp_field_time = 4;
3157 if (!
h->c.progressive_sequence)
3162 if (
h->c.avctx->framerate.den)
3166 ff_dlog(
h->c.avctx,
"MPEG4 PTS: %"PRId64
"\n",
pts);
3174 h->skipped_last_frame = 1;
3187 h->c.no_rounding = 0;
3221 if (!
h->c.progressive_sequence) {
3225 h->c.alternate_scan = 0;
3233 if (
h->c.alternate_scan) {
3236 h->c.idsp.idct_permutation);
3240 h->c.idsp.idct_permutation);
3243 h->c.idsp.idct_permutation);
3250 if (
ctx->sprite_brightness_change)
3252 "sprite_brightness_change not supported\n");
3256 memset(
ctx->sprite_offset, 0,
sizeof(
ctx->sprite_offset));
3257 memset(
ctx->sprite_delta, 0,
sizeof(
ctx->sprite_delta));
3264 h->c.chroma_qscale =
h->c.qscale =
get_bits(gb,
ctx->quant_precision);
3265 if (
h->c.qscale == 0) {
3267 "Error, header damaged or not MPEG-4 header (qscale=0)\n");
3273 if (
ctx->f_code == 0) {
3275 "Error, header damaged or not MPEG-4 header (f_code=0)\n");
3283 if (
ctx->b_code == 0) {
3285 "Error, header damaged or not MPEG4 header (b_code=0)\n");
3293 "qp:%d fc:%d,%d %c size:%d pro:%d alt:%d top:%d %cpel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d time:%"PRId64
" tincr:%d\n",
3294 h->c.qscale,
ctx->f_code,
ctx->b_code,
3297 h->c.top_field_first,
h->c.quarter_sample ?
'q' :
'h',
3298 h->data_partitioning,
ctx->resync_marker,
3299 ctx->num_sprite_warping_points,
ctx->sprite_warping_accuracy,
3300 1 -
h->c.no_rounding,
ctx->vo_type,
3301 ctx->vol_control_parameters ?
" VOLC" :
" ",
ctx->intra_dc_threshold,
3302 ctx->cplx_estimation_trash_i,
ctx->cplx_estimation_trash_p,
3303 ctx->cplx_estimation_trash_b,
3309 if (!
ctx->scalability) {
3313 if (
ctx->enhancement_type) {
3314 int load_backward_shape =
get_bits1(gb);
3315 if (load_backward_shape)
3317 "load backward shape isn't supported\n");
3323 h->c.dct_unquantize_intra =
ctx->mpeg_quant ?
ctx->dct_unquantize_mpeg2_intra
3324 :
ctx->dct_unquantize_h263_intra;
3326 h->c.dct_unquantize_inter =
ctx->mpeg_quant ?
ctx->dct_unquantize_mpeg2_inter :
NULL;
3332 if (
ctx->vo_type == 0 &&
ctx->vol_control_parameters == 0 &&
3333 ctx->divx_version == -1 &&
h->picture_number == 0) {
3335 "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
3339 h->picture_number++;
3342 h->c.h_edge_pos =
h->c.width;
3343 h->c.v_edge_pos =
h->c.height;
3374 h->partitioned_frame = 0;
3375 h->c.interlaced_dct = 0;
3398 h->c.intra_dc_precision =
get_bits(gb, 2);
3415 int visual_object_type;
3418 visual_object_type =
get_bits(gb, 4);
3441 int header,
int parse_only)
3443 MPVContext *
const s = &
ctx->h.c;
3444 unsigned startcode, v;
3454 if (!
s->studio_profile &&
s->avctx->bits_per_raw_sample != 8)
3455 s->avctx->bits_per_raw_sample = 0;
3467 (
ctx->divx_version >= 0 ||
ctx->xvid_build >= 0) ||
s->codec_tag ==
AV_RL32(
"QMP4")) {
3478 startcode = ((startcode << 8) | v) & 0xffffffff;
3480 if ((startcode & 0xFFFFFF00) != 0x100)
3485 if (startcode <= 0x11F)
3486 name =
"Video Object Start";
3487 else if (startcode <= 0x12F)
3488 name =
"Video Object Layer Start";
3489 else if (startcode <= 0x13F)
3491 else if (startcode <= 0x15F)
3492 name =
"FGS bp start";
3493 else if (startcode <= 0x1AF)
3495 else if (startcode == 0x1B0)
3496 name =
"Visual Object Seq Start";
3497 else if (startcode == 0x1B1)
3498 name =
"Visual Object Seq End";
3499 else if (startcode == 0x1B2)
3501 else if (startcode == 0x1B3)
3502 name =
"Group of VOP start";
3503 else if (startcode == 0x1B4)
3504 name =
"Video Session Error";
3505 else if (startcode == 0x1B5)
3506 name =
"Visual Object Start";
3507 else if (startcode == 0x1B6)
3508 name =
"Video Object Plane start";
3509 else if (startcode == 0x1B7)
3510 name =
"slice start";
3511 else if (startcode == 0x1B8)
3512 name =
"extension start";
3513 else if (startcode == 0x1B9)
3515 else if (startcode == 0x1BA)
3516 name =
"FBA Object start";
3517 else if (startcode == 0x1BB)
3518 name =
"FBA Object Plane start";
3519 else if (startcode == 0x1BC)
3520 name =
"Mesh Object start";
3521 else if (startcode == 0x1BD)
3522 name =
"Mesh Object Plane start";
3523 else if (startcode == 0x1BE)
3524 name =
"Still Texture Object start";
3525 else if (startcode == 0x1BF)
3526 name =
"Texture Spatial Layer start";
3527 else if (startcode == 0x1C0)
3528 name =
"Texture SNR Layer start";
3529 else if (startcode == 0x1C1)
3530 name =
"Texture Tile start";
3531 else if (startcode == 0x1C2)
3532 name =
"Texture Shape Layer start";
3533 else if (startcode == 0x1C3)
3534 name =
"stuffing start";
3535 else if (startcode <= 0x1C5)
3537 else if (startcode <= 0x1FF)
3538 name =
"System start";
3545 if (startcode >= 0x120 && startcode <= 0x12F) {
3562 s->studio_profile = 1;
3565 }
else if (
s->studio_profile) {
3572 if (
s->studio_profile) {
3589 if (
s->studio_profile) {
3590 if (!
s->avctx->bits_per_raw_sample) {
3599#if CONFIG_MPEG4_DECODER
3600static av_cold void permute_quant_matrix(uint16_t
matrix[64],
3601 const uint8_t new_perm[64],
3602 const uint8_t old_perm[64])
3607 for (
int i = 0;
i < 64; ++
i)
3614 uint8_t old_permutation[64];
3616 memcpy(old_permutation,
h->c.idsp.idct_permutation,
sizeof(old_permutation));
3622 h->c.idsp.idct_permutation);
3624 h->c.idsp.idct_permutation);
3627 permute_quant_matrix(
h->c.inter_matrix,
h->c.idsp.idct_permutation, old_permutation);
3628 permute_quant_matrix(
h->c.intra_matrix,
h->c.idsp.idct_permutation, old_permutation);
3636 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1) {
3637 if (
h->c.codec_tag ==
AV_RL32(
"XVID") ||
3638 h->c.codec_tag ==
AV_RL32(
"XVIX") ||
3639 h->c.codec_tag ==
AV_RL32(
"RMP4") ||
3640 h->c.codec_tag ==
AV_RL32(
"ZMP4") ||
3642 ctx->xvid_build = 0;
3645 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1)
3646 if (
h->c.codec_tag ==
AV_RL32(
"DIVX") &&
ctx->vo_type == 0 &&
3647 ctx->vol_control_parameters == 0)
3648 ctx->divx_version = 400;
3650 if (
ctx->xvid_build >= 0 &&
ctx->divx_version >= 0) {
3652 ctx->divx_build = -1;
3656 if (
h->c.codec_tag ==
AV_RL32(
"XVIX"))
3659 if (
h->c.codec_tag ==
AV_RL32(
"UMP4"))
3662 if (
ctx->divx_version >= 500 &&
ctx->divx_build < 1814)
3665 if (
ctx->divx_version > 502 &&
ctx->divx_build < 1814)
3668 if (
ctx->xvid_build <= 3U)
3669 h->padding_bug_score = 256 * 256 * 256 * 64;
3671 if (
ctx->xvid_build <= 1U)
3674 if (
ctx->xvid_build <= 12U)
3677 if (
ctx->xvid_build <= 32U)
3680#define SET_QPEL_FUNC(postfix1, postfix2) \
3681 h->c.qdsp.put_ ## postfix1 = ff_put_ ## postfix2; \
3682 h->c.qdsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \
3683 h->c.qdsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
3685 if (
ctx->lavc_build < 4653U)
3688 if (
ctx->lavc_build < 4655U)
3691 if (
ctx->lavc_build < 4670U)
3694 if (
ctx->lavc_build <= 4712U)
3697 if ((
ctx->lavc_build&0xFF) >= 100) {
3698 if (
ctx->lavc_build > 3621476 &&
ctx->lavc_build < 3752552 &&
3699 (
ctx->lavc_build < 3752037 ||
ctx->lavc_build > 3752191)
3704 if (
ctx->divx_version >= 0)
3706 if (
ctx->divx_version == 501 &&
ctx->divx_build == 20020416)
3707 h->padding_bug_score = 256 * 256 * 256 * 64;
3709 if (
ctx->divx_version < 500U)
3712 if (
ctx->divx_version >= 0)
3734 "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
3735 h->c.workaround_bugs,
ctx->lavc_build,
ctx->xvid_build,
3736 ctx->divx_version,
ctx->divx_build,
h->divx_packed ?
"p" :
"");
3738 if (
ctx->xvid_build >= 0 &&
3740 switch_to_xvid_idct(avctx,
h);
3748 h->skipped_last_frame = 0;
3750 if (
ctx->bitstream_buffer) {
3752 int bitstream_buffer_size =
ctx->bitstream_buffer->size;
3753 const uint8_t *buf =
h->gb.buffer;
3755 if (
h->divx_packed) {
3756 for (
int i = 0;
i < buf_size - 3;
i++) {
3757 if (buf[
i] == 0 && buf[
i+1] == 0 && buf[
i+2] == 1) {
3758 if (buf[
i+3] == 0xB0) {
3760 bitstream_buffer_size = 0;
3766 ctx->bitstream_buffer->size = 0;
3767 if (bitstream_buffer_size && (
h->divx_packed || buf_size <=
MAX_NVOP_SIZE)) {
3769 bitstream_buffer_size);
3788 if (
h->divx_packed) {
3789 int current_pos =
ctx->bitstream_buffer &&
h->gb.buffer ==
ctx->bitstream_buffer->data ? 0 : (
get_bits_count(&
h->gb) >> 3);
3790 int startcode_found = 0;
3791 uint8_t *buf =
pkt->data;
3792 int buf_size =
pkt->size;
3794 if (buf_size - current_pos > 7) {
3797 for (
i = current_pos;
i < buf_size - 4;
i++)
3802 buf[
i + 3] == 0xB6) {
3803 startcode_found = !(buf[
i + 4] & 0x40);
3808 if (startcode_found) {
3809 if (!
ctx->showed_packed_warning) {
3811 "wasteful way to store B-frames ('packed B-frames'). "
3812 "Consider using the mpeg4_unpack_bframes bitstream filter without encoding but stream copy to fix it.\n");
3813 ctx->showed_packed_warning = 1;
3819 ctx->bitstream_buffer->data = buf + current_pos;
3820 ctx->bitstream_buffer->size = buf_size - current_pos;
3830 memset(&
s->buffer_pools, 0,
sizeof(
s->buffer_pools));
3831 memset(&
s->next_pic, 0,
sizeof(
s->next_pic));
3832 memset(&
s->last_pic, 0,
sizeof(
s->last_pic));
3833 memset(&
s->cur_pic, 0,
sizeof(
s->cur_pic));
3835 memset(
s->thread_context, 0,
sizeof(
s->thread_context));
3837 s->ac_val_base =
NULL;
3839 memset(&
s->sc, 0,
sizeof(
s->sc));
3841 s->p_field_mv_table_base =
NULL;
3842 for (
int i = 0;
i < 2;
i++)
3843 for (
int j = 0; j < 2; j++)
3844 s->p_field_mv_table[
i][j] =
NULL;
3846 s->dc_val_base =
NULL;
3847 s->coded_block_base =
NULL;
3848 s->mbintra_table =
NULL;
3849 s->cbp_table =
NULL;
3850 s->pred_dir_table =
NULL;
3852 s->mbskip_table =
NULL;
3854 s->er.error_status_table =
NULL;
3855 s->er.er_temp_buffer =
NULL;
3856 s->mb_index2xy =
NULL;
3858 s->context_initialized = 0;
3859 s->context_reinit = 0;
3867 memcpy(
s, s1,
sizeof(*
s));
3885 int init =
s->h.c.context_initialized;
3889 ret = update_mpvctx(&
s->h.c, &s1->
h.
c);
3926 s->h.c.studio_profile = s1->
h.
c.studio_profile;
3945 h->c.quarter_sample = h1->
c.quarter_sample;
3952static av_cold void mpeg4_init_static(
void)
3967 for (
unsigned i = 0;
i < 12;
i++) {
4008 ctx->lavc_build = -1;
4027 h->decode_header = mpeg4_decode_picture_header;
4029 ctx->time_increment_bits = 4;
4030 ctx->quant_precision = 5;
4067#define OFFSET(x) offsetof(H263DecContext, x)
4068#define FLAGS AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY
4075static const AVClass mpeg4_class = {
4076 .class_name =
"MPEG4 Video Decoder",
4090 .close = mpeg4_close,
4095 .flush = mpeg4_flush,
4100 .p.priv_class = &mpeg4_class,
4102#if CONFIG_MPEG4_NVDEC_HWACCEL
4105#if CONFIG_MPEG4_NVDEC_CUARRAY_HWACCEL
4108#if CONFIG_MPEG4_VAAPI_HWACCEL
4111#if CONFIG_MPEG4_VDPAU_HWACCEL
4114#if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_mpeg4_decoder
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
#define FF_DEBUG_STARTCODE
#define FF_BUG_XVID_ILACE
#define FF_BUG_HPEL_CHROMA
#define FF_BUG_QPEL_CHROMA2
#define FF_BUG_DIRECT_BLOCKSIZE
#define FF_DEBUG_PICT_INFO
#define FF_BUG_AUTODETECT
autodetection
#define FF_BUG_NO_PADDING
#define FF_BUG_QPEL_CHROMA
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define i(width, name, range_min, range_max)
#define UPDATE_THREAD_CONTEXT(func)
#define UPDATE_THREAD_CONTEXT_FOR_USER(func)
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define ROUNDED_DIV(a, b)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
#define AV_EF_BITSTREAM
detect bitstream specification deviations
#define AV_PROFILE_UNKNOWN
#define AV_PROFILE_MPEG4_SIMPLE_STUDIO
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
#define AV_EF_IGNORE_ERR
ignore errors and continue
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
int(* init)(AVBSFContext *ctx)
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
static struct @346255127015250356166251341105367306144006377143 state
static const uint8_t bits[8]
static unsigned int show_bits_long(GetBitContext *s, int n)
Show 0-32 bits.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
#define GET_CACHE(name, gb)
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
#define SKIP_CACHE(name, gb, num)
#define CLOSE_READER(name, gb)
static int get_bits_left(GetBitContext *gb)
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define SHOW_UBITS(name, gb, num)
static unsigned int get_bits1(GetBitContext *s)
#define SHOW_SBITS(name, gb, num)
#define OPEN_READER(name, gb)
static void skip_bits(GetBitContext *s, int n)
#define SKIP_BITS(name, gb, num)
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)
#define UPDATE_CACHE(name, gb)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define LAST_SKIP_BITS(name, gb, num)
static const uint8_t * align_get_bits(GetBitContext *s)
static int get_bits_count(const GetBitContext *s)
static void skip_bits1(GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define SKIP_COUNTER(name, gb, num)
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
static int get_xbits(GetBitContext *s, int n)
Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define LIBAVUTIL_VERSION_INT
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
static void ff_h263_clean_intra_table_entries(MpegEncContext *s, int xy)
#define FF_ASPECT_EXTENDED
void ff_h263_init_rl_inter(void)
const AVRational ff_h263_pixel_aspect[16]
VLCElem ff_h263_inter_MCBPC_vlc[]
int ff_h263_decode_motion(H263DecContext *const h, int pred, int f_code)
#define SLICE_NOEND
no end marker or error found but mb count exceeded
VLCElem ff_h263_cbpy_vlc[]
#define INTRA_MCBPC_VLC_BITS
#define FRAME_SKIPPED
Frame is not coded.
VLCElem ff_h263_intra_MCBPC_vlc[]
#define INTER_MCBPC_VLC_BITS
#define HWACCEL_NVDEC_CUARRAY(codec)
#define HWACCEL_VDPAU(codec)
#define HWACCEL_NVDEC(codec)
#define HWACCEL_VAAPI(codec)
#define HWACCEL_VIDEOTOOLBOX(codec)
static const int16_t alpha[]
static void scale(int *out, const int *in, const int w, const int h, const int shift)
static av_cold int decode_init(AVCodecContext *avctx)
static int shift(int a, int b)
#define SLICE_END
end marker found
av_cold int ff_h263_decode_init(AVCodecContext *avctx)
int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_frame, AVPacket *avpkt)
av_cold void ff_permute_scantable(uint8_t dst[64], const uint8_t src[64], const uint8_t permutation[64])
common internal api header.
av_cold void ff_mpeg4videodsp_init(Mpeg4VideoDSPContext *c)
av_cold void ff_qpeldsp_init(QpelDSPContext *c)
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static int ff_thread_once(char *control, void(*routine)(void))
const uint8_t ff_zigzag_direct[64]
static const VLCElem * rl_vlc[2]
const uint8_t ff_sprite_trajectory_lens[15]
const uint8_t ff_mpeg4_DCtab_lum[13][2]
const uint8_t ff_mpeg4_studio_intra[12][24][2]
RLTable ff_mpeg4_rl_intra
const uint8_t ff_mb_type_b_tab[4][2]
const int16_t ff_mpeg4_default_intra_matrix[64]
const uint8_t ff_mpeg4_c_dc_scale_table[32]
const uint8_t ff_mpeg4_y_dc_scale_table[32]
const uint8_t ff_mpeg4_DCtab_chrom[13][2]
const uint8_t ff_mpeg4_studio_dc_chroma[19][2]
const int16_t ff_mpeg4_default_non_intra_matrix[64]
const uint8_t ff_mpeg4_studio_dc_luma[19][2]
const uint8_t ff_mpeg4_dc_threshold[8]
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
int ff_mpeg4_get_video_packet_prefix_length(enum AVPictureType pict_type, int f_code, int b_code)
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *gb)
static int mpeg4_decode_profile_level(MpegEncContext *s, GetBitContext *gb, int *profile, int *level)
static int mpeg4_decode_studio_mb(H263DecContext *const h)
static VLCElem sprite_trajectory[128]
static VLCElem dc_lum[512]
static VLCElem mb_type_b_vlc[16]
static int mpeg4_decode_dc(H263DecContext *const h, int n, int *dir_ptr)
Decode the dc value.
void ff_mpeg4_decode_studio(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int block_size, int uvlinesize, int dct_linesize, int dct_offset)
#define STUDIO_INTRA_BITS
static const int16_t mb_type_b_map[4]
static int decode_new_pred(Mpeg4DecContext *ctx, GetBitContext *gb)
static int read_quant_matrix_ext(MpegEncContext *s, GetBitContext *gb)
static void decode_smpte_tc(Mpeg4DecContext *ctx, GetBitContext *gb)
static int mpeg4_decode_partition_a(Mpeg4DecContext *ctx)
Decode first partition.
static int decode_studio_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb)
Decode the next studio vop header.
static int mpeg4_decode_partitioned_mb(H263DecContext *const h)
decode partition C of one MB.
static const uint8_t ac_state_tab[22][2]
static Mpeg4DecContext * h263_to_mpeg4(H263DecContext *h)
int ff_mpeg4_decode_partitions(H263DecContext *const h)
Decode the first and second partition.
#define MB_TYPE_B_VLC_BITS
int ff_mpeg4_parse_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header, int parse_only)
Decode MPEG-4 headers.
static int mpeg4_decode_visual_object(MpegEncContext *s, GetBitContext *gb)
static int mpeg4_decode_gop_header(MpegEncContext *s, GetBitContext *gb)
static void extension_and_user_data(MpegEncContext *s, GetBitContext *gb, int id)
int ff_mpeg4_decode_video_packet_header(H263DecContext *const h)
Decode the next video packet.
static int mpeg4_decode_mb(H263DecContext *const h)
static void next_start_code_studio(GetBitContext *gb)
static VLCElem studio_luma_dc[528]
static VLCElem studio_chroma_dc[528]
static int mpeg4_pred_dc(MpegEncContext *s, int n, int *dir_ptr)
Predict the dc.
static void gmc1_motion(MpegEncContext *s, const Mpeg4DecContext *ctx, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, uint8_t *const *ref_picture)
static const uint8_t mpeg4_block_count[4]
#define SPRITE_TRAJ_VLC_BITS
static int mpeg4_decode_dpcm_macroblock(Mpeg4DecContext *const ctx, int16_t macroblock[256], int n)
static int decode_studio_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb)
static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, int parse_only)
void ff_mpeg4_pred_ac(H263DecContext *const h, int16_t *block, int n, int dir)
Predict the ac.
static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb)
static int mpeg4_decode_block(Mpeg4DecContext *ctx, int16_t *block, int n, int coded, int intra, int use_intra_dc_vlc, int rvlc)
Decode a block.
static void mpeg4_load_default_matrices(MpegEncContext *s)
static void gmc_motion(MpegEncContext *s, const Mpeg4DecContext *ctx, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, uint8_t *const *ref_picture)
int ff_mpeg4_decode_studio_slice_header(H263DecContext *const h)
Decode the next video packet.
void ff_mpeg4_mcsel_motion(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, uint8_t *const *ref_picture)
static int decode_studiovisualobject(Mpeg4DecContext *ctx, GetBitContext *gb)
static const VLCElem * studio_intra_tab[12]
static int mpeg4_decode_studio_block(Mpeg4DecContext *const ctx, int32_t block[64], int n)
static int mpeg4_decode_partition_b(H263DecContext *const h, int mb_count)
decode second partition.
static VLCElem dc_chrom[512]
static int mpeg4_get_level_dc(MpegEncContext *s, int n, int pred, int level)
static void reset_studio_dc_predictors(Mpeg4DecContext *const ctx)
static int mpeg4_is_resync(Mpeg4DecContext *ctx)
check if the next stuff is a resync marker or the end.
static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb)
Decode the user data stuff in the header.
static int get_amv(Mpeg4DecContext *ctx, int n)
Get the average motion vector for a GMC MB.
int ff_mpeg4_frame_end(AVCodecContext *avctx, const AVPacket *pkt)
void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
#define QUANT_MATRIX_EXT_ID
#define ADV_SIMPLE_VO_TYPE
#define VOT_STILL_TEXTURE_ID
#define USER_DATA_STARTCODE
#define SIMPLE_STUDIO_VO_TYPE
#define CORE_STUDIO_VO_TYPE
#define VISUAL_OBJ_STARTCODE
#define MB_TYPE_BACKWARD_MV
#define HAS_BACKWARD_MV(a)
#define HAS_FORWARD_MV(a)
#define MB_TYPE_INTERLACED
#define MB_TYPE_FORWARD_MV
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
av_cold void ff_mpv_idct_init(MpegEncContext *s)
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
void ff_init_block_index(MpegEncContext *s)
static void ff_update_block_index(MpegEncContext *s, int bits_per_raw_sample, int lowres, int chroma_x_shift)
#define MV_TYPE_FIELD
2 vectors, one per field
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
void ff_init_scantable(const uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
#define MV_TYPE_16X16
1 vector for the whole mb
av_cold void ff_mpeg_flush(AVCodecContext *avctx)
av_cold int ff_mpv_decode_close(AVCodecContext *avctx)
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
update_thread_context for mpegvideo-based decoders.
#define ff_mpv_unquantize_init(s, bitexact, q_scale_type)
const uint8_t ff_alternate_horizontal_scan[64]
const uint8_t ff_alternate_vertical_scan[64]
mpegvideo decoder header.
static int mpeg_get_qscale(GetBitContext *const gb, int q_scale_type)
static int check_marker(void *logctx, GetBitContext *s, const char *msg)
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_JPEG
Full range content.
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV444P10
const AVProfile ff_mpeg4_video_profiles[]
#define SET_QPEL_FUNC(OP, X, Y, SIZE, CPU, PREFIX)
av_cold void ff_rl_init(RLTable *rl, uint8_t static_store[2][2 *MAX_RUN+MAX_LEVEL+3])
Initialize index_run, max_level and max_run from n, last, table_vlc, table_run and table_level.
#define VLC_INIT_RL(rl, static_size)
#define INIT_FIRST_VLC_RL(rl, static_size)
static const uint8_t header[24]
static const float pred[4]
Describe the class of an AVClass context structure.
main external API structure.
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
struct AVCodecInternal * internal
Private context used for internal data.
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
This structure stores compressed data.
int divx_packed
divx specific, used to workaround (many) bugs in divx5
int padding_bug_score
used to detect the VERY common padding bug in MPEG-4
int data_partitioning
data partitioning flag from header
void(* dct_unquantize_mpeg2_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_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
int sprite_brightness_change
int intra_dc_threshold
QP above which the ac VLC should be used for intra dc.
int time_increment_bits
number of bits to represent the fractional part of time
int num_sprite_warping_points
int showed_packed_warning
flag for having shown the warning about invalid Divx B-frames
int sprite_shift[2]
sprite shift [isChroma]
int cplx_estimation_trash_i
int sprite_warping_accuracy
int vol_control_parameters
does the stream contain the low_delay flag, used to work around buggy encoders.
uint16_t sprite_traj[4][2]
sprite trajectory points
int cplx_estimation_trash_p
int t_frame
time distance of first I -> B, used for interlaced B-frames
int cplx_estimation_trash_b
AVBufferRef * bitstream_buffer
Divx 5.01 puts several frames in a single one, this is used to reorder them.
int resync_marker
could this stream contain resync markers
int8_t * max_run[2]
encoding & decoding
int8_t * max_level[2]
encoding & decoding
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
static void clear_context(SwrContext *s)
#define avpriv_request_sample(...)
void ff_thread_progress_await(const ThreadProgress *pro_c, int n)
This function is a no-op in no-op mode; otherwise it waits until other threads have reached a certain...
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
static const AVOption mpeg4_options[]
av_cold const VLCElem * ff_vlc_init_tables_from_lengths(VLCInitState *state, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags)
#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
#define VLC_INIT_STATE(_table)
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
#define VLC_INIT_STATIC_SPARSE_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, symbols, symbols_wrap, symbols_size, flags)