changeset 19164:39d60ed7edfe

use mpeg packetizer helpers for sending lpcm packets
author ben
date Sun, 23 Jul 2006 10:10:06 +0000
parents 59c0eee29b5a
children 7e4f5f62703d
files libao2/ao_dxr2.c libvo/vo_dxr2.c
diffstat 2 files changed, 20 insertions(+), 97 deletions(-) [+]
line wrap: on
line diff
--- a/libao2/ao_dxr2.c	Sun Jul 23 09:56:05 2006 +0000
+++ b/libao2/ao_dxr2.c	Sun Jul 23 10:10:06 2006 +0000
@@ -26,6 +26,7 @@
 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 @@
 	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 @@
     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)
--- a/libvo/vo_dxr2.c	Sun Jul 23 09:56:05 2006 +0000
+++ b/libvo/vo_dxr2.c	Sun Jul 23 10:10:06 2006 +0000
@@ -36,7 +36,6 @@
 
 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 @@
   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 @@
     playing = 0;
   }
 
-  last_freq_id = -1;
-
   // Video stream setup
   arg3.arg1 = DXR2_STREAM_VIDEO;
   arg3.arg2 = 0;