[FFmpeg-cvslog] lavc: add a variant of av_get_audio_frame_duration working with AVCodecParameters
Anton Khirnov
git at videolan.org
Thu Mar 31 22:22:42 CEST 2016
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sun Jun 1 09:38:22 2014 +0200| [a8068346e48e123f8d3bdf4d64464d81e53e5fc7] | committer: Anton Khirnov
lavc: add a variant of av_get_audio_frame_duration working with AVCodecParameters
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a8068346e48e123f8d3bdf4d64464d81e53e5fc7
---
doc/APIchanges | 1 +
libavcodec/avcodec.h | 6 ++++++
libavcodec/utils.c | 34 ++++++++++++++++++++++------------
3 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 9e11ccc..70fce18 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,7 @@ API changes, most recent first:
2016-xx-xx - lavc 57.14.0 - avcodec.h
xxxxxxx - Add AVCodecParameters and its related API.
+ xxxxxxx - Add av_get_audio_frame_duration2().
2016-xx-xx - xxxxxxx - lavf 57.4.0 - avformat.h
Add AVFormatContext.protocol_whitelist and protocol_blacklist.
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 4d6b2d0..33de8ec 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -4686,6 +4686,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 86a67e1..a9a7423 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2037,21 +2037,15 @@ 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, 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)
return (frame_bytes * 8) / (bps * ch);
- bps = avctx->bits_per_coded_sample;
+ bps = bits_per_coded_sample;
/* codecs with a fixed packet duration */
switch (id) {
@@ -2155,7 +2149,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:
return blocks * (1 + (ba - 4 * ch) / (4 * ch) * 8);
case AV_CODEC_ID_ADPCM_IMA_DK3:
@@ -2169,7 +2163,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:
return 2 * (frame_bytes / ((bps * 2 / 8) * ch));
case AV_CODEC_ID_PCM_BLURAY:
@@ -2184,6 +2178,22 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
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,
+ 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,
+ frame_bytes);
+}
+
#if !HAVE_THREADS
int ff_thread_init(AVCodecContext *s)
{
More information about the ffmpeg-cvslog
mailing list