47
47
bytestream_put_buffer(dst, str, strlen(str));
50
void ff_amf_write_string2(uint8_t **dst, const char *str1, const char *str2)
52
int len1 = 0, len2 = 0;
57
bytestream_put_byte(dst, AMF_DATA_TYPE_STRING);
58
bytestream_put_be16(dst, len1 + len2);
59
bytestream_put_buffer(dst, str1, len1);
60
bytestream_put_buffer(dst, str2, len2);
50
63
void ff_amf_write_null(uint8_t **dst)
52
65
bytestream_put_byte(dst, AMF_DATA_TYPE_NULL);
71
84
bytestream_put_be24(dst, AMF_DATA_TYPE_OBJECT_END);
87
int ff_amf_read_bool(GetByteContext *bc, int *val)
89
if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_BOOL)
90
return AVERROR_INVALIDDATA;
91
*val = bytestream2_get_byte(bc);
95
int ff_amf_read_number(GetByteContext *bc, double *val)
98
if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_NUMBER)
99
return AVERROR_INVALIDDATA;
100
read = bytestream2_get_be64(bc);
101
*val = av_int2double(read);
105
int ff_amf_read_string(GetByteContext *bc, uint8_t *str,
106
int strsize, int *length)
110
if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_STRING)
111
return AVERROR_INVALIDDATA;
112
stringlen = bytestream2_get_be16(bc);
113
if (stringlen + 1 > strsize)
114
return AVERROR(EINVAL);
115
readsize = bytestream2_get_buffer(bc, str, stringlen);
116
if (readsize != stringlen) {
117
av_log(NULL, AV_LOG_WARNING,
118
"Unable to read as many bytes as AMF string signaled\n");
120
str[readsize] = '\0';
121
*length = FFMIN(stringlen, readsize);
125
int ff_amf_read_null(GetByteContext *bc)
127
if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_NULL)
128
return AVERROR_INVALIDDATA;
74
132
int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
75
133
int chunk_size, RTMPPacket *prev_pkt)
77
uint8_t hdr, t, buf[16];
137
if (ffurl_read(h, &hdr, 1) != 1)
140
return ff_rtmp_packet_read_internal(h, p, chunk_size, prev_pkt, hdr);
143
int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
144
RTMPPacket *prev_pkt, uint8_t hdr)
78
148
int channel_id, timestamp, data_size, offset = 0;
79
149
uint32_t extra = 0;
80
150
enum RTMPPacketType type;
83
if (ffurl_read(h, &hdr, 1) != 1)
86
155
channel_id = hdr & 0x3F;
129
198
if (hdr != RTMP_PS_TWELVEBYTES)
130
199
timestamp += prev_pkt[channel_id].timestamp;
132
if (ff_rtmp_packet_create(p, channel_id, type, timestamp, data_size))
201
if ((ret = ff_rtmp_packet_create(p, channel_id, type, timestamp,
134
204
p->extra = extra;
136
206
prev_pkt[channel_id].channel_id = channel_id;
217
291
prev_pkt[pkt->channel_id].extra = pkt->extra;
219
ffurl_write(h, pkt_hdr, p-pkt_hdr);
293
if ((ret = ffurl_write(h, pkt_hdr, p - pkt_hdr)) < 0)
220
295
size = p - pkt_hdr + pkt->data_size;
221
296
while (off < pkt->data_size) {
222
297
int towrite = FFMIN(chunk_size, pkt->data_size - off);
223
ffurl_write(h, pkt->data + off, towrite);
298
if ((ret = ffurl_write(h, pkt->data + off, towrite)) < 0)
225
301
if (off < pkt->data_size) {
226
302
uint8_t marker = 0xC0 | pkt->channel_id;
227
ffurl_write(h, &marker, 1);
303
if ((ret = ffurl_write(h, &marker, 1)) < 0)