diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-03-31 21:19:49 +0100 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-03-31 21:20:02 +0100 |
commit | e6053b3b19c070e994a501fe0cc20255d15c4aa8 (patch) | |
tree | 493b0d19d642476b404abf043d4ae696b853ef05 /libavcodec | |
parent | f9b1cf15c233dde29f3659c903e32f74be4fdb95 (diff) | |
parent | a8068346e48e123f8d3bdf4d64464d81e53e5fc7 (diff) | |
download | ffmpeg-e6053b3b19c070e994a501fe0cc20255d15c4aa8.tar.gz |
Merge commit 'a8068346e48e123f8d3bdf4d64464d81e53e5fc7'
* commit 'a8068346e48e123f8d3bdf4d64464d81e53e5fc7':
lavc: add a variant of av_get_audio_frame_duration working with AVCodecParameters
Fixes from jamrial incorporated.
Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/avcodec.h | 6 | ||||
-rw-r--r-- | libavcodec/utils.c | 49 |
2 files changed, 37 insertions, 18 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 94993d3371..0d37083ee2 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -5342,6 +5342,12 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id); */ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + typedef struct AVBitStreamFilterContext { void *priv_data; diff --git a/libavcodec/utils.c b/libavcodec/utils.c index f4312b28f4..d38e2f927f 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -3145,21 +3145,16 @@ int av_get_bits_per_sample(enum AVCodecID codec_id) } } -int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) +static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba, + uint32_t tag, int bits_per_coded_sample, int64_t bitrate, + uint8_t * extradata, int frame_size, int frame_bytes) { - int id, sr, ch, ba, tag, bps; - - id = avctx->codec_id; - sr = avctx->sample_rate; - ch = avctx->channels; - ba = avctx->block_align; - tag = avctx->codec_tag; - bps = av_get_exact_bits_per_sample(avctx->codec_id); + int bps = av_get_exact_bits_per_sample(id); /* codecs with an exact constant bits per sample */ if (bps > 0 && ch > 0 && frame_bytes > 0 && ch < 32768 && bps < 32768) return (frame_bytes * 8LL) / (bps * ch); - bps = avctx->bits_per_coded_sample; + bps = bits_per_coded_sample; /* codecs with a fixed packet duration */ switch (id) { @@ -3245,7 +3240,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) return (frame_bytes - 8) * 2 / ch; case AV_CODEC_ID_ADPCM_THP: case AV_CODEC_ID_ADPCM_THP_LE: - if (avctx->extradata) + if (extradata) return frame_bytes * 14 / (8 * ch); break; case AV_CODEC_ID_ADPCM_XA: @@ -3280,7 +3275,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) if (ba > 0) { /* calc from frame_bytes, channels, and block_align */ int blocks = frame_bytes / ba; - switch (avctx->codec_id) { + switch (id) { case AV_CODEC_ID_ADPCM_IMA_WAV: if (bps < 2 || bps > 5) return 0; @@ -3298,7 +3293,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) if (bps > 0) { /* calc from frame_bytes, channels, and bits_per_coded_sample */ - switch (avctx->codec_id) { + switch (id) { case AV_CODEC_ID_PCM_DVD: if(bps<4) return 0; @@ -3315,19 +3310,37 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) } /* Fall back on using frame_size */ - if (avctx->frame_size > 1 && frame_bytes) - return avctx->frame_size; + if (frame_size > 1 && frame_bytes) + return frame_size; //For WMA we currently have no other means to calculate duration thus we //do it here by assuming CBR, which is true for all known cases. - if (avctx->bit_rate>0 && frame_bytes>0 && avctx->sample_rate>0 && avctx->block_align>1) { - if (avctx->codec_id == AV_CODEC_ID_WMAV1 || avctx->codec_id == AV_CODEC_ID_WMAV2) - return (frame_bytes * 8LL * avctx->sample_rate) / avctx->bit_rate; + if (bitrate > 0 && frame_bytes > 0 && sr > 0 && ba > 1) { + if (id == AV_CODEC_ID_WMAV1 || id == AV_CODEC_ID_WMAV2) + return (frame_bytes * 8LL * sr) / bitrate; } return 0; } +int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) +{ + return get_audio_frame_duration(avctx->codec_id, avctx->sample_rate, + avctx->channels, avctx->block_align, + avctx->codec_tag, avctx->bits_per_coded_sample, + avctx->bit_rate, avctx->extradata, avctx->frame_size, + frame_bytes); +} + +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes) +{ + return get_audio_frame_duration(par->codec_id, par->sample_rate, + par->channels, par->block_align, + par->codec_tag, par->bits_per_coded_sample, + par->bit_rate, par->extradata, par->frame_size, + frame_bytes); +} + #if !HAVE_THREADS int ff_thread_init(AVCodecContext *s) { |