Merge commit 'eb9244f20210fd420fb9b3c98126f9cae525d1cc'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 4 Aug 2014 12:13:45 +0000 (14:13 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 4 Aug 2014 12:14:13 +0000 (14:14 +0200)
* commit 'eb9244f20210fd420fb9b3c98126f9cae525d1cc':
  Add Icecast protocol

Conflicts:
Changelog
configure
doc/protocols.texi
libavformat/icecast.c
libavformat/version.h

See: e3dc2c86fc4178b100484c54f12c88705cdf6724
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
configure
doc/protocols.texi
libavformat/icecast.c
libavformat/version.h

diff --cc configure
Simple merge
@@@ -279,55 -138,43 +279,57 @@@ Set initial byte offset
  Try to limit the request to bytes preceding this offset.
  @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 Icecast
  
- Icecast protocol
 -Icecast (stream to Icecast servers)
++Icecast protocol (stream to Icecast servers)
+ This protocol accepts the following options:
  
  @table @option
  @item ice_genre
- Set the genre of the stream.
+ Set the stream genre.
  
  @item ice_name
- Set the name of the stream.
+ Set the stream name.
  
  @item ice_description
- Set the description of the stream.
+ Set the stream description.
  
  @item ice_url
- Set the stream website url.
+ Set the stream website URL.
  
  @item ice_public
 -Set if the stream should be public or not.
 +Set if the stream should be public.
Default is 0 (not public).
The default is 0 (not public).
  
- @item ice_password
- Password for the mountpoint.
+ @item user_agent
+ Override the User-Agent header. If not specified a string of the form
+ "Lavf/<version>" will be used.
  
- @item legacy_icecast
- If set to 1, enable support for legacy Icecast (Version < 2.4), using the SOURCE method
- instead of the PUT method.
+ @item password
+ Set the Icecast mountpoint password.
  
  @item content_type
- Set a specific content type for the stream.
- This MUST be set if streaming else than audio/mpeg
+ Set the stream content type. This must be set if it is different from
+ audio/mpeg.
  
- @item user_agent
- Override the User-Agent header. If not specified the protocol will use a
- string describing the libavformat build. ("Lavf/<version>")
+ @item legacy_icecast
+ This enables support for Icecast versions < 2.4.0, that do not support the
+ HTTP PUT method but the SOURCE method.
  
  @end table
  
@@@ -66,12 -65,37 +66,20 @@@ static const AVOption options[] = 
  };
  
  
 -static char *cat_header(char buf[], const char key[], const char value[])
 +static void cat_header(AVBPrint *bp, const char key[], const char value[])
  {
 -    if (NOT_EMPTY(value)) {
 -        int len = strlen(key) + strlen(value) + 5;
 -        int is_first = !buf;
 -        char *tmp = NULL;
 -
 -        if (buf)
 -            len += strlen(buf);
 -        if (!(tmp = av_realloc(buf, len))) {
 -            av_freep(&buf);
 -            return NULL;
 -        } else {
 -            buf = tmp;
 -        }
 -        if (is_first)
 -            *buf = '\0';
 -
 -        av_strlcatf(buf, len, "%s: %s\r\n", key, value);
 -    }
 -    return buf;
 +    if (NOT_EMPTY(value))
 +        av_bprintf(bp, "%s: %s\r\n", key, value);
  }
  
+ static int icecast_close(URLContext *h)
+ {
+     IcecastContext *s = h->priv_data;
+     if (s->hd)
+         ffurl_close(s->hd);
+     return 0;
+ }
  static int icecast_open(URLContext *h, const char *uri, int flags)
  {
      IcecastContext *s = h->priv_data;
  
      // URI part variables
      char h_url[1024], host[1024], auth[1024], path[1024];
-     char *user = NULL, *headers = NULL;
+     char *headers = NULL, *user = NULL;
      int port, ret;
 +    AVBPrint bp;
  
+     if (flags & AVIO_FLAG_READ)
+         return AVERROR(ENOSYS);
 +    av_bprint_init(&bp, 0, 1);
 +
      // Build header strings
 -    headers = cat_header(headers, "Ice-Name", s->name);
 -    headers = cat_header(headers, "Ice-Description", s->description);
 -    headers = cat_header(headers, "Ice-URL", s->url);
 -    headers = cat_header(headers, "Ice-Genre", s->genre);
 -    headers = cat_header(headers, "Ice-Public", s->public ? "1" : "0");
 -    if (!headers) {
 +    cat_header(&bp, "Ice-Name", s->name);
 +    cat_header(&bp, "Ice-Description", s->description);
 +    cat_header(&bp, "Ice-URL", s->url);
 +    cat_header(&bp, "Ice-Genre", s->genre);
 +    cat_header(&bp, "Ice-Public", s->public ? "1" : "0");
 +    if (!av_bprint_is_complete(&bp)) {
          ret = AVERROR(ENOMEM);
          goto cleanup;
      }
@@@ -30,8 -30,8 +30,9 @@@
  #include "libavutil/version.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 55
 -#define LIBAVFORMAT_VERSION_MINOR 21
 -#define LIBAVFORMAT_VERSION_MICRO  0
++
 +#define LIBAVFORMAT_VERSION_MINOR 51
- #define LIBAVFORMAT_VERSION_MICRO 100
++#define LIBAVFORMAT_VERSION_MICRO 101
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \