34 bytestream_put_byte(dst, val);
46 bytestream_put_be16(dst, strlen(str));
62 bytestream_put_be16(dst, strlen(str));
77 uint8_t hdr,
t, buf[16];
78 int channel_id, timestamp,
size, offset = 0;
86 channel_id = hdr & 0x3F;
92 written += channel_id + 1;
95 size = prev_pkt[channel_id].
size;
96 type = prev_pkt[channel_id].
type;
97 extra = prev_pkt[channel_id].
extra;
101 timestamp = prev_pkt[channel_id].
ts_delta;
123 if (timestamp == 0xFFFFFF) {
130 timestamp += prev_pkt[channel_id].
timestamp;
137 prev_pkt[channel_id].
type = type;
140 prev_pkt[channel_id].
timestamp = timestamp;
141 prev_pkt[channel_id].
extra = extra;
143 int toread =
FFMIN(size, chunk_size);
149 offset += chunk_size;
150 written += chunk_size;
154 if (t != (0xC0 + channel_id))
164 uint8_t pkt_hdr[16], *p = pkt_hdr;
185 bytestream_put_byte(&p, pkt->
channel_id | (mode << 6));
187 bytestream_put_byte(&p, 0 | (mode << 6));
188 bytestream_put_byte(&p, pkt->
channel_id - 64);
190 bytestream_put_byte(&p, 1 | (mode << 6));
191 bytestream_put_le16(&p, pkt->
channel_id - 64);
197 bytestream_put_be24(&p, timestamp >= 0xFFFFFF ? 0xFFFFFF : timestamp);
199 bytestream_put_be24(&p, pkt->
size);
200 bytestream_put_byte(&p, pkt->
type);
202 bytestream_put_le32(&p, pkt->
extra);
204 if (timestamp >= 0xFFFFFF)
205 bytestream_put_be32(&p, timestamp);
220 written = p - pkt_hdr + pkt->
size;
221 while (off < pkt->
size) {
222 int towrite =
FFMIN(chunk_size, pkt->
size - off);
225 if (off < pkt->size) {
235 int timestamp,
int size)
262 const uint8_t *base =
data;
264 if (data >= data_end)
276 int size = bytestream_get_be16(&data);
282 if (data + size >= data_end || data + size < data)
286 if (t < 0 || data + t >= data_end)
297 const uint8_t *
name, uint8_t *dst,
int dst_size)
299 int namelen = strlen(name);
305 len = data_end -
data;
308 if (data_end - data < 3)
312 int size = bytestream_get_be16(&data);
315 if (data + size >= data_end || data + size < data)
318 if (size == namelen && !memcmp(data-size, name, namelen)) {
324 snprintf(dst, dst_size,
"%s", *data ?
"true" :
"false");
327 len = bytestream_get_be16(&data);
336 if (len < 0 || data + len >= data_end || data + len < data)
360 default:
return "unknown";
369 if (data >= data_end)
381 size = bytestream_get_be16(&data);
383 size = bytestream_get_be32(&data);
385 size =
FFMIN(size, 1023);
386 memcpy(buf, data, size);
398 int size = bytestream_get_be16(&data);
400 memcpy(buf, data, size);
407 if (data + size >= data_end || data + size < data)
413 if (t < 0 || data + t >= data_end)
428 av_log(ctx,
AV_LOG_DEBUG,
"RTMP packet type '%s'(%d) for channel %d, timestamp %d, extra field %d size %d\n",
432 while (src < src_end) {
446 for (i = 0; i < p->
size; i++)
454 int len = strlen(str);
467 if ((size -= 4 + 1) < 0)
469 amf_len = bytestream_get_be32(&data);
471 if ((size -= 2 + 1) < 0)
473 amf_len = bytestream_get_be16(&data);
482 return !memcmp(data, str, len);