Go to the documentation of this file.
23 #define UNCHECKED_BITSTREAM_READER 1
47 #define SPRITE_TRAJ_VLC_BITS 6
49 #define MB_TYPE_B_VLC_BITS 4
50 #define STUDIO_INTRA_BITS 9
74 int16_t *ac_val, *ac_val1;
75 int8_t *
const qscale_table =
s->current_picture.qscale_table;
78 ac_val = &
s->ac_val[0][0][0] +
s->block_index[n] * 16;
82 const int xy =
s->mb_x - 1 +
s->mb_y *
s->mb_stride;
86 if (
s->mb_x == 0 ||
s->qscale == qscale_table[xy] ||
89 for (
i = 1;
i < 8;
i++)
90 block[
s->idsp.idct_permutation[
i << 3]] += ac_val[
i];
93 for (
i = 1;
i < 8;
i++)
97 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride -
s->mb_stride;
99 ac_val -= 16 *
s->block_wrap[n];
101 if (
s->mb_y == 0 ||
s->qscale == qscale_table[xy] ||
104 for (
i = 1;
i < 8;
i++)
105 block[
s->idsp.idct_permutation[
i]] += ac_val[
i + 8];
108 for (
i = 1;
i < 8;
i++)
114 for (
i = 1;
i < 8;
i++)
115 ac_val1[
i] =
block[
s->idsp.idct_permutation[
i << 3]];
119 ac_val1[8 +
i] =
block[
s->idsp.idct_permutation[
i]];
137 (v >> (8 -
s->pict_type) != 1) ||
s->partitioned_frame)
140 bits_count += 8 +
s->pict_type;
144 if (bits_count + 8 >=
s->gb.size_in_bits) {
146 v |= 0x7F >> (7 - (bits_count & 7));
153 int mb_num_bits =
av_log2(
s->mb_num - 1) + 1;
164 if (!mb_num || mb_num >
s->mb_num ||
get_bits_count(&
s->gb)+6 >
s->gb.size_in_bits)
179 int a = 2 <<
s->sprite_warping_accuracy;
180 int rho = 3 -
s->sprite_warping_accuracy;
186 int min_ab,
i, w2, h2, w3, h3;
187 int sprite_ref[4][2];
188 int virtual_ref[2][2];
189 int64_t sprite_offset[2][2];
190 int64_t sprite_delta[2][2];
193 const int vop_ref[4][2] = { { 0, 0 }, {
s->width, 0 },
194 { 0,
s->height }, {
s->width,
s->height } };
195 int d[4][2] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
197 if (
w <= 0 ||
h <= 0)
200 for (
i = 0;
i <
ctx->num_sprite_warping_points;
i++) {
208 if (!(
ctx->divx_version == 500 &&
ctx->divx_build == 413))
216 ctx->sprite_traj[
i][0] = d[
i][0] = x;
217 ctx->sprite_traj[
i][1] = d[
i][1] = y;
220 ctx->sprite_traj[
i][0] =
ctx->sprite_traj[
i][1] = 0;
224 while ((1 << beta) <
h)
230 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413) {
231 sprite_ref[0][0] =
a * vop_ref[0][0] + d[0][0];
232 sprite_ref[0][1] =
a * vop_ref[0][1] + d[0][1];
233 sprite_ref[1][0] =
a * vop_ref[1][0] + d[0][0] + d[1][0];
234 sprite_ref[1][1] =
a * vop_ref[1][1] + d[0][1] + d[1][1];
235 sprite_ref[2][0] =
a * vop_ref[2][0] + d[0][0] + d[2][0];
236 sprite_ref[2][1] =
a * vop_ref[2][1] + d[0][1] + d[2][1];
238 sprite_ref[0][0] = (
a >> 1) * (2 * vop_ref[0][0] + d[0][0]);
239 sprite_ref[0][1] = (
a >> 1) * (2 * vop_ref[0][1] + d[0][1]);
240 sprite_ref[1][0] = (
a >> 1) * (2 * vop_ref[1][0] + d[0][0] + d[1][0]);
241 sprite_ref[1][1] = (
a >> 1) * (2 * vop_ref[1][1] + d[0][1] + d[1][1]);
242 sprite_ref[2][0] = (
a >> 1) * (2 * vop_ref[2][0] + d[0][0] + d[2][0]);
243 sprite_ref[2][1] = (
a >> 1) * (2 * vop_ref[2][1] + d[0][1] + d[2][1]);
253 virtual_ref[0][0] = 16 * (vop_ref[0][0] + w2) +
255 (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
256 w2 * (
r * sprite_ref[1][0] - 16LL * vop_ref[1][0])),
w);
257 virtual_ref[0][1] = 16 * vop_ref[0][1] +
259 (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
260 w2 * (
r * sprite_ref[1][1] - 16LL * vop_ref[1][1])),
w);
261 virtual_ref[1][0] = 16 * vop_ref[0][0] +
262 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][0] - 16LL * vop_ref[0][0]) +
263 h2 * (
r * sprite_ref[2][0] - 16LL * vop_ref[2][0])),
h);
264 virtual_ref[1][1] = 16 * (vop_ref[0][1] + h2) +
265 ROUNDED_DIV(((
h - h2) * (
r * sprite_ref[0][1] - 16LL * vop_ref[0][1]) +
266 h2 * (
r * sprite_ref[2][1] - 16LL * vop_ref[2][1])),
h);
268 switch (
ctx->num_sprite_warping_points) {
270 sprite_offset[0][0] =
271 sprite_offset[0][1] =
272 sprite_offset[1][0] =
273 sprite_offset[1][1] = 0;
274 sprite_delta[0][0] =
a;
276 sprite_delta[1][0] = 0;
277 sprite_delta[1][1] =
a;
278 ctx->sprite_shift[0] =
279 ctx->sprite_shift[1] = 0;
282 sprite_offset[0][0] = sprite_ref[0][0] -
a * vop_ref[0][0];
283 sprite_offset[0][1] = sprite_ref[0][1] -
a * vop_ref[0][1];
284 sprite_offset[1][0] = ((sprite_ref[0][0] >> 1) | (sprite_ref[0][0] & 1)) -
285 a * (vop_ref[0][0] / 2);
286 sprite_offset[1][1] = ((sprite_ref[0][1] >> 1) | (sprite_ref[0][1] & 1)) -
287 a * (vop_ref[0][1] / 2);
288 sprite_delta[0][0] =
a;
290 sprite_delta[1][0] = 0;
291 sprite_delta[1][1] =
a;
292 ctx->sprite_shift[0] =
293 ctx->sprite_shift[1] = 0;
296 sprite_offset[0][0] = ((int64_t) sprite_ref[0][0] * (1 <<
alpha + rho)) +
297 ((int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
298 ((int64_t) -vop_ref[0][0]) +
299 ((int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
300 ((int64_t) -vop_ref[0][1]) + (1 << (
alpha + rho - 1));
301 sprite_offset[0][1] = ((int64_t) sprite_ref[0][1] * (1 <<
alpha + rho)) +
302 ((int64_t) -
r * sprite_ref[0][1] + virtual_ref[0][1]) *
303 ((int64_t) -vop_ref[0][0]) +
304 ((int64_t) -
r * sprite_ref[0][0] + virtual_ref[0][0]) *
305 ((int64_t) -vop_ref[0][1]) + (1 << (
alpha + rho - 1));
306 sprite_offset[1][0] = (((int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
307 ((int64_t)-2 * vop_ref[0][0] + 1) +
308 ((int64_t)
r * sprite_ref[0][1] - virtual_ref[0][1]) *
309 ((int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
310 (int64_t) sprite_ref[0][0] - 16 * w2 + (1 << (
alpha + rho + 1)));
311 sprite_offset[1][1] = (((int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) *
312 ((int64_t)-2 * vop_ref[0][0] + 1) +
313 ((int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) *
314 ((int64_t)-2 * vop_ref[0][1] + 1) + 2 * w2 *
r *
315 (int64_t) sprite_ref[0][1] - 16 * w2 + (1 << (
alpha + rho + 1)));
316 sprite_delta[0][0] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
317 sprite_delta[0][1] = (+
r * sprite_ref[0][1] - virtual_ref[0][1]);
318 sprite_delta[1][0] = (-
r * sprite_ref[0][1] + virtual_ref[0][1]);
319 sprite_delta[1][1] = (-
r * sprite_ref[0][0] + virtual_ref[0][0]);
322 ctx->sprite_shift[1] =
alpha + rho + 2;
328 sprite_offset[0][0] = ((int64_t)sprite_ref[0][0] * (1 << (
alpha + beta + rho - min_ab))) +
329 ((int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-vop_ref[0][0]) +
330 ((int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-vop_ref[0][1]) +
331 ((int64_t)1 << (
alpha + beta + rho - min_ab - 1));
332 sprite_offset[0][1] = ((int64_t)sprite_ref[0][1] * (1 << (
alpha + beta + rho - min_ab))) +
333 ((int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-vop_ref[0][0]) +
334 ((int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-vop_ref[0][1]) +
335 ((int64_t)1 << (
alpha + beta + rho - min_ab - 1));
336 sprite_offset[1][0] = ((int64_t)-
r * sprite_ref[0][0] + virtual_ref[0][0]) * h3 * (-2 * vop_ref[0][0] + 1) +
337 ((int64_t)-
r * sprite_ref[0][0] + virtual_ref[1][0]) * w3 * (-2 * vop_ref[0][1] + 1) +
338 (int64_t)2 * w2 * h3 *
r * sprite_ref[0][0] - 16 * w2 * h3 +
339 ((int64_t)1 << (
alpha + beta + rho - min_ab + 1));
340 sprite_offset[1][1] = ((int64_t)-
r * sprite_ref[0][1] + virtual_ref[0][1]) * h3 * (-2 * vop_ref[0][0] + 1) +
341 ((int64_t)-
r * sprite_ref[0][1] + virtual_ref[1][1]) * w3 * (-2 * vop_ref[0][1] + 1) +
342 (int64_t)2 * w2 * h3 *
r * sprite_ref[0][1] - 16 * w2 * h3 +
343 ((int64_t)1 << (
alpha + beta + rho - min_ab + 1));
344 sprite_delta[0][0] = (-
r * (int64_t)sprite_ref[0][0] + virtual_ref[0][0]) * h3;
345 sprite_delta[0][1] = (-
r * (int64_t)sprite_ref[0][0] + virtual_ref[1][0]) * w3;
346 sprite_delta[1][0] = (-
r * (int64_t)sprite_ref[0][1] + virtual_ref[0][1]) * h3;
347 sprite_delta[1][1] = (-
r * (int64_t)sprite_ref[0][1] + virtual_ref[1][1]) * w3;
349 ctx->sprite_shift[0] =
alpha + beta + rho - min_ab;
350 ctx->sprite_shift[1] =
alpha + beta + rho - min_ab + 2;
354 if (sprite_delta[0][0] ==
a <<
ctx->sprite_shift[0] &&
355 sprite_delta[0][1] == 0 &&
356 sprite_delta[1][0] == 0 &&
357 sprite_delta[1][1] ==
a <<
ctx->sprite_shift[0]) {
358 sprite_offset[0][0] >>=
ctx->sprite_shift[0];
359 sprite_offset[0][1] >>=
ctx->sprite_shift[0];
360 sprite_offset[1][0] >>=
ctx->sprite_shift[1];
361 sprite_offset[1][1] >>=
ctx->sprite_shift[1];
362 sprite_delta[0][0] =
a;
363 sprite_delta[0][1] = 0;
364 sprite_delta[1][0] = 0;
365 sprite_delta[1][1] =
a;
366 ctx->sprite_shift[0] = 0;
367 ctx->sprite_shift[1] = 0;
368 s->real_sprite_warping_points = 1;
370 int shift_y = 16 -
ctx->sprite_shift[0];
371 int shift_c = 16 -
ctx->sprite_shift[1];
373 for (
i = 0;
i < 2;
i++) {
374 if (shift_c < 0 || shift_y < 0 ||
375 FFABS( sprite_offset[0][
i]) >= INT_MAX >> shift_y ||
376 FFABS( sprite_offset[1][
i]) >= INT_MAX >> shift_c ||
377 FFABS( sprite_delta[0][
i]) >= INT_MAX >> shift_y ||
378 FFABS( sprite_delta[1][
i]) >= INT_MAX >> shift_y
385 for (
i = 0;
i < 2;
i++) {
386 sprite_offset[0][
i] *= 1 << shift_y;
387 sprite_offset[1][
i] *= 1 << shift_c;
388 sprite_delta[0][
i] *= 1 << shift_y;
389 sprite_delta[1][
i] *= 1 << shift_y;
390 ctx->sprite_shift[
i] = 16;
393 for (
i = 0;
i < 2;
i++) {
395 sprite_delta[
i][0] -
a * (1LL<<16),
396 sprite_delta[
i][1] -
a * (1LL<<16)
399 if (llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
400 llabs(sprite_offset[0][
i] + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
401 llabs(sprite_offset[0][
i] + sprite_delta[
i][0] * (
w+16LL) + sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
402 llabs(sprite_delta[
i][0] * (
w+16LL)) >= INT_MAX ||
403 llabs(sprite_delta[
i][1] * (
h+16LL)) >= INT_MAX ||
404 llabs(sd[0]) >= INT_MAX ||
405 llabs(sd[1]) >= INT_MAX ||
406 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL)) >= INT_MAX ||
407 llabs(sprite_offset[0][
i] + sd[1] * (
h+16LL)) >= INT_MAX ||
408 llabs(sprite_offset[0][
i] + sd[0] * (
w+16LL) + sd[1] * (
h+16LL)) >= INT_MAX
414 s->real_sprite_warping_points =
ctx->num_sprite_warping_points;
417 for (
i = 0;
i < 4;
i++) {
418 s->sprite_offset[
i&1][
i>>1] = sprite_offset[
i&1][
i>>1];
419 s->sprite_delta [
i&1][
i>>1] = sprite_delta [
i&1][
i>>1];
424 memset(
s->sprite_offset, 0,
sizeof(
s->sprite_offset));
425 memset(
s->sprite_delta, 0,
sizeof(
s->sprite_delta));
449 int mb_num_bits =
av_log2(
s->mb_num - 1) + 1;
450 int header_extension = 0, mb_num,
len;
471 if (mb_num >=
s->mb_num || !mb_num) {
473 "illegal mb_num in video packet (%d %d) \n", mb_num,
s->mb_num);
477 s->mb_x = mb_num %
s->mb_width;
478 s->mb_y = mb_num /
s->mb_width;
481 int qscale =
get_bits(&
s->gb,
s->quant_precision);
483 s->chroma_qscale =
s->qscale = qscale;
489 if (header_extension) {
495 check_marker(
s->avctx, &
s->gb,
"before time_increment in video packed header");
497 check_marker(
s->avctx, &
s->gb,
"before vop_coding_type in video packed header");
518 "Error, video packet header damaged (f_code=0)\n");
524 "Error, video packet header damaged (b_code=0)\n");
539 s->last_dc[2] = 1 << (
s->avctx->bits_per_raw_sample +
s->dct_precision +
s->intra_dc_precision - 1);
554 vlc_len =
av_log2(
s->mb_width *
s->mb_height) + 1;
557 if (mb_num >=
s->mb_num)
560 s->mb_x = mb_num %
s->mb_width;
561 s->mb_y = mb_num /
s->mb_width;
591 int x, y, mb_v, sum, dx, dy,
shift;
592 int len = 1 << (
s->f_code + 4);
593 const int a =
s->sprite_warping_accuracy;
596 len >>=
s->quarter_sample;
598 if (
s->real_sprite_warping_points == 1) {
599 if (
ctx->divx_version == 500 &&
ctx->divx_build == 413 &&
a >=
s->quarter_sample)
600 sum =
s->sprite_offset[0][n] / (1 << (
a -
s->quarter_sample));
602 sum =
RSHIFT(
s->sprite_offset[0][n] * (1 <<
s->quarter_sample),
a);
604 dx =
s->sprite_delta[n][0];
605 dy =
s->sprite_delta[n][1];
608 dy -= 1 << (
shift +
a + 1);
610 dx -= 1 << (
shift +
a + 1);
611 mb_v =
s->sprite_offset[0][n] + dx *
s->mb_x * 16
U + dy *
s->mb_y * 16
U;
614 for (y = 0; y < 16; y++) {
619 for (x = 0; x < 16; x++) {
624 sum =
RSHIFT(sum,
a + 8 -
s->quarter_sample);
650 if (code < 0 || code > 9 ) {
692 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
695 s->first_slice_line = 1;
696 for (;
s->mb_y <
s->mb_height;
s->mb_y++) {
698 for (;
s->mb_x <
s->mb_width;
s->mb_x++) {
699 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
705 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1)
706 s->first_slice_line = 0;
718 "mcbpc corrupted at %d %d\n",
s->mb_x,
s->mb_y);
723 s->cbp_table[xy] = cbpc & 3;
730 s->current_picture.qscale_table[xy] =
s->qscale;
732 s->mbintra_table[xy] = 1;
733 for (
i = 0;
i < 6;
i++) {
738 "DC corrupted at %d %d\n",
s->mb_x,
s->mb_y);
745 s->pred_dir_table[xy] = dir;
747 int mx, my, pred_x, pred_y,
bits;
748 int16_t *
const mot_val =
s->current_picture.motion_val[0][
s->block_index[0]];
749 const int stride =
s->b8_stride * 2;
757 if (
bits & 0x10000) {
782 if (
s->mbintra_table[xy])
790 "mcbpc corrupted at %d %d\n",
s->mb_x,
s->mb_y);
796 s->cbp_table[xy] = cbpc & (8 + 3);
798 s->mb_intra = ((cbpc & 4) != 0);
802 s->mbintra_table[xy] = 1;
812 if (
s->mbintra_table[xy])
822 if ((cbpc & 16) == 0) {
856 for (
i = 0;
i < 4;
i++) {
885 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
887 s->mb_x =
s->resync_mb_x;
888 s->first_slice_line = 1;
889 for (
s->mb_y =
s->resync_mb_y; mb_num < mb_count; s->mb_y++) {
891 for (; mb_num < mb_count &&
s->mb_x <
s->mb_width;
s->mb_x++) {
892 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
896 if (
s->mb_x ==
s->resync_mb_x &&
s->mb_y ==
s->resync_mb_y + 1)
897 s->first_slice_line = 0;
904 "cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
908 s->cbp_table[xy] |= cbpy << 2;
911 if (
IS_INTRA(
s->current_picture.mb_type[xy])) {
919 "I cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
923 if (
s->cbp_table[xy] & 8)
925 s->current_picture.qscale_table[xy] =
s->qscale;
927 for (
i = 0;
i < 6;
i++) {
932 "DC corrupted at %d %d\n",
s->mb_x,
s->mb_y);
939 s->cbp_table[xy] &= 3;
940 s->cbp_table[xy] |= cbpy << 2;
942 s->pred_dir_table[xy] = dir;
943 }
else if (
IS_SKIP(
s->current_picture.mb_type[xy])) {
944 s->current_picture.qscale_table[xy] =
s->qscale;
945 s->cbp_table[xy] = 0;
951 "P cbpy corrupted at %d %d\n",
s->mb_x,
s->mb_y);
955 if (
s->cbp_table[xy] & 8)
957 s->current_picture.qscale_table[xy] =
s->qscale;
959 s->cbp_table[xy] &= 3;
960 s->cbp_table[xy] |= (cbpy ^ 0xf) << 2;
964 if (mb_num >= mb_count)
986 s->mb_x,
s->mb_y, part_a_error);
990 if (
s->resync_mb_x +
s->resync_mb_y *
s->mb_width + mb_num >
s->mb_num) {
993 s->mb_x,
s->mb_y, part_a_error);
997 s->mb_num_left = mb_num;
1004 "marker missing after first I partition at %d %d\n",
1013 "marker missing after first P partition at %d %d\n",
1019 s->mb_x - 1,
s->mb_y, part_a_end);
1041 int n,
int coded,
int intra,
int rvlc)
1053 if (
ctx->use_intra_dc_vlc) {
1055 if (
s->partitioned_frame) {
1056 level =
s->dc_val[0][
s->block_index[n]];
1061 dc_pred_dir = (
s->pred_dir_table[
s->mb_x +
s->mb_y *
s->mb_stride] << n) & 32;
1084 if (dc_pred_dir == 0)
1085 scan_table =
s->intra_v_scantable.permutated;
1087 scan_table =
s->intra_h_scantable.permutated;
1089 scan_table =
s->intra_scantable.permutated;
1096 s->block_last_index[n] =
i;
1104 scan_table =
s->intra_scantable.permutated;
1106 if (
s->mpeg_quant) {
1114 qmul =
s->qscale << 1;
1115 qadd = (
s->qscale - 1) | 1;
1132 "1. marker bit missing in rvlc esc\n");
1145 "2. marker bit missing in rvlc esc\n");
1171 cache ^= 0xC0000000;
1173 if (cache & 0x80000000) {
1174 if (cache & 0x40000000) {
1189 "1. marker bit missing in 3. esc\n");
1200 "2. marker bit missing in 3. esc\n");
1209 if (
s->error_recognition >= FF_ER_COMPLIANT) {
1212 const int run1=
run - rl->
max_run[last][abs_level] - 1;
1213 if (abs_level <= rl->max_level[last][
run]) {
1217 if (
s->error_recognition > FF_ER_COMPLIANT) {
1218 if (abs_level <= rl->max_level[last][
run]*2) {
1222 if (run1 >= 0 && abs_level <= rl->max_level[last][run1]) {
1235 if ((
unsigned)(
level + 2048) > 4095) {
1239 "|level| overflow in 3. esc, qp=%d\n",
1273 ff_tlog(
s->avctx,
"dct[%d][%d] = %- 4d end?:%d\n", scan_table[
i&63]&7, scan_table[
i&63] >> 3,
level,
i>62);
1278 "ac-tex damaged at %d %d\n",
s->mb_x,
s->mb_y);
1293 if (!
ctx->use_intra_dc_vlc) {
1303 s->block_last_index[n] =
i;
1315 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1319 mb_type =
s->current_picture.mb_type[xy];
1320 cbp =
s->cbp_table[xy];
1322 ctx->use_intra_dc_vlc =
s->qscale <
ctx->intra_dc_threshold;
1324 if (
s->current_picture.qscale_table[xy] !=
s->qscale)
1330 for (
i = 0;
i < 4;
i++) {
1331 s->mv[0][
i][0] =
s->current_picture.motion_val[0][
s->block_index[
i]][0];
1332 s->mv[0][
i][1] =
s->current_picture.motion_val[0][
s->block_index[
i]][1];
1338 for (
i = 0;
i < 6;
i++)
1339 s->block_last_index[
i] = -1;
1350 }
else if (
s->mb_intra) {
1351 s->ac_pred =
IS_ACPRED(
s->current_picture.mb_type[xy]);
1352 }
else if (!
s->mb_intra) {
1364 s->ac_pred =
IS_ACPRED(
s->current_picture.mb_type[xy]);
1369 s->bdsp.clear_blocks(
s->block[0]);
1371 for (
i = 0;
i < 6;
i++) {
1374 "texture corrupted at %d %d %d\n",
1375 s->mb_x,
s->mb_y,
s->mb_intra);
1383 if (--
s->mb_num_left <= 0) {
1390 const int delta =
s->mb_x + 1 ==
s->mb_width ? 2 : 1;
1391 if (
s->cbp_table[xy +
delta])
1401 int cbpc, cbpy,
i, cbp, pred_x, pred_y, mx, my, dquant;
1403 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
1404 const int xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1415 for (
i = 0;
i < 6;
i++)
1416 s->block_last_index[
i] = -1;
1443 "mcbpc damaged at %d %d\n",
s->mb_x,
s->mb_y);
1446 }
while (cbpc == 20);
1448 s->bdsp.clear_blocks(
s->block[0]);
1450 s->mb_intra = ((cbpc & 4) != 0);
1462 "P cbpy damaged at %d %d\n",
s->mb_x,
s->mb_y);
1466 cbp = (cbpc & 3) | (cbpy << 2);
1469 if ((!
s->progressive_sequence) &&
1474 if ((cbpc & 16) == 0) {
1483 s->mv[0][0][0] = mx;
1484 s->mv[0][0][1] = my;
1485 }
else if ((!
s->progressive_sequence) &&
get_bits1(&
s->gb)) {
1497 for (
i = 0;
i < 2;
i++) {
1506 s->mv[0][
i][0] = mx;
1507 s->mv[0][
i][1] = my;
1523 s->mv[0][0][0] = mx;
1524 s->mv[0][0][1] = my;
1529 for (
i = 0;
i < 4;
i++) {
1538 s->mv[0][
i][0] = mx;
1539 s->mv[0][
i][1] = my;
1553 for (
i = 0;
i < 2;
i++) {
1554 s->last_mv[
i][0][0] =
1555 s->last_mv[
i][0][1] =
1556 s->last_mv[
i][1][0] =
1557 s->last_mv[
i][1][1] = 0;
1564 s->mb_skipped =
s->next_picture.mbskip_table[
s->mb_y *
s->mb_stride +
s->mb_x];
1566 if (
s->mb_skipped) {
1568 for (
i = 0;
i < 6;
i++)
1569 s->block_last_index[
i] = -1;
1599 s->bdsp.clear_blocks(
s->block[0]);
1608 if (!
s->progressive_sequence) {
1636 s->last_mv[0][1][0] =
1637 s->last_mv[0][0][0] =
1638 s->mv[0][0][0] = mx;
1639 s->last_mv[0][1][1] =
1640 s->last_mv[0][0][1] =
1641 s->mv[0][0][1] = my;
1649 s->last_mv[1][1][0] =
1650 s->last_mv[1][0][0] =
1651 s->mv[1][0][0] = mx;
1652 s->last_mv[1][1][1] =
1653 s->last_mv[1][0][1] =
1654 s->mv[1][0][1] = my;
1662 for (
i = 0;
i < 2;
i++) {
1665 s->last_mv[0][
i][0] =
1666 s->mv[0][
i][0] = mx;
1667 s->last_mv[0][
i][1] = (
s->mv[0][
i][1] = my) * 2;
1674 for (
i = 0;
i < 2;
i++) {
1677 s->last_mv[1][
i][0] =
1678 s->mv[1][
i][0] = mx;
1679 s->last_mv[1][
i][1] = (
s->mv[1][
i][1] = my) * 2;
1697 s->current_picture.mb_type[xy] = mb_type;
1703 "I cbpc damaged at %d %d\n",
s->mb_x,
s->mb_y);
1706 }
while (cbpc == 8);
1721 "I cbpy damaged at %d %d\n",
s->mb_x,
s->mb_y);
1724 cbp = (cbpc & 3) | (cbpy << 2);
1726 ctx->use_intra_dc_vlc =
s->qscale <
ctx->intra_dc_threshold;
1731 if (!
s->progressive_sequence)
1734 s->bdsp.clear_blocks(
s->block[0]);
1736 for (
i = 0;
i < 6;
i++) {
1745 for (
i = 0;
i < 6;
i++) {
1756 if (
s->mb_x +
s->mb_y*
s->mb_width + 1 > next && (
s->avctx->err_recognition &
AV_EF_AGGRESSIVE)) {
1758 }
else if (
s->mb_x +
s->mb_y*
s->mb_width + 1 >= next)
1762 const int delta=
s->mb_x + 1 ==
s->mb_width ? 2 : 1;
1764 (
s->mb_x +
delta >=
s->mb_width)
1765 ?
FFMIN(
s->mb_y + 1,
s->mb_height - 1)
1767 if (
s->next_picture.mbskip_table[xy +
delta])
1819 int cc, dct_dc_size, dct_diff,
code, j, idx = 1, group = 0,
run = 0,
1820 additional_code_len, sign, mismatch;
1822 uint8_t *
const scantable =
s->intra_scantable.permutated;
1823 const uint16_t *quant_matrix;
1825 const int min = -1 * (1 << (
s->avctx->bits_per_raw_sample + 6));
1826 const int max = ((1 << (
s->avctx->bits_per_raw_sample + 6)) - 1);
1827 int shift = 3 -
s->dct_precision;
1836 quant_matrix =
s->intra_matrix;
1843 quant_matrix =
s->chroma_intra_matrix;
1846 if (dct_dc_size == 0) {
1851 if (dct_dc_size > 8) {
1858 s->last_dc[cc] += dct_diff;
1861 block[0] =
s->last_dc[cc] * (8 >>
s->intra_dc_precision);
1863 block[0] =
s->last_dc[cc] * (8 >>
s->intra_dc_precision) * (8 >>
s->dct_precision);
1867 mismatch ^=
block[0];
1884 }
else if (group >= 1 && group <= 6) {
1886 run = 1 << additional_code_len;
1887 if (additional_code_len)
1891 }
else if (group >= 7 && group <= 12) {
1896 run = (1 << (additional_code_len - 1)) +
code;
1900 j = scantable[idx++];
1901 block[j] = sign ? 1 : -1;
1902 }
else if (group >= 13 && group <= 20) {
1906 j = scantable[idx++];
1908 }
else if (group == 21) {
1912 j = scantable[idx++];
1913 additional_code_len =
s->avctx->bits_per_raw_sample +
s->dct_precision + 4;
1914 flc =
get_bits(&
s->gb, additional_code_len);
1915 if (flc >> (additional_code_len-1))
1916 block[j] = -1 * (( flc ^ ((1 << additional_code_len) -1)) + 1);
1922 mismatch ^=
block[j];
1925 block[63] ^= mismatch & 1;
1932 int i, j,
w,
h, idx = 0;
1933 int block_mean, rice_parameter, rice_prefix_code, rice_suffix_code,
1934 dpcm_residual,
left, top, topleft, min_left_top, max_left_top, p, p2,
output;
1935 h = 16 >> (n ?
s->chroma_y_shift : 0);
1936 w = 16 >> (n ?
s->chroma_x_shift : 0);
1938 block_mean =
get_bits(&
s->gb,
s->avctx->bits_per_raw_sample);
1939 if (block_mean == 0){
1943 s->last_dc[n] = block_mean * (1 << (
s->dct_precision +
s->intra_dc_precision));
1946 if (rice_parameter == 0) {
1951 if (rice_parameter == 15)
1954 if (rice_parameter > 11) {
1959 for (
i = 0;
i <
h;
i++) {
1960 output = 1 << (
s->avctx->bits_per_raw_sample - 1);
1961 top = 1 << (
s->avctx->bits_per_raw_sample - 1);
1963 for (j = 0; j <
w; j++) {
1970 if (rice_prefix_code == 11)
1971 dpcm_residual =
get_bits(&
s->gb,
s->avctx->bits_per_raw_sample);
1973 if (rice_prefix_code == 12) {
1977 rice_suffix_code =
get_bitsz(&
s->gb, rice_parameter);
1978 dpcm_residual = (rice_prefix_code << rice_parameter) + rice_suffix_code;
1982 if (dpcm_residual & 1)
1983 dpcm_residual = (-1 * dpcm_residual) >> 1;
1985 dpcm_residual = (dpcm_residual >> 1);
1988 top = macroblock[idx-
w];
1990 p =
left + top - topleft;
1992 if (p < min_left_top)
1996 if (p > max_left_top)
1999 p2 = (
FFMIN(min_left_top, topleft) +
FFMAX(max_left_top, topleft)) >> 1;
2004 dpcm_residual *= -1;
2006 macroblock[idx++] =
output = (dpcm_residual + p) & ((1 <<
s->avctx->bits_per_raw_sample) - 1);
2017 s->dpcm_direction = 0;
2038 for (
i = 0;
i < 3;
i++) {
2062 int hours, minutes, seconds;
2074 s->time_base = seconds + 60*(minutes + 60*hours);
2098 int visual_object_type;
2099 int is_visual_object_identifier =
get_bits1(gb);
2101 if (is_visual_object_identifier) {
2104 visual_object_type =
get_bits(gb, 4);
2109 if (video_signal_type) {
2110 int video_range, color_description;
2117 if (color_description) {
2118 s->avctx->color_primaries =
get_bits(gb, 8);
2133 for (
i = 0;
i < 64;
i++) {
2134 int j =
s->idsp.idct_permutation[
i];
2136 s->intra_matrix[j] = v;
2137 s->chroma_intra_matrix[j] = v;
2140 s->inter_matrix[j] = v;
2141 s->chroma_inter_matrix[j] = v;
2153 for (
i = 0;
i < 64;
i++) {
2156 s->intra_matrix[j] = v;
2157 s->chroma_intra_matrix[j] = v;
2165 for (
i = 0;
i < 64;
i++) {
2174 for (
i = 0;
i < 64;
i++) {
2177 s->chroma_intra_matrix[j] = v;
2185 for (
i = 0;
i < 64;
i++) {
2215 int bits_per_raw_sample;
2216 int rgb, chroma_format;
2236 bits_per_raw_sample =
get_bits(gb, 4);
2237 if (bits_per_raw_sample == 10) {
2247 if (
rgb !=
ctx->rgb ||
s->chroma_format != chroma_format)
2248 s->context_reinit = 1;
2249 s->avctx->bits_per_raw_sample = bits_per_raw_sample;
2251 s->chroma_format = chroma_format;
2254 check_marker(
s->avctx, gb,
"before video_object_layer_width");
2256 check_marker(
s->avctx, gb,
"before video_object_layer_height");
2258 check_marker(
s->avctx, gb,
"after video_object_layer_height");
2262 if (
s->width &&
s->height &&
2264 s->context_reinit = 1;
2271 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2272 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2282 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2285 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2287 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2315 s->studio_profile = 1;
2318 }
else if (
s->studio_profile) {
2330 s->avctx->sample_aspect_ratio.num =
get_bits(gb, 8);
2331 s->avctx->sample_aspect_ratio.den =
get_bits(gb, 8);
2337 int chroma_format =
get_bits(gb, 2);
2348 check_marker(
s->avctx, gb,
"after first_half_vbv_buffer_size");
2351 check_marker(
s->avctx, gb,
"after first_half_vbv_occupancy");
2353 check_marker(
s->avctx, gb,
"after latter_half_vbv_occupancy");
2358 if (
s->picture_number == 0) {
2359 switch(
s->vo_type) {
2378 check_marker(
s->avctx, gb,
"before time_increment_resolution");
2380 s->avctx->framerate.num =
get_bits(gb, 16);
2381 if (!
s->avctx->framerate.num) {
2386 ctx->time_increment_bits =
av_log2(
s->avctx->framerate.num - 1) + 1;
2387 if (
ctx->time_increment_bits < 1)
2388 ctx->time_increment_bits = 1;
2393 s->avctx->framerate.den =
get_bits(gb,
ctx->time_increment_bits);
2395 s->avctx->framerate.den = 1;
2409 !(
s->width &&
s->codec_tag ==
AV_RL32(
"MP4S"))) {
2410 if (
s->width &&
s->height &&
2412 s->context_reinit = 1;
2418 s->progressive_sequence =
2420 s->interlaced_dct = 0;
2423 "MPEG-4 OBMC not supported (very likely buggy encoder)\n");
2444 if (
ctx->num_sprite_warping_points > 3) {
2446 "%d sprite_warping_points\n",
2447 ctx->num_sprite_warping_points);
2448 ctx->num_sprite_warping_points = 0;
2451 s->sprite_warping_accuracy =
get_bits(gb, 2);
2462 if (
s->quant_precision != 5)
2464 "quant precision %d\n",
s->quant_precision);
2465 if (
s->quant_precision<3 ||
s->quant_precision>9) {
2466 s->quant_precision = 5;
2469 s->quant_precision = 5;
2482 for (
i = 0;
i < 64;
i++) {
2494 s->intra_matrix[j] = last;
2495 s->chroma_intra_matrix[j] = last;
2499 for (;
i < 64;
i++) {
2501 s->intra_matrix[j] = last;
2502 s->chroma_intra_matrix[j] = last;
2509 for (
i = 0;
i < 64;
i++) {
2521 s->inter_matrix[j] = v;
2522 s->chroma_inter_matrix[j] = v;
2526 for (;
i < 64;
i++) {
2528 s->inter_matrix[j] = last;
2529 s->chroma_inter_matrix[j] = last;
2539 s->quarter_sample = 0;
2548 int estimation_method =
get_bits(gb, 2);
2549 if (estimation_method < 2) {
2564 if (!
check_marker(
s->avctx, gb,
"in complexity estimation part 1")) {
2582 if (!
check_marker(
s->avctx, gb,
"in complexity estimation part 2")) {
2586 if (estimation_method == 1) {
2592 "Invalid Complexity estimation method %d\n",
2597 ctx->cplx_estimation_trash_i =
2598 ctx->cplx_estimation_trash_p =
2599 ctx->cplx_estimation_trash_b = 0;
2605 if (
s->data_partitioning)
2608 if (vo_ver_id != 1) {
2610 if (
ctx->new_pred) {
2617 "reduced resolution VOP not supported\n");
2624 if (
ctx->scalability) {
2626 int h_sampling_factor_n;
2627 int h_sampling_factor_m;
2628 int v_sampling_factor_n;
2629 int v_sampling_factor_m;
2634 h_sampling_factor_n =
get_bits(gb, 5);
2635 h_sampling_factor_m =
get_bits(gb, 5);
2636 v_sampling_factor_n =
get_bits(gb, 5);
2637 v_sampling_factor_m =
get_bits(gb, 5);
2640 if (h_sampling_factor_n == 0 || h_sampling_factor_m == 0 ||
2641 v_sampling_factor_n == 0 || v_sampling_factor_m == 0) {
2644 ctx->scalability = 0;
2654 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",
2655 s->avctx->framerate.den,
s->avctx->framerate.num,
2656 ctx->time_increment_bits,
2658 s->progressive_sequence,
2660 ctx->scalability ?
"scalability " :
"" ,
s->quarter_sample ?
"qpel " :
"",
2661 s->data_partitioning ?
"partition " :
"",
ctx->rvlc ?
"rvlc " :
""
2678 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
2689 e = sscanf(buf,
"DivX%dBuild%d%c", &ver, &build, &last);
2691 e = sscanf(buf,
"DivX%db%d%c", &ver, &build, &last);
2693 ctx->divx_version = ver;
2694 ctx->divx_build = build;
2695 s->divx_packed = e == 3 && last ==
'p';
2699 e = sscanf(buf,
"FFmpe%*[^b]b%d", &build) + 3;
2701 e = sscanf(buf,
"FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
2703 e = sscanf(buf,
"Lavc%d.%d.%d", &ver, &ver2, &ver3) + 1;
2705 if (ver > 0xFFU || ver2 > 0xFFU || ver3 > 0xFFU) {
2707 "Unknown Lavc version string encountered, %d.%d.%d; "
2708 "clamping sub-version values to 8-bits.\n",
2711 build = ((ver & 0xFF) << 16) + ((ver2 & 0xFF) << 8) + (ver3 & 0xFF);
2715 if (strcmp(buf,
"ffmpeg") == 0)
2716 ctx->lavc_build = 4600;
2719 ctx->lavc_build = build;
2722 e = sscanf(buf,
"XviD%d", &build);
2724 ctx->xvid_build = build;
2734 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1) {
2735 if (
s->codec_tag ==
AV_RL32(
"XVID") ||
2740 ctx->xvid_build = 0;
2743 if (
ctx->xvid_build == -1 &&
ctx->divx_version == -1 &&
ctx->lavc_build == -1)
2744 if (
s->codec_tag ==
AV_RL32(
"DIVX") &&
s->vo_type == 0 &&
2745 ctx->vol_control_parameters == 0)
2746 ctx->divx_version = 400;
2748 if (
ctx->xvid_build >= 0 &&
ctx->divx_version >= 0) {
2750 ctx->divx_build = -1;
2754 if (
s->codec_tag ==
AV_RL32(
"XVIX"))
2757 if (
s->codec_tag ==
AV_RL32(
"UMP4"))
2760 if (
ctx->divx_version >= 500 &&
ctx->divx_build < 1814)
2763 if (
ctx->divx_version > 502 &&
ctx->divx_build < 1814)
2766 if (
ctx->xvid_build <= 3
U)
2767 s->padding_bug_score = 256 * 256 * 256 * 64;
2769 if (
ctx->xvid_build <= 1
U)
2772 if (
ctx->xvid_build <= 12
U)
2775 if (
ctx->xvid_build <= 32
U)
2778 #define SET_QPEL_FUNC(postfix1, postfix2) \
2779 s->qdsp.put_ ## postfix1 = ff_put_ ## postfix2; \
2780 s->qdsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \
2781 s->qdsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
2783 if (
ctx->lavc_build < 4653
U)
2786 if (
ctx->lavc_build < 4655
U)
2789 if (
ctx->lavc_build < 4670
U)
2792 if (
ctx->lavc_build <= 4712
U)
2795 if ((
ctx->lavc_build&0xFF) >= 100) {
2796 if (
ctx->lavc_build > 3621476 &&
ctx->lavc_build < 3752552 &&
2797 (
ctx->lavc_build < 3752037 ||
ctx->lavc_build > 3752191)
2802 if (
ctx->divx_version >= 0)
2804 if (
ctx->divx_version == 501 &&
ctx->divx_build == 20020416)
2805 s->padding_bug_score = 256 * 256 * 256 * 64;
2807 if (
ctx->divx_version < 500
U)
2810 if (
ctx->divx_version >= 0)
2832 "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
2833 s->workaround_bugs,
ctx->lavc_build,
ctx->xvid_build,
2834 ctx->divx_version,
ctx->divx_build,
s->divx_packed ?
"p" :
"");
2836 if (CONFIG_MPEG4_DECODER &&
ctx->xvid_build >= 0 &&
2850 int time_incr, time_increment;
2862 if (
s->partitioned_frame)
2873 if (
ctx->time_increment_bits == 0 ||
2876 "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);
2878 for (
ctx->time_increment_bits = 1;
2879 ctx->time_increment_bits < 16;
2880 ctx->time_increment_bits++) {
2884 if ((
show_bits(gb,
ctx->time_increment_bits + 6) & 0x37) == 0x30)
2886 }
else if ((
show_bits(gb,
ctx->time_increment_bits + 5) & 0x1F) == 0x18)
2891 "time_increment_bits set to %d bits, based on bitstream analysis\n",
ctx->time_increment_bits);
2892 if (
s->avctx->framerate.num && 4*
s->avctx->framerate.num < 1<<
ctx->time_increment_bits) {
2893 s->avctx->framerate.num = 1<<
ctx->time_increment_bits;
2901 time_increment =
get_bits(gb,
ctx->time_increment_bits);
2904 s->last_time_base =
s->time_base;
2905 s->time_base += time_incr;
2906 s->time =
s->time_base * (int64_t)
s->avctx->framerate.num + time_increment;
2908 if (
s->time <
s->last_non_b_time) {
2912 s->time +=
s->avctx->framerate.num;
2915 s->pp_time =
s->time -
s->last_non_b_time;
2916 s->last_non_b_time =
s->time;
2918 s->time = (
s->last_time_base + time_incr) * (int64_t)
s->avctx->framerate.num + time_increment;
2919 s->pb_time =
s->pp_time - (
s->last_non_b_time -
s->time);
2920 if (
s->pp_time <=
s->pb_time ||
2921 s->pp_time <=
s->pp_time -
s->pb_time ||
2928 if (
ctx->t_frame == 0)
2929 ctx->t_frame =
s->pb_time;
2930 if (
ctx->t_frame == 0)
2936 if (
s->pp_field_time <=
s->pb_field_time ||
s->pb_field_time <= 1) {
2937 s->pb_field_time = 2;
2938 s->pp_field_time = 4;
2939 if (!
s->progressive_sequence)
2944 if (
s->avctx->framerate.den)
3002 if (!
s->progressive_sequence) {
3006 s->alternate_scan = 0;
3009 if (
s->alternate_scan) {
3026 if (
ctx->sprite_brightness_change)
3028 "sprite_brightness_change not supported\n");
3032 memset(
s->sprite_offset, 0,
sizeof(
s->sprite_offset));
3033 memset(
s->sprite_delta, 0,
sizeof(
s->sprite_delta));
3038 s->chroma_qscale =
s->qscale =
get_bits(gb,
s->quant_precision);
3039 if (
s->qscale == 0) {
3041 "Error, header damaged or not MPEG-4 header (qscale=0)\n");
3047 if (
s->f_code == 0) {
3049 "Error, header damaged or not MPEG-4 header (f_code=0)\n");
3058 if (
s->b_code == 0) {
3060 "Error, header damaged or not MPEG4 header (b_code=0)\n");
3069 "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d time:%"PRId64
" tincr:%d\n",
3070 s->qscale,
s->f_code,
s->b_code,
3073 s->top_field_first,
s->quarter_sample ?
"q" :
"h",
3074 s->data_partitioning,
ctx->resync_marker,
3075 ctx->num_sprite_warping_points,
s->sprite_warping_accuracy,
3076 1 -
s->no_rounding,
s->vo_type,
3077 ctx->vol_control_parameters ?
" VOLC" :
" ",
ctx->intra_dc_threshold,
3078 ctx->cplx_estimation_trash_i,
ctx->cplx_estimation_trash_p,
3079 ctx->cplx_estimation_trash_b,
3085 if (!
ctx->scalability) {
3089 if (
ctx->enhancement_type) {
3090 int load_backward_shape =
get_bits1(gb);
3091 if (load_backward_shape)
3093 "load backward shape isn't supported\n");
3101 if (
s->vo_type == 0 &&
ctx->vol_control_parameters == 0 &&
3102 ctx->divx_version == -1 &&
s->picture_number == 0) {
3104 "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
3108 s->picture_number++;
3115 s->h_edge_pos =
s->width;
3116 s->v_edge_pos =
s->height;
3147 s->partitioned_frame = 0;
3148 s->interlaced_dct = 0;
3171 s->intra_dc_precision =
get_bits(gb, 2);
3175 if (
s->alternate_scan) {
3198 int visual_object_type;
3201 visual_object_type =
get_bits(gb, 4);
3224 unsigned startcode, v;
3234 if (!
s->studio_profile &&
s->avctx->bits_per_raw_sample != 8)
3235 s->avctx->bits_per_raw_sample = 0;
3247 (
ctx->divx_version >= 0 ||
ctx->xvid_build >= 0) ||
s->codec_tag ==
AV_RL32(
"QMP4")) {
3258 startcode = ((startcode << 8) | v) & 0xffffffff;
3260 if ((startcode & 0xFFFFFF00) != 0x100)
3265 if (startcode <= 0x11F)
3267 else if (startcode <= 0x12F)
3269 else if (startcode <= 0x13F)
3271 else if (startcode <= 0x15F)
3273 else if (startcode <= 0x1AF)
3275 else if (startcode == 0x1B0)
3277 else if (startcode == 0x1B1)
3279 else if (startcode == 0x1B2)
3281 else if (startcode == 0x1B3)
3283 else if (startcode == 0x1B4)
3285 else if (startcode == 0x1B5)
3287 else if (startcode == 0x1B6)
3289 else if (startcode == 0x1B7)
3291 else if (startcode == 0x1B8)
3293 else if (startcode == 0x1B9)
3295 else if (startcode == 0x1BA)
3297 else if (startcode == 0x1BB)
3299 else if (startcode == 0x1BC)
3301 else if (startcode == 0x1BD)
3303 else if (startcode == 0x1BE)
3305 else if (startcode == 0x1BF)
3307 else if (startcode == 0x1C0)
3309 else if (startcode == 0x1C1)
3311 else if (startcode == 0x1C2)
3313 else if (startcode == 0x1C3)
3315 else if (startcode <= 0x1C5)
3317 else if (startcode <= 0x1FF)
3322 if (startcode >= 0x120 && startcode <= 0x12F) {
3339 s->studio_profile = 1;
3342 }
else if (
s->studio_profile) {
3349 if (
s->studio_profile) {
3365 s->avctx->has_b_frames = !
s->low_delay;
3367 if (
s->studio_profile) {
3368 if (!
s->avctx->bits_per_raw_sample) {
3378 static int done = 0;
3395 NULL, 0, 0, 0, 0, 128);
3411 if (
s->divx_packed) {
3412 int current_pos =
s->gb.buffer ==
s->bitstream_buffer ? 0 : (
get_bits_count(&
s->gb) >> 3);
3413 int startcode_found = 0;
3415 if (buf_size - current_pos > 7) {
3418 for (
i = current_pos;
i < buf_size - 4;
i++)
3423 buf[
i + 3] == 0xB6) {
3424 startcode_found = !(buf[
i + 4] & 0x40);
3429 if (startcode_found) {
3430 if (!
ctx->showed_packed_warning) {
3432 "wasteful way to store B-frames ('packed B-frames'). "
3433 "Consider using the mpeg4_unpack_bframes bitstream filter without encoding but stream copy to fix it.\n");
3434 ctx->showed_packed_warning = 1;
3437 &
s->allocated_bitstream_buffer_size,
3438 buf_size - current_pos);
3439 if (!
s->bitstream_buffer) {
3440 s->bitstream_buffer_size = 0;
3443 memcpy(
s->bitstream_buffer, buf + current_pos,
3444 buf_size - current_pos);
3445 s->bitstream_buffer_size = buf_size - current_pos;
3458 int init =
s->m.context_initialized;
3466 s->time_increment_bits =
s1->time_increment_bits;
3467 s->shape =
s1->shape;
3468 s->vol_sprite_usage =
s1->vol_sprite_usage;
3469 s->sprite_brightness_change =
s1->sprite_brightness_change;
3470 s->num_sprite_warping_points =
s1->num_sprite_warping_points;
3472 s->resync_marker =
s1->resync_marker;
3473 s->t_frame =
s1->t_frame;
3474 s->new_pred =
s1->new_pred;
3475 s->enhancement_type =
s1->enhancement_type;
3476 s->scalability =
s1->scalability;
3477 s->use_intra_dc_vlc =
s1->use_intra_dc_vlc;
3478 s->intra_dc_threshold =
s1->intra_dc_threshold;
3479 s->divx_version =
s1->divx_version;
3480 s->divx_build =
s1->divx_build;
3481 s->xvid_build =
s1->xvid_build;
3482 s->lavc_build =
s1->lavc_build;
3483 s->showed_packed_warning =
s1->showed_packed_warning;
3484 s->vol_control_parameters =
s1->vol_control_parameters;
3485 s->cplx_estimation_trash_i =
s1->cplx_estimation_trash_i;
3486 s->cplx_estimation_trash_p =
s1->cplx_estimation_trash_p;
3487 s->cplx_estimation_trash_b =
s1->cplx_estimation_trash_b;
3490 memcpy(
s->sprite_shift,
s1->sprite_shift,
sizeof(
s1->sprite_shift));
3491 memcpy(
s->sprite_traj,
s1->sprite_traj,
sizeof(
s1->sprite_traj));
3493 if (CONFIG_MPEG4_DECODER && !
init &&
s1->xvid_build >= 0)
3512 for (
unsigned i = 0,
offset = 0;
i < 12;
i++) {
3537 ctx->lavc_build = -1;
3545 ctx->time_increment_bits = 4;
3554 #define OFFSET(x) offsetof(MpegEncContext, x)
3555 #define FLAGS AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY
3590 #if CONFIG_MPEG4_NVDEC_HWACCEL
3593 #if CONFIG_MPEG4_VAAPI_HWACCEL
3596 #if CONFIG_MPEG4_VDPAU_HWACCEL
3599 #if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL
av_cold void ff_mpeg4videodec_static_init(void)
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.
static const AVClass mpeg4_class
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
#define FF_ASPECT_EXTENDED
#define VISUAL_OBJ_STARTCODE
static av_cold int init(AVCodecContext *avctx)
static unsigned int show_bits_long(GetBitContext *s, int n)
Show 0-32 bits.
static int get_bits_left(GetBitContext *gb)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
av_cold void ff_xvid_idct_init(IDCTDSPContext *c, AVCodecContext *avctx)
static const uint8_t mpeg4_block_count[4]
const uint8_t ff_sprite_trajectory_lens[15]
static int mpeg_get_qscale(MpegEncContext *s)
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
static VLC studio_chroma_dc
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
static int mpeg4_decode_block(Mpeg4DecContext *ctx, int16_t *block, int n, int coded, int intra, int rvlc)
Decode a block.
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)
#define AV_CODEC_CAP_TRUNCATED
@ AVCOL_RANGE_JPEG
Full range content.
static int mpeg4_decode_studio_mb(MpegEncContext *s, int16_t block_[12][64])
#define ADV_SIMPLE_VO_TYPE
int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx)
Decode the next video packet.
static int mpeg4_decode_gop_header(MpegEncContext *s, GetBitContext *gb)
static int decode_studiovisualobject(Mpeg4DecContext *ctx, GetBitContext *gb)
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
#define AV_LOG_VERBOSE
Detailed information.
void ff_clean_intra_table_entries(MpegEncContext *s)
Clean dc, ac, coded_block 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 AV_EF_COMPLIANT
consider all spec non compliances as errors
#define UPDATE_CACHE(name, gb)
#define FF_BUG_HPEL_CHROMA
static void decode_smpte_tc(Mpeg4DecContext *ctx, GetBitContext *gb)
#define FF_PROFILE_MPEG4_SIMPLE_STUDIO
static int mpeg4_decode_visual_object(MpegEncContext *s, GetBitContext *gb)
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before ff_thread_await_progress() has been called on them. reget_buffer() and buffer age optimizations no longer work. *The contents of buffers must not be written to after ff_thread_report_progress() has been called on them. This includes draw_edges(). Porting codecs to frame threading
const uint16_t ff_mpeg4_resync_prefix[8]
#define FF_DEBUG_PICT_INFO
#define GET_CACHE(name, gb)
#define VOT_STILL_TEXTURE_ID
static void skip_bits(GetBitContext *s, int n)
int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static VLC studio_intra_tab[12]
const uint8_t ff_mpeg4_DCtab_chrom[13][2]
static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb)
Decode the user data stuff in the header.
#define SKIP_CACHE(name, gb, num)
static int get_amv(Mpeg4DecContext *ctx, int n)
Get the average motion vector for a GMC MB.
#define INTRA_MCBPC_VLC_BITS
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
VLC ff_h263_intra_MCBPC_vlc
#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 CORE_STUDIO_VO_TYPE
#define USES_LIST(a, list)
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 SLICE_END
end marker found
#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 ff_init_vlc_from_lengths(VLC *vlc_arg, 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, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
#define AV_PIX_FMT_YUV444P10
#define AV_EF_BITSTREAM
detect bitstream specification deviations
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define INIT_FIRST_VLC_RL(rl, static_size)
#define FF_ARRAY_ELEMS(a)
int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx)
Decode the first and second partition.
static void extension_and_user_data(MpegEncContext *s, GetBitContext *gb, int id)
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
#define CLOSE_READER(name, gb)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
int8_t * max_level[2]
encoding & decoding
int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header)
Decode MPEG-4 headers.
#define SHOW_SBITS(name, gb, num)
#define FF_BUG_NO_PADDING
RLTable ff_mpeg4_rl_intra
#define FF_PROFILE_UNKNOWN
static enum AVPixelFormat pix_fmts[]
#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)
#define FF_BUG_DIRECT_BLOCKSIZE
av_cold void ff_rl_init(RLTable *rl, uint8_t static_store[2][2 *MAX_RUN+MAX_LEVEL+3])
static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *gb)
#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 FRAME_SKIPPED
Return value for header parsers if frame is not coded.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
static const int mb_type_b_map[4]
#define LIBAVUTIL_VERSION_INT
static void mpeg4_load_default_matrices(MpegEncContext *s)
Describe the class of an AVClass context structure.
static void flush(AVCodecContext *avctx)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
av_cold void ff_mpv_idct_init(MpegEncContext *s)
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Rational number (pair of numerator and denominator).
#define INIT_VLC_STATIC_FROM_LENGTHS(vlc, bits, nb_codes, lens, len_wrap, symbols, symbols_wrap, symbols_size, offset, flags, static_size)
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)
#define SLICE_NOEND
no end marker or error found but mb count exceeded
enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[]
#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.
#define LAST_SKIP_BITS(name, gb, num)
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
#define SET_QPEL_FUNC(postfix1, postfix2)
const uint8_t ff_alternate_horizontal_scan[64]
#define AV_PIX_FMT_YUV422P10
const uint8_t ff_mpeg4_dc_threshold[8]
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)
static int mpeg4_decode_partition_a(Mpeg4DecContext *ctx)
Decode first partition.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
int ff_h263_decode_motion(MpegEncContext *s, int pred, int f_code)
#define AV_EF_IGNORE_ERR
ignore errors and continue
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 ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level, int *dir_ptr, int encoding)
Predict the dc.
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.
void ff_mpeg_flush(AVCodecContext *avctx)
static const uint8_t header[24]
#define MB_TYPE_INTERLACED
#define OPEN_READER(name, gb)
#define INTER_MCBPC_VLC_BITS
uint8_t ff_mpeg4_static_rl_table_store[3][2][2 *MAX_RUN+MAX_LEVEL+3]
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]
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 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)
#define AV_LOG_INFO
Standard information.
static void ff_update_block_index(MpegEncContext *s)
int ff_h263_decode_init(AVCodecContext *avctx)
#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)
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]
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
int8_t * max_run[2]
encoding & decoding
static VLC studio_luma_dc
int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)
Decode the next video packet.
int ff_h263_decode_end(AVCodecContext *avctx)
#define SIMPLE_STUDIO_VO_TYPE
#define FF_BUG_AUTODETECT
autodetection
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
#define FF_DEBUG_STARTCODE
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
const char * name
Name of the codec implementation.
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
#define USER_DATA_STARTCODE
#define FF_BUG_QPEL_CHROMA
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
#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 INIT_VLC_STATIC_OVERLONG
static av_cold void mpeg4_init_static(void)
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
static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb)
static VLC_TYPE vlc_buf[16716][2]
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.
static const AVOption mpeg4_options[]
static const AVProfile profiles[]
#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)
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb)
#define AV_EF_AGGRESSIVE
consider things that a sane encoder should not do as an error
static int mpeg4_is_resync(Mpeg4DecContext *ctx)
check if the next stuff is a resync marker or the end.
static int shift(int a, int b)
#define INIT_VLC_RL(rl, static_size)
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_CODEC_CAP_ALLOCATE_PROGRESS
#define FF_BUG_XVID_ILACE
#define avpriv_request_sample(...)
int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static void reset_studio_dc_predictors(MpegEncContext *s)
const uint8_t ff_mpeg4_c_dc_scale_table[32]
static int check_marker(void *logctx, GetBitContext *s, const char *msg)
#define QUANT_MATRIX_EXT_ID
static void next_start_code_studio(GetBitContext *gb)
static const int16_t alpha[]
static int decode_studio_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb)
Decode the next studio vop header.
#define HWACCEL_VAAPI(codec)
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 AVERROR_INVALIDDATA
Invalid data found when processing input.
static int decode_new_pred(Mpeg4DecContext *ctx, GetBitContext *gb)
static av_cold int decode_init(AVCodecContext *avctx)
static VLC sprite_trajectory
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
VLC_TYPE(* table)[2]
code, bits
RL_VLC_ELEM * rl_vlc[32]
decoding only
const uint8_t ff_mpeg4_studio_intra[12][24][2]
VLC ff_h263_inter_MCBPC_vlc