28#include "config_components.h"
30#define UNCHECKED_BITSTREAM_READER 1
61#define A53_MAX_CC_COUNT 2000
131#define MAX_INDEX (64 - 1)
132#define check_scantable_index(ctx, x) \
134 if ((x) > MAX_INDEX) { \
135 av_log(ctx->c.avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", \
136 ctx->c.mb_x, ctx->c.mb_y); \
137 return AVERROR_INVALIDDATA; \
142 int16_t *
block,
int n)
145 const uint8_t *
const scantable =
s->c.intra_scantable.permutated;
146 const uint16_t *quant_matrix =
s->c.inter_matrix;
147 const int qscale =
s->c.qscale;
155 level = (3 * qscale * quant_matrix[0]) >> 5;
175 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
190 }
else if (
level == 0) {
200 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
204 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
221 s->c.block_last_index[n] =
i;
226 int16_t *
block,
int n)
229 const uint8_t *
const scantable =
s->c.intra_scantable.permutated;
230 const uint16_t *quant_matrix;
231 const int qscale =
s->c.qscale;
240 quant_matrix =
s->c.inter_matrix;
242 quant_matrix =
s->c.chroma_inter_matrix;
247 level = (3 * qscale * quant_matrix[0]) >> 5;
268 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
285 level = ((-
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
288 level = ((
level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
302 block[63] ^= (mismatch & 1);
306 s->c.block_last_index[n] =
i;
311 int16_t *
block,
int n)
316 const uint8_t *
const scantable =
s->c.intra_scantable.permutated;
317 const uint16_t *quant_matrix;
318 const int qscale =
s->c.qscale;
323 quant_matrix =
s->c.intra_matrix;
326 quant_matrix =
s->c.chroma_intra_matrix;
327 component = (n & 1) + 1;
330 dc =
s->last_dc[component];
332 s->last_dc[component] = dc;
333 block[0] = dc * (1 << (3 -
s->c.intra_dc_precision));
335 mismatch =
block[0] ^ 1;
337 if (
s->c.intra_vlc_format)
352 }
else if (
level != 0) {
357 level = (
level * qscale * quant_matrix[j]) >> 4;
372 level = (-
level * qscale * quant_matrix[j]) >> 4;
375 level = (
level * qscale * quant_matrix[j]) >> 4;
384 block[63] ^= mismatch & 1;
407 int i, j, k, cbp,
val, mb_type, motion_type;
408 const int mb_block_count = 4 + (1 <<
s->c.chroma_format);
411 ff_tlog(
s->c.avctx,
"decode_mb: x=%d y=%d\n",
s->c.mb_x,
s->c.mb_y);
415 if ((*mb_skip_run)-- != 0) {
418 s->c.cur_pic.mb_type[
s->c.mb_x +
s->c.mb_y *
s->c.mb_stride] =
424 mb_type =
s->c.cur_pic.mb_type[
s->c.mb_x +
s->c.mb_y *
s->c.mb_stride - 1];
427 mb_type =
s->c.cur_pic.mb_type[
s->c.mb_width + (
s->c.mb_y - 1) *
s->c.mb_stride - 1];
432 s->c.cur_pic.mb_type[
s->c.mb_x +
s->c.mb_y *
s->c.mb_stride] =
435 if ((
s->c.mv[0][0][0] |
s->c.mv[0][0][1] |
s->c.mv[1][0][0] |
s->c.mv[1][0][1]) == 0)
442 switch (
s->c.pict_type) {
448 "Invalid mb type in I-frame at %d %d\n",
449 s->c.mb_x,
s->c.mb_y);
461 "Invalid mb type in P-frame at %d %d\n",
s->c.mb_x,
s->c.mb_y);
469 "Invalid mb type in B-frame at %d %d\n",
s->c.mb_x,
s->c.mb_y);
474 ff_tlog(
s->c.avctx,
"mb_type=%x\n", mb_type);
477 s->c.bdsp.clear_blocks(
s->block[0]);
479 if (!
s->c.chroma_y_shift)
480 s->c.bdsp.clear_blocks(
s->block[6]);
485 !
s->c.frame_pred_frame_dct)
491 if (
s->c.concealment_motion_vectors) {
497 s->c.last_mv[0][0][0] =
499 s->c.last_mv[0][0][0]);
501 s->c.last_mv[0][0][1] =
503 s->c.last_mv[0][0][1]);
505 check_marker(
s->c.avctx, &
s->gb,
"after concealment_motion_vectors");
508 memset(
s->c.last_mv, 0,
sizeof(
s->c.last_mv));
513 for (
i = 0;
i < mb_block_count;
i++)
517 for (
i = 0;
i < 6;
i++) {
520 s->c.intra_scantable.permutated,
521 s->last_dc,
s->block[
i],
525 s->c.mb_x,
s->c.mb_y);
537 && !
s->c.frame_pred_frame_dct)
543 s->c.field_select[0][0] =
s->c.picture_structure - 1;
549 s->c.last_mv[0][0][0] = 0;
550 s->c.last_mv[0][0][1] = 0;
551 s->c.last_mv[0][1][0] = 0;
552 s->c.last_mv[0][1][1] = 0;
553 s->c.mv[0][0][0] = 0;
554 s->c.mv[0][0][1] = 0;
559 if (
s->c.picture_structure ==
PICT_FRAME &&
s->c.frame_pred_frame_dct) {
572 ff_tlog(
s->c.avctx,
"motion_type=%d\n", motion_type);
573 switch (motion_type) {
578 for (
i = 0;
i < 2;
i++) {
582 s->c.last_mv[
i][0][0] =
583 s->c.last_mv[
i][1][0] =
585 s->c.last_mv[
i][0][0]);
587 s->c.last_mv[
i][0][1] =
588 s->c.last_mv[
i][1][1] =
590 s->c.last_mv[
i][0][1]);
592 if (
s->c.full_pel[
i]) {
593 s->c.mv[
i][0][0] *= 2;
594 s->c.mv[
i][0][1] *= 2;
601 for (
i = 0;
i < 2;
i++) {
604 for (j = 0; j < 2; j++) {
606 for (k = 0; k < 2; k++) {
608 s->c.last_mv[
i][j][k]);
609 s->c.last_mv[
i][j][k] =
val;
610 s->c.mv[
i][j][k] =
val;
621 for (
i = 0;
i < 2;
i++) {
623 for (j = 0; j < 2; j++) {
626 s->c.last_mv[
i][j][0]);
627 s->c.last_mv[
i][j][0] =
val;
628 s->c.mv[
i][j][0] =
val;
631 s->c.last_mv[
i][j][1] >> 1);
632 s->c.last_mv[
i][j][1] = 2 *
val;
633 s->c.mv[
i][j][1] =
val;
641 for (
i = 0;
i < 2;
i++) {
644 for (k = 0; k < 2; k++) {
646 s->c.last_mv[
i][0][k]);
647 s->c.last_mv[
i][0][k] =
val;
648 s->c.last_mv[
i][1][k] =
val;
649 s->c.mv[
i][0][k] =
val;
656 if (
s->c.progressive_sequence){
661 for (
i = 0;
i < 2;
i++) {
663 int dmx, dmy,
mx,
my, m;
664 const int my_shift =
s->c.picture_structure ==
PICT_FRAME;
667 s->c.last_mv[
i][0][0]);
668 s->c.last_mv[
i][0][0] =
mx;
669 s->c.last_mv[
i][1][0] =
mx;
672 s->c.last_mv[
i][0][1] >> my_shift);
676 s->c.last_mv[
i][0][1] =
my * (1 << my_shift);
677 s->c.last_mv[
i][1][1] =
my * (1 << my_shift);
679 s->c.mv[
i][0][0] =
mx;
680 s->c.mv[
i][0][1] =
my;
681 s->c.mv[
i][1][0] =
mx;
682 s->c.mv[
i][1][1] =
my;
688 m =
s->c.top_field_first ? 1 : 3;
691 s->c.mv[
i][2][0] = ((
mx * m + (
mx > 0)) >> 1) + dmx;
692 s->c.mv[
i][2][1] = ((
my * m + (
my > 0)) >> 1) + dmy - 1;
694 s->c.mv[
i][3][0] = ((
mx * m + (
mx > 0)) >> 1) + dmx;
695 s->c.mv[
i][3][1] = ((
my * m + (
my > 0)) >> 1) + dmy + 1;
699 s->c.mv[
i][2][0] = ((
mx + (
mx > 0)) >> 1) + dmx;
700 s->c.mv[
i][2][1] = ((
my + (
my > 0)) >> 1) + dmy;
711 "00 motion_type at %d %d\n",
s->c.mb_x,
s->c.mb_y);
717 s->last_dc[0] =
s->last_dc[1] =
s->last_dc[2] = 128 <<
s->c.intra_dc_precision;
719 s->c.bdsp.clear_blocks(
s->block[0]);
722 if (mb_block_count > 6) {
723 cbp *= 1 << mb_block_count - 6;
724 cbp |=
get_bits(&
s->gb, mb_block_count - 6);
725 s->c.bdsp.clear_blocks(
s->block[6]);
729 "invalid cbp %d at %d %d\n", cbp,
s->c.mb_x,
s->c.mb_y);
734 cbp <<= 12 - mb_block_count;
736 for (
i = 0;
i < mb_block_count;
i++) {
737 if (cbp & (1 << 11)) {
741 s->c.block_last_index[
i] = -1;
746 for (
i = 0;
i < 6;
i++) {
751 s->c.block_last_index[
i] = -1;
757 for (
i = 0;
i < 12;
i++)
758 s->c.block_last_index[
i] = -1;
762 s->c.cur_pic.mb_type[
s->c.mb_x +
s->c.mb_y *
s->c.mb_stride] = mb_type;
770 MPVContext *
const s2 = &
s->slice.c;
773 s2->slice_ctx_size =
sizeof(
s->slice);
791#if CONFIG_MPEG1_NVDEC_HWACCEL
794#if CONFIG_MPEG1_NVDEC_CUARRAY_HWACCEL
797#if CONFIG_MPEG1_VDPAU_HWACCEL
805#if CONFIG_MPEG2_NVDEC_HWACCEL
808#if CONFIG_MPEG2_NVDEC_CUARRAY_HWACCEL
811#if CONFIG_MPEG2_VDPAU_HWACCEL
814#if CONFIG_MPEG2_DXVA2_HWACCEL
817#if CONFIG_MPEG2_D3D11VA_HWACCEL
821#if CONFIG_MPEG2_D3D12VA_HWACCEL
824#if CONFIG_MPEG2_VAAPI_HWACCEL
827#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
847 MPVContext *
const s = &s1->
slice.
c;
870 MPVContext *
const s = &s1->
slice.
c;
883 s1->pan_scan.height }),
893 s->avctx->sample_aspect_ratio =
897 s->avctx->sample_aspect_ratio =
899 (
AVRational) { s1->pan_scan.width, s1->pan_scan.height });
904 ff_dlog(avctx,
"aspect A %d/%d\n",
907 ff_dlog(avctx,
"aspect B %d/%d\n",
s->avctx->sample_aspect_ratio.num,
908 s->avctx->sample_aspect_ratio.den);
911 s->avctx->sample_aspect_ratio =
924 if (!
s->context_initialized ||
930 if (
s->context_initialized)
958 &
s->avctx->framerate.den,
963 switch (
s->chroma_format) {
975 if (!
s->avctx->lowres)
976 for (
int i = 0;
i <
s->slice_context_count;
i++)
986 MPVContext *
const s = &s1->
slice.
c;
988 int ref, f_code, vbv_delay, ret;
996 if (
s->pict_type == 0 ||
s->pict_type > 3)
1008 s->mpeg_f_code[0][0] = f_code;
1009 s->mpeg_f_code[0][1] = f_code;
1017 s->mpeg_f_code[1][0] = f_code;
1018 s->mpeg_f_code[1][1] = f_code;
1023 "vbv_delay %d, ref %d type:%d\n", vbv_delay,
ref,
s->pict_type);
1031 MPVContext *
const s = &s1->
slice.
c;
1032 int horiz_size_ext, vert_size_ext;
1041 if (!
s->chroma_format) {
1048 s->width |= (horiz_size_ext << 12);
1049 s->height |= (vert_size_ext << 12);
1051 s1->
bit_rate += (bit_rate_ext << 18) * 400LL;
1053 s->avctx->rc_buffer_size +=
get_bits(gb, 8) * 1024 * 16 << 10;
1062 ff_dlog(
s->avctx,
"sequence extension\n");
1067 "profile: %d, level: %d ps: %d cf:%d vbv buffer: %d, bitrate:%"PRId64
"\n",
1068 s->avctx->profile,
s->avctx->level,
s->progressive_sequence,
s->chroma_format,
1069 s->avctx->rc_buffer_size, s1->
bit_rate);
1075 MPVContext *
const s = &s1->
slice.
c;
1076 int color_description,
w,
h;
1080 if (color_description) {
1081 s->avctx->color_primaries =
get_bits(gb, 8);
1100 MPVContext *
const s = &s1->
slice.
c;
1104 if (
s->progressive_sequence) {
1105 if (
s->repeat_first_field) {
1107 if (
s->top_field_first)
1113 if (
s->repeat_first_field)
1117 for (
i = 0;
i < nofco;
i++) {
1126 "pde (%"PRId16
",%"PRId16
") (%"PRId16
",%"PRId16
") (%"PRId16
",%"PRId16
")\n",
1133 uint16_t matrix0[64], uint16_t matrix1[64],
int intra)
1137 for (
i = 0;
i < 64;
i++) {
1144 if (intra &&
i == 0 && v != 8) {
1145 av_log(
s->avctx,
AV_LOG_DEBUG,
"intra matrix specifies invalid DC quantizer %d, ignoring\n", v);
1158 ff_dlog(
s->avctx,
"matrix extension\n");
1173 MPVContext *
const s = &s1->
slice.
c;
1175 s->full_pel[0] =
s->full_pel[1] = 0;
1180 s->mpeg_f_code[0][0] += !
s->mpeg_f_code[0][0];
1181 s->mpeg_f_code[0][1] += !
s->mpeg_f_code[0][1];
1182 s->mpeg_f_code[1][0] += !
s->mpeg_f_code[1][0];
1183 s->mpeg_f_code[1][1] += !
s->mpeg_f_code[1][1];
1184 if (!
s->pict_type &&
s->context_initialized) {
1189 if (
s->mpeg_f_code[1][0] == 15 &&
s->mpeg_f_code[1][1] == 15) {
1190 if (
s->mpeg_f_code[0][0] == 15 &&
s->mpeg_f_code[0][1] == 15)
1198 s->intra_dc_precision =
get_bits(gb, 2);
1202 s->concealment_motion_vectors =
get_bits1(gb);
1213 s->idsp.idct_permutation);
1216 ff_dlog(
s->avctx,
"intra_dc_precision=%d\n",
s->intra_dc_precision);
1217 ff_dlog(
s->avctx,
"picture_structure=%d\n",
s->picture_structure);
1218 ff_dlog(
s->avctx,
"top field first=%d\n",
s->top_field_first);
1219 ff_dlog(
s->avctx,
"repeat first field=%d\n",
s->repeat_first_field);
1220 ff_dlog(
s->avctx,
"conceal=%d\n",
s->concealment_motion_vectors);
1221 ff_dlog(
s->avctx,
"intra_vlc_format=%d\n",
s->intra_vlc_format);
1222 ff_dlog(
s->avctx,
"alternate_scan=%d\n",
s->alternate_scan);
1223 ff_dlog(
s->avctx,
"frame_pred_frame_dct=%d\n",
s->frame_pred_frame_dct);
1224 ff_dlog(
s->avctx,
"progressive_frame=%d\n",
s->progressive_frame);
1231 MPVContext *
const s = &s1->
slice.
c;
1233 int second_field = 0;
1237 if (
s->mb_width *
s->mb_height * 11LL / (33 * 2 * 8) > buf_size)
1242 if (
s->first_field ||
s->picture_structure ==
PICT_FRAME) {
1252 for (
int i = 0;
i < 3;
i++) {
1255 s->cur_pic.linesize[
i]);
1257 s->cur_pic.linesize[
i] *= 2;
1264 s->cur_pic.ptr->f->repeat_pict = 0;
1265 if (
s->repeat_first_field) {
1266 if (
s->progressive_sequence) {
1267 if (
s->top_field_first)
1268 s->cur_pic.ptr->f->repeat_pict = 4;
1270 s->cur_pic.ptr->f->repeat_pict = 2;
1271 }
else if (
s->progressive_frame) {
1272 s->cur_pic.ptr->f->repeat_pict = 1;
1313 if (!
s->cur_pic.ptr) {
1318 if (
s->avctx->hwaccel) {
1321 "hardware accelerator failed to decode first field\n");
1329 for (
int i = 0;
i < 3;
i++) {
1330 s->cur_pic.data[
i] =
s->cur_pic.ptr->f->data[
i];
1332 s->cur_pic.data[
i] +=
1333 s->cur_pic.ptr->f->linesize[
i];
1338 if ((ret =
FF_HW_CALL(avctx, start_frame,
NULL, buf, buf_size)) < 0)
1340 }
else if (
s->codec_tag ==
MKTAG(
'V',
'C',
'R',
'2')) {
1342 FFSWAP(uint8_t*,
s->cur_pic.data[1],
s->cur_pic.data[2]);
1343 FFSWAP(ptrdiff_t,
s->cur_pic.linesize[1],
s->cur_pic.linesize[2]);
1344 if (!second_field) {
1345 FFSWAP(uint8_t*,
s->next_pic.data[1],
s->next_pic.data[2]);
1346 FFSWAP(ptrdiff_t,
s->next_pic.linesize[1],
s->next_pic.linesize[2]);
1347 FFSWAP(uint8_t*,
s->last_pic.data[1],
s->last_pic.data[2]);
1348 FFSWAP(ptrdiff_t,
s->last_pic.linesize[1],
s->last_pic.linesize[2]);
1355#define DECODE_SLICE_ERROR -1
1356#define DECODE_SLICE_OK 0
1365 const uint8_t **buf,
int buf_size)
1368 const int lowres =
s->c.avctx->lowres;
1369 const int field_pic =
s->c.picture_structure !=
PICT_FRAME;
1373 s->c.resync_mb_y = -1;
1384 s->c.interlaced_dct = 0;
1388 if (
s->c.qscale == 0) {
1399 if (mb_y == 0 &&
s->c.codec_tag ==
AV_RL32(
"SLIF")) {
1420 if (
s->c.mb_x >= (
unsigned)
s->c.mb_width) {
1426 const uint8_t *buf_end, *buf_start = *buf - 4;
1429 if (buf_end < *buf + buf_size)
1438 s->c.resync_mb_x =
s->c.mb_x;
1439 s->c.resync_mb_y =
s->c.mb_y = mb_y;
1442 if (
s->c.mb_y == 0 &&
s->c.mb_x == 0 && (
s->c.first_field ||
s->c.picture_structure ==
PICT_FRAME)) {
1445 "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",
1447 s->c.mpeg_f_code[0][0],
s->c.mpeg_f_code[0][1],
1448 s->c.mpeg_f_code[1][0],
s->c.mpeg_f_code[1][1],
1452 s->c.progressive_sequence ?
"ps" :
"",
1453 s->c.progressive_frame ?
"pf" :
"",
1454 s->c.alternate_scan ?
"alt" :
"",
1455 s->c.top_field_first ?
"top" :
"",
1456 s->c.intra_dc_precision,
s->c.picture_structure,
1457 s->c.frame_pred_frame_dct,
s->c.concealment_motion_vectors,
1458 s->c.q_scale_type,
s->c.intra_vlc_format,
1459 s->c.repeat_first_field,
s->c.chroma_420_type ?
"420" :
"");
1463 s->last_dc[0] = 128 <<
s->c.intra_dc_precision;
1464 s->last_dc[1] =
s->last_dc[0];
1465 s->last_dc[2] =
s->last_dc[0];
1466 memset(
s->c.last_mv, 0,
sizeof(
s->c.last_mv));
1468 for (
int mb_skip_run = 0;;) {
1474 if (
s->c.cur_pic.motion_val[0]) {
1475 const int wrap =
s->c.b8_stride;
1476 int xy =
s->c.mb_x * 2 +
s->c.mb_y * 2 *
wrap;
1477 int b8_xy = 4 * (
s->c.mb_x +
s->c.mb_y *
s->c.mb_stride);
1478 int motion_x, motion_y, dir,
i;
1480 for (
i = 0;
i < 2;
i++) {
1481 for (dir = 0; dir < 2; dir++) {
1482 if (
s->c.mb_intra ||
1484 motion_x = motion_y = 0;
1487 motion_x =
s->c.mv[dir][0][0];
1488 motion_y =
s->c.mv[dir][0][1];
1490 motion_x =
s->c.mv[dir][
i][0];
1491 motion_y =
s->c.mv[dir][
i][1];
1494 s->c.cur_pic.motion_val[dir][xy][0] = motion_x;
1495 s->c.cur_pic.motion_val[dir][xy][1] = motion_y;
1496 s->c.cur_pic.motion_val[dir][xy + 1][0] = motion_x;
1497 s->c.cur_pic.motion_val[dir][xy + 1][1] = motion_y;
1498 s->c.cur_pic.ref_index [dir][b8_xy] =
1499 s->c.cur_pic.ref_index [dir][b8_xy + 1] =
s->c.field_select[dir][
i];
1501 s->c.field_select[dir][
i] == 1);
1509 s->c.dest[1] +=(16 >>
lowres) >>
s->c.chroma_x_shift;
1510 s->c.dest[2] +=(16 >>
lowres) >>
s->c.chroma_x_shift;
1514 if (++
s->c.mb_x >=
s->c.mb_width) {
1515 const int mb_size = 16 >>
s->c.avctx->lowres;
1521 s->c.mb_y += 1 << field_pic;
1523 if (
s->c.mb_y >=
s->c.mb_height) {
1528 s->c.intra_dc_precision == 2 &&
1529 s->c.q_scale_type == 1 &&
s->c.alternate_scan == 0 &&
1530 s->c.progressive_frame == 0
1533 if (
left >= 32 && !is_d10) {
1560 if (
s->c.mb_y >= ((
s->c.height + 15) >> 4) &&
1561 !
s->c.progressive_sequence &&
1564 mb_skip_run == -1 &&
1572 if (mb_skip_run == -1) {
1585 }
else if (
code == 35) {
1586 if (mb_skip_run != 0 ||
show_bits(&
s->gb, 15) != 0) {
1594 mb_skip_run +=
code;
1602 "skipped MB in I-frame at %d %d\n",
s->c.mb_x,
s->c.mb_y);
1608 for (
i = 0;
i < 12;
i++)
1609 s->c.block_last_index[
i] = -1;
1610 s->last_dc[0] =
s->last_dc[1] =
s->last_dc[2] = 128 <<
s->c.intra_dc_precision;
1618 s->c.mv[0][0][0] =
s->c.mv[0][0][1] = 0;
1619 s->c.last_mv[0][0][0] =
s->c.last_mv[0][0][1] = 0;
1620 s->c.last_mv[0][1][0] =
s->c.last_mv[0][1][1] = 0;
1621 s->c.field_select[0][0] = (
s->c.picture_structure - 1) & 1;
1624 s->c.mv[0][0][0] =
s->c.last_mv[0][0][0];
1625 s->c.mv[0][0][1] =
s->c.last_mv[0][0][1];
1626 s->c.mv[1][0][0] =
s->c.last_mv[1][0][0];
1627 s->c.mv[1][0][1] =
s->c.last_mv[1][0][1];
1628 s->c.field_select[0][0] = (
s->c.picture_structure - 1) & 1;
1629 s->c.field_select[1][0] = (
s->c.picture_structure - 1) & 1;
1640 ff_dlog(
s->c.avctx,
"Slice start:%d %d end:%d %d\n",
s->c.resync_mb_x,
s->c.resync_mb_y,
s->c.mb_x,
s->c.mb_y);
1647 const uint8_t *buf =
s->gb.buffer;
1649 int mb_y =
s->c.start_mb_y;
1650 const int field_pic =
s->c.picture_structure !=
PICT_FRAME;
1652 s->c.er.error_count = (3 * (
s->c.end_mb_y -
s->c.start_mb_y) *
s->c.mb_width) >> field_pic;
1659 ff_dlog(
c,
"ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n",
1660 ret,
s->c.resync_mb_x,
s->c.resync_mb_y,
s->c.mb_x,
s->c.mb_y,
1661 s->c.start_mb_y,
s->c.end_mb_y,
s->c.er.error_count);
1665 if (
s->c.resync_mb_x >= 0 &&
s->c.resync_mb_y >= 0)
1667 s->c.mb_x,
s->c.mb_y,
1671 s->c.mb_x - 1,
s->c.mb_y,
1675 if (
s->c.mb_y ==
s->c.end_mb_y)
1684 mb_y += (*buf&0xE0)<<2;
1688 if (mb_y >=
s->c.end_mb_y)
1700 MPVContext *
const s = &s1->
slice.
c;
1702 if (!
s->context_initialized || !
s->cur_pic.ptr)
1705 if (
s->avctx->hwaccel) {
1709 "hardware accelerator failed to decode picture\n");
1731 if (
s->last_pic.ptr && !
s->last_pic.ptr->dummy) {
1748 const uint8_t *buf,
int buf_size)
1751 MPVContext *
const s = &s1->
slice.
c;
1764 "Invalid horizontal or vertical size value.\n");
1781 if (
check_marker(
s->avctx, gb,
"in sequence header") == 0) {
1785 s->avctx->rc_buffer_size =
get_bits(gb, 10) * 1024 * 16;
1792 for (
i = 0;
i < 64;
i++) {
1793 j =
s->idsp.idct_permutation[
i];
1795 s->intra_matrix[j] = v;
1796 s->chroma_intra_matrix[j] = v;
1802 for (
i = 0;
i < 64;
i++) {
1803 int j =
s->idsp.idct_permutation[
i];
1805 s->inter_matrix[j] = v;
1806 s->chroma_inter_matrix[j] = v;
1819 s->progressive_sequence = 1;
1820 s->progressive_frame = 1;
1823 s->frame_pred_frame_dct = 1;
1831 av_log(
s->avctx,
AV_LOG_DEBUG,
"vbv buffer: %d, bitrate:%"PRId64
", aspect_ratio_info: %d \n",
1840 MPVContext *
const s = &s1->
slice.
c;
1844 if (
s->context_initialized)
1856 if (!
s->avctx->lowres)
1857 for (
int i = 0;
i <
s->slice_context_count;
i++)
1860 for (
i = 0;
i < 64;
i++) {
1861 int j =
s->idsp.idct_permutation[
i];
1863 s->intra_matrix[j] = v;
1864 s->chroma_intra_matrix[j] = v;
1867 s->inter_matrix[j] = v;
1868 s->chroma_inter_matrix[j] = v;
1871 s->progressive_sequence = 1;
1872 s->progressive_frame = 1;
1875 s->frame_pred_frame_dct = 1;
1877 if (
s->codec_tag ==
AV_RL32(
"BW10")) {
1902 const uint8_t *p,
int buf_size)
1908 p[0] ==
'G' && p[1] ==
'A' && p[2] ==
'9' && p[3] ==
'4' &&
1909 p[4] == 3 && (p[5] & 0x40)) {
1911 int cc_count = p[5] & 0x1f;
1912 if (cc_count > 0 && buf_size >= 7 + cc_count * 3) {
1914 const uint64_t new_size = (old_size + cc_count
1923 memcpy(s1->
a53_buf_ref->
data + old_size, p + 7, cc_count * UINT64_C(3));
1930 p[0] == 0x03 && (p[1]&0x7f) == 0x01) {
1942 const uint64_t new_size = (old_size + cc_count
1949 uint8_t field, cc1, cc2;
1952 memset(cap, 0, cc_count * 3);
1962 cap[0] = cap[1] = cap[2] = 0x00;
1964 field = (field == 2 ? 1 : 0);
1965 if (!s1->
slice.
c.top_field_first) field = !field;
1966 cap[0] = 0x04 | field;
1979 p[0] ==
'C' && p[1] ==
'C' && p[2] == 0x01 && p[3] == 0xf8) {
2009 for (
i = 5;
i + 6 <= buf_size && ((p[
i] & 0xfe) == 0xfe);
i += 6)
2014 const uint64_t new_size = (old_size + cc_count
2021 uint8_t field1 = !!(p[4] & 0x80);
2024 for (
i = 0;
i < cc_count;
i++) {
2025 cap[0] = (p[0] == 0xff && field1) ? 0xfc : 0xfd;
2028 cap[3] = (p[3] == 0xff && !field1) ? 0xfc : 0xfd;
2041 p[0] == 0x05 && p[1] == 0x02) {
2043 const uint8_t cc_header = 0xf8 | 0x04 | 0x00 ;
2044 uint8_t cc_data[4] = {0};
2046 uint8_t cc_type = p[7];
2050 if (cc_type == 0x05 && buf_size >= 7) {
2056 if (cc_type == 0x02 && buf_size >= 4) {
2066 if (cc_type == 0x04 && (cc_data[0] & 0x7f) < 32) {
2068 cc_data[2] = cc_data[0];
2069 cc_data[3] = cc_data[1];
2071 }
else if (cc_type == 0x04 && buf_size >= 5) {
2082 const uint64_t new_size = (old_size + cc_count * UINT64_C(3));
2090 cap[1] = cc_data[0];
2091 cap[2] = cc_data[1];
2092 if (cc_count == 2) {
2094 cap[4] = cc_data[2];
2095 cap[5] = cc_data[3];
2107 const uint8_t *p,
int buf_size)
2109 const uint8_t *buf_end = p + buf_size;
2114 for(
i=0; !(!p[
i-2] && !p[
i-1] && p[
i]==1) &&
i<buf_size;
i++){
2123 if (!memcmp(p+
i,
"\0TMPGEXS\0", 9)){
2128 if (buf_end - p >= 5 &&
2129 p[0] ==
'D' && p[1] ==
'T' && p[2] ==
'G' && p[3] ==
'1') {
2137 if (buf_end - p < 1)
2140 s1->
afd = p[0] & 0x0f;
2142 }
else if (buf_end - p >= 6 &&
2143 p[0] ==
'J' && p[1] ==
'P' && p[2] ==
'3' && p[3] ==
'D' &&
2146 const uint8_t S3D_video_format_type = p[5] & 0x7F;
2148 if (S3D_video_format_type == 0x03 ||
2149 S3D_video_format_type == 0x04 ||
2150 S3D_video_format_type == 0x08 ||
2151 S3D_video_format_type == 0x23) {
2155 switch (S3D_video_format_type) {
2176 const uint8_t *buf,
int buf_size)
2179 MPVContext *
const s = &s1->
slice.
c;
2200 "GOP (%s) closed_gop=%d broken_link=%d\n",
2212 MPVContext *
const s2 = &
s->slice.c;
2213 int error_count = 0;
2216 s2->mpeg12_contexts,
NULL,
2217 s->slice_count,
sizeof(s2->mpeg12_contexts[0]));
2219 for (
int i = 0;
i <
s->slice_count;
i++) {
2222 memory_order_relaxed);
2225 if ((
unsigned)slice_err > INT_MAX - error_count) {
2226 error_count = INT_MAX;
2229 error_count += slice_err;
2232 memory_order_relaxed);
2237 int *got_output,
const uint8_t *buf,
int buf_size)
2240 MPVContext *
const s2 = &
s->slice.c;
2241 const uint8_t *buf_ptr = buf;
2242 const uint8_t *buf_end = buf + buf_size;
2243 int ret, input_size;
2244 int last_code = 0, skip_frame = 0;
2245 int picture_start_code_seen = 0;
2255 ret =
slice_end(avctx, picture, got_output);
2264 return FFMAX(0, buf_ptr - buf);
2267 input_size = buf_end - buf_ptr;
2276 if (last_code == 0) {
2282 "ignoring SEQ_START_CODE after %X\n", last_code);
2289 if (picture_start_code_seen && s2->picture_structure ==
PICT_FRAME) {
2295 picture_start_code_seen = 1;
2302 if (s2->width <= 0 || s2->height <= 0) {
2304 s2->width, s2->height);
2309 s2->intra_dc_precision= 3;
2310 s2->intra_matrix[0]= 1;
2312 if (
s->slice_count) {
2320 "mpeg_decode_postinit() failure\n");
2331 "ignoring pic after %X\n", last_code);
2345 if (last_code == 0) {
2349 "ignoring seq ext after %X\n", last_code);
2370 "ignoring pic cod ext after %X\n", last_code);
2382 if (last_code == 0) {
2383 s2->first_field = 0;
2390 "ignoring GOP_START_CODE after %X\n", last_code);
2398 if (s2->progressive_sequence && !s2->progressive_frame) {
2399 s2->progressive_frame = 1;
2401 "interlaced frame in progressive sequence, ignoring\n");
2404 if (s2->picture_structure == 0 ||
2405 (s2->progressive_frame && s2->picture_structure !=
PICT_FRAME)) {
2407 "picture_structure %d invalid, ignoring\n",
2408 s2->picture_structure);
2412 if (s2->progressive_sequence && !s2->frame_pred_frame_dct)
2416 s2->first_field = 0;
2417 s2->v_edge_pos = 16 * s2->mb_height;
2419 s2->first_field ^= 1;
2420 s2->v_edge_pos = 8 * s2->mb_height;
2421 memset(s2->mbskip_table, 0, s2->mb_stride * s2->mb_height);
2426 const int field_pic = s2->picture_structure !=
PICT_FRAME;
2430 mb_y += (*buf_ptr&0xE0)<<2;
2436 if (buf_end - buf_ptr < 2) {
2441 if (mb_y >= s2->mb_height) {
2443 "slice below image (%d >= %d)\n", mb_y, s2->mb_height);
2447 if (!s2->last_pic.ptr) {
2451 if (!
s->closed_gop) {
2454 "Skipping B slice due to open GOP\n");
2461 if (!s2->next_pic.ptr) {
2467 "Skipping P slice due to !sync\n");
2480 if (!s2->context_initialized)
2484 if (mb_y < avctx->skip_top ||
2489 if (!s2->pict_type) {
2496 if (
s->first_slice) {
2502 if (!s2->cur_pic.ptr) {
2504 "current_picture not initialized\n");
2511 int threshold = (s2->mb_height *
s->slice_count +
2512 s2->slice_context_count / 2) /
2513 s2->slice_context_count;
2514 if (threshold <= mb_y) {
2517 thread_context->
c.start_mb_y = mb_y;
2518 thread_context->
c.end_mb_y = s2->mb_height;
2519 if (
s->slice_count) {
2520 s2->thread_context[
s->slice_count - 1]->end_mb_y = mb_y;
2537 if (s2->resync_mb_x >= 0 && s2->resync_mb_y >= 0)
2539 s2->resync_mb_y, s2->mb_x, s2->mb_y,
2543 s2->resync_mb_y, s2->mb_x - 1, s2->mb_y,
2556 const uint8_t *buf = avpkt->
data;
2558 int buf_size = avpkt->
size;
2560 MPVContext *
const s2 = &
s->slice.c;
2564 if (s2->low_delay == 0 && s2->next_pic.ptr) {
2576 if (!s2->context_initialized &&
2577 (s2->codec_tag ==
AV_RL32(
"VCR2") || s2->codec_tag ==
AV_RL32(
"BW10")))
2582 if (avctx->
extradata && !
s->extradata_decoded) {
2590 s->extradata_decoded = 1;
2597 ret =
decode_chunks(avctx, picture, got_output, buf, buf_size);
2598 if (ret<0 || *got_output) {
2601 if (
s->timecode_frame_start != -1 && *got_output) {
2608 memcpy(tcside->
data, &
s->timecode_frame_start,
sizeof(
int64_t));
2613 s->timecode_frame_start = -1;
2640 .p.name =
"mpeg1video",
2654#if CONFIG_MPEG1_NVDEC_HWACCEL
2657#if CONFIG_MPEG1_NVDEC_CUARRAY_HWACCEL
2660#if CONFIG_MPEG1_VDPAU_HWACCEL
2663#if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL
2670#define M2V_OFFSET(x) offsetof(Mpeg1Context, x)
2671#define M2V_PARAM AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2674 {
"cc_format",
"extract a specific Closed Captions format",
2692 .class_name =
"MPEG-2 video",
2700 .p.name =
"mpeg2video",
2716#if CONFIG_MPEG2_DXVA2_HWACCEL
2719#if CONFIG_MPEG2_D3D11VA_HWACCEL
2722#if CONFIG_MPEG2_D3D11VA2_HWACCEL
2725#if CONFIG_MPEG2_D3D12VA_HWACCEL
2728#if CONFIG_MPEG2_NVDEC_HWACCEL
2731#if CONFIG_MPEG2_NVDEC_CUARRAY_HWACCEL
2734#if CONFIG_MPEG2_VAAPI_HWACCEL
2737#if CONFIG_MPEG2_VDPAU_HWACCEL
2740#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
2749 .p.name =
"mpegvideo",
2774 MPVContext *
const m = &
s->m.c;
2776 int16_t (*
const block)[64] =
s->m.block;
2780 if (avpkt->
size*8LL < (avctx->
width+15)/16 * ((avctx->
height+15)/16) * (2LL + 3*4 + 2*2 + 2*6))
2792 m->intra_dc_precision =
s->flags & 3;
2793 m->q_scale_type = !!(
s->flags & 0x40);
2794 m->intra_vlc_format = !!(
s->flags & 0x20);
2795 m->alternate_scan = !!(
s->flags & 0x10);
2799 m->idsp.idct_permutation);
2801 s->m.last_dc[0] =
s->m.last_dc[1] =
s->m.last_dc[2] = 128 << (
s->flags & 3);
2804 for (
int y = 0; y < avctx->
height; y += 16) {
2807 for (
int x = 0; x < avctx->
width; x += 16) {
2828 for (
int n = 0; n < 6; n++) {
2829 if (
s->flags & 0x80) {
2832 m->intra_scantable.permutated,
2843 m->idsp.idct_put(
frame->data[0] + y *
frame->linesize[0] + x,
2845 m->idsp.idct_put(
frame->data[0] + y *
frame->linesize[0] + x + 8,
2847 m->idsp.idct_put(
frame->data[0] + (y + 8) *
frame->linesize[0] + x,
2849 m->idsp.idct_put(
frame->data[0] + (y + 8) *
frame->linesize[0] + x + 8,
2851 m->idsp.idct_put(
frame->data[1] + (y >> 1) *
frame->linesize[1] + (x >> 1),
2853 m->idsp.idct_put(
frame->data[2] + (y >> 1) *
frame->linesize[2] + (x >> 1),
2870 MPVContext *
const m = &
s->m.c;
2878 for (
int i = 0;
i < 64;
i++) {
2879 int j = m->idsp.idct_permutation[
i];
2881 m->intra_matrix[j] = v;
2882 m->chroma_intra_matrix[j] = v;
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
static double val(void *priv, double ch)
static const char *const format[]
const FFCodec ff_mpeg1video_decoder
const FFCodec ff_mpeg2video_decoder
const FFCodec ff_ipu_decoder
const FFCodec ff_mpegvideo_decoder
static av_cold void close(AVCodecParserContext *s)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
#define FF_DEBUG_STARTCODE
#define FF_DEBUG_PICT_INFO
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define SLICE_MAX_START_CODE
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef **buf)
Similar to ff_frame_new_side_data, but using an existing buffer ref.
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd)
Wrapper around av_frame_new_side_data, which rejects side data overridden by the demuxer.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
#define AV_EF_BITSTREAM
detect bitstream specification deviations
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
#define AV_EF_EXPLODE
abort decoding on minor error detection
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
void(* flush)(AVBSFContext *ctx)
int(* init)(AVBSFContext *ctx)
#define atomic_load_explicit(object, order)
#define atomic_store_explicit(object, desired, order)
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
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...
static int decode_slice(AVCodecContext *c, void *arg)
bitstream reader API header.
static unsigned int show_bits_long(GetBitContext *s, int n)
Show 0-32 bits.
#define GET_CACHE(name, gb)
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static int get_sbits(GetBitContext *s, int n)
#define CLOSE_READER(name, gb)
static int get_bits_left(GetBitContext *gb)
#define SHOW_UBITS(name, gb, num)
static unsigned int get_bits1(GetBitContext *s)
#define SHOW_SBITS(name, gb, num)
#define OPEN_READER(name, gb)
static void skip_bits(GetBitContext *s, int n)
static int skip_1stop_8data_bits(GetBitContext *gb)
#define SKIP_BITS(name, gb, num)
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)
#define UPDATE_CACHE(name, gb)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define LAST_SKIP_BITS(name, gb, num)
static const uint8_t * align_get_bits(GetBitContext *s)
static int get_bits_count(const GetBitContext *s)
static void skip_bits1(GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
static int get_bits_bytesize(const GetBitContext *s, int round_up)
Get the size of the GetBitContext's buffer in bytes.
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
#define AV_CODEC_FLAG2_SHOW_ALL
Show all frames before the first keyframe.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
#define AV_CODEC_FLAG2_CHUNKS
Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
@ AVDISCARD_ALL
discard all
@ AVDISCARD_NONKEY
discard all frames except keyframes
@ AVDISCARD_NONREF
discard all non reference
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
int av_buffer_realloc(AVBufferRef **pbuf, size_t size)
Reallocate a given buffer.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, size_t size)
Add a new side data to a frame.
@ AV_FRAME_DATA_GOP_TIMECODE
The GOP timecode in 25 bit timecode format.
@ AV_FRAME_DATA_PANSCAN
The data is the AVPanScan struct defined in libavcodec.
@ AV_FRAME_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
@ AV_FRAME_DATA_AFD
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using AVAc...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
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.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
#define LIBAVUTIL_VERSION_INT
AVStereo3DType
List of possible 3D Types.
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
@ AV_STEREO3D_2D
Video is not stereoscopic (and metadata has to be there).
@ AV_STEREO3D_TOPBOTTOM
Views are on top of each other.
@ AV_STEREO3D_SIDEBYSIDE_QUINCUNX
Views are next to each other, but when upscaling apply a checkerboard pattern.
@ AV_STEREO3D_SIDEBYSIDE
Views are next to each other.
#define FF_HW_SIMPLE_CALL(avctx, function)
#define FF_HW_CALL(avctx, function,...)
#define HWACCEL_NVDEC_CUARRAY(codec)
#define HWACCEL_DXVA2(codec)
#define HWACCEL_VDPAU(codec)
#define HWACCEL_D3D12VA(codec)
#define HWACCEL_NVDEC(codec)
#define HWACCEL_VAAPI(codec)
#define HWACCEL_D3D11VA(codec)
#define HWACCEL_VIDEOTOOLBOX(codec)
#define HWACCEL_D3D11VA2(codec)
static int shift(int a, int b)
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
av_cold void ff_permute_scantable(uint8_t dst[64], const uint8_t src[64], const uint8_t permutation[64])
Macro definitions for various function/variable attributes.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define FF_PTR_ADD(ptr, off)
const uint8_t ff_reverse[256]
static enum AVPixelFormat pix_fmts[]
@ AV_CLASS_CATEGORY_DECODER
#define FFSWAP(type, a, b)
#define MKTAG(a, b, c, d)
const uint8_t ff_zigzag_direct[64]
static av_const int sign_extend(int val, unsigned bits)
static const VLCElem * rl_vlc[2]
VLCElem ff_mb_pat_vlc[512]
VLCElem ff_mbincr_vlc[538]
RL_VLC_ELEM ff_mpeg1_rl_vlc[680]
RL_VLC_ELEM ff_mpeg2_rl_vlc[674]
av_cold void ff_mpeg12_init_vlcs(void)
VLCElem ff_mb_btype_vlc[64]
VLCElem ff_mb_ptype_vlc[64]
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 PICTURE_START_CODE
#define SLICE_MIN_START_CODE
const uint16_t ff_mpeg1_default_intra_matrix[256]
const float ff_mpeg1_aspect[16]
const uint16_t ff_mpeg1_default_non_intra_matrix[64]
const AVRational ff_mpeg2_aspect[16]
const AVRational ff_mpeg12_frame_rate_tab[]
static void mpeg_decode_sequence_display_extension(Mpeg1Context *const s1, GetBitContext *const gb)
static const AVOption mpeg2video_options[]
static void mpeg_decode_picture_display_extension(Mpeg1Context *const s1, GetBitContext *const gb)
static int mpeg_field_start(Mpeg1Context *s1, const uint8_t *buf, int buf_size)
#define DECODE_SLICE_ERROR
static void mpeg_decode_sequence_extension(Mpeg1Context *const s1, GetBitContext *const gb)
static int mpeg2_decode_block_non_intra(Mpeg12SliceContext *const s, int16_t *block, int n)
static void mpeg_decode_quant_matrix_extension(MPVContext *const s, GetBitContext *const gb)
static const AVClass mpeg2video_class
static int mpeg_decode_slice(Mpeg12SliceContext *const s, int mb_y, const uint8_t **buf, int buf_size)
Decode a slice.
static int ipu_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
static int mpeg1_decode_picture(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static int mpeg1_decode_block_inter(Mpeg12SliceContext *const s, int16_t *block, int n)
static int slice_decode_thread(AVCodecContext *c, void *arg)
static enum AVPixelFormat mpeg12_pixfmt_list_422[]
static av_cold int mpeg_decode_init(AVCodecContext *avctx)
#define check_scantable_index(ctx, x)
static int mpeg_decode_picture_coding_extension(Mpeg1Context *const s1, GetBitContext *const gb)
static int mpeg_decode_mb(Mpeg12SliceContext *const s, int *mb_skip_run)
static int mpeg1_decode_sequence(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static int vcr2_init_sequence(AVCodecContext *avctx)
static int mpeg_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_output, AVPacket *avpkt)
static int mpeg_decode_motion(Mpeg12SliceContext *const s, int fcode, int pred)
static enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[]
static enum AVPixelFormat mpeg12_pixfmt_list_444[]
Mpeg2ClosedCaptionsFormat
static av_cold int mpeg_decode_end(AVCodecContext *avctx)
static int load_matrix(MPVContext *const s, GetBitContext *const gb, uint16_t matrix0[64], uint16_t matrix1[64], int intra)
static enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[]
static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, int *got_output, const uint8_t *buf, int buf_size)
static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
static void mpeg_decode_user_data(AVCodecContext *avctx, const uint8_t *p, int buf_size)
static int mpeg_decode_a53_cc(AVCodecContext *avctx, const uint8_t *p, int buf_size)
static av_cold int ipu_decode_init(AVCodecContext *avctx)
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
static void mpeg12_execute_slice_threads(AVCodecContext *avctx, Mpeg1Context *const s)
static int mpeg_decode_gop(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static int mpeg2_decode_block_intra(Mpeg12SliceContext *const s, int16_t *block, int n)
static int get_dmv(Mpeg12SliceContext *const s)
static int mpeg_decode_postinit(AVCodecContext *avctx)
static void mpeg_set_cc_format(AVCodecContext *avctx, enum Mpeg2ClosedCaptionsFormat format, const char *label)
static int decode_dc(GetBitContext *gb, int component)
#define MB_BTYPE_VLC_BITS
#define MB_PTYPE_VLC_BITS
void ff_mpeg_er_frame_start(MpegEncContext *s)
void ff_mpv_unref_picture(MPVWorkPicture *pic)
static void ff_mpv_framesize_disable(ScratchpadContext *sc)
Disable allocating the ScratchpadContext's buffers in future calls to ff_mpv_framesize_alloc().
#define MB_TYPE_MV_2_MV_DIR(a)
#define MB_TYPE_INTERLACED
#define MB_TYPE_FORWARD_MV
#define PICT_BOTTOM_FIELD
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
av_cold void ff_mpv_common_end(MpegEncContext *s)
void ff_init_block_index(MpegEncContext *s)
int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src)
#define MV_TYPE_16X8
2 vectors, one per 16x8 block
#define MV_TYPE_DMV
2 vectors, special mpeg2 Dual Prime Vectors
#define MV_TYPE_FIELD
2 vectors, one per field
#define MV_TYPE_16X16
1 vector for the whole mb
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
av_cold void ff_mpeg_flush(AVCodecContext *avctx)
void ff_mpv_frame_end(MpegEncContext *s)
int ff_mpv_export_qp_table(const MpegEncContext *s, AVFrame *f, const MPVPicture *p, int qp_type)
int ff_mpv_alloc_dummy_frames(MpegEncContext *s)
Ensure that the dummy frames are allocated according to pict_type if necessary.
void ff_print_debug_info(const MpegEncContext *s, const MPVPicture *p, AVFrame *pict)
av_cold int ff_mpv_decode_close(AVCodecContext *avctx)
void ff_mpv_reconstruct_mb(MPVContext *s, int16_t block[][64])
av_cold int ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx)
Initialize the given MpegEncContext for decoding.
void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h)
const uint8_t ff_alternate_vertical_scan[64]
mpegvideo decoder header.
#define FF_MPV_QSCALE_TYPE_MPEG2
static int mpeg_get_qscale(GetBitContext *const gb, int q_scale_type)
static int check_marker(void *logctx, GetBitContext *s, const char *msg)
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
@ AV_PIX_FMT_CUARRAY
hardware decoding through openharmony
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
const AVProfile ff_mpeg2_video_profiles[]
static const float pred[4]
Accelerated start code search function for start codes common to MPEG-1/2/4 video,...
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
A reference to a data buffer.
uint8_t * data
The data buffer.
size_t size
Size of data in bytes.
Describe the class of an AVClass context structure.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int flags2
AV_CODEC_FLAG2_*.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
int active_thread_type
Which multithreading methods are in use by the codec.
int has_b_frames
Size of the frame reordering buffer in the decoder.
int level
Encoding level descriptor.
int64_t bit_rate
the average bitrate
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.
int64_t rc_max_rate
maximum bitrate
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
int skip_bottom
Number of macroblock rows at the bottom which are skipped.
int coded_width
Bitstream width / height, may be different from width/height e.g.
enum AVDiscard skip_frame
Skip decoding for selected frames.
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Structure to hold side data for an AVFrame.
This structure describes decoded (raw) audio or video data.
AVDictionary * metadata
metadata.
This structure stores compressed data.
int width
width and height in 1/16 pel
int16_t position[3][2]
position of the top left corner in 1/16 pel for up to 3 fields/frames
Rational number (pair of numerator and denominator).
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
enum AVStereo3DType type
How views are packed within the video.
DECLARE_ALIGNED_32(int16_t, block)[12][64]
int last_dc[3]
last DC values
unsigned frame_rate_index
unsigned aspect_ratio_info
enum Mpeg2ClosedCaptionsFormat cc_format
int64_t timecode_frame_start
AVBufferRef * a53_buf_ref
AVRational frame_rate_ext
enum AVStereo3DType stereo3d_type
struct MpegEncContext * thread_context[MAX_THREADS]
static int ref[MAX_W *MAX_W]
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).
#define AV_TIMECODE_STR_SIZE
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)