diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-08-26 13:28:04 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-08-26 13:28:04 +0200 |
commit | e299aa78d955aec21f46748a401dfbd313dd79e9 (patch) | |
tree | 93eee9a25df40f3b955e7bec183cdcf79909a2f0 /libavformat/mov.c | |
parent | 80e05994025ec40076e40388fcd9361a5f64a519 (diff) | |
parent | 08504380ddf25d6905e189e9bf52e7a4c771a415 (diff) | |
download | ffmpeg-e299aa78d955aec21f46748a401dfbd313dd79e9.tar.gz |
Merge commit '08504380ddf25d6905e189e9bf52e7a4c771a415'
* commit '08504380ddf25d6905e189e9bf52e7a4c771a415':
mov: Refactor codec specific final steps in mov_finalize_stsd_codec
Conflicts:
libavformat/mov.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 141 |
1 files changed, 74 insertions, 67 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index a88f03eaed..129af02af5 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1485,6 +1485,79 @@ 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: + case AV_CODEC_ID_MACE3: + case AV_CODEC_ID_MACE6: + case AV_CODEC_ID_QDM2: + 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_AC3: + st->need_parsing = AVSTREAM_PARSE_FULL; + break; + case AV_CODEC_ID_MPEG1VIDEO: + st->need_parsing = AVSTREAM_PARSE_FULL; + 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; @@ -1580,73 +1653,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: - case AV_CODEC_ID_MACE3: - case AV_CODEC_ID_MACE6: - case AV_CODEC_ID_QDM2: - 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_AC3: - st->need_parsing = AVSTREAM_PARSE_FULL; - break; - case AV_CODEC_ID_MPEG1VIDEO: - st->need_parsing = AVSTREAM_PARSE_FULL; - 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) |