mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/aviobuf: Don't use incompatible function pointer type for call
It is undefined behaviour even in cases where it works (it works because both are pointers). Instead change the functions involved to use the type expected by the AVIO-API and add inline wrappers for our internal callers. Reviewed-by: Tomas Härdin <git@haerdin.se> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
e26506cb3b
commit
e8704a8f60
|
@ -392,8 +392,10 @@ static inline int retry_transfer_wrapper(URLContext *h, uint8_t *buf,
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffurl_read(URLContext *h, unsigned char *buf, int size)
|
int ffurl_read2(void *urlcontext, uint8_t *buf, int size)
|
||||||
{
|
{
|
||||||
|
URLContext *h = urlcontext;
|
||||||
|
|
||||||
if (!(h->flags & AVIO_FLAG_READ))
|
if (!(h->flags & AVIO_FLAG_READ))
|
||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read);
|
return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read);
|
||||||
|
@ -406,8 +408,10 @@ int ffurl_read_complete(URLContext *h, unsigned char *buf, int size)
|
||||||
return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read);
|
return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
|
int ffurl_write2(void *urlcontext, uint8_t *buf, int size)
|
||||||
{
|
{
|
||||||
|
URLContext *h = urlcontext;
|
||||||
|
|
||||||
if (!(h->flags & AVIO_FLAG_WRITE))
|
if (!(h->flags & AVIO_FLAG_WRITE))
|
||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
/* avoid sending too big packets */
|
/* avoid sending too big packets */
|
||||||
|
@ -419,8 +423,9 @@ int ffurl_write(URLContext *h, const unsigned char *buf, int size)
|
||||||
h->prot->url_write);
|
h->prot->url_write);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t ffurl_seek(URLContext *h, int64_t pos, int whence)
|
int64_t ffurl_seek2(void *urlcontext, int64_t pos, int whence)
|
||||||
{
|
{
|
||||||
|
URLContext *h = urlcontext;
|
||||||
int64_t ret;
|
int64_t ret;
|
||||||
|
|
||||||
if (!h->prot->url_seek)
|
if (!h->prot->url_seek)
|
||||||
|
@ -641,8 +646,10 @@ int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
|
||||||
return h->prot->url_get_multi_file_handle(h, handles, numhandles);
|
return h->prot->url_get_multi_file_handle(h, handles, numhandles);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffurl_get_short_seek(URLContext *h)
|
int ffurl_get_short_seek(void *urlcontext)
|
||||||
{
|
{
|
||||||
|
URLContext *h = urlcontext;
|
||||||
|
|
||||||
if (!h || !h->prot || !h->prot->url_get_short_seek)
|
if (!h || !h->prot || !h->prot->url_get_short_seek)
|
||||||
return AVERROR(ENOSYS);
|
return AVERROR(ENOSYS);
|
||||||
return h->prot->url_get_short_seek(h);
|
return h->prot->url_get_short_seek(h);
|
||||||
|
|
|
@ -976,9 +976,7 @@ int ffio_fdopen(AVIOContext **s, URLContext *h)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
*s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h,
|
*s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h,
|
||||||
(int (*)(void *, uint8_t *, int)) ffurl_read,
|
ffurl_read2, ffurl_write2, ffurl_seek2);
|
||||||
(int (*)(void *, uint8_t *, int)) ffurl_write,
|
|
||||||
(int64_t (*)(void *, int64_t, int))ffurl_seek);
|
|
||||||
if (!*s) {
|
if (!*s) {
|
||||||
av_freep(&buffer);
|
av_freep(&buffer);
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
@ -1006,7 +1004,7 @@ int ffio_fdopen(AVIOContext **s, URLContext *h)
|
||||||
if (h->prot->url_read_seek)
|
if (h->prot->url_read_seek)
|
||||||
(*s)->seekable |= AVIO_SEEKABLE_TIME;
|
(*s)->seekable |= AVIO_SEEKABLE_TIME;
|
||||||
}
|
}
|
||||||
((FFIOContext*)(*s))->short_seek_get = (int (*)(void *))ffurl_get_short_seek;
|
((FFIOContext*)(*s))->short_seek_get = ffurl_get_short_seek;
|
||||||
(*s)->av_class = &ff_avio_class;
|
(*s)->av_class = &ff_avio_class;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,6 +170,7 @@ int ffurl_accept(URLContext *s, URLContext **c);
|
||||||
*/
|
*/
|
||||||
int ffurl_handshake(URLContext *c);
|
int ffurl_handshake(URLContext *c);
|
||||||
|
|
||||||
|
int ffurl_read2(void *urlcontext, uint8_t *buf, int size);
|
||||||
/**
|
/**
|
||||||
* Read up to size bytes from the resource accessed by h, and store
|
* Read up to size bytes from the resource accessed by h, and store
|
||||||
* the read bytes in buf.
|
* the read bytes in buf.
|
||||||
|
@ -179,7 +180,10 @@ int ffurl_handshake(URLContext *c);
|
||||||
* indicates that it is not possible to read more from the accessed
|
* indicates that it is not possible to read more from the accessed
|
||||||
* resource (except if the value of the size argument is also zero).
|
* resource (except if the value of the size argument is also zero).
|
||||||
*/
|
*/
|
||||||
int ffurl_read(URLContext *h, unsigned char *buf, int size);
|
static inline int ffurl_read(URLContext *h, uint8_t *buf, int size)
|
||||||
|
{
|
||||||
|
return ffurl_read2(h, buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read as many bytes as possible (up to size), calling the
|
* Read as many bytes as possible (up to size), calling the
|
||||||
|
@ -190,14 +194,19 @@ int ffurl_read(URLContext *h, unsigned char *buf, int size);
|
||||||
*/
|
*/
|
||||||
int ffurl_read_complete(URLContext *h, unsigned char *buf, int size);
|
int ffurl_read_complete(URLContext *h, unsigned char *buf, int size);
|
||||||
|
|
||||||
|
int ffurl_write2(void *urlcontext, uint8_t *buf, int size);
|
||||||
/**
|
/**
|
||||||
* Write size bytes from buf to the resource accessed by h.
|
* Write size bytes from buf to the resource accessed by h.
|
||||||
*
|
*
|
||||||
* @return the number of bytes actually written, or a negative value
|
* @return the number of bytes actually written, or a negative value
|
||||||
* corresponding to an AVERROR code in case of failure
|
* corresponding to an AVERROR code in case of failure
|
||||||
*/
|
*/
|
||||||
int ffurl_write(URLContext *h, const unsigned char *buf, int size);
|
static inline int ffurl_write(URLContext *h, const uint8_t *buf, int size)
|
||||||
|
{
|
||||||
|
return ffurl_write2(h, (uint8_t*)buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t ffurl_seek2(void *urlcontext, int64_t pos, int whence);
|
||||||
/**
|
/**
|
||||||
* Change the position that will be used by the next read/write
|
* Change the position that will be used by the next read/write
|
||||||
* operation on the resource accessed by h.
|
* operation on the resource accessed by h.
|
||||||
|
@ -212,7 +221,10 @@ int ffurl_write(URLContext *h, const unsigned char *buf, int size);
|
||||||
* the beginning of the file. You can use this feature together with
|
* the beginning of the file. You can use this feature together with
|
||||||
* SEEK_CUR to read the current file position.
|
* SEEK_CUR to read the current file position.
|
||||||
*/
|
*/
|
||||||
int64_t ffurl_seek(URLContext *h, int64_t pos, int whence);
|
static inline int64_t ffurl_seek(URLContext *h, int64_t pos, int whence)
|
||||||
|
{
|
||||||
|
return ffurl_seek2(h, pos, whence);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the resource accessed by the URLContext h, and free the
|
* Close the resource accessed by the URLContext h, and free the
|
||||||
|
@ -251,7 +263,7 @@ int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
|
||||||
*
|
*
|
||||||
* @return threshold (>0) on success or <=0 on error.
|
* @return threshold (>0) on success or <=0 on error.
|
||||||
*/
|
*/
|
||||||
int ffurl_get_short_seek(URLContext *h);
|
int ffurl_get_short_seek(void *urlcontext);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal the URLContext that we are done reading or writing the stream.
|
* Signal the URLContext that we are done reading or writing the stream.
|
||||||
|
|
Loading…
Reference in New Issue