<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.video.libav.devel">
    <title>gmane.comp.video.libav.devel</title>
    <link>http://blog.gmane.org/gmane.comp.video.libav.devel</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46316"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46315"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46314"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46313"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46312"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46311"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46310"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46309"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46308"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46307"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46306"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46305"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46304"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46303"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46302"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46301"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46300"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46299"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46298"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.video.libav.devel/46297"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46316">
    <title>[PATCH] proresenc: alpha coding support</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46316</link>
    <description>&lt;pre&gt;---
mostly as rfc/call for testing but it should be good enough anyway
---
 libavcodec/proresenc.c |  241 +++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 220 insertions(+), 21 deletions(-)

diff --git a/libavcodec/proresenc.c b/libavcodec/proresenc.c
index 5a8cea8..d989f8c 100644
--- a/libavcodec/proresenc.c
+++ b/libavcodec/proresenc.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -21,6 +21,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 
 #include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
 #include "avcodec.h"
 #include "dsputil.h"
 #include "put_bits.h"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,13 +35,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 #define MAX_MBS_PER_SLICE 8
 
-#define MAX_PLANES 3 // should be increased to 4 when there's AV_PIX_FMT_YUV444AP10
+#define MAX_PLANES 4
 
 enum {
     PRORES_PROFILE_PROXY = 0,
     PRORES_PROFILE_LT,
     PRORES_PROFILE_STANDARD,
     PRORES_PROFILE_HQ,
+    PRORES_PROFILE_4444,
 };
 
 enum {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -119,7 +121,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct prores_profile {
     int         max_quant;
     int         br_tab[NUM_MB_LIMITS];
     int         quant;
-} prores_profile_info[4] = {
+} prores_profile_info[5] = {
     {
         .full_name = "proxy",
         .tag       = MKTAG('a', 'p', 'c', 'o'),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -151,8 +153,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct prores_profile {
         .max_quant = 6,
         .br_tab    = { 1566, 1216, 1070, 950 },
         .quant     = QUANT_MAT_HQ,
+    },
+    {
+        .full_name = "4444",
+        .tag       = MKTAG('a', 'p', '4', 'h'),
+        .min_quant = 1,
+        .max_quant = 6,
+        .br_tab    = { 2350, 1828, 1600, 1425 },
+        .quant     = QUANT_MAT_HQ,
     }
-// for 4444 profile bitrate numbers are { 2350, 1828, 1600, 1425 }
 };
 
 #define TRELLIS_WIDTH 16
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -195,6 +204,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct ProresContext {
     int num_planes;
     int bits_per_mb;
     int force_quant;
+    int alpha_bits;
 
     char *vendor;
     int quant_sel;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -280,6 +290,34 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void get_slice_data(ProresContext *ctx, const uint16_t *src,
     }
 }
 
+static void get_alpha_data(ProresContext *ctx, const uint16_t *src,
+                           int linesize, int x, int y, int w, int h,
+                           int16_t *blocks, int mbs_per_slice, int abits)
+{
+    const int slice_width = 16 * mbs_per_slice;
+    int i, j, copy_w, copy_h;
+
+    copy_w = FFMIN(w - x, slice_width);
+    copy_h = FFMIN(h - y, 16);
+    for (i = 0; i &amp;lt; copy_h; i++) {
+        memcpy(blocks, src, copy_w * sizeof(*src));
+        if (abits == 8)
+            for (j = 0; j &amp;lt; copy_w; j++)
+                blocks[j] &amp;gt;&amp;gt;= 2;
+        else
+            for (j = 0; j &amp;lt; copy_w; j++)
+                blocks[j] = (blocks[j] &amp;lt;&amp;lt; 6) | (blocks[j] &amp;gt;&amp;gt; 4);
+        for (j = copy_w; j &amp;lt; slice_width; j++)
+            blocks[j] = blocks[copy_w - 1];
+        blocks += slice_width;
+        src    += linesize &amp;gt;&amp;gt; 1;
+    }
+    for (; i &amp;lt; 16; i++) {
+        memcpy(blocks, blocks - slice_width, slice_width * sizeof(*blocks));
+        blocks += slice_width;
+    }
+}
+
 /**
  * Write an unsigned rice/exp golomb codeword.
  */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -394,6 +432,73 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int encode_slice_plane(ProresContext *ctx, PutBitContext *pb,
     return (put_bits_count(pb) - saved_pos) &amp;gt;&amp;gt; 3;
 }
 
+static void put_alpha_diff(PutBitContext *pb, int cur, int prev, int abits)
+{
+    const int mask  = (1 &amp;lt;&amp;lt; abits) - 1;
+    const int dbits = (abits == 8) ? 4 : 7;
+    const int dsize = 1 &amp;lt;&amp;lt; dbits - 1;
+    int diff = cur - prev;
+
+    diff &amp;amp;= mask;
+    if (diff &amp;gt;= (1 &amp;lt;&amp;lt; abits) - dsize)
+        diff -= 1 &amp;lt;&amp;lt; abits;
+    if (diff &amp;lt; -dsize || diff &amp;gt; dsize || !diff) {
+        put_bits(pb, 1, 1);
+        put_bits(pb, abits, diff);
+    } else {
+        put_bits(pb, 1, 0);
+        put_bits(pb, dbits - 1, FFABS(diff) - 1);
+        put_bits(pb, 1, diff &amp;lt; 0);
+    }
+}
+
+static void put_alpha_run(PutBitContext *pb, int run)
+{
+    if (run) {
+        put_bits(pb, 1, 0);
+        if (run &amp;lt; 0x10)
+            put_bits(pb, 4, run);
+        else
+            put_bits(pb, 15, run);
+    } else {
+        put_bits(pb, 1, 1);
+    }
+}
+
+// todo alpha quantisation for high quants
+static int encode_alpha_plane(ProresContext *ctx, PutBitContext *pb,
+                              const uint16_t *src, int linesize,
+                              int mbs_per_slice, uint16_t *blocks,
+                              int quant)
+{
+    const int abits = ctx-&amp;gt;alpha_bits;
+    const int mask  = (1 &amp;lt;&amp;lt; abits) - 1;
+    const int num_coeffs = mbs_per_slice * 256;
+    int saved_pos = put_bits_count(pb);
+    int prev = mask, cur;
+    int idx = 0;
+    int run = 0;
+
+    cur = blocks[idx++];
+    put_alpha_diff(pb, cur, prev, abits);
+    prev = cur;
+    do {
+        cur = blocks[idx++];
+        if (cur != prev) {
+            put_alpha_run (pb, run);
+            put_alpha_diff(pb, cur, prev, abits);
+            prev = cur;
+            run  = 0;
+        } else {
+            run++;
+        }
+    } while (idx &amp;lt; num_coeffs);
+    if (run)
+        put_alpha_run(pb, run);
+    flush_put_bits(pb);
+    return (put_bits_count(pb) - saved_pos) &amp;gt;&amp;gt; 3;
+}
+
 static int encode_slice(AVCodecContext *avctx, const AVFrame *pic,
                         PutBitContext *pb,
                         int sizes[4], int x, int y, int quant,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -444,14 +549,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int encode_slice(AVCodecContext *avctx, const AVFrame *pic,
         src = (const uint16_t*)(pic-&amp;gt;data[i] + yp * linesize +
                                 line_add * pic-&amp;gt;linesize[i]) + xp;
 
-        get_slice_data(ctx, src, linesize, xp, yp,
-                       pwidth, avctx-&amp;gt;height / ctx-&amp;gt;pictures_per_frame,
-                       ctx-&amp;gt;blocks[0], ctx-&amp;gt;emu_buf,
-                       mbs_per_slice, num_cblocks, is_chroma);
-        sizes[i] = encode_slice_plane(ctx, pb, src, linesize,
-                                      mbs_per_slice, ctx-&amp;gt;blocks[0],
-                                      num_cblocks, plane_factor,
-                                      qmat);
+        if (i &amp;lt; 3) {
+            get_slice_data(ctx, src, linesize, xp, yp,
+                           pwidth, avctx-&amp;gt;height / ctx-&amp;gt;pictures_per_frame,
+                           ctx-&amp;gt;blocks[0], ctx-&amp;gt;emu_buf,
+                           mbs_per_slice, num_cblocks, is_chroma);
+            sizes[i] = encode_slice_plane(ctx, pb, src, linesize,
+                                          mbs_per_slice, ctx-&amp;gt;blocks[0],
+                                          num_cblocks, plane_factor,
+                                          qmat);
+        } else {
+            get_alpha_data(ctx, src, linesize, xp, yp,
+                           pwidth, avctx-&amp;gt;height / ctx-&amp;gt;pictures_per_frame,
+                           ctx-&amp;gt;blocks[0], mbs_per_slice, ctx-&amp;gt;alpha_bits);
+            sizes[i] = encode_alpha_plane(ctx, pb, src, linesize,
+                                          mbs_per_slice, ctx-&amp;gt;blocks[0],
+                                          quant);
+        }
         total_size += sizes[i];
     }
     return total_size;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -564,6 +678,66 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int estimate_slice_plane(ProresContext *ctx, int *error, int plane,
     return FFALIGN(bits, 8);
 }
 
+static int est_alpha_diff(int cur, int prev, int abits)
+{
+    const int mask  = (1 &amp;lt;&amp;lt; abits) - 1;
+    const int dbits = (abits == 8) ? 4 : 7;
+    const int dsize = 1 &amp;lt;&amp;lt; dbits - 1;
+    int diff = cur - prev;
+
+    diff &amp;amp;= mask;
+    if (diff &amp;gt;= (1 &amp;lt;&amp;lt; abits) - dsize)
+        diff -= 1 &amp;lt;&amp;lt; abits;
+    if (diff &amp;lt; -dsize || diff &amp;gt; dsize || !diff)
+        return abits + 1;
+    else
+        return dbits + 1;
+}
+
+static int estimate_alpha_plane(ProresContext *ctx, int *error,
+                                const uint16_t *src, int linesize,
+                                int mbs_per_slice, int quant,
+                                int16_t *blocks)
+{
+    const int abits = ctx-&amp;gt;alpha_bits;
+    const int mask  = (1 &amp;lt;&amp;lt; abits) - 1;
+    const int num_coeffs = mbs_per_slice * 256;
+    int prev = mask, cur;
+    int idx = 0;
+    int run = 0;
+    int bits;
+
+    *error = 0;
+    cur = blocks[idx++];
+    bits = est_alpha_diff(cur, prev, abits);
+    prev = cur;
+    do {
+        cur = blocks[idx++];
+        if (cur != prev) {
+            if (!run)
+                bits++;
+            else if (run &amp;lt; 0x10)
+                bits += 4;
+            else
+                bits += 15;
+            bits += est_alpha_diff(cur, prev, abits);
+            prev = cur;
+            run  = 0;
+        } else {
+            run++;
+        }
+    } while (idx &amp;lt; num_coeffs);
+
+    if (run) {
+        if (run &amp;lt; 0x10)
+            bits += 4;
+        else
+            bits += 15;
+    }
+
+    return bits;
+}
+
 static int find_slice_quant(AVCodecContext *avctx, const AVFrame *pic,
                             int trellis_node, int x, int y, int mbs_per_slice,
                             ProresThreadData *td)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -610,10 +784,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int find_slice_quant(AVCodecContext *avctx, const AVFrame *pic,
         src = (const uint16_t*)(pic-&amp;gt;data[i] + yp * linesize[i] +
                                 line_add * pic-&amp;gt;linesize[i]) + xp;
 
-        get_slice_data(ctx, src, linesize[i], xp, yp,
-                       pwidth, avctx-&amp;gt;height / ctx-&amp;gt;pictures_per_frame,
-                       td-&amp;gt;blocks[i], td-&amp;gt;emu_buf,
-                       mbs_per_slice, num_cblocks[i], is_chroma[i]);
+        if (i &amp;lt; 3) {
+            get_slice_data(ctx, src, linesize[i], xp, yp,
+                           pwidth, avctx-&amp;gt;height / ctx-&amp;gt;pictures_per_frame,
+                           td-&amp;gt;blocks[i], td-&amp;gt;emu_buf,
+                           mbs_per_slice, num_cblocks[i], is_chroma[i]);
+        } else {
+            get_alpha_data(ctx, src, linesize[i], xp, yp,
+                           pwidth, avctx-&amp;gt;height / ctx-&amp;gt;pictures_per_frame,
+                           td-&amp;gt;blocks[i], mbs_per_slice, ctx-&amp;gt;alpha_bits);
+        }
     }
 
     for (q = min_quant; q &amp;lt; max_quant + 2; q++) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -625,13 +805,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int find_slice_quant(AVCodecContext *avctx, const AVFrame *pic,
     for (q = min_quant; q &amp;lt;= max_quant; q++) {
         bits  = 0;
         error = 0;
-        for (i = 0; i &amp;lt; ctx-&amp;gt;num_planes; i++) {
+        for (i = 0; i &amp;lt; ctx-&amp;gt;num_planes - !!ctx-&amp;gt;alpha_bits; i++) {
             bits += estimate_slice_plane(ctx, &amp;amp;error, i,
                                          src, linesize[i],
                                          mbs_per_slice,
                                          num_cblocks[i], plane_factor[i],
                                          ctx-&amp;gt;quants[q], td);
         }
+        if (ctx-&amp;gt;alpha_bits)
+            bits += estimate_alpha_plane(ctx, &amp;amp;error, src, linesize[3],
+                                         mbs_per_slice, q, td-&amp;gt;blocks[3]);
         if (bits &amp;gt; 65000 * 8) {
             error = SCORE_LIMIT;
             break;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -654,13 +837,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int find_slice_quant(AVCodecContext *avctx, const AVFrame *pic,
                 for (i = 0; i &amp;lt; 64; i++)
                     qmat[i] = ctx-&amp;gt;quant_mat[i] * q;
             }
-            for (i = 0; i &amp;lt; ctx-&amp;gt;num_planes; i++) {
+            for (i = 0; i &amp;lt; ctx-&amp;gt;num_planes - !!ctx-&amp;gt;alpha_bits; i++) {
                 bits += estimate_slice_plane(ctx, &amp;amp;error, i,
                                              src, linesize[i],
                                              mbs_per_slice,
                                              num_cblocks[i], plane_factor[i],
                                              qmat, td);
             }
+            if (ctx-&amp;gt;alpha_bits)
+                bits += estimate_alpha_plane(ctx, &amp;amp;error, src, linesize[3],
+                                             mbs_per_slice, q, td-&amp;gt;blocks[3]);
             if (bits &amp;lt;= ctx-&amp;gt;bits_per_mb * mbs_per_slice)
                 break;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -782,7 +968,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     bytestream_put_byte  (&amp;amp;buf, avctx-&amp;gt;color_primaries);
     bytestream_put_byte  (&amp;amp;buf, avctx-&amp;gt;color_trc);
     bytestream_put_byte  (&amp;amp;buf, avctx-&amp;gt;colorspace);
-    bytestream_put_byte  (&amp;amp;buf, 0x40);          // source format and alpha information
+    bytestream_put_byte  (&amp;amp;buf, 0x40 | (ctx-&amp;gt;alpha_bits &amp;gt;&amp;gt; 3));
     bytestream_put_byte  (&amp;amp;buf, 0);             // reserved
     if (ctx-&amp;gt;quant_sel != QUANT_MAT_DEFAULT) {
         bytestream_put_byte  (&amp;amp;buf, 0x03);      // matrix flags - both matrices are present
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -904,12 +1090,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static av_cold int encode_init(AVCodecContext *avctx)
                "there should be an integer power of two MBs per slice\n");
         return AVERROR(EINVAL);
     }
+    if (av_pix_fmt_desc_get(avctx-&amp;gt;pix_fmt)-&amp;gt;flags &amp;amp; AV_PIX_FMT_FLAG_ALPHA) {
+        if (ctx-&amp;gt;alpha_bits &amp;amp; 7) {
+            av_log(avctx, AV_LOG_ERROR, "alpha bits should be 0, 8 or 16\n");
+            return AVERROR(EINVAL);
+        }
+    } else {
+        ctx-&amp;gt;alpha_bits = 0;
+    }
 
     ctx-&amp;gt;chroma_factor = avctx-&amp;gt;pix_fmt == AV_PIX_FMT_YUV422P10
                          ? CFACTOR_Y422
                          : CFACTOR_Y444;
     ctx-&amp;gt;profile_info  = prores_profile_info + ctx-&amp;gt;profile;
-    ctx-&amp;gt;num_planes    = 3;
+    ctx-&amp;gt;num_planes    = 3 + !!ctx-&amp;gt;alpha_bits;
 
     ctx-&amp;gt;mb_width      = FFALIGN(avctx-&amp;gt;width,  16) &amp;gt;&amp;gt; 4;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1025,7 +1219,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const AVOption options[] = {
         AV_OPT_TYPE_INT, { .i64 = 8 }, 1, MAX_MBS_PER_SLICE, VE },
     { "profile",       NULL, OFFSET(profile), AV_OPT_TYPE_INT,
         { .i64 = PRORES_PROFILE_STANDARD },
-        PRORES_PROFILE_PROXY, PRORES_PROFILE_HQ, VE, "profile" },
+        PRORES_PROFILE_PROXY, PRORES_PROFILE_4444, VE, "profile" },
     { "proxy",         NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_PROXY },
         0, 0, VE, "profile" },
     { "lt",            NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_LT },
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1034,6 +1228,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const AVOption options[] = {
         0, 0, VE, "profile" },
     { "hq",            NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_HQ },
         0, 0, VE, "profile" },
+    { "4444",          NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_4444 },
+        0, 0, VE, "profile" },
     { "vendor", "vendor ID", OFFSET(vendor),
         AV_OPT_TYPE_STRING, { .str = "Lavc" }, CHAR_MIN, CHAR_MAX, VE },
     { "bits_per_mb", "desired bits per macroblock", OFFSET(bits_per_mb),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1052,6 +1248,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const AVOption options[] = {
         0, 0, VE, "quant_mat" },
     { "default",       NULL, 0, AV_OPT_TYPE_CONST, { .i64 = QUANT_MAT_DEFAULT },
         0, 0, VE, "quant_mat" },
+    { "alpha_bits", "bits for alpha plane", OFFSET(alpha_bits), AV_OPT_TYPE_INT,
+        { .i64 = 16 }, 0, 16, VE },
     { NULL }
 };
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1073,7 +1271,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; AVCodec ff_prores_encoder = {
     .capabilities   = CODEC_CAP_SLICE_THREADS,
     .long_name      = NULL_IF_CONFIG_SMALL("Apple ProRes (iCodec Pro)"),
     .pix_fmts       = (const enum AVPixelFormat[]) {
-                          AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_NONE
+                          AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+                          AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_NONE
                       },
     .priv_class     = &amp;amp;proresenc_class,
 };
&lt;/pre&gt;</description>
    <dc:creator>Kostya Shishkov</dc:creator>
    <dc:date>2013-05-25T15:30:35</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46315">
    <title>Re: [PATCH 2/2 v2] msvc/icl: Intel Compiler support on Windows</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46315</link>
    <description>&lt;pre&gt;
Checked it doesn't match icc on linux seems good to go to me. I'd push
the set in a while if nobody is against.

lu

&lt;/pre&gt;</description>
    <dc:creator>Luca Barbato</dc:creator>
    <dc:date>2013-05-25T14:39:28</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46314">
    <title>Re: [PATCH 2/2 v2] msvc/icl: Intel Compiler support onWindows</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46314</link>
    <description>&lt;pre&gt;

Looks good to me - especially since it doesn't add anything weird outside 
of the icl sections it probably shouldn't hurt anything else either.

// Martin
&lt;/pre&gt;</description>
    <dc:creator>Martin Storsjö</dc:creator>
    <dc:date>2013-05-25T14:32:12</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46313">
    <title>[PATCH 2/2] indeo4: reuse context block VLC for band instead of defaulting</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46313</link>
    <description>&lt;pre&gt;Currently if no custom block VLC is specified for band, a default block VLC
will be used, while the global block VLC stored in the context should be used
instead.

This fixes decoding of one sample I have.
---
FATE tests are left to the people who like it.
---
 libavcodec/indeo4.c |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/libavcodec/indeo4.c b/libavcodec/indeo4.c
index eb34688..7571435 100644
--- a/libavcodec/indeo4.c
+++ b/libavcodec/indeo4.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -362,9 +362,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band,
         }
 
         /* decode block huffman codebook */
-        if (ff_ivi_dec_huff_desc(&amp;amp;ctx-&amp;gt;gb, get_bits1(&amp;amp;ctx-&amp;gt;gb), IVI_BLK_HUFF,
-                                 &amp;amp;band-&amp;gt;blk_vlc, avctx))
-            return AVERROR_INVALIDDATA;
+        if (!get_bits1(&amp;amp;ctx-&amp;gt;gb))
+            band-&amp;gt;blk_vlc.tab = ctx-&amp;gt;blk_vlc.tab;
+        else
+            if (ff_ivi_dec_huff_desc(&amp;amp;ctx-&amp;gt;gb, 1, IVI_BLK_HUFF,
+                                     &amp;amp;band-&amp;gt;blk_vlc, avctx))
+                return AVERROR_INVALIDDATA;
 
         /* select appropriate rvmap table for this band */
         band-&amp;gt;rvmap_sel = get_bits1(&amp;amp;ctx-&amp;gt;gb) ? get_bits(&amp;amp;ctx-&amp;gt;gb, 3) : 8;
&lt;/pre&gt;</description>
    <dc:creator>Kostya Shishkov</dc:creator>
    <dc:date>2013-05-25T10:45:44</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46312">
    <title>[PATCH 1/2] indeo4: add missing Haar and slantedtransforms</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46312</link>
    <description>&lt;pre&gt;---
One of my samples uses 4x4 Haar transform, another one has 1D Haar transforms,
so why not implement them all?
---
 libavcodec/indeo4.c  |   14 ++--
 libavcodec/ivi_dsp.c |  204 ++++++++++++++++++++++++++++++++++++++++++++++++--
 libavcodec/ivi_dsp.h |   89 ++++++++++++++++++++++
 3 files changed, 294 insertions(+), 13 deletions(-)

diff --git a/libavcodec/indeo4.c b/libavcodec/indeo4.c
index 8820a2c..eb34688 100644
--- a/libavcodec/indeo4.c
+++ b/libavcodec/indeo4.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -56,8 +56,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct {
     int             is_2d_trans;
 } transforms[18] = {
     { ff_ivi_inverse_haar_8x8,  ff_ivi_dc_haar_2d,       1 },
-    { NULL, NULL, 0 }, /* inverse Haar 8x1 */
-    { NULL, NULL, 0 }, /* inverse Haar 1x8 */
+    { ff_ivi_row_haar8,         ff_ivi_dc_haar_2d,       0 },
+    { ff_ivi_col_haar8,         ff_ivi_dc_haar_2d,       0 },
     { ff_ivi_put_pixels_8x8,    ff_ivi_put_dc_pixel_8x8, 1 },
     { ff_ivi_inverse_slant_8x8, ff_ivi_dc_slant_2d,      1 },
     { ff_ivi_row_slant8,        ff_ivi_dc_row_slant,     1 },
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -65,13 +65,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct {
     { NULL, NULL, 0 }, /* inverse DCT 8x8 */
     { NULL, NULL, 0 }, /* inverse DCT 8x1 */
     { NULL, NULL, 0 }, /* inverse DCT 1x8 */
-    { NULL, NULL, 0 }, /* inverse Haar 4x4 */
+    { ff_ivi_inverse_haar_4x4,  ff_ivi_dc_haar_2d,       1 },
     { ff_ivi_inverse_slant_4x4, ff_ivi_dc_slant_2d,      1 },
     { NULL, NULL, 0 }, /* no transform 4x4 */
-    { NULL, NULL, 0 }, /* inverse Haar 1x4 */
-    { NULL, NULL, 0 }, /* inverse Haar 4x1 */
-    { NULL, NULL, 0 }, /* inverse slant 1x4 */
-    { NULL, NULL, 0 }, /* inverse slant 4x1 */
+    { ff_ivi_row_haar4,         ff_ivi_dc_haar_2d,       0 },
+    { ff_ivi_col_haar4,         ff_ivi_dc_haar_2d,       0 },
+    { ff_ivi_row_slant4,        ff_ivi_dc_row_slant,     0 },
+    { ff_ivi_col_slant4,        ff_ivi_dc_col_slant,     0 },
     { NULL, NULL, 0 }, /* inverse DCT 4x4 */
 };
 
diff --git a/libavcodec/ivi_dsp.c b/libavcodec/ivi_dsp.c
index f5efa65..bd1f523 100644
--- a/libavcodec/ivi_dsp.c
+++ b/libavcodec/ivi_dsp.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -248,12 +248,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst,
     d8 = COMPENSATE(t8); }
 
 /** inverse 4-point Haar transform */
-#define INV_HAAR4(s1, s3, s5, s7) {\
-    HAAR_BFLY(s1, s5);  HAAR_BFLY(s1, s3);  HAAR_BFLY(s5, s7);\
-    s1 = COMPENSATE(s1);\
-    s3 = COMPENSATE(s3);\
-    s5 = COMPENSATE(s5);\
-    s7 = COMPENSATE(s7); }
+#define INV_HAAR4(s1, s3, s5, s7, d1, d2, d3, d4, t0, t1, t2, t3, t4) {\
+    IVI_HAAR_BFLY(s1, s3, t0, t1, t4);\
+    IVI_HAAR_BFLY(t0, s5, t2, t3, t4);\
+    d1 = COMPENSATE(t2);\
+    d2 = COMPENSATE(t3);\
+    IVI_HAAR_BFLY(t1, s7, t2, t3, t4);\
+    d3 = COMPENSATE(t2);\
+    d4 = COMPENSATE(t3); }
 
 void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
                              const uint8_t *flags)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -310,6 +312,153 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
 #undef  COMPENSATE
 }
 
