diff options
author | Juergen Keil <jkeil@users.sourceforge.net> | 2001-10-18 14:29:44 +0000 |
---|---|---|
committer | Juergen Keil <jkeil@users.sourceforge.net> | 2001-10-18 14:29:44 +0000 |
commit | 8fb16d78ba3a115c55867c037e94e6fdc2d1f952 (patch) | |
tree | 99802ea033ba7e1e0b24a512e834671ea7d84eba | |
parent | ea264e422051090c939d6644757597a90b4ae3e8 (diff) | |
download | xine-lib-8fb16d78ba3a115c55867c037e94e6fdc2d1f952.tar.gz xine-lib-8fb16d78ba3a115c55867c037e94e6fdc2d1f952.tar.bz2 |
remove hardcoded lpcm audio format information, try to extract the information
from the mpeg stream
CVS patchset: 827
CVS date: 2001/10/18 14:29:44
-rw-r--r-- | src/demuxers/demux_mpeg_block.c | 60 |
1 files changed, 46 insertions, 14 deletions
diff --git a/src/demuxers/demux_mpeg_block.c b/src/demuxers/demux_mpeg_block.c index 0f5cd1eda..38c051dfb 100644 --- a/src/demuxers/demux_mpeg_block.c +++ b/src/demuxers/demux_mpeg_block.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: demux_mpeg_block.c,v 1.54 2001/10/17 20:33:09 guenter Exp $ + * $Id: demux_mpeg_block.c,v 1.55 2001/10/18 14:29:44 jkeil Exp $ * * demultiplexer for mpeg 1/2 program streams * @@ -373,21 +373,53 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m } else if ((p[0]&0xf0) == 0xa0) { int pcm_offset; + int number_of_frame_headers; + int first_access_unit_pointer; + int audio_frame_number; + int bits_per_sample; + int sample_rate; + int num_channels; + int dynamic_range; + + xprintf (VERBOSE|DEMUX,"LPCM packet, len : %d %02x\n",packet_len-4, p[0]); + /* + * found in http://members.freemail.absa.co.za/ginggs/dvd/mpeg2_lpcm.txt + * appears to be correct. + */ - xprintf (VERBOSE|DEMUX,"LPCMacket, len : %d %02x\n",packet_len-4, p[0]); - - for( pcm_offset=0; ++pcm_offset < packet_len-1 ; ){ - if ( p[pcm_offset] == 0x01 && p[pcm_offset+1] == 0x80 ) { /* START */ - pcm_offset += 2; - break; - } - } - /* FIXME: Find out from the stream what these values should be! - * Problem! No-one currently knows. + number_of_frame_headers = p[1]; + /* unknown = p[2]; */ + first_access_unit_pointer = p[3]; + audio_frame_number = p[4]; + + /* + * 000 => mono + * 001 => stereo + * 010 => 3 channel + * ... + * 111 => 8 channel */ - buf->decoder_info[1] = 48000; - buf->decoder_info[2] = 16; - buf->decoder_info[3] = 2; + num_channels = (p[5] & 0x7) + 1; + sample_rate = p[5] & 0x10 ? 96000 : 48000; + switch ((p[5]>>6) & 3) { + case 3: /* illegal, use 16-bits? */ + default: + printf("illegal lpcm sample format (%d), assume 16-bit samples\n", + (p[5]>>6) & 3 ); + case 0: bits_per_sample = 16; break; + case 1: bits_per_sample = 20; break; + case 2: bits_per_sample = 24; break; + } + dynamic_range = p[6]; + + xprintf(VERBOSE|DEMUX, "LPCM audio format: %dkHz, %d bit, %d channel\n", + sample_rate/1000, bits_per_sample, num_channels); + + buf->decoder_info[1] = sample_rate; + buf->decoder_info[2] = bits_per_sample; + buf->decoder_info[3] = num_channels; + + pcm_offset = 7; buf->content = p+pcm_offset; buf->size = packet_len-pcm_offset; |