Go to the documentation of this file.
28 #include "config_components.h"
30 #define UNCHECKED_BITSTREAM_READER 1
63 #define A53_MAX_CC_COUNT 2000
89 #define MB_TYPE_ZERO_MV 0x20000000
142 #define MAX_INDEX (64 - 1)
143 #define check_scantable_index(ctx, x) \
145 if ((x) > MAX_INDEX) { \
146 av_log(ctx->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", \
147 ctx->mb_x, ctx->mb_y); \
148 return AVERROR_INVALIDDATA; \
153 int16_t *
block,
int n)
156 uint8_t *
const scantable =
s->intra_scantable.permutated;
157 const uint16_t *quant_matrix =
s->inter_matrix;
158 const int qscale =
s->qscale;
166 level = (3 * qscale * quant_matrix[0]) >> 5;
186 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
201 }
else if (
level == 0) {
211 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
215 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
232 s->block_last_index[n] =
i;
241 int16_t *
block,
int n)
244 uint8_t *
const scantable =
s->intra_scantable.permutated;
245 const int qscale =
s->qscale;
253 level = (3 * qscale) >> 1;
289 }
else if (
level == 0) {
320 s->block_last_index[n] =
i;
325 int16_t *
block,
int n)
328 uint8_t *
const scantable =
s->intra_scantable.permutated;
329 const uint16_t *quant_matrix;
330 const int qscale =
s->qscale;
339 quant_matrix =
s->inter_matrix;
341 quant_matrix =
s->chroma_inter_matrix;
346 level = (3 * qscale * quant_matrix[0]) >> 5;
367 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
384 level = ((-
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
387 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
401 block[63] ^= (mismatch & 1);
405 s->block_last_index[n] =
i;
414 int16_t *
block,
int n)
417 uint8_t *
const scantable =
s->intra_scantable.permutated;
418 const int qscale =
s->qscale;
425 level = (3 * qscale) >> 1;
480 s->block_last_index[n] =
i;
485 int16_t *
block,
int n)
490 uint8_t *
const scantable =
s->intra_scantable.permutated;
491 const uint16_t *quant_matrix;
492 const int qscale =
s->qscale;
497 quant_matrix =
s->intra_matrix;
500 quant_matrix =
s->chroma_intra_matrix;
501 component = (n & 1) + 1;
504 dc =
s->last_dc[component];
506 s->last_dc[component] =
dc;
507 block[0] =
dc * (1 << (3 -
s->intra_dc_precision));
509 mismatch =
block[0] ^ 1;
511 if (
s->intra_vlc_format)
526 }
else if (
level != 0) {
531 level = (
level * qscale * quant_matrix[j]) >> 4;
546 level = (-
level * qscale * quant_matrix[j]) >> 4;
549 level = (
level * qscale * quant_matrix[j]) >> 4;
558 block[63] ^= mismatch & 1;
562 s->block_last_index[n] =
i;
571 int16_t *
block,
int n)
576 uint8_t *
const scantable =
s->intra_scantable.permutated;
577 const uint16_t *quant_matrix;
578 const int qscale =
s->qscale;
582 quant_matrix =
s->intra_matrix;
585 quant_matrix =
s->chroma_intra_matrix;
586 component = (n & 1) + 1;
589 dc =
s->last_dc[component];
591 s->last_dc[component] =
dc;
592 block[0] =
dc * (1 << (3 -
s->intra_dc_precision));
594 if (
s->intra_vlc_format)
607 if (
level >= 64 ||
i > 63) {
609 }
else if (
level != 0) {
612 level = (
level * qscale * quant_matrix[j]) >> 4;
625 level = (-
level * qscale * quant_matrix[j]) >> 4;
628 level = (
level * qscale * quant_matrix[j]) >> 4;
639 s->block_last_index[n] =
i;
662 int i, j, k, cbp,
val, mb_type, motion_type;
663 const int mb_block_count = 4 + (1 <<
s->chroma_format);
666 ff_tlog(
s->avctx,
"decode_mb: x=%d y=%d\n",
s->mb_x,
s->mb_y);
670 if (
s->mb_skip_run-- != 0) {
673 s->current_picture.mb_type[
s->mb_x +
s->mb_y *
s->mb_stride] =
679 mb_type =
s->current_picture.mb_type[
s->mb_x +
s->mb_y *
s->mb_stride - 1];
682 mb_type =
s->current_picture.mb_type[
s->mb_width + (
s->mb_y - 1) *
s->mb_stride - 1];
687 s->current_picture.mb_type[
s->mb_x +
s->mb_y *
s->mb_stride] =
690 if ((
s->mv[0][0][0] |
s->mv[0][0][1] |
s->mv[1][0][0] |
s->mv[1][0][1]) == 0)
697 switch (
s->pict_type) {
703 "Invalid mb type in I-frame at %d %d\n",
716 "Invalid mb type in P-frame at %d %d\n",
s->mb_x,
s->mb_y);
725 "Invalid mb type in B-frame at %d %d\n",
s->mb_x,
s->mb_y);
731 ff_tlog(
s->avctx,
"mb_type=%x\n", mb_type);
734 s->bdsp.clear_blocks(
s->block[0]);
736 if (!
s->chroma_y_shift)
737 s->bdsp.clear_blocks(
s->block[6]);
742 !
s->frame_pred_frame_dct)
748 if (
s->concealment_motion_vectors) {
754 s->last_mv[0][0][0] =
756 s->last_mv[0][0][0]);
758 s->last_mv[0][0][1] =
760 s->last_mv[0][0][1]);
762 check_marker(
s->avctx, &
s->gb,
"after concealment_motion_vectors");
765 memset(
s->last_mv, 0,
sizeof(
s->last_mv));
771 for (
i = 0;
i < 6;
i++)
774 for (
i = 0;
i < mb_block_count;
i++)
779 for (
i = 0;
i < 6;
i++) {
782 s->intra_scantable.permutated,
783 s->last_dc, *
s->pblocks[
i],
791 s->block_last_index[
i] =
ret;
801 && !
s->frame_pred_frame_dct)
807 s->field_select[0][0] =
s->picture_structure - 1;
813 s->last_mv[0][0][0] = 0;
814 s->last_mv[0][0][1] = 0;
815 s->last_mv[0][1][0] = 0;
816 s->last_mv[0][1][1] = 0;
823 if (
s->picture_structure ==
PICT_FRAME &&
s->frame_pred_frame_dct) {
835 s->mv_dir = (mb_type >> 13) & 3;
836 ff_tlog(
s->avctx,
"motion_type=%d\n", motion_type);
837 switch (motion_type) {
842 for (
i = 0;
i < 2;
i++) {
846 s->last_mv[
i][0][0] =
847 s->last_mv[
i][1][0] =
849 s->last_mv[
i][0][0]);
851 s->last_mv[
i][0][1] =
852 s->last_mv[
i][1][1] =
854 s->last_mv[
i][0][1]);
856 if (
s->full_pel[
i]) {
865 for (
i = 0;
i < 2;
i++) {
868 for (j = 0; j < 2; j++) {
870 for (k = 0; k < 2; k++) {
872 s->last_mv[
i][j][k]);
873 s->last_mv[
i][j][k] =
val;
874 s->mv[
i][j][k] =
val;
885 for (
i = 0;
i < 2;
i++) {
887 for (j = 0; j < 2; j++) {
890 s->last_mv[
i][j][0]);
891 s->last_mv[
i][j][0] =
val;
892 s->mv[
i][j][0] =
val;
895 s->last_mv[
i][j][1] >> 1);
896 s->last_mv[
i][j][1] = 2 *
val;
897 s->mv[
i][j][1] =
val;
905 for (
i = 0;
i < 2;
i++) {
908 for (k = 0; k < 2; k++) {
910 s->last_mv[
i][0][k]);
911 s->last_mv[
i][0][k] =
val;
912 s->last_mv[
i][1][k] =
val;
913 s->mv[
i][0][k] =
val;
920 if (
s->progressive_sequence){
925 for (
i = 0;
i < 2;
i++) {
927 int dmx, dmy, mx, my, m;
928 const int my_shift =
s->picture_structure ==
PICT_FRAME;
931 s->last_mv[
i][0][0]);
932 s->last_mv[
i][0][0] = mx;
933 s->last_mv[
i][1][0] = mx;
936 s->last_mv[
i][0][1] >> my_shift);
940 s->last_mv[
i][0][1] = my * (1 << my_shift);
941 s->last_mv[
i][1][1] = my * (1 << my_shift);
952 m =
s->top_field_first ? 1 : 3;
955 s->mv[
i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
956 s->mv[
i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1;
958 s->mv[
i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
959 s->mv[
i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1;
963 s->mv[
i][2][0] = ((mx + (mx > 0)) >> 1) + dmx;
964 s->mv[
i][2][1] = ((my + (my > 0)) >> 1) + dmy;
975 "00 motion_type at %d %d\n",
s->mb_x,
s->mb_y);
982 s->bdsp.clear_blocks(
s->block[0]);
985 if (mb_block_count > 6) {
986 cbp *= 1 << mb_block_count - 6;
987 cbp |=
get_bits(&
s->gb, mb_block_count - 6);
988 s->bdsp.clear_blocks(
s->block[6]);
992 "invalid cbp %d at %d %d\n", cbp,
s->mb_x,
s->mb_y);
998 for (
i = 0;
i < 6;
i++) {
1002 s->block_last_index[
i] = -1;
1006 cbp <<= 12 - mb_block_count;
1008 for (
i = 0;
i < mb_block_count;
i++) {
1009 if (cbp & (1 << 11)) {
1013 s->block_last_index[
i] = -1;
1020 for (
i = 0;
i < 6;
i++) {
1024 s->block_last_index[
i] = -1;
1028 for (
i = 0;
i < 6;
i++) {
1033 s->block_last_index[
i] = -1;
1040 for (
i = 0;
i < 12;
i++)
1041 s->block_last_index[
i] = -1;
1045 s->current_picture.mb_type[
s->mb_x +
s->mb_y *
s->mb_stride] = mb_type;
1062 s2->chroma_format = 1;
1063 s->mpeg_enc_ctx_allocated = 0;
1064 s->repeat_field = 0;
1070 static int mpeg_decode_update_thread_context(
AVCodecContext *avctx,
1077 if (avctx == avctx_from ||
1078 !ctx_from->mpeg_enc_ctx_allocated ||
1079 !
s1->context_initialized)
1086 if (!
ctx->mpeg_enc_ctx_allocated)
1094 #if CONFIG_MPEG1_NVDEC_HWACCEL
1097 #if CONFIG_MPEG1_VDPAU_HWACCEL
1105 #if CONFIG_MPEG2_NVDEC_HWACCEL
1108 #if CONFIG_MPEG2_VDPAU_HWACCEL
1111 #if CONFIG_MPEG2_DXVA2_HWACCEL
1114 #if CONFIG_MPEG2_D3D11VA_HWACCEL
1118 #if CONFIG_MPEG2_VAAPI_HWACCEL
1121 #if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
1147 if (
s->chroma_format < 2)
1151 else if (
s->chroma_format == 2)
1173 if (
s1->aspect_ratio_info > 1) {
1177 s1->pan_scan.height }),
1184 if ((
s1->pan_scan.width == 0) || (
s1->pan_scan.height == 0) ||
1187 s->avctx->sample_aspect_ratio =
1191 s->avctx->sample_aspect_ratio =
1193 (
AVRational) { s1->pan_scan.width, s1->pan_scan.height });
1198 ff_dlog(avctx,
"aspect A %d/%d\n",
1201 ff_dlog(avctx,
"aspect B %d/%d\n",
s->avctx->sample_aspect_ratio.num,
1202 s->avctx->sample_aspect_ratio.den);
1205 s->avctx->sample_aspect_ratio =
1218 if ((
s1->mpeg_enc_ctx_allocated == 0) ||
1221 s1->save_width !=
s->width ||
1222 s1->save_height !=
s->height ||
1223 av_cmp_q(
s1->save_aspect,
s->avctx->sample_aspect_ratio) ||
1224 (
s1->save_progressive_seq !=
s->progressive_sequence &&
FFALIGN(
s->height, 16) !=
FFALIGN(
s->height, 32)) ||
1226 if (
s1->mpeg_enc_ctx_allocated) {
1228 s1->mpeg_enc_ctx_allocated = 0;
1236 (
s->bit_rate != 0x3FFFF*400)) {
1239 (
s->bit_rate != 0x3FFFF*400 ||
s->vbv_delay != 0xFFFF)) {
1242 s1->save_aspect =
s->avctx->sample_aspect_ratio;
1243 s1->save_width =
s->width;
1244 s1->save_height =
s->height;
1245 s1->save_progressive_seq =
s->progressive_sequence;
1254 #if FF_API_TICKS_PER_FRAME
1264 &
s->avctx->framerate.den,
1268 #if FF_API_TICKS_PER_FRAME
1274 switch (
s->chroma_format) {
1287 s1->mpeg_enc_ctx_allocated = 1;
1297 int ref, f_code, vbv_delay,
ret;
1305 if (
s->pict_type == 0 ||
s->pict_type > 3)
1309 s->vbv_delay = vbv_delay;
1317 s->mpeg_f_code[0][0] = f_code;
1318 s->mpeg_f_code[0][1] = f_code;
1326 s->mpeg_f_code[1][0] = f_code;
1327 s->mpeg_f_code[1][1] = f_code;
1332 "vbv_delay %d, ref %d type:%d\n", vbv_delay,
ref,
s->pict_type);
1342 int horiz_size_ext, vert_size_ext;
1351 if (!
s->chroma_format) {
1352 s->chroma_format = 1;
1358 s->width |= (horiz_size_ext << 12);
1359 s->height |= (vert_size_ext << 12);
1361 s->bit_rate += (bit_rate_ext << 18) * 400LL;
1363 s->avctx->rc_buffer_size +=
get_bits(&
s->gb, 8) * 1024 * 16 << 10;
1372 ff_dlog(
s->avctx,
"sequence extension\n");
1377 "profile: %d, level: %d ps: %d cf:%d vbv buffer: %d, bitrate:%"PRId64
"\n",
1378 s->avctx->profile,
s->avctx->level,
s->progressive_sequence,
s->chroma_format,
1379 s->avctx->rc_buffer_size,
s->bit_rate);
1385 int color_description,
w,
h;
1389 if (color_description) {
1390 s->avctx->color_primaries =
get_bits(&
s->gb, 8);
1399 s1->pan_scan.width = 16 *
w;
1400 s1->pan_scan.height = 16 *
h;
1412 if (
s->progressive_sequence) {
1413 if (
s->repeat_first_field) {
1415 if (
s->top_field_first)
1421 if (
s->repeat_first_field)
1425 for (
i = 0;
i < nofco;
i++) {
1434 "pde (%"PRId16
",%"PRId16
") (%"PRId16
",%"PRId16
") (%"PRId16
",%"PRId16
")\n",
1435 s1->pan_scan.position[0][0],
s1->pan_scan.position[0][1],
1436 s1->pan_scan.position[1][0],
s1->pan_scan.position[1][1],
1437 s1->pan_scan.position[2][0],
s1->pan_scan.position[2][1]);
1441 uint16_t matrix1[64],
int intra)
1445 for (
i = 0;
i < 64;
i++) {
1452 if (intra &&
i == 0 && v != 8) {
1453 av_log(
s->avctx,
AV_LOG_DEBUG,
"intra matrix specifies invalid DC quantizer %d, ignoring\n", v);
1465 ff_dlog(
s->avctx,
"matrix extension\n");
1481 s->full_pel[0] =
s->full_pel[1] = 0;
1486 s->mpeg_f_code[0][0] += !
s->mpeg_f_code[0][0];
1487 s->mpeg_f_code[0][1] += !
s->mpeg_f_code[0][1];
1488 s->mpeg_f_code[1][0] += !
s->mpeg_f_code[1][0];
1489 s->mpeg_f_code[1][1] += !
s->mpeg_f_code[1][1];
1490 if (!
s->pict_type &&
s1->mpeg_enc_ctx_allocated) {
1495 if (
s->mpeg_f_code[1][0] == 15 &&
s->mpeg_f_code[1][1] == 15) {
1496 if (
s->mpeg_f_code[0][0] == 15 &&
s->mpeg_f_code[0][1] == 15)
1508 s->concealment_motion_vectors =
get_bits1(&
s->gb);
1516 if (
s->alternate_scan) {
1525 ff_dlog(
s->avctx,
"intra_dc_precision=%d\n",
s->intra_dc_precision);
1526 ff_dlog(
s->avctx,
"picture_structure=%d\n",
s->picture_structure);
1527 ff_dlog(
s->avctx,
"top field first=%d\n",
s->top_field_first);
1528 ff_dlog(
s->avctx,
"repeat first field=%d\n",
s->repeat_first_field);
1529 ff_dlog(
s->avctx,
"conceal=%d\n",
s->concealment_motion_vectors);
1530 ff_dlog(
s->avctx,
"intra_vlc_format=%d\n",
s->intra_vlc_format);
1531 ff_dlog(
s->avctx,
"alternate_scan=%d\n",
s->alternate_scan);
1532 ff_dlog(
s->avctx,
"frame_pred_frame_dct=%d\n",
s->frame_pred_frame_dct);
1533 ff_dlog(
s->avctx,
"progressive_frame=%d\n",
s->progressive_frame);
1545 if (
s->mb_width *
s->mb_height * 11LL / (33 * 2 * 8) > buf_size)
1550 if (
s->first_field ||
s->picture_structure ==
PICT_FRAME) {
1559 s->current_picture_ptr->f->repeat_pict = 0;
1560 if (
s->repeat_first_field) {
1561 if (
s->progressive_sequence) {
1562 if (
s->top_field_first)
1563 s->current_picture_ptr->f->repeat_pict = 4;
1565 s->current_picture_ptr->f->repeat_pict = 2;
1566 }
else if (
s->progressive_frame) {
1567 s->current_picture_ptr->f->repeat_pict = 1;
1573 sizeof(
s1->pan_scan));
1576 memcpy(pan_scan->
data, &
s1->pan_scan,
sizeof(
s1->pan_scan));
1578 if (
s1->a53_buf_ref) {
1587 if (
s1->has_stereo3d) {
1592 *stereo =
s1->stereo3d;
1593 s1->has_stereo3d = 0;
1612 if (!
s->current_picture_ptr) {
1617 if (
s->avctx->hwaccel) {
1620 "hardware accelerator failed to decode first field\n");
1625 for (
i = 0;
i < 4;
i++) {
1626 s->current_picture.f->data[
i] =
s->current_picture_ptr->f->data[
i];
1628 s->current_picture.f->data[
i] +=
1629 s->current_picture_ptr->f->linesize[
i];
1634 if ((
ret =
FF_HW_CALL(avctx, start_frame, buf, buf_size)) < 0)
1641 #define DECODE_SLICE_ERROR -1
1642 #define DECODE_SLICE_OK 0
1651 const uint8_t **buf,
int buf_size)
1654 const int lowres =
s->avctx->lowres;
1655 const int field_pic =
s->picture_structure !=
PICT_FRAME;
1659 s->resync_mb_y = -1;
1671 s->interlaced_dct = 0;
1675 if (
s->qscale == 0) {
1686 if (mb_y == 0 &&
s->codec_tag ==
AV_RL32(
"SLIF")) {
1707 if (
s->mb_x >= (
unsigned)
s->mb_width) {
1713 const uint8_t *buf_end, *buf_start = *buf - 4;
1716 if (buf_end < *buf + buf_size)
1725 s->resync_mb_x =
s->mb_x;
1726 s->resync_mb_y =
s->mb_y = mb_y;
1730 if (
s->mb_y == 0 &&
s->mb_x == 0 && (
s->first_field ||
s->picture_structure ==
PICT_FRAME)) {
1733 "qp:%d fc:%2d%2d%2d%2d %c %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n",
1735 s->mpeg_f_code[0][0],
s->mpeg_f_code[0][1],
1736 s->mpeg_f_code[1][0],
s->mpeg_f_code[1][1],
1740 s->progressive_sequence ?
"ps" :
"",
1741 s->progressive_frame ?
"pf" :
"",
1742 s->alternate_scan ?
"alt" :
"",
1743 s->top_field_first ?
"top" :
"",
1744 s->intra_dc_precision,
s->picture_structure,
1745 s->frame_pred_frame_dct,
s->concealment_motion_vectors,
1746 s->q_scale_type,
s->intra_vlc_format,
1747 s->repeat_first_field,
s->chroma_420_type ?
"420" :
"");
1756 if (
s->current_picture.motion_val[0]) {
1757 const int wrap =
s->b8_stride;
1758 int xy =
s->mb_x * 2 +
s->mb_y * 2 *
wrap;
1759 int b8_xy = 4 * (
s->mb_x +
s->mb_y *
s->mb_stride);
1760 int motion_x, motion_y, dir,
i;
1762 for (
i = 0;
i < 2;
i++) {
1763 for (dir = 0; dir < 2; dir++) {
1766 motion_x = motion_y = 0;
1769 motion_x =
s->mv[dir][0][0];
1770 motion_y =
s->mv[dir][0][1];
1772 motion_x =
s->mv[dir][
i][0];
1773 motion_y =
s->mv[dir][
i][1];
1776 s->current_picture.motion_val[dir][xy][0] = motion_x;
1777 s->current_picture.motion_val[dir][xy][1] = motion_y;
1778 s->current_picture.motion_val[dir][xy + 1][0] = motion_x;
1779 s->current_picture.motion_val[dir][xy + 1][1] = motion_y;
1780 s->current_picture.ref_index [dir][b8_xy] =
1781 s->current_picture.ref_index [dir][b8_xy + 1] =
s->field_select[dir][
i];
1783 s->field_select[dir][
i] == 1);
1791 s->dest[1] +=(16 >>
lowres) >>
s->chroma_x_shift;
1792 s->dest[2] +=(16 >>
lowres) >>
s->chroma_x_shift;
1796 if (++
s->mb_x >=
s->mb_width) {
1797 const int mb_size = 16 >>
s->avctx->lowres;
1804 s->mb_y += 1 << field_pic;
1806 if (
s->mb_y >=
s->mb_height) {
1808 int is_d10 =
s->chroma_format == 2 &&
1811 s->intra_dc_precision == 2 &&
1812 s->q_scale_type == 1 &&
s->alternate_scan == 0 &&
1813 s->progressive_frame == 0
1816 if (
left >= 32 && !is_d10) {
1843 if (
s->mb_y >= ((
s->height + 15) >> 4) &&
1844 !
s->progressive_sequence &&
1847 s->mb_skip_run == -1 &&
1855 if (
s->mb_skip_run == -1) {
1867 s->mb_skip_run += 33;
1868 }
else if (
code == 35) {
1869 if (
s->mb_skip_run != 0 ||
show_bits(&
s->gb, 15) != 0) {
1877 s->mb_skip_run +=
code;
1881 if (
s->mb_skip_run) {
1885 "skipped MB in I-frame at %d %d\n",
s->mb_x,
s->mb_y);
1891 for (
i = 0;
i < 12;
i++)
1892 s->block_last_index[
i] = -1;
1900 s->mv[0][0][0] =
s->mv[0][0][1] = 0;
1901 s->last_mv[0][0][0] =
s->last_mv[0][0][1] = 0;
1902 s->last_mv[0][1][0] =
s->last_mv[0][1][1] = 0;
1903 s->field_select[0][0] = (
s->picture_structure - 1) & 1;
1906 s->mv[0][0][0] =
s->last_mv[0][0][0];
1907 s->mv[0][0][1] =
s->last_mv[0][0][1];
1908 s->mv[1][0][0] =
s->last_mv[1][0][0];
1909 s->mv[1][0][1] =
s->last_mv[1][0][1];
1910 s->field_select[0][0] = (
s->picture_structure - 1) & 1;
1911 s->field_select[1][0] = (
s->picture_structure - 1) & 1;
1922 ff_dlog(
s,
"Slice start:%d %d end:%d %d\n",
s->resync_mb_x,
s->resync_mb_y,
s->mb_x,
s->mb_y);
1929 const uint8_t *buf =
s->gb.buffer;
1930 int mb_y =
s->start_mb_y;
1931 const int field_pic =
s->picture_structure !=
PICT_FRAME;
1933 s->er.error_count = (3 * (
s->end_mb_y -
s->start_mb_y) *
s->mb_width) >> field_pic;
1941 ff_dlog(
c,
"ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n",
1942 ret,
s->resync_mb_x,
s->resync_mb_y,
s->mb_x,
s->mb_y,
1943 s->start_mb_y,
s->end_mb_y,
s->er.error_count);
1947 if (
s->resync_mb_x >= 0 &&
s->resync_mb_y >= 0)
1953 s->mb_x - 1,
s->mb_y,
1957 if (
s->mb_y ==
s->end_mb_y)
1966 mb_y += (*buf&0xE0)<<2;
1970 if (mb_y >=
s->end_mb_y)
1984 if (!
s1->mpeg_enc_ctx_allocated || !
s->current_picture_ptr)
1987 if (
s->avctx->hwaccel) {
1991 "hardware accelerator failed to decode picture\n");
1997 if ( !
s->first_field && !
s1->first_slice) {
2012 if (
s->last_picture_ptr) {
2028 const uint8_t *buf,
int buf_size)
2043 "Invalid horizontal or vertical size value.\n");
2048 if (
s1->aspect_ratio_info == 0) {
2054 if (
s1->frame_rate_index == 0 ||
s1->frame_rate_index > 13) {
2056 "frame_rate_index %d is invalid\n",
s1->frame_rate_index);
2057 s1->frame_rate_index = 1;
2064 s->avctx->rc_buffer_size =
get_bits(&
s->gb, 10) * 1024 * 16;
2071 for (
i = 0;
i < 64;
i++) {
2072 j =
s->idsp.idct_permutation[
i];
2074 s->intra_matrix[j] = v;
2075 s->chroma_intra_matrix[j] = v;
2081 for (
i = 0;
i < 64;
i++) {
2082 int j =
s->idsp.idct_permutation[
i];
2084 s->inter_matrix[j] = v;
2085 s->chroma_inter_matrix[j] = v;
2098 s->progressive_sequence = 1;
2099 s->progressive_frame = 1;
2102 s->frame_pred_frame_dct = 1;
2103 s->chroma_format = 1;
2111 av_log(
s->avctx,
AV_LOG_DEBUG,
"vbv buffer: %d, bitrate:%"PRId64
", aspect_ratio_info: %d \n",
2112 s->avctx->rc_buffer_size,
s->bit_rate,
s1->aspect_ratio_info);
2125 if (
s1->mpeg_enc_ctx_allocated) {
2127 s1->mpeg_enc_ctx_allocated = 0;
2138 s1->mpeg_enc_ctx_allocated = 1;
2140 for (
i = 0;
i < 64;
i++) {
2141 int j =
s->idsp.idct_permutation[
i];
2143 s->intra_matrix[j] = v;
2144 s->chroma_intra_matrix[j] = v;
2147 s->inter_matrix[j] = v;
2148 s->chroma_inter_matrix[j] = v;
2151 s->progressive_sequence = 1;
2152 s->progressive_frame = 1;
2155 s->frame_pred_frame_dct = 1;
2156 s->chroma_format = 1;
2157 if (
s->codec_tag ==
AV_RL32(
"BW10")) {
2162 s1->save_width =
s->width;
2163 s1->save_height =
s->height;
2164 s1->save_progressive_seq =
s->progressive_sequence;
2169 const uint8_t *p,
int buf_size)
2173 if (buf_size >= 6 &&
2174 p[0] ==
'G' && p[1] ==
'A' && p[2] ==
'9' && p[3] ==
'4' &&
2175 p[4] == 3 && (p[5] & 0x40)) {
2177 int cc_count = p[5] & 0x1f;
2178 if (cc_count > 0 && buf_size >= 7 + cc_count * 3) {
2179 int old_size =
s1->a53_buf_ref ?
s1->a53_buf_ref->size : 0;
2180 const uint64_t new_size = (old_size + cc_count
2189 memcpy(
s1->a53_buf_ref->data + old_size, p + 7, cc_count * UINT64_C(3));
2194 }
else if (buf_size >= 2 &&
2195 p[0] == 0x03 && (p[1]&0x7f) == 0x01) {
2206 int old_size =
s1->a53_buf_ref ?
s1->a53_buf_ref->size : 0;
2207 const uint64_t new_size = (old_size + cc_count
2214 uint8_t
field, cc1, cc2;
2215 uint8_t *cap =
s1->a53_buf_ref->data;
2217 memset(
s1->a53_buf_ref->data + old_size, 0, cc_count * 3);
2227 cap[0] = cap[1] = cap[2] = 0x00;
2231 cap[0] = 0x04 |
field;
2241 }
else if (buf_size >= 11 &&
2242 p[0] ==
'C' && p[1] ==
'C' && p[2] == 0x01 && p[3] == 0xf8) {
2272 for (
i = 5;
i + 6 <= buf_size && ((p[
i] & 0xfe) == 0xfe);
i += 6)
2276 int old_size =
s1->a53_buf_ref ?
s1->a53_buf_ref->size : 0;
2277 const uint64_t new_size = (old_size + cc_count
2284 uint8_t field1 = !!(p[4] & 0x80);
2285 uint8_t *cap =
s1->a53_buf_ref->data;
2287 for (
i = 0;
i < cc_count;
i++) {
2288 cap[0] = (p[0] == 0xff && field1) ? 0xfc : 0xfd;
2291 cap[3] = (p[3] == 0xff && !field1) ? 0xfc : 0xfd;
2306 const uint8_t *p,
int buf_size)
2309 const uint8_t *buf_end = p + buf_size;
2314 for(
i=0; !(!p[
i-2] && !p[
i-1] && p[
i]==1) &&
i<buf_size;
i++){
2323 if (!memcmp(p+
i,
"\0TMPGEXS\0", 9)){
2328 if (buf_end - p >= 5 &&
2329 p[0] ==
'D' && p[1] ==
'T' && p[2] ==
'G' && p[3] ==
'1') {
2337 if (buf_end - p < 1)
2340 s1->afd = p[0] & 0x0f;
2342 }
else if (buf_end - p >= 6 &&
2343 p[0] ==
'J' && p[1] ==
'P' && p[2] ==
'3' && p[3] ==
'D' &&
2346 const uint8_t S3D_video_format_type = p[5] & 0x7F;
2348 if (S3D_video_format_type == 0x03 ||
2349 S3D_video_format_type == 0x04 ||
2350 S3D_video_format_type == 0x08 ||
2351 S3D_video_format_type == 0x23) {
2353 s1->has_stereo3d = 1;
2355 switch (S3D_video_format_type) {
2376 const uint8_t *buf,
int buf_size)
2399 "GOP (%s) closed_gop=%d broken_link=%d\n",
2400 tcbuf,
s1->closed_gop, broken_link);
2407 int *got_output,
const uint8_t *buf,
int buf_size)
2411 const uint8_t *buf_ptr = buf;
2412 const uint8_t *buf_end = buf + buf_size;
2413 int ret, input_size;
2414 int last_code = 0, skip_frame = 0;
2415 int picture_start_code_seen = 0;
2430 &
s2->thread_context[0],
NULL,
2431 s->slice_count,
sizeof(
void *));
2432 for (
i = 0;
i <
s->slice_count;
i++)
2433 s2->er.error_count +=
s2->thread_context[
i]->er.error_count;
2450 return FFMAX(0, buf_ptr - buf);
2453 input_size = buf_end - buf_ptr;
2462 if (last_code == 0) {
2468 "ignoring SEQ_START_CODE after %X\n", last_code);
2475 if (picture_start_code_seen &&
s2->picture_structure ==
PICT_FRAME) {
2481 picture_start_code_seen = 1;
2488 if (
s2->width <= 0 ||
s2->height <= 0) {
2490 s2->width,
s2->height);
2495 s2->intra_dc_precision= 3;
2496 s2->intra_matrix[0]= 1;
2499 !avctx->
hwaccel &&
s->slice_count) {
2503 s2->thread_context,
NULL,
2504 s->slice_count,
sizeof(
void *));
2505 for (
i = 0;
i <
s->slice_count;
i++)
2506 s2->er.error_count +=
s2->thread_context[
i]->er.error_count;
2513 "mpeg_decode_postinit() failure\n");
2524 "ignoring pic after %X\n", last_code);
2536 if (last_code == 0) {
2540 "ignoring seq ext after %X\n", last_code);
2561 "ignoring pic cod ext after %X\n", last_code);
2572 if (last_code == 0) {
2573 s2->first_field = 0;
2580 "ignoring GOP_START_CODE after %X\n", last_code);
2588 if (
s2->progressive_sequence && !
s2->progressive_frame) {
2589 s2->progressive_frame = 1;
2591 "interlaced frame in progressive sequence, ignoring\n");
2594 if (
s2->picture_structure == 0 ||
2595 (
s2->progressive_frame &&
s2->picture_structure !=
PICT_FRAME)) {
2597 "picture_structure %d invalid, ignoring\n",
2598 s2->picture_structure);
2602 if (
s2->progressive_sequence && !
s2->frame_pred_frame_dct)
2606 s2->first_field = 0;
2607 s2->v_edge_pos = 16 *
s2->mb_height;
2609 s2->first_field ^= 1;
2610 s2->v_edge_pos = 8 *
s2->mb_height;
2611 memset(
s2->mbskip_table, 0,
s2->mb_stride *
s2->mb_height);
2616 const int field_pic =
s2->picture_structure !=
PICT_FRAME;
2620 mb_y += (*buf_ptr&0xE0)<<2;
2626 if (buf_end - buf_ptr < 2) {
2631 if (mb_y >=
s2->mb_height) {
2633 "slice below image (%d >= %d)\n", mb_y,
s2->mb_height);
2637 if (!
s2->last_picture_ptr) {
2641 if (!
s->closed_gop) {
2644 "Skipping B slice due to open GOP\n");
2651 if (!
s2->next_picture_ptr) {
2657 "Skipping P slice due to !sync\n");
2670 if (!
s->mpeg_enc_ctx_allocated)
2674 if (mb_y < avctx->skip_top ||
2679 if (!
s2->pict_type) {
2686 if (
s->first_slice) {
2692 if (!
s2->current_picture_ptr) {
2694 "current_picture not initialized\n");
2701 int threshold = (
s2->mb_height *
s->slice_count +
2702 s2->slice_context_count / 2) /
2703 s2->slice_context_count;
2705 if (threshold <= mb_y) {
2710 if (
s->slice_count) {
2711 s2->thread_context[
s->slice_count - 1]->end_mb_y = mb_y;
2729 if (
s2->resync_mb_x >= 0 &&
s2->resync_mb_y >= 0)
2731 s2->resync_mb_y,
s2->mb_x,
s2->mb_y,
2735 s2->resync_mb_y,
s2->mb_x - 1,
s2->mb_y,
2748 const uint8_t *buf = avpkt->
data;
2750 int buf_size = avpkt->
size;
2756 if (
s2->low_delay == 0 &&
s2->next_picture_ptr) {
2761 s2->next_picture_ptr =
NULL;
2768 if (
s->mpeg_enc_ctx_allocated == 0 && (
s2->codec_tag ==
AV_RL32(
"VCR2")
2775 if (avctx->
extradata && !
s->extradata_decoded) {
2783 s->extradata_decoded = 1;
2785 s2->current_picture_ptr =
NULL;
2791 if (
ret<0 || *got_output) {
2792 s2->current_picture_ptr =
NULL;
2794 if (
s->timecode_frame_start != -1 && *got_output) {
2801 memcpy(tcside->
data, &
s->timecode_frame_start,
sizeof(int64_t));
2806 s->timecode_frame_start = -1;
2828 if (
s->mpeg_enc_ctx_allocated)
2835 .
p.
name =
"mpeg1video",
2850 #if CONFIG_MPEG1_NVDEC_HWACCEL
2853 #if CONFIG_MPEG1_VDPAU_HWACCEL
2856 #if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL
2864 .
p.
name =
"mpeg2video",
2879 #if CONFIG_MPEG2_DXVA2_HWACCEL
2882 #if CONFIG_MPEG2_D3D11VA_HWACCEL
2885 #if CONFIG_MPEG2_D3D11VA2_HWACCEL
2888 #if CONFIG_MPEG2_NVDEC_HWACCEL
2891 #if CONFIG_MPEG2_VAAPI_HWACCEL
2894 #if CONFIG_MPEG2_VDPAU_HWACCEL
2897 #if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
2906 .
p.
name =
"mpegvideo",
2937 if (avpkt->
size*8LL < (avctx->
width+15)/16 * ((avctx->
height+15)/16) * (2 + 3*4 + 2*2 + 2*6))
2954 if (
s->flags & 0x10) {
2965 for (
int y = 0; y < avctx->
height; y += 16) {
2968 for (
int x = 0; x < avctx->
width; x += 16) {
2987 memset(
s->block, 0,
sizeof(
s->block));
2989 for (
int n = 0; n < 6; n++) {
2990 if (
s->flags & 0x80) {
3042 for (
int i = 0;
i < 64;
i++) {
3049 for (
int i = 0;
i < 64;
i++) {
static int vcr2_init_sequence(AVCodecContext *avctx)
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
#define FF_ENABLE_DEPRECATION_WARNINGS
#define MV_TYPE_16X16
1 vector for the whole mb
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_TIMECODE_STR_SIZE
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
AVPixelFormat
Pixel format.
#define AV_EF_EXPLODE
abort decoding on minor error detection
AVBufferRef * a53_buf_ref
const AVRational ff_mpeg2_aspect[16]
#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 mpeg_decode_a53_cc(AVCodecContext *avctx, const uint8_t *p, int buf_size)
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
static int decode_slice(AVCodecContext *c, void *arg)
int ff_mpv_export_qp_table(const MpegEncContext *s, AVFrame *f, const Picture *p, int qp_type)
@ AV_STEREO3D_SIDEBYSIDE_QUINCUNX
Views are next to each other, but when upscaling apply a checkerboard pattern.
#define FF_MPV_QSCALE_TYPE_MPEG2
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
static int mpeg_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_output, AVPacket *avpkt)
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, size_t size)
Add a new side data to a frame.
#define check_scantable_index(ctx, x)
@ AV_FRAME_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
#define MV_TYPE_16X8
2 vectors, one per 16x8 block
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
#define SLICE_MAX_START_CODE
static int get_bits_count(const GetBitContext *s)
static av_cold int ipu_decode_init(AVCodecContext *avctx)
int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src)
This structure describes decoded (raw) audio or video data.
void ff_mpv_report_decode_progress(MpegEncContext *s)
#define HWACCEL_DXVA2(codec)
const FFCodec ff_mpegvideo_decoder
static av_cold int ipu_decode_end(AVCodecContext *avctx)
static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
static int mpeg2_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
#define HWACCEL_D3D11VA2(codec)
const uint8_t ff_reverse[256]
int last_dc[3]
last DC values for MPEG-1
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
static int mpeg2_fast_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
Changing this would eat up any speed benefits it has.
#define PICT_BOTTOM_FIELD
#define FF_HW_SIMPLE_CALL(avctx, function)
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
void ff_init_block_index(MpegEncContext *s)
#define UPDATE_CACHE(name, gb)
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
static int mpeg_decode_postinit(AVCodecContext *avctx)
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
#define FF_DEBUG_PICT_INFO
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define MV_TYPE_DMV
2 vectors, special mpeg2 Dual Prime Vectors
#define GET_CACHE(name, gb)
static void skip_bits(GetBitContext *s, int n)
RL_VLC_ELEM ff_mpeg2_rl_vlc[674]
ScanTable intra_scantable
@ AV_STEREO3D_SIDEBYSIDE
Views are next to each other.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
AVCodec p
The public AVCodec.
static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, int *got_output, const uint8_t *buf, int buf_size)
enum AVDiscard skip_frame
Skip decoding for selected frames.
static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
@ AV_STEREO3D_2D
Video is not stereoscopic (and metadata has to be there).
#define AV_EF_BITSTREAM
detect bitstream specification deviations
#define USES_LIST(a, list)
static int slice_decode_thread(AVCodecContext *c, void *arg)
int flags
AV_CODEC_FLAG_*.
void(* idct_put)(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
static double val(void *priv, double ch)
#define HWACCEL_VDPAU(codec)
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
static enum AVPixelFormat mpeg12_pixfmt_list_444[]
void ff_print_debug_info(const MpegEncContext *s, const Picture *p, AVFrame *pict)
static int mpeg1_decode_sequence(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[]
void ff_mpv_common_end(MpegEncContext *s)
const FFCodec ff_mpeg2video_decoder
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
unsigned frame_rate_index
static int ipu_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
static enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[]
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
static int mpeg1_decode_picture(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static void flush(AVCodecContext *avctx)
#define CLOSE_READER(name, gb)
int has_b_frames
Size of the frame reordering buffer in the decoder.
void ff_er_frame_end(ERContext *s, int *decode_error_flags)
Indicate that a frame has finished decoding and perform error concealment in case it has been enabled...
#define FF_CODEC_DECODE_CB(func)
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
const float ff_mpeg1_aspect[16]
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
int mpeg_enc_ctx_allocated
#define SHOW_SBITS(name, gb, num)
int(* init)(AVBSFContext *ctx)
void ff_mpeg_er_frame_start(MpegEncContext *s)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
unsigned aspect_ratio_info
static enum AVPixelFormat pix_fmts[]
static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1)
static int get_sbits(GetBitContext *s, int n)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static enum AVPixelFormat mpeg12_pixfmt_list_422[]
#define SKIP_BITS(name, gb, num)
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 field
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
int64_t rc_max_rate
maximum bitrate
#define CODEC_LONG_NAME(str)
@ AVDISCARD_ALL
discard all
#define MB_PTYPE_VLC_BITS
#define PTRDIFF_SPECIFIER
enum AVColorRange color_range
MPEG vs JPEG YUV range.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
#define SLICE_MIN_START_CODE
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Rational number (pair of numerator and denominator).
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
int64_t bit_rate
the average bitrate
static void mpeg_decode_picture_display_extension(Mpeg1Context *s1)
uint16_t inter_matrix[64]
#define AV_CODEC_FLAG2_FAST
Allow non spec compliant speedup tricks.
@ AV_PICTURE_TYPE_I
Intra.
static unsigned int get_bits1(GetBitContext *s)
#define LAST_SKIP_BITS(name, gb, num)
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
AVFrameSideData * av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf)
Add a new side data to a frame from an existing AVBufferRef.
RL_VLC_ELEM ff_mpeg1_rl_vlc[680]
#define MB_BTYPE_VLC_BITS
#define UPDATE_THREAD_CONTEXT(func)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
@ AV_FRAME_DATA_AFD
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using AVAc...
int level
Encoding level descriptor.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
@ AVDISCARD_NONKEY
discard all frames except keyframes
static int check_marker(void *logctx, GetBitContext *s, const char *msg)
int flags2
AV_CODEC_FLAG2_*.
enum AVPictureType pict_type
Picture type of the frame.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#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.
@ AV_FRAME_DATA_PANSCAN
The data is the AVPanScan struct defined in libavcodec.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
#define DECLARE_ALIGNED(n, t, v)
static int shift(int a, int b)
uint16_t intra_matrix[64]
matrix transmitted in the bitstream
void ff_mpeg1_clean_buffers(MpegEncContext *s)
const FFCodec ff_mpeg1video_decoder
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h)
#define PICTURE_START_CODE
int skip_bottom
Number of macroblock rows at the bottom which are skipped.
const uint16_t ff_mpeg1_default_intra_matrix[256]
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
#define MB_TYPE_INTERLACED
#define OPEN_READER(name, gb)
void ff_mpeg_flush(AVCodecContext *avctx)
static av_cold int mpeg_decode_init(AVCodecContext *avctx)
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
#define HWACCEL_D3D11VA(codec)
int ff_mpeg1_decode_block_intra(GetBitContext *gb, const uint16_t *quant_matrix, const uint8_t *scantable, int last_dc[3], int16_t *block, int index, int qscale)
#define MV_TYPE_FIELD
2 vectors, one per field
static void skip_bits1(GetBitContext *s)
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
#define HWACCEL_NVDEC(codec)
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
#define FF_THREAD_FRAME
Decode more than one frame at once.
const AVProfile ff_mpeg2_video_profiles[]
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
av_cold void ff_init_scantable(const uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
int block_last_index[12]
last non zero coefficient in block
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
uint16_t chroma_inter_matrix[64]
#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
#define AV_CODEC_FLAG2_SHOW_ALL
Show all frames before the first keyframe.
unsigned properties
Properties of the stream that gets decoded.
const uint8_t ff_alternate_vertical_scan[64]
static const uint32_t btype2mb_type[11]
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx)
Initialize the given MpegEncContext for decoding.
@ AV_STEREO3D_TOPBOTTOM
Views are on top of each other.
av_cold void ff_mpeg12_init_vlcs(void)
#define FF_DEBUG_STARTCODE
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
static int mpeg1_decode_block_inter(MpegEncContext *s, int16_t *block, int n)
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
static const uint32_t ptype2mb_type[7]
const char * name
Name of the codec implementation.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
#define HWACCEL_VIDEOTOOLBOX(codec)
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)
const uint8_t ff_zigzag_direct[64]
const AVRational ff_mpeg12_frame_rate_tab[]
static int mpeg_decode_gop(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
static const float pred[4]
@ AV_FRAME_DATA_GOP_TIMECODE
The GOP timecode in 25 bit timecode format.
const uint16_t ff_mpeg1_default_non_intra_matrix[64]
static int mpeg1_fast_decode_block_inter(MpegEncContext *s, int16_t *block, int n)
Changing this would eat up any speed benefits it has.
static const uint8_t * align_get_bits(GetBitContext *s)
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 as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards. If some code can 't be moved
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
static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
#define AV_CODEC_FLAG2_CHUNKS
Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, int16_t *block, int n)
Changing this would eat up any speed benefits it has.
static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
static int skip_1stop_8data_bits(GetBitContext *gb)
main external API structure.
int active_thread_type
Which multithreading methods are in use by the codec.
char * av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit)
Get the timecode string from the 25-bit timecode format (MPEG GOP format).
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
#define SHOW_UBITS(name, gb, num)
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
#define FF_HW_CALL(avctx, function,...)
AVDictionary * metadata
metadata.
static av_const int sign_extend(int val, unsigned bits)
void ff_mpv_frame_end(MpegEncContext *s)
static int ref[MAX_W *MAX_W]
attribute_deprecated int ticks_per_frame
For some codecs, the time base is closer to the field rate than the frame rate.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
int av_buffer_realloc(AVBufferRef **pbuf, size_t size)
Reallocate a given buffer.
#define FF_DISABLE_DEPRECATION_WARNINGS
int coded_width
Bitstream width / height, may be different from width/height e.g.
static int get_dmv(MpegEncContext *s)
@ AV_PICTURE_TYPE_P
Predicted.
static av_cold int mpeg_decode_end(AVCodecContext *avctx)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
A reference to a data buffer.
ScanTable inter_scantable
if inter == intra then intra should be used to reduce the cache usage
uint8_t idct_permutation[64]
IDCT input permutation.
const FFCodec ff_ipu_decoder
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
Structure to hold side data for an AVFrame.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
MpegEncContext mpeg_enc_ctx
This structure stores compressed data.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
static int mpeg_get_qscale(MpegEncContext *s)
static void mpeg_decode_sequence_extension(Mpeg1Context *s1)
#define HWACCEL_VAAPI(codec)
int width
picture width / height.
#define flags(name, subs,...)
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
#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
AVRational frame_rate_ext
static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static void mpeg_decode_user_data(AVCodecContext *avctx, const uint8_t *p, int buf_size)
int end_mb_y
end mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar)
Check if the given sample aspect ratio of an image is valid.
int64_t timecode_frame_start
int start_mb_y
start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
@ AVDISCARD_NONREF
discard all non reference
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
#define DECODE_SLICE_ERROR
static int load_matrix(MpegEncContext *s, uint16_t matrix0[64], uint16_t matrix1[64], int intra)
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
static int decode_dc(GetBitContext *gb, int component)
uint16_t chroma_intra_matrix[64]
static int mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
static int mpeg2_decode_block_non_intra(MpegEncContext *s, int16_t *block, int n)
static int mpeg_decode_slice(MpegEncContext *s, int mb_y, const uint8_t **buf, int buf_size)
Decode a slice.