Mercurial > mplayer.hg
annotate libvo/vo_mpegpes.c @ 32621:b6636da71bea
len < 8 is also invalid for 64-bit codec chunk size.
Previous code could cause hang.
author | reimar |
---|---|
date | Sun, 12 Dec 2010 16:50:13 +0000 |
parents | acb0f1b02040 |
children | ddb45e9443ec |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
1 /* |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
2 * based on: test_av.c - test program for new API |
1876 | 3 * |
4 * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> | |
5 * & Marcus Metzler <marcus@convergence.de> | |
6 * for convergence integrated media GmbH | |
7 * | |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
8 * MPEG-PS multiplexer, part of FFmpeg |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
9 * Copyright Gerard Lantau (see http://ffmpeg.org) |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
10 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
11 * This file is part of MPlayer. |
1876 | 12 * |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
13 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
14 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
15 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
16 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
17 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
18 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
21 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
22 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
23 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
24 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27431
diff
changeset
|
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
1876 | 26 */ |
1871 | 27 |
6239 | 28 #include "config.h" |
1871 | 29 #include <stdio.h> |
30 #include <stdlib.h> | |
31 #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
|
32 #include <errno.h> |
1876 | 33 #include <sys/types.h> |
34 #include <sys/stat.h> | |
35 #include <fcntl.h> | |
6239 | 36 #include <unistd.h> |
1876 | 37 |
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
|
38 #include "mp_msg.h" |
27369
8598536ca4f5
Set HAVE_DVB in configure when HAVE_DVB_HEAD is defined
diego
parents:
27368
diff
changeset
|
39 |
27430
8bc08d1b115d
100l: Rename missed preprocessor directives from a HAVE_ prefix to CONFIG_.
diego
parents:
27369
diff
changeset
|
40 #ifdef CONFIG_DVB |
8594 | 41 #define true 1 |
42 #define false 0 | |
27431
bb738b9ea7c4
Use '#include <poll.h>' instead of '#include <sys/poll.h>'.
diego
parents:
27430
diff
changeset
|
43 #include <poll.h> |
8594 | 44 |
45 #include <sys/ioctl.h> | |
46 #include <stdio.h> | |
47 #include <time.h> | |
48 | |
49 #include <linux/dvb/dmx.h> | |
50 #include <linux/dvb/frontend.h> | |
51 #include <linux/dvb/video.h> | |
52 #include <linux/dvb/audio.h> | |
53 #endif | |
1876 | 54 |
1871 | 55 #include "config.h" |
56 #include "video_out.h" | |
57 #include "video_out_internal.h" | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
16171
diff
changeset
|
58 #include "libmpdemux/mpeg_packetizer.h" |
1871 | 59 |
1872 | 60 int vo_mpegpes_fd=-1; |
32070 | 61 extern int ao_mpegpes_fd; |
1872 | 62 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
63 static const vo_info_t info = |
1871 | 64 { |
27430
8bc08d1b115d
100l: Rename missed preprocessor directives from a HAVE_ prefix to CONFIG_.
diego
parents:
27369
diff
changeset
|
65 #ifdef CONFIG_DVB |
27368 | 66 "MPEG-PES to DVB card", |
1876 | 67 #else |
27368 | 68 "MPEG-PES file", |
1876 | 69 #endif |
70 "mpegpes", | |
1871 | 71 "A'rpi", |
72 "" | |
73 }; | |
74 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
75 const LIBVO_EXTERN (mpegpes) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7860
diff
changeset
|
76 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
77 static int |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13048
diff
changeset
|
78 config(uint32_t s_width, uint32_t s_height, uint32_t width, uint32_t height, uint32_t flags, char *title, uint32_t format) |
1871 | 79 { |
27430
8bc08d1b115d
100l: Rename missed preprocessor directives from a HAVE_ prefix to CONFIG_.
diego
parents:
27369
diff
changeset
|
80 #ifdef CONFIG_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
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 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
|
90 } |
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 #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
|
92 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
|
93 } |
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 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
95 static int preinit(const char *arg){ |
27430
8bc08d1b115d
100l: Rename missed preprocessor directives from a HAVE_ prefix to CONFIG_.
diego
parents:
27369
diff
changeset
|
96 #ifdef CONFIG_DVB |
25558
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
97 int card = -1; |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
98 char vo_file[30], ao_file[30], *tmp; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
99 |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
100 if(arg != NULL){ |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
101 if((tmp = strstr(arg, "card=")) != NULL) { |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
102 card = atoi(&tmp[5]); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
103 if((card < 1) || (card > 4)) { |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
104 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
|
105 return -1; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
106 } |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
107 card--; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
108 arg = NULL; |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
109 } |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
110 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
111 |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
112 if(!arg){ |
1876 | 113 //|O_NONBLOCK |
25558
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
114 //search the first usable card |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
115 if(card==-1) { |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
116 int n; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
117 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
|
118 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
|
119 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
|
120 card = n; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
121 break; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
122 } |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
123 } |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
124 } |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
125 if(card==-1) { |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
126 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
|
127 return -1; |
634dfaa85718
when :card isn't specified by the user search the first available card
nicodvb
parents:
25220
diff
changeset
|
128 } |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 if((vo_mpegpes_fd = open(vo_file,O_RDWR)) < 0){ |
8594 | 133 perror("DVB VIDEO DEVICE: "); |
134 return -1; | |
135 } | |
1876 | 136 if ( (ioctl(vo_mpegpes_fd,VIDEO_SET_BLANK, false) < 0)){ |
137 perror("DVB VIDEO SET BLANK: "); | |
138 return -1; | |
139 } | |
140 if ( (ioctl(vo_mpegpes_fd,VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY) < 0)){ | |
141 perror("DVB VIDEO SELECT SOURCE: "); | |
142 return -1; | |
143 } | |
144 if ( (ioctl(vo_mpegpes_fd,VIDEO_PLAY) < 0)){ | |
145 perror("DVB VIDEO PLAY: "); | |
146 return -1; | |
147 } | |
7672
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
148 return 0; |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
149 } |
e6b46875e1b9
- fixed a 10l bug: setting PTS flag even if no PTS stored
arpi
parents:
7124
diff
changeset
|
150 #endif |
13048
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
151 arg = (arg ? arg : "grab.mpg"); |
2f150c190f7a
user can select dvb card number to use (V3 api only)
nicodvb
parents:
8917
diff
changeset
|
152 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
|
153 vo_mpegpes_fd=open(arg,O_WRONLY|O_CREAT,0666); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
154 if(vo_mpegpes_fd<0){ |
1872 | 155 perror("vo_mpegpes"); |
156 return -1; | |
157 } | |
1871 | 158 return 0; |
159 } | |
160 | |
161 | |
162 static void draw_osd(void) | |
163 { | |
164 } | |
165 | |
1876 | 166 |
31428 | 167 static int my_write(const unsigned char* data,int len){ |
19153 | 168 int orig_len = len; |
27430
8bc08d1b115d
100l: Rename missed preprocessor directives from a HAVE_ prefix to CONFIG_.
diego
parents:
27369
diff
changeset
|
169 #ifdef CONFIG_DVB |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
170 #define NFD 2 |
1876 | 171 struct pollfd pfd[NFD]; |
172 | |
173 // printf("write %d bytes \n",len); | |
174 | |
175 pfd[0].fd = vo_mpegpes_fd; | |
176 pfd[0].events = POLLOUT; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
177 |
32070 | 178 pfd[1].fd = ao_mpegpes_fd; |
1876 | 179 pfd[1].events = POLLOUT; |
180 | |
1872 | 181 while(len>0){ |
1876 | 182 if (poll(pfd,NFD,1)){ |
183 if (pfd[0].revents & POLLOUT){ | |
184 int ret=write(vo_mpegpes_fd,data,len); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
185 // printf("ret=%d \n",ret); |
1876 | 186 if(ret<=0){ |
187 perror("write"); | |
188 usleep(0); | |
189 } else { | |
190 len-=ret; data+=ret; | |
191 } | |
192 } else usleep(1000); | |
193 } | |
1872 | 194 } |
2066
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
195 |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
196 #else |
2b14cad013b7
using poll() only for DVB card - not required for file write
arpi
parents:
1986
diff
changeset
|
197 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
|
198 #endif |
19150 | 199 return orig_len; |
1872 | 200 } |
1871 | 201 |
30556
358ac046eccc
libvo: Mark functions not used outside of their files as static.
diego
parents:
29263
diff
changeset
|
202 static void send_pes_packet(unsigned char* data, int len, int id, int timestamp) |
358ac046eccc
libvo: Mark functions not used outside of their files as static.
diego
parents:
29263
diff
changeset
|
203 { |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
16171
diff
changeset
|
204 send_mpeg_pes_packet (data, len, id, timestamp, 1, my_write); |
1876 | 205 } |
206 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
207 static int draw_frame(uint8_t * src[]) |
1871 | 208 { |
1872 | 209 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
|
210 send_pes_packet(p->data,p->size,p->id,(p->timestamp>0)?p->timestamp:vo_pts); // video data |
1871 | 211 return 0; |
212 } | |
213 | |
1935 | 214 static void flip_page (void) |
215 { | |
216 } | |
217 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
218 static int draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x0,int y0) |
1935 | 219 { |
220 return 0; | |
221 } | |
222 | |
223 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
224 static int |
1871 | 225 query_format(uint32_t format) |
226 { | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13048
diff
changeset
|
227 if(format==IMGFMT_MPEGPES) return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_TIMER; |
1871 | 228 return 0; |
229 } | |
230 | |
231 static void | |
232 uninit(void) | |
233 { | |
32070 | 234 if(ao_mpegpes_fd >= 0 && ao_mpegpes_fd != vo_mpegpes_fd) close(ao_mpegpes_fd); |
235 ao_mpegpes_fd =- 1; | |
1876 | 236 if(vo_mpegpes_fd>=0){ close(vo_mpegpes_fd);vo_mpegpes_fd=-1;} |
1871 | 237 } |
238 | |
239 | |
240 static void check_events(void) | |
241 { | |
242 } | |
243 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
244 static int control(uint32_t request, void *data, ...) |
4352 | 245 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
246 switch (request) { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
247 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
248 return query_format(*((uint32_t*)data)); |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
249 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
250 return VO_NOTIMPL; |
4352 | 251 } |