Hello!
I am trying to create a custom AVIOContext so that I can "catch" the output of 
FFmpeg and direct it where I need it (not a file).  I have done this 
successfully to the point of generating a playable video file (which I am 
sending to a file during development, but won't later.)  After the file is 
generated, however, I run into memory cleanup problems in avio_close().  The 
crash occurs even if I immediately call avio_close() after 
avio_alloc_context(), and I think I have an idea why:
I am passing an 'opaque' pointer to the avio_alloc_context() / AVIOContext 
which points back to my redirecting class/object so that my callback functions 
know where their object lives.  This certainly appears to work for me, so I was 
assuming that was the purpose of 'opaque', and I have it pointing to my own 
object type.
However, when I look at the source code in aviobuf.c, avio_close(), we have:
int avio_close(AVIOContext *s){    URLContext *h = s->opaque;
    av_free(s->buffer);    av_free(s);    return ffurl_close(h);}
Note that opaque is expected to have type 'URLContext *'.  I tracked my memory 
crash to the ffurl_close() line, so:
int ffurl_close(URLContext *h){    int ret = 0;    if (!h) return 0; /* can 
happen when ffurl_open fails */
    if (h->is_connected && h->prot->url_close)        ret = 
h->prot->url_close(h);#if CONFIG_NETWORK    ff_network_close();#endif    if 
(h->prot->priv_data_size)        av_free(h->priv_data);    av_free(h);    
return ret;}
And my problem becomes rather obvious - AVIOContext->opaque is expected to 
point to a structure of type URLContext for this close routine, not to a custom 
type to be passed in to my callback routines.  The code crashes when it tries 
to access h->prot, although all of the ffurl_close() will be problematic unless 
h (which is AVIOContext->opaque) references a URLContext structure.
I have no idea what the url_open(), ffurl_...(), etc. routines are used for, 
and can't think of any reason that I need them in my project.  However, I do 
need the opaque pointer sent to my callback routines.
A workaround would be to avoid calling avio_close() and instead call av_free() 
directly on the buffer and AVIOContext.  However, before I resort to a 
workaround, I wanted to check my understanding of the situation against people 
more familiar with FFmpeg's code?  Can you guys please verify or correct my 
interpretation of the matter?
Thanks,Wiley
                                          
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to