[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