Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 18 Jun 2012 18:05:32 +0000 (20:05 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 18 Jun 2012 18:07:00 +0000 (20:07 +0200)
* qatar/master:
  lavr: add x86-optimized functions for mixing 1-to-2 s16p with flt coeffs
  lavr: add x86-optimized functions for mixing 1-to-2 fltp with flt coeffs
  Add Dolby/DPLII downmix support to libavresample
  vorbisdec: replace div/mod in loop with a counter
  fate: vorbis: add 5.1 surround test
  rtpenc: Allow requesting H264 RTP packetization mode 0
  configure: Sort the library listings in the help text alphabetically
  dwt: remove variable-length arrays
  RTMPT protocol support
  http: Properly handle chunked transfer-encoding for replies to post data
  http: Fail reading if the connection has gone away
  amr: Mark an array const
  amr: More space cleanup
  rtpenc: Fix memory leaks in the muxer open function

Conflicts:
Changelog
configure
doc/APIchanges
libavformat/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
24 files changed:
1  2 
Changelog
configure
doc/APIchanges
doc/protocols.texi
libavcodec/dwt.c
libavcodec/dwt.h
libavcodec/snow.c
libavcodec/snow.h
libavcodec/snowdec.c
libavcodec/snowenc.c
libavcodec/vorbisdec.c
libavcodec/x86/snowdsp_mmx.c
libavformat/Makefile
libavformat/allformats.c
libavformat/amr.c
libavformat/http.c
libavformat/rtmphttp.c
libavformat/rtmpproto.c
libavformat/rtpenc.c
libavformat/rtpenc.h
libavformat/rtpenc_h264.c
libavformat/sdp.c
libavformat/version.h
libavutil/audioconvert.h

diff --cc Changelog
+++ b/Changelog
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version <next>:
 +version next:
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
 +- Indeo Audio decoder
 +- channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
++- RTMPT protocol support
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 +
 +version 0.11:
 +
 +- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777,
 +         CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785,
 +         CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790,
 +         CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795,
 +         CVE-2012-2796, CVE-2012-2797, CVE-2012-2798, CVE-2012-2799, CVE-2012-2800,
 +         CVE-2012-2801, CVE-2012-2802, CVE-2012-2803, CVE-2012-2804,
 +- v408 Quicktime and Microsoft AYUV Uncompressed 4:4:4:4 encoder and decoder
 +- setfield filter
  - CDXL demuxer and decoder
  - Apple ProRes encoder
 +- ffprobe -count_packets and -count_frames options
  - Sun Rasterfile Encoder
 -- remove libpostproc
  - ID3v2 attached pictures reading and writing
  - WMA Lossless decoder
 -- XBM encoder
 +- bluray protocol
 +- blackdetect filter
 +- libutvideo encoder wrapper (--enable-libutvideo)
 +- swapuv filter
 +- bbox filter
 +- XBM encoder and decoder
  - RealAudio Lossless decoder
  - ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 +- tile video filter
 +- Metal Gear Solid: The Twin Snakes demuxer
 +- OpenEXR image decoder
 +- removelogo filter
 +- drop support for ffmpeg without libavfilter
 +- drawtext video filter: fontconfig support
 +- ffmpeg -benchmark_all option
 +- super2xsai filter ported from libmpcodecs
 +- add libavresample audio conversion library for compatibility
 +- MicroDVD decoder
 +- Avid Meridien (AVUI) encoder and decoder
 +- accept + prefix to -pix_fmt option to disable automatic conversions.
 +- complete audio filtering in libavfilter and ffmpeg
  - add fps filter
 -- audio split filter
 +- vorbis parser
 +- png parser
  - audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 -- Indeo Audio decoder
 -- channelsplit audio filter
 -- RTMPT protocol support
  
  
 -version 0.8:
 +version 0.10:
  
 +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
 +         CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944,
 +         CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949,
 +         CVE-2011-3950, CVE-2011-3951, CVE-2011-3952
 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
 +- SBaGen (SBG) binaural beats script demuxer
 +- OpenMG Audio muxer
 +- Timecode extraction in DV and MOV
 +- thumbnail video filter
 +- XML output in ffprobe
 +- asplit audio filter
 +- tinterlace video filter
 +- astreamsync audio filter
 +- amerge audio filter
 +- ISMV (Smooth Streaming) muxer
  - GSM audio parser
  - SMJPEG muxer
 -
 -
 -version 0.8_beta2:
 -
 +- XWD encoder and decoder
  - Automatic thread count based on detection number of (available) CPU cores
 -- Deprecate libpostproc. If desired, the switch --enable-postproc will
 -  enable it but it may be removed in a later Libav release.
 +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder
 +- ffprobe -show_error option
 +- Avid 1:1 10-bit RGB Packer codec
 +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder
 +- yuv4 libquicktime packed 4:2:0 encoder and decoder
 +- ffprobe -show_frames option
 +- silencedetect audio filter
 +- ffprobe -show_program_version, -show_library_versions, -show_versions options
  - rv34: frame-level multi-threading
  - optimized iMDCT transform on x86 using SSE for for mpegaudiodec
 +- Improved PGS subtitle decoder
 +- dumpgraph option to lavfi device
 +- r210 and r10k encoders
 +- ffwavesynth decoder
 +- aviocat tool
 +- ffeval tool
  
  
 -version 0.8_beta1:
 +version 0.9:
  
 +- openal input device added
 +- boxblur filter added
  - BWF muxer
  - Flash Screen Video 2 decoder
 -- ffplay/ffprobe/ffserver renamed to avplay/avprobe/avserver
 -- ffmpeg deprecated, added avconv, which is almost the same for now, except
 +- lavfi input device added
 +- added avconv, which is almost the same for now, except
  for a few incompatible changes in the options, which will hopefully make them
  easier to use. The changes are:
      * The options placement is now strictly enforced! While in theory the
diff --cc configure
+++ b/configure
@@@ -167,27 -164,19 +167,27 @@@ Individual component options
  External library support:
    --enable-avisynth        enable reading of AVISynth script files [no]
    --enable-bzlib           enable bzlib [autodetect]
 +  --enable-fontconfig      enable fontconfig
    --enable-frei0r          enable frei0r video filtering
    --enable-gnutls          enable gnutls [no]
-   --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
-   --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
-   --enable-libopencv       enable video filtering via libopencv [no]
 +  --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
 +  --enable-libass          enable libass subtitles rendering [no]
 +  --enable-libbluray       enable BluRay reading using libbluray [no]
 +  --enable-libcelt         enable CELT decoding via libcelt [no]
    --enable-libcdio         enable audio CD grabbing with libcdio
    --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                             and libraw1394 [no]
    --enable-libfaac         enable FAAC support via libfaac [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM support via libgsm [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
 -  --enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
 +  --enable-libnut          enable NUT (de)muxing via libnut,
 +                           native (de)muxer exists [no]
+   --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
+   --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
+   --enable-libopencv       enable video filtering via libopencv [no]
 +  --enable-libopenjpeg     enable JPEG 2000 encoding/decoding via OpenJPEG [no]
    --enable-libpulse        enable Pulseaudio input via libpulse [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac support via libschroedinger [no]
diff --cc doc/APIchanges
@@@ -15,29 -13,9 +15,32 @@@ libavutil:     2011-04-1
  
  API changes, most recent first:
  
 +2012-04-11 - xxxxxxx - lavu 51.58.100 - error.h
 +  Add av_make_error_string() and av_err2str() utilities to
 +  libavutil/error.h.
 +
 +2012-06-05 - xxxxxxx - lavc 54.24.100
 +  Add pkt_duration field to AVFrame.
 +
 +2012-05-24 - xxxxxxx - lavu 51.54.100
 +  Move AVPALETTE_SIZE and AVPALETTE_COUNT macros from
 +  libavcodec/avcodec.h to libavutil/pixfmt.h.
 +
 +2012-05-07 - xxxxxxx - lavf 54.5.100
 +  Add av_guess_sample_aspect_ratio() function.
 +
 +2012-04-20 - xxxxxxx - lavfi 2.70.100
 +  Add avfilter_unref_bufferp() to avfilter.h.
 +
 +2012-04-12 - xxxxxxx - lavfi 2.68.100
 +  Install libavfilter/asrc_abuffer.h public header.
 +
 +2012-03-26 - a67d9cf - lavfi 2.66.100
 +  Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
 +
+ 2012-xx-xx - xxxxxxx - lavr 0.0.3
+   Add a parameter to avresample_build_matrix() for Dolby/DPLII downmixing.
  2012-xx-xx - xxxxxxx - lavfi 2.23.0 - avfilter.h
    Add AVFilterContext.nb_inputs/outputs. Deprecate
    AVFilterContext.input/output_count.
@@@ -267,12 -237,20 +267,20 @@@ URL of the target stream
  
  @end table
  
 -For example to read with @command{avplay} a multimedia resource named
 +For example to read with @command{ffplay} a multimedia resource named
  "sample" from the application "vod" from an RTMP server "myserver":
  @example
 -avplay rtmp://myserver/vod/sample
 +ffplay rtmp://myserver/vod/sample
  @end example
  
+ @section rtmpt
+ Real-Time Messaging Protocol tunneled through HTTP.
+ The Real-Time Messaging Protocol tunneled through HTTP (RTMPT) is used
+ for streaming multimedia content within HTTP requests to traverse
+ firewalls.
  @section rtmp, rtmpe, rtmps, rtmpt, rtmpte
  
  Real-Time Messaging Protocol and its variants supported through
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,fdcff50..c431d28
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,239 +1,239 @@@
 - * This file is part of Libav.
+ /*
+  * RTMP HTTP network protocol
+  * Copyright (c) 2012 Samuel Pitoiset
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ /**
+  * @file
+  * RTMP HTTP protocol
+  */
+ #include "libavutil/avstring.h"
+ #include "libavutil/intfloat.h"
+ #include "libavutil/opt.h"
+ #include "internal.h"
+ #include "http.h"
+ #define RTMPT_DEFAULT_PORT 80
+ /* protocol handler context */
+ typedef struct RTMP_HTTPContext {
+     URLContext   *stream;           ///< HTTP stream
+     char         host[256];         ///< hostname of the server
+     int          port;              ///< port to connect (default is 80)
+     char         client_id[64];     ///< client ID used for all requests except the first one
+     int          seq;               ///< sequence ID used for all requests
+     uint8_t      *out_data;         ///< output buffer
+     int          out_size;          ///< current output buffer size
+     int          out_capacity;      ///< current output buffer capacity
+     int          initialized;       ///< flag indicating when the http context is initialized
+     int          finishing;         ///< flag indicating when the client closes the connection
+ } RTMP_HTTPContext;
+ static int rtmp_http_send_cmd(URLContext *h, const char *cmd)
+ {
+     RTMP_HTTPContext *rt = h->priv_data;
+     char uri[2048];
+     uint8_t c;
+     int ret;
+     ff_url_join(uri, sizeof(uri), "http", NULL, rt->host, rt->port,
+                 "/%s/%s/%d", cmd, rt->client_id, rt->seq++);
+     av_opt_set_bin(rt->stream->priv_data, "post_data", rt->out_data,
+                    rt->out_size, 0);
+     /* send a new request to the server */
+     if ((ret = ff_http_do_new_request(rt->stream, uri)) < 0)
+         return ret;
+     /* re-init output buffer */
+     rt->out_size = 0;
+     /* read the first byte which contains the polling interval */
+     if ((ret = ffurl_read(rt->stream, &c, 1)) < 0)
+         return ret;
+     return ret;
+ }
+ static int rtmp_http_write(URLContext *h, const uint8_t *buf, int size)
+ {
+     RTMP_HTTPContext *rt = h->priv_data;
+     void *ptr;
+     if (rt->out_size + size > rt->out_capacity) {
+         rt->out_capacity = (rt->out_size + size) * 2;
+         ptr = av_realloc(rt->out_data, rt->out_capacity);
+         if (!ptr)
+             return AVERROR(ENOMEM);
+         rt->out_data = ptr;
+     }
+     memcpy(rt->out_data + rt->out_size, buf, size);
+     rt->out_size += size;
+     return size;
+ }
+ static int rtmp_http_read(URLContext *h, uint8_t *buf, int size)
+ {
+     RTMP_HTTPContext *rt = h->priv_data;
+     int ret, off = 0;
+     /* try to read at least 1 byte of data */
+     do {
+         ret = ffurl_read(rt->stream, buf + off, size);
+         if (ret < 0 && ret != AVERROR_EOF)
+             return ret;
+         if (ret == AVERROR_EOF) {
+             if (rt->finishing) {
+                 /* Do not send new requests when the client wants to
+                  * close the connection. */
+                 return AVERROR(EAGAIN);
+             }
+             /* When the client has reached end of file for the last request,
+              * we have to send a new request if we have buffered data.
+              * Otherwise, we have to send an idle POST. */
+             if (rt->out_size > 0) {
+                 if ((ret = rtmp_http_send_cmd(h, "send")) < 0)
+                     return ret;
+             } else {
+                 if ((ret = rtmp_http_write(h, "", 1)) < 0)
+                     return ret;
+                 if ((ret = rtmp_http_send_cmd(h, "idle")) < 0)
+                     return ret;
+             }
+             if (h->flags & AVIO_FLAG_NONBLOCK) {
+                 /* no incoming data to handle in nonblocking mode */
+                 return AVERROR(EAGAIN);
+             }
+         } else {
+             off  += ret;
+             size -= ret;
+         }
+     } while (off <= 0);
+     return off;
+ }
+ static int rtmp_http_close(URLContext *h)
+ {
+     RTMP_HTTPContext *rt = h->priv_data;
+     uint8_t tmp_buf[2048];
+     int ret = 0;
+     if (rt->initialized) {
+         /* client wants to close the connection */
+         rt->finishing = 1;
+         do {
+             ret = rtmp_http_read(h, tmp_buf, sizeof(tmp_buf));
+         } while (ret > 0);
+         /* re-init output buffer before sending the close command */
+         rt->out_size = 0;
+         if ((ret = rtmp_http_write(h, "", 1)) == 1)
+             ret = rtmp_http_send_cmd(h, "close");
+     }
+     av_freep(&rt->out_data);
+     ffurl_close(rt->stream);
+     return ret;
+ }
+ static int rtmp_http_open(URLContext *h, const char *uri, int flags)
+ {
+     RTMP_HTTPContext *rt = h->priv_data;
+     char headers[1024], url[1024];
+     int ret, off = 0;
+     av_url_split(NULL, 0, NULL, 0, rt->host, sizeof(rt->host), &rt->port,
+                  NULL, 0, uri);
+     if (rt->port < 0)
+         rt->port = RTMPT_DEFAULT_PORT;
+     /* This is the first request that is sent to the server in order to
+      * register a client on the server and start a new session. The server
+      * replies with a unique id (usually a number) that is used by the client
+      * for all future requests.
+      * Note: the reply doesn't contain a value for the polling interval.
+      * A successful connect resets the consecutive index that is used
+      * in the URLs. */
+     ff_url_join(url, sizeof(url), "http", NULL, rt->host, rt->port, "/open/1");
+     /* alloc the http context */
+     if ((ret = ffurl_alloc(&rt->stream, url, AVIO_FLAG_READ_WRITE, NULL)) < 0)
+         goto fail;
+     /* set options */
+     snprintf(headers, sizeof(headers),
+              "Cache-Control: no-cache\r\n"
+              "Content-type: application/x-fcs\r\n"
+              "User-Agent: Shockwave Flash\r\n");
+     av_opt_set(rt->stream->priv_data, "headers", headers, 0);
+     av_opt_set(rt->stream->priv_data, "multiple_requests", "1", 0);
+     av_opt_set_bin(rt->stream->priv_data, "post_data", "", 1, 0);
+     /* open the http context */
+     if ((ret = ffurl_connect(rt->stream, NULL)) < 0)
+         goto fail;
+     /* read the server reply which contains a unique ID */
+     for (;;) {
+         ret = ffurl_read(rt->stream, rt->client_id + off, sizeof(rt->client_id) - off);
+         if (ret == AVERROR_EOF)
+             break;
+         if (ret < 0)
+             goto fail;
+         off += ret;
+         if (off == sizeof(rt->client_id)) {
+             ret = AVERROR(EIO);
+             goto fail;
+         }
+     }
+     while (off > 0 && isspace(rt->client_id[off - 1]))
+         off--;
+     rt->client_id[off] = '\0';
+     /* http context is now initialized */
+     rt->initialized = 1;
+     return 0;
+ fail:
+     rtmp_http_close(h);
+     return ret;
+ }
+ URLProtocol ff_rtmphttp_protocol = {
+     .name           = "rtmphttp",
+     .url_open       = rtmp_http_open,
+     .url_read       = rtmp_http_read,
+     .url_write      = rtmp_http_write,
+     .url_close      = rtmp_http_close,
+     .priv_data_size = sizeof(RTMP_HTTPContext),
+     .flags          = URL_PROTOCOL_FLAG_NETWORK,
+ };
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/avutil.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 54
- #define LIBAVFORMAT_VERSION_MINOR  7
 -#define LIBAVFORMAT_VERSION_MINOR  4
 -#define LIBAVFORMAT_VERSION_MICRO  1
++#define LIBAVFORMAT_VERSION_MINOR  8
 +#define LIBAVFORMAT_VERSION_MICRO 100
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \
Simple merge