For every av_open_input_file you will have file_open called once. When you first receive URLContext (along with pseudo filename) in file_open you need to "connect" it with some data stream. For this purpose you have URLContext->priv_data. Create CContext object for every new stream and keep it in URLContext->priv_data. Later, when file_read, file_write or file_seek is called, let CContext stored in URLContext->priv_data do the job.
On Wed, Jun 9, 2010 at 7:35 PM, Mark Kenna <[email protected]> wrote: > On 09/06/2010 15:20, Eugene Mymrin wrote: >> >> Similar code works very well for me: >> >> class CContext >> { >> public: >> int OnDataRequested(uint8_t* p, int n) >> { >> } >> int64_t OnSeekRequested(int64_t offset, int whence) >> { >> } >> }; >> >> static int file_open(URLContext *h, const char *filename, int flags) >> { >> CContext* pContext =<static variable where CContext is temporarily >> stored>; >> h->priv_data = (void*) pContext; >> return 0; >> } >> >> static int file_read(URLContext *h, unsigned char *buf, int size) >> { >> CContext* p = (CContext*) h->priv_data; >> return p->OnDataRequested(buf, size); >> } >> >> static int file_write(URLContext *h, unsigned char *buf, int size) >> { >> return 0; >> } >> >> static int64_t file_seek(URLContext *h, int64_t pos, int whence) >> { >> CContext* p = (CContext*) h->priv_data; >> return p->OnSeekRequested(pos, whence); >> } >> >> static int file_close(URLContext *h) >> { >> return 0; >> } >> >> static int file_get_handle(URLContext *h) >> { >> return (intptr_t) h->priv_data; >> } >> >> On Wed, Jun 9, 2010 at 4:00 PM, Mark Kenna >> <[email protected]> wrote: >> >>> >>> Hi All >>> >>> I have a problem whilst implementing a custom URLProtocol for use with >>> av_open_input_file(...). I am trying to use the protocol so that a custom >>> url_read method will receive data from a callback which the user can >>> supply >>> from the calling application. To illustrate, I have the following methods >>> for the url_open and url_read (which are both static member functions of >>> an >>> unmanaged C++ class) >>> >>> int BufferProtocol::BufferOpen(URLContext *h, const char *pseudofilename, >>> int flags) >>> { >>> //setup the buffer >>> BUFFER *buffer = new BUFFER(); >>> buffer->buflen = BUFFERLENGTH; >>> buffer->offset = 0; >>> buffer->buf = new unsigned char[BUFFERLENGTH]; >>> memset(buffer->buf, 0, BUFFERLENGTH); >>> >>> >>> //assign the URLContext's private data to be the buffer >>> h->priv_data = buffer; >>> >>> return 1; >>> } >>> >>> int BufferProtocol::BufferRead(URLContext *h, unsigned char *buf, int >>> size) >>> { >>> BUFFER *buffer = (BUFFER*)h->priv_data; >>> >>> int amountRead = 1024; >>> unsigned char* data = HELP_HERE_PLEASE >>> ... >>> ... >>> >>> } >>> >>> So in the above Read method I want to invoke a callback which will prompt >>> for a certain number of bytes and return the received data (which can be >>> put >>> into *buf). I understand how this would work with a typical callback but >>> I >>> have one more problem - because I am using Class members for the >>> URLProtocol >>> they have to be static, also the application that is going to use this >>> will >>> probably call av_open_input_file(...) more than once (for multiple input >>> buffer sources) and because the methods are all static I will not be able >>> to >>> tell which buffer the callback refers to. This is kind of confusing to >>> describe and I hope that my point is clear enough to understand. >>> >>> Thanks, >>> Mark. >>> >>> _______________________________________________ >>> libav-user mailing list >>> [email protected] >>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>> >>> >> >> _______________________________________________ >> libav-user mailing list >> [email protected] >> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >> > > Hi > > This is still a problem for me because of this: >> >> CContext* pContext =<static variable where CContext is temporarily >> stored>; > > If that static variable is changed in order to start another buffer, it will > change the pContext in h->priv_data (or am I wrong). How does this work if > you want to open two lots of your custom protocol in the same application? > > Thanks, > Mark. > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
