Mercurial > mplayer.hg
annotate libvo/vo_mpegpes.c @ 26981:f3f553c03044
No need to set LC_ALL=C for individual shell commands,
it is already set from config.mak.
author | diego |
---|---|
date | Sat, 07 Jun 2008 12:01:29 +0000 |
parents | 634dfaa85718 |
children | a50cc6945dfd |
rev | line source |
---|---|
1876 | 1 /* |
2 * Based on: | |
3 * | |
4 * test_av.c - Test program for new API | |
5 * | |
6 * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> | |
7 * & Marcus Metzler <marcus@convergence.de> | |
8 * for convergence integrated media GmbH | |
9 * | |
10 * libav - MPEG-PS multiplexer, part of ffmpeg | |
11 * Copyright Gerard Lantau (see http://ffmpeg.sf.net) | |
12 * | |
13 */ | |
1871 | 14 |
6239 | 15 #include "config.h" |
1871 | 16 #include <stdio.h> |
17 #include <stdlib.h> | |
18 #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
|
19 #include <errno.h> |
1876 | 20 #include <sys/types.h> |
21 #include <sys/stat.h> | |
22 #include <fcntl.h> | |
6239 | 23 #include <unistd.h> |
1876 | 24 |
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
|
25 #include "mp_msg.h" |
8594 | 26 #ifdef HAVE_DVB_HEAD |
27 #define HAVE_DVB 1 | |
28 #endif | |
1876 | 29 #ifdef HAVE_DVB |
8594 | 30 #ifndef HAVE_DVB_HEAD |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
31 #include <sys/poll.h> |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
32 |
1876 | 33 #include <sys/ioctl.h> |
34 #include <stdio.h> | |
35 #include <time.h> | |
36 | |
37 #include <ost/dmx.h> | |
38 #include <ost/frontend.h> | |
39 #include <ost/sec.h> | |
40 #include <ost/video.h> | |
41 #include <ost/audio.h> | |
42 | |
8594 | 43 #else |
44 #define true 1 | |
45 #define false 0 | |
46 #include <sys/poll.h> | |
47 | |
48 #include <sys/ioctl.h> | |
49 #include <stdio.h> | |
50 #include <time.h> | |
51 | |
52 #include <linux/dvb/dmx.h> | |
53 #include <linux/dvb/frontend.h> | |
54 #include <linux/dvb/video.h> | |
55 #include <linux/dvb/audio.h> | |
56 #endif | |
1876 | 57 #endif |
58 | |
1871 | 59 #include "config.h" |
60 #include "video_out.h" | |
61 #include "video_out_internal.h" | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
16171
diff
changeset
|
62 #include "libmpdemux/mpeg_packetizer.h" |
1871 | 63 |
1872 | 64 int vo_mpegpes_fd=-1; |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
19163
diff
changeset
|
65 extern int vo_mpegpes_fd2; |
1872 | 66 |
25216 | 67 static const vo_info_t info = |
1871 | 68 { |
1876 | 69 #ifdef HAVE_DVB |
70 "Mpeg-PES to DVB card", | |
71 #else | |
1871 | 72 "Mpeg-PES file", |
1876 | 73 #endif |
74 "mpegpes", | |
1871 | 75 "A'rpi", |
76 "" | |
77 }; | |
78 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
79 const LIBVO_EXTERN (mpegpes) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7860
diff
changeset
|
80 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
81 static int |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13048
diff
changeset
|
82 config(uint32_t s_width, uint32_t s_height, uint32_t width, uint32_t height, uint32_t flags, char *title, uint32_t format) |
1871 | 83 { |
1876 | 84 #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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 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
|
90 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
|
91 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
|
92 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
|
93 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
|
94 } |
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 #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
|
96 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
|
97 } |
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 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
99 static int preinit(const char *arg){ |
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
|
100 #ifdef HAVE_DVB |
25558
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
101 int card = -1; |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
102 char vo_file[30], ao_file[30], *tmp; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
103 |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
104 if(arg != NULL){ |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
105 if((tmp = strstr(arg, "card=")) != NULL) { |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
106 card = atoi(&tmp[5]); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
107 if((card < 1) || (card > 4)) { |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
108 mp_msg(MSGT_VO, MSGL_ERR, "DVB card number must be between 1 and 4\n"); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
109 return -1; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
110 } |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
111 card--; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
112 arg = NULL; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
113 } |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
114 } |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
115 |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
116 if(!arg){ |
1876 | 117 //|O_NONBLOCK |
25558
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
118 //search the first usable card |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
119 if(card==-1) { |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
120 int n; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
121 for(n=0; n<4; n++) { |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
122 sprintf(vo_file, "/dev/dvb/adapter%d/video0", n); |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
123 if(access(vo_file, F_OK | W_OK)==0) { |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
124 card = n; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
125 break; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
126 } |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
127 } |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
128 } |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
129 if(card==-1) { |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
130 mp_msg(MSGT_VO,MSGL_INFO, "Couldn't find a usable dvb video device, exiting\n"); |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
131 return -1; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
132 } |
8594 | 133 #ifndef HAVE_DVB_HEAD |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
134 mp_msg(MSGT_VO,MSGL_INFO, "Opening /dev/ost/video+audio\n"); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
135 sprintf(vo_file, "/dev/ost/video"); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
136 sprintf(ao_file, "/dev/ost/audio"); |
8594 | 137 #else |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
138 mp_msg(MSGT_VO,MSGL_INFO, "Opening /dev/dvb/adapter%d/video0+audio0\n", card); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
139 sprintf(vo_file, "/dev/dvb/adapter%d/video0", card); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
140 sprintf(ao_file, "/dev/dvb/adapter%d/audio0", card); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
141 #endif |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
142 if((vo_mpegpes_fd = open(vo_file,O_RDWR)) < 0){ |
8594 | 143 perror("DVB VIDEO DEVICE: "); |
144 return -1; | |
145 } | |
1876 | 146 if ( (ioctl(vo_mpegpes_fd,VIDEO_SET_BLANK, false) < 0)){ |
147 perror("DVB VIDEO SET BLANK: "); | |
148 return -1; | |
149 } | |
150 if ( (ioctl(vo_mpegpes_fd,VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY) < 0)){ | |
151 perror("DVB VIDEO SELECT SOURCE: "); | |
152 return -1; | |
153 } | |
154 if ( (ioctl(vo_mpegpes_fd,VIDEO_PLAY) < 0)){ | |
155 perror("DVB VIDEO PLAY: "); | |
156 return -1; | |
157 } | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
158 return 0; |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
159 } |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
160 #endif |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
161 arg = (arg ? arg : "grab.mpg"); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
162 mp_msg(MSGT_VO,MSGL_INFO, "Saving PES stream to %s\n", arg); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
163 vo_mpegpes_fd=open(arg,O_WRONLY|O_CREAT,0666); |
1872 | 164 if(vo_mpegpes_fd<0){ |
165 perror("vo_mpegpes"); | |
166 return -1; | |
167 } | |
1871 | 168 return 0; |
169 } | |
170 | |
171 | |
172 static void draw_osd(void) | |
173 { | |
174 } | |
175 | |
1876 | 176 |
19150 | 177 static int my_write(unsigned char* data,int len){ |
19153 | 178 int orig_len = len; |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
179 #ifdef HAVE_DVB |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
180 #define NFD 2 |
1876 | 181 struct pollfd pfd[NFD]; |
182 | |
183 // printf("write %d bytes \n",len); | |
184 | |
185 pfd[0].fd = vo_mpegpes_fd; | |
186 pfd[0].events = POLLOUT; | |
187 | |
188 pfd[1].fd = vo_mpegpes_fd2; | |
189 pfd[1].events = POLLOUT; | |
190 | |
1872 | 191 while(len>0){ |
1876 | 192 if (poll(pfd,NFD,1)){ |
193 if (pfd[0].revents & POLLOUT){ | |
194 int ret=write(vo_mpegpes_fd,data,len); | |
195 // printf("ret=%d \n",ret); | |
196 if(ret<=0){ | |
197 perror("write"); | |
198 usleep(0); | |
199 } else { | |
200 len-=ret; data+=ret; | |
201 } | |
202 } else usleep(1000); | |
203 } | |
1872 | 204 } |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
205 |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
206 #else |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
207 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
|
208 #endif |
19150 | 209 return orig_len; |
1872 | 210 } |
1871 | 211 |
2706 | 212 void send_pes_packet(unsigned char* data,int len,int id,int timestamp){ |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
16171
diff
changeset
|
213 send_mpeg_pes_packet (data, len, id, timestamp, 1, my_write); |
1876 | 214 } |
215 | |
4299
8e157167cee5
LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents:
2727
diff
changeset
|
216 void send_lpcm_packet(unsigned char* data,int len,int id,unsigned int timestamp,int freq_id){ |
19161
049c74156629
reuse send_mpeg_lpcm_packet() instead of the old packetizer
nicodvb
parents:
19153
diff
changeset
|
217 send_mpeg_lpcm_packet(data, len, id, timestamp, freq_id, my_write); |
2706 | 218 } |
219 | |
220 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
221 static int draw_frame(uint8_t * src[]) |
1871 | 222 { |
1872 | 223 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
|
224 send_pes_packet(p->data,p->size,p->id,(p->timestamp>0)?p->timestamp:vo_pts); // video data |
1871 | 225 return 0; |
226 } | |
227 | |
1935 | 228 static void flip_page (void) |
229 { | |
230 } | |
231 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
232 static int draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x0,int y0) |
1935 | 233 { |
234 return 0; | |
235 } | |
236 | |
237 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
238 static int |
1871 | 239 query_format(uint32_t format) |
240 { | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13048
diff
changeset
|
241 if(format==IMGFMT_MPEGPES) return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_TIMER; |
1871 | 242 return 0; |
243 } | |
244 | |
245 static void | |
246 uninit(void) | |
247 { | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
248 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
|
249 vo_mpegpes_fd2=-1; |
1876 | 250 if(vo_mpegpes_fd>=0){ close(vo_mpegpes_fd);vo_mpegpes_fd=-1;} |
1871 | 251 } |
252 | |
253 | |
254 static void check_events(void) | |
255 { | |
256 } | |
257 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
258 static int control(uint32_t request, void *data, ...) |
4352 | 259 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
260 switch (request) { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
261 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
262 return query_format(*((uint32_t*)data)); |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
263 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
264 return VO_NOTIMPL; |
4352 | 265 } |