+void ff_ivi_row_haar8(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags)
+{
+    int     i;
+    int     t0, t1, t2, t3, t4, t5, t6, t7, t8;
+
+    /* apply the InvHaar8 to all rows */
+#define COMPENSATE(x) (x)
+    for (i = 0; i &amp;lt; 8; i++) {
+        if (   !in[0] &amp;amp;&amp;amp; !in[1] &amp;amp;&amp;amp; !in[2] &amp;amp;&amp;amp; !in[3]
+            &amp;amp;&amp;amp; !in[4] &amp;amp;&amp;amp; !in[5] &amp;amp;&amp;amp; !in[6] &amp;amp;&amp;amp; !in[7]) {
+            memset(out, 0, 8 * sizeof(out[0]));
+        } else {
+            INV_HAAR8(in[0],  in[1],  in[2],  in[3],
+                      in[4],  in[5],  in[6],  in[7],
+                      out[0], out[1], out[2], out[3],
+                      out[4], out[5], out[6], out[7],
+                      t0, t1, t2, t3, t4, t5, t6, t7, t8);
+        }
+        in  += 8;
+        out += pitch;
+    }
+#undef  COMPENSATE
+}
+
+void ff_ivi_col_haar8(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags)
+{
+    int     i;
+    int     t0, t1, t2, t3, t4, t5, t6, t7, t8;
+
+    /* apply the InvHaar8 to all columns */
+#define COMPENSATE(x) (x)
+    for (i = 0; i &amp;lt; 8; i++) {
+        if (flags[i]) {
+            INV_HAAR8(in[ 0], in[ 8], in[16], in[24],
+                      in[32], in[40], in[48], in[56],
+                      out[0 * pitch], out[1 * pitch],
+                      out[2 * pitch], out[3 * pitch],
+                      out[4 * pitch], out[5 * pitch],
+                      out[6 * pitch], out[7 * pitch],
+                      t0, t1, t2, t3, t4, t5, t6, t7, t8);
+        } else
+            out[0 * pitch] = out[1 * pitch] =
+            out[2 * pitch] = out[3 * pitch] =
+            out[4 * pitch] = out[5 * pitch] =
+            out[6 * pitch] = out[7 * pitch] = 0;
+
+        in++;
+        out++;
+    }
+#undef  COMPENSATE
+}
+
+void ff_ivi_inverse_haar_4x4(const int32_t *in, int16_t *out, uint32_t pitch,
+                             const uint8_t *flags)
+{
+    int     i, shift, sp1, sp2;
+    const int32_t *src;
+    int32_t *dst;
+    int     tmp[16];
+    int     t0, t1, t2, t3, t4;
+
+    /* apply the InvHaar4 to all columns */
+#define COMPENSATE(x) (x)
+    src = in;
+    dst = tmp;
+    for (i = 0; i &amp;lt; 4; i++) {
+        if (flags[i]) {
+            /* pre-scaling */
+            shift = !(i &amp;amp; 2);
+            sp1 = src[0] &amp;lt;&amp;lt; shift;
+            sp2 = src[4] &amp;lt;&amp;lt; shift;
+            INV_HAAR4(   sp1,    sp2, src[8], src[12],
+                      dst[0], dst[4], dst[8], dst[12],
+                      t0, t1, t2, t3, t4);
+        } else
+            dst[0] = dst[4] = dst[8] = dst[12] = 0;
+
+        src++;
+        dst++;
+    }
+#undef  COMPENSATE
+
+    /* apply the InvHaar8 to all rows */
+#define COMPENSATE(x) (x)
+    src = tmp;
+    for (i = 0; i &amp;lt; 4; i++) {
+        if (!src[0] &amp;amp;&amp;amp; !src[1] &amp;amp;&amp;amp; !src[2] &amp;amp;&amp;amp; !src[3]) {
+            memset(out, 0, 4 * sizeof(out[0]));
+        } else {
+            INV_HAAR4(src[0], src[1], src[2], src[3],
+                      out[0], out[1], out[2], out[3],
+                      t0, t1, t2, t3, t4);
+        }
+        src += 4;
+        out += pitch;
+    }
+#undef  COMPENSATE
+}
+
+void ff_ivi_row_haar4(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags)
+{
+    int     i;
+    int     t0, t1, t2, t3, t4;
+
+    /* apply the InvHaar4 to all rows */
+#define COMPENSATE(x) (x)
+    for (i = 0; i &amp;lt; 4; i++) {
+        if (!in[0] &amp;amp;&amp;amp; !in[1] &amp;amp;&amp;amp; !in[2] &amp;amp;&amp;amp; !in[3]) {
+            memset(out, 0, 4 * sizeof(out[0]));
+        } else {
+            INV_HAAR4(in[0], in[1], in[2], in[3],
+                      out[0], out[1], out[2], out[3],
+                      t0, t1, t2, t3, t4);
+        }
+        in  += 4;
+        out += pitch;
+    }
+#undef  COMPENSATE
+}
+
+void ff_ivi_col_haar4(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags)
+{
+    int     i;
+    int     t0, t1, t2, t3, t4;
+
+    /* apply the InvHaar8 to all columns */
+#define COMPENSATE(x) (x)
+    for (i = 0; i &amp;lt; 4; i++) {
+        if (flags[i]) {
+            INV_HAAR4(in[0], in[4], in[8], in[12],
+                      out[0 * pitch], out[1 * pitch],
+                      out[2 * pitch], out[3 * pitch],
+                      t0, t1, t2, t3, t4);
+        } else
+            out[0 * pitch] = out[1 * pitch] =
+            out[2 * pitch] = out[3 * pitch] = 0;
+
+        in++;
+        out++;
+    }
+#undef  COMPENSATE
+}
+
 void ff_ivi_dc_haar_2d(const int32_t *in, int16_t *out, uint32_t pitch,
                        int blk_size)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -546,6 +695,49 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ff_ivi_dc_col_slant(const int32_t *in, int16_t *out, uint32_t pitch, int bl
     }
 }
 
