Go to the documentation of this file.
23 #define UNCHECKED_BITSTREAM_READER 1
25 #include "config_components.h"
52 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
53 #define IS_3IV1 (s->codec_tag == AV_RL32("3IV1"))
62 #define SPRITE_TRAJ_VLC_BITS 6
64 #define MB_TYPE_B_VLC_BITS 4
65 #define STUDIO_INTRA_BITS 9
84 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
85 uint8_t *
const *ref_picture)
88 int src_x, src_y, motion_x, motion_y;
89 ptrdiff_t
offset, linesize, uvlinesize;
92 motion_x =
ctx->sprite_offset[0][0];
93 motion_y =
ctx->sprite_offset[0][1];
94 src_x =
s->mb_x * 16 + (motion_x >> (
ctx->sprite_warping_accuracy + 1));
95 src_y =
s->mb_y * 16 + (motion_y >> (
ctx->sprite_warping_accuracy + 1));
96 motion_x *= 1 << (3 -
ctx->sprite_warping_accuracy);
97 motion_y *= 1 << (3 -
ctx->sprite_warping_accuracy);
98 src_x =
av_clip(src_x, -16,
s->width);
99 if (src_x ==
s->width)
101 src_y =
av_clip(src_y, -16,
s->height);
102 if (src_y ==
s->height)
105 linesize =
s->linesize;
106 uvlinesize =
s->uvlinesize;
108 ptr = ref_picture[0] + src_y * linesize + src_x;
110 if ((
unsigned)src_x >=
FFMAX(
s->h_edge_pos - 17, 0) ||
111 (
unsigned)src_y >=
FFMAX(
s->v_edge_pos - 17, 0)) {
112 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
116 s->h_edge_pos,
s->v_edge_pos);
117 ptr =
s->sc.edge_emu_buffer;
120 if ((motion_x | motion_y) & 7) {
121 ctx->mdsp.gmc1(dest_y, ptr, linesize, 16,
122 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
123 ctx->mdsp.gmc1(dest_y + 8, ptr + 8, linesize, 16,
124 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
128 dxy = ((motion_x >> 3) & 1) | ((motion_y >> 2) & 2);
129 if (
s->no_rounding) {
130 s->hdsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
132 s->hdsp.put_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
139 motion_x =
ctx->sprite_offset[1][0];
140 motion_y =
ctx->sprite_offset[1][1];
141 src_x =
s->mb_x * 8 + (motion_x >> (
ctx->sprite_warping_accuracy + 1));
142 src_y =
s->mb_y * 8 + (motion_y >> (
ctx->sprite_warping_accuracy + 1));
143 motion_x *= 1 << (3 -
ctx->sprite_warping_accuracy);
144 motion_y *= 1 << (3 -
ctx->sprite_warping_accuracy);
145 src_x =
av_clip(src_x, -8,
s->width >> 1);
146 if (src_x ==
s->width >> 1)
148 src_y =
av_clip(src_y, -8,
s->height >> 1);
149 if (src_y ==
s->height >> 1)
152 offset = (src_y * uvlinesize) + src_x;
153 ptr = ref_picture[1] +
offset;
154 if ((
unsigned)src_x >=
FFMAX((
s->h_edge_pos >> 1) - 9, 0) ||
155 (unsigned)src_y >=
FFMAX((
s->v_edge_pos >> 1) - 9, 0)) {
156 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
157 uvlinesize, uvlinesize,
160 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
161 ptr =
s->sc.edge_emu_buffer;
164 ctx->mdsp.gmc1(dest_cb, ptr, uvlinesize, 8,
165 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
167 ptr = ref_picture[2] +
offset;
169 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, ptr,
170 uvlinesize, uvlinesize,
173 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
174 ptr =
s->sc.edge_emu_buffer;
176 ctx->mdsp.gmc1(dest_cr, ptr, uvlinesize, 8,
177 motion_x & 15, motion_y & 15, 128 -
s->no_rounding);
181 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
182 uint8_t *
const *ref_picture)
185 int linesize, uvlinesize;
186 const int a =
ctx->sprite_warping_accuracy;
189 linesize =
s->linesize;
190 uvlinesize =
s->uvlinesize;
192 ptr = ref_picture[0];
194 ox =
ctx->sprite_offset[0][0] +
ctx->sprite_delta[0][0] *
s->mb_x * 16 +
195 ctx->sprite_delta[0][1] *
s->mb_y * 16;
196 oy =
ctx->sprite_offset[0][1] +
ctx->sprite_delta[1][0] *
s->mb_x * 16 +
197 ctx->sprite_delta[1][1] *
s->mb_y * 16;
199 ctx->mdsp.gmc(dest_y, ptr, linesize, 16,
201 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
202 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
203 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
204 s->h_edge_pos,
s->v_edge_pos);
205 ctx->mdsp.gmc(dest_y + 8, ptr, linesize, 16,
206 ox +
ctx->sprite_delta[0][0] * 8,
207 oy +
ctx->sprite_delta[1][0] * 8,
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);
216 ox =
ctx->sprite_offset[1][0] +
ctx->sprite_delta[0][0] *
s->mb_x * 8 +
217 ctx->sprite_delta[0][1] *
s->mb_y * 8;
218 oy =
ctx->sprite_offset[1][1] +
ctx->sprite_delta[1][0] *
s->mb_x * 8 +
219 ctx->sprite_delta[1][1] *
s->mb_y * 8;
221 ptr = ref_picture[1];
222 ctx->mdsp.gmc(dest_cb, ptr, uvlinesize, 8,
224 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
225 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
226 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
227 (
s->h_edge_pos + 1) >> 1, (
s->v_edge_pos + 1) >> 1);
229 ptr = ref_picture[2];
230 ctx->mdsp.gmc(dest_cr, ptr, uvlinesize, 8,
232 ctx->sprite_delta[0][0],
ctx->sprite_delta[0][1],
233 ctx->sprite_delta[1][0],
ctx->sprite_delta[1][1],
234 a + 1, (1 << (2 *
a + 1)) -
s->no_rounding,
235 (
s->h_edge_pos + 1) >> 1, (
s->v_edge_pos + 1) >> 1);
239 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
240 uint8_t *
const *ref_picture)
244 if (
ctx->real_sprite_warping_points == 1) {
254 uint8_t *dest_cr,
int block_size,
int uvlinesize,
255 int dct_linesize,
int dct_offset)
258 const int act_block_size = block_size * 2;
260 if (
ctx->dpcm_direction == 0) {
261 s->idsp.idct_put(dest_y, dct_linesize, (int16_t*)
ctx->block32[0]);
262 s->idsp.idct_put(dest_y + act_block_size, dct_linesize, (int16_t*)
ctx->block32[1]);
263 s->idsp.idct_put(dest_y + dct_offset, dct_linesize, (int16_t*)
ctx->block32[2]);
264 s->idsp.idct_put(dest_y + dct_offset + act_block_size, dct_linesize, (int16_t*)
ctx->block32[3]);
266 dct_linesize = uvlinesize <<
s->interlaced_dct;
267 dct_offset =
s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
269 s->idsp.idct_put(dest_cb, dct_linesize, (int16_t*)
ctx->block32[4]);
270 s->idsp.idct_put(dest_cr, dct_linesize, (int16_t*)
ctx->block32[5]);
271 s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, (int16_t*)
ctx->block32[6]);
272 s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, (int16_t*)
ctx->block32[7]);
273 if (!
s->chroma_x_shift){
274 s->idsp.idct_put(dest_cb + act_block_size, dct_linesize, (int16_t*)
ctx->block32[8]);
275 s->idsp.idct_put(dest_cr + act_block_size, dct_linesize, (int16_t*)
ctx->block32[9]);
276 s->idsp.idct_put(dest_cb + act_block_size + dct_offset, dct_linesize, (int16_t*)
ctx->block32[10]);
277 s->idsp.idct_put(dest_cr + act_block_size + dct_offset, dct_linesize, (int16_t*)
ctx->block32[11]);
279 }
else if (
ctx->dpcm_direction == 1) {
280 uint16_t *dest_pcm[3] = {(uint16_t*)dest_y, (uint16_t*)dest_cb, (uint16_t*)dest_cr};
281 int linesize[3] = {dct_linesize, uvlinesize, uvlinesize};
282 for (
int i = 0;
i < 3;
i++) {
283 const uint16_t *
src =
ctx->dpcm_macroblock[
i];
284 int vsub =
i ?
s->chroma_y_shift : 0;
285 int hsub =
i ?
s->chroma_x_shift : 0;
288 for (
int h = 0;
h < (16 >> (vsub +
lowres));
h++){
290 dest_pcm[
i][
w] =
src[idx];
291 dest_pcm[
i] += linesize[
i] / 2;
296 uint16_t *dest_pcm[3] = {(uint16_t*)dest_y, (uint16_t*)dest_cb, (uint16_t*)dest_cr};
297 int linesize[3] = {dct_linesize, uvlinesize, uvlinesize};
299 for (
int i = 0;
i < 3;
i++) {
300 const uint16_t *
src =
ctx->dpcm_macroblock[
i];
301 int vsub =
i ?
s->chroma_y_shift : 0;
302 int hsub =
i ?
s->chroma_x_shift : 0;
305 dest_pcm[
i] += (linesize[
i] / 2) * ((16 >> vsub +
lowres) - 1);
306 for (
int h = (16 >> (vsub +
lowres)) - 1;
h >= 0;
h--){
308 dest_pcm[
i][
w] =
src[idx];
310 dest_pcm[
i] -= linesize[
i] / 2;
324 int16_t *ac_val, *ac_val1;
325 int8_t *
const qscale_table =
s->cur_pic.qscale_table;
328 ac_val = &
s->ac_val[0][0][0] +
s->block_index[n] * 16;
332 const int xy =
s->mb_x - 1 +
s->mb_y *
s->mb_stride;
336 if (
s->mb_x == 0 ||
s->qscale == qscale_table[xy] ||
339 for (
i = 1;
i < 8;
i++)
340 block[
s->idsp.idct_permutation[
i << 3]] += ac_val[
i];
343 for (
i = 1;
i < 8;
i++)
344 block[
s->idsp.idct_permutation[
i << 3]] +=
ROUNDED_DIV(ac_val[
i] * qscale_table[xy],
s->qscale);
347 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride -
s->mb_stride;
349 ac_val -= 16 *
s->block_wrap[n];
351 if (
s->mb_y == 0 ||
s->qscale == qscale_table[xy] ||
354 for (
i = 1;
i < 8;
i++)
355 block[
s->idsp.idct_permutation[
i]] += ac_val[
i + 8];
358 for (
i = 1;
i < 8;
i++)
364 for (
i = 1;
i < 8;
i++)
365 ac_val1[
i] =
block[
s->idsp.idct_permutation[
i << 3]];
369 ac_val1[8 +
i] =
block[
s->idsp.idct_permutation[
i]];
387 (v >> (8 -
s->pict_type) != 1) ||
s->partitioned_frame)
390 bits_count += 8 +
s->pict_type;
394 if (bits_count + 8 >=
s->gb.size_in_bits) {
396 v |= 0x7F >> (7 - (bits_count & 7));
401 static const uint16_t mpeg4_resync_prefix[8] = {
402 0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000
405 if (v == mpeg4_resync_prefix[bits_count & 7]) {
407 int mb_num_bits =
av_log2(
s->mb_num - 1) + 1;
418 if (!mb_num || mb_num >
s->mb_num ||
get_bits_count(&
s->gb)+6 >
s->gb.size_in_bits)
433 int a = 2 <<
ctx->sprite_warping_accuracy;
434 int rho = 3 -
ctx->sprite_warping_accuracy;
440 int min_ab,
i, w2, h2, w3, h3;
441 int sprite_ref[4][2];
442 int virtual_ref[2][2];
447 const int vop_ref[4][2] = { { 0, 0 }, {
s->width, 0 },
448 { 0,
s->height }, {
s->width,
s->height } };
449 int d[4][2] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
451 if (
w <= 0 ||
h <= 0)
454 for (
i = 0;
i <
ctx->num_sprite_warping_points;
i++) {
462 if (!(
ctx->divx_version == 500 &&
ctx->divx_build == 413))
470 ctx->sprite_traj[
i][0] = d[
i][0] = x;
471 ctx->sprite_traj[
i][1] = d[
i][1] = y;
474 ctx->sprite_traj[
i][0] =
ctx->sprite_traj[
i][1] = 0;
478 while ((1 << beta) <
h)
484 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413) {
485 sprite_ref[0][0] =
a * vop_ref[0][0] + d[0][0];
486 sprite_ref[0][1] =
a * vop_ref[0][1] + d[0][1];
487 sprite_ref[1][0] =
a * vop_ref[1][0] + d[0][0] + d[1][0];
488 sprite_ref[1][1] =
a * vop_ref[1][1] + d[0][1] + d[1][1];
489 sprite_ref[2][0] =
a * vop_ref[2][0] + d[0][0] + d[2][0];
490 sprite_ref[2][1] =
a * vop_ref[2][1] + d[0][1] + d[2][1];
492 sprite_ref[0][0] = (
a >> 1) * (2 * vop_ref[0][0] + d[0][0]);
493 sprite_ref[0][1] = (
a >> 1) * (2 * vop_ref[0][1] + d[0][1]);
494 sprite_ref[1][0] = (
a >> 1) * (2 * vop_ref[1][0] + d[0][0] + d[1][0]);
495 sprite_ref[1][1] = (
a >> 1) * (2 * vop_ref[1][1] + d[0][1] + d[1][1]);
496 sprite_ref[2][0] = (
a >> 1) * (2 * vop_ref[2][0] + d[0][0] + d[2][0]);
497 sprite_ref[2][1] = (
a >> 1) * (2 * vop_ref[2][1] + d[0][1] + d[2][1]);
507 virtual_ref[0][0] = 16 * (vop_ref[0][0] + w2) +
509 (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
510 w2 * (
r * sprite_ref[1][0] - 16LL * vop_ref[1][0])),
w);
511 virtual_ref[0][1] = 16 * vop_ref[0][1] +
513 (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
514 w2 * (
r * sprite_ref[1][1] - 16LL * vop_ref[1][1])),
w);
515 virtual_ref[1][0] = 16 * vop_ref[0][0] +
516 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
517 h2 * (
r * sprite_ref[2][0] - 16LL * vop_ref[2][0])),
h);
518 virtual_ref[1][1] = 16 * (vop_ref[0][1] + h2) +
519 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
520 h2 * (
r * sprite_ref[2][1] - 16LL * vop_ref[2][1])),
h);
522 switch (
ctx->num_sprite_warping_points) {
524 sprite_offset[0][0] =
525 sprite_offset[0][1] =
526 sprite_offset[1][0] =
527 sprite_offset[1][1] = 0;
528 sprite_delta[0][0] =
a;
530 sprite_delta[1][0] = 0;
531 sprite_delta[1][1] =
a;
532 ctx->sprite_shift[0] =
533 ctx->sprite_shift[1] = 0;
536 sprite_offset[0][0] = sprite_ref[0][0] -
a * vop_ref[0][0];
537 sprite_offset[0][1] = sprite_ref[0][1] -
a * vop_ref[0][1];
538 sprite_offset[1][0] = ((sprite_ref[0][0] >> 1) | (sprite_ref[0][0] & 1)) -
539 a * (vop_ref[0][0] / 2);
540 sprite_offset[1][1] = ((sprite_ref[0][1] >> 1) | (sprite_ref[0][1] & 1)) -
541 a * (vop_ref[0][1] / 2);
542 sprite_delta[0][0] =
a;
544 sprite_delta[1][0] = 0;
545 sprite_delta[1][1] =
a;
546 ctx->sprite_shift[0] =
547 ctx->sprite_shift[1] = 0;
550 sprite_offset[0][0] = ((
int64_t) sprite_ref[0][0] * (1 <<
alpha + rho)) +
551 ((
int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
553 ((
int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
555 sprite_offset[0][1] = ((
int64_t) sprite_ref[0][1] * (1 <<
alpha + rho)) +
556 ((
int64_t) -
r * sprite_ref[0][1] + virtual_ref[0][1]) *
558 ((
int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
560 sprite_offset[1][0] = (((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
561 ((
int64_t)-2 * vop_ref[0][0] + 1) +
562 ((
int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
563 ((
int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
564 (
int64_t) sprite_ref[0][0] - 16 * w2 + (1 << (
alpha + rho + 1)));
565 sprite_offset[1][1] = (((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) *
566 ((
int64_t)-2 * vop_ref[0][0] + 1) +
567 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
568 ((
int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
569 (
int64_t) sprite_ref[0][1] - 16 * w2 + (1 << (
alpha + rho + 1)));
570 sprite_delta[0][0] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
571 sprite_delta[0][1] = (+
r * sprite_ref[0][1] - virtual_ref[0][1]);
572 sprite_delta[1][0] = (-
r * sprite_ref[0][1] + virtual_ref[0][1]);
573 sprite_delta[1][1] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
576 ctx->sprite_shift[1] =
alpha + rho + 2;
582 sprite_offset[0][0] = ((
int64_t)sprite_ref[0][0] * (1 << (
alpha + beta + rho - min_ab))) +
583 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-vop_ref[0][0]) +
584 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-vop_ref[0][1]) +
586 sprite_offset[0][1] = ((
int64_t)sprite_ref[0][1] * (1 << (
alpha + beta + rho - min_ab))) +
587 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-vop_ref[0][0]) +
588 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-vop_ref[0][1]) +
590 sprite_offset[1][0] = ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-2 * vop_ref[0][0] + 1) +
591 ((
int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-2 * vop_ref[0][1] + 1) +
592 (
int64_t)2 * w2 * h3 *
r * sprite_ref[0][0] - 16 * w2 * h3 +
594 sprite_offset[1][1] = ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-2 * vop_ref[0][0] + 1) +
595 ((
int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-2 * vop_ref[0][1] + 1) +
596 (
int64_t)2 * w2 * h3 *
r * sprite_ref[0][1] - 16 * w2 * h3 +
598 sprite_delta[0][0] = (-
r * (
int64_t)sprite_ref[0][0] + virtual_ref[0][0]) * h3;
599 sprite_delta[0][1] = (-
r * (
int64_t)sprite_ref[0][0] + virtual_ref[1][0]) * w3;
600 sprite_delta[1][0] = (-
r * (
int64_t)sprite_ref[0][1] + virtual_ref[0][1]) * h3;
601 sprite_delta[1][1] = (-
r * (
int64_t)sprite_ref[0][1] + virtual_ref[1][1]) * w3;
603 ctx->sprite_shift[0] =
alpha + beta + rho - min_ab;
604 ctx->sprite_shift[1] =
alpha + beta + rho - min_ab + 2;
610 if (sprite_delta[0][0] ==
a <<
ctx->sprite_shift[0] &&
611 sprite_delta[0][1] == 0 &&
612 sprite_delta[1][0] == 0 &&
613 sprite_delta[1][1] ==
a <<
ctx->sprite_shift[0]) {
614 sprite_offset[0][0] >>=
ctx->sprite_shift[0];
615 sprite_offset[0][1] >>=
ctx->sprite_shift[0];
616 sprite_offset[1][0] >>=
ctx->sprite_shift[1];
617 sprite_offset[1][1] >>=
ctx->sprite_shift[1];
618 sprite_delta[0][0] =
a;
619 sprite_delta[0][1] = 0;
620 sprite_delta[1][0] = 0;
621 sprite_delta[1][1] =
a;
622 ctx->sprite_shift[0] = 0;
623 ctx->sprite_shift[1] = 0;
624 ctx->real_sprite_warping_points = 1;
626 int shift_y = 16 -
ctx->sprite_shift[0];
627 int shift_c = 16 -
ctx->sprite_shift[1];
629 for (
i = 0;
i < 2;
i++) {
630 if (shift_c < 0 || shift_y < 0 ||
631 FFABS( sprite_offset[0][
i]) >= INT_MAX >> shift_y ||
632 FFABS( sprite_offset[1][
i]) >= INT_MAX >> shift_c ||
633 FFABS( sprite_delta[0][
i]) >= INT_MAX >> shift_y ||
634 FFABS( sprite_delta[1][
i]) >= INT_MAX >> shift_y
641 for (
i = 0;
i < 2;
i++) {
642 sprite_offset[0][
i] *= 1 << shift_y;
643 sprite_offset[1][
i] *= 1 << shift_c;
644 sprite_delta[0][
i] *= 1 << shift_y;
645 sprite_delta[1][
i] *= 1 << shift_y;
646 ctx->sprite_shift[
i] = 16;
649 for (
i = 0;
i < 2;
i++) {
651 sprite_delta[
i][0] -
a * (1LL<<16),
652 sprite_delta[
i][1] -
a * (1LL<<16)
655 if (llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
656 llabs(sprite_offset[0][
i] + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
657 llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL) + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
658 llabs(sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
659 llabs(sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
660 llabs(sd[0]) >= INT_MAX ||
661 llabs(sd[1]) >= INT_MAX ||
662 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL)) >= INT_MAX ||
663 llabs(sprite_offset[0][
i] + sd[1] * (
h+16LL)) >= INT_MAX ||
664 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL) + sd[1] * (
h+16LL)) >= INT_MAX
670 ctx->real_sprite_warping_points =
ctx->num_sprite_warping_points;
673 for (
i = 0;
i < 4;
i++) {
674 ctx->sprite_offset[
i&1][
i>>1] = sprite_offset[
i&1][
i>>1];
675 ctx->sprite_delta [
i&1][
i>>1] = sprite_delta [
i&1][
i>>1];
680 memset(
ctx->sprite_offset, 0,
sizeof(
ctx->sprite_offset));
681 memset(
ctx->sprite_delta, 0,
sizeof(
ctx->sprite_delta));
705 int mb_num_bits =
av_log2(
s->mb_num - 1) + 1;
706 int header_extension = 0, mb_num,
len;
727 if (mb_num >=
s->mb_num || !mb_num) {
729 "illegal mb_num in video packet (%d %d) \n", mb_num,
s->mb_num);
733 s->mb_x = mb_num %
s->mb_width;
734 s->mb_y = mb_num /
s->mb_width;
739 s->chroma_qscale =
s->qscale = qscale;
745 if (header_extension) {
749 check_marker(
s->avctx, &
s->gb,
"before time_increment in video packed header");
751 check_marker(
s->avctx, &
s->gb,
"before vop_coding_type in video packed header");
772 "Error, video packet header damaged (f_code=0)\n");
778 "Error, video packet header damaged (b_code=0)\n");
793 s->last_dc[2] = 1 << (
s->avctx->bits_per_raw_sample +
s->dct_precision +
s->intra_dc_precision - 1);
808 vlc_len =
av_log2(
s->mb_width *
s->mb_height) + 1;
811 if (mb_num >=
s->mb_num)
814 s->mb_x = mb_num %
s->mb_width;
815 s->mb_y = mb_num /
s->mb_width;
845 int x, y, mb_v, sum, dx, dy,
shift;
846 int len = 1 << (
s->f_code + 4);
847 const int a =
ctx->sprite_warping_accuracy;
850 len >>=
s->quarter_sample;
852 if (
ctx->real_sprite_warping_points == 1) {
853 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413 &&
a >=
s->quarter_sample)
854 sum =
ctx->sprite_offset[0][n] / (1 << (
a -
s->quarter_sample));
856 sum =
RSHIFT(
ctx->sprite_offset[0][n] * (1 <<
s->quarter_sample),
a);
858 dx =
ctx->sprite_delta[n][0];
859 dy =
ctx->sprite_delta[n][1];
862 dy -= 1 << (
shift +
a + 1);
864 dx -= 1 << (
shift +
a + 1);
865 mb_v =
ctx->sprite_offset[0][n] + dx *
s->mb_x * 16
U + dy *
s->mb_y * 16
U;
868 for (y = 0; y < 16; y++) {
871 v = mb_v + (unsigned)dy * y;
873 for (x = 0; x < 16; x++) {
878 sum =
RSHIFT(sum,
a + 8 -
s->quarter_sample);
891 int scale = n < 4 ?
s->y_dc_scale :
s->c_dc_scale;
903 if (
level & (~2047)) {
907 "dc<0 at %dx%d\n",
s->mb_x,
s->mb_y);
912 "dc overflow at %dx%d\n",
s->mb_x,
s->mb_y);
921 s->dc_val[0][
s->block_index[n]] =
level;
984 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
987 s->first_slice_line = 1;
988 for (;
s->mb_y <
s->mb_height;
s->mb_y++) {
990 for (;
s->mb_x <
s->mb_width;
s->mb_x++) {
991 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
997 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1)
998 s->first_slice_line = 0;
1010 "mcbpc corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1013 }
while (cbpc == 8);
1015 s->cbp_table[xy] = cbpc & 3;
1022 s->cur_pic.qscale_table[xy] =
s->qscale;
1024 s->mbintra_table[xy] = 1;
1025 for (
i = 0;
i < 6;
i++) {
1030 "DC corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1037 s->pred_dir_table[xy] = dir;
1040 int16_t *
const mot_val =
s->cur_pic.motion_val[0][
s->block_index[0]];
1041 const int stride =
s->b8_stride * 2;
1049 if (
bits & 0x10000) {
1074 if (
s->mbintra_table[xy])
1082 "mcbpc corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1088 s->cbp_table[xy] = cbpc & (8 + 3);
1090 s->mb_intra = ((cbpc & 4) != 0);
1094 s->mbintra_table[xy] = 1;
1104 if (
s->mbintra_table[xy])
1114 if ((cbpc & 16) == 0) {
1148 for (
i = 0;
i < 4;
i++) {
1177 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1179 s->mb_x =
s->resync_mb_x;
1180 s->first_slice_line = 1;
1181 for (
s->mb_y =
s->resync_mb_y; mb_num < mb_count; s->mb_y++) {
1183 for (; mb_num < mb_count &&
s->mb_x <
s->mb_width;
s->mb_x++) {
1184 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1188 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1)
1189 s->first_slice_line = 0;
1196 "cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1200 s->cbp_table[xy] |= cbpy << 2;
1211 "I cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1215 if (
s->cbp_table[xy] & 8)
1217 s->cur_pic.qscale_table[xy] =
s->qscale;
1219 for (
i = 0;
i < 6;
i++) {
1224 "DC corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1231 s->cbp_table[xy] &= 3;
1232 s->cbp_table[xy] |= cbpy << 2;
1234 s->pred_dir_table[xy] = dir;
1235 }
else if (
IS_SKIP(
s->cur_pic.mb_type[xy])) {
1236 s->cur_pic.qscale_table[xy] =
s->qscale;
1237 s->cbp_table[xy] = 0;
1243 "P cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
1247 if (
s->cbp_table[xy] & 8)
1249 s->cur_pic.qscale_table[xy] =
s->qscale;
1251 s->cbp_table[xy] &= 3;
1252 s->cbp_table[xy] |= (cbpy ^ 0xf) << 2;
1256 if (mb_num >= mb_count)
1278 s->mb_x,
s->mb_y, part_a_error);
1282 if (
s->resync_mb_x +
s->resync_mb_y *
s->mb_width + mb_num >
s->mb_num) {
1285 s->mb_x,
s->mb_y, part_a_error);
1289 s->mb_num_left = mb_num;
1296 "marker missing after first I partition at %d %d\n",
1305 "marker missing after first P partition at %d %d\n",
1311 s->mb_x - 1,
s->mb_y, part_a_end);
1333 int n,
int coded,
int intra,
1334 int use_intra_dc_vlc,
int rvlc)
1341 const uint8_t *scan_table;
1346 if (use_intra_dc_vlc) {
1348 if (
s->partitioned_frame) {
1349 level =
s->dc_val[0][
s->block_index[n]];
1354 dc_pred_dir = (
s->pred_dir_table[
s->mb_x +
s->mb_y *
s->mb_stride] << n) & 32;
1377 if (dc_pred_dir == 0)
1378 scan_table =
s->permutated_intra_v_scantable;
1380 scan_table =
s->permutated_intra_h_scantable;
1382 scan_table =
s->intra_scantable.permutated;
1389 s->block_last_index[n] =
i;
1397 scan_table =
s->intra_scantable.permutated;
1399 if (
s->mpeg_quant) {
1407 qmul =
s->qscale << 1;
1408 qadd = (
s->qscale - 1) | 1;
1425 "1. marker bit missing in rvlc esc\n");
1438 "2. marker bit missing in rvlc esc\n");
1464 cache ^= 0xC0000000;
1466 if (cache & 0x80000000) {
1467 if (cache & 0x40000000) {
1482 "1. marker bit missing in 3. esc\n");
1493 "2. marker bit missing in 3. esc\n");
1502 if (
s->error_recognition >= FF_ER_COMPLIANT) {
1505 const int run1=
run - rl->
max_run[last][abs_level] - 1;
1506 if (abs_level <= rl->max_level[last][
run]) {
1510 if (
s->error_recognition > FF_ER_COMPLIANT) {
1511 if (abs_level <= rl->max_level[last][
run]*2) {
1515 if (run1 >= 0 && abs_level <= rl->max_level[last][run1]) {
1528 if ((
unsigned)(
level + 2048) > 4095) {
1532 "|level| overflow in 3. esc, qp=%d\n",
1566 ff_tlog(
s->avctx,
"dct[%d][%d] = %- 4d end?:%d\n", scan_table[
i&63]&7, scan_table[
i&63] >> 3,
level,
i>62);
1571 "ac-tex damaged at %d %d\n",
s->mb_x,
s->mb_y);
1586 if (!use_intra_dc_vlc) {
1596 s->block_last_index[n] =
i;
1607 int cbp, mb_type, use_intra_dc_vlc;
1608 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1612 mb_type =
s->cur_pic.mb_type[xy];
1613 cbp =
s->cbp_table[xy];
1615 use_intra_dc_vlc =
s->qscale <
ctx->intra_dc_threshold;
1617 if (
s->cur_pic.qscale_table[xy] !=
s->qscale)
1623 for (
i = 0;
i < 4;
i++) {
1624 s->mv[0][
i][0] =
s->cur_pic.motion_val[0][
s->block_index[
i]][0];
1625 s->mv[0][
i][1] =
s->cur_pic.motion_val[0][
s->block_index[
i]][1];
1631 for (
i = 0;
i < 6;
i++)
1632 s->block_last_index[
i] = -1;
1639 s->cur_pic.mbskip_table[xy] = 0;
1643 s->cur_pic.mbskip_table[xy] = 1;
1645 }
else if (
s->mb_intra) {
1647 }
else if (!
s->mb_intra) {
1664 s->bdsp.clear_blocks(
s->block[0]);
1666 for (
i = 0;
i < 6;
i++) {
1668 use_intra_dc_vlc,
ctx->rvlc) < 0) {
1670 "texture corrupted at %d %d %d\n",
1671 s->mb_x,
s->mb_y,
s->mb_intra);
1679 if (--
s->mb_num_left <= 0) {
1686 const int delta =
s->mb_x + 1 ==
s->mb_width ? 2 : 1;
1687 if (
s->cbp_table[xy +
delta])
1697 int cbpc, cbpy,
i, cbp, pred_x, pred_y,
mx,
my, dquant;
1698 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1699 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1711 for (
i = 0;
i < 6;
i++)
1712 s->block_last_index[
i] = -1;
1724 s->cur_pic.mbskip_table[xy] = 0;
1732 s->cur_pic.mbskip_table[xy] = 1;
1740 "mcbpc damaged at %d %d\n",
s->mb_x,
s->mb_y);
1743 }
while (cbpc == 20);
1745 s->bdsp.clear_blocks(
s->block[0]);
1747 s->mb_intra = ((cbpc & 4) != 0);
1759 "P cbpy damaged at %d %d\n",
s->mb_x,
s->mb_y);
1763 cbp = (cbpc & 3) | (cbpy << 2);
1766 if ((!
s->progressive_sequence) &&
1771 if ((cbpc & 16) == 0) {
1779 s->mv[0][0][0] =
mx;
1780 s->mv[0][0][1] =
my;
1781 }
else if ((!
s->progressive_sequence) &&
get_bits1(&
s->gb)) {
1792 for (
i = 0;
i < 2;
i++) {
1801 s->mv[0][
i][0] =
mx;
1802 s->mv[0][
i][1] =
my;
1818 s->mv[0][0][0] =
mx;
1819 s->mv[0][0][1] =
my;
1824 for (
i = 0;
i < 4;
i++) {
1833 s->mv[0][
i][0] =
mx;
1834 s->mv[0][
i][1] =
my;
1848 for (
i = 0;
i < 2;
i++) {
1849 s->last_mv[
i][0][0] =
1850 s->last_mv[
i][0][1] =
1851 s->last_mv[
i][1][0] =
1852 s->last_mv[
i][1][1] = 0;
1859 s->mb_skipped =
s->next_pic.mbskip_table[
s->mb_y *
s->mb_stride +
s->mb_x];
1861 if (
s->mb_skipped) {
1863 for (
i = 0;
i < 6;
i++)
1864 s->block_last_index[
i] = -1;
1893 s->bdsp.clear_blocks(
s->block[0]);
1902 if (!
s->progressive_sequence) {
1930 s->last_mv[0][1][0] =
1931 s->last_mv[0][0][0] =
1932 s->mv[0][0][0] =
mx;
1933 s->last_mv[0][1][1] =
1934 s->last_mv[0][0][1] =
1935 s->mv[0][0][1] =
my;
1943 s->last_mv[1][1][0] =
1944 s->last_mv[1][0][0] =
1945 s->mv[1][0][0] =
mx;
1946 s->last_mv[1][1][1] =
1947 s->last_mv[1][0][1] =
1948 s->mv[1][0][1] =
my;
1956 for (
i = 0;
i < 2;
i++) {
1959 s->last_mv[0][
i][0] =
1960 s->mv[0][
i][0] =
mx;
1961 s->last_mv[0][
i][1] = (
s->mv[0][
i][1] =
my) * 2;
1968 for (
i = 0;
i < 2;
i++) {
1971 s->last_mv[1][
i][0] =
1972 s->mv[1][
i][0] =
mx;
1973 s->last_mv[1][
i][1] = (
s->mv[1][
i][1] =
my) * 2;
1991 s->cur_pic.mb_type[xy] = mb_type;
1993 int use_intra_dc_vlc;
1999 "I cbpc damaged at %d %d\n",
s->mb_x,
s->mb_y);
2002 }
while (cbpc == 8);
2017 "I cbpy damaged at %d %d\n",
s->mb_x,
s->mb_y);
2020 cbp = (cbpc & 3) | (cbpy << 2);
2022 use_intra_dc_vlc =
s->qscale <
ctx->intra_dc_threshold;
2027 if (!
s->progressive_sequence)
2030 s->bdsp.clear_blocks(
s->block[0]);
2032 for (
i = 0;
i < 6;
i++) {
2034 1, use_intra_dc_vlc, 0) < 0)
2042 for (
i = 0;
i < 6;
i++) {
2052 if (
s->mb_x +
s->mb_y*
s->mb_width + 1 > next && (
s->avctx->err_recognition &
AV_EF_AGGRESSIVE)) {
2054 }
else if (
s->mb_x +
s->mb_y*
s->mb_width + 1 >= next)
2058 const int delta =
s->mb_x + 1 ==
s->mb_width ? 2 : 1;
2060 (
s->mb_x +
delta >=
s->mb_width)
2061 ?
FFMIN(
s->mb_y + 1,
s->mb_height - 1)
2063 if (
s->next_pic.mbskip_table[xy +
delta])
2114 int cc, dct_dc_size, dct_diff,
code, j, idx = 1, group = 0,
run = 0,
2115 additional_code_len, sign, mismatch;
2117 const uint8_t *
const scantable =
s->intra_scantable.permutated;
2118 const uint16_t *quant_matrix;
2120 const int min = -1 * (1 << (
s->avctx->bits_per_raw_sample + 6));
2121 const int max = ((1 << (
s->avctx->bits_per_raw_sample + 6)) - 1);
2122 int shift = 3 -
s->dct_precision;
2131 quant_matrix =
s->intra_matrix;
2138 quant_matrix =
s->chroma_intra_matrix;
2141 if (dct_dc_size == 0) {
2146 if (dct_dc_size > 8) {
2153 s->last_dc[cc] += dct_diff;
2156 block[0] =
s->last_dc[cc] * (8 >>
s->intra_dc_precision);
2158 block[0] =
s->last_dc[cc] * (8 >>
s->intra_dc_precision) * (8 >>
s->dct_precision);
2162 mismatch ^=
block[0];
2179 }
else if (group >= 1 && group <= 6) {
2181 run = 1 << additional_code_len;
2182 if (additional_code_len)
2186 }
else if (group >= 7 && group <= 12) {
2191 run = (1 << (additional_code_len - 1)) +
code;
2195 j = scantable[idx++];
2196 block[j] = sign ? 1 : -1;
2197 }
else if (group >= 13 && group <= 20) {
2201 j = scantable[idx++];
2203 }
else if (group == 21) {
2207 j = scantable[idx++];
2208 additional_code_len =
s->avctx->bits_per_raw_sample +
s->dct_precision + 4;
2209 flc =
get_bits(&
s->gb, additional_code_len);
2210 if (flc >> (additional_code_len-1))
2211 block[j] = -1 * (( flc ^ ((1 << additional_code_len) -1)) + 1);
2217 mismatch ^=
block[j];
2220 block[63] ^= mismatch & 1;
2227 int i, j,
w,
h, idx = 0;
2228 int block_mean, rice_parameter, rice_prefix_code, rice_suffix_code,
2229 dpcm_residual,
left, top, topleft, min_left_top, max_left_top, p, p2,
output;
2230 h = 16 >> (n ?
s->chroma_y_shift : 0);
2231 w = 16 >> (n ?
s->chroma_x_shift : 0);
2233 block_mean =
get_bits(&
s->gb,
s->avctx->bits_per_raw_sample);
2234 if (block_mean == 0){
2238 s->last_dc[n] = block_mean * (1 << (
s->dct_precision +
s->intra_dc_precision));
2241 if (rice_parameter == 0) {
2246 if (rice_parameter == 15)
2249 if (rice_parameter > 11) {
2254 for (
i = 0;
i <
h;
i++) {
2255 output = 1 << (
s->avctx->bits_per_raw_sample - 1);
2256 top = 1 << (
s->avctx->bits_per_raw_sample - 1);
2258 for (j = 0; j <
w; j++) {
2265 if (rice_prefix_code == 11)
2266 dpcm_residual =
get_bits(&
s->gb,
s->avctx->bits_per_raw_sample);
2268 if (rice_prefix_code == 12) {
2272 rice_suffix_code =
get_bitsz(&
s->gb, rice_parameter);
2273 dpcm_residual = (rice_prefix_code << rice_parameter) + rice_suffix_code;
2277 if (dpcm_residual & 1)
2278 dpcm_residual = (-1 * dpcm_residual) >> 1;
2280 dpcm_residual = (dpcm_residual >> 1);
2283 top = macroblock[idx-
w];
2285 p =
left + top - topleft;
2287 if (p < min_left_top)
2291 if (p > max_left_top)
2294 p2 = (
FFMIN(min_left_top, topleft) +
FFMAX(max_left_top, topleft)) >> 1;
2299 dpcm_residual *= -1;
2301 macroblock[idx++] =
output = (dpcm_residual + p) & ((1 <<
s->avctx->bits_per_raw_sample) - 1);
2313 ctx->dpcm_direction = 0;
2334 for (
i = 0;
i < 3;
i++) {
2358 int hours, minutes, seconds;
2370 s->time_base = seconds + 60*(minutes + 60*hours);
2394 int visual_object_type;
2395 int is_visual_object_identifier =
get_bits1(gb);
2397 if (is_visual_object_identifier) {
2400 visual_object_type =
get_bits(gb, 4);
2405 if (video_signal_type) {
2406 int video_range, color_description;
2413 if (color_description) {
2414 s->avctx->color_primaries =
get_bits(gb, 8);
2429 for (
i = 0;
i < 64;
i++) {
2430 int j =
s->idsp.idct_permutation[
i];
2432 s->intra_matrix[j] = v;
2433 s->chroma_intra_matrix[j] = v;
2436 s->inter_matrix[j] = v;
2437 s->chroma_inter_matrix[j] = v;
2449 for (
i = 0;
i < 64;
i++) {
2452 s->intra_matrix[j] = v;
2453 s->chroma_intra_matrix[j] = v;
2461 for (
i = 0;
i < 64;
i++) {
2470 for (
i = 0;
i < 64;
i++) {
2473 s->chroma_intra_matrix[j] = v;
2481 for (
i = 0;
i < 64;
i++) {
2493 uint8_t extension_type;
2511 int bits_per_raw_sample;
2512 int rgb, chroma_format;
2532 bits_per_raw_sample =
get_bits(gb, 4);
2533 if (bits_per_raw_sample == 10) {
2543 if (
rgb !=
ctx->rgb ||
s->chroma_format != chroma_format)
2544 s->context_reinit = 1;
2545 s->avctx->bits_per_raw_sample = bits_per_raw_sample;
2547 s->chroma_format = chroma_format;
2550 check_marker(
s->avctx, gb,
"before video_object_layer_width");
2552 check_marker(
s->avctx, gb,
"before video_object_layer_height");
2554 check_marker(
s->avctx, gb,
"after video_object_layer_height");
2558 if (
s->width &&
s->height &&
2560 s->context_reinit = 1;
2565 aspect_ratio_info =
get_bits(gb, 4);
2567 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2568 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2578 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2581 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2583 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2611 s->studio_profile = 1;
2614 }
else if (
s->studio_profile) {
2624 aspect_ratio_info =
get_bits(gb, 4);
2626 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2627 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2633 int chroma_format =
get_bits(gb, 2);
2644 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2647 check_marker(
s->avctx, gb,
"after first_half_vbv_occupancy");
2649 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2654 if (
s->picture_number == 0) {
2655 switch (
ctx->vo_type) {
2674 check_marker(
s->avctx, gb,
"before time_increment_resolution");
2676 s->avctx->framerate.num =
get_bits(gb, 16);
2677 if (!
s->avctx->framerate.num) {
2682 ctx->time_increment_bits =
av_log2(
s->avctx->framerate.num - 1) + 1;
2683 if (
ctx->time_increment_bits < 1)
2684 ctx->time_increment_bits = 1;
2689 s->avctx->framerate.den =
get_bits(gb,
ctx->time_increment_bits);
2691 s->avctx->framerate.den = 1;
2703 !(
s->width &&
s->codec_tag ==
AV_RL32(
"MP4S"))) {
2704 if (
s->width &&
s->height &&
2706 s->context_reinit = 1;
2712 s->progressive_sequence =
2714 s->interlaced_dct = 0;
2717 "MPEG-4 OBMC not supported (very likely buggy encoder)\n");
2738 if (
ctx->num_sprite_warping_points > 3) {
2740 "%d sprite_warping_points\n",
2741 ctx->num_sprite_warping_points);
2742 ctx->num_sprite_warping_points = 0;
2756 if (
ctx->quant_precision != 5)
2758 "quant precision %d\n",
ctx->quant_precision);
2759 if (
ctx->quant_precision < 3 ||
ctx->quant_precision > 9)
2760 ctx->quant_precision = 5;
2762 ctx->quant_precision = 5;
2775 for (
i = 0;
i < 64;
i++) {
2787 s->intra_matrix[j] = last;
2788 s->chroma_intra_matrix[j] = last;
2792 for (;
i < 64;
i++) {
2794 s->intra_matrix[j] = last;
2795 s->chroma_intra_matrix[j] = last;
2802 for (
i = 0;
i < 64;
i++) {
2814 s->inter_matrix[j] = v;
2815 s->chroma_inter_matrix[j] = v;
2819 for (;
i < 64;
i++) {
2821 s->inter_matrix[j] = last;
2822 s->chroma_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;
3027 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1) {
3028 if (
s->codec_tag ==
AV_RL32(
"XVID") ||
3033 ctx->xvid_build = 0;
3036 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1)
3037 if (
s->codec_tag ==
AV_RL32(
"DIVX") &&
ctx->vo_type == 0 &&
3038 ctx->vol_control_parameters == 0)
3039 ctx->divx_version = 400;
3041 if (
ctx->xvid_build >= 0 &&
ctx->divx_version >= 0) {
3043 ctx->divx_build = -1;
3047 if (
s->codec_tag ==
AV_RL32(
"XVIX"))
3050 if (
s->codec_tag ==
AV_RL32(
"UMP4"))
3053 if (
ctx->divx_version >= 500 &&
ctx->divx_build < 1814)
3056 if (
ctx->divx_version > 502 &&
ctx->divx_build < 1814)
3059 if (
ctx->xvid_build <= 3
U)
3060 s->padding_bug_score = 256 * 256 * 256 * 64;
3062 if (
ctx->xvid_build <= 1
U)
3065 if (
ctx->xvid_build <= 12
U)
3068 if (
ctx->xvid_build <= 32
U)
3071 #define SET_QPEL_FUNC(postfix1, postfix2) \
3072 s->qdsp.put_ ## postfix1 = ff_put_ ## postfix2; \
3073 s->qdsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \
3074 s->qdsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
3076 if (
ctx->lavc_build < 4653
U)
3079 if (
ctx->lavc_build < 4655
U)
3082 if (
ctx->lavc_build < 4670
U)
3085 if (
ctx->lavc_build <= 4712
U)
3088 if ((
ctx->lavc_build&0xFF) >= 100) {
3089 if (
ctx->lavc_build > 3621476 &&
ctx->lavc_build < 3752552 &&
3090 (
ctx->lavc_build < 3752037 ||
ctx->lavc_build > 3752191)
3095 if (
ctx->divx_version >= 0)
3097 if (
ctx->divx_version == 501 &&
ctx->divx_build == 20020416)
3098 s->padding_bug_score = 256 * 256 * 256 * 64;
3100 if (
ctx->divx_version < 500
U)
3103 if (
ctx->divx_version >= 0)
3125 "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
3126 s->workaround_bugs,
ctx->lavc_build,
ctx->xvid_build,
3127 ctx->divx_version,
ctx->divx_build,
s->divx_packed ?
"p" :
"");
3129 if (CONFIG_MPEG4_DECODER &&
ctx->xvid_build >= 0 &&
3143 int time_incr, time_increment;
3155 if (
s->partitioned_frame)
3166 if (
ctx->time_increment_bits == 0 ||
3169 "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);
3171 for (
ctx->time_increment_bits = 1;
3172 ctx->time_increment_bits < 16;
3173 ctx->time_increment_bits++) {
3177 if ((
show_bits(gb,
ctx->time_increment_bits + 6) & 0x37) == 0x30)
3179 }
else if ((
show_bits(gb,
ctx->time_increment_bits + 5) & 0x1F) == 0x18)
3184 "time_increment_bits set to %d bits, based on bitstream analysis\n",
ctx->time_increment_bits);
3190 time_increment =
get_bits(gb,
ctx->time_increment_bits);
3193 s->last_time_base =
s->time_base;
3194 s->time_base += time_incr;
3195 s->time =
s->time_base * (
int64_t)
s->avctx->framerate.num + time_increment;
3197 if (
s->time <
s->last_non_b_time) {
3201 s->time +=
s->avctx->framerate.num;
3204 s->pp_time =
s->time -
s->last_non_b_time;
3205 s->last_non_b_time =
s->time;
3207 s->time = (
s->last_time_base + time_incr) * (
int64_t)
s->avctx->framerate.num + time_increment;
3208 s->pb_time =
s->pp_time - (
s->last_non_b_time -
s->time);
3209 if (
s->pp_time <=
s->pb_time ||
3210 s->pp_time <=
s->pp_time -
s->pb_time ||
3217 if (
ctx->t_frame == 0)
3218 ctx->t_frame =
s->pb_time;
3219 if (
ctx->t_frame == 0)
3225 if (
s->pp_field_time <=
s->pb_field_time ||
s->pb_field_time <= 1) {
3226 s->pb_field_time = 2;
3227 s->pp_field_time = 4;
3228 if (!
s->progressive_sequence)
3233 if (
s->avctx->framerate.den)
3291 if (!
s->progressive_sequence) {
3295 s->alternate_scan = 0;
3303 if (
s->alternate_scan) {
3306 s->idsp.idct_permutation);
3310 s->idsp.idct_permutation);
3313 s->idsp.idct_permutation);
3320 if (
ctx->sprite_brightness_change)
3322 "sprite_brightness_change not supported\n");
3326 memset(
ctx->sprite_offset, 0,
sizeof(
ctx->sprite_offset));
3327 memset(
ctx->sprite_delta, 0,
sizeof(
ctx->sprite_delta));
3332 s->chroma_qscale =
s->qscale =
get_bits(gb,
ctx->quant_precision);
3333 if (
s->qscale == 0) {
3335 "Error, header damaged or not MPEG-4 header (qscale=0)\n");
3341 if (
s->f_code == 0) {
3343 "Error, header damaged or not MPEG-4 header (f_code=0)\n");
3352 if (
s->b_code == 0) {
3354 "Error, header damaged or not MPEG4 header (b_code=0)\n");
3363 "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",
3364 s->qscale,
s->f_code,
s->b_code,
3367 s->top_field_first,
s->quarter_sample ?
'q' :
'h',
3368 s->data_partitioning,
ctx->resync_marker,
3369 ctx->num_sprite_warping_points,
ctx->sprite_warping_accuracy,
3370 1 -
s->no_rounding,
ctx->vo_type,
3371 ctx->vol_control_parameters ?
" VOLC" :
" ",
ctx->intra_dc_threshold,
3372 ctx->cplx_estimation_trash_i,
ctx->cplx_estimation_trash_p,
3373 ctx->cplx_estimation_trash_b,
3379 if (!
ctx->scalability) {
3383 if (
ctx->enhancement_type) {
3384 int load_backward_shape =
get_bits1(gb);
3385 if (load_backward_shape)
3387 "load backward shape isn't supported\n");
3397 if (
ctx->vo_type == 0 &&
ctx->vol_control_parameters == 0 &&
3398 ctx->divx_version == -1 &&
s->picture_number == 0) {
3400 "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
3404 s->picture_number++;
3411 s->h_edge_pos =
s->width;
3412 s->v_edge_pos =
s->height;
3443 s->partitioned_frame = 0;
3444 s->interlaced_dct = 0;
3467 s->intra_dc_precision =
get_bits(gb, 2);
3485 int visual_object_type;
3488 visual_object_type =
get_bits(gb, 4);
3511 int header,
int parse_only)
3514 unsigned startcode, v;
3524 if (!
s->studio_profile &&
s->avctx->bits_per_raw_sample != 8)
3525 s->avctx->bits_per_raw_sample = 0;
3537 (
ctx->divx_version >= 0 ||
ctx->xvid_build >= 0) ||
s->codec_tag ==
AV_RL32(
"QMP4")) {
3548 startcode = ((startcode << 8) | v) & 0xffffffff;
3550 if ((startcode & 0xFFFFFF00) != 0x100)
3555 if (startcode <= 0x11F)
3556 name =
"Video Object Start";
3557 else if (startcode <= 0x12F)
3558 name =
"Video Object Layer Start";
3559 else if (startcode <= 0x13F)
3561 else if (startcode <= 0x15F)
3562 name =
"FGS bp start";
3563 else if (startcode <= 0x1AF)
3565 else if (startcode == 0x1B0)
3566 name =
"Visual Object Seq Start";
3567 else if (startcode == 0x1B1)
3568 name =
"Visual Object Seq End";
3569 else if (startcode == 0x1B2)
3571 else if (startcode == 0x1B3)
3572 name =
"Group of VOP start";
3573 else if (startcode == 0x1B4)
3574 name =
"Video Session Error";
3575 else if (startcode == 0x1B5)
3576 name =
"Visual Object Start";
3577 else if (startcode == 0x1B6)
3578 name =
"Video Object Plane start";
3579 else if (startcode == 0x1B7)
3580 name =
"slice start";
3581 else if (startcode == 0x1B8)
3582 name =
"extension start";
3583 else if (startcode == 0x1B9)
3585 else if (startcode == 0x1BA)
3586 name =
"FBA Object start";
3587 else if (startcode == 0x1BB)
3588 name =
"FBA Object Plane start";
3589 else if (startcode == 0x1BC)
3590 name =
"Mesh Object start";
3591 else if (startcode == 0x1BD)
3592 name =
"Mesh Object Plane start";
3593 else if (startcode == 0x1BE)
3594 name =
"Still Texture Object start";
3595 else if (startcode == 0x1BF)
3596 name =
"Texture Spatial Layer start";
3597 else if (startcode == 0x1C0)
3598 name =
"Texture SNR Layer start";
3599 else if (startcode == 0x1C1)
3600 name =
"Texture Tile start";
3601 else if (startcode == 0x1C2)
3602 name =
"Texture Shape Layer start";
3603 else if (startcode == 0x1C3)
3604 name =
"stuffing start";
3605 else if (startcode <= 0x1C5)
3607 else if (startcode <= 0x1FF)
3608 name =
"System start";
3613 if (startcode >= 0x120 && startcode <= 0x12F) {
3630 s->studio_profile = 1;
3633 }
else if (
s->studio_profile) {
3640 if (
s->studio_profile) {
3656 s->avctx->has_b_frames = !
s->low_delay;
3658 if (
s->studio_profile) {
3659 if (!
s->avctx->bits_per_raw_sample) {
3672 if (
ctx->bitstream_buffer) {
3674 int bitstream_buffer_size =
ctx->bitstream_buffer->size;
3675 const uint8_t *buf =
s->gb.buffer;
3677 if (
s->divx_packed) {
3678 for (
int i = 0;
i < buf_size - 3;
i++) {
3679 if (buf[
i] == 0 && buf[
i+1] == 0 && buf[
i+2] == 1) {
3680 if (buf[
i+3] == 0xB0) {
3682 bitstream_buffer_size = 0;
3688 ctx->bitstream_buffer->size = 0;
3689 if (bitstream_buffer_size && (
s->divx_packed || buf_size <=
MAX_NVOP_SIZE)) {
3691 bitstream_buffer_size);
3710 if (
s->divx_packed) {
3711 int current_pos =
ctx->bitstream_buffer &&
s->gb.buffer ==
ctx->bitstream_buffer->data ? 0 : (
get_bits_count(&
s->gb) >> 3);
3712 int startcode_found = 0;
3716 if (buf_size - current_pos > 7) {
3719 for (
i = current_pos;
i < buf_size - 4;
i++)
3724 buf[
i + 3] == 0xB6) {
3725 startcode_found = !(buf[
i + 4] & 0x40);
3730 if (startcode_found) {
3731 if (!
ctx->showed_packed_warning) {
3733 "wasteful way to store B-frames ('packed B-frames'). "
3734 "Consider using the mpeg4_unpack_bframes bitstream filter without encoding but stream copy to fix it.\n");
3735 ctx->showed_packed_warning = 1;
3741 ctx->bitstream_buffer->data = buf + current_pos;
3742 ctx->bitstream_buffer->size = buf_size - current_pos;
3749 #if CONFIG_MPEG4_DECODER
3756 int init =
s->m.context_initialized;
3815 static av_cold void mpeg4_init_static(
void)
3831 for (
unsigned i = 0;
i < 12;
i++) {
3870 ctx->lavc_build = -1;
3878 ctx->time_increment_bits = 4;
3879 ctx->quant_precision = 5;
3916 #define OFFSET(x) offsetof(MpegEncContext, x)
3917 #define FLAGS AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY
3924 static const AVClass mpeg4_class = {
3939 .close = mpeg4_close,
3944 .flush = mpeg4_flush,
3949 .p.priv_class = &mpeg4_class,
3951 #if CONFIG_MPEG4_NVDEC_HWACCEL
3954 #if CONFIG_MPEG4_VAAPI_HWACCEL
3957 #if CONFIG_MPEG4_VDPAU_HWACCEL
3960 #if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL
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.
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)
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]
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s)
#define AV_EF_BITSTREAM
detect bitstream specification deviations
static const VLCElem * studio_intra_tab[12]
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)
#define FF_CODEC_DECODE_CB(func)
int8_t * max_level[2]
encoding & decoding
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_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
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.
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)
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)
void ff_mpeg_flush(AVCodecContext *avctx)
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]
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)
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)
@ 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)
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.
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 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 ff_mpv_decode_close(AVCodecContext *avctx)
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]