[Libav-user] SDP RTP using Custom I/O

Vitsas Nikolaos p3070011 at dias.aueb.gr
Sun Oct 6 18:42:32 CEST 2013


On Thu, 03 Oct 2013 14:34:55 +0300
  "Vitsas Nikolaos" <p3070011 at dias.aueb.gr> wrote:
> 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.
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user

To make things simpler, can someone at least verify that setting 
sdpflags=customio is enough for Custom RTP handling? Is there 
something else I need to do?



More information about the Libav-user mailing list