summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorJuanjo <pulento@users.sourceforge.net>2002-04-09 04:52:49 +0000
committerJuanjo <pulento@users.sourceforge.net>2002-04-09 04:52:49 +0000
commite0d2714adc4985198a4c9fadf76508cfe7c131d0 (patch)
tree8907aa932e9da43372590f5454fd7fd231e0983e /libavcodec
parent9f862d1133e23c26e7b682c625f380f68cd4627b (diff)
- 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. Originally committed as revision 393 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/ac3dec.c29
-rw-r--r--libavcodec/utils.c18
2 files changed, 32 insertions, 15 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index c0d801da2d..eade4fb6ae 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -108,13 +108,16 @@ static int ac3_decode_frame(AVCodecContext *avctx,
/* 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 @@ static int ac3_decode_frame(AVCodecContext *avctx,
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 @@ static int ac3_decode_frame(AVCodecContext *avctx,
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 --git a/libavcodec/utils.c b/libavcodec/utils.c
index 815d215757..e74926841a 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -219,6 +219,7 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
const char *codec_name;
AVCodec *p;
char buf1[32];
+ char *channels_str=NULL;
int bitrate;
if (encode)
@@ -269,12 +270,27 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
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: