summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Hintukainen <phintuka@users.sourceforge.net>2010-01-06 14:38:51 +0200
committerPetri Hintukainen <phintuka@users.sourceforge.net>2010-01-06 14:38:51 +0200
commit87280324dd572b715a47bee75511ef60f687f4f9 (patch)
treead1858ebc0f54eb8bc48d8eb2ff08c7d18a64d93
parent0adb81a5aad4e763c08c0ac1771f8c234ca2ef94 (diff)
downloadxine-lib-87280324dd572b715a47bee75511ef60f687f4f9.tar.gz
xine-lib-87280324dd572b715a47bee75511ef60f687f4f9.tar.bz2
Decode BluRay PCM header
-rw-r--r--src/libxineadec/xine_lpcm_decoder.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/libxineadec/xine_lpcm_decoder.c b/src/libxineadec/xine_lpcm_decoder.c
index 8280af89e..f1cf84480 100644
--- a/src/libxineadec/xine_lpcm_decoder.c
+++ b/src/libxineadec/xine_lpcm_decoder.c
@@ -96,6 +96,31 @@ static void lpcm_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) {
lprintf("lpcm_decoder: config data 0x%x\n", buf->decoder_info[2]);
+ /* BluRay PCM header is 4 bytes */
+ if (buf->decoder_info[2] & 0xffffff00) {
+ static const uint8_t channels[16] = {0, 1, 0, 2, 3, 3, 4, 4, 5, 6, 7, 8, 0, 0, 0, 0};
+
+ num_channels = channels[(buf->decoder_info[2] >> (16+4)) & 0x0f];
+ switch ((buf->decoder_info[2] >> (24+6)) & 0x03) {
+ case 1: bits_per_sample = 16; break;
+ case 2: bits_per_sample = 20; break;
+ case 3: bits_per_sample = 24; break;
+ default: bits_per_sample = 0; break;
+ }
+ switch ((buf->decoder_info[2] >> 16) & 0x0f) {
+ case 1: sample_rate = 48000; break;
+ case 4: sample_rate = 96000; break;
+ case 5: sample_rate = 192000; break;
+ default: sample_rate = 0; break;
+ }
+
+ if (!num_channels || !sample_rate || !bits_per_sample)
+ xine_log (this->stream->xine, XINE_LOG_MSG,
+ "lpcm_decoder: unsupported BluRay PCM format: 0x%08x\n", buf->decoder_info[2]);
+
+ } else {
+
+ /* MPEG2/DVD PCM header is one byte */
num_channels = (buf->decoder_info[2] & 0x7) + 1;
switch ((buf->decoder_info[2]>>4) & 3) {
case 0: sample_rate = 48000; break;
@@ -108,6 +133,7 @@ static void lpcm_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) {
case 1: bits_per_sample = 20; break;
case 2: bits_per_sample = 24; break;
}
+ }
if( this->bits_per_sample != bits_per_sample ||
this->number_of_channels != num_channels ||