Merge commit '8075c3d8bb1f6aade0cc7c5c40db9bc1bcd84cab'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 12 Mar 2014 02:16:21 +0000 (03:16 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 12 Mar 2014 02:18:12 +0000 (03:18 +0100)
* commit '8075c3d8bb1f6aade0cc7c5c40db9bc1bcd84cab':
  http: Add support reading ICY metadata

Conflicts:
doc/protocols.texi
libavformat/http.c

See: a92fbe16f2dc118c0d3adc222484268831388648
See: 636273d3d4a8c42f51832e8bf83e566e875916bf
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/protocols.texi
libavformat/http.c

@@@ -213,43 -89,9 +213,43 @@@ m3u8 files
  
  HTTP (Hyper Text Transfer Protocol).
  
- This protocol accepts the following options.
+ This protocol accepts the following options:
  
  @table @option
 +@item seekable
 +Control seekability of connection. If set to 1 the resource is
 +supposed to be seekable, if set to 0 it is assumed not to be seekable,
 +if set to -1 it will try to autodetect if it is seekable. Default
 +value is -1.
 +
 +@item chunked_post
 +If set to 1 use chunked transfer-encoding for posts, default is 1.
 +
 +@item headers
 +Set custom HTTP headers, can override built in default headers. The
 +value must be a string encoding the headers.
 +
 +@item content_type
 +Force a content type.
 +
 +@item user-agent
 +Override User-Agent header. If not specified the protocol will use a
 +string describing the libavformat build.
 +
 +@item multiple_requests
 +Use persistent connections if set to 1. By default it is 0.
 +
 +@item post_data
 +Set custom HTTP post data.
 +
 +@item timeout
 +Set timeout of socket I/O operations used by the underlying low level
 +operation. By default it is set to -1, which means that the timeout is
 +not specified.
 +
 +@item mime_type
 +Set MIME type.
 +
  @item icy
  If set to 1 request ICY (SHOUTcast) metadata from the server. If the server
  supports this, the metadata has to be retrieved by the application by reading
@@@ -262,28 -104,11 +262,30 @@@ headers, separated by newline character
  
  @item icy_metadata_packet
  If the server supports ICY metadata, and @option{icy} was set to 1, this
- contains the last non-empty metadata packet sent by the server.
+ contains the last non-empty metadata packet sent by the server. It should be
+ polled in regular intervals by applications interested in mid-stream metadata
+ updates.
 +
 +@item cookies
 +Set the cookies to be sent in future requests. The format of each cookie is the
 +same as the value of a Set-Cookie HTTP response field. Multiple cookies can be
 +delimited by a newline character.
  @end table
  
 +@subsection HTTP Cookies
 +
 +Some HTTP requests will be denied unless cookie values are passed in with the
 +request. The @option{cookies} option allows these cookies to be specified. At
 +the very least, each cookie must specify a value along with a path and domain.
 +HTTP requests that match both the domain and path will automatically include the
 +cookie value in the HTTP Cookie header field. Multiple cookies can be delimited
 +by a newline.
 +
 +The required syntax to play a stream specifying a cookie is:
 +@example
 +ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
 +@end example
 +
  @section mmst
  
  MMS (Microsoft Media Server) protocol over TCP.
@@@ -51,11 -51,7 +51,9 @@@ typedef struct 
      int http_code;
      /* Used if "Transfer-Encoding: chunked" otherwise -1. */
      int64_t chunksize;
 -    int64_t off, filesize;
 +    char *content_type;
 +    char *user_agent;
 +    int64_t off, filesize, req_end_offset;
-     int icy_data_read;      ///< how much data was read since last ICY metadata packet
-     int icy_metaint;        ///< after how many bytes of read data a new metadata packet will be found
      char *location;
      HTTPAuthState auth_state;
      HTTPAuthState proxy_auth_state;
      int multiple_requests;
      uint8_t *post_data;
      int post_datalen;
 +    int is_akamai;
 +    int is_mediagateway;
 +    char *mime_type;
 +    char *cookies;          ///< holds newline (\n) delimited Set-Cookie header field values (without the "Set-Cookie: " field name)
      int icy;
+     /* how much data was read since the last ICY metadata packet */
+     int icy_data_read;
+     /* after how many bytes of read data a new metadata packet will be found */
+     int icy_metaint;
      char *icy_metadata_headers;
      char *icy_metadata_packet;
  #if CONFIG_ZLIB
  #define OFFSET(x) offsetof(HTTPContext, x)
  #define D AV_OPT_FLAG_DECODING_PARAM
  #define E AV_OPT_FLAG_ENCODING_PARAM
 +#define DEFAULT_USER_AGENT "Lavf/" AV_STRINGIFY(LIBAVFORMAT_VERSION)
  static const AVOption options[] = {
 +{"seekable", "control seekability of connection", OFFSET(seekable), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, D },
  {"chunked_post", "use chunked transfer-encoding for posts", OFFSET(chunked_post), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E },
 -{"headers", "custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
 +{"headers", "set custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
 +{"content_type", "force a content type", OFFSET(content_type), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
 +{"user-agent", "override User-Agent header", OFFSET(user_agent), AV_OPT_TYPE_STRING, {.str = DEFAULT_USER_AGENT}, 0, 0, D },
  {"multiple_requests", "use persistent connections", OFFSET(multiple_requests), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D|E },
 -{"post_data", "custom HTTP post data", OFFSET(post_data), AV_OPT_TYPE_BINARY, .flags = D|E },
 +{"post_data", "set custom HTTP post data", OFFSET(post_data), AV_OPT_TYPE_BINARY, .flags = D|E },
 +{"mime_type", "set MIME type", OFFSET(mime_type), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
 +{"cookies", "set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax", OFFSET(cookies), AV_OPT_TYPE_STRING, {0}, 0, 0, D },
  {"icy", "request ICY metadata", OFFSET(icy), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D },
- {"icy_metadata_headers", "return ICY metadata headers", OFFSET(icy_metadata_headers), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
- {"icy_metadata_packet", "return current ICY metadata packet", OFFSET(icy_metadata_packet), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
+ {"icy_metadata_headers", "return ICY metadata headers", OFFSET(icy_metadata_headers), AV_OPT_TYPE_STRING, {0}, 0, 0, AV_OPT_FLAG_EXPORT },
+ {"icy_metadata_packet", "return current ICY metadata packet", OFFSET(icy_metadata_packet), AV_OPT_TYPE_STRING, {0}, 0, 0, AV_OPT_FLAG_EXPORT },
  {"auth_type", "HTTP authentication type", OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, {.i64 = HTTP_AUTH_NONE}, HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D|E, "auth_type" },
  {"none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, {.i64 = HTTP_AUTH_NONE}, 0, 0, D|E, "auth_type" },
  {"basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, {.i64 = HTTP_AUTH_BASIC}, 0, 0, D|E, "auth_type" },