annotate libvo/vo_mpegpes.c @ 7492:5465cbd5c5ef

Modern versions of OpenSSH listen on localhost to forward the X11 connection (X11UseLocalhost defaults to yes). The following patch permits to consider as non local any DISPLAY environment which port is greater or equal to 10 else mplayer tries a local optimization on a distant X server which doesn't work. patch by Denis.Ducamp@groar.org
author arpi
date Mon, 23 Sep 2002 21:17:30 +0000
parents eca7dbad0166
children e6b46875e1b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5059
8914f0bb6f35 using libFAME...
arpi
parents: 4737
diff changeset
1 // Don't change for DVB card, it must be 2048
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
2 #define PES_MAX_SIZE 2048
5059
8914f0bb6f35 using libFAME...
arpi
parents: 4737
diff changeset
3
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
4 /*
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
5 * Based on:
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
6 *
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
7 * test_av.c - Test program for new API
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
8 *
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
9 * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
10 * & Marcus Metzler <marcus@convergence.de>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
11 * for convergence integrated media GmbH
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
12 *
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
13 * libav - MPEG-PS multiplexer, part of ffmpeg
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
14 * Copyright Gerard Lantau (see http://ffmpeg.sf.net)
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
15 *
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
16 */
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
17
6239
22cf38f95151 warning fix (write()/close() require unistd.h)
pl
parents: 5881
diff changeset
18 #include "config.h"
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
19 #include <stdio.h>
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
20 #include <stdlib.h>
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
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
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
23 #include <sys/types.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
24 #include <sys/stat.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
25 #include <fcntl.h>
6239
22cf38f95151 warning fix (write()/close() require unistd.h)
pl
parents: 5881
diff changeset
26 #include <unistd.h>
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
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"
2727
a44484066941 autodetecting for dvb-cards
jaf
parents: 2709
diff changeset
29
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
30 #ifdef HAVE_DVB
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
31
2066
2b14cad013b7 using poll() only for DVB card - not required for file write
arpi
parents: 1986
diff changeset
32 #include <sys/poll.h>
2b14cad013b7 using poll() only for DVB card - not required for file write
arpi
parents: 1986
diff changeset
33
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
34 #include <sys/ioctl.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
35 #include <stdio.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
36 #include <time.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
37
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
38 #include <ost/dmx.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
39 #include <ost/frontend.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
40 #include <ost/sec.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
41 #include <ost/video.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
42 #include <ost/audio.h>
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
43
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
44 #endif
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
45
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
46 #include "config.h"
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
47 #include "video_out.h"
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
48 #include "video_out_internal.h"
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
49
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
50 LIBVO_EXTERN (mpegpes)
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
51
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
52 int vo_mpegpes_fd=-1;
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
53 int vo_mpegpes_fd2=-1;
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
54
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
55 static vo_info_t vo_info =
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
56 {
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
57 #ifdef HAVE_DVB
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
58 "Mpeg-PES to DVB card",
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
59 #else
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
60 "Mpeg-PES file",
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
61 #endif
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
62 "mpegpes",
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
63 "A'rpi",
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
64 ""
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
65 };
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
66
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
67 static uint32_t
7124
eca7dbad0166 finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents: 6273
diff changeset
68 config(uint32_t s_width, uint32_t s_height, uint32_t width, uint32_t height, uint32_t fullscreen, char *title, uint32_t format)
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
69 {
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
70 #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
71 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
72 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
73 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
74 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
75 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
76 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
77 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
78 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
79 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
80 }
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 #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
82 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
83 }
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
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 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
86 #ifdef HAVE_DVB
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
87 //|O_NONBLOCK
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
88 if((vo_mpegpes_fd = open("/dev/ost/video",O_RDWR)) < 0){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
89 perror("DVB VIDEO DEVICE: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
90 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
91 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
92 if((vo_mpegpes_fd2 = open("/dev/ost/audio",O_RDWR|O_NONBLOCK)) < 0){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
93 perror("DVB AUDIO DEVICE: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
94 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
95 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
96 if ( (ioctl(vo_mpegpes_fd,VIDEO_SET_BLANK, false) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
97 perror("DVB VIDEO SET BLANK: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
98 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
99 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
100 if ( (ioctl(vo_mpegpes_fd,VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
101 perror("DVB VIDEO SELECT SOURCE: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
102 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
103 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
104 #if 1
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
105 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
106 perror("DVB AUDIO SELECT SOURCE: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
107 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
108 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
109 if ( (ioctl(vo_mpegpes_fd2,AUDIO_PLAY) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
110 perror("DVB AUDIO PLAY: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
111 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
112 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
113 #else
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
114 if ( (ioctl(vo_mpegpes_fd2,AUDIO_STOP,0) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
115 perror("DVB AUDIO STOP: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
116 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
117 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
118 #endif
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
119 if ( (ioctl(vo_mpegpes_fd,VIDEO_PLAY) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
120 perror("DVB VIDEO PLAY: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
121 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
122 }
6273
deeba5c68397 re-enabled a-v sync, fixes 25fps playback problems
arpi
parents: 6239
diff changeset
123 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_AV_SYNC, true) < 0)){
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
124 perror("DVB AUDIO SET AV SYNC: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
125 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
126 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
127 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MUTE, false) < 0)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
128 perror("DVB AUDIO SET MUTE: ");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
129 return -1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
130 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
131
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
132 #else
5881
3c5ee5419838 open w/O_CREAT requires a third argument, mode!
rfelker
parents: 5877
diff changeset
133 vo_mpegpes_fd=open("grab.mpg",O_WRONLY|O_CREAT,0666);
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
134 if(vo_mpegpes_fd<0){
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
135 perror("vo_mpegpes");
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
136 return -1;
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
137 }
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
138 #endif
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
139 return 0;
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
140 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
141
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
142 static const vo_info_t*
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
143 get_info(void)
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
144 {
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
145 return &vo_info;
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
146 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
147
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
148 static void draw_osd(void)
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
149 {
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
150 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
151
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
152
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
153 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
154 #ifdef HAVE_DVB
2b14cad013b7 using poll() only for DVB card - not required for file write
arpi
parents: 1986
diff changeset
155 #define NFD 2
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
156 struct pollfd pfd[NFD];
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
157
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
158 // printf("write %d bytes \n",len);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
159
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
160 pfd[0].fd = vo_mpegpes_fd;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
161 pfd[0].events = POLLOUT;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
162
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
163 pfd[1].fd = vo_mpegpes_fd2;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
164 pfd[1].events = POLLOUT;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
165
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
166 while(len>0){
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
167 if (poll(pfd,NFD,1)){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
168 if (pfd[0].revents & POLLOUT){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
169 int ret=write(vo_mpegpes_fd,data,len);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
170 // printf("ret=%d \n",ret);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
171 if(ret<=0){
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
172 perror("write");
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
173 usleep(0);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
174 } else {
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
175 len-=ret; data+=ret;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
176 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
177 } else usleep(1000);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
178 }
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
179 }
2066
2b14cad013b7 using poll() only for DVB card - not required for file write
arpi
parents: 1986
diff changeset
180
2b14cad013b7 using poll() only for DVB card - not required for file write
arpi
parents: 1986
diff changeset
181 #else
2b14cad013b7 using poll() only for DVB card - not required for file write
arpi
parents: 1986
diff changeset
182 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
183 #endif
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
184 }
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
185
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
186 static unsigned char pes_header[PES_MAX_SIZE];
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
187
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
188 void send_pes_packet(unsigned char* data,int len,int id,int timestamp){
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
189 int ptslen=timestamp?5:1;
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
190
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
191 // startcode:
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
192 pes_header[0]=pes_header[1]=0;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
193 pes_header[2]=id>>8; pes_header[3]=id&255;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
194
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
195 while(len>0){
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
196 int payload_size=len; // data + PTS
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
197 if(6+ptslen+payload_size>PES_MAX_SIZE) payload_size=PES_MAX_SIZE-(6+ptslen);
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
198
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
199 // construct PES header: (code from ffmpeg's libav)
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
200 // packetsize:
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
201 pes_header[4]=(ptslen+payload_size)>>8;
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
202 pes_header[5]=(ptslen+payload_size)&255;
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
203
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
204 if(ptslen==5){
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
205 int x;
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
206 // presentation time stamp:
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
207 x=(0x02 << 4) | (((timestamp >> 30) & 0x07) << 1) | 1;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
208 pes_header[6]=x;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
209 x=((((timestamp >> 15) & 0x7fff) << 1) | 1);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
210 pes_header[7]=x>>8; pes_header[8]=x&255;
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
211 x=((((timestamp) & 0x7fff) << 1) | 1);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
212 pes_header[9]=x>>8; pes_header[10]=x&255;
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
213 } else {
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
214 // stuffing and header bits:
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
215 pes_header[6]=0x0f;
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
216 }
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
217
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
218 memcpy(&pes_header[6+ptslen],data,payload_size);
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
219 my_write(pes_header,6+ptslen+payload_size);
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
220
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
221 len-=payload_size; data+=payload_size;
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
222 ptslen=1; // store PTS only once, at first packet!
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
223 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
224
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
225 // printf("PES: draw frame! pts=%d size=%d \n",timestamp,len);
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
226
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
227 }
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
228
4299
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
229 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
230
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
231 int ptslen=timestamp?5:0;
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
232
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
233 // startcode:
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
234 pes_header[0]=pes_header[1]=0;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
235 pes_header[2]=1; pes_header[3]=0xBD;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
236
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
237 while(len>=4){
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
238 int payload_size;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
239
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
240 payload_size=PES_MAX_SIZE-6-20; // max possible data len
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
241 if(payload_size>len) payload_size=len;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
242 payload_size&=(~3); // align!
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
243
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
244 //if(6+payload_size>PES_MAX_SIZE) payload_size=PES_MAX_SIZE-6;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
245
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
246 // packetsize:
4299
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
247 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
248 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
249
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
250 // stuffing:
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
251 pes_header[6]=0x81;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
252 pes_header[7]=0x80;
4299
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
253
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
254 // hdrlen:
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
255 pes_header[8]=ptslen;
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
256
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
257 if(ptslen){
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
258 int x;
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
259 // presentation time stamp:
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
260 x=(0x02 << 4) | (((timestamp >> 30) & 0x07) << 1) | 1;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
261 pes_header[9]=x;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
262 x=((((timestamp >> 15) & 0x7fff) << 1) | 1);
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
263 pes_header[10]=x>>8; pes_header[11]=x&255;
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
264 x=((((timestamp) & 0x7fff) << 1) | 1);
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
265 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
266 }
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
267
4299
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
268 // ============ LPCM header: (7 bytes) =================
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
269 // Info by mocm@convergence.de
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
270
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
271 // ID:
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
272 pes_header[ptslen+9]=id;
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
273
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
274 // number of frames:
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
275 pes_header[ptslen+10]=0x07;
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
276
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
277 // 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
278 pes_header[ptslen+11]=0x00;
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
279 pes_header[ptslen+12]=0x04;
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
280
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
281 // audio emphasis on-off 1 bit
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
282 // audio mute on-off 1 bit
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
283 // reserved 1 bit
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
284 // audio frame number 5 bit
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
285 pes_header[ptslen+13]=0x0C;
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 // quantization word length 2 bit
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
288 // 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
289 // reserved 1 bit
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
290 // 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
291 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
292
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
293 // dynamic range control (0x80 if off)
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
294 pes_header[ptslen+15]=0x80;
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
295
8e157167cee5 LPCM write code rewritten, thanks to Marcus at mocm@convergence.de
arpi
parents: 2727
diff changeset
296 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
297 my_write(pes_header,6+3+ptslen+7+payload_size);
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
298
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
299 len-=payload_size; data+=payload_size;
4306
f11e25b77c1e cleanup of video packet writer, PTS sent only once
arpi
parents: 4299
diff changeset
300 ptslen=0; // store PTS only once, at first packet!
2706
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
301 }
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
302
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
303 // printf("PES: draw frame! pts=%d size=%d \n",timestamp,len);
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
304
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
305 }
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
306
3066369adb32 audio packet writting added
arpi
parents: 2496
diff changeset
307
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
308 static uint32_t draw_frame(uint8_t * src[])
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
309 {
1872
2fe0e11bab3c file writer implemented
arpi
parents: 1871
diff changeset
310 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
311 send_pes_packet(p->data,p->size,p->id,(p->timestamp>0)?p->timestamp:vo_pts); // video data
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
312 return 0;
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
313 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
314
1935
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
315 static void flip_page (void)
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
316 {
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
317 }
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
318
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
319 static uint32_t draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x0,int y0)
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
320 {
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
321 return 0;
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
322 }
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
323
fcd39f3b13d4 YV12 support (using libavcodec for mpeg1-I encoding)
arpi
parents: 1876
diff changeset
324
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
325 static uint32_t
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
326 query_format(uint32_t format)
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
327 {
5566
e01c664def74 VFCAP added
arpi
parents: 5560
diff changeset
328 if(format==IMGFMT_MPEGPES) return 3|VFCAP_TIMER;
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
329 return 0;
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
330 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
331
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
332 static void
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
333 uninit(void)
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
334 {
1876
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
335 if(vo_mpegpes_fd>=0){ close(vo_mpegpes_fd);vo_mpegpes_fd=-1;}
220475b1676a PS multiplexing fixed
arpi
parents: 1872
diff changeset
336 if(vo_mpegpes_fd2>=0){ close(vo_mpegpes_fd2);vo_mpegpes_fd2=-1;}
1871
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
337 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
338
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
339
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
340 static void check_events(void)
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
341 {
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
342 }
cb5dde69354b Mpeg PES added
arpi
parents:
diff changeset
343
4596
c35d7ce151b3 10000hl to Holm... control MUST BE static...
arpi
parents: 4592
diff changeset
344 static uint32_t control(uint32_t request, void *data, ...)
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4341
diff changeset
345 {
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
346 switch (request) {
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
347 case VOCTRL_QUERY_FORMAT:
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
348 return query_format(*((uint32_t*)data));
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
349 }
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
350 return VO_NOTIMPL;
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4341
diff changeset
351 }