0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 12:02:23 +02:00

Support for 24 bit and 20 bit LPCM (simple and slow :-( )

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@13596 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2004-10-09 20:04:27 +00:00
parent fd60a3de4b
commit 018dcd7451
2 changed files with 62 additions and 0 deletions

View File

@ -53,6 +53,8 @@ static char help_text[]=
"\n";
#endif
#define MSGTR_SamplesWanted "Samples of this format are needed to improve support. Please contact the developers.\n"
// ========================= MPlayer messages ===========================
// mplayer.c:

View File

@ -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 @@ LIBAD_EXTERN(dvdpcm)
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 @@ static int init(sh_audio_t *sh)
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 @@ static int init(sh_audio_t *sh)
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 control(sh_audio_t *sh,int cmd,void* arg, ...)
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;
}