Commit 06186a31 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'ba5393a6'

* commit 'ba5393a6':
  rtmp: rename data_size to size
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents a2b0699f ba5393a6
...@@ -145,25 +145,25 @@ int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size, ...@@ -145,25 +145,25 @@ int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
{ {
uint8_t t, buf[16]; uint8_t t, buf[16];
int channel_id, timestamp, data_size, offset = 0; int channel_id, timestamp, size, offset = 0;
uint32_t extra = 0; uint32_t extra = 0;
enum RTMPPacketType type; enum RTMPPacketType type;
int size = 0; int written = 0;
int ret; int ret;
size++; written++;
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 (ffurl_read_complete(h, buf, channel_id + 1) != channel_id + 1) if (ffurl_read_complete(h, buf, channel_id + 1) != channel_id + 1)
return AVERROR(EIO); return AVERROR(EIO);
size += channel_id + 1; written += channel_id + 1;
channel_id = AV_RL16(buf) + 64; channel_id = AV_RL16(buf) + 64;
} }
data_size = prev_pkt[channel_id].data_size; size = prev_pkt[channel_id].size;
type = prev_pkt[channel_id].type; type = prev_pkt[channel_id].type;
extra = prev_pkt[channel_id].extra; extra = prev_pkt[channel_id].extra;
hdr >>= 6; hdr >>= 6;
if (hdr == RTMP_PS_ONEBYTE) { if (hdr == RTMP_PS_ONEBYTE) {
...@@ -171,21 +171,21 @@ int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size, ...@@ -171,21 +171,21 @@ int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
} else { } else {
if (ffurl_read_complete(h, buf, 3) != 3) if (ffurl_read_complete(h, buf, 3) != 3)
return AVERROR(EIO); return AVERROR(EIO);
size += 3; written += 3;
timestamp = AV_RB24(buf); timestamp = AV_RB24(buf);
if (hdr != RTMP_PS_FOURBYTES) { if (hdr != RTMP_PS_FOURBYTES) {
if (ffurl_read_complete(h, buf, 3) != 3) if (ffurl_read_complete(h, buf, 3) != 3)
return AVERROR(EIO); return AVERROR(EIO);
size += 3; written += 3;
data_size = AV_RB24(buf); size = AV_RB24(buf);
if (ffurl_read_complete(h, buf, 1) != 1) if (ffurl_read_complete(h, buf, 1) != 1)
return AVERROR(EIO); return AVERROR(EIO);
size++; written++;
type = buf[0]; type = buf[0];
if (hdr == RTMP_PS_TWELVEBYTES) { if (hdr == RTMP_PS_TWELVEBYTES) {
if (ffurl_read_complete(h, buf, 4) != 4) if (ffurl_read_complete(h, buf, 4) != 4)
return AVERROR(EIO); return AVERROR(EIO);
size += 4; written += 4;
extra = AV_RL32(buf); extra = AV_RL32(buf);
} }
} }
...@@ -199,36 +199,36 @@ int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size, ...@@ -199,36 +199,36 @@ int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
timestamp += prev_pkt[channel_id].timestamp; timestamp += prev_pkt[channel_id].timestamp;
if ((ret = ff_rtmp_packet_create(p, channel_id, type, timestamp, if ((ret = ff_rtmp_packet_create(p, channel_id, type, timestamp,
data_size)) < 0) size)) < 0)
return ret; return ret;
p->extra = extra; p->extra = extra;
// save history // save history
prev_pkt[channel_id].channel_id = channel_id; prev_pkt[channel_id].channel_id = channel_id;
prev_pkt[channel_id].type = type; prev_pkt[channel_id].type = type;
prev_pkt[channel_id].data_size = data_size; prev_pkt[channel_id].size = size;
prev_pkt[channel_id].ts_delta = timestamp - prev_pkt[channel_id].timestamp; prev_pkt[channel_id].ts_delta = timestamp - prev_pkt[channel_id].timestamp;
prev_pkt[channel_id].timestamp = timestamp; prev_pkt[channel_id].timestamp = timestamp;
prev_pkt[channel_id].extra = extra; prev_pkt[channel_id].extra = extra;
while (data_size > 0) { while (size > 0) {
int toread = FFMIN(data_size, chunk_size); int toread = FFMIN(size, chunk_size);
if (ffurl_read_complete(h, p->data + offset, toread) != toread) { if (ffurl_read_complete(h, p->data + offset, toread) != toread) {
ff_rtmp_packet_destroy(p); ff_rtmp_packet_destroy(p);
return AVERROR(EIO); return AVERROR(EIO);
} }
data_size -= chunk_size; size -= chunk_size;
offset += chunk_size; offset += chunk_size;
size += chunk_size; written += chunk_size;
if (data_size > 0) { if (size > 0) {
if ((ret = ffurl_read_complete(h, &t, 1)) < 0) { // marker if ((ret = ffurl_read_complete(h, &t, 1)) < 0) { // marker
ff_rtmp_packet_destroy(p); ff_rtmp_packet_destroy(p);
return ret; return ret;
} }
size++; written++;
if (t != (0xC0 + channel_id)) if (t != (0xC0 + channel_id))
return -1; return -1;
} }
} }
return size; return written;
} }
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
...@@ -237,7 +237,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, ...@@ -237,7 +237,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; int written = 0;
int ret; int ret;
pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp; pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp;
...@@ -246,7 +246,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, ...@@ -246,7 +246,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
if (prev_pkt[pkt->channel_id].channel_id && if (prev_pkt[pkt->channel_id].channel_id &&
pkt->extra == prev_pkt[pkt->channel_id].extra) { pkt->extra == prev_pkt[pkt->channel_id].extra) {
if (pkt->type == prev_pkt[pkt->channel_id].type && if (pkt->type == prev_pkt[pkt->channel_id].type &&
pkt->data_size == prev_pkt[pkt->channel_id].data_size) { pkt->size == prev_pkt[pkt->channel_id].size) {
mode = RTMP_PS_FOURBYTES; mode = RTMP_PS_FOURBYTES;
if (pkt->ts_delta == prev_pkt[pkt->channel_id].ts_delta) if (pkt->ts_delta == prev_pkt[pkt->channel_id].ts_delta)
mode = RTMP_PS_ONEBYTE; mode = RTMP_PS_ONEBYTE;
...@@ -270,7 +270,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, ...@@ -270,7 +270,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
timestamp = pkt->ts_delta; timestamp = pkt->ts_delta;
bytestream_put_be24(&p, timestamp >= 0xFFFFFF ? 0xFFFFFF : timestamp); bytestream_put_be24(&p, timestamp >= 0xFFFFFF ? 0xFFFFFF : timestamp);
if (mode != RTMP_PS_FOURBYTES) { if (mode != RTMP_PS_FOURBYTES) {
bytestream_put_be24(&p, pkt->data_size); bytestream_put_be24(&p, pkt->size);
bytestream_put_byte(&p, pkt->type); bytestream_put_byte(&p, pkt->type);
if (mode == RTMP_PS_TWELVEBYTES) if (mode == RTMP_PS_TWELVEBYTES)
bytestream_put_le32(&p, pkt->extra); bytestream_put_le32(&p, pkt->extra);
...@@ -281,7 +281,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, ...@@ -281,7 +281,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
// save history // save history
prev_pkt[pkt->channel_id].channel_id = pkt->channel_id; prev_pkt[pkt->channel_id].channel_id = pkt->channel_id;
prev_pkt[pkt->channel_id].type = pkt->type; prev_pkt[pkt->channel_id].type = pkt->type;
prev_pkt[pkt->channel_id].data_size = pkt->data_size; prev_pkt[pkt->channel_id].size = pkt->size;
prev_pkt[pkt->channel_id].timestamp = pkt->timestamp; prev_pkt[pkt->channel_id].timestamp = pkt->timestamp;
if (mode != RTMP_PS_TWELVEBYTES) { if (mode != RTMP_PS_TWELVEBYTES) {
prev_pkt[pkt->channel_id].ts_delta = pkt->ts_delta; prev_pkt[pkt->channel_id].ts_delta = pkt->ts_delta;
...@@ -292,20 +292,20 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, ...@@ -292,20 +292,20 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
if ((ret = ffurl_write(h, pkt_hdr, p - pkt_hdr)) < 0) if ((ret = ffurl_write(h, pkt_hdr, p - pkt_hdr)) < 0)
return ret; return ret;
size = p - pkt_hdr + pkt->data_size; written = p - pkt_hdr + pkt->size;
while (off < pkt->data_size) { while (off < pkt->size) {
int towrite = FFMIN(chunk_size, pkt->data_size - off); int towrite = FFMIN(chunk_size, pkt->size - off);
if ((ret = ffurl_write(h, pkt->data + off, towrite)) < 0) if ((ret = ffurl_write(h, pkt->data + off, towrite)) < 0)
return ret; return ret;
off += towrite; off += towrite;
if (off < pkt->data_size) { if (off < pkt->size) {
uint8_t marker = 0xC0 | pkt->channel_id; uint8_t marker = 0xC0 | pkt->channel_id;
if ((ret = ffurl_write(h, &marker, 1)) < 0) if ((ret = ffurl_write(h, &marker, 1)) < 0)
return ret; return ret;
size++; written++;
} }
} }
return size; return written;
} }
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type, int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,
...@@ -316,7 +316,7 @@ int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type, ...@@ -316,7 +316,7 @@ int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,
if (!pkt->data) if (!pkt->data)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
pkt->data_size = size; pkt->size = size;
pkt->channel_id = channel_id; pkt->channel_id = channel_id;
pkt->type = type; pkt->type = type;
pkt->timestamp = timestamp; pkt->timestamp = timestamp;
...@@ -331,7 +331,7 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt) ...@@ -331,7 +331,7 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt)
if (!pkt) if (!pkt)
return; return;
av_freep(&pkt->data); av_freep(&pkt->data);
pkt->data_size = 0; pkt->size = 0;
} }
int ff_amf_tag_size(const uint8_t *data, const uint8_t *data_end) int ff_amf_tag_size(const uint8_t *data, const uint8_t *data_end)
...@@ -503,9 +503,9 @@ static void amf_tag_contents(void *ctx, const uint8_t *data, ...@@ -503,9 +503,9 @@ static void amf_tag_contents(void *ctx, const uint8_t *data,
void ff_rtmp_packet_dump(void *ctx, RTMPPacket *p) void ff_rtmp_packet_dump(void *ctx, RTMPPacket *p)
{ {
av_log(ctx, AV_LOG_DEBUG, "RTMP packet type '%s'(%d) for channel %d, timestamp %d, extra field %d size %d\n", av_log(ctx, AV_LOG_DEBUG, "RTMP packet type '%s'(%d) for channel %d, timestamp %d, extra field %d size %d\n",
rtmp_packet_type(p->type), p->type, p->channel_id, p->timestamp, p->extra, p->data_size); rtmp_packet_type(p->type), p->type, p->channel_id, p->timestamp, p->extra, p->size);
if (p->type == RTMP_PT_INVOKE || p->type == RTMP_PT_NOTIFY) { if (p->type == RTMP_PT_INVOKE || p->type == RTMP_PT_NOTIFY) {
uint8_t *src = p->data, *src_end = p->data + p->data_size; uint8_t *src = p->data, *src_end = p->data + p->size;
while (src < src_end) { while (src < src_end) {
int sz; int sz;
amf_tag_contents(ctx, src, src_end); amf_tag_contents(ctx, src, src_end);
...@@ -520,7 +520,7 @@ void ff_rtmp_packet_dump(void *ctx, RTMPPacket *p) ...@@ -520,7 +520,7 @@ void ff_rtmp_packet_dump(void *ctx, RTMPPacket *p)
av_log(ctx, AV_LOG_DEBUG, "Client BW = %d\n", AV_RB32(p->data)); av_log(ctx, AV_LOG_DEBUG, "Client BW = %d\n", AV_RB32(p->data));
} else if (p->type != RTMP_PT_AUDIO && p->type != RTMP_PT_VIDEO && p->type != RTMP_PT_METADATA) { } else if (p->type != RTMP_PT_AUDIO && p->type != RTMP_PT_VIDEO && p->type != RTMP_PT_METADATA) {
int i; int i;
for (i = 0; i < p->data_size; i++) for (i = 0; i < p->size; i++)
av_log(ctx, AV_LOG_DEBUG, " %02X", p->data[i]); av_log(ctx, AV_LOG_DEBUG, " %02X", p->data[i]);
av_log(ctx, AV_LOG_DEBUG, "\n"); av_log(ctx, AV_LOG_DEBUG, "\n");
} }
......
...@@ -81,7 +81,7 @@ typedef struct RTMPPacket { ...@@ -81,7 +81,7 @@ typedef struct RTMPPacket {
uint32_t ts_delta; ///< timestamp increment to the previous one in milliseconds (latter only for media packets) uint32_t ts_delta; ///< timestamp increment to the previous one in milliseconds (latter only for media packets)
uint32_t extra; ///< probably an additional channel ID used during streaming data uint32_t extra; ///< probably an additional channel ID used during streaming data
uint8_t *data; ///< packet payload uint8_t *data; ///< packet payload
int data_size; ///< packet payload size int size; ///< packet payload size
} RTMPPacket; } RTMPPacket;
/** /**
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment