You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

396 lines
15KB

  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_whitelist()
  52. * or ffurl_connect() 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. const AVClass *priv_data_class;
  82. int priv_data_size;
  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. /**
  139. * Accept an URLContext c on an URLContext s
  140. *
  141. * @param s server context
  142. * @param c client context, must be unallocated.
  143. * @return >= 0 on success, ff_neterrno() on failure.
  144. */
  145. int ffurl_accept(URLContext *s, URLContext **c);
  146. /**
  147. * Perform one step of the protocol handshake to accept a new client.
  148. * See avio_handshake() for details.
  149. * Implementations should try to return decreasing values.
  150. * If the protocol uses an underlying protocol, the underlying handshake is
  151. * usually the first step, and the return value can be:
  152. * (largest value for this protocol) + (return value from other protocol)
  153. *
  154. * @param c the client context
  155. * @return >= 0 on success or a negative value corresponding
  156. * to an AVERROR code on failure
  157. */
  158. int ffurl_handshake(URLContext *c);
  159. /**
  160. * Read up to size bytes from the resource accessed by h, and store
  161. * the read bytes in buf.
  162. *
  163. * @return The number of bytes actually read, or a negative value
  164. * corresponding to an AVERROR code in case of error. A value of zero
  165. * indicates that it is not possible to read more from the accessed
  166. * resource (except if the value of the size argument is also zero).
  167. */
  168. int ffurl_read(URLContext *h, unsigned char *buf, int size);
  169. /**
  170. * Read as many bytes as possible (up to size), calling the
  171. * read function multiple times if necessary.
  172. * This makes special short-read handling in applications
  173. * unnecessary, if the return value is < size then it is
  174. * certain there was either an error or the end of file was reached.
  175. */
  176. int ffurl_read_complete(URLContext *h, unsigned char *buf, int size);
  177. /**
  178. * Write size bytes from buf to the resource accessed by h.
  179. *
  180. * @return the number of bytes actually written, or a negative value
  181. * corresponding to an AVERROR code in case of failure
  182. */
  183. int ffurl_write(URLContext *h, const unsigned char *buf, int size);
  184. /**
  185. * Change the position that will be used by the next read/write
  186. * operation on the resource accessed by h.
  187. *
  188. * @param pos specifies the new position to set
  189. * @param whence specifies how pos should be interpreted, it must be
  190. * one of SEEK_SET (seek from the beginning), SEEK_CUR (seek from the
  191. * current position), SEEK_END (seek from the end), or AVSEEK_SIZE
  192. * (return the filesize of the requested resource, pos is ignored).
  193. * @return a negative value corresponding to an AVERROR code in case
  194. * of failure, or the resulting file position, measured in bytes from
  195. * the beginning of the file. You can use this feature together with
  196. * SEEK_CUR to read the current file position.
  197. */
  198. int64_t ffurl_seek(URLContext *h, int64_t pos, int whence);
  199. /**
  200. * Close the resource accessed by the URLContext h, and free the
  201. * memory used by it. Also set the URLContext pointer to NULL.
  202. *
  203. * @return a negative value if an error condition occurred, 0
  204. * otherwise
  205. */
  206. int ffurl_closep(URLContext **h);
  207. int ffurl_close(URLContext *h);
  208. /**
  209. * Return the filesize of the resource accessed by h, AVERROR(ENOSYS)
  210. * if the operation is not supported by h, or another negative value
  211. * corresponding to an AVERROR error code in case of failure.
  212. */
  213. int64_t ffurl_size(URLContext *h);
  214. /**
  215. * Return the file descriptor associated with this URL. For RTP, this
  216. * will return only the RTP file descriptor, not the RTCP file descriptor.
  217. *
  218. * @return the file descriptor associated with this URL, or <0 on error.
  219. */
  220. int ffurl_get_file_handle(URLContext *h);
  221. /**
  222. * Return the file descriptors associated with this URL.
  223. *
  224. * @return 0 on success or <0 on error.
  225. */
  226. int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
  227. /**
  228. * Return the current short seek threshold value for this URL.
  229. *
  230. * @return threshold (>0) on success or <=0 on error.
  231. */
  232. int ffurl_get_short_seek(URLContext *h);
  233. /**
  234. * Signal the URLContext that we are done reading or writing the stream.
  235. *
  236. * @param h pointer to the resource
  237. * @param flags flags which control how the resource indicated by url
  238. * is to be shutdown
  239. *
  240. * @return a negative value if an error condition occurred, 0
  241. * otherwise
  242. */
  243. int ffurl_shutdown(URLContext *h, int flags);
  244. /**
  245. * Check if the user has requested to interrupt a blocking function
  246. * associated with cb.
  247. */
  248. int ff_check_interrupt(AVIOInterruptCB *cb);
  249. /* udp.c */
  250. int ff_udp_set_remote_url(URLContext *h, const char *uri);
  251. int ff_udp_get_local_port(URLContext *h);
  252. /**
  253. * Assemble a URL string from components. This is the reverse operation
  254. * of av_url_split.
  255. *
  256. * Note, this requires networking to be initialized, so the caller must
  257. * ensure ff_network_init has been called.
  258. *
  259. * @see av_url_split
  260. *
  261. * @param str the buffer to fill with the url
  262. * @param size the size of the str buffer
  263. * @param proto the protocol identifier, if null, the separator
  264. * after the identifier is left out, too
  265. * @param authorization an optional authorization string, may be null.
  266. * An empty string is treated the same as a null string.
  267. * @param hostname the host name string
  268. * @param port the port number, left out from the string if negative
  269. * @param fmt a generic format string for everything to add after the
  270. * host/port, may be null
  271. * @return the number of characters written to the destination buffer
  272. */
  273. int ff_url_join(char *str, int size, const char *proto,
  274. const char *authorization, const char *hostname,
  275. int port, const char *fmt, ...) av_printf_format(7, 8);
  276. /**
  277. * Convert a relative url into an absolute url, given a base url.
  278. *
  279. * @param buf the buffer where output absolute url is written
  280. * @param size the size of buf
  281. * @param base the base url, may be equal to buf.
  282. * @param rel the new url, which is interpreted relative to base
  283. * @param handle_dos_paths handle DOS paths for file or unspecified protocol
  284. */
  285. int ff_make_absolute_url2(char *buf, int size, const char *base,
  286. const char *rel, int handle_dos_paths);
  287. /**
  288. * Convert a relative url into an absolute url, given a base url.
  289. *
  290. * Same as ff_make_absolute_url2 with handle_dos_paths being equal to
  291. * HAVE_DOS_PATHS config variable.
  292. */
  293. int ff_make_absolute_url(char *buf, int size, const char *base,
  294. const char *rel);
  295. /**
  296. * Allocate directory entry with default values.
  297. *
  298. * @return entry or NULL on error
  299. */
  300. AVIODirEntry *ff_alloc_dir_entry(void);
  301. #if FF_API_CHILD_CLASS_NEXT
  302. const AVClass *ff_urlcontext_child_class_next(const AVClass *prev);
  303. #endif
  304. const AVClass *ff_urlcontext_child_class_iterate(void **iter);
  305. /**
  306. * Construct a list of protocols matching a given whitelist and/or blacklist.
  307. *
  308. * @param whitelist a comma-separated list of allowed protocol names or NULL. If
  309. * this is a non-empty string, only protocols in this list will
  310. * be included.
  311. * @param blacklist a comma-separated list of forbidden protocol names or NULL.
  312. * If this is a non-empty string, all protocols in this list
  313. * will be excluded.
  314. *
  315. * @return a NULL-terminated array of matching protocols. The array must be
  316. * freed by the caller.
  317. */
  318. const URLProtocol **ffurl_get_protocols(const char *whitelist,
  319. const char *blacklist);
  320. typedef struct URLComponents {
  321. const char *url; /**< whole URL, for reference */
  322. const char *scheme; /**< possibly including lavf-specific options */
  323. const char *authority; /**< "//" if it is a real URL */
  324. const char *userinfo; /**< including final '@' if present */
  325. const char *host;
  326. const char *port; /**< including initial ':' if present */
  327. const char *path;
  328. const char *query; /**< including initial '?' if present */
  329. const char *fragment; /**< including initial '#' if present */
  330. const char *end;
  331. } URLComponents;
  332. #define url_component_end_scheme authority
  333. #define url_component_end_authority userinfo
  334. #define url_component_end_userinfo host
  335. #define url_component_end_host port
  336. #define url_component_end_port path
  337. #define url_component_end_path query
  338. #define url_component_end_query fragment
  339. #define url_component_end_fragment end
  340. #define url_component_end_authority_full path
  341. #define URL_COMPONENT_HAVE(uc, component) \
  342. ((uc).url_component_end_##component > (uc).component)
  343. /**
  344. * Parse an URL to find the components.
  345. *
  346. * Each component runs until the start of the next component,
  347. * possibly including a mandatory delimiter.
  348. *
  349. * @param uc structure to fill with pointers to the components.
  350. * @param url URL to parse.
  351. * @param end end of the URL, or NULL to parse to the end of string.
  352. *
  353. * @return >= 0 for success or an AVERROR code, especially if the URL is
  354. * malformed.
  355. */
  356. int ff_url_decompose(URLComponents *uc, const char *url, const char *end);
  357. #endif /* AVFORMAT_URL_H */