[SCM] libgroove/upstream: update bundled libav to e780c3daa

andrewrk-guest at users.alioth.debian.org andrewrk-guest at users.alioth.debian.org
Sat May 31 19:00:02 UTC 2014


The following commit has been merged in the upstream branch:
commit 4f01f123c2519be431b4ee33ffac2ad478e1e0d5
Author: Andrew Kelley <superjoe30 at gmail.com>
Date:   Sun May 25 12:52:46 2014 -0700

    update bundled libav to e780c3daa
    
    This is the latest stable 10 release.

diff --git a/deps/libav/Changelog b/deps/libav/Changelog
index 29902f4..30e63c9 100644
--- a/deps/libav/Changelog
+++ b/deps/libav/Changelog
@@ -1,6 +1,31 @@
 Entries are sorted chronologically from oldest to youngest within each release,
 releases are sorted from youngest to oldest.
 
+version 10.1:
+- pcm-dvd: Fix 20bit decoding (bug/592)
+- avi: Improve non-interleaved detection (bug/666)
+- arm: hpeldsp: fix put_pixels8_y2_{,no_rnd_}armv6
+- arm: hpeldsp: prevent overreads in armv6 asm (bug/646)
+- avfilter: Add missing emms_c when needed
+- rtmpproto: Check the buffer sizes when copying app/playpath strings
+- swscale: Fix an undefined behaviour
+- vp9: Read the frame size as unsigned
+- dcadec: Use correct channel count in stereo downmix check
+- dcadec: Do not decode the XCh extension when downmixing to stereo
+- matroska: add the Opus mapping
+- matroskadec: read the CodecDelay element
+- rtmpproto: Make sure to pass on the error code if read_connect failed
+- lavr: allocate the resampling buffer with a positive size
+- mp3enc: Properly write bitrate value in XING header (debian/736088)
+- golomb: Fix the implementation of get_se_golomb_long
+
+version 10:
+- af_channelmap: fix ONE_STR mapping mode
+- matroskaenc: HEVC fixeswrite private data in hvcC format for HEVC.
+- doc: Point to the correct, actually maintained gas-preprocessor repo
+- http: Add support reading ICY metadata
+- configure: Support older version of openjpeg1
+
 version 10~beta2:
 - compand audio filter
 - and many various smaller fixes, for a full changelog, please refer to:
