Mercurial > mplayer.hg
annotate stream/netstream.h @ 27524:39937f39cb2d
Make internal Matroska demuxer default again
Undo Aurelien's previous commit which made the lavf demuxer the
default. SSA/ASS subtitles do not work properly with the lavf demuxer
at the moment. That's much more important than any issues with the
internal demuxer. The internal demuxer must remain the default at least
until the subtitle issues are resolved.
author | uau |
---|---|
date | Tue, 09 Sep 2008 14:45:50 +0000 |
parents | 5a30f5bc23a0 |
children |
rev | line source |
---|---|
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
1 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
2 /* |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
3 * Common stuff for netstream |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
4 * Packets and so on are defined here along with a few helpers |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
5 * wich are used by both the client and the server |
9863
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
6 * |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
7 * Data is always low endian |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
8 */ |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
9 |
26029 | 10 #ifndef MPLAYER_NETSTREAM_H |
11 #define MPLAYER_NETSTREAM_H | |
25553
6ac1ece1f9fe
Add multiple inclusion guards to all header files that lack them.
diego
parents:
19271
diff
changeset
|
12 |
26184
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
13 #include <stdint.h> |
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
14 #include <stdlib.h> |
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
15 #include <string.h> |
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
16 #include <errno.h> |
27461
5a30f5bc23a0
Rename HAVE_WINSOCK preprocessor condition to HAVE_WINSOCK_H.
diego
parents:
26191
diff
changeset
|
17 #ifndef HAVE_WINSOCK2_H |
26184
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
18 #include <sys/socket.h> |
26191 | 19 #endif |
26184
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
20 #include "mp_msg.h" |
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
21 #include "mpbswap.h" |
7ee4ae1648e6
Add missing header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
22 |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
23 typedef struct mp_net_stream_packet_st { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
24 uint16_t len; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
25 uint8_t cmd; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
26 char data[0]; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
27 } __attribute__ ((packed)) mp_net_stream_packet_t; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
28 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
29 #define PACKET_MAX_SIZE 4096 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
30 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
31 // Commands sent by the client |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
32 #define NET_STREAM_OPEN 0 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
33 // data is the url |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
34 #define NET_STREAM_FILL_BUFFER 1 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
35 // data is an uint16 wich is the max len of the data to return |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
36 #define NET_STREAM_SEEK 3 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
37 // data is an uint64 wich the pos where to seek |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
38 #define NET_STREAM_CLOSE 4 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
39 // no data |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
40 #define NET_STREAM_RESET 5 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
41 // no data |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
42 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
43 // Server response |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
44 #define NET_STREAM_OK 128 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
45 // Data returned if open is successful |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
46 typedef struct mp_net_stream_opened_st { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
47 uint32_t file_format; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
48 uint32_t flags; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
49 uint32_t sector_size; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
50 uint64_t start_pos; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
51 uint64_t end_pos; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
52 } __attribute__ ((packed)) mp_net_stream_opened_t; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
53 // FILL_BUFFER return the data |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
54 // CLOSE return nothing |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
55 #define NET_STREAM_ERROR 129 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
56 // Data is the error message (if any ;) |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
57 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
58 static int net_read(int fd, char* buf, int len) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
59 int r = 0; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
60 while(len) { |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
9863
diff
changeset
|
61 r = recv(fd,buf,len,0); |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
62 if(r <= 0) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
63 if(errno == EINTR) continue; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
64 if(r < 0) |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
65 mp_msg(MSGT_NETST,MSGL_ERR,"Read failed: %s\n",strerror(errno)); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
66 return 0; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
67 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
68 len -= r; |
12640
7513f753af91
tcp fragging bugfix by Song Du <freewizard at gmail.com>
alex
parents:
10206
diff
changeset
|
69 buf += r; |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
70 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
71 return 1; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
72 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
73 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
74 static mp_net_stream_packet_t* read_packet(int fd) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
75 uint16_t len; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
76 mp_net_stream_packet_t* pack = |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
77 (mp_net_stream_packet_t*)malloc(sizeof(mp_net_stream_packet_t)); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
78 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
79 if(!net_read(fd,(char*)pack,sizeof(mp_net_stream_packet_t))) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
80 free(pack); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
81 return NULL; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
82 } |
9863
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
83 pack->len = le2me_16(pack->len); |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
84 |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
85 if(pack->len < sizeof(mp_net_stream_packet_t)) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
86 mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid packet (too small: %d)\n",pack->len); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
87 free(pack); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
88 return NULL; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
89 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
90 if(pack->len > PACKET_MAX_SIZE) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
91 mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid packet (too big: %d)\n",pack->len); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
92 free(pack); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
93 return NULL; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
94 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
95 len = pack->len; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
96 if(len > sizeof(mp_net_stream_packet_t)) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
97 pack = realloc(pack,len); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
98 if(!pack) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
99 mp_msg(MSGT_NETST,MSGL_ERR,"Failed to get memory for the packet (%d bytes)\n",len); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
100 return NULL; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
101 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
102 if(!net_read(fd,pack->data,len - sizeof(mp_net_stream_packet_t))) |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
103 return NULL; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
104 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
105 // printf ("Read packet %d %d %d\n",fd,pack->cmd,pack->len); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
106 return pack; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
107 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
108 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
109 static int net_write(int fd, char* buf, int len) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
110 int w; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
111 while(len) { |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
9863
diff
changeset
|
112 w = send(fd,buf,len,0); |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
113 if(w <= 0) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
114 if(errno == EINTR) continue; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
115 if(w < 0) |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
116 mp_msg(MSGT_NETST,MSGL_ERR,"Write failed: %s\n",strerror(errno)); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
117 return 0; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
118 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
119 len -= w; |
12640
7513f753af91
tcp fragging bugfix by Song Du <freewizard at gmail.com>
alex
parents:
10206
diff
changeset
|
120 buf += w; |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
121 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
122 return 1; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
123 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
124 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
125 static int write_packet(int fd, uint8_t cmd,char* data,int len) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
126 mp_net_stream_packet_t* pack = malloc(len + sizeof(mp_net_stream_packet_t)); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
127 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
128 if(len > 0 && data) |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
129 memcpy(pack->data,data,len); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
130 pack->len = len + sizeof(mp_net_stream_packet_t); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
131 pack->cmd = cmd; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
132 |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
133 // printf("Write packet %d %d (%p) %d\n",fd,cmd,data,len); |
9863
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
134 pack->len = le2me_16(pack->len); |
9850
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
135 if(net_write(fd,(char*)pack,pack->len)) { |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
136 free(pack); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
137 return 1; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
138 } |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
139 free(pack); |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
140 return 0; |
564678d0bc15
A new stream wich allow access to MPlayer stream accross the network.
albeu
parents:
diff
changeset
|
141 } |
9863
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
142 |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
143 static void net_stream_opened_2_me(mp_net_stream_opened_t* o) { |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
144 o->file_format = le2me_32(o->file_format); |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
145 o->flags = le2me_32(o->flags); |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
146 o->sector_size = le2me_32(o->sector_size); |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
147 o->start_pos = le2me_64(o->start_pos); |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
148 o->end_pos = le2me_64(o->end_pos); |
4c6c6c361f24
It should now be endian aware. Untested as i only have le box :(
albeu
parents:
9850
diff
changeset
|
149 } |
25553
6ac1ece1f9fe
Add multiple inclusion guards to all header files that lack them.
diego
parents:
19271
diff
changeset
|
150 |
26029 | 151 #endif /* MPLAYER_NETSTREAM_H */ |