changeset 318:21697f35a9ca libavcodec

- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for AC3 set avcodec_context->channels to the desired number channels, if the setting is 0 AC3 decoder will set it to the channels found in the stream. - Changed ffmpeg to cope with the new "way" of AC3 decoding. - ASF muxer now uses Tickers for PTS calculations.
author pulento
date Tue, 09 Apr 2002 04:52:49 +0000
parents 5afea0021fb8
children 3ef1cc75d5f5
files ac3dec.c utils.c
diffstat 2 files changed, 32 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/ac3dec.c	Tue Apr 09 00:37:06 2002 +0000
+++ b/ac3dec.c	Tue Apr 09 04:52:49 2002 +0000
@@ -108,13 +108,16 @@
                     /* update codec info */
                     avctx->sample_rate = sample_rate;
                     s->channels = ac3_channels[s->flags & 7];
-		    if (s->flags & AC3_LFE)
-			s->channels++;
-		    if (s->channels < avctx->channels) {
-			fprintf(stderr, "Source channels are less than specified: output to %d channels..\n", s->channels);
-			avctx->channels = s->channels;
-		    }
-                    avctx->bit_rate = bit_rate;
+                    if (s->flags & AC3_LFE)
+			            s->channels++;
+			        if (avctx->channels == 0)
+			            /* No specific number of channel requested */
+			            avctx->channels = s->channels;
+			        else if (s->channels < avctx->channels) {
+			            fprintf(stderr, "libav: AC3 Source channels are less than specified: output to %d channels..\n", s->channels);
+			            avctx->channels = s->channels;
+		            }
+		            avctx->bit_rate = bit_rate;
                 }
             }
         } else if (len < s->frame_size) {
@@ -127,15 +130,13 @@
             s->inbuf_ptr += len;
             buf_size -= len;
         } else {
-#if 0
+            flags = s->flags;
             if (avctx->channels == 1)
                 flags = AC3_MONO;
-            else
+            else if (avctx->channels == 2)
                 flags = AC3_STEREO;
-#else
-	    flags = s->flags;
-#endif
-            flags |= AC3_ADJUST_LEVEL;
+            else
+                flags |= AC3_ADJUST_LEVEL;
             level = 1;
             if (ac3_frame (&s->state, s->inbuf, &flags, &level, 384)) {
             fail:
@@ -146,7 +147,7 @@
             for (i = 0; i < 6; i++) {
                 if (ac3_block (&s->state))
                     goto fail;
-		float_to_int (*samples, out_samples + i * 256 * avctx->channels, avctx->channels);
+                float_to_int (*samples, out_samples + i * 256 * avctx->channels, avctx->channels);
             }
             s->inbuf_ptr = s->inbuf;
             s->frame_size = 0;
--- a/utils.c	Tue Apr 09 00:37:06 2002 +0000
+++ b/utils.c	Tue Apr 09 04:52:49 2002 +0000
@@ -219,6 +219,7 @@
     const char *codec_name;
     AVCodec *p;
     char buf1[32];
+    char *channels_str=NULL;
     int bitrate;
 
     if (encode)
@@ -269,12 +270,27 @@
         snprintf(buf, buf_size,
                  "Audio: %s",
                  codec_name);
+        switch (enc->channels) {
+            case 1:
+                channels_str = "mono";
+                break;
+            case 2:
+                channels_str = "stereo";
+                break;
+            case 6:
+                channels_str = "5:1";
+                break;
+            default:
+                sprintf(channels_str, "%d channels", enc->channels);
+                break;
+        }
         if (enc->sample_rate) {
             snprintf(buf + strlen(buf), buf_size - strlen(buf),
                      ", %d Hz, %s",
                      enc->sample_rate,
-                     enc->channels == 2 ? "stereo" : "mono");
+                     channels_str);
         }
+        
         /* for PCM codecs, compute bitrate directly */
         switch(enc->codec_id) {
         case CODEC_ID_PCM_S16LE: