Unified · Split
| @@ -28,6 +28,14 @@ enum { · 27 unmodified lines | ||
| 28 | 28 | CbStatus, |
| 29 | 29 | NumCbA, |
| 30 | 30 | |
| 31 | + CtlStreamBegin = 0, | |
| 32 | + CtlStreamEnd, | |
| 33 | + CtlStreamDry, | |
| 34 | + CtlStreamRecorded, | |
| 35 | + CtlPing = 6, | |
| 36 | + CtlBufferEmpty = 31, | |
| 37 | + CtlBufferReady, | |
| 38 | + | |
| 31 | 39 | PktChunkSz = 1, |
| 32 | 40 | PktBytesReadReport = 3, |
| 33 | 41 | PktControl = 4, |
| @@ -105,7 +113,7 @@ struct RTMP { · 71 unmodified lines | ||
| 105 | 113 | putobj(); \ |
| 106 | 114 | }while(0) |
| 107 | 115 | |
| 108 | −static szs[] = { | |
| 116 | +static int szs[] = { | |
| 109 | 117 | [SzTiny] = 1, |
| 110 | 118 | [SzSmall] = 4, |
| 111 | 119 | [SzMedium] = 8, |
| @@ -128,6 +136,16 @@ static char *pktype2s[] = { · 16 unmodified lines | ||
| 128 | 136 | [PktFlashVideo] = "FlashVideo", |
| 129 | 137 | }; |
| 130 | 138 | |
| 139 | +static char *ctl2s[] = { | |
| 140 | + [CtlStreamBegin] = "StreamBegin", | |
| 141 | + [CtlStreamEnd] = "StreamEnd", | |
| 142 | + [CtlStreamDry] = "StreamDry", | |
| 143 | + [CtlStreamRecorded] = "StreamRecorded", | |
| 144 | + [CtlPing] = "Ping", | |
| 145 | + [CtlBufferEmpty] = "BufferEmpty", | |
| 146 | + [CtlBufferReady] = "BufferReady", | |
| 147 | +}; | |
| 148 | + | |
| 131 | 149 | extern int debug; |
| 132 | 150 | |
| 133 | 151 | #pragma varargck type "T" int |
| @@ -156,9 +174,13 @@ pkfmt(Fmt *f) · 22 unmodified lines | ||
| 156 | 174 | p = va_arg(f->args, Packet*); |
| 157 | 175 | |
| 158 | 176 | fmtprint(f, "type=%T chan=%d ts=%ud sz=%d", p->type, p->chan, p->ts, p->sz); |
| 177 | + | |
| 178 | + s = p->data; | |
| 179 | + e = s + p->sz; | |
| 180 | + | |
| 159 | 181 | if(p->type == PktInvoke){ |
| 160 | 182 | fmtprint(f, ":"); |
| 161 | − for(s = p->data, e = s + p->sz; s != nil && s != e;){ | |
| 183 | + for(; s != nil && s != e;){ | |
| 162 | 184 | if((s = amfparse(&a, s, e)) != nil) |
| 163 | 185 | fmtprint(f, " %A", a); |
| 164 | 186 | else |
| @@ -414,6 +436,7 @@ loop(void *aux) · 249 unmodified lines | ||
| 414 | 436 | int res, n, ok; |
| 415 | 437 | Amf *a[NumCbA]; |
| 416 | 438 | u8int *s, *e; |
| 439 | + s16int s16; | |
| 417 | 440 | Packet *p; |
| 418 | 441 | Invoke *i; |
| 419 | 442 | RTMP *r; |
| @@ -435,12 +458,13 @@ loop(void *aux) · 15 unmodified lines | ||
| 435 | 458 | break; |
| 436 | 459 | } |
| 437 | 460 | |
| 461 | + s = r->pk.data; | |
| 462 | + e = s + r->pk.sz; | |
| 463 | + | |
| 438 | 464 | switch(p->type){ |
| 439 | 465 | case PktInvoke: |
| 440 | 466 | i = nil; |
| 441 | 467 | ok = 0; |
| 442 | − s = r->pk.data; | |
| 443 | − e = s + r->pk.sz; | |
| 444 | 468 | for(n = 0; n < NumCbA; n++){ |
| 445 | 469 | if((s = amfparse(&a[n], s, e)) == nil) |
| 446 | 470 | goto err; |
| @@ -483,7 +507,7 @@ loop(void *aux) · 36 unmodified lines | ||
| 483 | 507 | break; |
| 484 | 508 | |
| 485 | 509 | case PktChunkSz: |
| 486 | − if(amfi32get(r->pk.data, r->pk.data+r->pk.sz, &r->chunk) == nil) | |
| 510 | + if(amfi32get(s, e, &r->chunk) == nil) | |
| 487 | 511 | goto err; |
| 488 | 512 | if(r->chunk < 2){ |
| 489 | 513 | werrstr("invalid chunk size: %d", r->chunk); |
| @@ -492,8 +516,35 @@ loop(void *aux) · 2 unmodified lines | ||
| 492 | 516 | if(debug) |
| 493 | 517 | fprint(2, "new chunk size: %d bytes\n", r->chunk); |
| 494 | 518 | break; |
| 519 | + | |
| 495 | 520 | case PktBytesReadReport: |
| 496 | 521 | case PktControl: |
| 522 | + if((s = amfi16get(s, e, &s16)) == nil) | |
| 523 | + goto err; | |
| 524 | + if((s = amfi32get(s, e, &n)) == nil) | |
| 525 | + n = -1; | |
| 526 | + switch(s16){ | |
| 527 | + case CtlStreamBegin: | |
| 528 | + case CtlStreamEnd: | |
| 529 | + case CtlStreamDry: | |
| 530 | + case CtlStreamRecorded: | |
| 531 | + case CtlBufferEmpty: | |
| 532 | + case CtlBufferReady: | |
| 533 | + if(0){ | |
| 534 | + case CtlPing: | |
| 535 | + /* FIXME pong */ | |
| 536 | + USED(n); | |
| 537 | + } | |
| 538 | + if(debug) | |
| 539 | + fprint(2, "control packet: %s %d\n", ctl2s[s16], n); | |
| 540 | + break; | |
| 541 | + default: | |
| 542 | + if(debug) | |
| 543 | + fprint(2, "unknown control packet %d (value %d)\n", s16, n); | |
| 544 | + break; | |
| 545 | + } | |
| 546 | + break; | |
| 547 | + | |
| 497 | 548 | case PktServerBW: |
| 498 | 549 | case PktClientBW: |
| 499 | 550 | case PktAudio: |