Commit ac3e1834 authored by Baptiste Coudurier's avatar Baptiste Coudurier

av_get_bits_per_sample and due simplifications

Originally committed as revision 5661 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 29c5cdca
......@@ -2499,6 +2499,10 @@ void avcodec_default_free_buffers(AVCodecContext *s);
*/
char av_get_pict_type_char(int pict_type);
/**
* returns codec bits per sample
*/
int av_get_bits_per_sample(enum CodecID codec_id);
/* frame parsing */
typedef struct AVCodecParserContext {
......
......@@ -1304,6 +1304,34 @@ char av_get_pict_type_char(int pict_type){
}
}
int av_get_bits_per_sample(enum CodecID codec_id){
switch(codec_id){
case CODEC_ID_PCM_ALAW:
case CODEC_ID_PCM_MULAW:
case CODEC_ID_PCM_S8:
case CODEC_ID_PCM_U8:
return 8;
case CODEC_ID_PCM_S16BE:
case CODEC_ID_PCM_S16LE:
case CODEC_ID_PCM_U16BE:
case CODEC_ID_PCM_U16LE:
return 16;
case CODEC_ID_PCM_S24DAUD:
case CODEC_ID_PCM_S24BE:
case CODEC_ID_PCM_S24LE:
case CODEC_ID_PCM_U24BE:
case CODEC_ID_PCM_U24LE:
return 24;
case CODEC_ID_PCM_S32BE:
case CODEC_ID_PCM_S32LE:
case CODEC_ID_PCM_U32BE:
case CODEC_ID_PCM_U32LE:
return 32;
default:
return 0;
}
}
/* av_log API */
static int av_log_level = AV_LOG_INFO;
......
......@@ -1463,27 +1463,7 @@ static int mov_write_header(AVFormatContext *s)
}else if(st->codec->codec_type == CODEC_TYPE_AUDIO){
track->tag = mov_find_audio_codec_tag(s, track);
av_set_pts_info(st, 64, 1, st->codec->sample_rate);
switch (st->codec->codec_id) {
case CODEC_ID_PCM_MULAW:
case CODEC_ID_PCM_ALAW:
track->sampleSize = 1 * st->codec->channels;
break;
case CODEC_ID_PCM_S16BE:
case CODEC_ID_PCM_S16LE:
track->sampleSize = 2 * st->codec->channels;
break;
case CODEC_ID_PCM_S24BE:
case CODEC_ID_PCM_S24LE:
track->sampleSize = 3 * st->codec->channels;
break;
case CODEC_ID_PCM_S32BE:
case CODEC_ID_PCM_S32LE:
track->sampleSize = 4 * st->codec->channels;
break;
default:
track->sampleSize = 0;
}
track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels;
}
track->language = ff_mov_iso639_to_lang(st->language, mov->mode != MODE_MOV);
track->mode = mov->mode;
......
......@@ -653,48 +653,17 @@ static int get_audio_frame_size(AVCodecContext *enc, int size)
int frame_size;
if (enc->frame_size <= 1) {
/* specific hack for pcm codecs because no frame size is
provided */
switch(enc->codec_id) {
case CODEC_ID_PCM_S32LE:
case CODEC_ID_PCM_S32BE:
case CODEC_ID_PCM_U32LE:
case CODEC_ID_PCM_U32BE:
if (enc->channels == 0)
return -1;
frame_size = size / (4 * enc->channels);
break;
case CODEC_ID_PCM_S24LE:
case CODEC_ID_PCM_S24BE:
case CODEC_ID_PCM_U24LE:
case CODEC_ID_PCM_U24BE:
case CODEC_ID_PCM_S24DAUD:
if (enc->channels == 0)
return -1;
frame_size = size / (3 * enc->channels);
break;
case CODEC_ID_PCM_S16LE:
case CODEC_ID_PCM_S16BE:
case CODEC_ID_PCM_U16LE:
case CODEC_ID_PCM_U16BE:
if (enc->channels == 0)
return -1;
frame_size = size / (2 * enc->channels);
break;
case CODEC_ID_PCM_S8:
case CODEC_ID_PCM_U8:
case CODEC_ID_PCM_MULAW:
case CODEC_ID_PCM_ALAW:
int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
if (bits_per_sample) {
if (enc->channels == 0)
return -1;
frame_size = size / (enc->channels);
break;
default:
frame_size = size / ((bits_per_sample >> 3) * enc->channels);
} else {
/* used for example by ADPCM codecs */
if (enc->bit_rate == 0)
return -1;
frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
break;
}
} else {
frame_size = enc->frame_size;
......
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