[Mplayer-cvslog] CVS: main/libmpcodecs ad_dvdpcm.c,1.6,1.7

Reimar Döffinger CVS syncmail at mplayerhq.hu
Sat Oct 9 22:04:29 CEST 2004


CVS change done by Reimar Döffinger CVS

Update of /cvsroot/mplayer/main/libmpcodecs
In directory mail:/var2/tmp/cvs-serv30160/libmpcodecs

Modified Files:
	ad_dvdpcm.c 
Log Message:
Support for 24 bit and 20 bit LPCM (simple and slow :-( )


Index: ad_dvdpcm.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/ad_dvdpcm.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ad_dvdpcm.c	3 Sep 2004 10:50:03 -0000	1.6
+++ ad_dvdpcm.c	9 Oct 2004 20:04:26 -0000	1.7
@@ -3,6 +3,8 @@
 #include <unistd.h>
 
 #include "config.h"
+#include "mp_msg.h"
+#include "help_mp.h"
 #include "ad_internal.h"
 #include "../libaf/af_format.h"
 
@@ -20,6 +22,7 @@
 static int init(sh_audio_t *sh)
 {
 /* DVD PCM Audio:*/
+    sh->i_bps = 0;
     if(sh->codecdata_len==3){
 	// we have LPCM header:
 	unsigned char h=sh->codecdata[1];
@@ -35,6 +38,9 @@
 	    sh->sample_format = AFMT_S16_BE;
 	    sh->samplesize = 2;
 	    break;
+	  case 1:
+	    mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_SamplesWanted);
+	    sh->i_bps = sh->channels * sh->samplerate * 5 / 2;
 	  case 2: 
 	    sh->sample_format = AFMT_AF_FLAGS | AF_FORMAT_I |
 	                         AF_FORMAT_BE | AF_FORMAT_US;
@@ -51,6 +57,7 @@
 	sh->sample_format = AFMT_S16_BE;
 	sh->samplesize = 2;
     }
+    if (!sh->i_bps)
     sh->i_bps = sh->samplesize * sh->channels * sh->samplerate;
     return 1;
 }
@@ -82,6 +89,59 @@
 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
 {
   int j,len;
+  if (sh_audio->samplesize == 3) {
+    if (((sh_audio->codecdata[1] >> 6) & 3) == 1) {
+      // 20 bit
+      // not sure if the "& 0xf0" and "<< 4" are the right way around
+      // can somebody clarify?
+      for (j = 0; j < minlen; j += 12) {
+        char tmp[10];
+        len = demux_read_data(sh_audio->ds, tmp, 10);
+        if (len < 10) break;
+        // first sample
+        buf[j + 0] = tmp[0];
+        buf[j + 1] = tmp[1];
+        buf[j + 2] = tmp[8] & 0xf0;
+        // second sample
+        buf[j + 3] = tmp[2];
+        buf[j + 4] = tmp[3];
+        buf[j + 5] = tmp[8] << 4;
+        // third sample
+        buf[j + 6] = tmp[4];
+        buf[j + 7] = tmp[5];
+        buf[j + 8] = tmp[9] & 0xf0;
+        // fourth sample
+        buf[j + 9] = tmp[6];
+        buf[j + 10] = tmp[7];
+        buf[j + 11] = tmp[9] << 4;
+      }
+      len = j;
+    } else {
+      // 24 bit
+      for (j = 0; j < minlen; j += 12) {
+        char tmp[12];
+        len = demux_read_data(sh_audio->ds, tmp, 12);
+        if (len < 12) break;
+        // first sample
+        buf[j + 0] = tmp[0];
+        buf[j + 1] = tmp[1];
+        buf[j + 2] = tmp[8];
+        // second sample
+        buf[j + 3] = tmp[2];
+        buf[j + 4] = tmp[3];
+        buf[j + 5] = tmp[9];
+        // third sample
+        buf[j + 6] = tmp[4];
+        buf[j + 7] = tmp[5];
+        buf[j + 8] = tmp[10];
+        // fourth sample
+        buf[j + 9] = tmp[6];
+        buf[j + 10] = tmp[7];
+        buf[j + 11] = tmp[11];
+      }
+      len = j;
+    }
+  } else 
   len=demux_read_data(sh_audio->ds,buf,(minlen+3)&(~3));
   return len;
 }




More information about the MPlayer-cvslog mailing list