annotate stream/netstream.h @ 26268:2f5886f0d307

Fix wrong #endif comment.
author diego
date Sat, 29 Mar 2008 15:51:05 +0000
parents b7d6346ab198
children 5a30f5bc23a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4129c8cfa742 Add MPLAYER_ prefix to multiple inclusion guards.
diego
parents: 25553
diff changeset
10 #ifndef MPLAYER_NETSTREAM_H
4129c8cfa742 Add MPLAYER_ prefix to multiple inclusion guards.
diego
parents: 25553
diff changeset
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>
26191
b7d6346ab198 mingw uses windows sockets.
vayne
parents: 26184
diff changeset
17 #ifndef HAVE_WINSOCK2
26184
7ee4ae1648e6 Add missing header #includes to fix 'make checkheaders'.
diego
parents: 26029
diff changeset
18 #include <sys/socket.h>
26191
b7d6346ab198 mingw uses windows sockets.
vayne
parents: 26184
diff changeset
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
4129c8cfa742 Add MPLAYER_ prefix to multiple inclusion guards.
diego
parents: 25553
diff changeset
151 #endif /* MPLAYER_NETSTREAM_H */