Go to the documentation of this file.
23 #define UNCHECKED_BITSTREAM_READER 1
25 #include "config_components.h"
54 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
55 #define IS_3IV1 (s->codec_tag == AV_RL32("3IV1"))
64 #define SPRITE_TRAJ_VLC_BITS 6
66 #define MB_TYPE_B_VLC_BITS 4
67 #define STUDIO_INTRA_BITS 9
86 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
87 uint8_t *
const *ref_picture)
90 int src_x, src_y, motion_x, motion_y;
91 ptrdiff_t
offset, linesize, uvlinesize;
94 motion_x =
ctx->sprite_offset[0][0];
95 motion_y =
ctx->sprite_offset[0][1];
96 src_x =
s->mb_x * 16 + (motion_x >> (
ctx->sprite_warping_accuracy + 1));
97 src_y =
s->mb_y * 16 + (motion_y >> (
ctx->sprite_warping_accuracy + 1));
98 motion_x *= 1 << (3 -
ctx->sprite_warping_accuracy);
99 motion_y *= 1 << (3 -
ctx->sprite_warping_accuracy);
100 src_x =
av_clip(src_x, -16,
s->width);
101 if (src_x ==
s->width)
103 src_y =
av_clip(src_y, -16,
s->height);
104 if (src_y ==
s->height)
107 linesize =
s->linesize;
108 uvlinesize =
s->uvlinesize;
110 ptr = ref_picture[0] + src_y * linesize + src_x;
112 if ((
unsigned)src_x >=
FFMAX(
s->h_edge_pos - 17, 0) ||
113 (
unsigned)src_y >=
FFMAX(
s->v_edge_pos - 17, 0)) {
114 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
118 s->h_edge_pos,
s->v_edge_pos);
119 ptr =
s->sc.edge_emu_buffer;
122 if ((motion_x | motion_y) & 7) {
123 ctx->mdsp.gmc1(dest_y, ptr, linesize, 16,
124 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
125 ctx->mdsp.gmc1(dest_y + 8, ptr + 8, linesize, 16,
126 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
130 dxy = ((motion_x >> 3) & 1) | ((motion_y >> 2) & 2);
131 if (
s->no_rounding) {
132 s->hdsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
134 s->hdsp.put_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
141 motion_x =
ctx->sprite_offset[1][0];
142 motion_y =
ctx->sprite_offset[1][1];
143 src_x =
s->mb_x * 8 + (motion_x >> (
ctx->sprite_warping_accuracy + 1));
144 src_y =
s->mb_y * 8 + (motion_y >> (
ctx->sprite_warping_accuracy + 1));
145 motion_x *= 1 << (3 -
ctx->sprite_warping_accuracy);
146 motion_y *= 1 << (3 -
ctx->sprite_warping_accuracy);
147 src_x =
av_clip(src_x, -8,
s->width >> 1);
148 if (src_x ==
s->width >> 1)
150 src_y =
av_clip(src_y, -8,
s->height >> 1);
151 if (src_y ==
s->height >> 1)
154 offset = (src_y * uvlinesize) + src_x;
155 ptr = ref_picture[1] +
offset;
156 if ((
unsigned)src_x >=
FFMAX((
s->h_edge_pos >> 1) - 9, 0) ||
157 (unsigned)src_y >=
FFMAX((
s->v_edge_pos >> 1) - 9, 0)) {
158 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
159 uvlinesize, uvlinesize,
162 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
163 ptr =
s->sc.edge_emu_buffer;
166 ctx->mdsp.gmc1(dest_cb, ptr, uvlinesize, 8,
167 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
169 ptr = ref_picture[2] +
offset;
171 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
172 uvlinesize, uvlinesize,
175 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
176 ptr =
s->sc.edge_emu_buffer;
178 ctx->mdsp.gmc1(dest_cr, ptr, uvlinesize, 8,
179 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
183 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
184 uint8_t *
const *ref_picture)
187 int linesize, uvlinesize;
188 const int a =
ctx->sprite_warping_accuracy;
191 linesize =
s->linesize;
192 uvlinesize =
s->uvlinesize;
194 ptr = ref_picture[0];
196 ox =
ctx->sprite_offset[0][0] +
ctx->sprite_delta[0][0] *
s->mb_x * 16 +
197 ctx->sprite_delta[0][1] *
s->mb_y * 16;
198 oy =
ctx->sprite_offset[0][1] +
ctx->sprite_delta[1][0] *
s->mb_x * 16 +
199 ctx->sprite_delta[1][1] *
s->mb_y * 16;
201 ctx->mdsp.gmc(dest_y, ptr, linesize, 16,
203 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
204 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
205 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
206 s->h_edge_pos,
s->v_edge_pos);
207 ctx->mdsp.gmc(dest_y + 8, ptr, linesize, 16,
208 ox +
ctx->sprite_delta[0][0] * 8,
209 oy +
ctx->sprite_delta[1][0] * 8,
210 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
211 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
212 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
213 s->h_edge_pos,
s->v_edge_pos);
218 ox =
ctx->sprite_offset[1][0] +
ctx->sprite_delta[0][0] *
s->mb_x * 8 +
219 ctx->sprite_delta[0][1] *
s->mb_y * 8;
220 oy =
ctx->sprite_offset[1][1] +
ctx->sprite_delta[1][0] *
s->mb_x * 8 +
221 ctx->sprite_delta[1][1] *
s->mb_y * 8;
223 ptr = ref_picture[1];
224 ctx->mdsp.gmc(dest_cb, ptr, uvlinesize, 8,
226 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
227 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
228 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
229 (
s->h_edge_pos + 1) >> 1, (
s->v_edge_pos + 1) >> 1);
231 ptr = ref_picture[2];
232 ctx->mdsp.gmc(dest_cr, ptr, uvlinesize, 8,
234 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
235 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
236 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
237 (
s->h_edge_pos + 1) >> 1, (
s->v_edge_pos + 1) >> 1);
241 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
242 uint8_t *
const *ref_picture)
246 if (
ctx->real_sprite_warping_points == 1) {
256 uint8_t *dest_cr,
int block_size,
int uvlinesize,
257 int dct_linesize,
int dct_offset)
260 const int act_block_size = block_size * 2;
262 if (
ctx->dpcm_direction == 0) {
263 s->idsp.idct_put(dest_y, dct_linesize, (int16_t*)
ctx->block32[0]);
264 s->idsp.idct_put(dest_y + act_block_size, dct_linesize, (int16_t*)
ctx->block32[1]);
265 s->idsp.idct_put(dest_y + dct_offset, dct_linesize, (int16_t*)
ctx->block32[2]);
266 s->idsp.idct_put(dest_y + dct_offset + act_block_size, dct_linesize, (int16_t*)
ctx->block32[3]);
268 dct_linesize = uvlinesize <<
s->interlaced_dct;
269 dct_offset =
s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
271 s->idsp.idct_put(dest_cb, dct_linesize, (int16_t*)
ctx->block32[4]);
272 s->idsp.idct_put(dest_cr, dct_linesize, (int16_t*)
ctx->block32[5]);
273 s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, (int16_t*)
ctx->block32[6]);
274 s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, (int16_t*)
ctx->block32[7]);
275 if (!
s->chroma_x_shift){
276 s->idsp.idct_put(dest_cb + act_block_size, dct_linesize, (int16_t*)
ctx->block32[8]);
277 s->idsp.idct_put(dest_cr + act_block_size, dct_linesize, (int16_t*)
ctx->block32[9]);
278 s->idsp.idct_put(dest_cb + act_block_size + dct_offset, dct_linesize, (int16_t*)
ctx->block32[10]);
279 s->idsp.idct_put(dest_cr + act_block_size + dct_offset, dct_linesize, (int16_t*)
ctx->block32[11]);
281 }
else if (
ctx->dpcm_direction == 1) {
282 uint16_t *dest_pcm[3] = {(uint16_t*)dest_y, (uint16_t*)dest_cb, (uint16_t*)dest_cr};
283 int linesize[3] = {dct_linesize, uvlinesize, uvlinesize};
284 for (
int i = 0;
i < 3;
i++) {
285 const uint16_t *
src =
ctx->dpcm_macroblock[
i];
286 int vsub =
i ?
s->chroma_y_shift : 0;
287 int hsub =
i ?
s->chroma_x_shift : 0;
290 for (
int h = 0;
h < (16 >> (vsub +
lowres));
h++){
292 dest_pcm[
i][
w] =
src[idx];
293 dest_pcm[
i] += linesize[
i] / 2;
298 uint16_t *dest_pcm[3] = {(uint16_t*)dest_y, (uint16_t*)dest_cb, (uint16_t*)dest_cr};
299 int linesize[3] = {dct_linesize, uvlinesize, uvlinesize};
301 for (
int i = 0;
i < 3;
i++) {
302 const uint16_t *
src =
ctx->dpcm_macroblock[
i];
303 int vsub =
i ?
s->chroma_y_shift : 0;
304 int hsub =
i ?
s->chroma_x_shift : 0;
307 dest_pcm[
i] += (linesize[
i] / 2) * ((16 >> vsub +
lowres) - 1);
308 for (
int h = (16 >> (vsub +
lowres)) - 1;
h >= 0;
h--){
310 dest_pcm[
i][
w] =
src[idx];
312 dest_pcm[
i] -= linesize[
i] / 2;
326 int16_t *ac_val, *ac_val1;
327 int8_t *
const qscale_table =
s->cur_pic.qscale_table;
330 ac_val = &
s->ac_val[0][0][0] +
s->block_index[n] * 16;
334 const int xy =
s->mb_x - 1 +
s->mb_y *
s->mb_stride;
338 if (
s->mb_x == 0 ||
s->qscale == qscale_table[xy] ||
341 for (
i = 1;
i < 8;
i++)
342 block[
s->idsp.idct_permutation[
i << 3]] += ac_val[
i];
345 for (
i = 1;
i < 8;
i++)
346 block[
s->idsp.idct_permutation[
i << 3]] +=
ROUNDED_DIV(ac_val[
i] * qscale_table[xy],
s->qscale);
349 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride -
s->mb_stride;
351 ac_val -= 16 *
s->block_wrap[n];
353 if (
s->mb_y == 0 ||
s->qscale == qscale_table[xy] ||
356 for (
i = 1;
i < 8;
i++)
357 block[
s->idsp.idct_permutation[
i]] += ac_val[
i + 8];
360 for (
i = 1;
i < 8;
i++)
366 for (
i = 1;
i < 8;
i++)
367 ac_val1[
i] =
block[
s->idsp.idct_permutation[
i << 3]];
371 ac_val1[8 +
i] =
block[
s->idsp.idct_permutation[
i]];
389 (v >> (8 -
s->pict_type) != 1) ||
s->partitioned_frame)
392 bits_count += 8 +
s->pict_type;
396 if (bits_count + 8 >=
s->gb.size_in_bits) {
398 v |= 0x7F >> (7 - (bits_count & 7));
403 static const uint16_t mpeg4_resync_prefix[8] = {
404 0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000
407 if (v == mpeg4_resync_prefix[bits_count & 7]) {
409 int mb_num_bits =
av_log2(
s->mb_num - 1) + 1;
420 if (!mb_num || mb_num >
s->mb_num ||
get_bits_count(&
s->gb)+6 >
s->gb.size_in_bits)
435 int a = 2 <<
ctx->sprite_warping_accuracy;
436 int rho = 3 -
ctx->sprite_warping_accuracy;
442 int min_ab,
i, w2, h2, w3, h3;
443 int sprite_ref[4][2];
444 int virtual_ref[2][2];
449 const int vop_ref[4][2] = { { 0, 0 }, {
s->width, 0 },
450 { 0,
s->height }, {
s->width,
s->height } };
451 int d[4][2] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
453 if (
w <= 0 ||
h <= 0)
456 for (
i = 0;
i <
ctx->num_sprite_warping_points;
i++) {
464 if (!(
ctx->divx_version == 500 &&
ctx->divx_build == 413))
472 ctx->sprite_traj[
i][0] = d[
i][0] = x;
473 ctx->sprite_traj[
i][1] = d[
i][1] = y;
476 ctx->sprite_traj[
i][0] =
ctx->sprite_traj[
i][1] = 0;
480 while ((1 << beta) <
h)
486 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413) {
487 sprite_ref[0][0] =
a * vop_ref[0][0] + d[0][0];
488 sprite_ref[0][1] =
a * vop_ref[0][1] + d[0][1];
489 sprite_ref[1][0] =
a * vop_ref[1][0] + d[0][0] + d[1][0];
490 sprite_ref[1][1] =
a * vop_ref[1][1] + d[0][1] + d[1][1];
491 sprite_ref[2][0] =
a * vop_ref[2][0] + d[0][0] + d[2][0];
492 sprite_ref[2][1] =
a * vop_ref[2][1] + d[0][1] + d[2][1];
494 sprite_ref[0][0] = (
a >> 1) * (2 * vop_ref[0][0] + d[0][0]);
495 sprite_ref[0][1] = (
a >> 1) * (2 * vop_ref[0][1] + d[0][1]);
496 sprite_ref[1][0] = (
a >> 1) * (2 * vop_ref[1][0] + d[0][0] + d[1][0]);
497 sprite_ref[1][1] = (
a >> 1) * (2 * vop_ref[1][1] + d[0][1] + d[1][1]);
498 sprite_ref[2][0] = (
a >> 1) * (2 * vop_ref[2][0] + d[0][0] + d[2][0]);
499 sprite_ref[2][1] = (
a >> 1) * (2 * vop_ref[2][1] + d[0][1] + d[2][1]);
509 virtual_ref[0][0] = 16 * (vop_ref[0][0] + w2) +
511 (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
512 w2 * (
r * sprite_ref[1][0] - 16LL * vop_ref[1][0])),
w);
513 virtual_ref[0][1] = 16 * vop_ref[0][1] +
515 (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
516 w2 * (
r * sprite_ref[1][1] - 16LL * vop_ref[1][1])),
w);
517 virtual_ref[1][0] = 16 * vop_ref[0][0] +
518 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
519 h2 * (
r * sprite_ref[2][0] - 16LL * vop_ref[2][0])),
h);
520 virtual_ref[1][1] = 16 * (vop_ref[0][1] + h2) +
521 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
522 h2 * (
r * sprite_ref[2][1] - 16LL * vop_ref[2][1])),
h);
524 switch (
ctx->num_sprite_warping_points) {
526 sprite_offset[0][0] =
527 sprite_offset[0][1] =
528 sprite_offset[1][0] =
529 sprite_offset[1][1] = 0;
530 sprite_delta[0][0] =
a;
532 sprite_delta[1][0] = 0;
533 sprite_delta[1][1] =
a;
534 ctx->sprite_shift[0] =
535 ctx->sprite_shift[1] = 0;
538 sprite_offset[0][0] = sprite_ref[0][0] -
a * vop_ref[0][0];
539 sprite_offset[0][1] = sprite_ref[0][1] -
a * vop_ref[0][1];
540 sprite_offset[1][0] = ((sprite_ref[0][0] >> 1) | (sprite_ref[0][0] & 1)) -
541 a * (vop_ref[0][0] / 2);
542 sprite_offset[1][1] = ((sprite_ref[0][1] >> 1) | (sprite_ref[0][1] & 1)) -
543 a * (vop_ref[0][1] / 2);
544 sprite_delta[0][0] =
a;
546 sprite_delta[1][0] = 0;
547 sprite_delta[1][1] =
a;
548 ctx->sprite_shift[0] =
549 ctx->sprite_shift[1] = 0;
552 sprite_offset[0][0] = ((
int64_t) sprite_ref[0][0] * (1 <<
alpha + rho)) +
553 ((
int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
555 ((
int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
557 sprite_offset[0][1] = ((
int64_t) sprite_ref[0][1] * (1 <<
alpha + rho)) +
558 ((
int64_t) -
r * sprite_ref[0][1] + virtual_ref[0][1]) *
560 ((
int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
562 sprite_offset[1][0] = (((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
563 ((
int64_t)-2 * vop_ref[0][0] + 1) +
564 ((
int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
565 ((
int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
566 (
int64_t) sprite_ref[0][0] - 16 * w2 + (1 << (
alpha + rho + 1)));
567 sprite_offset[1][1] = (((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) *
568 ((
int64_t)-2 * vop_ref[0][0] + 1) +
569 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
570 ((
int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
571 (
int64_t) sprite_ref[0][1] - 16 * w2 + (1 << (
alpha + rho + 1)));
572 sprite_delta[0][0] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
573 sprite_delta[0][1] = (+
r * sprite_ref[0][1] - virtual_ref[0][1]);
574 sprite_delta[1][0] = (-
r * sprite_ref[0][1] + virtual_ref[0][1]);
575 sprite_delta[1][1] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
578 ctx->sprite_shift[1] =
alpha + rho + 2;
584 sprite_offset[0][0] = ((
int64_t)sprite_ref[0][0] * (1 << (
alpha + beta + rho - min_ab))) +
585 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-vop_ref[0][0]) +
586 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-vop_ref[0][1]) +
588 sprite_offset[0][1] = ((
int64_t)sprite_ref[0][1] * (1 << (
alpha + beta + rho - min_ab))) +
589 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-vop_ref[0][0]) +
590 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-vop_ref[0][1]) +
592 sprite_offset[1][0] = ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-2 * vop_ref[0][0] + 1) +
593 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-2 * vop_ref[0][1] + 1) +
594 (
int64_t)2 * w2 * h3 *
r * sprite_ref[0][0] - 16 * w2 * h3 +
596 sprite_offset[1][1] = ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-2 * vop_ref[0][0] + 1) +
597 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-2 * vop_ref[0][1] + 1) +
598 (
int64_t)2 * w2 * h3 *
r * sprite_ref[0][1] - 16 * w2 * h3 +
600 sprite_delta[0][0] = (-
r * (
int64_t)sprite_ref[0][0] + virtual_ref[0][0]) * h3;
601 sprite_delta[0][1] = (-
r * (
int64_t)sprite_ref[0][0] + virtual_ref[1][0]) * w3;
602 sprite_delta[1][0] = (-
r * (
int64_t)sprite_ref[0][1] + virtual_ref[0][1]) * h3;
603 sprite_delta[1][1] = (-
r * (
int64_t)sprite_ref[0][1] + virtual_ref[1][1]) * w3;
605 ctx->sprite_shift[0] =
alpha + beta + rho - min_ab;
606 ctx->sprite_shift[1] =
alpha + beta + rho - min_ab + 2;
609 av_unreachable(
"num_sprite_warping_points outside of 0..3 results in an error"
610 "in which num_sprite_warping_points is reset to zero");
613 if (sprite_delta[0][0] ==
a <<
ctx->sprite_shift[0] &&
614 sprite_delta[0][1] == 0 &&
615 sprite_delta[1][0] == 0 &&
616 sprite_delta[1][1] ==
a <<
ctx->sprite_shift[0]) {
617 sprite_offset[0][0] >>=
ctx->sprite_shift[0];
618 sprite_offset[0][1] >>=
ctx->sprite_shift[0];
619 sprite_offset[1][0] >>=
ctx->sprite_shift[1];
620 sprite_offset[1][1] >>=
ctx->sprite_shift[1];
621 sprite_delta[0][0] =
a;
622 sprite_delta[0][1] = 0;
623 sprite_delta[1][0] = 0;
624 sprite_delta[1][1] =
a;
625 ctx->sprite_shift[0] = 0;
626 ctx->sprite_shift[1] = 0;
627 ctx->real_sprite_warping_points = 1;
629 int shift_y = 16 -
ctx->sprite_shift[0];
630 int shift_c = 16 -
ctx->sprite_shift[1];
632 for (
i = 0;
i < 2;
i++) {
633 if (shift_c < 0 || shift_y < 0 ||
634 FFABS( sprite_offset[0][
i]) >= INT_MAX >> shift_y ||
635 FFABS( sprite_offset[1][
i]) >= INT_MAX >> shift_c ||
636 FFABS( sprite_delta[0][
i]) >= INT_MAX >> shift_y ||
637 FFABS( sprite_delta[1][
i]) >= INT_MAX >> shift_y
644 for (
i = 0;
i < 2;
i++) {
645 sprite_offset[0][
i] *= 1 << shift_y;
646 sprite_offset[1][
i] *= 1 << shift_c;
647 sprite_delta[0][
i] *= 1 << shift_y;
648 sprite_delta[1][
i] *= 1 << shift_y;
649 ctx->sprite_shift[
i] = 16;
652 for (
i = 0;
i < 2;
i++) {
654 sprite_delta[
i][0] -
a * (1LL<<16),
655 sprite_delta[
i][1] -
a * (1LL<<16)
658 if (llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
659 llabs(sprite_offset[0][
i] + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
660 llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL) + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
661 llabs(sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
662 llabs(sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
663 llabs(sd[0]) >= INT_MAX ||
664 llabs(sd[1]) >= INT_MAX ||
665 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL)) >= INT_MAX ||
666 llabs(sprite_offset[0][
i] + sd[1] * (
h+16LL)) >= INT_MAX ||
667 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL) + sd[1] * (
h+16LL)) >= INT_MAX
673 ctx->real_sprite_warping_points =
ctx->num_sprite_warping_points;
676 for (
i = 0;
i < 4;
i++) {
677 ctx->sprite_offset[
i&1][
i>>1] = sprite_offset[
i&1][
i>>1];
678 ctx->sprite_delta [
i&1][
i>>1] = sprite_delta [
i&1][
i>>1];
683 memset(
ctx->sprite_offset, 0,
sizeof(
ctx->sprite_offset));
684 memset(
ctx->sprite_delta, 0,
sizeof(
ctx->sprite_delta));
708 int mb_num_bits =
av_log2(
s->mb_num - 1) + 1;
709 int header_extension = 0, mb_num,
len;
730 if (mb_num >=
s->mb_num || !mb_num) {
732 "illegal mb_num in video packet (%d %d) \n", mb_num,
s->mb_num);
736 s->mb_x = mb_num %
s->mb_width;
737 s->mb_y = mb_num /
s->mb_width;
742 s->chroma_qscale =
s->qscale = qscale;
748 if (header_extension) {
752 check_marker(
s->avctx, &
s->gb,
"before time_increment in video packed header");
754 check_marker(
s->avctx, &
s->gb,
"before vop_coding_type in video packed header");
775 "Error, video packet header damaged (f_code=0)\n");
781 "Error, video packet header damaged (b_code=0)\n");
796 s->last_dc[2] = 1 << (
s->avctx->bits_per_raw_sample +
s->dct_precision +
s->intra_dc_precision - 1);
811 vlc_len =
av_log2(
s->mb_width *
s->mb_height) + 1;
814 if (mb_num >=
s->mb_num)
817 s->mb_x = mb_num %
s->mb_width;
818 s->mb_y = mb_num /
s->mb_width;
848 int x, y, mb_v, sum, dx, dy,
shift;
849 int len = 1 << (
ctx->f_code + 4);
850 const int a =
ctx->sprite_warping_accuracy;
853 len >>=
s->quarter_sample;
855 if (
ctx->real_sprite_warping_points == 1) {
856 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413 &&
a >=
s->quarter_sample)
857 sum =
ctx->sprite_offset[0][n] / (1 << (
a -
s->quarter_sample));
859 sum =
RSHIFT(
ctx->sprite_offset[0][n] * (1 <<
s->quarter_sample),
a);
861 dx =
ctx->sprite_delta[n][0];
862 dy =
ctx->sprite_delta[n][1];
865 dy -= 1 << (
shift +
a + 1);
867 dx -= 1 << (
shift +
a + 1);
868 mb_v =
ctx->sprite_offset[0][n] + dx *
s->mb_x * 16
U + dy *
s->mb_y * 16
U;
871 for (y = 0; y < 16; y++) {
874 v = mb_v + (unsigned)dy * y;
876 for (x = 0; x < 16; x++) {
881 sum =
RSHIFT(sum,
a + 8 -
s->quarter_sample);
894 int scale = n < 4 ?
s->y_dc_scale :
s->c_dc_scale;
906 if (
level & (~2047)) {
910 "dc<0 at %dx%d\n",
s->mb_x,
s->mb_y);
915 "dc overflow at %dx%d\n",
s->mb_x,
s->mb_y);
924 s->dc_val[0][
s->block_index[n]] =
level;
987 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
990 s->first_slice_line = 1;
991 for (;
s->mb_y <
s->mb_height;
s->mb_y++) {
993 for (;
s->mb_x <
s->mb_width;
s->mb_x++) {
994 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1000 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1)
1001 s->first_slice_line = 0;
1013 "mcbpc corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1016 }
while (cbpc == 8);
1018 s->cbp_table[xy] = cbpc & 3;
1025 s->cur_pic.qscale_table[xy] =
s->qscale;
1027 s->mbintra_table[xy] = 1;
1028 for (
i = 0;
i < 6;
i++) {
1033 "DC corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1040 s->pred_dir_table[xy] = dir;
1043 int16_t *
const mot_val =
s->cur_pic.motion_val[0][
s->block_index[0]];
1044 const int stride =
s->b8_stride * 2;
1052 if (
bits & 0x10000) {
1077 if (
s->mbintra_table[xy])
1085 "mcbpc corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1091 s->cbp_table[xy] = cbpc & (8 + 3);
1093 s->mb_intra = ((cbpc & 4) != 0);
1097 s->mbintra_table[xy] = 1;
1107 if (
s->mbintra_table[xy])
1117 if ((cbpc & 16) == 0) {
1151 for (
i = 0;
i < 4;
i++) {
1180 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1182 s->mb_x =
s->resync_mb_x;
1183 s->first_slice_line = 1;
1184 for (
s->mb_y =
s->resync_mb_y; mb_num < mb_count; s->mb_y++) {
1186 for (; mb_num < mb_count &&
s->mb_x <
s->mb_width;
s->mb_x++) {
1187 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1191 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1)
1192 s->first_slice_line = 0;
1199 "cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1203 s->cbp_table[xy] |= cbpy << 2;
1214 "I cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1218 if (
s->cbp_table[xy] & 8)
1220 s->cur_pic.qscale_table[xy] =
s->qscale;
1222 for (
i = 0;
i < 6;
i++) {
1227 "DC corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1234 s->cbp_table[xy] &= 3;
1235 s->cbp_table[xy] |= cbpy << 2;
1237 s->pred_dir_table[xy] = dir;
1238 }
else if (
IS_SKIP(
s->cur_pic.mb_type[xy])) {
1239 s->cur_pic.qscale_table[xy] =
s->qscale;
1240 s->cbp_table[xy] = 0;
1246 "P cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1250 if (
s->cbp_table[xy] & 8)
1252 s->cur_pic.qscale_table[xy] =
s->qscale;
1254 s->cbp_table[xy] &= 3;
1255 s->cbp_table[xy] |= (cbpy ^ 0xf) << 2;
1259 if (mb_num >= mb_count)
1281 s->mb_x,
s->mb_y, part_a_error);
1285 if (
s->resync_mb_x +
s->resync_mb_y *
s->mb_width + mb_num >
s->mb_num) {
1288 s->mb_x,
s->mb_y, part_a_error);
1292 s->mb_num_left = mb_num;
1299 "marker missing after first I partition at %d %d\n",
1308 "marker missing after first P partition at %d %d\n",
1314 s->mb_x - 1,
s->mb_y, part_a_end);
1336 int n,
int coded,
int intra,
1337 int use_intra_dc_vlc,
int rvlc)
1344 const uint8_t *scan_table;
1350 if (use_intra_dc_vlc) {
1352 if (
s->partitioned_frame) {
1353 level =
s->dc_val[0][
s->block_index[n]];
1358 dc_pred_dir = (
s->pred_dir_table[
s->mb_x +
s->mb_y *
s->mb_stride] << n) & 32;
1381 if (dc_pred_dir == 0)
1382 scan_table =
s->permutated_intra_v_scantable;
1384 scan_table =
s->permutated_intra_h_scantable;
1386 scan_table =
s->intra_scantable.permutated;
1393 s->block_last_index[n] =
i;
1401 scan_table =
s->intra_scantable.permutated;
1403 if (
s->mpeg_quant) {
1411 qmul =
s->qscale << 1;
1412 qadd = (
s->qscale - 1) | 1;
1429 "1. marker bit missing in rvlc esc\n");
1442 "2. marker bit missing in rvlc esc\n");
1468 cache ^= 0xC0000000;
1470 if (cache & 0x80000000) {
1471 if (cache & 0x40000000) {
1486 "1. marker bit missing in 3. esc\n");
1497 "2. marker bit missing in 3. esc\n");
1506 if (
s->error_recognition >= FF_ER_COMPLIANT) {
1509 const int run1=
run - rl->
max_run[last][abs_level] - 1;
1510 if (abs_level <= rl->max_level[last][
run]) {
1514 if (
s->error_recognition > FF_ER_COMPLIANT) {
1515 if (abs_level <= rl->max_level[last][
run]*2) {
1519 if (run1 >= 0 && abs_level <= rl->max_level[last][run1]) {
1532 if ((
unsigned)(
level + 2048) > 4095) {
1536 "|level| overflow in 3. esc, qp=%d\n",
1570 ff_tlog(
s->avctx,
"dct[%d][%d] = %- 4d end?:%d\n", scan_table[
i&63]&7, scan_table[
i&63] >> 3,
level,
i>62);
1575 "ac-tex damaged at %d %d\n",
s->mb_x,
s->mb_y);
1590 if (!use_intra_dc_vlc) {
1600 s->block_last_index[n] =
i;
1611 int cbp, mb_type, use_intra_dc_vlc;
1612 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1616 mb_type =
s->cur_pic.mb_type[xy];
1617 cbp =
s->cbp_table[xy];
1619 use_intra_dc_vlc =
s->qscale <
ctx->intra_dc_threshold;
1621 if (
s->cur_pic.qscale_table[xy] !=
s->qscale)
1627 for (
i = 0;
i < 4;
i++) {
1628 s->mv[0][
i][0] =
s->cur_pic.motion_val[0][
s->block_index[
i]][0];
1629 s->mv[0][
i][1] =
s->cur_pic.motion_val[0][
s->block_index[
i]][1];
1635 for (
i = 0;
i < 6;
i++)
1636 s->block_last_index[
i] = -1;
1643 s->cur_pic.mbskip_table[xy] = 0;
1647 s->cur_pic.mbskip_table[xy] = 1;
1649 }
else if (
s->mb_intra) {
1651 }
else if (!
s->mb_intra) {
1668 s->bdsp.clear_blocks(
s->block[0]);
1670 for (
i = 0;
i < 6;
i++) {
1672 use_intra_dc_vlc,
ctx->rvlc) < 0) {
1674 "texture corrupted at %d %d %d\n",
1675 s->mb_x,
s->mb_y,
s->mb_intra);
1683 if (--
s->mb_num_left <= 0) {
1690 const int delta =
s->mb_x + 1 ==
s->mb_width ? 2 : 1;
1691 if (
s->cbp_table[xy +
delta])
1701 int cbpc, cbpy,
i, cbp, pred_x, pred_y,
mx,
my, dquant;
1702 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1703 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1715 for (
i = 0;
i < 6;
i++)
1716 s->block_last_index[
i] = -1;
1728 s->cur_pic.mbskip_table[xy] = 0;
1736 s->cur_pic.mbskip_table[xy] = 1;
1744 "mcbpc damaged at %d %d\n",
s->mb_x,
s->mb_y);
1747 }
while (cbpc == 20);
1749 s->bdsp.clear_blocks(
s->block[0]);
1751 s->mb_intra = ((cbpc & 4) != 0);
1763 "P cbpy damaged at %d %d\n",
s->mb_x,
s->mb_y);
1767 cbp = (cbpc & 3) | (cbpy << 2);
1770 if ((!
s->progressive_sequence) &&
1775 if ((cbpc & 16) == 0) {
1783 s->mv[0][0][0] =
mx;
1784 s->mv[0][0][1] =
my;
1785 }
else if ((!
s->progressive_sequence) &&
get_bits1(&
s->gb)) {
1796 for (
i = 0;
i < 2;
i++) {
1805 s->mv[0][
i][0] =
mx;
1806 s->mv[0][
i][1] =
my;
1822 s->mv[0][0][0] =
mx;
1823 s->mv[0][0][1] =
my;
1828 for (
i = 0;
i < 4;
i++) {
1837 s->mv[0][
i][0] =
mx;
1838 s->mv[0][
i][1] =
my;
1852 for (
i = 0;
i < 2;
i++) {
1853 s->last_mv[
i][0][0] =
1854 s->last_mv[
i][0][1] =
1855 s->last_mv[
i][1][0] =
1856 s->last_mv[
i][1][1] = 0;
1863 s->mb_skipped =
s->next_pic.mbskip_table[
s->mb_y *
s->mb_stride +
s->mb_x];
1865 if (
s->mb_skipped) {
1867 for (
i = 0;
i < 6;
i++)
1868 s->block_last_index[
i] = -1;
1897 s->bdsp.clear_blocks(
s->block[0]);
1906 if (!
s->progressive_sequence) {
1934 s->last_mv[0][1][0] =
1935 s->last_mv[0][0][0] =
1936 s->mv[0][0][0] =
mx;
1937 s->last_mv[0][1][1] =
1938 s->last_mv[0][0][1] =
1939 s->mv[0][0][1] =
my;
1947 s->last_mv[1][1][0] =
1948 s->last_mv[1][0][0] =
1949 s->mv[1][0][0] =
mx;
1950 s->last_mv[1][1][1] =
1951 s->last_mv[1][0][1] =
1952 s->mv[1][0][1] =
my;
1960 for (
i = 0;
i < 2;
i++) {
1963 s->last_mv[0][
i][0] =
1964 s->mv[0][
i][0] =
mx;
1965 s->last_mv[0][
i][1] = (
s->mv[0][
i][1] =
my) * 2;
1972 for (
i = 0;
i < 2;
i++) {
1975 s->last_mv[1][
i][0] =
1976 s->mv[1][
i][0] =
mx;
1977 s->last_mv[1][
i][1] = (
s->mv[1][
i][1] =
my) * 2;
1995 s->cur_pic.mb_type[xy] = mb_type;
1997 int use_intra_dc_vlc;
2003 "I cbpc damaged at %d %d\n",
s->mb_x,
s->mb_y);
2006 }
while (cbpc == 8);
2021 "I cbpy damaged at %d %d\n",
s->mb_x,
s->mb_y);
2024 cbp = (cbpc & 3) | (cbpy << 2);
2026 use_intra_dc_vlc =
s->qscale <
ctx->intra_dc_threshold;
2031 if (!
s->progressive_sequence)
2034 s->bdsp.clear_blocks(
s->block[0]);
2036 for (
i = 0;
i < 6;
i++) {
2038 1, use_intra_dc_vlc, 0) < 0)
2046 for (
i = 0;
i < 6;
i++) {
2056 if (
s->mb_x +
s->mb_y*
s->mb_width + 1 > next && (
s->avctx->err_recognition &
AV_EF_AGGRESSIVE)) {
2058 }
else if (
s->mb_x +
s->mb_y*
s->mb_width + 1 >= next)
2062 const int delta =
s->mb_x + 1 ==
s->mb_width ? 2 : 1;
2064 (
s->mb_x +
delta >=
s->mb_width)
2065 ?
FFMIN(
s->mb_y + 1,
s->mb_height - 1)
2067 if (
s->next_pic.mbskip_table[xy +
delta])
2118 int cc, dct_dc_size, dct_diff,
code, j, idx = 1, group = 0,
run = 0,
2119 additional_code_len, sign, mismatch;
2121 const uint8_t *
const scantable =
s->intra_scantable.permutated;
2122 const uint16_t *quant_matrix;
2124 const int min = -1 * (1 << (
s->avctx->bits_per_raw_sample + 6));
2125 const int max = ((1 << (
s->avctx->bits_per_raw_sample + 6)) - 1);
2126 int shift = 3 -
s->dct_precision;
2135 quant_matrix =
s->intra_matrix;
2142 quant_matrix =
s->chroma_intra_matrix;
2145 if (dct_dc_size == 0) {
2150 if (dct_dc_size > 8) {
2157 s->last_dc[cc] += dct_diff;
2160 block[0] =
s->last_dc[cc] * (8 >>
s->intra_dc_precision);
2162 block[0] =
s->last_dc[cc] * (8 >>
s->intra_dc_precision) * (8 >>
s->dct_precision);
2166 mismatch ^=
block[0];
2183 }
else if (group >= 1 && group <= 6) {
2185 run = 1 << additional_code_len;
2186 if (additional_code_len)
2190 }
else if (group >= 7 && group <= 12) {
2195 run = (1 << (additional_code_len - 1)) +
code;
2199 j = scantable[idx++];
2200 block[j] = sign ? 1 : -1;
2201 }
else if (group >= 13 && group <= 20) {
2205 j = scantable[idx++];
2207 }
else if (group == 21) {
2211 j = scantable[idx++];
2212 additional_code_len =
s->avctx->bits_per_raw_sample +
s->dct_precision + 4;
2213 flc =
get_bits(&
s->gb, additional_code_len);
2214 if (flc >> (additional_code_len-1))
2215 block[j] = -1 * (( flc ^ ((1 << additional_code_len) -1)) + 1);
2221 mismatch ^=
block[j];
2224 block[63] ^= mismatch & 1;
2231 int i, j,
w,
h, idx = 0;
2232 int block_mean, rice_parameter, rice_prefix_code, rice_suffix_code,
2233 dpcm_residual,
left, top, topleft, min_left_top, max_left_top, p, p2,
output;
2234 h = 16 >> (n ?
s->chroma_y_shift : 0);
2235 w = 16 >> (n ?
s->chroma_x_shift : 0);
2237 block_mean =
get_bits(&
s->gb,
s->avctx->bits_per_raw_sample);
2238 if (block_mean == 0){
2242 s->last_dc[n] = block_mean * (1 << (
s->dct_precision +
s->intra_dc_precision));
2245 if (rice_parameter == 0) {
2250 if (rice_parameter == 15)
2253 if (rice_parameter > 11) {
2258 for (
i = 0;
i <
h;
i++) {
2259 output = 1 << (
s->avctx->bits_per_raw_sample - 1);
2260 top = 1 << (
s->avctx->bits_per_raw_sample - 1);
2262 for (j = 0; j <
w; j++) {
2269 if (rice_prefix_code == 11)
2270 dpcm_residual =
get_bits(&
s->gb,
s->avctx->bits_per_raw_sample);
2272 if (rice_prefix_code == 12) {
2276 rice_suffix_code =
get_bitsz(&
s->gb, rice_parameter);
2277 dpcm_residual = (rice_prefix_code << rice_parameter) + rice_suffix_code;
2281 if (dpcm_residual & 1)
2282 dpcm_residual = (-1 * dpcm_residual) >> 1;
2284 dpcm_residual = (dpcm_residual >> 1);
2287 top = macroblock[idx-
w];
2289 p =
left + top - topleft;
2291 if (p < min_left_top)
2295 if (p > max_left_top)
2298 p2 = (
FFMIN(min_left_top, topleft) +
FFMAX(max_left_top, topleft)) >> 1;
2303 dpcm_residual *= -1;
2305 macroblock[idx++] =
output = (dpcm_residual + p) & ((1 <<
s->avctx->bits_per_raw_sample) - 1);
2317 ctx->dpcm_direction = 0;
2338 for (
i = 0;
i < 3;
i++) {
2362 int hours, minutes, seconds;
2374 s->time_base = seconds + 60*(minutes + 60*hours);
2398 int visual_object_type;
2399 int is_visual_object_identifier =
get_bits1(gb);
2401 if (is_visual_object_identifier) {
2404 visual_object_type =
get_bits(gb, 4);
2409 if (video_signal_type) {
2410 int video_range, color_description;
2417 if (color_description) {
2418 s->avctx->color_primaries =
get_bits(gb, 8);
2433 for (
i = 0;
i < 64;
i++) {
2434 int j =
s->idsp.idct_permutation[
i];
2436 s->intra_matrix[j] = v;
2437 s->chroma_intra_matrix[j] = v;
2440 s->inter_matrix[j] = v;
2441 s->chroma_inter_matrix[j] = v;
2453 for (
i = 0;
i < 64;
i++) {
2456 s->intra_matrix[j] = v;
2457 s->chroma_intra_matrix[j] = v;
2465 for (
i = 0;
i < 64;
i++) {
2474 for (
i = 0;
i < 64;
i++) {
2477 s->chroma_intra_matrix[j] = v;
2485 for (
i = 0;
i < 64;
i++) {
2497 uint8_t extension_type;
2515 int bits_per_raw_sample;
2516 int rgb, chroma_format;
2536 bits_per_raw_sample =
get_bits(gb, 4);
2537 if (bits_per_raw_sample == 10) {
2547 if (
rgb !=
ctx->rgb ||
s->chroma_format != chroma_format)
2548 s->context_reinit = 1;
2549 s->avctx->bits_per_raw_sample = bits_per_raw_sample;
2551 s->chroma_format = chroma_format;
2554 check_marker(
s->avctx, gb,
"before video_object_layer_width");
2556 check_marker(
s->avctx, gb,
"before video_object_layer_height");
2558 check_marker(
s->avctx, gb,
"after video_object_layer_height");
2562 if (
s->width &&
s->height &&
2564 s->context_reinit = 1;
2569 aspect_ratio_info =
get_bits(gb, 4);
2571 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2572 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2582 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2585 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2587 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2615 s->studio_profile = 1;
2618 }
else if (
s->studio_profile) {
2628 aspect_ratio_info =
get_bits(gb, 4);
2630 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2631 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2637 int chroma_format =
get_bits(gb, 2);
2648 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2651 check_marker(
s->avctx, gb,
"after first_half_vbv_occupancy");
2653 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2658 if (
s->picture_number == 0) {
2659 switch (
ctx->vo_type) {
2678 check_marker(
s->avctx, gb,
"before time_increment_resolution");
2680 s->avctx->framerate.num =
get_bits(gb, 16);
2681 if (!
s->avctx->framerate.num) {
2686 ctx->time_increment_bits =
av_log2(
s->avctx->framerate.num - 1) + 1;
2687 if (
ctx->time_increment_bits < 1)
2688 ctx->time_increment_bits = 1;
2693 s->avctx->framerate.den =
get_bits(gb,
ctx->time_increment_bits);
2695 s->avctx->framerate.den = 1;
2707 !(
s->width &&
s->codec_tag ==
AV_RL32(
"MP4S"))) {
2708 if (
s->width &&
s->height &&
2710 s->context_reinit = 1;
2716 s->progressive_sequence =
2718 s->interlaced_dct = 0;
2721 "MPEG-4 OBMC not supported (very likely buggy encoder)\n");
2742 if (
ctx->num_sprite_warping_points > 3) {
2744 "%d sprite_warping_points\n",
2745 ctx->num_sprite_warping_points);
2746 ctx->num_sprite_warping_points = 0;
2760 if (
ctx->quant_precision != 5)
2762 "quant precision %d\n",
ctx->quant_precision);
2763 if (
ctx->quant_precision < 3 ||
ctx->quant_precision > 9)
2764 ctx->quant_precision = 5;
2766 ctx->quant_precision = 5;
2779 for (
i = 0;
i < 64;
i++) {
2791 s->intra_matrix[j] = last;
2795 for (;
i < 64;
i++) {
2797 s->intra_matrix[j] = last;
2804 for (
i = 0;
i < 64;
i++) {
2816 s->inter_matrix[j] = v;
2820 for (;
i < 64;
i++) {
2822 s->inter_matrix[j] = last;
2832 s->quarter_sample = 0;
2841 int estimation_method =
get_bits(gb, 2);
2842 if (estimation_method < 2) {
2857 if (!
check_marker(
s->avctx, gb,
"in complexity estimation part 1")) {
2875 if (!
check_marker(
s->avctx, gb,
"in complexity estimation part 2")) {
2879 if (estimation_method == 1) {
2885 "Invalid Complexity estimation method %d\n",
2890 ctx->cplx_estimation_trash_i =
2891 ctx->cplx_estimation_trash_p =
2892 ctx->cplx_estimation_trash_b = 0;
2898 if (
s->data_partitioning)
2901 if (vo_ver_id != 1) {
2903 if (
ctx->new_pred) {
2910 "reduced resolution VOP not supported\n");
2917 if (
ctx->scalability) {
2919 int h_sampling_factor_n;
2920 int h_sampling_factor_m;
2921 int v_sampling_factor_n;
2922 int v_sampling_factor_m;
2927 h_sampling_factor_n =
get_bits(gb, 5);
2928 h_sampling_factor_m =
get_bits(gb, 5);
2929 v_sampling_factor_n =
get_bits(gb, 5);
2930 v_sampling_factor_m =
get_bits(gb, 5);
2933 if (h_sampling_factor_n == 0 || h_sampling_factor_m == 0 ||
2934 v_sampling_factor_n == 0 || v_sampling_factor_m == 0) {
2937 ctx->scalability = 0;
2947 av_log(
s->avctx,
AV_LOG_DEBUG,
"tb %d/%d, tincrbits:%d, qp_prec:%d, ps:%d, low_delay:%d %s%s%s%s\n",
2948 s->avctx->framerate.den,
s->avctx->framerate.num,
2949 ctx->time_increment_bits,
2950 ctx->quant_precision,
2951 s->progressive_sequence,
2953 ctx->scalability ?
"scalability " :
"" ,
s->quarter_sample ?
"qpel " :
"",
2954 s->data_partitioning ?
"partition " :
"",
ctx->rvlc ?
"rvlc " :
""
2971 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
2982 e = sscanf(buf,
"DivX%dBuild%d%c", &ver, &build, &last);
2984 e = sscanf(buf,
"DivX%db%d%c", &ver, &build, &last);
2986 ctx->divx_version = ver;
2987 ctx->divx_build = build;
2988 s->divx_packed = e == 3 && last ==
'p';
2992 e = sscanf(buf,
"FFmpe%*[^b]b%d", &build) + 3;
2994 e = sscanf(buf,
"FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
2996 e = sscanf(buf,
"Lavc%d.%d.%d", &ver, &ver2, &ver3) + 1;
2998 if (ver > 0xFFU || ver2 > 0xFFU || ver3 > 0xFFU) {
3000 "Unknown Lavc version string encountered, %d.%d.%d; "
3001 "clamping sub-version values to 8-bits.\n",
3004 build = ((ver & 0xFF) << 16) + ((ver2 & 0xFF) << 8) + (ver3 & 0xFF);
3008 if (strcmp(buf,
"ffmpeg") == 0)
3009 ctx->lavc_build = 4600;
3012 ctx->lavc_build = build;
3015 e = sscanf(buf,
"XviD%d", &build);
3017 ctx->xvid_build = build;
3023 const uint8_t new_perm[64],
3024 const uint8_t old_perm[64])
3029 for (
int i = 0;
i < 64; ++
i)
3036 uint8_t old_permutation[64];
3038 memcpy(old_permutation,
s->idsp.idct_permutation,
sizeof(old_permutation));
3044 s->idsp.idct_permutation);
3056 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1) {
3057 if (
s->codec_tag ==
AV_RL32(
"XVID") ||
3062 ctx->xvid_build = 0;
3065 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1)
3066 if (
s->codec_tag ==
AV_RL32(
"DIVX") &&
ctx->vo_type == 0 &&
3067 ctx->vol_control_parameters == 0)
3068 ctx->divx_version = 400;
3070 if (
ctx->xvid_build >= 0 &&
ctx->divx_version >= 0) {
3072 ctx->divx_build = -1;
3076 if (
s->codec_tag ==
AV_RL32(
"XVIX"))
3079 if (
s->codec_tag ==
AV_RL32(
"UMP4"))
3082 if (
ctx->divx_version >= 500 &&
ctx->divx_build < 1814)
3085 if (
ctx->divx_version > 502 &&
ctx->divx_build < 1814)
3088 if (
ctx->xvid_build <= 3
U)
3089 s->padding_bug_score = 256 * 256 * 256 * 64;
3091 if (
ctx->xvid_build <= 1
U)
3094 if (
ctx->xvid_build <= 12
U)
3097 if (
ctx->xvid_build <= 32
U)
3100 #define SET_QPEL_FUNC(postfix1, postfix2) \
3101 s->qdsp.put_ ## postfix1 = ff_put_ ## postfix2; \
3102 s->qdsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \
3103 s->qdsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
3105 if (
ctx->lavc_build < 4653
U)
3108 if (
ctx->lavc_build < 4655
U)
3111 if (
ctx->lavc_build < 4670
U)
3114 if (
ctx->lavc_build <= 4712
U)
3117 if ((
ctx->lavc_build&0xFF) >= 100) {
3118 if (
ctx->lavc_build > 3621476 &&
ctx->lavc_build < 3752552 &&
3119 (
ctx->lavc_build < 3752037 ||
ctx->lavc_build > 3752191)
3124 if (
ctx->divx_version >= 0)
3126 if (
ctx->divx_version == 501 &&
ctx->divx_build == 20020416)
3127 s->padding_bug_score = 256 * 256 * 256 * 64;
3129 if (
ctx->divx_version < 500
U)
3132 if (
ctx->divx_version >= 0)
3154 "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
3155 s->workaround_bugs,
ctx->lavc_build,
ctx->xvid_build,
3156 ctx->divx_version,
ctx->divx_build,
s->divx_packed ?
"p" :
"");
3158 if (CONFIG_MPEG4_DECODER &&
ctx->xvid_build >= 0 &&
3168 int time_incr, time_increment;
3180 if (
s->partitioned_frame)
3191 if (
ctx->time_increment_bits == 0 ||
3194 "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);
3196 for (
ctx->time_increment_bits = 1;
3197 ctx->time_increment_bits < 16;
3198 ctx->time_increment_bits++) {
3202 if ((
show_bits(gb,
ctx->time_increment_bits + 6) & 0x37) == 0x30)
3204 }
else if ((
show_bits(gb,
ctx->time_increment_bits + 5) & 0x1F) == 0x18)
3209 "time_increment_bits set to %d bits, based on bitstream analysis\n",
ctx->time_increment_bits);
3215 time_increment =
get_bits(gb,
ctx->time_increment_bits);
3218 s->last_time_base =
s->time_base;
3219 s->time_base += time_incr;
3220 s->time =
s->time_base * (
int64_t)
s->avctx->framerate.num + time_increment;
3222 if (
s->time <
s->last_non_b_time) {
3226 s->time +=
s->avctx->framerate.num;
3229 s->pp_time =
s->time -
s->last_non_b_time;
3230 s->last_non_b_time =
s->time;
3232 s->time = (
s->last_time_base + time_incr) * (
int64_t)
s->avctx->framerate.num + time_increment;
3233 s->pb_time =
s->pp_time - (
s->last_non_b_time -
s->time);
3234 if (
s->pp_time <=
s->pb_time ||
3235 s->pp_time <=
s->pp_time -
s->pb_time ||
3242 if (
ctx->t_frame == 0)
3243 ctx->t_frame =
s->pb_time;
3244 if (
ctx->t_frame == 0)
3250 if (
s->pp_field_time <=
s->pb_field_time ||
s->pb_field_time <= 1) {
3251 s->pb_field_time = 2;
3252 s->pp_field_time = 4;
3253 if (!
s->progressive_sequence)
3258 if (
s->avctx->framerate.den)
3270 s->skipped_last_frame = 1;
3317 if (!
s->progressive_sequence) {
3321 s->alternate_scan = 0;
3329 if (
s->alternate_scan) {
3332 s->idsp.idct_permutation);
3336 s->idsp.idct_permutation);
3339 s->idsp.idct_permutation);
3346 if (
ctx->sprite_brightness_change)
3348 "sprite_brightness_change not supported\n");
3352 memset(
ctx->sprite_offset, 0,
sizeof(
ctx->sprite_offset));
3353 memset(
ctx->sprite_delta, 0,
sizeof(
ctx->sprite_delta));
3360 s->chroma_qscale =
s->qscale =
get_bits(gb,
ctx->quant_precision);
3361 if (
s->qscale == 0) {
3363 "Error, header damaged or not MPEG-4 header (qscale=0)\n");
3369 if (
ctx->f_code == 0) {
3371 "Error, header damaged or not MPEG-4 header (f_code=0)\n");
3379 if (
ctx->b_code == 0) {
3381 "Error, header damaged or not MPEG4 header (b_code=0)\n");
3389 "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",
3390 s->qscale,
ctx->f_code,
ctx->b_code,
3393 s->top_field_first,
s->quarter_sample ?
'q' :
'h',
3394 s->data_partitioning,
ctx->resync_marker,
3395 ctx->num_sprite_warping_points,
ctx->sprite_warping_accuracy,
3396 1 -
s->no_rounding,
ctx->vo_type,
3397 ctx->vol_control_parameters ?
" VOLC" :
" ",
ctx->intra_dc_threshold,
3398 ctx->cplx_estimation_trash_i,
ctx->cplx_estimation_trash_p,
3399 ctx->cplx_estimation_trash_b,
3405 if (!
ctx->scalability) {
3409 if (
ctx->enhancement_type) {
3410 int load_backward_shape =
get_bits1(gb);
3411 if (load_backward_shape)
3413 "load backward shape isn't supported\n");
3419 s->dct_unquantize_intra =
s->mpeg_quant ?
ctx->dct_unquantize_mpeg2_intra
3420 :
ctx->dct_unquantize_h263_intra;
3426 if (
ctx->vo_type == 0 &&
ctx->vol_control_parameters == 0 &&
3427 ctx->divx_version == -1 &&
s->picture_number == 0) {
3429 "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
3433 s->picture_number++;
3436 s->h_edge_pos =
s->width;
3437 s->v_edge_pos =
s->height;
3468 s->partitioned_frame = 0;
3469 s->interlaced_dct = 0;
3492 s->intra_dc_precision =
get_bits(gb, 2);
3510 int visual_object_type;
3513 visual_object_type =
get_bits(gb, 4);
3536 int header,
int parse_only)
3539 unsigned startcode, v;
3549 if (!
s->studio_profile &&
s->avctx->bits_per_raw_sample != 8)
3550 s->avctx->bits_per_raw_sample = 0;
3562 (
ctx->divx_version >= 0 ||
ctx->xvid_build >= 0) ||
s->codec_tag ==
AV_RL32(
"QMP4")) {
3573 startcode = ((startcode << 8) | v) & 0xffffffff;
3575 if ((startcode & 0xFFFFFF00) != 0x100)
3580 if (startcode <= 0x11F)
3581 name =
"Video Object Start";
3582 else if (startcode <= 0x12F)
3583 name =
"Video Object Layer Start";
3584 else if (startcode <= 0x13F)
3586 else if (startcode <= 0x15F)
3587 name =
"FGS bp start";
3588 else if (startcode <= 0x1AF)
3590 else if (startcode == 0x1B0)
3591 name =
"Visual Object Seq Start";
3592 else if (startcode == 0x1B1)
3593 name =
"Visual Object Seq End";
3594 else if (startcode == 0x1B2)
3596 else if (startcode == 0x1B3)
3597 name =
"Group of VOP start";
3598 else if (startcode == 0x1B4)
3599 name =
"Video Session Error";
3600 else if (startcode == 0x1B5)
3601 name =
"Visual Object Start";
3602 else if (startcode == 0x1B6)
3603 name =
"Video Object Plane start";
3604 else if (startcode == 0x1B7)
3605 name =
"slice start";
3606 else if (startcode == 0x1B8)
3607 name =
"extension start";
3608 else if (startcode == 0x1B9)
3610 else if (startcode == 0x1BA)
3611 name =
"FBA Object start";
3612 else if (startcode == 0x1BB)
3613 name =
"FBA Object Plane start";
3614 else if (startcode == 0x1BC)
3615 name =
"Mesh Object start";
3616 else if (startcode == 0x1BD)
3617 name =
"Mesh Object Plane start";
3618 else if (startcode == 0x1BE)
3619 name =
"Still Texture Object start";
3620 else if (startcode == 0x1BF)
3621 name =
"Texture Spatial Layer start";
3622 else if (startcode == 0x1C0)
3623 name =
"Texture SNR Layer start";
3624 else if (startcode == 0x1C1)
3625 name =
"Texture Tile start";
3626 else if (startcode == 0x1C2)
3627 name =
"Texture Shape Layer start";
3628 else if (startcode == 0x1C3)
3629 name =
"stuffing start";
3630 else if (startcode <= 0x1C5)
3632 else if (startcode <= 0x1FF)
3633 name =
"System start";
3638 if (startcode >= 0x120 && startcode <= 0x12F) {
3655 s->studio_profile = 1;
3658 }
else if (
s->studio_profile) {
3665 if (
s->studio_profile) {
3682 if (
s->studio_profile) {
3683 if (!
s->avctx->bits_per_raw_sample) {
3696 s->skipped_last_frame = 0;
3698 if (
ctx->bitstream_buffer) {
3700 int bitstream_buffer_size =
ctx->bitstream_buffer->size;
3701 const uint8_t *buf =
s->gb.buffer;
3703 if (
s->divx_packed) {
3704 for (
int i = 0;
i < buf_size - 3;
i++) {
3705 if (buf[
i] == 0 && buf[
i+1] == 0 && buf[
i+2] == 1) {
3706 if (buf[
i+3] == 0xB0) {
3708 bitstream_buffer_size = 0;
3714 ctx->bitstream_buffer->size = 0;
3715 if (bitstream_buffer_size && (
s->divx_packed || buf_size <=
MAX_NVOP_SIZE)) {
3717 bitstream_buffer_size);
3736 if (
s->divx_packed) {
3737 int current_pos =
ctx->bitstream_buffer &&
s->gb.buffer ==
ctx->bitstream_buffer->data ? 0 : (
get_bits_count(&
s->gb) >> 3);
3738 int startcode_found = 0;
3742 if (buf_size - current_pos > 7) {
3745 for (
i = current_pos;
i < buf_size - 4;
i++)
3750 buf[
i + 3] == 0xB6) {
3751 startcode_found = !(buf[
i + 4] & 0x40);
3756 if (startcode_found) {
3757 if (!
ctx->showed_packed_warning) {
3759 "wasteful way to store B-frames ('packed B-frames'). "
3760 "Consider using the mpeg4_unpack_bframes bitstream filter without encoding but stream copy to fix it.\n");
3761 ctx->showed_packed_warning = 1;
3767 ctx->bitstream_buffer->data = buf + current_pos;
3768 ctx->bitstream_buffer->size = buf_size - current_pos;
3775 #if CONFIG_MPEG4_DECODER
3779 memset(&
s->buffer_pools, 0,
sizeof(
s->buffer_pools));
3780 memset(&
s->next_pic, 0,
sizeof(
s->next_pic));
3781 memset(&
s->last_pic, 0,
sizeof(
s->last_pic));
3782 memset(&
s->cur_pic, 0,
sizeof(
s->cur_pic));
3784 memset(
s->thread_context, 0,
sizeof(
s->thread_context));
3788 s->ac_val_base =
NULL;
3792 memset(&
s->sc, 0,
sizeof(
s->sc));
3794 s->p_field_mv_table_base =
NULL;
3795 for (
int i = 0;
i < 2;
i++)
3796 for (
int j = 0; j < 2; j++)
3797 s->p_field_mv_table[
i][j] =
NULL;
3799 s->dc_val_base =
NULL;
3800 s->coded_block_base =
NULL;
3801 s->mbintra_table =
NULL;
3802 s->cbp_table =
NULL;
3803 s->pred_dir_table =
NULL;
3805 s->mbskip_table =
NULL;
3807 s->er.error_status_table =
NULL;
3808 s->er.er_temp_buffer =
NULL;
3809 s->mb_index2xy =
NULL;
3811 s->context_initialized = 0;
3812 s->context_reinit = 0;
3820 memcpy(
s, s1,
sizeof(*
s));
3838 int init =
s->m.context_initialized;
3842 ret = update_mpvctx(&
s->m, &s1->
m);
3902 static av_cold void mpeg4_init_static(
void)
3918 for (
unsigned i = 0;
i < 12;
i++) {
3958 ctx->lavc_build = -1;
3978 ctx->time_increment_bits = 4;
3979 ctx->quant_precision = 5;
4016 #define OFFSET(x) offsetof(MpegEncContext, x)
4017 #define FLAGS AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY
4024 static const AVClass mpeg4_class = {
4039 .close = mpeg4_close,
4044 .flush = mpeg4_flush,
4049 .p.priv_class = &mpeg4_class,
4051 #if CONFIG_MPEG4_NVDEC_HWACCEL
4054 #if CONFIG_MPEG4_VAAPI_HWACCEL
4057 #if CONFIG_MPEG4_VDPAU_HWACCEL
4060 #if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
const AVProfile ff_mpeg4_video_profiles[]
#define MV_TYPE_16X16
1 vector for the whole mb
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
VLCElem ff_h263_cbpy_vlc[]
#define FF_ASPECT_EXTENDED
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
int sprite_warping_accuracy
int data_partitioning
data partitioning flag from header
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static unsigned int show_bits_long(GetBitContext *s, int n)
Show 0-32 bits.
static int get_bits_left(GetBitContext *gb)
av_cold void ff_xvid_idct_init(IDCTDSPContext *c, AVCodecContext *avctx)
int showed_packed_warning
flag for having shown the warning about invalid Divx B-frames
static const uint8_t mpeg4_block_count[4]
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
const uint8_t ff_sprite_trajectory_lens[15]
static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, int parse_only)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
av_cold void ff_qpeldsp_init(QpelDSPContext *c)
static int get_bits_count(const GetBitContext *s)
static const uint8_t ac_state_tab[22][2]
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
@ AVCOL_RANGE_JPEG
Full range content.
static int mpeg4_decode_studio_mb(MpegEncContext *s, int16_t block_[12][64])
int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx)
Decode the next video packet.
static int mpeg4_decode_gop_header(MpegEncContext *s, GetBitContext *gb)
#define CORE_STUDIO_VO_TYPE
static int decode_studiovisualobject(Mpeg4DecContext *ctx, GetBitContext *gb)
#define AV_LOG_VERBOSE
Detailed information.
void ff_clean_intra_table_entries(MpegEncContext *s)
Clean dc, ac for the current non-intra MB.
static av_cold void switch_to_xvid_idct(AVCodecContext *const avctx, MpegEncContext *const s)
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
void ff_init_block_index(MpegEncContext *s)
#define UPDATE_CACHE(name, gb)
int ff_mpeg4_get_video_packet_prefix_length(enum AVPictureType pict_type, int f_code, int b_code)
const FFCodec ff_mpeg4_decoder
#define FF_BUG_HPEL_CHROMA
static void decode_smpte_tc(Mpeg4DecContext *ctx, GetBitContext *gb)
static int mpeg4_decode_visual_object(MpegEncContext *s, GetBitContext *gb)
av_cold void ff_mpeg4_init_rl_intra(void)
#define FF_DEBUG_PICT_INFO
static int mpeg4_get_level_dc(MpegEncContext *s, int n, int pred, int level)
#define GET_CACHE(name, gb)
static void skip_bits(GetBitContext *s, int n)
static VLCElem studio_luma_dc[528]
av_cold void ff_permute_scantable(uint8_t dst[64], const uint8_t src[64], const uint8_t permutation[64])
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
const uint8_t ff_mpeg4_DCtab_chrom[13][2]
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb)
Decode the user data stuff in the header.
#define SKIP_CACHE(name, gb, num)
AVCodec p
The public AVCodec.
static int get_amv(Mpeg4DecContext *ctx, int n)
Get the average motion vector for a GMC MB.
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
#define MB_TYPE_B_VLC_BITS
#define STUDIO_INTRA_BITS
#define FF_BUG_QPEL_CHROMA2
#define AV_PIX_FMT_GBRP10
void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir)
Predict the ac.
const AVRational ff_h263_pixel_aspect[16]
#define AV_EF_BITSTREAM
detect bitstream specification deviations
static const VLCElem * studio_intra_tab[12]
int flags
AV_CODEC_FLAG_*.
void(* dct_unquantize_h263_intra)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
static int mpeg4_decode_profile_level(MpegEncContext *s, GetBitContext *gb, int *profile, int *level)
#define HWACCEL_VDPAU(codec)
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
#define VOT_STILL_TEXTURE_ID
#define SLICE_END
end marker found
#define AV_PIX_FMT_YUV444P10
int ff_h263_decode_motion(MpegEncContext *s, int pred, int f_code)
#define HAS_FORWARD_MV(a)
static int ff_thread_once(char *control, void(*routine)(void))
int sprite_brightness_change
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define INIT_FIRST_VLC_RL(rl, static_size)
int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx)
Decode the first and second partition.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define AV_PROFILE_UNKNOWN
static void extension_and_user_data(MpegEncContext *s, GetBitContext *gb, int id)
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
static VLCElem sprite_trajectory[128]
#define CLOSE_READER(name, gb)
av_cold void ff_mpeg_flush(AVCodecContext *avctx)
#define FF_CODEC_DECODE_CB(func)
int8_t * max_level[2]
encoding & decoding
void(* dct_unquantize_mpeg2_intra)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
int cplx_estimation_trash_b
#define SHOW_SBITS(name, gb, num)
#define FF_BUG_NO_PADDING
RLTable ff_mpeg4_rl_intra
#define AV_EF_IGNORE_ERR
ignore errors and continue
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64])
#define SKIP_BITS(name, gb, num)
AVBufferRef * bitstream_buffer
Divx 5.01 puts several frames in a single one, this is used to reorder them.
#define FF_BUG_DIRECT_BLOCKSIZE
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 CODEC_LONG_NAME(str)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *gb)
static const VLCElem * rl_vlc[2]
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
const uint8_t ff_mpeg4_DCtab_lum[13][2]
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
#define LIBAVUTIL_VERSION_INT
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 void mpeg4_load_default_matrices(MpegEncContext *s)
Describe the class of an AVClass context structure.
static const int16_t mb_type_b_map[4]
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
av_cold void ff_mpv_idct_init(MpegEncContext *s)
static int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int *dir_ptr)
Predict the dc.
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
av_cold int ff_mpv_decode_close(AVCodecContext *avctx)
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
static int mpeg4_decode_partitioned_mb(MpegEncContext *s, int16_t block[6][64])
decode partition C of one MB.
static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n)
struct AVCodecInternal * internal
Private context used for internal data.
#define SLICE_NOEND
no end marker or error found but mb count exceeded
#define ROUNDED_DIV(a, b)
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
static unsigned int get_bits1(GetBitContext *s)
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_frame, AVPacket *avpkt)
#define LAST_SKIP_BITS(name, gb, num)
VLCElem ff_h263_intra_MCBPC_vlc[]
#define SET_QPEL_FUNC(postfix1, postfix2)
#define ff_mpv_unquantize_init(s, bitexact, q_scale_type)
int cplx_estimation_trash_i
#define UPDATE_THREAD_CONTEXT(func)
const uint8_t ff_alternate_horizontal_scan[64]
#define AV_PIX_FMT_YUV422P10
static const AVOption mpeg4_options[]
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
#define VISUAL_OBJ_STARTCODE
const uint8_t ff_mpeg4_dc_threshold[8]
#define HAS_BACKWARD_MV(a)
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
#define ADV_SIMPLE_VO_TYPE
int ff_mpeg4_decode_picture_header(MpegEncContext *s)
static int mpeg4_decode_partition_a(Mpeg4DecContext *ctx)
Decode first partition.
int t_frame
time distance of first I -> B, used for interlaced B-frames
static int check_marker(void *logctx, GetBitContext *s, const char *msg)
int(* init)(AVBSFContext *ctx)
#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.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
const uint8_t ff_mpeg4_y_dc_scale_table[32]
static int shift(int a, int b)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
int sprite_shift[2]
sprite shift [isChroma]
#define FRAME_SKIPPED
Return value for header parsers if frame is not coded.
static void ff_update_block_index(MpegEncContext *s, int bits_per_raw_sample, int lowres, int chroma_x_shift)
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.
const int16_t ff_mpeg4_default_intra_matrix[64]
static int read_quant_matrix_ext(MpegEncContext *s, GetBitContext *gb)
#define AV_NOPTS_VALUE
Undefined timestamp value.
#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...
int quarter_sample
1->qpel, 0->half pel ME/MC
static const uint8_t header[24]
int ff_mpeg4_parse_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header, int parse_only)
Decode MPEG-4 headers.
#define MB_TYPE_INTERLACED
#define OPEN_READER(name, gb)
av_cold void ff_mpeg4videodsp_init(Mpeg4VideoDSPContext *c)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
const int16_t ff_mpeg4_default_non_intra_matrix[64]
void(* dct_unquantize_mpeg2_inter)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
#define MV_TYPE_FIELD
2 vectors, one per field
static int get_xbits(GetBitContext *s, int n)
Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
static void skip_bits1(GetBitContext *s)
#define HWACCEL_NVDEC(codec)
uint16_t sprite_traj[4][2]
sprite trajectory points
int cplx_estimation_trash_p
#define AV_LOG_INFO
Standard information.
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)
static av_cold void permute_quant_matrix(uint16_t matrix[64], const uint8_t new_perm[64], const uint8_t old_perm[64])
av_cold void ff_init_scantable(const uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
int time_increment_bits
number of bits to represent the fractional part of time
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
static int mpeg4_decode_dc(MpegEncContext *s, int n, int *dir_ptr)
Decode the dc value.
#define SKIP_COUNTER(name, gb, num)
int num_sprite_warping_points
void ff_mpeg4_mcsel_motion(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, uint8_t *const *ref_picture)
#define i(width, name, range_min, range_max)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
const uint8_t ff_alternate_vertical_scan[64]
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
int8_t * max_run[2]
encoding & decoding
int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)
Decode the next video packet.
#define INTRA_MCBPC_VLC_BITS
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define FF_BUG_AUTODETECT
autodetection
#define MB_TYPE_BACKWARD_MV
#define FF_DEBUG_STARTCODE
static av_cold int decode_init(AVCodecContext *avctx)
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
const char * name
Name of the codec implementation.
av_cold int ff_h263_decode_init(AVCodecContext *avctx)
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
int vol_control_parameters
does the stream contain the low_delay flag, used to work around buggy encoders.
#define AV_PROFILE_MPEG4_SIMPLE_STUDIO
#define FF_BUG_QPEL_CHROMA
#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)
static void clear_context(SwrContext *s)
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
#define HWACCEL_VIDEOTOOLBOX(codec)
#define SPRITE_TRAJ_VLC_BITS
const uint8_t ff_mpeg4_studio_dc_luma[19][2]
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)
const uint8_t ff_zigzag_direct[64]
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
static const float pred[4]
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
const uint8_t ff_mpeg4_studio_dc_chroma[19][2]
static const uint8_t * align_get_bits(GetBitContext *s)
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
update_thread_context for mpegvideo-based decoders.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your see the OFFSET() macro
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)
static VLCElem mb_type_b_vlc[16]
main external API structure.
static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count)
decode second partition.
#define SHOW_UBITS(name, gb, num)
const uint8_t ff_mb_type_b_tab[4][2]
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
int resync_marker
could this stream contain resync markers
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
static int decode_studio_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb)
#define USER_DATA_STARTCODE
static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb)
const av_cold 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)
static int mpeg4_is_resync(Mpeg4DecContext *ctx)
check if the next stuff is a resync marker or the end.
void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
static VLCElem studio_chroma_dc[528]
static int mpeg4_decode_dpcm_macroblock(MpegEncContext *s, int16_t macroblock[256], int n)
@ AV_PICTURE_TYPE_P
Predicted.
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Undefined Behavior In the C some operations are like signed integer overflow
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define FF_BUG_XVID_ILACE
VLCElem ff_h263_inter_MCBPC_vlc[]
#define avpriv_request_sample(...)
static void reset_studio_dc_predictors(MpegEncContext *s)
const uint8_t ff_mpeg4_c_dc_scale_table[32]
#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_RL(rl, static_size)
int ff_mpeg4_frame_end(AVCodecContext *avctx, const AVPacket *pkt)
static void scale(int *out, const int *in, const int w, const int h, const int shift)
static void next_start_code_studio(GetBitContext *gb)
#define VLC_INIT_STATE(_table)
static const int16_t alpha[]
This structure stores compressed data.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
static int decode_studio_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb)
Decode the next studio vop header.
static VLCElem dc_chrom[512]
static int mpeg_get_qscale(MpegEncContext *s)
#define HWACCEL_VAAPI(codec)
static VLCElem dc_lum[512]
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 SheerTable rgb[2]
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
The exact code depends on how similar the blocks are and how related they are to the block
#define UPDATE_THREAD_CONTEXT_FOR_USER(func)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int decode_new_pred(Mpeg4DecContext *ctx, GetBitContext *gb)
#define QUANT_MATRIX_EXT_ID
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
#define MB_TYPE_FORWARD_MV
RL_VLC_ELEM * rl_vlc[32]
decoding only
int intra_dc_threshold
QP above which the ac VLC should be used for intra dc.
#define INTER_MCBPC_VLC_BITS
#define SIMPLE_STUDIO_VO_TYPE
const uint8_t ff_mpeg4_studio_intra[12][24][2]