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