Re: [FFmpeg-devel] [PATCH v12] libavcodec/jpeg2000dec.c: Add support for PPT marker

2020-04-05 Thread Gautam Ramakrishnan
On Sun, Apr 5, 2020 at 3:13 PM Moritz Barsnick  wrote:
>
> On Sun, Apr 05, 2020 at 10:28:17 +0530, gautamr...@gmail.com wrote:
> > +tile->has_ppt = 1;  // this tile has a ppt marker
> > +/*Zppt = */ bytestream2_get_byte(>g); // Zppt is skipped and not 
> > used
>
> I don't know what others think, but, as mentioned in my first review, I
> really dislike this style, because it gives the impression that this
> line is commented out, when just skimming over the code.
>
> How about just:
> bytestream2_get_byte(>g); // skip Zppt
> ?
>
This should do. I'll resubmit. Should I remove other instances
of something similar to this in another patch?
> Thanks,
> Moritz
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".



-- 
-
Gautam |
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH v12] libavcodec/jpeg2000dec.c: Add support for PPT marker

2020-04-05 Thread Moritz Barsnick
On Sun, Apr 05, 2020 at 10:28:17 +0530, gautamr...@gmail.com wrote:
> +tile->has_ppt = 1;  // this tile has a ppt marker
> +/*Zppt = */ bytestream2_get_byte(>g); // Zppt is skipped and not used

I don't know what others think, but, as mentioned in my first review, I
really dislike this style, because it gives the impression that this
line is commented out, when just skimming over the code.

How about just:
bytestream2_get_byte(>g); // skip Zppt
?

Thanks,
Moritz
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH v12] libavcodec/jpeg2000dec.c: Add support for PPT marker

2020-04-04 Thread gautamramk
From: Gautam Ramakrishnan 

This patch adds functional changes to support the
PPT marker. This patch fixes bug ticket #4610.
---
 libavcodec/jpeg2000dec.c | 88 +++-
 1 file changed, 77 insertions(+), 11 deletions(-)

diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index 732d88e6fc..7033417c65 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -83,6 +83,10 @@ typedef struct Jpeg2000Tile {
 Jpeg2000QuantStyle  qntsty[4];
 Jpeg2000POC poc;
 Jpeg2000TileParttile_part[32];
+uint8_t has_ppt;// whether this tile has a ppt 
marker
+uint8_t *packed_headers;// contains packed headers. 
Used only along with PPT marker
+int packed_headers_size;// size in bytes of the packed 
headers
+GetByteContext  packed_headers_stream;  // byte context corresponding 
to packed headers
 uint16_t tp_idx;// Tile-part index
 int coord[2][2];// border coordinates {{x0, x1}, {y0, 
y1}}
 } Jpeg2000Tile;
@@ -855,6 +859,37 @@ static int get_plt(Jpeg2000DecoderContext *s, int n)
 return 0;
 }
 
+static int get_ppt(Jpeg2000DecoderContext *s, int n)
+{
+Jpeg2000Tile *tile;
+
+if (s->curtileno < 0)
+return AVERROR_INVALIDDATA;
+
+tile = >tile[s->curtileno];
+if (tile->tp_idx != 0) {
+av_log(s->avctx, AV_LOG_ERROR,
+   "PPT marker can occur only on first tile part of a tile.\n");
+return AVERROR_INVALIDDATA;
+}
+
+tile->has_ppt = 1;  // this tile has a ppt marker
+/*Zppt = */ bytestream2_get_byte(>g); // Zppt is skipped and not used
+if (!tile->packed_headers)
+tile->packed_headers = av_malloc(n - 3);
+else
+tile->packed_headers = av_realloc(tile->packed_headers,
+  tile->packed_headers_size + n - 3);
+if (!tile->packed_headers)
+return AVERROR(ENOMEM);
+memcpy(tile->packed_headers + tile->packed_headers_size,
+   s->g.buffer, n - 3);
+tile->packed_headers_size += n - 3;
+bytestream2_skip(>g, n - 3);
+
+return 0;
+}
+
 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
 {
 int compno;
@@ -927,6 +962,19 @@ static int getlblockinc(Jpeg2000DecoderContext *s)
 return res;
 }
 
+static inline void select_stream(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
+ int *tp_index)
+{
+s->g = tile->tile_part[*tp_index].tpg;
+if (bytestream2_get_bytes_left(>g) == 0 && s->bit_index == 8) {
+if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
+s->g = tile->tile_part[++(*tp_index)].tpg;
+}
+}
+if (bytestream2_peek_be32(>g) == JPEG2000_SOP_FIXED_BYTES)
+bytestream2_skip(>g, JPEG2000_SOP_BYTE_LENGTH);
+}
+
 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile 
*tile, int *tp_index,
   Jpeg2000CodingStyle *codsty,
   Jpeg2000ResLevel *rlevel, int precno,
@@ -938,19 +986,15 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext 
*s, Jpeg2000Tile *tile,
 if (layno < rlevel->band[0].prec[precno].decoded_layers)
 return 0;
 rlevel->band[0].prec[precno].decoded_layers = layno + 1;
-
-if (bytestream2_get_bytes_left(>g) == 0 && s->bit_index == 8) {
-if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
-s->g = tile->tile_part[++(*tp_index)].tpg;
-}
-}
-
-if (bytestream2_peek_be32(>g) == JPEG2000_SOP_FIXED_BYTES)
-bytestream2_skip(>g, JPEG2000_SOP_BYTE_LENGTH);
+// Select stream to read from
+if (tile->has_ppt)
+s->g = tile->packed_headers_stream;
+else
+select_stream(s, tile, tp_index);
 
 if (!(ret = get_bits(s, 1))) {
 jpeg2000_flush(s);
-return 0;
+goto skip_data;
 } else if (ret < 0)
 return ret;
 
@@ -1056,6 +1100,11 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext 
*s, Jpeg2000Tile *tile,
 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead 
%X\n", bytestream2_peek_be32(>g));
 }
 
+// Save state of stream
+if (tile->has_ppt) {
+tile->packed_headers_stream = s->g;
+select_stream(s, tile, tp_index);
+}
 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
 Jpeg2000Band *band = rlevel->band + bandno;
 Jpeg2000Prec *prec = band->prec + precno;
@@ -1097,6 +1146,15 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext 
*s, Jpeg2000Tile *tile,
 av_freep(>lengthinc);
 }
 }
+// Save state of stream
+tile->tile_part[*tp_index].tpg = s->g;
+return 0;
+
+skip_data:
+if (tile->has_ppt)
+tile->packed_headers_stream = s->g;
+else
+tile->tile_part[*tp_index].tpg = s->g;
 return 0;
 }
 
@@ -1929,6 +1987,11 @@