From patchwork Tue Aug 4 12:58:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 21478 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 2512A44AA89 for ; Tue, 4 Aug 2020 19:13:00 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F3B8268BB0F; Tue, 4 Aug 2020 19:12:59 +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 6FFC268BAB7 for ; Tue, 4 Aug 2020 19:12:53 +0300 (EEST) Received: by mail-pl1-f195.google.com with SMTP id bh1so10147751plb.12 for ; Tue, 04 Aug 2020 09:12:53 -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=iyfyluMmrDQc6n2w9QYHulGHU8odagsEb/zGb3JY9IY=; b=mmYGjvNi7iR5YIi5Xsa4FIqYmID5R3EeOqWyE5hOTsJLk7e2KgOxHuuY95scexbiZX e3/hCQuW43IxGotzEP738wQ6GdMZ3qq/pcLqL/4oBaTYFRkw9LV6ceqciibe+TjzcDUE I9dsIrWc9hBos/8dnSWXezq9tUZXjT+Op9qkwh1wV/ywz54f1I30V3Ly94IW16ZRUqcY J4n5MqxL8SeLAvVeyV+msKOfy2W/zZqsMGb2SaCfYuKw2QaY35vhq+nSz/AaIZMfKiSF vcDO9yM7qQ0YosIKsOTzJIxlKbT825Jj2z7Qw1FLQ22VRLbjkb3reu6ha/tSKy8l/A9P AOhg== 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=iyfyluMmrDQc6n2w9QYHulGHU8odagsEb/zGb3JY9IY=; b=Zj2iG7vak7pVfFDDvM8jm4fWeTuoorxO/eVc0IpR5393FkZ04NgeWmwEd1ewjNOwE6 uuCDdB1wp4MFrmFrG8CzlGMqgOV6SUMZRgzdETAInB2EfGxOM8LWnapTpbb1BOCz62ZT k3alUBdBWeyNrtaFqh//S6XkMFCypFzh+suoJco0+dyPh7nHQOHouzPukxSRldew0rkv UnSH0E2BSvy2QLjJBYU7CVIKGZSHsxlp9hg2BoHFuJnwCtLiPInfJ3GseXulrLyJMbw+ Ikfp6aT1JQTf+l2Xtc48OL/S+BHgzmUUEe3fGxFLt5fQRr1sjAR/6d48OSVfkgEYrxhd JzZg== X-Gm-Message-State: AOAM531BCiZRH7h6h6F5ZAxQ1sZ9eOGjnRbH8bQ6qoJU1ECGv8UU6IJR mhsRIYtapIkAs1GjUqOEnAa/VU94oOcSlA== X-Google-Smtp-Source: ABdhPJxSvVLM4gb7kq+oiwSxFKxR7bzvS4SO+Iq5F7T0LS3meguN19f5lth6P3R+WQTJJ7kynpv88A== X-Received: by 2002:a62:3856:: with SMTP id f83mr16268115pfa.35.1596545900049; Tue, 04 Aug 2020 05:58:20 -0700 (PDT) Received: from localhost.localdomain ([122.172.27.41]) by smtp.gmail.com with ESMTPSA id b15sm2756743pje.52.2020.08.04.05.58.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2020 05:58:19 -0700 (PDT) From: gautamramk@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Aug 2020 18:28:02 +0530 Message-Id: <20200804125802.31434-1-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] libavcodec/j2kenc: Allow Encoder to use SOP and EPH 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 This patch allows the encoder to use SOP and EPH markers. This would be useful as these markers provide better error detection mechanisms. --- libavcodec/j2kenc.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c index 5ebc1f3a99..fad013521b 100644 --- a/libavcodec/j2kenc.c +++ b/libavcodec/j2kenc.c @@ -129,6 +129,8 @@ typedef struct { int format; int pred; + int sop; + int eph; } Jpeg2000EncoderContext; @@ -308,13 +310,18 @@ static int put_siz(Jpeg2000EncoderContext *s) static int put_cod(Jpeg2000EncoderContext *s) { Jpeg2000CodingStyle *codsty = &s->codsty; + uint8_t scod = 0; if (s->buf_end - s->buf < 14) return -1; bytestream_put_be16(&s->buf, JPEG2000_COD); bytestream_put_be16(&s->buf, 12); // Lcod - bytestream_put_byte(&s->buf, 0); // Scod + if (s->sop) + scod |= JPEG2000_CSTY_SOP; + if (s->eph) + scod |= JPEG2000_CSTY_EPH; + bytestream_put_byte(&s->buf, scod); // Scod // SGcod bytestream_put_byte(&s->buf, 0); // progression level bytestream_put_be16(&s->buf, 1); // num of layers @@ -719,14 +726,18 @@ static void putnumpasses(Jpeg2000EncoderContext *s, int n) static int encode_packet(Jpeg2000EncoderContext *s, Jpeg2000ResLevel *rlevel, int precno, - uint8_t *expn, int numgbits) + uint8_t *expn, int numgbits, int packetno) { int bandno, empty = 1; - // init bitstream *s->buf = 0; s->bit_index = 0; + if (s->sop) { + bytestream_put_be16(&s->buf, JPEG2000_SOP); + bytestream_put_be16(&s->buf, 4); + bytestream_put_be16(&s->buf, packetno); + } // header // is the packet empty? @@ -794,6 +805,10 @@ static int encode_packet(Jpeg2000EncoderContext *s, Jpeg2000ResLevel *rlevel, in } } j2k_flush(s); + if (s->eph) { + bytestream_put_be16(&s->buf, JPEG2000_EPH); + } + for (bandno = 0; bandno < rlevel->nbands; bandno++){ Jpeg2000Band *band = rlevel->band + bandno; Jpeg2000Prec *prec = band->prec + precno; @@ -821,7 +836,7 @@ static int encode_packets(Jpeg2000EncoderContext *s, Jpeg2000Tile *tile, int til int compno, reslevelno, ret; Jpeg2000CodingStyle *codsty = &s->codsty; Jpeg2000QuantStyle *qntsty = &s->qntsty; - + int packetno = 0; av_log(s->avctx, AV_LOG_DEBUG, "tier2\n"); // lay-rlevel-comp-pos progression for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++){ @@ -830,7 +845,7 @@ static int encode_packets(Jpeg2000EncoderContext *s, Jpeg2000Tile *tile, int til Jpeg2000ResLevel *reslevel = s->tile[tileno].comp[compno].reslevel + reslevelno; for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++){ if ((ret = encode_packet(s, reslevel, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0), - qntsty->nguardbits)) < 0) + qntsty->nguardbits, packetno++)) < 0) return ret; } } @@ -1244,7 +1259,8 @@ static const AVOption options[] = { { "pred", "DWT Type", OFFSET(pred), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE, "pred" }, { "dwt97int", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "pred" }, { "dwt53", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "pred" }, - + { "sop", "SOP marker", OFFSET(sop), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE, }, + { "eph", "EPH marker", OFFSET(eph), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE, }, { NULL } };