Commit a8068346 authored by Anton Khirnov's avatar Anton Khirnov

lavc: add a variant of av_get_audio_frame_duration working with AVCodecParameters

parent 998e1b8f
...@@ -15,6 +15,7 @@ API changes, most recent first: ...@@ -15,6 +15,7 @@ API changes, most recent first:
2016-xx-xx - lavc 57.14.0 - avcodec.h 2016-xx-xx - lavc 57.14.0 - avcodec.h
xxxxxxx - Add AVCodecParameters and its related API. xxxxxxx - Add AVCodecParameters and its related API.
xxxxxxx - Add av_get_audio_frame_duration2().
2016-xx-xx - xxxxxxx - lavf 57.4.0 - avformat.h 2016-xx-xx - xxxxxxx - lavf 57.4.0 - avformat.h
Add AVFormatContext.protocol_whitelist and protocol_blacklist. Add AVFormatContext.protocol_whitelist and protocol_blacklist.
......
...@@ -4686,6 +4686,12 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id); ...@@ -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); 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 { typedef struct AVBitStreamFilterContext {
void *priv_data; void *priv_data;
......
...@@ -2037,21 +2037,15 @@ int av_get_bits_per_sample(enum AVCodecID codec_id) ...@@ -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; int bps = av_get_exact_bits_per_sample(id);
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);
/* codecs with an exact constant bits per sample */ /* codecs with an exact constant bits per sample */
if (bps > 0 && ch > 0 && frame_bytes > 0) if (bps > 0 && ch > 0 && frame_bytes > 0)
return (frame_bytes * 8) / (bps * ch); return (frame_bytes * 8) / (bps * ch);
bps = avctx->bits_per_coded_sample; bps = bits_per_coded_sample;
/* codecs with a fixed packet duration */ /* codecs with a fixed packet duration */
switch (id) { switch (id) {
...@@ -2155,7 +2149,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) ...@@ -2155,7 +2149,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
if (ba > 0) { if (ba > 0) {
/* calc from frame_bytes, channels, and block_align */ /* calc from frame_bytes, channels, and block_align */
int blocks = frame_bytes / ba; int blocks = frame_bytes / ba;
switch (avctx->codec_id) { switch (id) {
case AV_CODEC_ID_ADPCM_IMA_WAV: case AV_CODEC_ID_ADPCM_IMA_WAV:
return blocks * (1 + (ba - 4 * ch) / (4 * ch) * 8); return blocks * (1 + (ba - 4 * ch) / (4 * ch) * 8);
case AV_CODEC_ID_ADPCM_IMA_DK3: case AV_CODEC_ID_ADPCM_IMA_DK3:
...@@ -2169,7 +2163,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) ...@@ -2169,7 +2163,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
if (bps > 0) { if (bps > 0) {
/* calc from frame_bytes, channels, and bits_per_coded_sample */ /* calc from frame_bytes, channels, and bits_per_coded_sample */
switch (avctx->codec_id) { switch (id) {
case AV_CODEC_ID_PCM_DVD: case AV_CODEC_ID_PCM_DVD:
return 2 * (frame_bytes / ((bps * 2 / 8) * ch)); return 2 * (frame_bytes / ((bps * 2 / 8) * ch));
case AV_CODEC_ID_PCM_BLURAY: case AV_CODEC_ID_PCM_BLURAY:
...@@ -2184,6 +2178,22 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) ...@@ -2184,6 +2178,22 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
return 0; 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 #if !HAVE_THREADS
int ff_thread_init(AVCodecContext *s) int ff_thread_init(AVCodecContext *s)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment