changeset 3305:129d36178a10 libavformat

support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
author bcoudurier
date Wed, 21 May 2008 02:26:42 +0000
parents b255db01458d
children 4d73d137f64e
files mpeg.c
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mpeg.c	Tue May 20 23:39:07 2008 +0000
+++ b/mpeg.c	Wed May 21 02:26:42 2008 +0000
@@ -474,7 +474,8 @@
         codec_id = CODEC_ID_DTS;
     } else if (startcode >= 0xa0 && startcode <= 0xaf) {
         type = CODEC_TYPE_AUDIO;
-        codec_id = CODEC_ID_PCM_S16BE;
+        /* 16 bit form will be handled as CODEC_ID_PCM_S16BE */
+        codec_id = CODEC_ID_PCM_DVD;
     } else if (startcode >= 0xb0 && startcode <= 0xbf) {
         type = CODEC_TYPE_AUDIO;
         codec_id = CODEC_ID_MLP;
@@ -519,7 +520,14 @@
         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;
+        st->codec->bits_per_sample = 16 + ((b1 >> 6) & 3) * 4;
+        st->codec->bit_rate = st->codec->channels *
+                              st->codec->sample_rate *
+                              st->codec->bits_per_sample;
+        if (st->codec->bits_per_sample == 16)
+            st->codec->codec_id = CODEC_ID_PCM_S16BE;
+        else if (st->codec->bits_per_sample == 28)
+            return AVERROR(EINVAL);
     }
     av_new_packet(pkt, len);
     get_buffer(s->pb, pkt->data, pkt->size);