OSDN Git Service

cbr audio muxing fix
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 6 Nov 2004 19:11:34 +0000 (19:11 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 6 Nov 2004 19:11:34 +0000 (19:11 +0000)
Originally committed as revision 3661 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/pcm.c
libavformat/avienc.c
libavformat/wav.c
tests/libav.regression.ref

index 4c999b4..13a16e7 100644 (file)
@@ -127,6 +127,23 @@ static int pcm_encode_init(AVCodecContext *avctx)
         break;
     }
     
+    switch(avctx->codec->id) {
+    case CODEC_ID_PCM_S16LE:
+    case CODEC_ID_PCM_S16BE:
+    case CODEC_ID_PCM_U16LE:
+    case CODEC_ID_PCM_U16BE:
+        avctx->block_align = 2 * avctx->channels;
+        break;
+    case CODEC_ID_PCM_S8:
+    case CODEC_ID_PCM_U8:
+    case CODEC_ID_PCM_MULAW:
+    case CODEC_ID_PCM_ALAW:
+        avctx->block_align = avctx->channels;
+        break;
+    default:
+        break;
+    }
+
     avctx->coded_frame= avcodec_alloc_frame();
     avctx->coded_frame->key_frame= 1;
     
index 5f53df6..30721ec 100644 (file)
@@ -251,33 +251,24 @@ void put_bmp_header(ByteIOContext *pb, AVCodecContext *enc, const CodecTag *tags
         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 @@ static int avi_write_idx1(AVFormatContext *s)
             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);
                 }
             }
        }
index 4528c83..3497126 100644 (file)
@@ -71,7 +71,7 @@ int put_wav_header(ByteIOContext *pb, AVCodecContext *enc)
     }
     
     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;
index dba16dc..d5ff8ca 100644 (file)
@@ -1,8 +1,8 @@
 ffmpeg regression test
-580b53ca26eb2184b928967b8e7d18a7 *./data/b-libav.avi
+8517e7c83227074b8d632477fda310d5 *./data/b-libav.avi
 342282 ./data/b-libav.avi
 ./data/b-libav.avi CRC=001a3415
-80f85b6dce1da8310a49bb4607a34f06 *./data/b-libav.asf
+c83444a0e8ef47b6af1d868d1bb21696 *./data/b-libav.asf
 342967 ./data/b-libav.asf
 ./data/b-libav.asf CRC=750f18c7
 1cbf838e659d7fc3d3e33f4187b91f6c *./data/b-libav.rm