|
|
@ -76,15 +76,18 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
|
|
|
int channel_id, timestamp, data_size, offset = 0; |
|
|
|
int channel_id, timestamp, data_size, offset = 0; |
|
|
|
uint32_t extra = 0; |
|
|
|
uint32_t extra = 0; |
|
|
|
enum RTMPPacketType type; |
|
|
|
enum RTMPPacketType type; |
|
|
|
|
|
|
|
int size = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (url_read(h, &hdr, 1) != 1) |
|
|
|
if (url_read(h, &hdr, 1) != 1) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
size++; |
|
|
|
channel_id = hdr & 0x3F; |
|
|
|
channel_id = hdr & 0x3F; |
|
|
|
|
|
|
|
|
|
|
|
if (channel_id < 2) { //special case for channel number >= 64
|
|
|
|
if (channel_id < 2) { //special case for channel number >= 64
|
|
|
|
buf[1] = 0; |
|
|
|
buf[1] = 0; |
|
|
|
if (url_read_complete(h, buf, channel_id + 1) != channel_id + 1) |
|
|
|
if (url_read_complete(h, buf, channel_id + 1) != channel_id + 1) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
size += channel_id + 1; |
|
|
|
channel_id = AV_RL16(buf) + 64; |
|
|
|
channel_id = AV_RL16(buf) + 64; |
|
|
|
} |
|
|
|
} |
|
|
|
data_size = prev_pkt[channel_id].data_size; |
|
|
|
data_size = prev_pkt[channel_id].data_size; |
|
|
@ -97,17 +100,21 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (url_read_complete(h, buf, 3) != 3) |
|
|
|
if (url_read_complete(h, buf, 3) != 3) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
size += 3; |
|
|
|
timestamp = AV_RB24(buf); |
|
|
|
timestamp = AV_RB24(buf); |
|
|
|
if (hdr != RTMP_PS_FOURBYTES) { |
|
|
|
if (hdr != RTMP_PS_FOURBYTES) { |
|
|
|
if (url_read_complete(h, buf, 3) != 3) |
|
|
|
if (url_read_complete(h, buf, 3) != 3) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
size += 3; |
|
|
|
data_size = AV_RB24(buf); |
|
|
|
data_size = AV_RB24(buf); |
|
|
|
if (url_read_complete(h, buf, 1) != 1) |
|
|
|
if (url_read_complete(h, buf, 1) != 1) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
size++; |
|
|
|
type = buf[0]; |
|
|
|
type = buf[0]; |
|
|
|
if (hdr == RTMP_PS_TWELVEBYTES) { |
|
|
|
if (hdr == RTMP_PS_TWELVEBYTES) { |
|
|
|
if (url_read_complete(h, buf, 4) != 4) |
|
|
|
if (url_read_complete(h, buf, 4) != 4) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
size += 4; |
|
|
|
extra = AV_RL32(buf); |
|
|
|
extra = AV_RL32(buf); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -138,13 +145,15 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
|
|
|
} |
|
|
|
} |
|
|
|
data_size -= chunk_size; |
|
|
|
data_size -= chunk_size; |
|
|
|
offset += chunk_size; |
|
|
|
offset += chunk_size; |
|
|
|
|
|
|
|
size += chunk_size; |
|
|
|
if (data_size > 0) { |
|
|
|
if (data_size > 0) { |
|
|
|
url_read_complete(h, &t, 1); //marker
|
|
|
|
url_read_complete(h, &t, 1); //marker
|
|
|
|
|
|
|
|
size++; |
|
|
|
if (t != (0xC0 + channel_id)) |
|
|
|
if (t != (0xC0 + channel_id)) |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
return size; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
|
|
|
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
|
|
@ -153,6 +162,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
|
|
|
uint8_t pkt_hdr[16], *p = pkt_hdr; |
|
|
|
uint8_t pkt_hdr[16], *p = pkt_hdr; |
|
|
|
int mode = RTMP_PS_TWELVEBYTES; |
|
|
|
int mode = RTMP_PS_TWELVEBYTES; |
|
|
|
int off = 0; |
|
|
|
int off = 0; |
|
|
|
|
|
|
|
int size = 0; |
|
|
|
|
|
|
|
|
|
|
|
pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp; |
|
|
|
pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp; |
|
|
|
|
|
|
|
|
|
|
@ -205,6 +215,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
|
|
|
prev_pkt[pkt->channel_id].extra = pkt->extra; |
|
|
|
prev_pkt[pkt->channel_id].extra = pkt->extra; |
|
|
|
|
|
|
|
|
|
|
|
url_write(h, pkt_hdr, p-pkt_hdr); |
|
|
|
url_write(h, pkt_hdr, p-pkt_hdr); |
|
|
|
|
|
|
|
size = p - pkt_hdr + pkt->data_size; |
|
|
|
while (off < pkt->data_size) { |
|
|
|
while (off < pkt->data_size) { |
|
|
|
int towrite = FFMIN(chunk_size, pkt->data_size - off); |
|
|
|
int towrite = FFMIN(chunk_size, pkt->data_size - off); |
|
|
|
url_write(h, pkt->data + off, towrite); |
|
|
|
url_write(h, pkt->data + off, towrite); |
|
|
@ -212,9 +223,10 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
|
|
|
if (off < pkt->data_size) { |
|
|
|
if (off < pkt->data_size) { |
|
|
|
uint8_t marker = 0xC0 | pkt->channel_id; |
|
|
|
uint8_t marker = 0xC0 | pkt->channel_id; |
|
|
|
url_write(h, &marker, 1); |
|
|
|
url_write(h, &marker, 1); |
|
|
|
|
|
|
|
size++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
return size; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type, |
|
|
|
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type, |
|
|
|