summaryrefslogtreecommitdiffstats
path: root/libvo/vo_mpegpes.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-22 02:14:40 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-22 02:14:40 +0000
commit35b41e392024332c0e5640900a168328092c5285 (patch)
treeeb639a127764cfeaabba82df4ad49a0935e7b895 /libvo/vo_mpegpes.c
parentec6bacbca35c3b8d45ae86cd8dfb89fd1c591652 (diff)
downloadmpv-35b41e392024332c0e5640900a168328092c5285.tar.bz2
mpv-35b41e392024332c0e5640900a168328092c5285.tar.xz
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4300 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/vo_mpegpes.c')
-rw-r--r--libvo/vo_mpegpes.c73
1 files changed, 44 insertions, 29 deletions
diff --git a/libvo/vo_mpegpes.c b/libvo/vo_mpegpes.c
index 4de074782b..90cf3d0d1b 100644
--- a/libvo/vo_mpegpes.c
+++ b/libvo/vo_mpegpes.c
@@ -163,7 +163,7 @@ if(format==IMGFMT_YV12){
codec_context.frame_rate=25*FRAME_RATE_BASE; // !!!!!
codec_context.gop_size=0; // I frames only
codec_context.flags=CODEC_FLAG_QSCALE;
- codec_context.quality=1; // quality! 1..31 (1=best,slowest)
+ codec_context.quality=3; // quality! 1..31 (1=best,slowest)
#if 0
codec_context.width=width;
@@ -328,8 +328,9 @@ void send_pes_packet(unsigned char* data,int len,int id,int timestamp){
}
-void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp){
- int x;
+void send_lpcm_packet(unsigned char* data,int len,int id,unsigned int timestamp,int freq_id){
+
+ int ptslen=timestamp?5:0;
pes_header[0]=pes_header[1]=0;
pes_header[2]=1; pes_header[3]=0xBD;
@@ -341,19 +342,21 @@ void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp){
if(payload_size>len) payload_size=len;
payload_size&=(~3); // align!
- payload_size+=20; // PTS+headers
-
//if(6+payload_size>PES_MAX_SIZE) payload_size=PES_MAX_SIZE-6;
- // construct PES header: (code from ffmpeg's libav)
- // startcode:
// packetsize:
- pes_header[4]=(payload_size)>>8;
- pes_header[5]=(payload_size)&255;
+ pes_header[4]=(payload_size+3+ptslen+7)>>8;
+ pes_header[5]=(payload_size+3+ptslen+7)&255;
+
// stuffing:
pes_header[6]=0x81;
pes_header[7]=0x80;
- pes_header[8]=10; // hdrlen
+
+ // hdrlen:
+ pes_header[8]=ptslen;
+
+ if(ptslen){
+ int x;
// presentation time stamp:
x=(0x02 << 4) | (((timestamp >> 30) & 0x07) << 1) | 1;
pes_header[9]=x;
@@ -361,26 +364,38 @@ void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp){
pes_header[10]=x>>8; pes_header[11]=x&255;
x=((((timestamp) & 0x7fff) << 1) | 1);
pes_header[12]=x>>8; pes_header[13]=x&255;
+ }
- pes_header[14]=
- pes_header[15]=
- pes_header[16]=
- pes_header[17]=
- pes_header[18]=0xFF; // stuffing
-
- pes_header[19]=id;
-
- pes_header[20]=0x07; // dunnowhat
- pes_header[21]=0x00;
- pes_header[22]=0x04;
- pes_header[23]=0x0C;
-
- pes_header[24]=0x01; // LPCM id
- pes_header[25]=0x80;
-
- payload_size-=20;
- memcpy(&pes_header[6+20],data,payload_size);
- my_write(pes_header,6+20+payload_size);
+// ============ LPCM header: (7 bytes) =================
+// Info by mocm@convergence.de
+
+// ID:
+ pes_header[ptslen+9]=id;
+
+// number of frames:
+ pes_header[ptslen+10]=0x07;
+
+// first acces unit pointer, i.e. start of audio frame:
+ pes_header[ptslen+11]=0x00;
+ pes_header[ptslen+12]=0x04;
+
+// audio emphasis on-off 1 bit
+// audio mute on-off 1 bit
+// reserved 1 bit
+// audio frame number 5 bit
+ pes_header[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
+ pes_header[ptslen+14]=1|(freq_id<<4);
+
+// dynamic range control (0x80 if off)
+ pes_header[ptslen+15]=0x80;
+
+ memcpy(&pes_header[6+3+ptslen+7],data,payload_size);
+ my_write(pes_header,6+3+ptslen+7+payload_size);
len-=payload_size; data+=payload_size;
if(len<=0) break;