From 02f88eec1d9069ab6bb6c4177471226186647a8f Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 21 Mar 2012 14:30:33 -0400 Subject: aiffdec: do not set bit rate if block duration is unknown CC: libav-stable@libav.org --- libavformat/aiffdec.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'libavformat/aiffdec.c') diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index 11bbcac775..bbac1ab30e 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -157,8 +157,10 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size, if (!codec->block_align) codec->block_align = (codec->bits_per_coded_sample * codec->channels) >> 3; - codec->bit_rate = codec->sample_rate * (codec->block_align << 3) / - aiff->block_duration; + if (aiff->block_duration) { + codec->bit_rate = codec->sample_rate * (codec->block_align << 3) / + aiff->block_duration; + } /* Chunk is over */ if (size) -- cgit v1.2.1 From 2c07c1804831fa0ae6d494a63fdd10facfd6074b Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 21 Mar 2012 14:36:33 -0400 Subject: aiffdec: use av_get_audio_frame_duration() to set block_duration for AIFF-C --- libavformat/aiffdec.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'libavformat/aiffdec.c') diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index bbac1ab30e..a48d946880 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -123,28 +123,27 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size, break; case CODEC_ID_ADPCM_IMA_QT: codec->block_align = 34*codec->channels; - aiff->block_duration = 64; break; case CODEC_ID_MACE3: codec->block_align = 2*codec->channels; - aiff->block_duration = 6; break; case CODEC_ID_MACE6: codec->block_align = 1*codec->channels; - aiff->block_duration = 6; break; case CODEC_ID_GSM: codec->block_align = 33; - aiff->block_duration = 160; break; case CODEC_ID_QCELP: codec->block_align = 35; - aiff->block_duration = 160; break; default: break; } size -= 4; + + if (codec->block_align > 0) + aiff->block_duration = av_get_audio_frame_duration(codec, + codec->block_align); } else { /* Need the codec type */ codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample); -- cgit v1.2.1 From b38b7cc39232b545086f69583967e696fee44ab8 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 21 Mar 2012 14:48:35 -0400 Subject: aiffdec: factor out handling of integer PCM for AIFF-C and plain AIFF --- libavformat/aiffdec.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'libavformat/aiffdec.c') diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index a48d946880..70ce017488 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -110,17 +110,19 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size, codec->sample_rate = sample_rate; size -= 18; - /* Got an AIFF-C? */ + /* get codec id for AIFF-C */ if (version == AIFF_C_VERSION1) { codec->codec_tag = avio_rl32(pb); codec->codec_id = ff_codec_get_id(ff_codec_aiff_tags, codec->codec_tag); + size -= 4; + } + if (version != AIFF_C_VERSION1 || codec->codec_id == CODEC_ID_PCM_S16BE) { + codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample); + codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id); + aiff->block_duration = 1; + } else { switch (codec->codec_id) { - case CODEC_ID_PCM_S16BE: - codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample); - codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id); - aiff->block_duration = 1; - break; case CODEC_ID_ADPCM_IMA_QT: codec->block_align = 34*codec->channels; break; @@ -139,16 +141,9 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size, default: break; } - size -= 4; - if (codec->block_align > 0) aiff->block_duration = av_get_audio_frame_duration(codec, codec->block_align); - } else { - /* Need the codec type */ - codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample); - codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id); - aiff->block_duration = 1; } /* Block align needs to be computed in all cases, as the definition -- cgit v1.2.1 From f036342b4b24458432be20d4faa45a065c94fb69 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 21 Mar 2012 14:51:50 -0400 Subject: aiffdec: set block_duration to 1 for PCM codecs that are supported in AIFF-C --- libavformat/aiffdec.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'libavformat/aiffdec.c') diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index 70ce017488..27d42ea4d0 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -123,6 +123,13 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size, aiff->block_duration = 1; } else { switch (codec->codec_id) { + case CODEC_ID_PCM_F32BE: + case CODEC_ID_PCM_F64BE: + case CODEC_ID_PCM_S16LE: + case CODEC_ID_PCM_ALAW: + case CODEC_ID_PCM_MULAW: + aiff->block_duration = 1; + break; case CODEC_ID_ADPCM_IMA_QT: codec->block_align = 34*codec->channels; break; -- cgit v1.2.1