diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2013-08-22 15:05:27 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2013-08-24 17:02:23 +0200 |
commit | 08504380ddf25d6905e189e9bf52e7a4c771a415 (patch) | |
tree | 0922991c1cd55722a6d75743ca12f59e020ab460 /libavformat/mov.c | |
parent | dc518a3ae21e7b6420131b813cfc6bcdcad26b7e (diff) | |
download | ffmpeg-08504380ddf25d6905e189e9bf52e7a4c771a415.tar.gz |
mov: Refactor codec specific final steps in mov_finalize_stsd_codec
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 123 |
1 files changed, 65 insertions, 58 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index 9086ba8956..0d3239144f 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1306,6 +1306,70 @@ static void mov_parse_stsd_subtitle(MOVContext *c, AVIOContext *pb, st->codec->height = sc->height; } +static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb, + AVStream *st, MOVStreamContext *sc) +{ + if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && + !st->codec->sample_rate && sc->time_scale > 1) + st->codec->sample_rate = sc->time_scale; + + /* special codec parameters handling */ + switch (st->codec->codec_id) { +#if CONFIG_DV_DEMUXER + case AV_CODEC_ID_DVAUDIO: + c->dv_fctx = avformat_alloc_context(); + c->dv_demux = avpriv_dv_init_demux(c->dv_fctx); + if (!c->dv_demux) { + av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n"); + return AVERROR(ENOMEM); + } + sc->dv_audio_container = 1; + st->codec->codec_id = AV_CODEC_ID_PCM_S16LE; + break; +#endif + /* no ifdef since parameters are always those */ + case AV_CODEC_ID_QCELP: + st->codec->channels = 1; + // force sample rate for qcelp when not stored in mov + if (st->codec->codec_tag != MKTAG('Q','c','l','p')) + st->codec->sample_rate = 8000; + break; + case AV_CODEC_ID_AMR_NB: + st->codec->channels = 1; + /* force sample rate for amr, stsd in 3gp does not store sample rate */ + st->codec->sample_rate = 8000; + break; + case AV_CODEC_ID_AMR_WB: + st->codec->channels = 1; + st->codec->sample_rate = 16000; + break; + case AV_CODEC_ID_MP2: + case AV_CODEC_ID_MP3: + /* force type after stsd for m1a hdlr */ + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; + st->need_parsing = AVSTREAM_PARSE_FULL; + break; + case AV_CODEC_ID_GSM: + case AV_CODEC_ID_ADPCM_MS: + case AV_CODEC_ID_ADPCM_IMA_WAV: + case AV_CODEC_ID_ILBC: + st->codec->block_align = sc->bytes_per_frame; + break; + case AV_CODEC_ID_ALAC: + if (st->codec->extradata_size == 36) { + st->codec->channels = AV_RB8 (st->codec->extradata + 21); + st->codec->sample_rate = AV_RB32(st->codec->extradata + 32); + } + break; + case AV_CODEC_ID_VC1: + st->need_parsing = AVSTREAM_PARSE_FULL; + break; + default: + break; + } + return 0; +} + int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) { AVStream *st; @@ -1389,64 +1453,7 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) if (pb->eof_reached) return AVERROR_EOF; - if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO && st->codec->sample_rate==0 && sc->time_scale>1) - st->codec->sample_rate= sc->time_scale; - - /* special codec parameters handling */ - switch (st->codec->codec_id) { -#if CONFIG_DV_DEMUXER - case AV_CODEC_ID_DVAUDIO: - c->dv_fctx = avformat_alloc_context(); - c->dv_demux = avpriv_dv_init_demux(c->dv_fctx); - if (!c->dv_demux) { - av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n"); - return AVERROR(ENOMEM); - } - sc->dv_audio_container = 1; - st->codec->codec_id = AV_CODEC_ID_PCM_S16LE; - break; -#endif - /* no ifdef since parameters are always those */ - case AV_CODEC_ID_QCELP: - // force sample rate for qcelp when not stored in mov - if (st->codec->codec_tag != MKTAG('Q','c','l','p')) - st->codec->sample_rate = 8000; - st->codec->channels= 1; /* really needed */ - break; - case AV_CODEC_ID_AMR_NB: - st->codec->channels= 1; /* really needed */ - /* force sample rate for amr, stsd in 3gp does not store sample rate */ - st->codec->sample_rate = 8000; - break; - case AV_CODEC_ID_AMR_WB: - st->codec->channels = 1; - st->codec->sample_rate = 16000; - break; - case AV_CODEC_ID_MP2: - case AV_CODEC_ID_MP3: - st->codec->codec_type = AVMEDIA_TYPE_AUDIO; /* force type after stsd for m1a hdlr */ - st->need_parsing = AVSTREAM_PARSE_FULL; - break; - case AV_CODEC_ID_GSM: - case AV_CODEC_ID_ADPCM_MS: - case AV_CODEC_ID_ADPCM_IMA_WAV: - case AV_CODEC_ID_ILBC: - st->codec->block_align = sc->bytes_per_frame; - break; - case AV_CODEC_ID_ALAC: - if (st->codec->extradata_size == 36) { - st->codec->channels = AV_RB8 (st->codec->extradata+21); - st->codec->sample_rate = AV_RB32(st->codec->extradata+32); - } - break; - case AV_CODEC_ID_VC1: - st->need_parsing = AVSTREAM_PARSE_FULL; - break; - default: - break; - } - - return 0; + return mov_finalize_stsd_codec(c, pb, st, sc); } static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom) |