changeset 577:f8edb92d97b6 libavformat

cbr audio muxing fix
author michael
date Sat, 06 Nov 2004 19:11:34 +0000
parents f701ba509d0c
children 8305c0755df7
files avienc.c wav.c
diffstat 2 files changed, 22 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/avienc.c	Thu Oct 28 10:12:57 2004 +0000
+++ b/avienc.c	Sat Nov 06 19:11:34 2004 +0000
@@ -251,33 +251,24 @@
         put_byte(pb, 0);
 }
 
-static void parse_specific_params(AVCodecContext *stream, int *au_byterate, int *au_ssize, int *au_scale)
+static void parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale)
 {
-    switch(stream->codec_id) {
-    case CODEC_ID_PCM_S16LE:
-       *au_scale = *au_ssize = 2*stream->channels;
-       *au_byterate = *au_ssize * stream->sample_rate;
-        break;
-    case CODEC_ID_PCM_U8:
-    case CODEC_ID_PCM_ALAW:
-    case CODEC_ID_PCM_MULAW:
-        *au_scale = *au_ssize = stream->channels;
-        *au_byterate = *au_ssize * stream->sample_rate;
-        break;
-    case CODEC_ID_MP2:
-        *au_ssize = 1;
-        *au_scale = 1;
-        *au_byterate = stream->bit_rate / 8;
-    case CODEC_ID_MP3:
-        *au_ssize = 1;
-        *au_scale = 1;
-        *au_byterate = stream->bit_rate / 8;    
-    default:
-        *au_ssize = 1;
-        *au_scale = 1; 
-        *au_byterate = stream->bit_rate / 8;
-        break;
+    int gcd;
+
+    *au_ssize= stream->block_align;
+    if(stream->frame_size && stream->sample_rate){
+        *au_scale=stream->frame_size;
+        *au_rate= stream->sample_rate;
+    }else if(stream->codec_type == CODEC_TYPE_VIDEO){
+        *au_scale= stream->frame_rate_base;
+        *au_rate = stream->frame_rate;
+    }else{
+        *au_scale= stream->block_align ? stream->block_align*8 : 8;
+        *au_rate = stream->bit_rate;
     }
+    gcd= ff_gcd(*au_scale, *au_rate);
+    *au_scale /= gcd;
+    *au_rate /= gcd;
 }
 
 static offset_t avi_start_new_riff(AVIContext *avi, ByteIOContext *pb, 
@@ -595,18 +586,12 @@
             if (avi->frames_hdr_strm[n] != 0) {
                 stream = &s->streams[n]->codec;
                 url_fseek(pb, avi->frames_hdr_strm[n], SEEK_SET);
-                if (stream->codec_type == CODEC_TYPE_VIDEO) {
-                    put_le32(pb, stream->frame_number); 
-                    if (nb_frames < stream->frame_number)
-                        nb_frames = stream->frame_number;
+                parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale);
+                if (au_ssize == 0) {
+                    put_le32(pb, stream->frame_number);
+                    nb_frames += stream->frame_number;
                 } else {
-                    if (stream->codec_id == CODEC_ID_MP2 || stream->codec_id == CODEC_ID_MP3) {
-                        put_le32(pb, stream->frame_number);
-                        nb_frames += stream->frame_number;
-                    } else {
-                        parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale);
-                        put_le32(pb, avi->audio_strm_length[n] / au_ssize);
-                    }
+                    put_le32(pb, avi->audio_strm_length[n] / au_ssize);
                 }
             }
        }
--- a/wav.c	Thu Oct 28 10:12:57 2004 +0000
+++ b/wav.c	Sat Nov 06 19:11:34 2004 +0000
@@ -71,7 +71,7 @@
     }
     
     if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3) {
-        blkalign = 1;
+        blkalign = enc->frame_size; //this is wrong, but seems many demuxers dont work if this is set correctly
         //blkalign = 144 * enc->bit_rate/enc->sample_rate;
     } else if (enc->block_align != 0) { /* specified by the codec */
         blkalign = enc->block_align;