From patchwork Tue Nov 8 00:21:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Butterworth X-Patchwork-Id: 1331 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp1420496vsb; Mon, 7 Nov 2016 16:37:57 -0800 (PST) X-Received: by 10.28.189.69 with SMTP id n66mr11304826wmf.35.1478565477845; Mon, 07 Nov 2016 16:37:57 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y124si13473983wmb.21.2016.11.07.16.37.57; Mon, 07 Nov 2016 16:37:57 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3B9D1689A73; Tue, 8 Nov 2016 02:37:52 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8DF88689A2F for ; Tue, 8 Nov 2016 02:37:45 +0200 (EET) Received: by mail-wm0-f68.google.com with SMTP id a20so8606607wme.2 for ; Mon, 07 Nov 2016 16:37:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+5I+6iVgORq17IG4hmOnKSejpvctcFBEH98/7XKm9j4=; b=gVzmZdcY8RczFK2ce0KODkCRVzLEa/VGkQEnXjJbR1NMh6iAIleFInawwOr9XDpSKY dAAmXLvSlmPd+KovhWx7xustjZHayiE7zZgxgx/UAjMiLw8uQL9PMxLAd3MdEBTiUPhS x5su62TfvrkgPqPT0G5PQtxM2vql3SGq9XUM8hBNCie1AS8WzJwQ8DJ4GicuZiq5pqg8 LQYDa99GX3v+2djs1XEIq0tDxsO/8K/RlOAd/skrrYFVlpG32HaY5rrMUB+pBCCUTUfw WjyC036hRzrvMd7c0GJ5qQvDLR9e1YJ8JMuy/vQXaAtTzR7M2DB+VmSJhSSqF4Cu9NEo Kupw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+5I+6iVgORq17IG4hmOnKSejpvctcFBEH98/7XKm9j4=; b=PkfH/VCQ3IcbBDrCDv1Uj6c0jPp+LeWSafD0e6btHiQzjk9FYKXXpqbSDVyz8NAgVu amikdmlgL+Ohf33AgPzJpH+WCcTiLHgv8boM2xhryB0I0j5lNF3yBT2KvhucGsVOJ4FW v+0eEDH9vK8uJQ1zLIGU8lu6cdGcDTJnS3SR+CX6OzqPCpMvFcgDdNv9RLSlSpL8X+j4 MPKTCOI+bDdjwUmj/84Bq3KJRV83a5/BhFOm/uTP+/ZU/l5VNJ68f/bjpsIZuTR9yb4W d+r5eeRBfpptk17YhNJL8lPyGdNYFbCx9l3VPD42Y7KbOlnjZ2CE+zaNJxitV3qbDh2D ZeGg== X-Gm-Message-State: ABUngveDKDCDRl22w3GNwLxTBxzB65yMD/IxTl9dx3OHcGUKOxCi3ao5vViuZJ41mgQdDQ== X-Received: by 10.28.69.91 with SMTP id s88mr12490480wma.18.1478564552747; Mon, 07 Nov 2016 16:22:32 -0800 (PST) Received: from motbook-pro.Home (bcdf199e.skybroadband.com. [188.223.25.158]) by smtp.gmail.com with ESMTPSA id ba10sm26775590wjb.32.2016.11.07.16.22.31 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 07 Nov 2016 16:22:31 -0800 (PST) From: Tom Butterworth To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Nov 2016 00:21:53 +0000 Message-Id: <20161108002153.66910-2-bangnoise@gmail.com> X-Mailer: git-send-email 2.9.3 (Apple Git-75) In-Reply-To: <20161108002153.66910-1-bangnoise@gmail.com> References: <20161108002153.66910-1-bangnoise@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/hap: add "compressor" option to Hap encoder to disable secondary compression 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: Tom Butterworth MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The secondary compression in Hap is optional, this change exposes that option to the user as some use-cases favour higher bitrate files to reduce workload decoding. Adds "none" or "snappy" as options for "compressor". Selecting "none" disregards "chunks" option: chunking is only of benefit decompressing Snappy. --- libavcodec/hap.h | 1 + libavcodec/hapenc.c | 57 +++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/libavcodec/hap.h b/libavcodec/hap.h index e4762ee..f39e621 100644 --- a/libavcodec/hap.h +++ b/libavcodec/hap.h @@ -65,6 +65,7 @@ typedef struct HapContext { enum HapTextureFormat opt_tex_fmt; /* Texture type (encoder only) */ int opt_chunk_count; /* User-requested chunk count (encoder only) */ + int opt_compressor; /* User-requested compressor (encoder only) */ int chunk_count; HapChunk *chunks; diff --git a/libavcodec/hapenc.c b/libavcodec/hapenc.c index 7056b62..d44ef92 100644 --- a/libavcodec/hapenc.c +++ b/libavcodec/hapenc.c @@ -199,13 +199,19 @@ static int hap_encode(AVCodecContext *avctx, AVPacket *pkt, if (ret < 0) return ret; - /* DXTC compression. */ - compress_texture(avctx, ctx->tex_buf, frame); - - /* Compress (using Snappy) the frame */ - final_data_size = hap_compress_frame(avctx, pkt->data + header_length); - if (final_data_size < 0) - return final_data_size; + if (ctx->opt_compressor == HAP_COMP_NONE) { + /* DXTC compression directly to the packet buffer. */ + compress_texture(avctx, pkt->data + header_length, frame); + ctx->chunks[0].compressor = HAP_COMP_NONE; + final_data_size = ctx->tex_size; + } else { + /* DXTC compression. */ + compress_texture(avctx, ctx->tex_buf, frame); + /* Compress (using Snappy) the frame */ + final_data_size = hap_compress_frame(avctx, pkt->data + header_length); + if (final_data_size < 0) + return final_data_size; + } /* Write header at the start. */ hap_write_frame_header(ctx, pkt->data, final_data_size + header_length); @@ -266,10 +272,30 @@ static av_cold int hap_init(AVCodecContext *avctx) ctx->tex_size = FFALIGN(avctx->width, TEXTURE_BLOCK_W) * FFALIGN(avctx->height, TEXTURE_BLOCK_H) * 4 / ratio; - /* Round the chunk count to divide evenly on DXT block edges */ - corrected_chunk_count = av_clip(ctx->opt_chunk_count, 1, HAP_MAX_CHUNKS); - while ((ctx->tex_size / (64 / ratio)) % corrected_chunk_count != 0) { - corrected_chunk_count--; + switch (ctx->opt_compressor) { + case HAP_COMP_NONE: + /* No benefit chunking uncompressed data */ + corrected_chunk_count = 1; + + ctx->max_snappy = ctx->tex_size; + ctx->tex_buf = NULL; + break; + case HAP_COMP_SNAPPY: + /* Round the chunk count to divide evenly on DXT block edges */ + corrected_chunk_count = av_clip(ctx->opt_chunk_count, 1, HAP_MAX_CHUNKS); + while ((ctx->tex_size / (64 / ratio)) % corrected_chunk_count != 0) { + corrected_chunk_count--; + } + + ctx->max_snappy = snappy_max_compressed_length(ctx->tex_size / corrected_chunk_count); + ctx->tex_buf = av_malloc(ctx->tex_size); + if (!ctx->tex_buf) { + return AVERROR(ENOMEM); + } + break; + default: + av_log(avctx, AV_LOG_ERROR, "Invalid compresor %02X\n", ctx->opt_compressor); + return AVERROR_INVALIDDATA; } if (corrected_chunk_count != ctx->opt_chunk_count) { av_log(avctx, AV_LOG_INFO, "%d chunks requested but %d used.\n", @@ -279,12 +305,6 @@ static av_cold int hap_init(AVCodecContext *avctx) if (ret != 0) return ret; - ctx->max_snappy = snappy_max_compressed_length(ctx->tex_size / corrected_chunk_count); - - ctx->tex_buf = av_malloc(ctx->tex_size); - if (!ctx->tex_buf) - return AVERROR(ENOMEM); - return 0; } @@ -305,6 +325,9 @@ static const AVOption options[] = { { "hap_alpha", "Hap Alpha (DXT5 textures)", 0, AV_OPT_TYPE_CONST, { .i64 = HAP_FMT_RGBADXT5 }, 0, 0, FLAGS, "format" }, { "hap_q", "Hap Q (DXT5-YCoCg textures)", 0, AV_OPT_TYPE_CONST, { .i64 = HAP_FMT_YCOCGDXT5 }, 0, 0, FLAGS, "format" }, { "chunks", "chunk count", OFFSET(opt_chunk_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 1, HAP_MAX_CHUNKS, FLAGS, }, + { "compressor", "second-stage compressor", OFFSET(opt_compressor), AV_OPT_TYPE_INT, { .i64 = HAP_COMP_SNAPPY }, HAP_COMP_NONE, HAP_COMP_SNAPPY, FLAGS, "compressor" }, + { "none", "None", 0, AV_OPT_TYPE_CONST, { .i64 = HAP_COMP_NONE }, 0, 0, FLAGS, "compressor" }, + { "snappy", "Snappy", 0, AV_OPT_TYPE_CONST, { .i64 = HAP_COMP_SNAPPY }, 0, 0, FLAGS, "compressor" }, { NULL }, };