[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-26 Thread Vittorio Giovara
---
Variable name change and two possible out of bounds reads spotted by Kostya.
Vittorio

 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 126 
 libavcodec/aliaspixenc.c | 134 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   2 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 277 insertions(+), 2 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 76eca07..ed182bb 100644
--- a/Changelog
+++ b/Changelog
@@ -5,6 +5,7 @@ version next:
 - libx265 encoder
 - shuffleplanes filter
 - replaygain data export
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c13d5e5..f4dfa85 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -90,6 +90,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..6872004
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,126 @@
+/*
+ * Alias PIX image decoder
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include libavutil/intreadwrite.h
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, bits_pixel, pixel;
+uint8_t *out_buf;
+uint8_t count;
+int x, y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16u(gb);
+height = bytestream2_get_be16u(gb);
+bytestream2_skipu(gb, 4); // obsolete X, Y offset
+bits_pixel = bytestream2_get_be16u(gb);
+
+if (bits_pixel == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (bits_pixel == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+x = avctx-width;
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (x == avctx-width) {
+x = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+if (y  avctx-height) {
+av_log(avctx, AV_LOG_ERROR,
+   Ended frame decoding with %d bytes left.\n,
+  

Re: [libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-26 Thread Kostya Shishkov
On Wed, Mar 26, 2014 at 07:19:54PM +0100, Vittorio Giovara wrote:
 ---
 Variable name change and two possible out of bounds reads spotted by Kostya.
 Vittorio
 
  Changelog|   1 +
  doc/general.texi |   2 +
  libavcodec/Makefile  |   2 +
  libavcodec/aliaspixdec.c | 126 
  libavcodec/aliaspixenc.c | 134 
 +++
  libavcodec/allcodecs.c   |   1 +
  libavcodec/avcodec.h |   1 +
  libavcodec/codec_desc.c  |   7 +++
  libavcodec/version.h |   2 +-
  libavformat/img2.c   |   1 +
  libavformat/img2enc.c|   2 +-
  11 files changed, 277 insertions(+), 2 deletions(-)
  create mode 100644 libavcodec/aliaspixdec.c
  create mode 100644 libavcodec/aliaspixenc.c
 
 diff --git a/Changelog b/Changelog
 index 76eca07..ed182bb 100644
 --- a/Changelog
 +++ b/Changelog
 @@ -5,6 +5,7 @@ version next:
  - libx265 encoder
  - shuffleplanes filter
  - replaygain data export
 +- Alias PIX image encoder and decoder
  
  
  version 10:
 diff --git a/doc/general.texi b/doc/general.texi
 index 8c0cb1b..dce4c0a 100644
 --- a/doc/general.texi
 +++ b/doc/general.texi
 @@ -424,6 +424,8 @@ following image formats are supported:
  @item Name @tab Encoding @tab Decoding @tab Comments
  @item .Y.U.V   @tab X @tab X
  @tab one raw file per component
 +@item Alias PIX@tab X @tab X
 +@tab Alias/Wavefront PIX image format
  @item animated GIF @tab X @tab X
  @tab Only uncompressed GIFs are generated.
  @item BMP  @tab X @tab X
 diff --git a/libavcodec/Makefile b/libavcodec/Makefile
 index c13d5e5..f4dfa85 100644
 --- a/libavcodec/Makefile
 +++ b/libavcodec/Makefile
 @@ -90,6 +90,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
 ac3enc.o ac3tab.o ac3.o
  OBJS-$(CONFIG_AIC_DECODER) += aic.o
  OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
  OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
 +OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
 +OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
  OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
  OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
celp_math.o acelp_filters.o \
 diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
 new file mode 100644
 index 000..6872004
 --- /dev/null
 +++ b/libavcodec/aliaspixdec.c
 @@ -0,0 +1,126 @@
 +/*
 + * Alias PIX image decoder
 + * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
 + *
 + * This file is part of Libav.
 + *
 + * Libav is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
 + * version 2.1 of the License, or (at your option) any later version.
 + *
 + * Libav is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with Libav; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
 USA
 + */
 +
 +#include libavutil/intreadwrite.h
 +
 +#include avcodec.h
 +#include bytestream.h
 +#include internal.h
 +
 +#define ALIAS_HEADER_SIZE 10
 +
 +static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
 +AVPacket *avpkt)
 +{
 +AVFrame *f = data;
 +GetByteContext gb;
 +int width, height, ret, bits_pixel, pixel;
 +uint8_t *out_buf;
 +uint8_t count;
 +int x, y = 0;
 +
 +bytestream2_init(gb, avpkt-data, avpkt-size);
 +
 +if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
 +av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +width  = bytestream2_get_be16u(gb);
 +height = bytestream2_get_be16u(gb);
 +bytestream2_skipu(gb, 4); // obsolete X, Y offset
 +bits_pixel = bytestream2_get_be16u(gb);
 +
 +if (bits_pixel == 24)
 +avctx-pix_fmt = AV_PIX_FMT_BGR24;
 +else if (bits_pixel == 8)
 +avctx-pix_fmt = AV_PIX_FMT_GRAY8;
 +else {
 +av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +ret = ff_set_dimensions(avctx, width, height);
 +if (ret  0)
 +return ret;
 +
 +ret = ff_get_buffer(avctx, f, 0);
 +if (ret  0)
 +return ret;
 +
 +f-pict_type = AV_PICTURE_TYPE_I;
 +f-key_frame = 1;
 +
 +x = avctx-width;

x = 0;
out_buf = f-data[0];

 +while (bytestream2_get_bytes_left(gb)  0) {
 +int i;
 +
 +/* set buffer at the right position at every new line */
 +if (x == 

Re: [libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-26 Thread Vittorio Giovara
On Wed, Mar 26, 2014 at 7:28 PM, Kostya Shishkov
kostya.shish...@gmail.com wrote:
 On Wed, Mar 26, 2014 at 07:19:54PM +0100, Vittorio Giovara wrote:
 ---

 +x = avctx-width;

 x = 0;
 out_buf = f-data[0];

 +while (bytestream2_get_bytes_left(gb)  0) {
 +int i;
 +
 +/* set buffer at the right position at every new line */
 +if (x == avctx-width) {
 +x = 0;
 +out_buf = f-data[0] + f-linesize[0] * y++;
 +if (y  avctx-height) {

OK I'll also ad a y = 1 so that i don't have to put a -1 in the check below

 +av_log(avctx, AV_LOG_ERROR,
 +   Ended frame decoding with %d bytes left.\n,
 +   bytestream2_get_bytes_left(gb));
 +return AVERROR_INVALIDDATA;
 +}
 +}
 +
 +/* read packet and copy data */
 +count = bytestream2_get_byteu(gb);
 +if (!count || x + count  avctx-width) {
 +av_log(avctx, AV_LOG_ERROR, Invalid run length %d.\n, count);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +if (avctx-pix_fmt == AV_PIX_FMT_BGR24) {
 +pixel = bytestream2_get_be24u(gb);

 u?
 Are you sure it doesn't need to be checked?

 +for (i = 0; i  count; i++) {
 +AV_WB24(out_buf, pixel);
 +out_buf += 3;
 +}
 +} else { // AV_PIX_FMT_GRAY8
 +pixel = bytestream2_get_byteu(gb);

 ditto

Well, yes, it need to be checked.


 the rest (including encoder) LGTM

yay, thanks.
-- 
Vittorio
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel


[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Vittorio Giovara
---
Amended as requested.
Thanks for the reviews.
Vittorio

 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 115 +
 libavcodec/aliaspixenc.c | 130 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   4 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 263 insertions(+), 3 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 279c0d8..0f1007d 100644
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
 version next:
 - compand audio filter
 - shuffleplanes filter
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c04b3f1..8f531fc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..aeaa748
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,115 @@
+/*
+ * Alias PIX image
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, format;
+uint8_t *out_buf;
+uint8_t count, r, g, b;
+int y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, buf_size too small (%d)\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16(gb);
+height = bytestream2_get_be16(gb);
+bytestream2_skip(gb, 4); // obsolete X, Y offset
+format = bytestream2_get_be16(gb);
+
+if (format == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (format == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, invalid format\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (width == avctx-width) {
+width = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+}
+
+/* read packet and copy data */
+count = bytestream2_get_byte(gb);
+if (width + count  avctx-width) {
+av_log(avctx, AV_LOG_ERROR, buffer overrun\n);
+return AVERROR_INVALIDDATA;
+   

Re: [libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Kostya Shishkov
On Thu, Mar 20, 2014 at 01:10:06PM +0100, Vittorio Giovara wrote:
 ---
 Amended as requested.
 Thanks for the reviews.
 Vittorio
 
  Changelog|   1 +
  doc/general.texi |   2 +
  libavcodec/Makefile  |   2 +
  libavcodec/aliaspixdec.c | 115 +
  libavcodec/aliaspixenc.c | 130 
 +++
  libavcodec/allcodecs.c   |   1 +
  libavcodec/avcodec.h |   1 +
  libavcodec/codec_desc.c  |   7 +++
  libavcodec/version.h |   4 +-
  libavformat/img2.c   |   1 +
  libavformat/img2enc.c|   2 +-
  11 files changed, 263 insertions(+), 3 deletions(-)
  create mode 100644 libavcodec/aliaspixdec.c
  create mode 100644 libavcodec/aliaspixenc.c
 
 diff --git a/Changelog b/Changelog
 index 279c0d8..0f1007d 100644
 --- a/Changelog
 +++ b/Changelog
 @@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
  version next:
  - compand audio filter
  - shuffleplanes filter
 +- Alias PIX image encoder and decoder
  
  
  version 10:
 diff --git a/doc/general.texi b/doc/general.texi
 index 8c0cb1b..dce4c0a 100644
 --- a/doc/general.texi
 +++ b/doc/general.texi
 @@ -424,6 +424,8 @@ following image formats are supported:
  @item Name @tab Encoding @tab Decoding @tab Comments
  @item .Y.U.V   @tab X @tab X
  @tab one raw file per component
 +@item Alias PIX@tab X @tab X
 +@tab Alias/Wavefront PIX image format
  @item animated GIF @tab X @tab X
  @tab Only uncompressed GIFs are generated.
  @item BMP  @tab X @tab X
 diff --git a/libavcodec/Makefile b/libavcodec/Makefile
 index c04b3f1..8f531fc 100644
 --- a/libavcodec/Makefile
 +++ b/libavcodec/Makefile
 @@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
 ac3enc.o ac3tab.o ac3.o
  OBJS-$(CONFIG_AIC_DECODER) += aic.o
  OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
  OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
 +OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
 +OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
  OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
  OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
celp_math.o acelp_filters.o \
 diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
 new file mode 100644
 index 000..aeaa748
 --- /dev/null
 +++ b/libavcodec/aliaspixdec.c
 @@ -0,0 +1,115 @@
 +/*
 + * Alias PIX image

Alias PIX image decoder

 + * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
 + *
 + * This file is part of Libav.
 + *
 + * Libav is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
 + * version 2.1 of the License, or (at your option) any later version.
 + *
 + * Libav is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with Libav; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
 USA
 + */
 +
 +#include avcodec.h
 +#include bytestream.h
 +#include internal.h
 +
 +#define ALIAS_HEADER_SIZE 10
 +
 +static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
 +AVPacket *avpkt)
 +{
 +AVFrame *f = data;
 +GetByteContext gb;
 +int width, height, ret, format;
 +uint8_t *out_buf;
 +uint8_t count, r, g, b;
 +int y = 0;
 +
 +bytestream2_init(gb, avpkt-data, avpkt-size);
 +
 +if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
 +av_log(avctx, AV_LOG_ERROR, buf_size too small (%d)\n, 
 avpkt-size);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +width  = bytestream2_get_be16(gb);
 +height = bytestream2_get_be16(gb);
 +bytestream2_skip(gb, 4); // obsolete X, Y offset
 +format = bytestream2_get_be16(gb);
 +
 +if (format == 24)
 +avctx-pix_fmt = AV_PIX_FMT_BGR24;
 +else if (format == 8)
 +avctx-pix_fmt = AV_PIX_FMT_GRAY8;
 +else {
 +av_log(avctx, AV_LOG_ERROR, invalid format\n);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +ret = ff_set_dimensions(avctx, width, height);
 +if (ret  0)
 +return ret;
 +
 +ret = ff_get_buffer(avctx, f, 0);
 +if (ret  0)
 +return ret;
 +
 +f-pict_type = AV_PICTURE_TYPE_I;
 +f-key_frame = 1;
 +
 +while (bytestream2_get_bytes_left(gb)  0) {
 +int i;
 +
 +/* set buffer at the right position at every new line */
 +if (width == avctx-width) {
 +width = 0;
 +out_buf = f-data[0] + f-linesize[0] * y++;


[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Vittorio Giovara
---
 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 115 +
 libavcodec/aliaspixenc.c | 131 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   4 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 264 insertions(+), 3 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 279c0d8..0f1007d 100644
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
 version next:
 - compand audio filter
 - shuffleplanes filter
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c04b3f1..8f531fc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..6b55614
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,115 @@
+/*
+ * Alias PIX image decoder
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, format;
+uint8_t *out_buf;
+uint8_t count, r, g, b;
+int y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16(gb);
+height = bytestream2_get_be16(gb);
+bytestream2_skip(gb, 4); // obsolete X, Y offset
+format = bytestream2_get_be16(gb);
+
+if (format == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (format == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (width == avctx-width) {
+width = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+}
+
+/* read packet and copy data */
+count = bytestream2_get_byte(gb);
+if (!count || width + count  avctx-width) {
+av_log(avctx, AV_LOG_ERROR, Invalid run length %d.\n, count);
+return AVERROR_INVALIDDATA;
+}
+
+

[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Vittorio Giovara
---
Some more tweaks Justin asked me.
Vittorio

 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 114 
 libavcodec/aliaspixenc.c | 132 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   4 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 264 insertions(+), 3 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 279c0d8..0f1007d 100644
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
 version next:
 - compand audio filter
 - shuffleplanes filter
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c04b3f1..8f531fc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..47cd5e2
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,114 @@
+/*
+ * Alias PIX image decoder
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include libavutil/intreadwrite.h
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, format, pixel;
+uint8_t *out_buf;
+uint8_t count;
+int y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16(gb);
+height = bytestream2_get_be16(gb);
+bytestream2_skip(gb, 4); // obsolete X, Y offset
+format = bytestream2_get_be16(gb);
+
+if (format == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (format == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (width == avctx-width) {
+width = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+}
+
+/* read packet and copy data */
+count = bytestream2_get_byte(gb);
+if (!count || width + count  avctx-width) {
+av_log(avctx, AV_LOG_ERROR, Invalid run length 

Re: [libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Justin Ruggles
On 03/20/2014 11:57 AM, Vittorio Giovara wrote:
 ---
 Some more tweaks Justin asked me.
 Vittorio
 
  Changelog|   1 +
  doc/general.texi |   2 +
  libavcodec/Makefile  |   2 +
  libavcodec/aliaspixdec.c | 114 
  libavcodec/aliaspixenc.c | 132 
 +++
  libavcodec/allcodecs.c   |   1 +
  libavcodec/avcodec.h |   1 +
  libavcodec/codec_desc.c  |   7 +++
  libavcodec/version.h |   4 +-
  libavformat/img2.c   |   1 +
  libavformat/img2enc.c|   2 +-
  11 files changed, 264 insertions(+), 3 deletions(-)
  create mode 100644 libavcodec/aliaspixdec.c
  create mode 100644 libavcodec/aliaspixenc.c
[...]
 +bytestream2_init(gb, avpkt-data, avpkt-size);
 +
 +if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
 +av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +width  = bytestream2_get_be16(gb);
 +height = bytestream2_get_be16(gb);
 +bytestream2_skip(gb, 4); // obsolete X, Y offset
 +format = bytestream2_get_be16(gb);

since you check the size first, you should use the unchecked bytestream2
functions (i.e. add 'u' to the end of all 4)

also, why not call it 'depth' instead of 'format' to match your encoder?

 +
 +if (format == 24)
 +avctx-pix_fmt = AV_PIX_FMT_BGR24;
 +else if (format == 8)
 +avctx-pix_fmt = AV_PIX_FMT_GRAY8;
 +else {
 +av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +ret = ff_set_dimensions(avctx, width, height);
 +if (ret  0)
 +return ret;
 +
 +ret = ff_get_buffer(avctx, f, 0);
 +if (ret  0)
 +return ret;
 +
 +f-pict_type = AV_PICTURE_TYPE_I;
 +f-key_frame = 1;
 +
 +while (bytestream2_get_bytes_left(gb)  0) {
 +int i;
 +
 +/* set buffer at the right position at every new line */
 +if (width == avctx-width) {
 +width = 0;
 +out_buf = f-data[0] + f-linesize[0] * y++;
 +}
 +
 +/* read packet and copy data */
 +count = bytestream2_get_byte(gb);

same here bytestream2_get_byteu(gb)

 +if (!count || width + count  avctx-width) {
 +av_log(avctx, AV_LOG_ERROR, Invalid run length %d.\n, count);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +if (avctx-pix_fmt == AV_PIX_FMT_BGR24) {

you could check 'format' instead of avctx-pix_fmt.

[...]
 +static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 +const AVFrame *frame, int *got_packet)
 +{
 +int width, height, depth, i, j, length, ret;
 +uint8_t *in_buf, *buf;
 +
 +avctx-coded_frame-pict_type = AV_PICTURE_TYPE_I;
 +avctx-coded_frame-key_frame = 1;
 +
 +width  = avctx-width;
 +height = avctx-height;
 +
 +if (width  65535 || height  65536 ||

Looks like a typo for height.

 +width * height = INT_MAX / 4 - 10LL) {
 +av_log(avctx, AV_LOG_ERROR, Invalid image size %dx%d.\n, width, 
 height);
 +return AVERROR_INVALIDDATA;
 +}
 +
 +switch (avctx-pix_fmt) {
 +case AV_PIX_FMT_GRAY8:
 +depth = 8;
 +break;
 +case AV_PIX_FMT_BGR24:
 +depth = 24;
 +break;
 +default:
 +return AVERROR_INVALIDDATA;
 +}
 +
 +length = ALIAS_HEADER_SIZE + 4 * width * height; // max possible
 +if ((ret = ff_alloc_packet(pkt, length))  0) {
 +av_log(avctx, AV_LOG_ERROR, Error getting output packet of size 
 %d.\n, length);
 +return ret;
 +}
 +
 +buf = pkt-data;
 +
 +/* Encode header. */
 +bytestream_put_be16(buf, width);
 +bytestream_put_be16(buf, height);
 +bytestream_put_be32(buf, 0L); /* X, Y offset */
 +bytestream_put_be16(buf, depth);
 +
 +for (j = 0; j  height; j++) {
 +in_buf = frame-data[0] + frame-linesize[0] * j;
 +for (i = 0; i  width; ) {
 +int count = 0;
 +int pixel;
 +
 +if (avctx-pix_fmt == AV_PIX_FMT_GRAY8) {

you could check 'depth' instead of avctx-pix_fmt.

 +pixel = *in_buf;
 +while (count  255  count + i  width  pixel == *in_buf) 
 {
 +count++;
 +in_buf++;
 +}
 +} else { /* AV_PIX_FMT_BGR24 */
 +pixel = AV_RB24(in_buf);
 +while (count  255  count + i  width 
 +   pixel == AV_RB24(in_buf)) {
 +count++;
 +in_buf += 3;
 +}
 +}
 +i += count;
 +bytestream_put_byte(buf, count);
 +bytestream_put_be24(buf, pixel);
 +}
 +}
 +
 +/* Total length */
 +pkt-size   = buf - pkt-data;

av_shrink_packet()

Thanks,
Justin
___
libav-devel mailing list

[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Vittorio Giovara
---
Amended as asked by Justin. I only kept the avctx-pix_fmt checks because they 
look
more readable to me.
Cheers,
Vittorio

 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 114 
 libavcodec/aliaspixenc.c | 132 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   4 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 264 insertions(+), 3 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 279c0d8..0f1007d 100644
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
 version next:
 - compand audio filter
 - shuffleplanes filter
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c04b3f1..8f531fc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..0dd1c84
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,114 @@
+/*
+ * Alias PIX image decoder
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include libavutil/intreadwrite.h
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, bits_pixel, pixel;
+uint8_t *out_buf;
+uint8_t count;
+int y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16u(gb);
+height = bytestream2_get_be16u(gb);
+bytestream2_skipu(gb, 4); // obsolete X, Y offset
+bits_pixel = bytestream2_get_be16u(gb);
+
+if (bits_pixel == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (bits_pixel == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (width == avctx-width) {
+width = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+}
+
+/* read packet and copy data */
+count = bytestream2_get_byteu(gb);
+

Re: [libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Justin Ruggles
On 03/20/2014 09:13 PM, Vittorio Giovara wrote:
 ---
 Amended as asked by Justin. I only kept the avctx-pix_fmt checks because 
 they look
 more readable to me.
 Cheers,
 Vittorio
 
  Changelog|   1 +
  doc/general.texi |   2 +
  libavcodec/Makefile  |   2 +
  libavcodec/aliaspixdec.c | 114 
  libavcodec/aliaspixenc.c | 132 
 +++
  libavcodec/allcodecs.c   |   1 +
  libavcodec/avcodec.h |   1 +
  libavcodec/codec_desc.c  |   7 +++
  libavcodec/version.h |   4 +-
  libavformat/img2.c   |   1 +
  libavformat/img2enc.c|   2 +-
  11 files changed, 264 insertions(+), 3 deletions(-)
  create mode 100644 libavcodec/aliaspixdec.c
  create mode 100644 libavcodec/aliaspixenc.c
 
[...]
 diff --git a/libavcodec/aliaspixenc.c b/libavcodec/aliaspixenc.c
 new file mode 100644
 index 000..22f6aac
 --- /dev/null
 +++ b/libavcodec/aliaspixenc.c
 @@ -0,0 +1,132 @@
 +/*
 + * Alias PIX image encoder
 + * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
 + *
 + * This file is part of Libav.
 + *
 + * Libav is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
 + * version 2.1 of the License, or (at your option) any later version.
 + *
 + * Libav is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with Libav; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
 USA
 + */
 +
 +#include libavutil/intreadwrite.h
 +
 +#include avcodec.h
 +#include bytestream.h
 +#include internal.h
 +
 +#define ALIAS_HEADER_SIZE 10
 +
 +static av_cold int encode_init(AVCodecContext *avctx)
 +{
 +avctx-coded_frame = av_frame_alloc();
 +if (!avctx-coded_frame)
 +return AVERROR(ENOMEM);
 +return 0;
 +}
 +
 +static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 +const AVFrame *frame, int *got_packet)
 +{
 +int width, height, bits_pixel, i, j, length, ret;
 +uint8_t *in_buf, *buf;
 +
 +avctx-coded_frame-pict_type = AV_PICTURE_TYPE_I;
 +avctx-coded_frame-key_frame = 1;
 +
 +width  = avctx-width;
 +height = avctx-height;
 +
 +if (width  65535 || height  65535 ||
 +width * height = INT_MAX / 4 - 10LL) {
 +av_log(avctx, AV_LOG_ERROR, Invalid image size %dx%d.\n, width, 
 height);
 +return AVERROR_INVALIDDATA;
 +}

That doesn't need to be 10LL. You can use ALIAS_HEADER_SIZE.

 +
 +switch (avctx-pix_fmt) {
 +case AV_PIX_FMT_GRAY8:
 +bits_pixel = 8;
 +break;
 +case AV_PIX_FMT_BGR24:
 +bits_pixel = 24;
 +break;
 +default:
 +return AVERROR_INVALIDDATA;

AVERROR(EINVAL)

although it won't ever get this far...

 +}
 +
 +length = ALIAS_HEADER_SIZE + 4 * width * height; // max possible
 +if ((ret = ff_alloc_packet(pkt, length))  0) {
 +av_log(avctx, AV_LOG_ERROR, Error getting output packet of size 
 %d.\n, length);
 +return ret;
 +}
 +
 +buf = pkt-data;
 +
 +/* Encode header. */
 +bytestream_put_be16(buf, width);
 +bytestream_put_be16(buf, height);
 +bytestream_put_be32(buf, 0L); /* X, Y offset */

You don't need the L

 +bytestream_put_be16(buf, bits_pixel);
 +
 +for (j = 0; j  height; j++) {
 +in_buf = frame-data[0] + frame-linesize[0] * j;
 +for (i = 0; i  width; ) {
 +int count = 0;
 +int pixel;
 +
 +if (avctx-pix_fmt == AV_PIX_FMT_GRAY8) {
 +pixel = *in_buf;
 +while (count  255  count + i  width  pixel == *in_buf) 
 {
 +count++;
 +in_buf++;
 +}
 +} else { /* AV_PIX_FMT_BGR24 */
 +pixel = AV_RB24(in_buf);
 +while (count  255  count + i  width 
 +   pixel == AV_RB24(in_buf)) {
 +count++;
 +in_buf += 3;
 +}
 +}
 +i += count;
 +bytestream_put_byte(buf, count);
 +bytestream_put_be24(buf, pixel);
 +}
 +}
 +
 +/* Total length */
 +av_shrink_packet(pkt, buf - pkt-data);
 +pkt-flags |= AV_PKT_FLAG_KEY;
 +*got_packet = 1;
 +
 +return 0;
 +}
 +
 +static av_cold int encode_close(AVCodecContext *avctx)
 +{
 +av_frame_free(avctx-coded_frame);
 +return 0;
 +}
 +
 +AVCodec ff_alias_pix_encoder = {
 +.name  = alias_pix,
 +.long_name = NULL_IF_CONFIG_SMALL(Alias/Wavefront PIX image),
 +

[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Vittorio Giovara
---
 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 114 
 libavcodec/aliaspixenc.c | 132 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   4 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 264 insertions(+), 3 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 279c0d8..0f1007d 100644
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
 version next:
 - compand audio filter
 - shuffleplanes filter
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c04b3f1..8f531fc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..0dd1c84
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,114 @@
+/*
+ * Alias PIX image decoder
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include libavutil/intreadwrite.h
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, bits_pixel, pixel;
+uint8_t *out_buf;
+uint8_t count;
+int y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16u(gb);
+height = bytestream2_get_be16u(gb);
+bytestream2_skipu(gb, 4); // obsolete X, Y offset
+bits_pixel = bytestream2_get_be16u(gb);
+
+if (bits_pixel == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (bits_pixel == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (width == avctx-width) {
+width = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+}
+
+/* read packet and copy data */
+count = bytestream2_get_byteu(gb);
+if (!count || width + count  avctx-width) {
+av_log(avctx, AV_LOG_ERROR, Invalid run length %d.\n, count);
+

[libav-devel] [PATCH] Alias PIX image encoder and decoder

2014-03-20 Thread Vittorio Giovara
---
Now with a working gray encoder.
Vittorio

 Changelog|   1 +
 doc/general.texi |   2 +
 libavcodec/Makefile  |   2 +
 libavcodec/aliaspixdec.c | 114 
 libavcodec/aliaspixenc.c | 134 +++
 libavcodec/allcodecs.c   |   1 +
 libavcodec/avcodec.h |   1 +
 libavcodec/codec_desc.c  |   7 +++
 libavcodec/version.h |   4 +-
 libavformat/img2.c   |   1 +
 libavformat/img2enc.c|   2 +-
 11 files changed, 266 insertions(+), 3 deletions(-)
 create mode 100644 libavcodec/aliaspixdec.c
 create mode 100644 libavcodec/aliaspixenc.c

diff --git a/Changelog b/Changelog
index 279c0d8..0f1007d 100644
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
 version next:
 - compand audio filter
 - shuffleplanes filter
+- Alias PIX image encoder and decoder
 
 
 version 10:
diff --git a/doc/general.texi b/doc/general.texi
index 8c0cb1b..dce4c0a 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -424,6 +424,8 @@ following image formats are supported:
 @item Name @tab Encoding @tab Decoding @tab Comments
 @item .Y.U.V   @tab X @tab X
 @tab one raw file per component
+@item Alias PIX@tab X @tab X
+@tab Alias/Wavefront PIX image format
 @item animated GIF @tab X @tab X
 @tab Only uncompressed GIFs are generated.
 @item BMP  @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c04b3f1..8f531fc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -88,6 +88,8 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER)   += ac3enc_fixed.o 
ac3enc.o ac3tab.o ac3.o
 OBJS-$(CONFIG_AIC_DECODER) += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)+= alac.o alac_data.o
 OBJS-$(CONFIG_ALAC_ENCODER)+= alacenc.o alac_data.o
+OBJS-$(CONFIG_ALIAS_PIX_DECODER)   += aliaspixdec.o
+OBJS-$(CONFIG_ALIAS_PIX_ENCODER)   += aliaspixenc.o
 OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
 OBJS-$(CONFIG_AMRNB_DECODER)   += amrnbdec.o celp_filters.o   \
   celp_math.o acelp_filters.o \
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
new file mode 100644
index 000..0dd1c84
--- /dev/null
+++ b/libavcodec/aliaspixdec.c
@@ -0,0 +1,114 @@
+/*
+ * Alias PIX image decoder
+ * Copyright (C) 2014 Vittorio Giovara vittorio.giov...@gmail.com
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include libavutil/intreadwrite.h
+
+#include avcodec.h
+#include bytestream.h
+#include internal.h
+
+#define ALIAS_HEADER_SIZE 10
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+AVPacket *avpkt)
+{
+AVFrame *f = data;
+GetByteContext gb;
+int width, height, ret, bits_pixel, pixel;
+uint8_t *out_buf;
+uint8_t count;
+int y = 0;
+
+bytestream2_init(gb, avpkt-data, avpkt-size);
+
+if (bytestream2_get_bytes_left(gb)  ALIAS_HEADER_SIZE) {
+av_log(avctx, AV_LOG_ERROR, Header too small %d.\n, avpkt-size);
+return AVERROR_INVALIDDATA;
+}
+
+width  = bytestream2_get_be16u(gb);
+height = bytestream2_get_be16u(gb);
+bytestream2_skipu(gb, 4); // obsolete X, Y offset
+bits_pixel = bytestream2_get_be16u(gb);
+
+if (bits_pixel == 24)
+avctx-pix_fmt = AV_PIX_FMT_BGR24;
+else if (bits_pixel == 8)
+avctx-pix_fmt = AV_PIX_FMT_GRAY8;
+else {
+av_log(avctx, AV_LOG_ERROR, Invalid pixel format.\n);
+return AVERROR_INVALIDDATA;
+}
+
+ret = ff_set_dimensions(avctx, width, height);
+if (ret  0)
+return ret;
+
+ret = ff_get_buffer(avctx, f, 0);
+if (ret  0)
+return ret;
+
+f-pict_type = AV_PICTURE_TYPE_I;
+f-key_frame = 1;
+
+while (bytestream2_get_bytes_left(gb)  0) {
+int i;
+
+/* set buffer at the right position at every new line */
+if (width == avctx-width) {
+width = 0;
+out_buf = f-data[0] + f-linesize[0] * y++;
+}
+
+/* read packet and copy data */
+count = bytestream2_get_byteu(gb);
+if (!count || width + count  avctx-width) {
+av_log(avctx, AV_LOG_ERROR,