diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index a99dcbd553..bdd72f7d5c 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -3932,6 +3932,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 d4384108df..458b1f358b 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1681,21 +1681,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: @@ -1730,6 +1724,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;