Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2016-03-31 23:19:49 +0300
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>2016-03-31 23:20:02 +0300
commite6053b3b19c070e994a501fe0cc20255d15c4aa8 (patch)
tree493b0d19d642476b404abf043d4ae696b853ef05 /libavcodec/utils.c
parentf9b1cf15c233dde29f3659c903e32f74be4fdb95 (diff)
parenta8068346e48e123f8d3bdf4d64464d81e53e5fc7 (diff)
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/utils.c')
-rw-r--r--libavcodec/utils.c49
1 files changed, 31 insertions, 18 deletions
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)
{