summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libao2/ao_dxr2.c21
-rw-r--r--libvo/vo_dxr2.c96
2 files changed, 20 insertions, 97 deletions
diff --git a/libao2/ao_dxr2.c b/libao2/ao_dxr2.c
index 6d2ad7cbd3..013173e37a 100644
--- a/libao2/ao_dxr2.c
+++ b/libao2/ao_dxr2.c
@@ -26,6 +26,7 @@ static ao_info_t info =
LIBAO_EXTERN(dxr2)
static int volume=19;
+static int last_freq_id = -1;
extern int dxr2_fd;
// to set/get/query special features/parameters
@@ -72,6 +73,8 @@ static int init(int rate,int channels,int format,int flags){
if(dxr2_fd <= 0)
return 0;
+ last_freq_id = -1;
+
ao_data.outburst=2048;
ao_data.samplerate=rate;
ao_data.channels=channels;
@@ -151,12 +154,28 @@ static int get_space(void){
return y;
}
+static void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,unsigned int timestamp,int freq_id)
+{
+ extern int write_dxr2(unsigned char *data, int len);
+
+ if(dxr2_fd < 0) {
+ mp_msg(MSGT_AO,MSGL_ERR,"DXR2 fd is not valid\n");
+ return;
+ }
+
+ if(last_freq_id != freq_id) {
+ ioctl(dxr2_fd, DXR2_IOC_SET_AUDIO_SAMPLE_FREQUENCY, &freq_id);
+ last_freq_id = freq_id;
+ }
+
+ send_mpeg_lpcm_packet (data, len, id, timestamp, freq_id, write_dxr2);
+}
+
// plays 'len' bytes of 'data'
// it should round it down to outburst*n
// return: number of bytes played
static int play(void* data,int len,int flags){
extern int write_dxr2(unsigned char *data, int len);
- extern void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id);
// MPEG and AC3 don't work :-(
if(ao_data.format==AF_FORMAT_MPEG2)
diff --git a/libvo/vo_dxr2.c b/libvo/vo_dxr2.c
index a8f147a4aa..f43ed25f6c 100644
--- a/libvo/vo_dxr2.c
+++ b/libvo/vo_dxr2.c
@@ -36,7 +36,6 @@ int dxr2_fd = -1;
static int movie_w,movie_h;
static int playing = 0;
-static int last_freq_id = -1;
// vo device used to blank the screen for the overlay init
static vo_functions_t* sub_vo = NULL;
@@ -218,99 +217,6 @@ static void dxr2_send_eof(void)
write_dxr2(mpg_eof, sizeof(mpg_eof));
}
-void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,unsigned int timestamp,int freq_id)
-{
- int arg;
- int ptslen=5;
-
- if(dxr2_fd < 0) {
- mp_msg(MSGT_VO,MSGL_ERR,"DXR2 fd is not valid\n");
- return;
- }
-
- if(last_freq_id != freq_id) {
- ioctl(dxr2_fd, DXR2_IOC_SET_AUDIO_SAMPLE_FREQUENCY, &freq_id);
- last_freq_id = freq_id;
- }
-
- if (((int) timestamp)<0)
- timestamp=0;
-
- mp_msg(MSGT_VO,MSGL_DBG2,"dxr2_send_lpcm_packet(timestamp=%d)\n", timestamp);
- // startcode:
- pack[0]=pack[1]=0;pack[2]=0x01;
-
- // stream id
- pack[3]=0xBD;
-
- while(len>=4){
- int payload_size;
-
- payload_size=PACK_MAX_SIZE-6-3-ptslen-7; // max possible data len
- if(payload_size>len) payload_size=len;
- payload_size&=(~3); // align!
-
- // packetsize:
- pack[4]=(payload_size+3+ptslen+7)>>8;
- pack[5]=(payload_size+3+ptslen+7)&255;
-
- // stuffing:
- pack[6]=0x81;
- // pack[7]=0x00; //0x80
-
- // hdrlen:
- pack[8]=ptslen;
-
- if(ptslen){
- int x;
- pack[7]=0x80;
- // presentation time stamp:
- x=(0x02 << 4) | (((timestamp >> 30) & 0x07) << 1) | 1;
- pack[9]=x;
- x=((((timestamp >> 15) & 0x7fff) << 1) | 1);
- pack[10]=x>>8; pack[11]=x&255;
- x=((((timestamp) & 0x7fff) << 1) | 1);
- pack[12]=x>>8; pack[13]=x&255;
- } else {
- pack[7]=0x00;
- }
-
- // ============ LPCM header: (7 bytes) =================
- // Info by mocm@convergence.de
-
- // ID:
- pack[ptslen+9]=id;
-
- // number of frames:
- pack[ptslen+10]=0x07;
-
- // first acces unit pointer, i.e. start of audio frame:
- pack[ptslen+11]=0x00;
- pack[ptslen+12]=0x04;
-
- // audio emphasis on-off 1 bit
- // audio mute on-off 1 bit
- // reserved 1 bit
- // audio frame number 5 bit
- pack[ptslen+13]=0x0C;
-
- // quantization word length 2 bit
- // audio sampling frequency (48khz = 0, 96khz = 1) 2 bit
- // reserved 1 bit
- // number of audio channels - 1 (e.g. stereo = 1) 3 bit
- pack[ptslen+14]=1;
-
- // dynamic range control (0x80 if off)
- pack[ptslen+15]=0x80;
-
- write_dxr2(pack, 6+3+ptslen+7);
- write_dxr2(data, payload_size);
-
- len-=payload_size; data+=payload_size;
- timestamp+=90000/4*payload_size/48000;
- }
-}
-
void dxr2_send_sub_packet(unsigned char* data,int len,int id,unsigned int timestamp) {
int ptslen=5;
@@ -613,8 +519,6 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t width, uint32_t
playing = 0;
}
- last_freq_id = -1;
-
// Video stream setup
arg3.arg1 = DXR2_STREAM_VIDEO;
arg3.arg2 = 0;