On 28/02/12 20:57, Justin Ruggles wrote:
> On 02/28/2012 05:08 AM, Luca Barbato wrote:
>
>> On 28/02/12 00:56, Justin Ruggles wrote:
>>> This only returns bits per sample when it is exactly correct. That is, the
>>> codec contains only raw samples with no frame headers or padding. This
>>> applies
>>> to basically all PCM codecs and a small subset of ADPCM codecs.
>>> ---
>>> doc/APIchanges | 3 +++
>>> libavcodec/avcodec.h | 10 ++++++++++
>>> libavcodec/utils.c | 34 +++++++++++++++++++++++-----------
>>> 3 files changed, 36 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/doc/APIchanges b/doc/APIchanges
>>> index 8b12de0..f10aa77 100644
>>> --- a/doc/APIchanges
>>> +++ b/doc/APIchanges
>>> @@ -12,6 +12,9 @@ libavutil: 2011-04-18
>>>
>>> API changes, most recent first:
>>>
>>> +2012-xx-xx - xxxxxxx - lavc 54.x.x
>>> + Add av_get_exact_bits_per_sample()
>>> +
>>> 2012-02-25 - c9bca80 - lavu 51.24.0 - error.h
>>> Add AVERROR_UNKNOWN
>>>
>>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>>> index cd86856..f2f21cb 100644
>>> --- a/libavcodec/avcodec.h
>>> +++ b/libavcodec/avcodec.h
>>> @@ -3881,6 +3881,16 @@ void avcodec_default_free_buffers(AVCodecContext *s);
>>> */
>>> int av_get_bits_per_sample(enum CodecID codec_id);
>>>
>>> +/**
>>> + * Return codec bits per sample.
>>> + * Only return non-zero if the bits per sample is exactly correct, not an
>>> + * approximation.
>>> + *
>>> + * @param[in] codec_id the codec
>>> + * @return Number of bits per sample or zero if unknown for the given
>>> codec.
>>> + */
>>> +int av_get_exact_bits_per_sample(enum CodecID codec_id);
>>> +
>>> /* frame parsing */
>>> typedef struct AVCodecParserContext {
>>> void *priv_data;
>>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>>> index e57f7ef..574d4cd 100644
>>> --- a/libavcodec/utils.c
>>> +++ b/libavcodec/utils.c
>>> @@ -1668,21 +1668,15 @@ void avcodec_default_free_buffers(AVCodecContext
>>> *avctx)
>>> }
>>> }
>>>
>>> -int av_get_bits_per_sample(enum CodecID codec_id){
>>> +int av_get_exact_bits_per_sample(enum CodecID codec_id)
>>> +{
>>> switch(codec_id){
>>> - case CODEC_ID_ADPCM_SBPRO_2:
>>> - return 2;
>>> - case CODEC_ID_ADPCM_SBPRO_3:
>>> - return 3;
>>> - case CODEC_ID_ADPCM_SBPRO_4:
>>> case CODEC_ID_ADPCM_CT:
>>> case CODEC_ID_ADPCM_IMA_APC:
>>> - case CODEC_ID_ADPCM_IMA_WAV:
>>> - case CODEC_ID_ADPCM_IMA_QT:
>>> - case CODEC_ID_ADPCM_SWF:
>>> - case CODEC_ID_ADPCM_MS:
>>> - case CODEC_ID_ADPCM_YAMAHA:
>>> + case CODEC_ID_ADPCM_IMA_EA_SEAD:
>>> + case CODEC_ID_ADPCM_IMA_WS:
>>> case CODEC_ID_ADPCM_G722:
>>> + case CODEC_ID_ADPCM_YAMAHA:
>>> return 4;
>>> case CODEC_ID_PCM_ALAW:
>>> case CODEC_ID_PCM_MULAW:
>>> @@ -1717,6 +1711,24 @@ int av_get_bits_per_sample(enum CodecID codec_id){
>>> }
>>> }
>>>
>>> +int av_get_bits_per_sample(enum CodecID codec_id)
>>> +{
>>> + switch (codec_id) {
>>> + case CODEC_ID_ADPCM_SBPRO_2:
>>> + return 2;
>>> + case CODEC_ID_ADPCM_SBPRO_3:
>>> + return 3;
>>> + case CODEC_ID_ADPCM_SBPRO_4:
>>> + case CODEC_ID_ADPCM_IMA_WAV:
>>> + case CODEC_ID_ADPCM_IMA_QT:
>>> + case CODEC_ID_ADPCM_SWF:
>>> + case CODEC_ID_ADPCM_MS:
>>> + return 4;
>>> + default:
>>> + return av_get_exact_bits_per_sample(codec_id);
>>> + }
>>> +}
>>> +
>>> #if !HAVE_THREADS
>>> int ff_thread_init(AVCodecContext *s){
>>> return -1;
>>
>> Would be possible having something in the codec structure to deliver
>> this information so adding new codecs won't force us to update those?
>
>
> The issue here is that we want to be able to access these independent of
> the decoder or encoder being available and/or for stream copy. The same
> applies to av_get_audio_frame_duration().
>
Let's push them as they are, we'll figure out a better way later.
lu
--
Luca Barbato
Gentoo/linux
http://dev.gentoo.org/~lu_zero
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel