#include "rtpdec_formats.h"
#include "rtsp.h"
#include "asf.h"
+#include "avio_internal.h"
/**
* From MSDN 2.2.1.4, we learn that ASF data packets over RTP should not
}
/**
- * The following code is basically a buffered ByteIOContext,
+ * The following code is basically a buffered AVIOContext,
* with the added benefit of returning -EAGAIN (instead of 0)
* on packet boundaries, such that the ASF demuxer can return
* safely and resume business at the next packet.
return AVERROR(EAGAIN);
}
-static void init_packetizer(ByteIOContext *pb, uint8_t *buf, int len)
+static void init_packetizer(AVIOContext *pb, uint8_t *buf, int len)
{
- init_put_byte(pb, buf, len, 0, NULL, packetizer_read, NULL, NULL);
+ ffio_init_context(pb, buf, len, 0, NULL, packetizer_read, NULL, NULL);
/* this "fills" the buffer with its current content */
pb->pos = len;
{
int ret = 0;
if (av_strstart(p, "pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,", &p)) {
- ByteIOContext pb;
+ AVIOContext pb;
RTSPState *rt = s->priv_data;
int len = strlen(p) * 6 / 8;
char *buf = av_mallocz(len);
av_close_input_stream(rt->asf_ctx);
rt->asf_ctx = NULL;
}
- ret = av_open_input_stream(&rt->asf_ctx, &pb, "", &asf_demuxer, NULL);
+ ret = av_open_input_stream(&rt->asf_ctx, &pb, "", &ff_asf_demuxer, NULL);
if (ret < 0)
return ret;
- rt->asf_pb_pos = url_ftell(&pb);
+ av_metadata_copy(&s->metadata, rt->asf_ctx->metadata, 0);
+ rt->asf_pb_pos = avio_tell(&pb);
av_free(buf);
rt->asf_ctx->pb = NULL;
}
}
struct PayloadContext {
- ByteIOContext *pktbuf, pb;
+ AVIOContext *pktbuf, pb;
uint8_t *buf;
};
uint32_t *timestamp,
const uint8_t *buf, int len, int flags)
{
- ByteIOContext *pb = &asf->pb;
+ AVIOContext *pb = &asf->pb;
int res, mflags, len_off;
RTSPState *rt = s->priv_data;
av_freep(&asf->buf);
- init_put_byte(pb, buf, len, 0, NULL, NULL, NULL, NULL);
+ ffio_init_context(pb, buf, len, 0, NULL, NULL, NULL, NULL);
- while (url_ftell(pb) + 4 < len) {
- int start_off = url_ftell(pb);
+ while (avio_tell(pb) + 4 < len) {
+ int start_off = avio_tell(pb);
- mflags = get_byte(pb);
+ mflags = avio_r8(pb);
if (mflags & 0x80)
flags |= RTP_FLAG_KEY;
- len_off = get_be24(pb);
+ len_off = avio_rb24(pb);
if (mflags & 0x20) /**< relative timestamp */
- url_fskip(pb, 4);
+ avio_skip(pb, 4);
if (mflags & 0x10) /**< has duration */
- url_fskip(pb, 4);
+ avio_skip(pb, 4);
if (mflags & 0x8) /**< has location ID */
- url_fskip(pb, 4);
- off = url_ftell(pb);
+ avio_skip(pb, 4);
+ off = avio_tell(pb);
if (!(mflags & 0x40)) {
/**
* ASF packet. This is used to spread one ASF packet over
* multiple RTP packets.
*/
- if (asf->pktbuf && len_off != url_ftell(asf->pktbuf)) {
+ if (asf->pktbuf && len_off != avio_tell(asf->pktbuf)) {
uint8_t *p;
- url_close_dyn_buf(asf->pktbuf, &p);
+ avio_close_dyn_buf(asf->pktbuf, &p);
asf->pktbuf = NULL;
av_free(p);
}
if (!len_off && !asf->pktbuf &&
- (res = url_open_dyn_buf(&asf->pktbuf)) < 0)
+ (res = avio_open_dyn_buf(&asf->pktbuf)) < 0)
return res;
if (!asf->pktbuf)
return AVERROR(EIO);
- put_buffer(asf->pktbuf, buf + off, len - off);
- url_fskip(pb, len - off);
+ avio_write(asf->pktbuf, buf + off, len - off);
+ avio_skip(pb, len - off);
if (!(flags & RTP_FLAG_MARKER))
return -1;
- out_len = url_close_dyn_buf(asf->pktbuf, &asf->buf);
+ out_len = avio_close_dyn_buf(asf->pktbuf, &asf->buf);
asf->pktbuf = NULL;
} else {
/**
int prev_len = out_len;
out_len += cur_len;
asf->buf = av_realloc(asf->buf, out_len);
- memcpy(asf->buf + prev_len, buf + off, cur_len);
- url_fskip(pb, cur_len);
+ memcpy(asf->buf + prev_len, buf + off,
+ FFMIN(cur_len, len - off));
+ avio_skip(pb, cur_len);
}
}
int i;
res = av_read_packet(rt->asf_ctx, pkt);
- rt->asf_pb_pos = url_ftell(pb);
+ rt->asf_pb_pos = avio_tell(pb);
if (res != 0)
break;
for (i = 0; i < s->nb_streams; i++) {
{
if (asf->pktbuf) {
uint8_t *p = NULL;
- url_close_dyn_buf(asf->pktbuf, &p);
+ avio_close_dyn_buf(asf->pktbuf, &p);
asf->pktbuf = NULL;
av_free(p);
}
.open = asfrtp_new_context, \
.close = asfrtp_free_context, \
.parse_packet = asfrtp_parse_packet, \
-};
+}
RTP_ASF_HANDLER(asf_pfv, "x-asf-pf", AVMEDIA_TYPE_VIDEO);
RTP_ASF_HANDLER(asf_pfa, "x-asf-pf", AVMEDIA_TYPE_AUDIO);