[Libav-user] SDP RTP using Custom I/O
Vitsas Nikolaos
p3070011 at dias.aueb.gr
Thu Oct 3 13:34:55 CEST 2013
Hi guys.
I'm currently encoding a H264 stream into RTP packets using
libavformat and storing them in memory using avio_open_dyn and
avio_close_dyn. The thing is that those packets are going to reach a
destination going through some intermediate peers using a custom P2P
structure. Everything reaches the destination correctly and as
expected, but I can' t get the custom I/O setup on the destination to
work correctly so that the packets can be decoded.
Here' s what I am doing right now. sdp_desc holds the SDP description
and custom_queue is a queue full of RTP Packets as encoded by the
source.
// C O D E
fmt_ctx = avformat_alloc_context();
if(!fmt_ctx) {
return false;
}
io_buffer =
(BYTE*)av_malloc((IO_BUFFER_SIZE+FF_INPUT_BUFFER_PADDING_SIZE)*sizeof(BYTE));
BYTE* sdp_buffer =
(BYTE*)av_malloc((strlen(sdp_desc)+FF_INPUT_BUFFER_PADDING_SIZE)*sizeof(BYTE));
sdp_io_context = avio_alloc_context(sdp_buffer, strlen(sdp_desc), 0,
nfo, &ReadFunc, NULL, NULL);
avio_open2(&sdp_io_context, "", AVIO_FLAG_READ, NULL, NULL);
if(!sdp_io_context)
return false;
sdp_io_context->seekable = 0;
sdp_io_context->write_flag = 0;
strcpy((char*)sdp_buffer, sdp_desc);
AVProbeData probeData;
probeData.buf = sdp_buffer;
probeData.buf_size = strlen(sdp_desc);
probeData.filename = "";
fmt_ctx->pb = sdp_io_context;
fmt_ctx->flags = AVFMT_FLAG_CUSTOM_IO;
fmt_ctx->iformat = av_probe_input_format(&probeData, 1);
AVDictionary *options = NULL;
av_dict_set(&options, "sdpflags", "custom_io", 0);
int err = avformat_open_input(&fmt_ctx, "", NULL, &options);
//int err = avformat_open_input(&fmt_ctx, "", fmt_ctx->iformat,
&options);
io_context = avio_alloc_context(io_buffer, IO_BUFFER_SIZE, 1,
custom_queue, &ReadRTPFunc, &WriteRTPFunc, NULL);
avio_open2(&io_context, "", AVIO_FLAG_READ_WRITE, NULL, NULL);
if(!io_context)
return false;
io_context->seekable = 0;
AVInputFormat* fr = av_find_input_format("rtp");
fmt_ctx->pb = io_context;
fmt_ctx->iformat = fr;
video_dec_ctx = fmt_ctx->streams[0]->codec;
video_dec = avcodec_find_decoder(video_dec_ctx->codec_id);
if (!video_dec) {
printf("Failed to find %s codec\n",
"H264");
return false;
}
if ((ret = avcodec_open2(video_dec_ctx, video_dec, NULL)) < 0) {
printf("Failed to open %s codec\n",
"H264");
return false;
}
thre ReadFunc looks like this
static int ReadFunc(void *opaque, uint8_t *buf, int buf_size) {
char* sdp = (char*)opaque;
strcpy((char*)buf, sdp);
return strlen(sdp);
}
ReadFunc is called and the AVInputFormat in the AvFormatContext
correctly gets initialized to SDP and the codec is correctly set to
H264. However, ReadFunc is called again requesting more data and the
only thing I can do, is return 0 or the same sdp data. Despite the
above, av_open_input returns with no error but when I make the switch
to the RTP AVIOContext, av_read_frame does not do anything and just
returns after a while not calling any of my other callbacks.
Any help would be appreciated. Thank you.
More information about the Libav-user
mailing list