Mercurial > mplayer.hg
annotate libvo/vo_mpegpes.c @ 9278:caea8ed36b48
The reason why mplayer crashes (in some cases) when using x11
output and -wid (>0) parameter is this:
Mplayer by default creates a colormap using DirectColor visual. If the
window given to mplayer uses TrueColor visual there will be an error
when mplayer sets the colormap for the window. This patch
modifies mplayer to use TrueColor visual if the window given to mplayer
uses TrueColor. Another solution is to make sure that the window given to
mplayer is created using DirectColor visual if it is supported by the
display.
Jouni Tulkki <jitulkki@cc.hut.fi>
author | arpi |
---|---|
date | Tue, 04 Feb 2003 18:31:44 +0000 |
parents | 0694a2fba3dd |
children | 2f150c190f7a |
rev | line source |
---|---|
5059 | 1 // Don't change for DVB card, it must be 2048 |
1876 | 2 #define PES_MAX_SIZE 2048 |
5059 | 3 |
1876 | 4 /* |
5 * Based on: | |
6 * | |
7 * test_av.c - Test program for new API | |
8 * | |
9 * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> | |
10 * & Marcus Metzler <marcus@convergence.de> | |
11 * for convergence integrated media GmbH | |
12 * | |
13 * libav - MPEG-PS multiplexer, part of ffmpeg | |
14 * Copyright Gerard Lantau (see http://ffmpeg.sf.net) | |
15 * | |
16 */ | |
1871 | 17 |
6239 | 18 #include "config.h" |
1871 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4596
diff
changeset
|
22 #include <errno.h> |
1876 | 23 #include <sys/types.h> |
24 #include <sys/stat.h> | |
25 #include <fcntl.h> | |
6239 | 26 #include <unistd.h> |
1876 | 27 |
5877
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
28 #include "mp_msg.h" |
8594 | 29 #ifdef HAVE_DVB_HEAD |
30 #define HAVE_DVB 1 | |
31 #endif | |
1876 | 32 #ifdef HAVE_DVB |
8594 | 33 #ifndef HAVE_DVB_HEAD |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
34 #include <sys/poll.h> |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
35 |
1876 | 36 #include <sys/ioctl.h> |
37 #include <stdio.h> | |
38 #include <time.h> | |
39 | |
40 #include <ost/dmx.h> | |
41 #include <ost/frontend.h> | |
42 #include <ost/sec.h> | |
43 #include <ost/video.h> | |
44 #include <ost/audio.h> | |
45 | |
8594 | 46 #else |
47 #define true 1 | |
48 #define false 0 | |
49 #include <sys/poll.h> | |
50 | |
51 #include <sys/ioctl.h> | |
52 #include <stdio.h> | |
53 #include <time.h> | |
54 | |
55 #include <linux/dvb/dmx.h> | |
56 #include <linux/dvb/frontend.h> | |
57 #include <linux/dvb/video.h> | |
58 #include <linux/dvb/audio.h> | |
59 #endif | |
1876 | 60 #endif |
61 | |
1871 | 62 #include "config.h" |
63 #include "video_out.h" | |
64 #include "video_out_internal.h" | |
65 | |
1872 | 66 int vo_mpegpes_fd=-1; |
1876 | 67 int vo_mpegpes_fd2=-1; |
1872 | 68 |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7860
diff
changeset
|
69 static vo_info_t info = |
1871 | 70 { |
1876 | 71 #ifdef HAVE_DVB |
72 "Mpeg-PES to DVB card", | |
73 #else | |
1871 | 74 "Mpeg-PES file", |
1876 | 75 #endif |
76 "mpegpes", | |
1871 | 77 "A'rpi", |
78 "" | |
79 }; | |
80 | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7860
diff
changeset
|
81 LIBVO_EXTERN (mpegpes) |
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7860
diff
changeset
|
82 |
1871 | 83 static uint32_t |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
6273
diff
changeset
|
84 config(uint32_t s_width, uint32_t s_height, uint32_t width, uint32_t height, uint32_t fullscreen, char *title, uint32_t format) |
1871 | 85 { |
1876 | 86 #ifdef HAVE_DVB |
5877
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
87 switch(s_height){ |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
88 case 288: |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
89 case 576: |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
90 case 240: |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
91 case 480: |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
92 break; |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
93 default: |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
94 mp_msg(MSGT_VO,MSGL_ERR,"DVB: height=%d not supported (try 240/480 (ntsc) or 288/576 (pal)\n",s_height); |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
95 return -1; |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
96 } |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
97 #endif |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
98 return 0; |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
99 } |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
100 |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
101 static uint32_t preinit(const char *arg){ |
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
102 #ifdef HAVE_DVB |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
103 if(!arg){ |
1876 | 104 //|O_NONBLOCK |
8594 | 105 #ifndef HAVE_DVB_HEAD |
8917 | 106 printf("Opening /dev/ost/video+audio\n"); |
1876 | 107 if((vo_mpegpes_fd = open("/dev/ost/video",O_RDWR)) < 0){ |
108 perror("DVB VIDEO DEVICE: "); | |
109 return -1; | |
110 } | |
111 if((vo_mpegpes_fd2 = open("/dev/ost/audio",O_RDWR|O_NONBLOCK)) < 0){ | |
112 perror("DVB AUDIO DEVICE: "); | |
113 return -1; | |
114 } | |
8594 | 115 #else |
8917 | 116 printf("Opening /dev/dvb/adapter0/video0+audio0\n"); |
8594 | 117 if((vo_mpegpes_fd = open("/dev/dvb/adapter0/video0",O_RDWR)) < 0){ |
118 perror("DVB VIDEO DEVICE: "); | |
119 return -1; | |
120 } | |
121 if((vo_mpegpes_fd2 = open("/dev/dvb/adapter0/audio0",O_RDWR|O_NONBLOCK)) < 0){ | |
122 perror("DVB AUDIO DEVICE: "); | |
123 return -1; | |
124 } | |
125 #endif | |
1876 | 126 if ( (ioctl(vo_mpegpes_fd,VIDEO_SET_BLANK, false) < 0)){ |
127 perror("DVB VIDEO SET BLANK: "); | |
128 return -1; | |
129 } | |
130 if ( (ioctl(vo_mpegpes_fd,VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY) < 0)){ | |
131 perror("DVB VIDEO SELECT SOURCE: "); | |
132 return -1; | |
133 } | |
134 #if 1 | |
135 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY) < 0)){ | |
136 perror("DVB AUDIO SELECT SOURCE: "); | |
137 return -1; | |
138 } | |
139 if ( (ioctl(vo_mpegpes_fd2,AUDIO_PLAY) < 0)){ | |
140 perror("DVB AUDIO PLAY: "); | |
141 return -1; | |
142 } | |
143 #else | |
144 if ( (ioctl(vo_mpegpes_fd2,AUDIO_STOP,0) < 0)){ | |
145 perror("DVB AUDIO STOP: "); | |
146 return -1; | |
147 } | |
148 #endif | |
149 if ( (ioctl(vo_mpegpes_fd,VIDEO_PLAY) < 0)){ | |
150 perror("DVB VIDEO PLAY: "); | |
151 return -1; | |
152 } | |
7860 | 153 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_AV_SYNC, true) < 0)){ |
1876 | 154 perror("DVB AUDIO SET AV SYNC: "); |
155 return -1; | |
156 } | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
157 // if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MUTE, false) < 0)){ |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
158 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MUTE, true) < 0)){ |
1876 | 159 perror("DVB AUDIO SET MUTE: "); |
160 return -1; | |
161 } | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
162 return 0; |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
163 } |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
164 #endif |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
165 vo_mpegpes_fd=open(arg ? arg : "grab.mpg",O_WRONLY|O_CREAT,0666); |
1872 | 166 if(vo_mpegpes_fd<0){ |
167 perror("vo_mpegpes"); | |
168 return -1; | |
169 } | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
170 vo_mpegpes_fd2=vo_mpegpes_fd; |
1871 | 171 return 0; |
172 } | |
173 | |
174 | |
175 static void draw_osd(void) | |
176 { | |
177 } | |
178 | |
1876 | 179 |
1872 | 180 static void my_write(unsigned char* data,int len){ |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
181 #ifdef HAVE_DVB |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
182 #define NFD 2 |
1876 | 183 struct pollfd pfd[NFD]; |
184 | |
185 // printf("write %d bytes \n",len); | |
186 | |
187 pfd[0].fd = vo_mpegpes_fd; | |
188 pfd[0].events = POLLOUT; | |
189 | |
190 pfd[1].fd = vo_mpegpes_fd2; | |
191 pfd[1].events = POLLOUT; | |
192 | |
1872 | 193 while(len>0){ |
1876 | 194 if (poll(pfd,NFD,1)){ |
195 if (pfd[0].revents & POLLOUT){ | |
196 int ret=write(vo_mpegpes_fd,data,len); | |
197 // printf("ret=%d \n",ret); | |
198 if(ret<=0){ | |
199 perror("write"); | |
200 usleep(0); | |
201 } else { | |
202 len-=ret; data+=ret; | |
203 } | |
204 } else usleep(1000); | |
205 } | |
1872 | 206 } |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
207 |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
208 #else |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
209 write(vo_mpegpes_fd,data,len); // write to file |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
210 #endif |
1872 | 211 } |
1871 | 212 |
1876 | 213 static unsigned char pes_header[PES_MAX_SIZE]; |
214 | |
2706 | 215 void send_pes_packet(unsigned char* data,int len,int id,int timestamp){ |
4306 | 216 int ptslen=timestamp?5:1; |
1876 | 217 |
4306 | 218 // startcode: |
1876 | 219 pes_header[0]=pes_header[1]=0; |
220 pes_header[2]=id>>8; pes_header[3]=id&255; | |
221 | |
4306 | 222 while(len>0){ |
223 int payload_size=len; // data + PTS | |
224 if(6+ptslen+payload_size>PES_MAX_SIZE) payload_size=PES_MAX_SIZE-(6+ptslen); | |
1876 | 225 |
226 // construct PES header: (code from ffmpeg's libav) | |
227 // packetsize: | |
4306 | 228 pes_header[4]=(ptslen+payload_size)>>8; |
229 pes_header[5]=(ptslen+payload_size)&255; | |
230 | |
231 if(ptslen==5){ | |
232 int x; | |
1876 | 233 // presentation time stamp: |
234 x=(0x02 << 4) | (((timestamp >> 30) & 0x07) << 1) | 1; | |
235 pes_header[6]=x; | |
236 x=((((timestamp >> 15) & 0x7fff) << 1) | 1); | |
237 pes_header[7]=x>>8; pes_header[8]=x&255; | |
238 x=((((timestamp) & 0x7fff) << 1) | 1); | |
239 pes_header[9]=x>>8; pes_header[10]=x&255; | |
4306 | 240 } else { |
241 // stuffing and header bits: | |
242 pes_header[6]=0x0f; | |
243 } | |
244 | |
245 memcpy(&pes_header[6+ptslen],data,payload_size); | |
246 my_write(pes_header,6+ptslen+payload_size); | |
1876 | 247 |
248 len-=payload_size; data+=payload_size; | |
4306 | 249 ptslen=1; // store PTS only once, at first packet! |
1876 | 250 } |
251 | |
252 // printf("PES: draw frame! pts=%d size=%d \n",timestamp,len); | |
253 | |
254 } | |
255 | |
4299
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
256 void send_lpcm_packet(unsigned char* data,int len,int id,unsigned int timestamp,int freq_id){ |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
257 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
258 int ptslen=timestamp?5:0; |
2706 | 259 |
4306 | 260 // startcode: |
2706 | 261 pes_header[0]=pes_header[1]=0; |
262 pes_header[2]=1; pes_header[3]=0xBD; | |
263 | |
264 while(len>=4){ | |
265 int payload_size; | |
266 | |
267 payload_size=PES_MAX_SIZE-6-20; // max possible data len | |
268 if(payload_size>len) payload_size=len; | |
269 payload_size&=(~3); // align! | |
270 | |
271 //if(6+payload_size>PES_MAX_SIZE) payload_size=PES_MAX_SIZE-6; | |
272 | |
273 // packetsize: | |
4299
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
274 pes_header[4]=(payload_size+3+ptslen+7)>>8; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
275 pes_header[5]=(payload_size+3+ptslen+7)&255; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
276 |
2706 | 277 // stuffing: |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
278 // TTCCxxxx CC=css TT=type: 1=STD 0=mpeg1 2=vob |
2706 | 279 pes_header[6]=0x81; |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
280 |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
281 // FFxxxxxx FF=pts flags=2 vs 0 |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
282 pes_header[7]=ptslen ? 0x80 : 0; |
4299
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
283 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
284 // hdrlen: |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
285 pes_header[8]=ptslen; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
286 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
287 if(ptslen){ |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
288 int x; |
2706 | 289 // presentation time stamp: |
290 x=(0x02 << 4) | (((timestamp >> 30) & 0x07) << 1) | 1; | |
291 pes_header[9]=x; | |
292 x=((((timestamp >> 15) & 0x7fff) << 1) | 1); | |
293 pes_header[10]=x>>8; pes_header[11]=x&255; | |
294 x=((((timestamp) & 0x7fff) << 1) | 1); | |
295 pes_header[12]=x>>8; pes_header[13]=x&255; | |
4299
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
296 } |
2706 | 297 |
4299
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
298 // ============ LPCM header: (7 bytes) ================= |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
299 // Info by mocm@convergence.de |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
300 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
301 // ID: |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
302 pes_header[ptslen+9]=id; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
303 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
304 // number of frames: |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
305 pes_header[ptslen+10]=0x07; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
306 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
307 // first acces unit pointer, i.e. start of audio frame: |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
308 pes_header[ptslen+11]=0x00; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
309 pes_header[ptslen+12]=0x04; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
310 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
311 // audio emphasis on-off 1 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
312 // audio mute on-off 1 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
313 // reserved 1 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
314 // audio frame number 5 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
315 pes_header[ptslen+13]=0x0C; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
316 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
317 // quantization word length 2 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
318 // audio sampling frequency (48khz = 0, 96khz = 1) 2 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
319 // reserved 1 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
320 // number of audio channels - 1 (e.g. stereo = 1) 3 bit |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
321 pes_header[ptslen+14]=1|(freq_id<<4); |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
322 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
323 // dynamic range control (0x80 if off) |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
324 pes_header[ptslen+15]=0x80; |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
325 |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
326 memcpy(&pes_header[6+3+ptslen+7],data,payload_size); |
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
327 my_write(pes_header,6+3+ptslen+7+payload_size); |
2706 | 328 |
329 len-=payload_size; data+=payload_size; | |
4306 | 330 ptslen=0; // store PTS only once, at first packet! |
2706 | 331 } |
332 | |
333 // printf("PES: draw frame! pts=%d size=%d \n",timestamp,len); | |
334 | |
335 } | |
336 | |
337 | |
1871 | 338 static uint32_t draw_frame(uint8_t * src[]) |
339 { | |
1872 | 340 vo_mpegpes_t *p=(vo_mpegpes_t *)src[0]; |
5877
93de400ad48e
libfame code removed (use -vop fame/-vop lavc), init code moved to preinit, height checks added to config()
arpi
parents:
5844
diff
changeset
|
341 send_pes_packet(p->data,p->size,p->id,(p->timestamp>0)?p->timestamp:vo_pts); // video data |
1871 | 342 return 0; |
343 } | |
344 | |
1935 | 345 static void flip_page (void) |
346 { | |
347 } | |
348 | |
349 static uint32_t draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x0,int y0) | |
350 { | |
351 return 0; | |
352 } | |
353 | |
354 | |
1871 | 355 static uint32_t |
356 query_format(uint32_t format) | |
357 { | |
5566 | 358 if(format==IMGFMT_MPEGPES) return 3|VFCAP_TIMER; |
1871 | 359 return 0; |
360 } | |
361 | |
362 static void | |
363 uninit(void) | |
364 { | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
365 if(vo_mpegpes_fd2>=0 && vo_mpegpes_fd2!=vo_mpegpes_fd) close(vo_mpegpes_fd2); |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
366 vo_mpegpes_fd2=-1; |
1876 | 367 if(vo_mpegpes_fd>=0){ close(vo_mpegpes_fd);vo_mpegpes_fd=-1;} |
1871 | 368 } |
369 | |
370 | |
371 static void check_events(void) | |
372 { | |
373 } | |
374 | |
4596 | 375 static uint32_t control(uint32_t request, void *data, ...) |
4352 | 376 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
377 switch (request) { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
378 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
379 return query_format(*((uint32_t*)data)); |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
380 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
381 return VO_NOTIMPL; |
4352 | 382 } |