av_get_bits_per_sample and due simplifications
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>
Fri, 7 Jul 2006 17:50:09 +0000 (17:50 +0000)
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>
Fri, 7 Jul 2006 17:50:09 +0000 (17:50 +0000)
Originally committed as revision 5661 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/utils.c
libavformat/movenc.c
libavformat/utils.c

index 5509621..a829fd6 100644 (file)
@@ -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 {
index 641c680..b343ba0 100644 (file)
@@ -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;
index e51fda1..30e3b00 100644 (file)
@@ -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;
index 42f54d6..d51e64a 100644 (file)
@@ -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;