diff options
author | Fabrice Bellard <fabrice@bellard.org> | 2003-01-31 17:04:46 +0000 |
---|---|---|
committer | Fabrice Bellard <fabrice@bellard.org> | 2003-01-31 17:04:46 +0000 |
commit | 9ec05e3680c1279afdaec2aaf2a320d2e96777a1 (patch) | |
tree | 54e51c621a4fbaf9e12f44262145edfc3830f083 /libavformat/mpeg.c | |
parent | f17457ac4911001ac5f1c1cdc7f1d8383fd2562e (diff) | |
download | ffmpeg-9ec05e3680c1279afdaec2aaf2a320d2e96777a1.tar.gz |
added DVD LPCM decoding support
Originally committed as revision 1525 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mpeg.c')
-rw-r--r-- | libavformat/mpeg.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index e3c458c560..294c807b07 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -598,6 +598,9 @@ static int mpegps_read_packet(AVFormatContext *s, } else if (startcode >= 0x80 && startcode <= 0x9f) { type = CODEC_TYPE_AUDIO; codec_id = CODEC_ID_AC3; + } else if (startcode >= 0xa0 && startcode <= 0xbf) { + type = CODEC_TYPE_AUDIO; + codec_id = CODEC_ID_PCM_S16BE; } else { skip: /* skip packet */ @@ -611,6 +614,23 @@ static int mpegps_read_packet(AVFormatContext *s, st->codec.codec_type = type; st->codec.codec_id = codec_id; found: + if (startcode >= 0xa0 && startcode <= 0xbf) { + int b1, freq; + static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 }; + + /* for LPCM, we just skip the header and consider it is raw + audio data */ + if (len <= 3) + goto skip; + get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */ + b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */ + get_byte(&s->pb); /* dynamic range control (0x80 = off) */ + len -= 3; + freq = (b1 >> 4) & 3; + st->codec.sample_rate = lpcm_freq_tab[freq]; + st->codec.channels = 1 + (b1 & 7); + st->codec.bit_rate = st->codec.channels * st->codec.sample_rate * 2; + } av_new_packet(pkt, len); //printf("\nRead Packet ID: %x PTS: %f Size: %d", startcode, // (float)pts/90000, len); |