# HG changeset patch # User pulento # Date 1018327969 0 # Node ID 21697f35a9cafbdec35b966f2bd5d5a319db52ad # Parent 5afea0021fb880879f73223bd8bc381e951165fd - 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. diff -r 5afea0021fb8 -r 21697f35a9ca ac3dec.c --- 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; diff -r 5afea0021fb8 -r 21697f35a9ca utils.c --- 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: