From patchwork Sat Jul 18 13:16:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 21168 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A9D61446AC1 for ; Sat, 18 Jul 2020 16:16:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7E0F868B74D; Sat, 18 Jul 2020 16:16:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AD97368AF66 for ; Sat, 18 Jul 2020 16:16:32 +0300 (EEST) Received: by mail-pl1-f195.google.com with SMTP id d1so6630533plr.8 for ; Sat, 18 Jul 2020 06:16:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=sR/Kkzf7rX02B3eF+4HfpSBa8Mtz6KUp8aH7EszJRy4=; b=BRPEvqk8M0v6xJRHs685oRGJLtWk1GKoIu0Kc5aUezuR+lDAJk62BnN0h3+2wjE54/ /y02jNImKybHaEgPmW1YPbkd+fdxPhWwXIXU539SL2jAmQmL1dw8Fl2ujY7c+lwMcqls FzikgMLzCQd3t4bZ5WjmkN/hCoz1Uv3+LO1IfNNzKoENgKNX/AgdBH+rlXHROwedPKQE X43TZ00jRHwELZsKEDGyEfNP2DxTvu68hmj00s3AL3Y5FUEu7D1GtCoC/XtdNKKA0lno J+NBlvFh8DMeO1MkJLi/qV0q8TxI6blw+i3A8AtbfjiZgHqlp4DlLJ+gB0i8INupM2b7 oZaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=sR/Kkzf7rX02B3eF+4HfpSBa8Mtz6KUp8aH7EszJRy4=; b=D86qIKkBsKEwfeVNU+8T9RyukRVo+ahOiyQJuY/ozBU+ztdI2IXPQR/01e0ih1iSna qhR5o4Bb9xHJ4XgW74lVpuuXMq6C43m4Lvx6z7htPsOLIswV/81O/riQ6p1KxQOVaJcr nN4A8uG9Tqn//SKUvHTtnZxKxuV+j1OLGggaAXwGUBx4EvPXo2rvTT8LZ77CMcVexhjt Elmh8tlvFBoQselQFud19UgnAW+5DEb8HsRL3CijCG6jdP90jxStiI7cPiKsh8KH5dnj o6/sd4qekRXM/9TFv7mnDor5ZpwPVGCDNgN4QOL9AF0jmBX99YpnFZAa/DiriKNYp6kq KJCA== X-Gm-Message-State: AOAM531NZ+xUi5tuAA4VAJueCmj8P649fKAURCx3AASmYXXg863r4bry iBfUWA/IRp9zS2wP10KbO7PogXsOKwo= X-Google-Smtp-Source: ABdhPJwMfQM3C+6AjfV8HkFw4vRxJv2WU50dJyIEiVIjwjcrKqwedfYS8Kep4EWhgwjTnetWbDiA6w== X-Received: by 2002:a17:90a:334c:: with SMTP id m70mr15293940pjb.88.1595078190568; Sat, 18 Jul 2020 06:16:30 -0700 (PDT) Received: from localhost.localdomain ([122.172.60.196]) by smtp.gmail.com with ESMTPSA id z10sm10913495pfr.90.2020.07.18.06.16.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2020 06:16:29 -0700 (PDT) From: gautamramk@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 18:46:20 +0530 Message-Id: <20200718131622.6234-1-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v2 1/3] libavcodec/jpeg2000dec: Fix codeblock decode check X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Gautam Ramakrishnan MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Gautam Ramakrishnan The codeblock decoder checks whether the mqc decoder has decoded the right number of bytes. However, this check does not account for the fact that the mqc encoder's flush routine adds 2 bytes of data which does not have to be read by the decoder. The check is modified to account for this. This patch solves issue #4827 --- libavcodec/jpeg2000dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 5ea6fd0b9a..5043125fe3 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1753,9 +1753,9 @@ static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty, pass_cnt ++; } - if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) { + if (cblk->data + cblk->length - 2 > t1->mqc.bp) { av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n", - cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp); + cblk->data + cblk->length - 2 - t1->mqc.bp); } return 1; From patchwork Sat Jul 18 13:16:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 21169 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C3831446AC1 for ; Sat, 18 Jul 2020 16:16:40 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A905E68B75D; Sat, 18 Jul 2020 16:16:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CBA9D68AF66 for ; Sat, 18 Jul 2020 16:16:34 +0300 (EEST) Received: by mail-pf1-f195.google.com with SMTP id q17so6756876pfu.8 for ; Sat, 18 Jul 2020 06:16:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WTXNghfheufiiXQoYSjjJLLd9NVB9xvMpYFIbpLSNoQ=; b=SmY0nC0V9O7ne3DhnzZza6betxOufDMtlYsJ5DonfRo/FjJo6BhGGJ4zyi3O8nBdaM EHSTT5kMpXYlZA79ON8zXaTtcNFMBN9K6zSOderz9pQYsDwXDVggRg6CO0W5APLsbisU WNR8uL3FhE/rwV96HJ/RvKS4ZhETO8NVIqug7dVRC7UdI4SDxx0csCvlLZXpsCFY4Clg MomZ6cMTr4b28Q9yRiRDAD0W79wCgw6GvTWar0cL++EQHooI002+P3AoHXhrNUqBWpLc G6mcLqLACOr9YH9l1+eik/XMiBT+spsHRGpUZvps0fHtk9/z8FhAGNpr9rLfXmLjk84U lT8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WTXNghfheufiiXQoYSjjJLLd9NVB9xvMpYFIbpLSNoQ=; b=CzR6gfkbDLtYjYFHOzE0wYZWt4aEqzoMdUVp54rRSY5/oEusQES3OJBQIXCuv6SYBE vnAZO6hLsup4UpqeQUHqgBr/eL8ZQvTFCbxI3oQoMJWbcytTtISxHWqwiJnE3rWGugeF SWDNqcZ3Ko8u3KuVimJEexF8v4/GE44MuZ/ADXdRm7VxwOefqlOUdrtUTWg2l5YzG6Te PwcPk+DaXnpntXhdJFq5W1VTQDaMX2p+CQee4OBwWbpOu5FdyzrKKbWQtQ+DHlWbi6zt DB/k/dH2blQ4qF5iL7s0Na66qlibxeCOq2CYRQUL5qObuNoOHfJIx65MOe0lCu1sCOK1 dH7g== X-Gm-Message-State: AOAM531AcjMX1BUnQDaEt5oktIP6iBrnQJfW0bOpATYO3gf9rt8LFnXa FqxER/2yQFHH1Hn8RWeA2xdVi98fAc4= X-Google-Smtp-Source: ABdhPJzxZlTmC7wNwxupQrkLzfpmbge2GH5QmXVJKAlhEFqK6yIRLjoC3qHuAsMEjoLzaq32ZkzZfQ== X-Received: by 2002:a62:c584:: with SMTP id j126mr11899822pfg.213.1595078192526; Sat, 18 Jul 2020 06:16:32 -0700 (PDT) Received: from localhost.localdomain ([122.172.60.196]) by smtp.gmail.com with ESMTPSA id z10sm10913495pfr.90.2020.07.18.06.16.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2020 06:16:31 -0700 (PDT) From: gautamramk@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 18:46:21 +0530 Message-Id: <20200718131622.6234-2-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200718131622.6234-1-gautamramk@gmail.com> References: <20200718131622.6234-1-gautamramk@gmail.com> Subject: [FFmpeg-devel] [PATCH v2 2/3] libavcodec/jpeg2000dec: Support for Parameterless Markers X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Gautam Ramakrishnan MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Gautam Ramakrishnan The JPEG2000 standard reserves marker values 0xFF30 to 0xFF3F to be used as parameterless markers. This patch adds support to decode codestream with such markers. This allows decoding of p0_02.j2k. --- libavcodec/jpeg2000dec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 5043125fe3..5e9e97eb6a 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -2092,7 +2092,8 @@ static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s) marker = bytestream2_get_be16u(&s->g); oldpos = bytestream2_tell(&s->g); - + if (marker >= 0xFF30 && marker <= 0xFF3F) + continue; if (marker == JPEG2000_SOD) { Jpeg2000Tile *tile; Jpeg2000TilePart *tp; From patchwork Sat Jul 18 13:16:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 21170 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id F1117446AC1 for ; Sat, 18 Jul 2020 16:16:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DCD6A68B76F; Sat, 18 Jul 2020 16:16:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f194.google.com (mail-pf1-f194.google.com [209.85.210.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A1BD968B75A for ; Sat, 18 Jul 2020 16:16:36 +0300 (EEST) Received: by mail-pf1-f194.google.com with SMTP id 207so6769200pfu.3 for ; Sat, 18 Jul 2020 06:16:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TXySIZNSazOeAyYgQsdanUWAYonDXf4MRG7TUnL/mF4=; b=GN5RRFPDUdpkzxyXg6BcR6J4qUp08ykaD1Nu/kPWyJ1VknPZ3nWMbMmuU5MofRq0JJ EI0cEf1zZBgjYmty4xHlEfM0aWcqJzyAGihootmpdhZ5pk2FYWgp8yM+K7R39DtdIeVO Y9//ufww7KOOPnSr/G7NCFF0ZkLM9qGapUhAyh20fw30gFjpZpZ3z1dTPzsJwdgnLJns Jkng0ZbVbP1Ndarme3CexCfhGO4DDmdbxdlEOMuJDFLYGL9xG/shCTKBaDxJxpIb515O 68A91pZHPaluBKTKepwzOx9fbpIkwLI8LVo99Zkxse2MqAiaxT+lqWtRw0TvpBUyce2j 63cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TXySIZNSazOeAyYgQsdanUWAYonDXf4MRG7TUnL/mF4=; b=lskoSk2J2ffzS2LR3ozGv6kM86HmNiB+0oVUZ7rL0feGjjYnt/8IsgFACKVUzb04dI ufLpGEnoUzOTvZNoJ3l+bI1GqnIPXRdG3xuaALB3hPAwI8cjmHFwI2mbYcRAdwMrddOk 5ULcXCgsrnKR4TGrKoo+t3mVCwiPloe3X+gLHkLlITe6JdKQEv5q5K+hZjnf+HNwE89L IE2DTY9KCH35OygznTg4eHzTFdV5urTkyRYWZ2ILH9Pmyy43KKaSTKGyieS07B91T0G4 dMMxy6Jb+tGBH8qOLJcAalpKCjVSuQA2t8d1Lk3A83yXzq+B6gyimhyb9s4XvjKAs5bA sikQ== X-Gm-Message-State: AOAM530bNOzyGinEO6Dz4Ht1cDbXLvC3J5eC4gp73qLBiwFCSaR2Qyjl eeiwWgpmpANaVU7o2lfqLg/dQz+vjQQ= X-Google-Smtp-Source: ABdhPJwRWioAJOxQtEJk/7EJWVFkrblxzg1cVlpdQTEf6KO2SBD2jT2m1FGKi652YBVgF58Ic2rY6Q== X-Received: by 2002:a05:6a00:78a:: with SMTP id g10mr12233515pfu.0.1595078194468; Sat, 18 Jul 2020 06:16:34 -0700 (PDT) Received: from localhost.localdomain ([122.172.60.196]) by smtp.gmail.com with ESMTPSA id z10sm10913495pfr.90.2020.07.18.06.16.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2020 06:16:33 -0700 (PDT) From: gautamramk@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 18:46:22 +0530 Message-Id: <20200718131622.6234-3-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200718131622.6234-1-gautamramk@gmail.com> References: <20200718131622.6234-1-gautamramk@gmail.com> Subject: [FFmpeg-devel] [PATCH v2 3/3] libavcodec/jpeg2000dec: Support for PPM marker X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Gautam Ramakrishnan MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Gautam Ramakrishnan This patch adds support for PPM marker for JPEG2000 decoder. It allows the samples p1_03.j2k and p1_05.j2k to be decoded. --- libavcodec/jpeg2000dec.c | 111 +++++++++++++++++++++++++++++++++++---- 1 file changed, 101 insertions(+), 10 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 5e9e97eb6a..e37f834afe 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -71,6 +71,7 @@ typedef struct Jpeg2000POC { typedef struct Jpeg2000TilePart { uint8_t tile_index; // Tile index who refers the tile-part const uint8_t *tp_end; + GetByteContext header_tpg; // bit stream of header if PPM header is used GetByteContext tpg; // bit stream in tile-part } Jpeg2000TilePart; @@ -102,6 +103,13 @@ typedef struct Jpeg2000DecoderContext { uint8_t cbps[4]; // bits per sample in particular components uint8_t sgnd[4]; // if a component is signed uint8_t properties[4]; + + uint8_t has_ppm; + uint8_t *packed_headers; // contains packed headers. Used only along with PPM marker + int packed_headers_size; + GetByteContext packed_headers_stream; + uint8_t in_tile_headers; + int cdx[4], cdy[4]; int precision; int ncomponents; @@ -928,6 +936,31 @@ static int get_plt(Jpeg2000DecoderContext *s, int n) return 0; } +static int get_ppm(Jpeg2000DecoderContext *s, int n) +{ + void *new; + + if (n < 3) { + av_log(s->avctx, AV_LOG_ERROR, "Invalid length for PPM data.\n"); + return AVERROR_INVALIDDATA; + } + s->has_ppm = 1; + bytestream2_get_byte(&s->g); //Zppm is skipped and not used + new = av_realloc(s->packed_headers, + s->packed_headers_size + n - 3); + if (new) { + s->packed_headers = new; + } else + return AVERROR(ENOMEM); + memset(&s->packed_headers_stream, 0, sizeof(s->packed_headers_stream)); + memcpy(s->packed_headers + s->packed_headers_size, + s->g.buffer, n - 3); + s->packed_headers_size += n - 3; + bytestream2_skip(&s->g, n - 3); + + return 0; +} + static int get_ppt(Jpeg2000DecoderContext *s, int n) { Jpeg2000Tile *tile; @@ -1039,8 +1072,19 @@ static int getlblockinc(Jpeg2000DecoderContext *s) return res; } -static inline void select_stream(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, +static inline void select_header(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index) +{ + s->g = tile->tile_part[*tp_index].header_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; + } + } +} + +static inline void select_stream(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, + int *tp_index, Jpeg2000CodingStyle *codsty) { s->g = tile->tile_part[*tp_index].tpg; if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) { @@ -1048,8 +1092,12 @@ static inline void select_stream(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, 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 (codsty->csty & JPEG2000_CSTY_SOP) { + if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES) + bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH); + else + av_log(s->avctx, AV_LOG_ERROR, "SOP marker not found. instead %X\n", bytestream2_peek_be32(&s->g)); + } } static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index, @@ -1064,10 +1112,12 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, return 0; rlevel->band[0].prec[precno].decoded_layers = layno + 1; // Select stream to read from - if (tile->has_ppt) + if (s->has_ppm) + select_header(s, tile, tp_index); + else if (tile->has_ppt) s->g = tile->packed_headers_stream; else - select_stream(s, tile, tp_index); + select_stream(s, tile, tp_index, codsty); if (!(ret = get_bits(s, 1))) { jpeg2000_flush(s); @@ -1178,9 +1228,12 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, } // Save state of stream - if (tile->has_ppt) { + if (s->has_ppm) { + tile->tile_part[*tp_index].header_tpg = s->g; + select_stream(s, tile, tp_index, codsty); + } else if (tile->has_ppt) { tile->packed_headers_stream = s->g; - select_stream(s, tile, tp_index); + select_stream(s, tile, tp_index, codsty); } for (bandno = 0; bandno < rlevel->nbands; bandno++) { Jpeg2000Band *band = rlevel->band + bandno; @@ -1228,10 +1281,20 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, return 0; skip_data: - if (tile->has_ppt) + if (codsty->csty & JPEG2000_CSTY_EPH) { + if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH) + bytestream2_skip(&s->g, 2); + else + av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g)); + } + if (s->has_ppm) { + tile->tile_part[*tp_index].header_tpg = s->g; + select_stream(s, tile, tp_index, codsty); + } else if (tile->has_ppt) { tile->packed_headers_stream = s->g; - else - tile->tile_part[*tp_index].tpg = s->g; + select_stream(s, tile, tp_index, codsty); + } + tile->tile_part[*tp_index].tpg = s->g; return 0; } @@ -2064,6 +2127,9 @@ static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s) s->tile[tileno].packed_headers_size = 0; } } + av_freep(&s->packed_headers); + s->packed_headers_size = 0; + memset(&s->packed_headers_stream, 0, sizeof(s->packed_headers_stream)); av_freep(&s->tile); memset(s->codsty, 0, sizeof(s->codsty)); memset(s->qntsty, 0, sizeof(s->qntsty)); @@ -2114,6 +2180,11 @@ static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s) return AVERROR_INVALIDDATA; } + if (s->has_ppm) { + uint32_t tp_header_size = bytestream2_get_be32u(&s->packed_headers_stream); + bytestream2_init(&tp->header_tpg, s->packed_headers_stream.buffer, tp_header_size); + bytestream2_skip(&s->packed_headers_stream, tp_header_size); + } if (tile->has_ppt && tile->tp_idx == 0) { bytestream2_init(&tile->packed_headers_stream, tile->packed_headers, tile->packed_headers_size); } @@ -2165,6 +2236,12 @@ static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s) ret = get_poc(s, len, poc); break; case JPEG2000_SOT: + if (!s->in_tile_headers) { + s->in_tile_headers = 1; + if (s->has_ppm) { + bytestream2_init(&s->packed_headers_stream, s->packed_headers, s->packed_headers_size); + } + } if (!(ret = get_sot(s, len))) { av_assert1(s->curtileno >= 0); codsty = s->tile[s->curtileno].codsty; @@ -2190,8 +2267,22 @@ static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s) // Packet length, tile-part header ret = get_plt(s, len); break; + case JPEG2000_PPM: + // Packed headers, main header + if (s->in_tile_headers) { + av_log(s->avctx, AV_LOG_ERROR, "PPM Marker can only be in Main header\n"); + return AVERROR_INVALIDDATA; + } + ret = get_ppm(s, len); + break; case JPEG2000_PPT: // Packed headers, tile-part header + if (s->has_ppm) { + av_log(s->avctx, AV_LOG_ERROR, + "Cannot have both PPT and PPM marker.\n"); + return AVERROR_INVALIDDATA; + } + ret = get_ppt(s, len); break; default: