Updated Patch

Greeshma


On Fri, Apr 24, 2015 at 12:37 AM, Michael Niedermayer <michae...@gmx.at>
wrote:

> On Thu, Apr 23, 2015 at 09:29:31PM +0530, greeshma wrote:
> > for patch PFA
> >
> > Greeshma
>
> >  exr.c |  114
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 114 insertions(+)
> > 57f8f5e474a82ddfce30f7356cb83fed4186d137
> 0001-exr-lossy-compression-B44-added.patch
> > From c10e182e56310cfc5ebd6c6f8801128668042a2a Mon Sep 17 00:00:00 2001
> > From: greeshmab <greeshmabalaba...@gmail.com>
> > Date: Mon, 20 Apr 2015 23:33:55 +0530
> > Subject: [PATCH] exr lossy compression B44 added
>
> FFmpeg_Logo_B44_HalfRGBA.exr does not decode correctly
>
>
> >
> > ---
> >  libavcodec/exr.c | 114
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 114 insertions(+)
> >
> > diff --git a/libavcodec/exr.c b/libavcodec/exr.c
> > index f9525ec..92ecc9b 100644
> > --- a/libavcodec/exr.c
> > +++ b/libavcodec/exr.c
> > @@ -770,6 +770,115 @@ static int piz_uncompress(EXRContext *s, const
> uint8_t *src, int ssize,
> >      return 0;
> >  }
> >
> > +static void B44_unpack14 ( GetByteContext *gb, uint16_t out[16]){
> > +    uint16_t shift;
> > +    const uint8_t *r = gb->buffer;
>
> theers no need to pass a GetByteContext if only a uint8_t * is used
>
>
> > +    av_assert0(r[2] != 0xfc);
>
>
> > +    out[0] = (r[0] << 8) | r[1];
> > +    shift = (r[2] >> 2);
> > +    out[ 1] = out[ 0] + ((r[ 5] >> 2) << shift);
> > +    out[ 2] = out[ 1] + ((r[ 8] >> 2) << shift);
> > +    out[ 3] = out[ 2] + ((r[11] >> 2) << shift);
> > +    out[ 4] = out[ 0] + (((r[ 2] << 4) | (r[ 3] >> 4)) << shift);
> > +    out[ 5] = out[ 4] + (((r[ 5] << 4) | (r[ 6] >> 4)) << shift);
> > +    out[ 6] = out[ 5] + (((r[ 8] << 4) | (r[ 9] >> 4)) << shift);
> > +    out[ 7] = out[ 6] + (((r[11] << 4) | (r[12] >> 4)) << shift);
> > +    out[ 8] = out[ 4] + (((r[ 3] << 2) | (r[ 4] >> 6)) << shift);
> > +    out[ 9] = out[ 8] + (((r[ 6] << 2) | (r[ 7] >> 6)) << shift);
> > +    out[10] = out[ 9] + (((r[ 9] << 2) | (r[10] >> 6)) << shift);
> > +    out[11] = out[10] + (((r[12] << 2) | (r[13] >> 6)) << shift);
> > +    out[12] = out[ 8] + (r[ 4]  << shift);
> > +    out[13] = out[12] + (r[ 7]  << shift);
> > +    out[14] = out[13] + (r[10]  << shift);
> > +    out[15] = out[14] + (r[13]  << shift);
> > +    for (int i = 0; i < 16; ++i) {              //if any out value
> exceeds 16bits
> > +        if (out[i] & 0x8000)
> > +            out[i] &= 0x7fff;
> > +        else
> > +            out[i] = ~out[i];
> > +    }
> > +}
> > +
> > +static void B44_unpack3 ( GetByteContext *gb, uint16_t out[16]){
> > +    const uint8_t *r = gb->buffer;
>  //pixels have the same value
> > +    av_assert0(r[2] == 0xfc);
> > +    out[0] = (r[0] << 8) | r[1];
> > +    if (out[0] & 0x8000)
> > +        out[0] &= 0x7fff;
> > +    else
> > +        out[0] = ~out[0];
> > +    for (int i = 1; i < 16; ++i)
> > +        out[i] = out[0];
> > +}
> > +
> > +static int b44_uncompress(EXRContext *s, const uint8_t *src,int ssize,
> int dsize, EXRThreadData *td){
> > +    GetByteContext gb;
> > +    unsigned long  dest_len = dsize;
> > +    uint8_t *out;
> > +    int i, j;
> > +    uint16_t *tmp = (uint16_t *)td->tmp;
>
> > +    out = td->uncompressed_data;
>
> > +    bytestream2_init(&gb, src, ssize);
> > +    if (uncompress(td->tmp, &dest_len, src, ssize) != Z_OK || dest_len
> != dsize)
> > +        return AVERROR_INVALIDDATA;
>
> this initialized both a bytereader as well as decomressing from
> the same source
> later the output from uncompress is overwritten without being used
>
>
> > +    for (i = 0; i < s->nb_channels; i++) {
> > +        EXRChannel *channel = &s->channels[i];
> > +        int size = channel->pixel_type;
> > +        int inSize = ssize;
> > +        if (channel->pixel_type != EXR_HALF) {              // UINT or
> FLOAT channel.
> > +            int n = s->xdelta * s->ydelta * size * sizeof (*tmp);
> > +            memcpy (tmp, gb.buffer, n);
> > +            gb.buffer += n;
> > +            inSize -= n;
> > +            continue;
> > +        } else {                                            //EXR_HALF
> Channel
> > +            for (int y=0; y < s->ydelta; y +=4 ) {
> > +                uint16_t *row0 = tmp + y * s->xdelta;
> > +                uint16_t *row1 = row0 + s->xdelta;
> > +                uint16_t *row2 = row1 + s->xdelta;
> > +                uint16_t *row3 = row2 + s->xdelta;
> > +                for (int x = 0; x < s->xdelta; x += 4) {
> > +                    uint16_t out[16];
> > +                    int num = (x + 3 < s->xdelta)? 4 * sizeof (*out) :
> (s->xdelta - x) * sizeof (*out);
> > +                    if (gb.buffer[2] == 0xfc) {
> > +                        B44_unpack3 (&gb, out);
> > +                        gb.buffer += 3;
> > +                        inSize -= 3;
> > +                    } else {
> > +                        B44_unpack14 (&gb, out);
> > +                        gb.buffer += 14;
> > +                        inSize -= 14;
> > +                    }
> > +                    if (y + 3 < s->ydelta) {
> > +                        memcpy (row0, &out[ 0], num);
> > +                        memcpy (row1, &out[ 4], num);
> > +                        memcpy (row2, &out[ 8], num);
> > +                        memcpy (row3, &out[12], num);
> > +                    } else {
> > +                        memcpy (row0, &out[ 0], num);
> > +                        if (y + 1 < s->ydelta)
> > +                            memcpy (row1, &out[ 4], num);
> > +                        if (y + 2 < s->ydelta)
> > +                            memcpy (row2, &out[ 8], num);
> > +                    }
> > +                    row0 += 4;
> > +                    row1 += 4;
> > +                    row2 += 4;
> > +                    row3 += 4;
> > +                }
> > +            }
>
> missing checks on the input buffer size
>
> [...]
>
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> When the tyrant has disposed of foreign enemies by conquest or treaty, and
> there is nothing more to fear from them, then he is always stirring up
> some war or other, in order that the people may require a leader. -- Plato
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
From d857196db9c6d388e49a9160da4e63c8a19839ae Mon Sep 17 00:00:00 2001
From: greeshmab <greeshmabalaba...@gmail.com>
Date: Sun, 26 Apr 2015 10:14:34 +0530
Subject: [PATCH] B44 compression techinique added

---
 0001-exr-lossy-compression-B44-added.patch | 151 +++++++++++++++++++++++++++++
 1 file changed, 151 insertions(+)
 create mode 100644 0001-exr-lossy-compression-B44-added.patch

diff --git a/0001-exr-lossy-compression-B44-added.patch b/0001-exr-lossy-compression-B44-added.patch
new file mode 100644
index 0000000..535efcc
--- /dev/null
+++ b/0001-exr-lossy-compression-B44-added.patch
@@ -0,0 +1,151 @@
+From c10e182e56310cfc5ebd6c6f8801128668042a2a Mon Sep 17 00:00:00 2001
+From: greeshmab <greeshmabalaba...@gmail.com>
+Date: Mon, 20 Apr 2015 23:33:55 +0530
+Subject: [PATCH] exr lossy compression B44 added
+
+---
+ libavcodec/exr.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 114 insertions(+)
+
+diff --git a/libavcodec/exr.c b/libavcodec/exr.c
+index f9525ec..92ecc9b 100644
+--- a/libavcodec/exr.c
++++ b/libavcodec/exr.c
+@@ -770,6 +770,115 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
+     return 0;
+ }
+ 
++static void B44_unpack14 ( GetByteContext *gb, uint16_t out[16]){
++    uint16_t shift;
++    const uint8_t *r = gb->buffer;
++    av_assert0(r[2] != 0xfc);
++    out[0] = (r[0] << 8) | r[1];
++    shift = (r[2] >> 2);
++    out[ 1] = out[ 0] + ((r[ 5] >> 2) << shift);
++    out[ 2] = out[ 1] + ((r[ 8] >> 2) << shift);
++    out[ 3] = out[ 2] + ((r[11] >> 2) << shift);
++    out[ 4] = out[ 0] + (((r[ 2] << 4) | (r[ 3] >> 4)) << shift);
++    out[ 5] = out[ 4] + (((r[ 5] << 4) | (r[ 6] >> 4)) << shift);
++    out[ 6] = out[ 5] + (((r[ 8] << 4) | (r[ 9] >> 4)) << shift);
++    out[ 7] = out[ 6] + (((r[11] << 4) | (r[12] >> 4)) << shift);
++    out[ 8] = out[ 4] + (((r[ 3] << 2) | (r[ 4] >> 6)) << shift);
++    out[ 9] = out[ 8] + (((r[ 6] << 2) | (r[ 7] >> 6)) << shift);
++    out[10] = out[ 9] + (((r[ 9] << 2) | (r[10] >> 6)) << shift);
++    out[11] = out[10] + (((r[12] << 2) | (r[13] >> 6)) << shift);
++    out[12] = out[ 8] + (r[ 4]  << shift);
++    out[13] = out[12] + (r[ 7]  << shift);
++    out[14] = out[13] + (r[10]  << shift);
++    out[15] = out[14] + (r[13]  << shift);
++    for (int i = 0; i < 16; ++i) {              //if any out value exceeds 16bits 
++        if (out[i] & 0x8000)
++            out[i] &= 0x7fff;
++        else
++            out[i] = ~out[i];
++    }
++}
++
++static void B44_unpack3 ( GetByteContext *gb, uint16_t out[16]){
++    const uint8_t *r = gb->buffer;                                       //pixels have the same value
++    av_assert0(r[2] == 0xfc);
++    out[0] = (r[0] << 8) | r[1];
++    if (out[0] & 0x8000)
++        out[0] &= 0x7fff;
++    else
++        out[0] = ~out[0];
++    for (int i = 1; i < 16; ++i)
++        out[i] = out[0];
++}
++
++static int b44_uncompress(EXRContext *s, const uint8_t *src,int ssize, int dsize, EXRThreadData *td){
++    GetByteContext gb;
++    unsigned long  dest_len = dsize;
++    uint8_t *out;
++    int i, j;
++    uint16_t *tmp = (uint16_t *)td->tmp;
++    out = td->uncompressed_data;
++    bytestream2_init(&gb, src, ssize);
++    if (uncompress(td->tmp, &dest_len, src, ssize) != Z_OK || dest_len != dsize)
++        return AVERROR_INVALIDDATA;
++    for (i = 0; i < s->nb_channels; i++) {
++        EXRChannel *channel = &s->channels[i];
++        int size = channel->pixel_type;
++        int inSize = ssize;
++        if (channel->pixel_type != EXR_HALF) {              // UINT or FLOAT channel.
++            int n = s->xdelta * s->ydelta * size * sizeof (*tmp);
++            memcpy (tmp, gb.buffer, n);
++            gb.buffer += n;
++            inSize -= n;
++            continue;
++        } else {                                            //EXR_HALF Channel
++            for (int y=0; y < s->ydelta; y +=4 ) {
++                uint16_t *row0 = tmp + y * s->xdelta;
++                uint16_t *row1 = row0 + s->xdelta;
++                uint16_t *row2 = row1 + s->xdelta;
++                uint16_t *row3 = row2 + s->xdelta;
++                for (int x = 0; x < s->xdelta; x += 4) {
++                    uint16_t out[16];
++                    int num = (x + 3 < s->xdelta)? 4 * sizeof (*out) : (s->xdelta - x) * sizeof (*out); 
++                    if (gb.buffer[2] == 0xfc) {
++                        B44_unpack3 (&gb, out);
++                        gb.buffer += 3;
++                        inSize -= 3;
++                    } else {
++                        B44_unpack14 (&gb, out);
++                        gb.buffer += 14;
++                        inSize -= 14;
++                    }
++                    if (y + 3 < s->ydelta) {
++                        memcpy (row0, &out[ 0], num);
++                        memcpy (row1, &out[ 4], num);
++                        memcpy (row2, &out[ 8], num);
++                        memcpy (row3, &out[12], num);
++                    } else {
++                        memcpy (row0, &out[ 0], num);
++                        if (y + 1 < s->ydelta)
++                            memcpy (row1, &out[ 4], num);
++                        if (y + 2 < s->ydelta)
++                            memcpy (row2, &out[ 8], num);
++                    }
++                    row0 += 4;
++                    row1 += 4;
++                    row2 += 4;
++                    row3 += 4;
++                }
++            }
++        }
++    }
++    for (i = 0; i < s->ysize; i++) {
++        for (j = 0; j < s->nb_channels; j++) {
++            uint16_t *in = tmp + j * s->xdelta * s->ysize + i * s->xdelta;
++            memcpy(out, in, s->xdelta * 2);
++            out += s->xdelta * 2;
++        }
++    }
++    return 0;
++}
++
+ static int pxr24_uncompress(EXRContext *s, const uint8_t *src,
+                             int compressed_size, int uncompressed_size,
+                             EXRThreadData *td)
+@@ -888,6 +997,10 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
+             break;
+         case EXR_RLE:
+             ret = rle_uncompress(src, data_size, uncompressed_size, td);
++            break;
++        case EXR_B44:
++            ret = b44_uncompress(s, src, data_size, uncompressed_size, td);
++            break;
+         }
+         if (ret < 0) {
+             av_log(avctx, AV_LOG_ERROR, "decode_block() failed.\n");
+@@ -1282,6 +1395,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
+         s->scan_lines_per_block = 16;
+         break;
+     case EXR_PIZ:
++    case EXR_B44:
+         s->scan_lines_per_block = 32;
+         break;
+     default:
+-- 
+1.9.1
+
-- 
1.9.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to