ffmpeg | branch: master | Derek Buitenhuis <derek.buitenh...@gmail.com> | Thu Mar 31 21:19:49 2016 +0100| [e6053b3b19c070e994a501fe0cc20255d15c4aa8] | committer: Derek Buitenhuis
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.buitenh...@gmail.com> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e6053b3b19c070e994a501fe0cc20255d15c4aa8 --- doc/APIchanges | 1 + libavcodec/avcodec.h | 6 ++++++ libavcodec/utils.c | 49 +++++++++++++++++++++++++++++++------------------ 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 32969ed..8363b05 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -17,6 +17,7 @@ API changes, most recent first: 2016-xx-xx - lavc 57.33.0 - avcodec.h xxxxxxx - Add AVCodecParameters and its related API. + xxxxxxx - Add av_get_audio_frame_duration2(). 2016-03-11 - xxxxxxx - lavf/lavc 57.28.101 Add requirement to bitstream filtering API that returned packets with diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 94993d3..0d37083 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 f4312b2..d38e2f9 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) { ====================================================================== diff --cc doc/APIchanges index 32969ed,70fce18..8363b05 --- a/doc/APIchanges +++ b/doc/APIchanges @@@ -15,49 -13,19 +15,50 @@@ libavutil: 2015-08-2 API changes, most recent first: -2016-xx-xx - lavc 57.14.0 - avcodec.h +2016-xx-xx - lavc 57.33.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. - Add 'protocol_whitelist' and 'protocol_blacklist' private options for - avio_open2(). - -2016-xx-xx - lavc 57.13.0 - avcodec.h +2016-03-11 - xxxxxxx - lavf/lavc 57.28.101 + Add requirement to bitstream filtering API that returned packets with + size == 0 and side_data_elems == 0 are to be skipped by the caller. + +2016-XX-XX - xxxxxxx - lavf 57.28.100 + Add protocol blacklisting API + +2016-02-28 - xxxxxxx - lavc 57.27.101 + Validate AVFrame returned by get_buffer2 to have required + planes not NULL and unused planes set to NULL as crashes + and buffer overflow are possible with certain streams if + that is not the case. + +2016-xx-xx - xxxxxxx - lavc 57.27.100 - avcodec.h + "flags2" decoding option now allows the flag "ass_ro_flush_noop" preventing + the reset of the ASS ReadOrder field on flush. This affects the content of + AVSubtitles.rects[N]->ass when "sub_text_format" is set to "ass" (see + previous entry). + +2016-xx-xx - xxxxxxx - lavc 57.26.100 - avcodec.h + Add a "sub_text_format" subtitles decoding option allowing the values "ass" + (recommended) and "ass_with_timings" (not recommended, deprecated, default). + The default value for this option will change to "ass" at the next major + libavcodec version bump. + + The current default is "ass_with_timings" for compatibility. This means that + all subtitles text decoders currently still output ASS with timings printed + as strings in the AVSubtitles.rects[N]->ass fields. + + Setting "sub_text_format" to "ass" allows a better timing accuracy (ASS + timing is limited to a 1/100 time base, so this is relevant for any subtitles + format needing a bigger one), ease timing adjustments, and prevents the need + of removing the timing from the decoded string yourself. This form is also + known as "the Matroska form". The timing information (start time, duration) + can be found in the AVSubtitles fields. + +2016-xx-xx - lavc 57.25.0 - avcodec.h Add AVCodecContext.hw_frames_ctx. -2016-xx-xx - lavfi 6.2.0 - avfilter.h +2016-xx-xx - lavfi 6.36.0 - avfilter.h xxxxxxx avfilter.h - Add AVFilterLink.hw_frames_ctx. xxxxxxx buffersrc.h - Add AVBufferSrcParameters and functions for handling it. diff --cc libavcodec/utils.c index f4312b2,a9a7423..d38e2f9 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@@ -3145,21 -2037,15 +3145,16 @@@ int av_get_bits_per_sample(enum AVCodec } } - 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) ++ 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) - return (frame_bytes * 8) / (bps * ch); + 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) { @@@ -3243,11 -2120,6 +3238,11 @@@ return (frame_bytes - 4) * 2 / ch; case AV_CODEC_ID_ADPCM_IMA_AMV: 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: return (frame_bytes / 128) * 224 / ch; case AV_CODEC_ID_INTERPLAY_DPCM: @@@ -3280,11 -2149,9 +3275,11 @@@ 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); + if (bps < 2 || bps > 5) + return 0; + return blocks * (1 + (ba - 4 * ch) / (bps * ch) * 8); case AV_CODEC_ID_ADPCM_IMA_DK3: return blocks * (((ba - 16) * 2 / 3 * 4) / ch); case AV_CODEC_ID_ADPCM_IMA_DK4: @@@ -3298,14 -2163,10 +3293,14 @@@ 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; return 2 * (frame_bytes / ((bps * 2 / 8) * ch)); case AV_CODEC_ID_PCM_BLURAY: + if(bps<4) + return 0; return frame_bytes / ((FFALIGN(ch, 2) * bps) / 8); case AV_CODEC_ID_S302M: return 2 * (frame_bytes / ((bps + 4) / 4)) / ch; @@@ -3314,20 -2175,25 +3309,38 @@@ } } + /* 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) { _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog