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

2020-04-04 Thread Carl Eugen Hoyos
Am Sa., 4. Apr. 2020 um 22:20 Uhr schrieb Michael Niedermayer
:
>
> On Sat, Apr 04, 2020 at 01:14:51PM +0530, gautamr...@gmail.com wrote:
> > From: Gautam Ramakrishnan 
> >
> > This patch adds functional changes to support the
> > PPT marker.
>
> Does this fix any files / testcases ?
> If yes, they should be mentioned in the commit message

The patch is supposed to fix ticket #4610.

Carl Eugen
___
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 v11 1/3] libavcodec/jpeg2000dec.c: Add support for PPT marker

2020-04-04 Thread Michael Niedermayer
On Sat, Apr 04, 2020 at 01:14:51PM +0530, gautamr...@gmail.com wrote:
> From: Gautam Ramakrishnan 
> 
> This patch adds functional changes to support the
> PPT marker.

Does this fix any files / testcases ?
If yes, they should be mentioned in the commit message

thx

[...]
-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If you fake or manipulate statistics in a paper in physics you will never
get a job again.
If you fake or manipulate statistics in a paper in medicin you will get
a job for life at the pharma industry.


signature.asc
Description: PGP signature
___
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 v11 1/3] 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.
---
 libavcodec/jpeg2000dec.c | 88 +++-
 1 file changed, 77 insertions(+), 11 deletions(-)

diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index 7103cd6ceb..01509d62c1 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 @@ static int