On 17/09/13 08:58, Josh Allmann wrote:
> A given packet won't always come in contiguously; sometimes
> they may be broken up on chunk boundaries by packets of another
> channel.
>
> This support primarily involves tracking information about the
> data that's been read, so the reader can pick up where it left
> off for a given channel.
>
> As a side effect, we no longer over-report the bytes read if
> (toread = MIN(size, chunk_size)) == size
> ---
> libavformat/rtmppkt.c | 55
> ++++++++++++++++++++++++++++++++++++-----------
> libavformat/rtmppkt.h | 14 ++++++++++--
> libavformat/rtmpproto.c | 9 +++++---
> 3 files changed, 60 insertions(+), 18 deletions(-)
>
> diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c
> index 8f39122..7619d28 100644
> --- a/libavformat/rtmppkt.c
> +++ b/libavformat/rtmppkt.c
> @@ -130,28 +130,32 @@ int ff_amf_read_null(GetByteContext *bc)
> }
>
> int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
> - int chunk_size, RTMPPacket *prev_pkt)
> + int chunk_size, RTMPPacket *prev_pkt,
> + int *retry_header)
> {
> uint8_t hdr;
>
> - if (ffurl_read(h, &hdr, 1) != 1)
> + if (*retry_header >= 0) {
> + hdr = *retry_header & 0xFF;
> + *retry_header = -1;
> + } else if (ffurl_read(h, &hdr, 1) != 1)
> return AVERROR(EIO);
>
> - return ff_rtmp_packet_read_internal(h, p, chunk_size, prev_pkt, hdr);
> + return ff_rtmp_packet_read_internal(h, p, chunk_size, prev_pkt, hdr,
> retry_header);
> }
>
> int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int
> chunk_size,
> - RTMPPacket *prev_pkt, uint8_t hdr)
> + RTMPPacket *prev_pkt, uint8_t hdr,
> + int* retry_header)
> {
>
> uint8_t t, buf[16];
> - int channel_id, timestamp, size, offset = 0;
> + int channel_id, timestamp, size;
> uint32_t extra = 0;
> enum RTMPPacketType type;
> int written = 0;
> int ret;
>
> - written++;
> channel_id = hdr & 0x3F;
>
> if (channel_id < 2) { //special case for channel number >= 64
> @@ -198,9 +202,26 @@ int ff_rtmp_packet_read_internal(URLContext *h,
> RTMPPacket *p, int chunk_size,
> if (hdr != RTMP_PS_TWELVEBYTES)
> timestamp += prev_pkt[channel_id].timestamp;
>
> + if (!prev_pkt[channel_id].read) {
> if ((ret = ff_rtmp_packet_create(p, channel_id, type, timestamp,
> size)) < 0)
> return ret;
> + // include 1-byte header from ff_rtmp_packet_read
> + p->read = written + 1;
> + p->offset = 0;
> + } else {
> + // previous packet in this channel hasn't completed reading
> + RTMPPacket *prev = &prev_pkt[channel_id];
> + p->data = prev->data;
> + p->size = prev->size;
> + p->channel_id = prev->channel_id;
> + p->type = prev->type;
> + p->ts_delta = prev->ts_delta;
> + p->extra = prev->extra;
> + p->offset = prev->offset;
> + p->read = prev->read + written;
> + prev->data = NULL;
Why?
What happens when you fail below?
lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel