History

more wip logic

Sigrid Solveig Haflínudóttir committed 5 years ago

Commit f6d84671 parent c4f625f4 files · +152 −5Browse files

Unified · Split

4 files
  1. amf.c +32 −0
  2. amf.h +5 −0
  3. main.c +4 −0
  4. rtmp.c +111 −5
amf.c+32−0
@@ -158,3 +158,35 @@ amfkvstr(u8int *p, u8int *e, char *name, char *v) · 157 unmodified lines
158158 {
159159 return amfstr(amfkv(p, e, name), e, v);
160160 }
161+
162+u8int *
163+amfbyteget(u8int *p, u8int *e, u8int *byte)
164+{
165+ atleast(1);
166+ *byte = *p;
167+ return p+1;
168+}
169+
170+u8int *
171+amfi16get(u8int *p, u8int *e, s16int *i)
172+{
173+ atleast(2);
174+ *i = p[0]<<8 | p[1];
175+ return p+2;
176+}
177+
178+u8int *
179+amfi24get(u8int *p, u8int *e, s32int *i)
180+{
181+ atleast(3);
182+ *i = p[0]<<16 | p[1]<<8 | p[2];
183+ return p+3;
184+}
185+
186+u8int *
187+amfi32get(u8int *p, u8int *e, s32int *i)
188+{
189+ atleast(4);
190+ *i = p[0]<<16 | p[1]<<16 | p[2]<<8 | p[3];
191+ return p+4;
192+}
amf.h+5−0
@@ -11,3 +11,8 @@ u8int *amfend(u8int *p, u8int *e); · 10 unmodified lines
1111 u8int *amfkvnum(u8int *p, u8int *e, char *name, double v);
1212 u8int *amfkvstr(u8int *p, u8int *e, char *name, char *v);
1313 u8int *amfkvbool(u8int *p, u8int *e, char *name, int v);
14+
15+u8int *amfbyteget(u8int *p, u8int *e, u8int *byte);
16+u8int *amfi16get(u8int *p, u8int *e, s16int *i);
17+u8int *amfi24get(u8int *p, u8int *e, s32int *i);
18+u8int *amfi32get(u8int *p, u8int *e, s32int *i);
main.c+4−0
@@ -7,6 +7,7 @@ · 6 unmodified lines
77 #include "rtmp.h"
88
99 int mainstacksize = 65536;
10+int debug = 0;
1011
1112 static void
1213 usage(void)
@@ -29,6 +30,9 @@ threadmain(int argc, char **argv) · 16 unmodified lines
2930 a = nil;
3031 v = nil;
3132 ARGBEGIN{
33+ case 'd':
34+ debug++;
35+ break;
3236 case 'D':
3337 rtmpdump++;
3438 break;
rtmp.c+111−5
@@ -37,6 +37,9 @@ struct Packet { · 36 unmodified lines
3737 u32int ts;
3838 u8int *data;
3939 int sz;
40+ int left;
41+ Packet *prev;
42+ Packet *next;
4043 };
4144
4245 struct RTMP {
@@ -45,6 +48,7 @@ struct RTMP { · 2 unmodified lines
4548 char *path;
4649 char *tcurl;
4750 Packet pk;
51+ Packet *ch;
4852 u8int *b, *p, *e;
4953 int mode;
5054 int bsz;
@@ -66,6 +70,39 @@ struct RTMP { · 15 unmodified lines
6670 #define putkvbool(name, s) do{ r->p = amfkvbool(r->p, r->e, name, s); }while(0)
6771
6872 int rtmpdump = 0;
73+extern int debug;
74+
75+static Packet *
76+pk4chan(RTMP *r, int chan)
77+{
78+ Packet *p;
79+
80+ for(p = r->ch; p != nil && p->chan != chan; p = p->next);
81+
82+ if(p == nil){
83+ if((p = calloc(1, sizeof(*p))) == nil)
84+ sysfatal("memory");
85+ p->type = -1;
86+ p->chan = chan;
87+ if((p->next = r->ch) != nil)
88+ r->ch->prev = p;
89+ }
90+
91+ return p;
92+}
93+
94+static void
95+pkfree(RTMP *r, Packet *p)
96+{
97+ if(p->prev != nil)
98+ p->prev->next = p->next;
99+ if(p->next != nil)
100+ p->next->prev = p->prev;
101+ if(r->ch == p)
102+ r->ch = p->next;
103+
104+ free(p->data);
105+}
69106
70107 static void
71108 newpacket(RTMP *r, int type, int hsz, int chan)
@@ -85,6 +122,22 @@ newpacket(RTMP *r, int type, int hsz, int chan) · 13 unmodified lines
85122 }
86123 }
87124
125+static void
126+bextend(RTMP *r, int bsz)
127+{
128+ u8int *ob;
129+
130+ if(r->bsz >= bsz)
131+ return;
132+ ob = r->b;
133+ if((r->b = realloc(r->b, bsz*2)) == nil)
134+ sysfatal("memory");
135+ if(ob != nil)
136+ r->p = r->b + (intptr)(ob - r->p);
137+ r->bsz *= 2;
138+ r->e = r->b + r->bsz;
139+}
140+
88141 static int
89142 handshake(int f)
90143 {
@@ -117,6 +170,60 @@ err: · 26 unmodified lines
117170 return -1;
118171 }
119172
173+static int
174+rtmprecv(RTMP *r)
175+{
176+ u8int *h, *e, type;
177+ int hsz, chan, bodysz, dummy;
178+ u32int ts;
179+
180+ r->p = r->b;
181+ if(readn(r->i, r->p, 1) != 1)
182+ goto err;
183+ hsz = (r->p[0] & 0xc0)>>6;
184+ chan = r->p[0] & 0x3f;
185+ if(debug)
186+ fprint(2, "hsz=%d chan=%d\n", hsz, chan);
187+ if(readn(r->i, r->p+1, hsz-1) != hsz-1)
188+ goto err;
189+
190+ memset(&r->pk, 0, sizeof(r->pk));
191+ r->pk.hsz = hsz;
192+ r->pk.chan = chan;
193+
194+ h = r->p + 1;
195+ e = r->p + hsz;
196+ r->pk.type = -1;
197+ bodysz = 0;
198+ if(hsz >= SzSmall){
199+ h = amfi24get(h, e, (s32int*)&ts); /* FIXME proper timestamps? */
200+ if(hsz >= SzMedium){
201+ h = amfi24get(h, e, &bodysz);
202+ h = amfbyteget(h, e, &type);
203+ r->pk.type = type;
204+ if(hsz >= SzLarge)
205+ h = amfi32get(h, e, &dummy); /* FIXME seems to be always 0? */
206+ }
207+ }
208+
209+ if(ts == 0xffffff){ /* exntended timestamp */
210+ if(readn(r->i, h, 4) != 4)
211+ goto err;
212+ h = amfi32get(h, h+4, (s32int*)&ts);
213+ }
214+
215+ bextend(r, bodysz);
216+ if(readn(r->i, h, bodysz) != bodysz)
217+ goto err;
218+ h += bodysz;
219+
220+ return 0;
221+
222+err:
223+ werrstr("rtmprecv: %r");
224+ return -1;
225+}
226+
120227 static int
121228 rtmpsend(RTMP *r)
122229 {
@@ -147,7 +254,6 @@ rtmpsend(RTMP *r) · 24 unmodified lines
147254 hsz = e - r->b;
148255 for(; hsz+bodysz > 0;){
149256 n = min(bodysz, Chunk);
150− fprint(2, "header is %d bytes, writing %d+%d=%d\n", hsz, hsz, n, hsz+n);
151257 if(Bwrite(r, p, hsz+n) < 0)
152258 goto err;
153259 if(rtmpdump)
@@ -162,6 +268,7 @@ rtmpsend(RTMP *r) · 8 unmodified lines
162268 }
163269
164270 r->p = nil;
271+ Bflush(r);
165272
166273 return 0;
167274 err:
@@ -247,16 +354,15 @@ rtmpdial(char *url, int w, int h, int withaudio) · 79 unmodified lines
247354
248355 if(handshake(f) != 0)
249356 goto err;
250− if((r = calloc(1, sizeof(*r))) == nil || (r->b = malloc(Bufsz)) == nil)
357+ if((r = calloc(1, sizeof(*r))) == nil)
251358 sysfatal("memory");
252359 if((r->app = strdup(app)) == nil || (path != nil && (r->path = strdup(path)) == nil))
253360 sysfatal("memory");
361+ bextend(r, Bufsz);
254362 r->tcurl = url;
255− r->bsz = Bufsz;
256− r->e = r->b + r->bsz;
257363 Binits(r, f, OWRITE, r->biobuf, sizeof(r->biobuf));
258364 r->i = f;
259− if(connect(r) != 0)
365+ if(connect(r) != 0 || rtmprecv(r) != 0)
260366 goto err;
261367
262368 return r;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t