[FFmpeg-devel] [PATCH v8 1/3] libavcodec/jpeg2000dec.c: Split function and modify structs for PPM marker support

Gautam Ramakrishnan gautamramk at gmail.com
Tue Mar 31 07:31:25 EEST 2020


On Tue, Mar 31, 2020 at 6:10 AM Michael Niedermayer
<michael at niedermayer.cc> wrote:
>
> On Mon, Mar 30, 2020 at 09:51:53PM +0530, gautamramk at gmail.com wrote:
> > From: Gautam Ramakrishnan <gautamramk at gmail.com>
> >
> > ---
> >  libavcodec/jpeg2000dec.c | 48 ++++++++++++++++++++++++++++++++++------
> >  1 file changed, 41 insertions(+), 7 deletions(-)
> >
> > diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
> > index 7103cd6ceb..9d52969821 100644
> > --- a/libavcodec/jpeg2000dec.c
> > +++ b/libavcodec/jpeg2000dec.c
> > @@ -83,6 +83,10 @@ typedef struct Jpeg2000Tile {
> >      Jpeg2000QuantStyle  qntsty[4];
> >      Jpeg2000POC         poc;
> >      Jpeg2000TilePart    tile_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;
> > @@ -935,21 +939,32 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
> >      int bandno, cblkno, ret, nb_code_blocks;
> >      int cwsno;
> >
> > +// This part decodes the packet header
> > +
> >      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(&s->g) == 0 && s->bit_index == 8) {
> > -        if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
> > -            s->g = tile->tile_part[++(*tp_index)].tpg;
> > +    // Select appropriate stream to read from
> > +    if (tile->has_ppt) {
> > +        s->g = tile->packed_headers_stream;
> > +    } else {
> > +        s->g = tile->tile_part[*tp_index].tpg;
> > +        if (bytestream2_get_bytes_left(&s->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(&s->g) == JPEG2000_SOP_FIXED_BYTES)
> > +            bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
> >      }
> >
> > -    if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
> > -        bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
> > -
> >      if (!(ret = get_bits(s, 1))) {
> >          jpeg2000_flush(s);
> > +        // Save state of stream
> > +        if (tile->has_ppt)
> > +            tile->packed_headers_stream = s->g;
> > +        else
> > +            tile->tile_part[*tp_index].tpg = s->g;
> >          return 0;
> >      } else if (ret < 0)
> >          return ret;
> > @@ -1056,6 +1071,23 @@ 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(&s->g));
> >      }
> >
> > +    if (tile->has_ppt)
> > +        tile->packed_headers_stream = s->g;
> > +    else
> > +        tile->tile_part[*tp_index].tpg = s->g;
> > +
> > +// This part decodes the packet data.
> > +    // Select appropriate stream to read from
> > +    s->g = tile->tile_part[*tp_index].tpg;
> > +    if (tile->has_ppt) {
> > +        if (bytestream2_get_bytes_left(&s->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(&s->g) == JPEG2000_SOP_FIXED_BYTES)
> > +            bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
> > +    }
> >      for (bandno = 0; bandno < rlevel->nbands; bandno++) {
> >          Jpeg2000Band *band = rlevel->band + bandno;
> >          Jpeg2000Prec *prec = band->prec + precno;
> > @@ -1097,6 +1129,8 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
> >              av_freep(&cblk->lengthinc);
> >          }
> >      }
> > +    // Save state of stream
> > +    tile->tile_part[*tp_index].tpg = s->g;
> >      return 0;
> >  }
>
> has_ppt is never set in this also it is specific to the new functional code.
> it and all branches which depend on it being 1 should be in the 2nd patch.
>
> The function split should be in the first patch instead
>
Sure, now its clear. Shall do that

> Its probably easiest if you first merge the 2 patches and then remove all
> ppt feature specific code which was added. what remains should be the first
> patch. the diff from that to the final result would be the 2nd.
> At least i think that would bring it closer to what the idea is with this
> split. you / we need to take a look at how this looks after doing it.
> There may still be obvious things that can be cleaned up ...
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> No snowflake in an avalanche ever feels responsible. -- Voltaire
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



--
-------------
Gautam |


More information about the ffmpeg-devel mailing list