url.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /*
  2. * This file is part of FFmpeg.
  3. *
  4. * FFmpeg is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * FFmpeg is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with FFmpeg; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. /**
  19. * @file
  20. * unbuffered private I/O API
  21. */
  22. #ifndef AVFORMAT_URL_H
  23. #define AVFORMAT_URL_H
  24. #include "avio.h"
  25. #include "libavformat/version.h"
  26. #include "libavutil/dict.h"
  27. #include "libavutil/log.h"
  28. #define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */
  29. #define URL_PROTOCOL_FLAG_NETWORK 2 /*< The protocol uses network */
  30. extern const AVClass ffurl_context_class;
  31. typedef struct URLContext {
  32. const AVClass *av_class; /**< information for av_log(). Set by url_open(). */
  33. const struct URLProtocol *prot;
  34. void *priv_data;
  35. char *filename; /**< specified URL */
  36. int flags;
  37. int max_packet_size; /**< if non zero, the stream is packetized with this max packet size */
  38. int is_streamed; /**< true if streamed (no seek possible), default = false */
  39. int is_connected;
  40. AVIOInterruptCB interrupt_callback;
  41. int64_t rw_timeout; /**< maximum time to wait for (network) read/write operation completion, in mcs */
  42. const char *protocol_whitelist;
  43. const char *protocol_blacklist;
  44. int min_packet_size; /**< if non zero, the stream is packetized with this min packet size */
  45. } URLContext;
  46. typedef struct URLProtocol {
  47. const char *name;
  48. int (*url_open)( URLContext *h, const char *url, int flags);
  49. /**
  50. * This callback is to be used by protocols which open further nested
  51. * protocols. options are then to be passed to ffurl_open()/ffurl_connect()
  52. * for those nested protocols.
  53. */
  54. int (*url_open2)(URLContext *h, const char *url, int flags, AVDictionary **options);
  55. int (*url_accept)(URLContext *s, URLContext **c);
  56. int (*url_handshake)(URLContext *c);
  57. /**
  58. * Read data from the protocol.
  59. * If data is immediately available (even less than size), EOF is
  60. * reached or an error occurs (including EINTR), return immediately.
  61. * Otherwise:
  62. * In non-blocking mode, return AVERROR(EAGAIN) immediately.
  63. * In blocking mode, wait for data/EOF/error with a short timeout (0.1s),
  64. * and return AVERROR(EAGAIN) on timeout.
  65. * Checking interrupt_callback, looping on EINTR and EAGAIN and until
  66. * enough data has been read is left to the calling function; see
  67. * retry_transfer_wrapper in avio.c.
  68. */
  69. int (*url_read)( URLContext *h, unsigned char *buf, int size);
  70. int (*url_write)(URLContext *h, const unsigned char *buf, int size);
  71. int64_t (*url_seek)( URLContext *h, int64_t pos, int whence);
  72. int (*url_close)(URLContext *h);
  73. int (*url_read_pause)(URLContext *h, int pause);
  74. int64_t (*url_read_seek)(URLContext *h, int stream_index,
  75. int64_t timestamp, int flags);
  76. int (*url_get_file_handle)(URLContext *h);
  77. int (*url_get_multi_file_handle)(URLContext *h, int **handles,
  78. int *numhandles);
  79. int (*url_get_short_seek)(URLContext *h);
  80. int (*url_shutdown)(URLContext *h, int flags);
  81. int priv_data_size;
  82. const AVClass *priv_data_class;
  83. int flags;
  84. int (*url_check)(URLContext *h, int mask);
  85. int (*url_open_dir)(URLContext *h);
  86. int (*url_read_dir)(URLContext *h, AVIODirEntry **next);
  87. int (*url_close_dir)(URLContext *h);
  88. int (*url_delete)(URLContext *h);
  89. int (*url_move)(URLContext *h_src, URLContext *h_dst);
  90. const char *default_whitelist;
  91. } URLProtocol;
  92. /**
  93. * Create a URLContext for accessing to the resource indicated by
  94. * url, but do not initiate the connection yet.
  95. *
  96. * @param puc pointer to the location where, in case of success, the
  97. * function puts the pointer to the created URLContext
  98. * @param flags flags which control how the resource indicated by url
  99. * is to be opened
  100. * @param int_cb interrupt callback to use for the URLContext, may be
  101. * NULL
  102. * @return >= 0 in case of success, a negative value corresponding to an
  103. * AVERROR code in case of failure
  104. */
  105. int ffurl_alloc(URLContext **puc, const char *filename, int flags,
  106. const AVIOInterruptCB *int_cb);
  107. /**
  108. * Connect an URLContext that has been allocated by ffurl_alloc
  109. *
  110. * @param options A dictionary filled with options for nested protocols,
  111. * i.e. it will be passed to url_open2() for protocols implementing it.
  112. * This parameter will be destroyed and replaced with a dict containing options
  113. * that were not found. May be NULL.
  114. */
  115. int ffurl_connect(URLContext *uc, AVDictionary **options);
  116. /**
  117. * Create an URLContext for accessing to the resource indicated by
  118. * url, and open it.
  119. *
  120. * @param puc pointer to the location where, in case of success, the
  121. * function puts the pointer to the created URLContext
  122. * @param flags flags which control how the resource indicated by url
  123. * is to be opened
  124. * @param int_cb interrupt callback to use for the URLContext, may be
  125. * NULL
  126. * @param options A dictionary filled with protocol-private options. On return
  127. * this parameter will be destroyed and replaced with a dict containing options
  128. * that were not found. May be NULL.
  129. * @param parent An enclosing URLContext, whose generic options should
  130. * be applied to this URLContext as well.
  131. * @return >= 0 in case of success, a negative value corresponding to an
  132. * AVERROR code in case of failure
  133. */
  134. int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags,
  135. const AVIOInterruptCB *int_cb, AVDictionary **options,
  136. const char *whitelist, const char* blacklist,
  137. URLContext *parent);
  138. int ffurl_open(URLContext **puc, const char *filename, int flags,
  139. const AVIOInterruptCB *int_cb, AVDictionary **options);
  140. /**
  141. * Accept an URLContext c on an URLContext s
  142. *
  143. * @param s server context
  144. * @param c client context, must be unallocated.
  145. * @return >= 0 on success, ff_neterrno() on failure.
  146. */
  147. int ffurl_accept(URLContext *s, URLContext **c);
  148. /**
  149. * Perform one step of the protocol handshake to accept a new client.
  150. * See avio_handshake() for details.
  151. * Implementations should try to return decreasing values.
  152. * If the protocol uses an underlying protocol, the underlying handshake is
  153. * usually the first step, and the return value can be:
  154. * (largest value for this protocol) + (return value from other protocol)
  155. *
  156. * @param c the client context
  157. * @return >= 0 on success or a negative value corresponding
  158. * to an AVERROR code on failure
  159. */
  160. int ffurl_handshake(URLContext *c);
  161. /**
  162. * Read up to size bytes from the resource accessed by h, and store
  163. * the read bytes in buf.
  164. *
  165. * @return The number of bytes actually read, or a negative value
  166. * corresponding to an AVERROR code in case of error. A value of zero
  167. * indicates that it is not possible to read more from the accessed
  168. * resource (except if the value of the size argument is also zero).
  169. */
  170. int ffurl_read(URLContext *h, unsigned char *buf, int size);
  171. /**
  172. * Read as many bytes as possible (up to size), calling the
  173. * read function multiple times if necessary.
  174. * This makes special short-read handling in applications
  175. * unnecessary, if the return value is < size then it is
  176. * certain there was either an error or the end of file was reached.
  177. */
  178. int ffurl_read_complete(URLContext *h, unsigned char *buf, int size);
  179. /**
  180. * Write size bytes from buf to the resource accessed by h.
  181. *
  182. * @return the number of bytes actually written, or a negative value
  183. * corresponding to an AVERROR code in case of failure
  184. */
  185. int ffurl_write(URLContext *h, const unsigned char *buf, int size);
  186. /**
  187. * Change the position that will be used by the next read/write
  188. * operation on the resource accessed by h.
  189. *
  190. * @param pos specifies the new position to set
  191. * @param whence specifies how pos should be interpreted, it must be
  192. * one of SEEK_SET (seek from the beginning), SEEK_CUR (seek from the
  193. * current position), SEEK_END (seek from the end), or AVSEEK_SIZE
  194. * (return the filesize of the requested resource, pos is ignored).
  195. * @return a negative value corresponding to an AVERROR code in case
  196. * of failure, or the resulting file position, measured in bytes from
  197. * the beginning of the file. You can use this feature together with
  198. * SEEK_CUR to read the current file position.
  199. */
  200. int64_t ffurl_seek(URLContext *h, int64_t pos, int whence);
  201. /**
  202. * Close the resource accessed by the URLContext h, and free the
  203. * memory used by it. Also set the URLContext pointer to NULL.
  204. *
  205. * @return a negative value if an error condition occurred, 0
  206. * otherwise
  207. */
  208. int ffurl_closep(URLContext **h);
  209. int ffurl_close(URLContext *h);
  210. /**
  211. * Return the filesize of the resource accessed by h, AVERROR(ENOSYS)
  212. * if the operation is not supported by h, or another negative value
  213. * corresponding to an AVERROR error code in case of failure.
  214. */
  215. int64_t ffurl_size(URLContext *h);
  216. /**
  217. * Return the file descriptor associated with this URL. For RTP, this
  218. * will return only the RTP file descriptor, not the RTCP file descriptor.
  219. *
  220. * @return the file descriptor associated with this URL, or <0 on error.
  221. */
  222. int ffurl_get_file_handle(URLContext *h);
  223. /**
  224. * Return the file descriptors associated with this URL.
  225. *
  226. * @return 0 on success or <0 on error.
  227. */
  228. int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
  229. /**
  230. * Return the current short seek threshold value for this URL.
  231. *
  232. * @return threshold (>0) on success or <=0 on error.
  233. */
  234. int ffurl_get_short_seek(URLContext *h);
  235. /**
  236. * Signal the URLContext that we are done reading or writing the stream.
  237. *
  238. * @param h pointer to the resource
  239. * @param flags flags which control how the resource indicated by url
  240. * is to be shutdown
  241. *
  242. * @return a negative value if an error condition occurred, 0
  243. * otherwise
  244. */
  245. int ffurl_shutdown(URLContext *h, int flags);
  246. /**
  247. * Check if the user has requested to interrupt a blocking function
  248. * associated with cb.
  249. */
  250. int ff_check_interrupt(AVIOInterruptCB *cb);
  251. /* udp.c */
  252. int ff_udp_set_remote_url(URLContext *h, const char *uri);
  253. int ff_udp_get_local_port(URLContext *h);
  254. /**
  255. * Assemble a URL string from components. This is the reverse operation
  256. * of av_url_split.
  257. *
  258. * Note, this requires networking to be initialized, so the caller must
  259. * ensure ff_network_init has been called.
  260. *
  261. * @see av_url_split
  262. *
  263. * @param str the buffer to fill with the url
  264. * @param size the size of the str buffer
  265. * @param proto the protocol identifier, if null, the separator
  266. * after the identifier is left out, too
  267. * @param authorization an optional authorization string, may be null.
  268. * An empty string is treated the same as a null string.
  269. * @param hostname the host name string
  270. * @param port the port number, left out from the string if negative
  271. * @param fmt a generic format string for everything to add after the
  272. * host/port, may be null
  273. * @return the number of characters written to the destination buffer
  274. */
  275. int ff_url_join(char *str, int size, const char *proto,
  276. const char *authorization, const char *hostname,
  277. int port, const char *fmt, ...) av_printf_format(7, 8);
  278. /**
  279. * Convert a relative url into an absolute url, given a base url.
  280. *
  281. * @param buf the buffer where output absolute url is written
  282. * @param size the size of buf
  283. * @param base the base url, may be equal to buf.
  284. * @param rel the new url, which is interpreted relative to base
  285. */
  286. int ff_make_absolute_url(char *buf, int size, const char *base,
  287. const char *rel);
  288. /**
  289. * Allocate directory entry with default values.
  290. *
  291. * @return entry or NULL on error
  292. */
  293. AVIODirEntry *ff_alloc_dir_entry(void);
  294. #if FF_API_CHILD_CLASS_NEXT
  295. const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
  296. #endif
  297. const AVClass *ff_urlcontext_child_class_iterate(void **iter);
  298. /**
  299. * Construct a list of protocols matching a given whitelist and/or blacklist.
  300. *
  301. * @param whitelist a comma-separated list of allowed protocol names or NULL. If
  302. * this is a non-empty string, only protocols in this list will
  303. * be included.
  304. * @param blacklist a comma-separated list of forbidden protocol names or NULL.
  305. * If this is a non-empty string, all protocols in this list
  306. * will be excluded.
  307. *
  308. * @return a NULL-terminated array of matching protocols. The array must be
  309. * freed by the caller.
  310. */
  311. const URLProtocol **ffurl_get_protocols(const char *whitelist,
  312. const char *blacklist);
  313. typedef struct URLComponents {
  314. const char *url; /**< whole URL, for reference */
  315. const char *scheme; /**< possibly including lavf-specific options */
  316. const char *authority; /**< "//" if it is a real URL */
  317. const char *userinfo; /**< including final '@' if present */
  318. const char *host;
  319. const char *port; /**< including initial ':' if present */
  320. const char *path;
  321. const char *query; /**< including initial '?' if present */
  322. const char *fragment; /**< including initial '#' if present */
  323. const char *end;
  324. } URLComponents;
  325. #define url_component_end_scheme authority
  326. #define url_component_end_authority userinfo
  327. #define url_component_end_userinfo host
  328. #define url_component_end_host port
  329. #define url_component_end_port path
  330. #define url_component_end_path query
  331. #define url_component_end_query fragment
  332. #define url_component_end_fragment end
  333. #define url_component_end_authority_full path
  334. #define URL_COMPONENT_HAVE(uc, component) \
  335. ((uc).url_component_end_##component > (uc).component)
  336. /**
  337. * Parse an URL to find the components.
  338. *
  339. * Each component runs until the start of the next component,
  340. * possibly including a mandatory delimiter.
  341. *
  342. * @param uc structure to fill with pointers to the components.
  343. * @param url URL to parse.
  344. * @param end end of the URL, or NULL to parse to the end of string.
  345. *
  346. * @return >= 0 for success or an AVERROR code, especially if the URL is
  347. * malformed.
  348. */
  349. int ff_url_decompose(URLComponents *uc, const char *url, const char *end);
  350. #endif /* AVFORMAT_URL_H */