mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Split url_open and url_open_protocol into url_alloc and url_connect
Originally committed as revision 23704 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
6c4cbc8d50
commit
ffbb289a1d
@ -22,7 +22,7 @@
|
|||||||
#define AVFORMAT_AVFORMAT_H
|
#define AVFORMAT_AVFORMAT_H
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MAJOR 52
|
#define LIBAVFORMAT_VERSION_MAJOR 52
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 69
|
#define LIBAVFORMAT_VERSION_MINOR 70
|
||||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
#define LIBAVFORMAT_VERSION_MICRO 0
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
|
@ -94,7 +94,7 @@ int register_protocol(URLProtocol *protocol)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int url_open_protocol (URLContext **puc, struct URLProtocol *up,
|
static int url_alloc_for_protocol (URLContext **puc, struct URLProtocol *up,
|
||||||
const char *filename, int flags)
|
const char *filename, int flags)
|
||||||
{
|
{
|
||||||
URLContext *uc;
|
URLContext *uc;
|
||||||
@ -118,17 +118,7 @@ int url_open_protocol (URLContext **puc, struct URLProtocol *up,
|
|||||||
uc->flags = flags;
|
uc->flags = flags;
|
||||||
uc->is_streamed = 0; /* default = not streamed */
|
uc->is_streamed = 0; /* default = not streamed */
|
||||||
uc->max_packet_size = 0; /* default: stream file */
|
uc->max_packet_size = 0; /* default: stream file */
|
||||||
err = up->url_open(uc, filename, flags);
|
|
||||||
if (err < 0) {
|
|
||||||
av_free(uc);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
//We must be careful here as url_seek() could be slow, for example for http
|
|
||||||
if( (flags & (URL_WRONLY | URL_RDWR))
|
|
||||||
|| !strcmp(up->name, "file"))
|
|
||||||
if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0)
|
|
||||||
uc->is_streamed= 1;
|
|
||||||
*puc = uc;
|
*puc = uc;
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
@ -139,7 +129,38 @@ int url_open_protocol (URLContext **puc, struct URLProtocol *up,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int url_open(URLContext **puc, const char *filename, int flags)
|
int url_connect(URLContext* uc)
|
||||||
|
{
|
||||||
|
int err = uc->prot->url_open(uc, uc->filename, uc->flags);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
uc->is_connected = 1;
|
||||||
|
//We must be careful here as url_seek() could be slow, for example for http
|
||||||
|
if( (uc->flags & (URL_WRONLY | URL_RDWR))
|
||||||
|
|| !strcmp(uc->prot->name, "file"))
|
||||||
|
if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0)
|
||||||
|
uc->is_streamed= 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int url_open_protocol (URLContext **puc, struct URLProtocol *up,
|
||||||
|
const char *filename, int flags)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = url_alloc_for_protocol(puc, up, filename, flags);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
ret = url_connect(*puc);
|
||||||
|
if (!ret)
|
||||||
|
return 0;
|
||||||
|
fail:
|
||||||
|
url_close(*puc);
|
||||||
|
*puc = NULL;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int url_alloc(URLContext **puc, const char *filename, int flags)
|
||||||
{
|
{
|
||||||
URLProtocol *up;
|
URLProtocol *up;
|
||||||
const char *p;
|
const char *p;
|
||||||
@ -166,13 +187,27 @@ int url_open(URLContext **puc, const char *filename, int flags)
|
|||||||
up = first_protocol;
|
up = first_protocol;
|
||||||
while (up != NULL) {
|
while (up != NULL) {
|
||||||
if (!strcmp(proto_str, up->name))
|
if (!strcmp(proto_str, up->name))
|
||||||
return url_open_protocol (puc, up, filename, flags);
|
return url_alloc_for_protocol (puc, up, filename, flags);
|
||||||
up = up->next;
|
up = up->next;
|
||||||
}
|
}
|
||||||
*puc = NULL;
|
*puc = NULL;
|
||||||
return AVERROR(ENOENT);
|
return AVERROR(ENOENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int url_open(URLContext **puc, const char *filename, int flags)
|
||||||
|
{
|
||||||
|
int ret = url_alloc(puc, filename, flags);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
ret = url_connect(*puc);
|
||||||
|
if (!ret)
|
||||||
|
return 0;
|
||||||
|
fail:
|
||||||
|
url_close(*puc);
|
||||||
|
*puc = NULL;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int url_read(URLContext *h, unsigned char *buf, int size)
|
int url_read(URLContext *h, unsigned char *buf, int size)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -232,7 +267,7 @@ int url_close(URLContext *h)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
if (!h) return 0; /* can happen when url_open fails */
|
if (!h) return 0; /* can happen when url_open fails */
|
||||||
|
|
||||||
if (h->prot->url_close)
|
if (h->is_connected && h->prot->url_close)
|
||||||
ret = h->prot->url_close(h);
|
ret = h->prot->url_close(h);
|
||||||
#if CONFIG_NETWORK
|
#if CONFIG_NETWORK
|
||||||
ff_network_close();
|
ff_network_close();
|
||||||
|
@ -51,6 +51,7 @@ typedef struct URLContext {
|
|||||||
int max_packet_size; /**< if non zero, the stream is packetized with this max packet size */
|
int max_packet_size; /**< if non zero, the stream is packetized with this max packet size */
|
||||||
void *priv_data;
|
void *priv_data;
|
||||||
char *filename; /**< specified URL */
|
char *filename; /**< specified URL */
|
||||||
|
int is_connected;
|
||||||
} URLContext;
|
} URLContext;
|
||||||
|
|
||||||
typedef struct URLPollEntry {
|
typedef struct URLPollEntry {
|
||||||
@ -79,6 +80,24 @@ typedef int URLInterruptCB(void);
|
|||||||
int url_open_protocol (URLContext **puc, struct URLProtocol *up,
|
int url_open_protocol (URLContext **puc, struct URLProtocol *up,
|
||||||
const char *url, int flags);
|
const char *url, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an URLContext for accessing to the resource indicated by
|
||||||
|
* url, but doesn't initiate the connection yet.
|
||||||
|
*
|
||||||
|
* @param puc pointer to the location where, in case of success, the
|
||||||
|
* function puts the pointer to the created URLContext
|
||||||
|
* @param flags flags which control how the resource indicated by url
|
||||||
|
* is to be opened
|
||||||
|
* @return 0 in case of success, a negative value corresponding to an
|
||||||
|
* AVERROR code in case of failure
|
||||||
|
*/
|
||||||
|
int url_alloc(URLContext **h, const char *url, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect an URLContext that has been allocated by url_alloc
|
||||||
|
*/
|
||||||
|
int url_connect(URLContext *h);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an URLContext for accessing to the resource indicated by
|
* Creates an URLContext for accessing to the resource indicated by
|
||||||
* url, and opens it.
|
* url, and opens it.
|
||||||
|
Loading…
Reference in New Issue
Block a user