#include "mpegutils.h"
#include "mpegvideo.h"
#include "mpegvideodata.h"
+#include "profiles.h"
#include "thread.h"
#include "version.h"
#include "xvmc_internal.h"
return sign_extend(val, 5 + shift);
}
+#define MAX_INDEX (64 - 1)
#define check_scantable_index(ctx, x) \
do { \
- if ((x) > 63) { \
+ if ((x) > MAX_INDEX) { \
av_log(ctx->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", \
ctx->mb_x, ctx->mb_y); \
return AVERROR_INVALIDDATA; \
} \
} while (0)
-static inline int mpeg1_decode_block_intra(MpegEncContext *s,
- int16_t *block, int n)
-{
- int level, dc, diff, i, j, run;
- int component;
- RLTable *rl = &ff_rl_mpeg1;
- uint8_t *const scantable = s->intra_scantable.permutated;
- const uint16_t *quant_matrix = s->intra_matrix;
- const int qscale = s->qscale;
-
- /* DC coefficient */
- component = (n <= 3 ? 0 : n - 4 + 1);
- diff = decode_dc(&s->gb, component);
- if (diff >= 0xffff)
- return AVERROR_INVALIDDATA;
- dc = s->last_dc[component];
- dc += diff;
- s->last_dc[component] = dc;
- block[0] = dc * quant_matrix[0];
- ff_dlog(s->avctx, "dc=%d diff=%d\n", dc, diff);
- i = 0;
- {
- OPEN_READER(re, &s->gb);
- /* now quantify & encode AC coefficients */
- for (;;) {
- UPDATE_CACHE(re, &s->gb);
- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
- TEX_VLC_BITS, 2, 0);
-
- if (level == 127) {
- break;
- } else if (level != 0) {
- i += run;
- check_scantable_index(s, i);
- j = scantable[i];
- level = (level * qscale * quant_matrix[j]) >> 4;
- level = (level - 1) | 1;
- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
- SHOW_SBITS(re, &s->gb, 1);
- LAST_SKIP_BITS(re, &s->gb, 1);
- } else {
- /* escape */
- run = SHOW_UBITS(re, &s->gb, 6) + 1;
- LAST_SKIP_BITS(re, &s->gb, 6);
- UPDATE_CACHE(re, &s->gb);
- level = SHOW_SBITS(re, &s->gb, 8);
- SKIP_BITS(re, &s->gb, 8);
- if (level == -128) {
- level = SHOW_UBITS(re, &s->gb, 8) - 256;
- LAST_SKIP_BITS(re, &s->gb, 8);
- } else if (level == 0) {
- level = SHOW_UBITS(re, &s->gb, 8);
- LAST_SKIP_BITS(re, &s->gb, 8);
- }
- i += run;
- check_scantable_index(s, i);
- j = scantable[i];
- if (level < 0) {
- level = -level;
- level = (level * qscale * quant_matrix[j]) >> 4;
- level = (level - 1) | 1;
- level = -level;
- } else {
- level = (level * qscale * quant_matrix[j]) >> 4;
- level = (level - 1) | 1;
- }
- }
-
- block[j] = level;
- }
- CLOSE_READER(re, &s->gb);
- }
- s->block_last_index[n] = i;
- return 0;
-}
-
-int ff_mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
-{
- return mpeg1_decode_block_intra(s, block, n);
-}
-
static inline int mpeg1_decode_block_inter(MpegEncContext *s,
int16_t *block, int n)
{
if (level != 0) {
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
level = (level - 1) | 1;
SKIP_BITS(re, &s->gb, 8);
}
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
if (level < 0) {
level = -level;
LAST_SKIP_BITS(re, &s->gb, 2);
CLOSE_READER(re, &s->gb);
}
+
+ check_scantable_index(s, i);
+
s->block_last_index[n] = i;
return 0;
}
if (level != 0) {
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
level = ((level * 2 + 1) * qscale) >> 1;
level = (level - 1) | 1;
SKIP_BITS(re, &s->gb, 8);
}
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
if (level < 0) {
level = -level;
LAST_SKIP_BITS(re, &s->gb, 2);
CLOSE_READER(re, &s->gb);
}
+
+ check_scantable_index(s, i);
+
s->block_last_index[n] = i;
return 0;
}
if (level != 0) {
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
SKIP_BITS(re, &s->gb, 12);
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
if (level < 0) {
level = ((-level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
}
block[63] ^= (mismatch & 1);
+ check_scantable_index(s, i);
+
s->block_last_index[n] = i;
return 0;
}
if (level != 0) {
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
level = ((level * 2 + 1) * qscale) >> 1;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
SKIP_BITS(re, &s->gb, 12);
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
if (level < 0) {
level = ((-level * 2 + 1) * qscale) >> 1;
end:
LAST_SKIP_BITS(re, &s->gb, 2);
CLOSE_READER(re, &s->gb);
+
+ check_scantable_index(s, i);
+
s->block_last_index[n] = i;
return 0;
}
break;
} else if (level != 0) {
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
level = (level * qscale * quant_matrix[j]) >> 4;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
level = SHOW_SBITS(re, &s->gb, 12);
SKIP_BITS(re, &s->gb, 12);
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
if (level < 0) {
level = (-level * qscale * quant_matrix[j]) >> 4;
}
block[63] ^= mismatch & 1;
+ check_scantable_index(s, i);
+
s->block_last_index[n] = i;
return 0;
}
break;
} else if (level != 0) {
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
level = (level * qscale * quant_matrix[j]) >> 4;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
level = SHOW_SBITS(re, &s->gb, 12);
SKIP_BITS(re, &s->gb, 12);
i += run;
- check_scantable_index(s, i);
+ if (i > MAX_INDEX)
+ break;
j = scantable[i];
if (level < 0) {
level = (-level * qscale * quant_matrix[j]) >> 4;
CLOSE_READER(re, &s->gb);
}
+ check_scantable_index(s, i);
+
s->block_last_index[n] = i;
return 0;
}
if (get_bits1(&s->gb) == 0) {
if (get_bits1(&s->gb) == 0) {
av_log(s->avctx, AV_LOG_ERROR,
- "invalid mb type in I Frame at %d %d\n",
+ "Invalid mb type in I-frame at %d %d\n",
s->mb_x, s->mb_y);
return AVERROR_INVALIDDATA;
}
mb_type = get_vlc2(&s->gb, ff_mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1);
if (mb_type < 0) {
av_log(s->avctx, AV_LOG_ERROR,
- "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y);
+ "Invalid mb type in P-frame at %d %d\n", s->mb_x, s->mb_y);
return AVERROR_INVALIDDATA;
}
mb_type = ptype2mb_type[mb_type];
mb_type = get_vlc2(&s->gb, ff_mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1);
if (mb_type < 0) {
av_log(s->avctx, AV_LOG_ERROR,
- "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y);
+ "Invalid mb type in B-frame at %d %d\n", s->mb_x, s->mb_y);
return AVERROR_INVALIDDATA;
}
mb_type = btype2mb_type[mb_type];
return ret;
}
} else {
- for (i = 0; i < 6; i++)
- if ((ret = mpeg1_decode_block_intra(s, *s->pblocks[i], i)) < 0)
+ for (i = 0; i < 6; i++) {
+ ret = ff_mpeg1_decode_block_intra(&s->gb,
+ s->intra_matrix,
+ s->intra_scantable.permutated,
+ s->last_dc, *s->pblocks[i],
+ i, s->qscale);
+ if (ret < 0) {
+ av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n",
+ s->mb_x, s->mb_y);
return ret;
+ }
+
+ s->block_last_index[i] = ret;
+ }
}
} else {
if (mb_type & MB_TYPE_ZERO_MV) {
AV_PIX_FMT_D3D11VA_VLD,
#endif
#if CONFIG_MPEG2_VAAPI_HWACCEL
- AV_PIX_FMT_VAAPI_VLD,
+ AV_PIX_FMT_VAAPI,
#endif
#if CONFIG_MPEG1_VDPAU_HWACCEL | CONFIG_MPEG2_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
int i;
if (s->pict_type == AV_PICTURE_TYPE_I) {
av_log(s->avctx, AV_LOG_ERROR,
- "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y);
+ "skipped MB in I-frame at %d %d\n", s->mb_x, s->mb_y);
return AVERROR_INVALIDDATA;
}
int cc_count = 0;
int i;
// There is a caption count field in the data, but it is often
- // incorect. So count the number of captions present.
+ // incorrect. So count the number of captions present.
for (i = 5; i + 6 <= buf_size && ((p[i] & 0xfe) == 0xfe); i += 6)
cc_count++;
// Transform the DVD format into A53 Part 4 format
return 0;
}
-static const AVProfile mpeg2_video_profiles[] = {
- { FF_PROFILE_MPEG2_422, "4:2:2" },
- { FF_PROFILE_MPEG2_HIGH, "High" },
- { FF_PROFILE_MPEG2_SS, "Spatially Scalable" },
- { FF_PROFILE_MPEG2_SNR_SCALABLE, "SNR Scalable" },
- { FF_PROFILE_MPEG2_MAIN, "Main" },
- { FF_PROFILE_MPEG2_SIMPLE, "Simple" },
- { FF_PROFILE_RESERVED, "Reserved" },
- { FF_PROFILE_RESERVED, "Reserved" },
- { FF_PROFILE_UNKNOWN },
-};
-
AVCodec ff_mpeg1video_decoder = {
.name = "mpeg1video",
.long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SLICE_THREADS,
.flush = flush,
- .profiles = NULL_IF_CONFIG_SMALL(mpeg2_video_profiles),
+ .profiles = NULL_IF_CONFIG_SMALL(ff_mpeg2_video_profiles),
};
#if FF_API_XVMC