+void ff_ivi_row_slant4(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
+{
+    int     i;
+    int     t0, t1, t2, t3, t4;
+
+#define COMPENSATE(x) ((x + 1)&amp;gt;&amp;gt;1)
+    for (i = 0; i &amp;lt; 4; i++) {
+        if (!in[0] &amp;amp;&amp;amp; !in[1] &amp;amp;&amp;amp; !in[2] &amp;amp;&amp;amp; !in[3]) {
+            memset(out, 0, 4*sizeof(out[0]));
+        } else {
+            IVI_INV_SLANT4( in[0],  in[1],  in[2],  in[3],
+                           out[0], out[1], out[2], out[3],
+                           t0, t1, t2, t3, t4);
+        }
+        in  += 4;
+        out += pitch;
+    }
+#undef COMPENSATE
+}
+
+void ff_ivi_col_slant4(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
+{
+    int     i, row2;
+    int     t0, t1, t2, t3, t4;
+
+    row2 = pitch &amp;lt;&amp;lt; 1;
+
+#define COMPENSATE(x) ((x + 1)&amp;gt;&amp;gt;1)
+    for (i = 0; i &amp;lt; 4; i++) {
+        if (flags[i]) {
+            IVI_INV_SLANT4(in[0], in[4], in[8], in[12],
+                           out[0], out[pitch], out[row2], out[row2 + pitch],
+                           t0, t1, t2, t3, t4);
+        } else {
+            out[0] = out[pitch] = out[row2] = out[row2 + pitch] = 0;
+        }
+
+        in++;
+        out++;
+    }
+#undef COMPENSATE
+}
+
 void ff_ivi_put_pixels_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
                            const uint8_t *flags)
 {
diff --git a/libavcodec/ivi_dsp.h b/libavcodec/ivi_dsp.h
index c46f8b2..31d37e3 100644
--- a/libavcodec/ivi_dsp.h
+++ b/libavcodec/ivi_dsp.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,6 +66,71 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
                              const uint8_t *flags);
 
 /**
+ *  one-dimensional inverse 8-point Haar transform on rows for Indeo 4
+ *
+ *  &amp;lt; at &amp;gt;param[in]  in        pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out] out       pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]  pitch     pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]  flags     pointer to the array of column flags:
+ *                        != 0 - non_empty column, 0 - empty one
+ *                        (this array must be filled by caller)
+ */
+void ff_ivi_row_haar8(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags);
+
+/**
+ *  one-dimensional inverse 8-point Haar transform on columns for Indeo 4
+ *
+ *  &amp;lt; at &amp;gt;param[in]  in        pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out] out       pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]  pitch     pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]  flags     pointer to the array of column flags:
+ *                        != 0 - non_empty column, 0 - empty one
+ *                        (this array must be filled by caller)
+ */
+void ff_ivi_col_haar8(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags);
+
+/**
+ *  two-dimensional inverse Haar 4x4 transform for Indeo 4
+ *
+ *  &amp;lt; at &amp;gt;param[in]  in        pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out] out       pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]  pitch     pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]  flags     pointer to the array of column flags:
+ *                        != 0 - non_empty column, 0 - empty one
+ *                        (this array must be filled by caller)
+ */
+void ff_ivi_inverse_haar_4x4(const int32_t *in, int16_t *out, uint32_t pitch,
+                             const uint8_t *flags);
+
+/**
+ *  one-dimensional inverse 4-point Haar transform on rows for Indeo 4
+ *
+ *  &amp;lt; at &amp;gt;param[in]  in        pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out] out       pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]  pitch     pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]  flags     pointer to the array of column flags:
+ *                        != 0 - non_empty column, 0 - empty one
+ *                        (this array must be filled by caller)
+ */
+void ff_ivi_row_haar4(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags);
+
+/**
+ *  one-dimensional inverse 4-point Haar transform on columns for Indeo 4
+ *
+ *  &amp;lt; at &amp;gt;param[in]  in        pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out] out       pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]  pitch     pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]  flags     pointer to the array of column flags:
+ *                        != 0 - non_empty column, 0 - empty one
+ *                        (this array must be filled by caller)
+ */
+void ff_ivi_col_haar4(const int32_t *in, int16_t *out, uint32_t pitch,
+                      const uint8_t *flags);
+
+/**
  *  DC-only two-dimensional inverse Haar transform for Indeo 4.
  *  Performing the inverse transform in this case is equivalent to
  *  spreading DC_coeff &amp;gt;&amp;gt; 3 over the whole block.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -142,6 +207,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ff_ivi_col_slant8(const int32_t *in, int16_t *out, uint32_t pitch,
                        const uint8_t *flags);
 
 /**
+ *  inverse 1D row slant transform
+ *
+ *  &amp;lt; at &amp;gt;param[in]    in      pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out]   out     pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]    pitch   pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]    flags   pointer to the array of column flags (unused here)
+ */
+void ff_ivi_row_slant4(const int32_t *in, int16_t *out, uint32_t pitch,
+                       const uint8_t *flags);
+
+/**
+ *  inverse 1D column slant transform
+ *
+ *  &amp;lt; at &amp;gt;param[in]    in      pointer to the vector of transform coefficients
+ *  &amp;lt; at &amp;gt;param[out]   out     pointer to the output buffer (frame)
+ *  &amp;lt; at &amp;gt;param[in]    pitch   pitch to move to the next y line
+ *  &amp;lt; at &amp;gt;param[in]    flags   pointer to the array of column flags:
+ *                        != 0 - non_empty column, 0 - empty one
+ *                        (this array must be filled by caller)
+ */
+void ff_ivi_col_slant4(const int32_t *in, int16_t *out, uint32_t pitch,
+                       const uint8_t *flags);
+
+/**
  *  DC-only inverse row slant transform
  */
 void ff_ivi_dc_row_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
&lt;/pre&gt;</description>
    <dc:creator>Kostya Shishkov</dc:creator>
    <dc:date>2013-05-25T10:43:50</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46311">
    <title>Re: [PATCH 1/3] configure: Less generic msvc identification test</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46311</link>
    <description>&lt;pre&gt;
Yea, it doesn't work for all cases.  Just tested again and it didn't
work for this:
"Microsoft (R) C/C++ Optimizing Compiler"
&lt;/pre&gt;</description>
    <dc:creator>Alex Smith</dc:creator>
    <dc:date>2013-05-25T10:11:36</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46310">
    <title>[PATCH 2/2 v2] msvc/icl: Intel Compiler support onWindows</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46310</link>
    <description>&lt;pre&gt;Initial support for the ICL compiler on windows.  Requires a new c99wrap
with ICL support (1.0.2+).

Currently not much different speed wise compared to msvc.  In the future
with a few changes it can be made to support the inline asm.  This would
be the primary reason for using it.

Passed all fate tests, versions tested:
    13.1.1.171 (2013 Update 3) x86 and x64
    12.1.5.344 (2011 Update 11) x86 and x64
---
 configure | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/configure b/configure
index 819f9e6..b956645 100755
--- a/configure
+++ b/configure
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2227,6 +2227,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; case "$toolchain" in
         ar_default="lib"
         target_os_default="win32"
     ;;
+    icl)
+        cc_default="c99wrap -noconv icl"
+        ld_default="c99wrap xilink"
+        nm_default="dumpbin -symbols"
+        ar_default="xilib"
+        target_os_default="win32"
+    ;;
     gcov)
         add_cflags  -fprofile-arcs -ftest-coverage
         add_ldflags -fprofile-arcs -ftest-coverage
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2554,6 +2561,31 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; probe_cc(){
         if [ $pfx = hostcc ]; then
             append _cflags -Dsnprintf=_snprintf
         fi
+    elif $_cc 2&amp;gt;&amp;amp;1 | grep -q Intel; then
+        _type=icl
+        _ident=$($cc 2&amp;gt;&amp;amp;1 | head -n1)
+        _depflags='-QMMD -QMF$(&amp;lt; at &amp;gt;:.o=.d) -QMT$&amp;lt; at &amp;gt;'
+        # Not only is O3 broken on 13.x+ but it's slower on all previous versions (tested) as well
+        _cflags_speed="-O2"
+        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
+        # Nonstandard output options, to avoid msys path conversion issues, relies on wrapper to remap it
+        if $_cc 2&amp;gt;&amp;amp;1 | grep -q Linker; then
+            _ld_o='-out $&amp;lt; at &amp;gt;'
+        else
+            _ld_o='-Fe$&amp;lt; at &amp;gt;'
+        fi
+        _cc_o='-Fo $&amp;lt; at &amp;gt;'
+        _cc_e='-P'
+        _flags_filter=msvc_flags
+        _ld_lib='lib%.a'
+        _ld_path='-libpath:'
+        # -Qdiag-error to make icl error when presented with certain unknown arguments
+        _flags='-nologo -Qdiag-error:10157 -Qdiag-error:4044'
+        # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency with msvc which enables it by default
+        _cflags='-D_USE_MATH_DEFINES -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64 -Qstd=c99 -Qms0 -Qvec- -Qsimd- -GS'
+        if [ $pfx = hostcc ]; then
+            append _cflags -Dsnprintf=_snprintf
+        fi
     fi

     eval ${pfx}_type=\$_type
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3868,6 +3900,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; elif enabled pathscale; then
     add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
 elif enabled msvc; then
     enabled x86_32 &amp;amp;&amp;amp; disable aligned_stack
+elif enabled icl; then
+    enabled x86_32 &amp;amp;&amp;amp; disable aligned_stack
+    check_cflags -W1 # Just warnings, no remark spam
+    # basically -fstrict-aliasing for icl that doesn't work (correctly) on 13.x+
+    check_cpp_condition "windows.h" "__ICL &amp;lt; 1300" &amp;amp;&amp;amp; add_cflags -Qansi-alias
+    # icl will pass the inline asm tests but inline asm is currently not supported (build will fail)
+    disable inline_asm
 fi

 case $target_os in
--
1.8.1.msysgit.1

&lt;/pre&gt;</description>
    <dc:creator>Alex Smith</dc:creator>
    <dc:date>2013-05-25T10:07:42</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46309">
    <title>Re: [PATCH 1/2 v2] configure: Fix check_exec_crash for ICL support</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46309</link>
    <description>&lt;pre&gt;
Looks fine, thanks for the explanation.

lu

&lt;/pre&gt;</description>
    <dc:creator>Luca Barbato</dc:creator>
    <dc:date>2013-05-25T10:06:14</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46308">
    <title>[PATCH 1/2 v2] configure: Fix check_exec_crash forICL support</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46308</link>
    <description>&lt;pre&gt;From: Laurent &amp;lt;laurent.aml-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

Change the check_exec_crash test to use a function pointer instead of
simply calling the function.  The EBP availability test will crash when
compiled with ICL likely due to compiler optimization shenanigans.

Originally the check_exec_crash code was moved out of main to fix a
problem with gcc's treatment of non-leaf main on x86_32.  libav already
moved the code out of main but the addition of the function pointer will
prevent any inlining which fixes the remaining problem.

A function pointer is used since it is compiler agnostic (as opposed to
say __attribute__ ((noinline)) which would only work with gcc compatible
compilers).

Conflicts:
    configure
---
 configure | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index e3cf0b9..819f9e6 100755
--- a/configure
+++ b/configure
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -908,9 +908,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; check_exec_crash(){
 static void sighandler(int sig){
     raise(SIGTERM);
 }
-int foo(void){
+int func(void){
     $code
 }
+int (*func_ptr)(void) = func;
 int main(void){
     signal(SIGILL, sighandler);
     signal(SIGFPE, sighandler);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -918,7 +919,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int main(void){
 #ifdef SIGBUS
     signal(SIGBUS, sighandler);
 #endif
-    foo();
+    return func_ptr();
 }
 EOF
 }
--
1.8.1.msysgit.1

&lt;/pre&gt;</description>
    <dc:creator>Alex Smith</dc:creator>
    <dc:date>2013-05-25T10:01:29</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46307">
    <title>Re: [PATCH 1/3] configure: Less generic msvc identification test</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46307</link>
    <description>&lt;pre&gt;
Can we use that or there is something wrong with this setup?

lu

&lt;/pre&gt;</description>
    <dc:creator>Luca Barbato</dc:creator>
    <dc:date>2013-05-25T10:03:28</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46306">
    <title>Re: [PATCH 1/3] configure: Less generic msvcidentification test</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46306</link>
    <description>&lt;pre&gt;I'm tempted to want to just drop this patch.  Nothing I've tried or that has
been suggested works for all versions involved.  This change or a more
complicated regex in the ICL patch isn't strictly nessasary as both work just
fine without them.

Feel free to make more suggestions if you've got them and I'll give it a shot.
&lt;/pre&gt;</description>
    <dc:creator>Alex Smith</dc:creator>
    <dc:date>2013-05-25T09:39:57</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46305">
    <title>Re: [PATCH] fix scalarproduct_and_madd_int16_altivec() for orders &gt; 16</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46305</link>
    <description>&lt;pre&gt;size
filter
insane
scalarproduct_and_madd_int16_altivec(int16_t *v1, const int16_t *

Confirming this fixes fate-lossless-monkeysaudio-394b1-extrahigh on
AltiVec-enabled PPC builds.

&lt;/pre&gt;</description>
    <dc:creator>Sean McGovern</dc:creator>
    <dc:date>2013-05-24T18:48:58</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46304">
    <title>[PATCH] fix scalarproduct_and_madd_int16_altivec()for orders &gt; 16</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46304</link>
    <description>&lt;pre&gt;the second and third sources were incremented only by half of the needed size
---
The loop was iterated only once in the previous tests and the higher filter
orders that expose this bug happen only on APE files with extrahigh or insane
compression level. I've tested favourite 3.99 insane compression file to
verify that conjecture and that this fix works for it. And it makes
fate-lossless-monkeysaudio-394b1-extrahigh pass on AltiVec PPC too.
---
 libavcodec/ppc/int_altivec.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavcodec/ppc/int_altivec.c b/libavcodec/ppc/int_altivec.c
index 67d119c..8357ca7 100644
--- a/libavcodec/ppc/int_altivec.c
+++ b/libavcodec/ppc/int_altivec.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -129,8 +129,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int32_t scalarproduct_and_madd_int16_altivec(int16_t *v1, const int16_t *
         pv1[0] = vec_mladd(t0, muls, i0);
         pv1[1] = vec_mladd(t1, muls, i1);
         pv1 += 2;
-        v2  += 8;
-        v3  += 8;
+        v2  += 16;
+        v3  += 16;
     } while(--order);
     res = vec_splat(vec_sums(res, zero_s32v), 3);
     vec_ste(res, 0, &amp;amp;ires);
&lt;/pre&gt;</description>
    <dc:creator>Kostya Shishkov</dc:creator>
    <dc:date>2013-05-24T17:49:35</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46303">
    <title>Re: [PATCH] lavfi doxy: improve/extend AVFilter doxy.</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46303</link>
    <description>&lt;pre&gt;
Good work, this looks good, a few comments below ..


I'd say "during init" instead of "in init".


I think it should be s/are processed/were processed/ here.


s/This does not/It does not/

Diego
&lt;/pre&gt;</description>
    <dc:creator>Diego Biurrun</dc:creator>
    <dc:date>2013-05-24T11:40:48</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46302">
    <title>Re: [PATCH] cpu: Include common.h for av_popcount64</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46302</link>
    <description>&lt;pre&gt;
LGTM
&lt;/pre&gt;</description>
    <dc:creator>Kostya Shishkov</dc:creator>
    <dc:date>2013-05-24T09:32:02</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46301">
    <title>[PATCH] cpu: Include common.h for av_popcount64</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46301</link>
    <description>&lt;pre&gt;This fixes build failures on windows since 2a6eaeaa8.
---
 libavutil/cpu.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/libavutil/cpu.c b/libavutil/cpu.c
index b95158b..17273b6 100644
--- a/libavutil/cpu.c
+++ b/libavutil/cpu.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,6 +19,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "cpu.h"
 #include "config.h"
 #include "opt.h"
+#include "common.h"
 
 #if HAVE_SCHED_GETAFFINITY
 #define _GNU_SOURCE
&lt;/pre&gt;</description>
    <dc:creator>Martin Storsjö</dc:creator>
    <dc:date>2013-05-24T09:24:56</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46300">
    <title>[PATCH] lavfi doxy: improve/extend AVFilter doxy.</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46300</link>
    <description>&lt;pre&gt;---
 libavfilter/avfilter.h |  104 +++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 86 insertions(+), 18 deletions(-)

diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index 9baf64e..b8d85a9 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -407,20 +407,42 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx);
  * callback functions used to interact with the filter.
  */
 typedef struct AVFilter {
-    const char *name;         ///&amp;lt; filter name
+    /**
+     * Filter name. Must be non-NULL and unique among filters.
+     */
+    const char *name;
 
     /**
-     * A description for the filter. You should use the
-     * NULL_IF_CONFIG_SMALL() macro to define it.
+     * A description of the filter. May be NULL.
+     *
+     * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
      */
     const char *description;
 
-    const AVFilterPad *inputs;  ///&amp;lt; NULL terminated list of inputs. NULL if none
-    const AVFilterPad *outputs; ///&amp;lt; NULL terminated list of outputs. NULL if none
+    /**
+     * List of inputs, terminated by a zeroed element.
+     *
+     * NULL if there are no (static) inputs. Instances of filters with
+     * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in
+     * this list.
+     */
+    const AVFilterPad *inputs;
+    /**
+     * List of outputs, terminated by a zeroed element.
+     *
+     * NULL if there are no (static) outputs. Instances of filters with
+     * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in
+     * this list.
+     */
+    const AVFilterPad *outputs;
 
     /**
-     * A class for the private data, used to access filter private
-     * AVOptions.
+     * A class for the private data, used to declare filter private AVOptions.
+     * This field is NULL for filters that do not declare any options.
+     *
+     * If this field is non-NULL, the first member of the filter private data
+     * must be a pointer to AVClass, which will be set by libavfilter generic
+     * code to this class.
      */
     const AVClass *priv_class;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -438,29 +460,71 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct AVFilter {
      */
 
     /**
-     * Filter initialization function. Called when all the options have been
-     * set.
+     * Filter initialization function.
+     *
+     * This callback will be called only once during the filter lifetime, after
+     * all the options have been set, but before links between filters are
+     * established and format negotiation is done.
+     *
+     * Basic filter initialization should be done here. Filters with dynamic
+     * inputs and/or outputs should create those inputs/outputs here based on
+     * provided options. No more changes to this filter's inputs/outputs can be
+     * done after this callback.
+     *
+     * This callback must not assume that the filter links exist or frame
+     * parameters are known.
+     *
+     * &amp;lt; at &amp;gt;ref AVFilter.uninit "uninit" is guaranteed to be called even if
+     * initialization fails, so this callback does not have to clean up on
+     * failure.
+     *
+     * &amp;lt; at &amp;gt;return 0 on success, a negative AVERROR on failure
      */
     int (*init)(AVFilterContext *ctx);
 
     /**
-     * Should be set instead of init by the filters that want to pass a
-     * dictionary of AVOptions to nested contexts that are allocated in
-     * init.
+     * Should be set instead of &amp;lt; at &amp;gt;ref AVFilter.init "init" by the filters that
+     * want to pass a dictionary of AVOptions to nested contexts that are
+     * allocated in init.
+     *
+     * On return, the options dict should be freed and replaced with one that
+     * contains all the options which could not be processed by this filter (or
+     * with NULL if all the options are processed).
+     *
+     * Otherwise the semantics is the same as for &amp;lt; at &amp;gt;ref AVFilter.init "init".
      */
     int (*init_dict)(AVFilterContext *ctx, AVDictionary **options);
 
     /**
-     * Filter uninitialization function. Should deallocate any memory held
-     * by the filter, release any buffer references, etc. This does not need
-     * to deallocate the AVFilterContext-&amp;gt;priv memory itself.
+     * Filter uninitialization function.
+     *
+     * Called only once right before the filter is freed. Should deallocate any
+     * memory held by the filter, release any buffer references, etc. This does
+     * not need to deallocate the AVFilterContext.priv memory itself.
+     *
+     * This callback may be called even if &amp;lt; at &amp;gt;ref AVFilter.init "init" was not
+     * called or failed, so it must be prepared to handle such a situation.
      */
     void (*uninit)(AVFilterContext *ctx);
 
     /**
-     * Queries formats supported by the filter and its pads, and sets the
-     * in_formats for links connected to its output pads, and out_formats
-     * for links connected to its input pads.
+     * Query formats supported by the filter on its inputs and outputs.
+     *
+     * This callback is called after the filter is initialized (so the inputs
+     * and outputs are fixed), shortly before the format negotiation. This
+     * callback may be called more than once.
+     *
+     * This callback must set AVFilterLink.out_formats on every input link and
+     * AVFilterLink.in_formats on every output link to a list of pixel/sample
+     * formats that the filter supports on that link. For audio links, this
+     * filter must also set &amp;lt; at &amp;gt;ref AVFilterLink.in_samplerates "in_samplerates" /
+     * &amp;lt; at &amp;gt;ref AVFilterLink.out_samplerates "out_samplerates" and
+     * &amp;lt; at &amp;gt;ref AVFilterLink.in_channel_layouts "in_channel_layouts" /
+     * &amp;lt; at &amp;gt;ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously.
+     *
+     * This callback may be NULL for filters with one input, in which case
+     * libavfilter assumes that it supports all input formats and preserves
+     * them on output.
      *
      * &amp;lt; at &amp;gt;return zero on success, a negative value corresponding to an
      * AVERROR code otherwise
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -469,6 +533,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct AVFilter {
 
     int priv_size;      ///&amp;lt; size of private data to allocate for the filter
 
+    /**
+     * Used by the filter registration system. Must not be touched by any other
+     * code.
+     */
     struct AVFilter *next;
 } AVFilter;
 
&lt;/pre&gt;</description>
    <dc:creator>Anton Khirnov</dc:creator>
    <dc:date>2013-05-24T07:07:26</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46299">
    <title>Re: [PATCH] avcodec: Add field order information toAVCodecParserContext.</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46299</link>
    <description>&lt;pre&gt;2013/5/24 Diego Biurrun &amp;lt;diego-NvuzD6AdJSiELgA04lAiVw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;



 Here you are.
&lt;/pre&gt;</description>
    <dc:creator>Yusuke Nakamura</dc:creator>
    <dc:date>2013-05-23T18:12:41</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46298">
    <title>Re: [PATCH] avcodec: Add field order information to AVCodecParserContext.</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46298</link>
    <description>&lt;pre&gt;

Please make the entries AV_PICTURE_STRUCTURE_FOO.

Diego
&lt;/pre&gt;</description>
    <dc:creator>Diego Biurrun</dc:creator>
    <dc:date>2013-05-23T17:27:28</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46297">
    <title>Re: [PATCH] Monkey's Audio old versions FATE tests</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46297</link>
    <description>&lt;pre&gt;
LGTM


Something about rename detection is missing from your Git confiugaration.
RTFM please.

Diego
&lt;/pre&gt;</description>
    <dc:creator>Diego Biurrun</dc:creator>
    <dc:date>2013-05-23T17:25:46</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.video.libav.devel/46296">
    <title>Re: [PATCH 4/4] vf_fade: support slice threading</title>
    <link>http://permalink.gmane.org/gmane.comp.video.libav.devel/46296</link>
    <description>&lt;pre&gt;
Looks fine.

&lt;/pre&gt;</description>
    <dc:creator>Luca Barbato</dc:creator>
    <dc:date>2013-05-23T13:37:17</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.video.libav.devel">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.video.libav.devel</link>
  </textinput>
</rdf:RDF>
