diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2013-04-20 13:36:48 +0200 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2013-04-21 18:20:30 +0200 |
commit | b845f5e97b655de0a191f736594777fec9754cf5 (patch) | |
tree | 504b624d73af27595e41692904833dbde361a894 | |
parent | 516089d5d86b6809a9458f9cf171f2bc9a8e2a25 (diff) | |
download | ffmpeg-b845f5e97b655de0a191f736594777fec9754cf5.tar.gz |
riff: Factor out WAVEFORMATEX parsing
Makes the code simpler to follow.
Signed-off-by: Diego Biurrun <diego@biurrun.de>
-rw-r--r-- | libavformat/riff.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/libavformat/riff.c b/libavformat/riff.c index 8a1962a704..eae1f644ca 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -682,6 +682,28 @@ void ff_riff_write_info(AVFormatContext *s) * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself * an openended structure. */ + +static void parse_waveformatex(AVIOContext *pb, AVCodecContext *c) +{ + ff_asf_guid subformat; + c->bits_per_coded_sample = avio_rl16(pb); + c->channel_layout = avio_rl32(pb); /* dwChannelMask */ + + ff_get_guid(pb, &subformat); + if (!memcmp(subformat + 4, + (const uint8_t[]){ FF_MEDIASUBTYPE_BASE_GUID }, 12)) { + c->codec_tag = AV_RL32(subformat); + c->codec_id = ff_wav_codec_get_id(c->codec_tag, + c->bits_per_coded_sample); + } else { + c->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat); + if (!c->codec_id) + av_log(c, AV_LOG_WARNING, + "unknown subformat:"FF_PRI_GUID"\n", + FF_ARG_GUID(subformat)); + } +} + int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size) { int id; @@ -708,24 +730,7 @@ int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size) size -= 18; cbSize = FFMIN(size, cbSize); if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */ - ff_asf_guid subformat; - codec->bits_per_coded_sample = avio_rl16(pb); - codec->channel_layout = avio_rl32(pb); /* dwChannelMask */ - - ff_get_guid(pb, &subformat); - if (!memcmp(subformat + 4, - (const uint8_t[]){ FF_MEDIASUBTYPE_BASE_GUID }, 12)) { - codec->codec_tag = AV_RL32(subformat); - codec->codec_id = ff_wav_codec_get_id(codec->codec_tag, - codec->bits_per_coded_sample); - } else { - codec->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, - subformat); - if (!codec->codec_id) - av_log(codec, AV_LOG_WARNING, - "unknown subformat: "FF_PRI_GUID"\n", - FF_ARG_GUID(subformat)); - } + parse_waveformatex(pb, codec); cbSize -= 22; size -= 22; } |