From bf9856250584228678963ce8f11c54f85005d783 Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Thu, 22 Aug 2013 15:00:46 +0200 Subject: [PATCH] mov: Refactor codec id selection in mov_codec_id --- libavformat/mov.c | 52 +++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index c036b21fd3..16dab92448 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1069,6 +1069,37 @@ enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags) return ff_get_pcm_codec_id(bps, flags & 1, flags & 2, flags & 4 ? -1 : 0); } +static int mov_codec_id(AVStream *st, uint32_t format) +{ + int id = ff_codec_get_id(ff_codec_movaudio_tags, format); + + if (id <= 0 && + ((format & 0xFFFF) == 'm' + ('s' << 8) || + (format & 0xFFFF) == 'T' + ('S' << 8))) + id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format) & 0xFFFF); + + if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO && id > 0) { + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; + } else if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO && + /* skip old asf mpeg4 tag */ + format && format != MKTAG('m','p','4','s')) { + id = ff_codec_get_id(ff_codec_movvideo_tags, format); + if (id <= 0) + id = ff_codec_get_id(ff_codec_bmp_tags, format); + if (id > 0) + st->codec->codec_type = AVMEDIA_TYPE_VIDEO; + else if (st->codec->codec_type == AVMEDIA_TYPE_DATA) { + id = ff_codec_get_id(ff_codec_movsubtitle_tags, format); + if (id > 0) + st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE; + } + } + + st->codec->codec_tag = format; + + return id; +} + int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) { AVStream *st; @@ -1119,26 +1150,7 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id; sc->dref_id= dref_id; - st->codec->codec_tag = format; - id = ff_codec_get_id(ff_codec_movaudio_tags, format); - if (id<=0 && ((format&0xFFFF) == 'm'+('s'<<8) || (format&0xFFFF) == 'T'+('S'<<8))) - id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format)&0xFFFF); - - if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO && id > 0) { - st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - } else if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO && /* do not overwrite codec type */ - format && format != MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */ - id = ff_codec_get_id(ff_codec_movvideo_tags, format); - if (id <= 0) - id = ff_codec_get_id(ff_codec_bmp_tags, format); - if (id > 0) - st->codec->codec_type = AVMEDIA_TYPE_VIDEO; - else if (st->codec->codec_type == AVMEDIA_TYPE_DATA){ - id = ff_codec_get_id(ff_codec_movsubtitle_tags, format); - if (id > 0) - st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE; - } - } + id = mov_codec_id(st, format); av_dlog(c->fc, "size=%d 4CC= %c%c%c%c codec_type=%d\n", size, (format >> 0) & 0xff, (format >> 8) & 0xff, (format >> 16) & 0xff,