diff ac3dec.c @ 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 289eb941b8ba
children 68cc7650c645
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;