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>
This commit is contained in:
@@ -17,6 +17,7 @@ API changes, most recent first:
|
|||||||
|
|
||||||
2016-xx-xx - lavc 57.33.0 - avcodec.h
|
2016-xx-xx - lavc 57.33.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-03-11 - xxxxxxx - lavf/lavc 57.28.101
|
2016-03-11 - xxxxxxx - lavf/lavc 57.28.101
|
||||||
Add requirement to bitstream filtering API that returned packets with
|
Add requirement to bitstream filtering API that returned packets with
|
||||||
|
@@ -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);
|
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;
|
||||||
|
@@ -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;
|
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 && ch < 32768 && bps < 32768)
|
if (bps > 0 && ch > 0 && frame_bytes > 0 && ch < 32768 && bps < 32768)
|
||||||
return (frame_bytes * 8LL) / (bps * ch);
|
return (frame_bytes * 8LL) / (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) {
|
||||||
@@ -3245,7 +3240,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
|
|||||||
return (frame_bytes - 8) * 2 / ch;
|
return (frame_bytes - 8) * 2 / ch;
|
||||||
case AV_CODEC_ID_ADPCM_THP:
|
case AV_CODEC_ID_ADPCM_THP:
|
||||||
case AV_CODEC_ID_ADPCM_THP_LE:
|
case AV_CODEC_ID_ADPCM_THP_LE:
|
||||||
if (avctx->extradata)
|
if (extradata)
|
||||||
return frame_bytes * 14 / (8 * ch);
|
return frame_bytes * 14 / (8 * ch);
|
||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_ADPCM_XA:
|
case AV_CODEC_ID_ADPCM_XA:
|
||||||
@@ -3280,7 +3275,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:
|
||||||
if (bps < 2 || bps > 5)
|
if (bps < 2 || bps > 5)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3298,7 +3293,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:
|
||||||
if(bps<4)
|
if(bps<4)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3315,19 +3310,37 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fall back on using frame_size */
|
/* Fall back on using frame_size */
|
||||||
if (avctx->frame_size > 1 && frame_bytes)
|
if (frame_size > 1 && frame_bytes)
|
||||||
return avctx->frame_size;
|
return frame_size;
|
||||||
|
|
||||||
//For WMA we currently have no other means to calculate duration thus we
|
//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.
|
//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 (bitrate > 0 && frame_bytes > 0 && sr > 0 && ba > 1) {
|
||||||
if (avctx->codec_id == AV_CODEC_ID_WMAV1 || avctx->codec_id == AV_CODEC_ID_WMAV2)
|
if (id == AV_CODEC_ID_WMAV1 || id == AV_CODEC_ID_WMAV2)
|
||||||
return (frame_bytes * 8LL * avctx->sample_rate) / avctx->bit_rate;
|
return (frame_bytes * 8LL * sr) / bitrate;
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
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
|
#if !HAVE_THREADS
|
||||||
int ff_thread_init(AVCodecContext *s)
|
int ff_thread_init(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user