summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-11-28 01:07:11 +0100
committerMichael Niedermayer <michaelni@gmx.at>2011-11-28 01:07:11 +0100
commit1e19927f12a2a65954aabf38b584025beff15cc3 (patch)
tree33c88297cb164490ebe38b67cf353029d9fb83f2 /libavcodec
parentca55606a5127a9ddb10e4c1971c56e3e69bfd864 (diff)
parent1f948745c3cbe45c4ccd5d8996fc885d826bf3ff (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: vc1: use an enum for Frame Coding Mode doc: cleanup filter section indeo3: error out if no motion vector is set. x86inc: Flag shufps as an floating-point instruction for the AVX emulation code. mpegaudio: do not use init_static_data() for initializing tables. musepack: fix signed shift overflow in mpc_read_packet() mov: Make format string match variable type. wmavoice: Make format string match variable type. vc1: select interlaced scan table by FCM element Generalize RIFF INFO tag support; support reading INFO tag in wav pthread: track thread existence in a separate variable. Conflicts: doc/filters.texi libavcodec/pthread.c libavformat/avi.c libavformat/riff.c libavformat/riff.h libavformat/wav.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/dxva2_vc1.c4
-rw-r--r--libavcodec/indeo3.c2
-rw-r--r--libavcodec/mpegaudiodec.c13
-rw-r--r--libavcodec/mpegaudiodec_float.c5
-rw-r--r--libavcodec/pthread.c10
-rw-r--r--libavcodec/vc1.c16
-rw-r--r--libavcodec/vc1.h12
-rw-r--r--libavcodec/vc1dec.c27
-rw-r--r--libavcodec/wmavoice.c2
9 files changed, 50 insertions, 41 deletions
diff --git a/libavcodec/dxva2_vc1.c b/libavcodec/dxva2_vc1.c
index 2bdd0cc6c7..82be918c22 100644
--- a/libavcodec/dxva2_vc1.c
+++ b/libavcodec/dxva2_vc1.c
@@ -68,7 +68,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
pp->bPicStructure |= 0x01;
if (s->picture_structure & PICT_BOTTOM_FIELD)
pp->bPicStructure |= 0x02;
- pp->bSecondField = v->interlace && v->fcm != 0x03 && !s->first_field;
+ pp->bSecondField = v->interlace && v->fcm != ILACE_FIELD && !s->first_field;
pp->bPicIntra = s->pict_type == AV_PICTURE_TYPE_I;
pp->bPicBackwardPrediction = s->pict_type == AV_PICTURE_TYPE_B;
pp->bBidirectionalAveragingMode = (1 << 7) |
@@ -100,7 +100,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
(s->resync_marker << 4) |
(v->rangered << 3) |
(s->max_b_frames );
- pp->bPicExtrapolation = (!v->interlace || v->fcm == 0x00) ? 1 : 2;
+ pp->bPicExtrapolation = (!v->interlace || v->fcm == PROGRESSIVE) ? 1 : 2;
pp->bPicDeblocked = ((v->profile != PROFILE_ADVANCED && v->rangeredfrm) << 5) |
(s->loop_filter << 1);
pp->bPicDeblockConfined = (v->postprocflag << 7) |
diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c
index c22d257fb9..80003a6c3e 100644
--- a/libavcodec/indeo3.c
+++ b/libavcodec/indeo3.c
@@ -759,6 +759,8 @@ static int parse_bintree(Indeo3DecodeContext *ctx, AVCodecContext *avctx,
av_log(avctx, AV_LOG_ERROR, "SkipCell procedure not implemented yet!\n");
CHECK_CELL
+ if(!curr_cell.mv_ptr)
+ return AVERROR_INVALIDDATA;
copy_cell(ctx, plane, &curr_cell);
return 0;
}
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index 5ae1516d06..7dded97cf4 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -269,7 +269,7 @@ static inline int l3_unscale(int value, int exponent)
return m;
}
-static void decode_init_static(AVCodec *codec)
+static av_cold void decode_init_static(void)
{
int i, j, k;
int offset;
@@ -462,8 +462,14 @@ static void decode_init_static(AVCodec *codec)
static av_cold int decode_init(AVCodecContext * avctx)
{
+ static int initialized_tables = 0;
MPADecodeContext *s = avctx->priv_data;
+ if (!initialized_tables) {
+ decode_init_static();
+ initialized_tables = 1;
+ }
+
s->avctx = avctx;
ff_mpadsp_init(&s->mpadsp);
@@ -1996,7 +2002,6 @@ AVCodec ff_mp1_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP1,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame,
#if FF_API_PARSE_FRAME
@@ -2012,7 +2017,6 @@ AVCodec ff_mp2_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP2,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame,
#if FF_API_PARSE_FRAME
@@ -2028,7 +2032,6 @@ AVCodec ff_mp3_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame,
#if FF_API_PARSE_FRAME
@@ -2044,7 +2047,6 @@ AVCodec ff_mp3adu_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3ADU,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame_adu,
#if FF_API_PARSE_FRAME
@@ -2060,7 +2062,6 @@ AVCodec ff_mp3on4_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3ON4,
.priv_data_size = sizeof(MP3On4DecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init_mp3on4,
.close = decode_close_mp3on4,
.decode = decode_frame_mp3on4,
diff --git a/libavcodec/mpegaudiodec_float.c b/libavcodec/mpegaudiodec_float.c
index a0bc7696bf..4482168a3e 100644
--- a/libavcodec/mpegaudiodec_float.c
+++ b/libavcodec/mpegaudiodec_float.c
@@ -28,7 +28,6 @@ AVCodec ff_mp1float_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP1,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame,
#if FF_API_PARSE_FRAME
@@ -44,7 +43,6 @@ AVCodec ff_mp2float_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP2,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame,
#if FF_API_PARSE_FRAME
@@ -60,7 +58,6 @@ AVCodec ff_mp3float_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame,
#if FF_API_PARSE_FRAME
@@ -76,7 +73,6 @@ AVCodec ff_mp3adufloat_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3ADU,
.priv_data_size = sizeof(MPADecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init,
.decode = decode_frame_adu,
#if FF_API_PARSE_FRAME
@@ -92,7 +88,6 @@ AVCodec ff_mp3on4float_decoder = {
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3ON4,
.priv_data_size = sizeof(MP3On4DecodeContext),
- .init_static_data = decode_init_static,
.init = decode_init_mp3on4,
.close = decode_close_mp3on4,
.decode = decode_frame_mp3on4,
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index e7542a66f4..4d64338eba 100644
--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -72,7 +72,7 @@ typedef struct PerThreadContext {
struct FrameThreadContext *parent;
pthread_t thread;
- int thread_created;
+ int thread_init;
pthread_cond_t input_cond; ///< Used to wait for a new packet from the main thread.
pthread_cond_t progress_cond; ///< Used by child threads to wait for progress to change.
pthread_cond_t output_cond; ///< Used by the main thread to wait for frames to finish.
@@ -659,9 +659,9 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count)
pthread_cond_signal(&p->input_cond);
pthread_mutex_unlock(&p->mutex);
- if (p->thread_created)
+ if (p->thread_init)
pthread_join(p->thread, NULL);
- p->thread_created=0;
+ p->thread_init=0;
if (codec->close)
codec->close(p->avctx);
@@ -765,8 +765,8 @@ static int frame_thread_init(AVCodecContext *avctx)
if (err) goto error;
- p->thread_created= !pthread_create(&p->thread, NULL, frame_worker_thread, p);
- if(!p->thread_created)
+ p->thread_init= !pthread_create(&p->thread, NULL, frame_worker_thread, p);
+ if(!p->thread_init)
goto error;
}
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 9b759eda1e..0dbe48d73c 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -841,14 +841,14 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
if (v->interlace) {
v->fcm = decode012(gb);
if (v->fcm) {
- if (v->fcm == 2)
+ if (v->fcm == ILACE_FIELD)
v->field_mode = 1;
if (!v->warn_interlaced++)
av_log(v->s.avctx, AV_LOG_ERROR,
"Interlaced frames/fields support is incomplete\n");
}
} else {
- v->fcm = 0;
+ v->fcm = PROGRESSIVE;
}
if (v->field_mode) {
@@ -962,7 +962,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
switch (v->s.pict_type) {
case AV_PICTURE_TYPE_I:
case AV_PICTURE_TYPE_BI:
- if (v->fcm == 1) { //interlace frame picture
+ if (v->fcm == ILACE_FRAME) { //interlace frame picture
status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
if (status < 0)
return -1;
@@ -1003,7 +1003,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
v->dmvrange = get_unary(gb, 0, 3);
else
v->dmvrange = 0;
- if (v->fcm == 1) { // interlaced frame picture
+ if (v->fcm == ILACE_FRAME) { // interlaced frame picture
v->fourmvswitch = get_bits1(gb);
v->intcomp = get_bits1(gb);
if (v->intcomp) {
@@ -1043,7 +1043,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
v->tt_index = 1;
else
v->tt_index = 2;
- if (v->fcm != 1) {
+ if (v->fcm != ILACE_FRAME) {
int mvmode;
mvmode = get_unary(gb, 1, 4);
lowquant = (v->pq > 12) ? 0 : 1;
@@ -1078,7 +1078,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|| (v->mv_mode == MV_PMODE_INTENSITY_COMP
&& v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
}
- if (v->fcm == 0) { // progressive
+ if (v->fcm == PROGRESSIVE) { // progressive
if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
v->mv_mode2 == MV_PMODE_MIXED_MV)
|| v->mv_mode == MV_PMODE_MIXED_MV) {
@@ -1100,7 +1100,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
/* Hopefully this is correct for P frames */
v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
- } else if (v->fcm == 1) { // frame interlaced
+ } else if (v->fcm == ILACE_FRAME) { // frame interlaced
v->qs_last = v->s.quarter_sample;
v->s.quarter_sample = 1;
v->s.mspel = 1;
@@ -1140,7 +1140,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
break;
case AV_PICTURE_TYPE_B:
// TODO: implement interlaced frame B picture decoding
- if (v->fcm == 1)
+ if (v->fcm == ILACE_FRAME)
return -1;
if (v->extended_mv)
v->mvrange = get_unary(gb, 0, 3);
diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h
index 209d825057..1b39040bef 100644
--- a/libavcodec/vc1.h
+++ b/libavcodec/vc1.h
@@ -161,6 +161,16 @@ enum COTypes {
};
//@}
+/**
+ * FCM Frame Coding Mode
+ * @note some content might be marked interlaced
+ * but have fcm set to 0 as well (e.g. HD-DVD)
+ */
+enum FrameCodingMode {
+ PROGRESSIVE = 0, ///< in the bitstream is reported as 00b
+ ILACE_FRAME, ///< in the bitstream is reported as 10b
+ ILACE_FIELD ///< in the bitstream is reported as 11b
+};
/** The VC1 Context
* @todo Change size wherever another size is more efficient
@@ -296,7 +306,7 @@ typedef struct VC1Context{
/** Frame decoding info for Advanced profile */
//@{
- uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
+ enum FrameCodingMode fcm;
uint8_t numpanscanwin;
uint8_t tfcntr;
uint8_t rptfrm, tff, rff;
diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index f211287d26..6f1af89e22 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -501,7 +501,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir)
uvmy = uvmy - 2 + 4 * v->cur_field_type;
}
- if (v->fastuvmc && (v->fcm != 1)) { // fastuvmc shall be ignored for interlaced frame picture
+ // fastuvmc shall be ignored for interlaced frame picture
+ if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
}
@@ -685,7 +686,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
uint8_t *srcY;
int dxy, mx, my, src_x, src_y;
int off;
- int fieldmv = (v->fcm == 1) ? v->blk_mv_type[s->block_index[n]] : 0;
+ int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
int v_edge_pos = s->v_edge_pos >> v->field_mode;
if (!v->field_mode && !v->s.last_picture.f.data[0])
@@ -744,7 +745,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
}
- if (v->fcm == 1) { // not sure if needed for other types of picture
+ if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture
int qx, qy;
int width = s->avctx->coded_width;
int height = s->avctx->coded_height >> 1;
@@ -761,7 +762,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
my -= 8 * (qy - height - 1);
}
- if ((v->fcm == 1) && fieldmv)
+ if ((v->fcm == ILACE_FRAME) && fieldmv)
off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
else
off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
@@ -779,7 +780,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
src_y = av_clip(src_y, -16, s->mb_height * 16);
} else {
src_x = av_clip(src_x, -17, s->avctx->coded_width);
- if (v->fcm == 1) {
+ if (v->fcm == ILACE_FRAME) {
if (src_y & 1)
src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
else
@@ -2917,7 +2918,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
int k;
if (v->s.ac_pred) {
- if (!use_pred && v->fcm == 1) {
+ if (!use_pred && v->fcm == ILACE_FRAME) {
zz_table = v->zzi_8x8;
} else {
if (!dc_pred_dir) // top
@@ -2926,7 +2927,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
zz_table = v->zz_8x8[3];
}
} else {
- if (v->fcm != 1)
+ if (v->fcm != ILACE_FRAME)
zz_table = v->zz_8x8[1];
else
zz_table = v->zzi_8x8;
@@ -3136,10 +3137,10 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
i += skip;
if (i > 63)
break;
- if (v->fcm == 0)
+ if (v->fcm == PROGRESSIVE)
block[v->zz_8x8[0][i++]] = value;
else {
- if (use_pred && (v->fcm == 1)) {
+ if (use_pred && (v->fcm == ILACE_FRAME)) {
if (!dc_pred_dir) // top
block[v->zz_8x8[2][i++]] = value;
else // left
@@ -4739,12 +4740,12 @@ static void vc1_decode_p_blocks(VC1Context *v)
for (; s->mb_x < s->mb_width; s->mb_x++) {
ff_update_block_index(s);
- if (v->fcm == 2)
+ if (v->fcm == ILACE_FIELD)
vc1_decode_p_mb_intfi(v);
- else if (v->fcm == 1)
+ else if (v->fcm == ILACE_FRAME)
vc1_decode_p_mb_intfr(v);
else vc1_decode_p_mb(v);
- if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == 0)
+ if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == PROGRESSIVE)
vc1_apply_p_loop_filter(v);
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
// TODO: may need modification to handle slice coding
@@ -4811,7 +4812,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
for (; s->mb_x < s->mb_width; s->mb_x++) {
ff_update_block_index(s);
- if (v->fcm == 2)
+ if (v->fcm == ILACE_FIELD)
vc1_decode_b_mb_intfi(v);
else
vc1_decode_b_mb(v);
diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c
index ca7b368f63..244b630922 100644
--- a/libavcodec/wmavoice.c
+++ b/libavcodec/wmavoice.c
@@ -1795,7 +1795,7 @@ static int synth_superframe(AVCodecContext *ctx,
out_size = n_samples * av_get_bytes_per_sample(ctx->sample_fmt);
if (*data_size < out_size) {
av_log(ctx, AV_LOG_ERROR,
- "Output buffer too small (%d given - %zu needed)\n",
+ "Output buffer too small (%d given - %d needed)\n",
*data_size, out_size);
return -1;
}