diff --git a/deps/libav/libavcodec/dcadec.c b/deps/libav/libavcodec/dcadec.c
index 6c240ee..ce8660d 100644
--- a/deps/libav/libavcodec/dcadec.c
+++ b/deps/libav/libavcodec/dcadec.c
@@ -1856,6 +1856,16 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
     if (s->amode < 16) {
         avctx->channel_layout = dca_core_channel_layout[s->amode];
 
+        if (s->prim_channels + !!s->lfe > 2 &&
+            avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) {
+            /*
+             * Neither the core's auxiliary data nor our default tables contain
+             * downmix coefficients for the additional channel coded in the XCh
+             * extension, so when we're doing a Stereo downmix, don't decode it.
+             */
+            s->xch_disable = 1;
+        }
+
 #if FF_API_REQUEST_CHANNELS
 FF_DISABLE_DEPRECATION_WARNINGS
         if (s->xch_present && !s->xch_disable &&
@@ -1886,7 +1896,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
             s->channel_order_tab[channels - 1 - !!s->lfe] < 0)
             return AVERROR_INVALIDDATA;
 
-        if (s->prim_channels + !!s->lfe > 2 &&
+        if (num_core_channels + !!s->lfe > 2 &&
             avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) {
             channels = 2;
             s->output = s->prim_channels == 2 ? s->amode : DCA_STEREO;
@@ -1900,7 +1910,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
             if (s->core_downmix && (s->core_downmix_amode == DCA_STEREO ||
                                     s->core_downmix_amode == DCA_STEREO_TOTAL)) {
                 int sign, code;
-                for (i = 0; i < s->prim_channels + !!s->lfe; i++) {
+                for (i = 0; i < num_core_channels + !!s->lfe; i++) {
                     sign = s->core_downmix_codes[i][0] & 0x100 ? 1 : -1;
                     code = s->core_downmix_codes[i][0] & 0x0FF;
                     s->downmix_coef[i][0] = (!code ? 0.0f :
@@ -1918,19 +1928,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
                            "Invalid channel mode %d\n", am);
                     return AVERROR_INVALIDDATA;
                 }
-                if (s->prim_channels + !!s->lfe >
+                if (num_core_channels + !!s->lfe >
                     FF_ARRAY_ELEMS(dca_default_coeffs[0])) {
                     avpriv_request_sample(s->avctx, "Downmixing %d channels",
                                           s->prim_channels + !!s->lfe);
                     return AVERROR_PATCHWELCOME;
                 }
-                for (i = 0; i < s->prim_channels + !!s->lfe; i++) {
+                for (i = 0; i < num_core_channels + !!s->lfe; i++) {
                     s->downmix_coef[i][0] = dca_default_coeffs[am][i][0];
                     s->downmix_coef[i][1] = dca_default_coeffs[am][i][1];
                 }
             }
             av_dlog(s->avctx, "Stereo downmix coeffs:\n");
-            for (i = 0; i < s->prim_channels + !!s->lfe; i++) {
+            for (i = 0; i < num_core_channels + !!s->lfe; i++) {
                 av_dlog(s->avctx, "L, input channel %d = %f\n", i,
                         s->downmix_coef[i][0]);
                 av_dlog(s->avctx, "R, input channel %d = %f\n", i,
diff --git a/deps/libav/libavcodec/pcm-dvd.c b/deps/libav/libavcodec/pcm-dvd.c
index 172e93a..0872d29 100644
--- a/deps/libav/libavcodec/pcm-dvd.c
+++ b/deps/libav/libavcodec/pcm-dvd.c
@@ -177,11 +177,11 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src,
                 dst32[2] = bytestream2_get_be16u(&gb) << 16;
                 dst32[3] = bytestream2_get_be16u(&gb) << 16;
                 t = bytestream2_get_byteu(&gb);
-                *dst32 += (t & 0xf0) << 8;
-                *dst32 += (t & 0x0f) << 12;
+                *dst32++ += (t & 0xf0) << 8;
+                *dst32++ += (t & 0x0f) << 12;
                 t = bytestream2_get_byteu(&gb);
-                *dst32 += (t & 0xf0) << 8;
-                *dst32 += (t & 0x0f) << 12;
+                *dst32++ += (t & 0xf0) << 8;
+                *dst32++ += (t & 0x0f) << 12;
             }
         } while (--blocks);
         return dst32;
diff --git a/deps/libav/libavcodec/vp9.c b/deps/libav/libavcodec/vp9.c
index c04a3b8..2a6a138 100644
--- a/deps/libav/libavcodec/vp9.c
+++ b/deps/libav/libavcodec/vp9.c
@@ -1198,7 +1198,7 @@ static int vp9_decode_packet(AVCodecContext *avctx, void *frame,
             const uint8_t *idx = data + size + 1 - idx_sz;
 
             while (n_frames--) {
-                int sz = AV_RL32(idx);
+                unsigned sz = AV_RL32(idx);
 
                 if (nbytes < 4)
                     sz &= (1 << (8 * nbytes)) - 1;
@@ -1206,7 +1206,7 @@ static int vp9_decode_packet(AVCodecContext *avctx, void *frame,
 
                 if (sz > size) {
                     av_log(avctx, AV_LOG_ERROR,
-                           "Superframe packet size too big: %d > %d\n",
+                           "Superframe packet size too big: %u > %d\n",
                            sz, size);
                     return AVERROR_INVALIDDATA;
                 }
diff --git a/deps/libav/libavfilter/af_volume.c b/deps/libav/libavfilter/af_volume.c
index 12d496e..59223e5 100644
--- a/deps/libav/libavfilter/af_volume.c
+++ b/deps/libav/libavfilter/af_volume.c
@@ -278,6 +278,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
         }
     }
 
+    emms_c();
+
     if (buf != out_buf)
         av_frame_free(&buf);
 
diff --git a/deps/libav/libavfilter/vf_gradfun.c b/deps/libav/libavfilter/vf_gradfun.c
index 79f6790..f7c4372 100644
--- a/deps/libav/libavfilter/vf_gradfun.c
+++ b/deps/libav/libavfilter/vf_gradfun.c
@@ -118,6 +118,7 @@ static void filter(GradFunContext *ctx, uint8_t *dst, uint8_t *src, int width, i
         ctx->filter_line(dst + y * dst_linesize, src + y * src_linesize, dc - r / 2, width, thresh, dither[y & 7]);
         if (++y >= height) break;
     }
+    emms_c();
 }
 
 static av_cold int init(AVFilterContext *ctx)
diff --git a/deps/libav/libavfilter/vf_hqdn3d.c b/deps/libav/libavfilter/vf_hqdn3d.c
index cd9f0d2..be6b761 100644
--- a/deps/libav/libavfilter/vf_hqdn3d.c
+++ b/deps/libav/libavfilter/vf_hqdn3d.c
@@ -147,6 +147,7 @@ static void denoise_depth(HQDN3DContext *s,
     else
         denoise_temporal(src, dst, frame_ant,
                          w, h, sstride, dstride, temporal, depth);
+    emms_c();
 }
 
 #define denoise(...) \
diff --git a/deps/libav/libavformat/avidec.c b/deps/libav/libavformat/avidec.c
index 6f80d21..e851f0b 100644
--- a/deps/libav/libavformat/avidec.c
+++ b/deps/libav/libavformat/avidec.c
@@ -795,7 +795,11 @@ fail:
     if (!avi->index_loaded && pb->seekable)
         avi_load_index(s);
     avi->index_loaded     = 1;
-    avi->non_interleaved |= guess_ni_flag(s);
+
+    if ((ret = guess_ni_flag(s)) < 0)
+        return ret;
+
+    avi->non_interleaved |= ret;
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
         if (st->nb_index_entries)
@@ -1307,6 +1311,64 @@ static int avi_read_idx1(AVFormatContext *s, int size)
     return 0;
 }
 
+/* Scan the index and consider any file with streams more than
+ * 2 seconds or 64MB apart non-interleaved. */
+static int check_stream_max_drift(AVFormatContext *s)
+{
+    int64_t min_pos, pos;
+    int i;
+    int *idx = av_mallocz_array(s->nb_streams, sizeof(*idx));
+    if (!idx)
+        return AVERROR(ENOMEM);
+
+    for (min_pos = pos = 0; min_pos != INT64_MAX; pos = min_pos + 1LU) {
+        int64_t max_dts = INT64_MIN / 2;
+        int64_t min_dts = INT64_MAX / 2;
+        int64_t max_buffer = 0;
+
+        min_pos = INT64_MAX;
+
+        for (i = 0; i < s->nb_streams; i++) {
+            AVStream *st = s->streams[i];
+            AVIStream *ast = st->priv_data;
+            int n = st->nb_index_entries;
+            while (idx[i] < n && st->index_entries[idx[i]].pos < pos)
+                idx[i]++;
+            if (idx[i] < n) {
+                int64_t dts;
+                dts = av_rescale_q(st->index_entries[idx[i]].timestamp /
+                                   FFMAX(ast->sample_size, 1),
+                                   st->time_base, AV_TIME_BASE_Q);
+                min_dts = FFMIN(min_dts, dts);
+                min_pos = FFMIN(min_pos, st->index_entries[idx[i]].pos);
+            }
+        }
+        for (i = 0; i < s->nb_streams; i++) {
+            AVStream *st = s->streams[i];
+            AVIStream *ast = st->priv_data;
+
+            if (idx[i] && min_dts != INT64_MAX / 2) {
+                int64_t dts;
+                dts = av_rescale_q(st->index_entries[idx[i] - 1].timestamp /
+                                   FFMAX(ast->sample_size, 1),
+                                   st->time_base, AV_TIME_BASE_Q);
+                max_dts = FFMAX(max_dts, dts);
+                max_buffer = FFMAX(max_buffer,
+                                   av_rescale(dts - min_dts,
+                                              st->codec->bit_rate,
+                                              AV_TIME_BASE));
+            }
+        }
+        if (max_dts - min_dts > 2 * AV_TIME_BASE ||
+            max_buffer > 1024 * 1024 * 8 * 8) {
+            av_free(idx);
+            return 1;
+        }
+    }
+    av_free(idx);
+    return 0;
+}
+
 static int guess_ni_flag(AVFormatContext *s)
 {
     int i;
@@ -1336,7 +1398,11 @@ static int guess_ni_flag(AVFormatContext *s)
             first_end = st->index_entries[n - 1].pos;
     }
     avio_seek(s->pb, oldpos, SEEK_SET);
-    return last_start > first_end;
+
+    if (last_start > first_end)
+        return 1;
+
+    return check_stream_max_drift(s);
 }
 
 static int avi_load_index(AVFormatContext *s)
diff --git a/deps/libav/libavformat/matroska.c b/deps/libav/libavformat/matroska.c
index 410e2f4..9628abc 100644
--- a/deps/libav/libavformat/matroska.c
+++ b/deps/libav/libavformat/matroska.c
@@ -32,6 +32,7 @@ const CodecTags ff_mkv_codec_tags[]={
     {"A_MPEG/L2"        , AV_CODEC_ID_MP2},
     {"A_MPEG/L1"        , AV_CODEC_ID_MP2},
     {"A_MPEG/L3"        , AV_CODEC_ID_MP3},
+    {"A_OPUS"           , AV_CODEC_ID_OPUS},
     {"A_PCM/FLOAT/IEEE" , AV_CODEC_ID_PCM_F32LE},
     {"A_PCM/FLOAT/IEEE" , AV_CODEC_ID_PCM_F64LE},
     {"A_PCM/INT/BIG"    , AV_CODEC_ID_PCM_S16BE},
diff --git a/deps/libav/libavformat/matroska.h b/deps/libav/libavformat/matroska.h
index 0dbc724..667f92a 100644
--- a/deps/libav/libavformat/matroska.h
+++ b/deps/libav/libavformat/matroska.h
@@ -86,6 +86,7 @@
 #define MATROSKA_ID_CODECINFOURL 0x3B4040
 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240
 #define MATROSKA_ID_CODECDECODEALL 0xAA
+#define MATROSKA_ID_CODECDELAY 0x56AA
 #define MATROSKA_ID_TRACKNAME  0x536E
 #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
 #define MATROSKA_ID_TRACKFLAGENABLED 0xB9
diff --git a/deps/libav/libavformat/matroskadec.c b/deps/libav/libavformat/matroskadec.c
index bcd7d1a..8aae26c 100644
--- a/deps/libav/libavformat/matroskadec.c
+++ b/deps/libav/libavformat/matroskadec.c
@@ -44,6 +44,7 @@
 #include "libavutil/avstring.h"
 #include "libavutil/lzo.h"
 #include "libavutil/dict.h"
+#include "libavutil/mathematics.h"
 #if CONFIG_ZLIB
 #include <zlib.h>
 #endif
@@ -148,6 +149,7 @@ typedef struct {
     MatroskaTrackVideo video;
     MatroskaTrackAudio audio;
     EbmlList encodings;
+    uint64_t codec_delay;
 
     AVStream *stream;
     int64_t end_timecode;
@@ -348,6 +350,7 @@ static EbmlSyntax matroska_track[] = {
     { MATROSKA_ID_TRACKTYPE,            EBML_UINT, 0, offsetof(MatroskaTrack,type) },
     { MATROSKA_ID_CODECID,              EBML_STR,  0, offsetof(MatroskaTrack,codec_id) },
     { MATROSKA_ID_CODECPRIVATE,         EBML_BIN,  0, offsetof(MatroskaTrack,codec_priv) },
+    { MATROSKA_ID_CODECDELAY,           EBML_UINT, 0, offsetof(MatroskaTrack, codec_delay) },
     { MATROSKA_ID_TRACKLANGUAGE,        EBML_UTF8, 0, offsetof(MatroskaTrack,language), {.s="eng"} },
     { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack,default_duration) },
     { MATROSKA_ID_TRACKTIMECODESCALE,   EBML_FLOAT,0, offsetof(MatroskaTrack,time_scale), {.f=1.0} },
@@ -1658,6 +1661,11 @@ static int matroska_read_header(AVFormatContext *s)
             track->time_scale = 1.0;
         avpriv_set_pts_info(st, 64, matroska->time_scale*track->time_scale, 1000*1000*1000); /* 64 bit pts in ns */
 
+        /* convert the delay from ns to the track timebase */
+        track->codec_delay = av_rescale_q(track->codec_delay,
+                                          (AVRational){ 1, 1000000000 },
+                                          st->time_base);
+
         st->codec->codec_id = codec_id;
         st->start_time = 0;
         if (strcmp(track->language, "und"))
@@ -2190,7 +2198,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
 
     if (cluster_time != (uint64_t)-1
         && (block_time >= 0 || cluster_time >= -block_time)) {
-        timecode = cluster_time + block_time;
+        timecode = cluster_time + block_time - track->codec_delay;
         if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE
             && timecode < track->end_timecode)
             is_keyframe = 0;  /* overlapping subtitles are not key frame */
diff --git a/deps/libav/libavformat/mp3enc.c b/deps/libav/libavformat/mp3enc.c
index 46889fc..9326258 100644
--- a/deps/libav/libavformat/mp3enc.c
+++ b/deps/libav/libavformat/mp3enc.c
@@ -119,8 +119,11 @@ static void mp3_write_xing(AVFormatContext *s)
     MPADecodeHeader  mpah;
     int srate_idx, i, channels;
     int bitrate_idx;
+    int best_bitrate_idx;
+    int best_bitrate_error = INT_MAX;
     int xing_offset;
     int ver = 0;
+    int lsf, bytes_needed;
 
     if (!s->pb->seekable || !mp3->write_xing)
         return;
@@ -150,21 +153,51 @@ static void mp3_write_xing(AVFormatContext *s)
              return;
     }
 
-    /* 64 kbps frame, should be large enough */
-    bitrate_idx = (ver == 3) ? 5 : 8;
-
     /* dummy MPEG audio header */
     header  =  0xff                                  << 24; // sync
     header |= (0x7 << 5 | ver << 3 | 0x1 << 1 | 0x1) << 16; // sync/audio-version/layer 3/no crc*/
-    header |= (bitrate_idx << 4 | srate_idx << 2)    <<  8;
+    header |= (srate_idx << 2) << 8;
     header |= channels << 6;
+
+    lsf = !((header & (1 << 20) && header & (1 << 19)));
+
+    xing_offset  = xing_offtbl[ver != 3][channels == 1];
+    bytes_needed = 4              // header
+                 + xing_offset
+                 + 4              // xing tag
+                 + 4              // frames/size/toc flags
+                 + 4              // frames
+                 + 4              // size
+                 + XING_TOC_SIZE; // toc
+
+    for (bitrate_idx = 1; bitrate_idx < 15; bitrate_idx++) {
+        int bit_rate = 1000 * avpriv_mpa_bitrate_tab[lsf][3 - 1][bitrate_idx];
+        int error    = FFABS(bit_rate - codec->bit_rate);
+
+        if (error < best_bitrate_error){
+            best_bitrate_error = error;
+            best_bitrate_idx   = bitrate_idx;
+        }
+    }
+
+    for (bitrate_idx = best_bitrate_idx; bitrate_idx < 15; bitrate_idx++) {
+        int32_t mask = bitrate_idx << (4 + 8);
+        header |= mask;
+
+        avpriv_mpegaudio_decode_header(&mpah, header);
+
+        if (bytes_needed <= mpah.frame_size)
+            break;
+
+        header &= ~mask;
+    }
+
     avio_wb32(s->pb, header);
 
     avpriv_mpegaudio_decode_header(&mpah, header);
 
     av_assert0(mpah.frame_size >= XING_MAX_SIZE);
 
-    xing_offset = xing_offtbl[ver != 3][codec->channels == 1];
     ffio_fill(s->pb, 0, xing_offset);
     mp3->xing_offset = avio_tell(s->pb);
     ffio_wfourcc(s->pb, "Xing");
@@ -180,8 +213,7 @@ static void mp3_write_xing(AVFormatContext *s)
     for (i = 0; i < XING_TOC_SIZE; i++)
         avio_w8(s->pb, 255 * i / XING_TOC_SIZE);
 
-    mpah.frame_size -= 4 + xing_offset + 4 + 4 + 4 + 4 + XING_TOC_SIZE;
-    ffio_fill(s->pb, 0, mpah.frame_size);
+    ffio_fill(s->pb, 0, mpah.frame_size - bytes_needed);
 }
 
 /*
diff --git a/deps/libav/libavformat/rtmpproto.c b/deps/libav/libavformat/rtmpproto.c
index 51381a4..ead5ccd 100644
--- a/deps/libav/libavformat/rtmpproto.c
+++ b/deps/libav/libavformat/rtmpproto.c
@@ -2483,10 +2483,10 @@ reconnect:
             fname = strchr(p + 1, '/');
             if (!fname || (c && c < fname)) {
                 fname = p + 1;
-                av_strlcpy(rt->app, path + 1, p - path);
+                av_strlcpy(rt->app, path + 1, FFMIN(p - path, APP_MAX_LENGTH));
             } else {
                 fname++;
-                av_strlcpy(rt->app, path + 1, fname - path - 1);
+                av_strlcpy(rt->app, path + 1, FFMIN(fname - path - 1, APP_MAX_LENGTH));
             }
         }
     }
@@ -2555,7 +2555,7 @@ reconnect:
         if ((ret = gen_connect(s, rt)) < 0)
             goto fail;
     } else {
-        if (read_connect(s, s->priv_data) < 0)
+        if ((ret = read_connect(s, s->priv_data)) < 0)
             goto fail;
     }
 
diff --git a/deps/libav/libavresample/utils.c b/deps/libav/libavresample/utils.c
index 2dd3d06..bc295d6 100644
--- a/deps/libav/libavresample/utils.c
+++ b/deps/libav/libavresample/utils.c
@@ -184,7 +184,7 @@ int avresample_open(AVAudioResampleContext *avr)
     }
     if (avr->resample_needed) {
         avr->resample_out_buffer = ff_audio_data_alloc(avr->out_channels,
-                                                       0, avr->internal_sample_fmt,
+                                                       1024, avr->internal_sample_fmt,
                                                        "resample_out_buffer");
         if (!avr->resample_out_buffer) {
             ret = AVERROR(EINVAL);
diff --git a/deps/libav/libswscale/utils.c b/deps/libav/libswscale/utils.c
index 2111fc2..ea5f368 100644
--- a/deps/libav/libswscale/utils.c
+++ b/deps/libav/libswscale/utils.c
@@ -326,7 +326,7 @@ static av_cold int initFilter(int16_t **outFilter, int32_t **filterPos,
 
         xDstInSrc = xInc - 0x10000;
         for (i = 0; i < dstW; i++) {
-            int xx = (xDstInSrc - ((filterSize - 2) << 16)) / (1 << 17);
+            int xx = (xDstInSrc - ((int64_t)(filterSize - 2) << 16)) / (1 << 17);
             int j;
             (*filterPos)[i] = xx;
             for (j = 0; j < filterSize; j++) {

-- 
libgroove packaging



More information about the pkg-multimedia-commits mailing list