[Libav-user] avio read proxy

Pavel Sokolov pavel at sokolov.me
Thu Feb 7 15:00:10 CET 2013


For some reasons I need to implement universal avio proxy, which will 
support all ffmpeg protocols.
The main goal is to parse all avio_read traffic via some custom function.

So, I create custom context with direct i/o:

   AVIOContext* _ffmpeg_io_context = avio_alloc_context(NULL, 0,
                           0, // writeflag
                           this, //context (opaque)
                           readFunctionWrapper, //read
                           NULL , //write
                           seekFunctionWrapper );//seek
    _ffmpeg_io_context->direct = true;

After I open the original avio:

    AVIOContext*  _origAvio = NULL;
    avio_open2(&_origAvio, _url.c_str(), AVIO_FLAG_READ, NULL, NULL);
    _ffmpeg_io_context->seekable = _origAvio->seekable; /// Set to 
custom avio seekable flags from the original avio

My custom functions looks like this:

    int FFmpegIoProxy::readFunction(uint8_t* buf, int buf_size){
       int res = avio_read(_origAvio, buf, buf_size);
       if (res>0){
          ... do something with buf
       return buf;

    int64_t FFmpegIoProxy::seekFunction(int64_t offset, int whence){
       return avio_seek(_origAvio, offset, whence);

After I open avformat with custom i/o:

   _ffmpeg_format_context = avformat_alloc_context();
   _ffmpeg_format_context->pb=  _ffmpeg_io_context;
   avformat_open_input(&_ffmpeg_format_context, NULL, NULL, NULL);

Local (file://) url works fine, but when I try to open http:// protocol 
I see messages:

    [http @ 0x4b97c0] HTTP error 416 Requested Range Not Satisfiable

So, really it requesting out-of range data.

Is somebody knows, what is wrong? May be I need to set some more fields 
of my proxy avio?


With best regards, Pavel A. Sokolov
mobile: +7(921)419-1819
skype: pavel_a_sokolov

More information about the Libav-user mailing list