You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	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>
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user