From patchwork Mon May 6 05:32:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcus B Spencer X-Patchwork-Id: 48572 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:e68f:b0:1af:836d:81b3 with SMTP id mz15csp1180575pzb; Sun, 5 May 2024 22:32:52 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXQtAtBEiTalpj9hF/Qf2T8gHHrjHTAqYTSLa44CH0jTeseCda7GJ2xspZYK3gcgI/4t1YlSZEo+MZgYa30RUczimODBRXylPvF9g== X-Google-Smtp-Source: AGHT+IEraCsOS6YrQPf6T28HPKct1DQfQB/HOhusnS0FmPxSEmz4nzO25y6WFlmrFuQH8/aq8p4t X-Received: by 2002:a50:d61c:0:b0:572:9dbf:1de5 with SMTP id x28-20020a50d61c000000b005729dbf1de5mr5083776edi.40.1714973571891; Sun, 05 May 2024 22:32:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1714973571; cv=none; d=google.com; s=arc-20160816; b=JKr/3PwV4H+QqwDb3CkN9ghjoNUDsy1eZY4m6L9ANXeh3ILp2QAoebpKXec40vCkXe h4DuIyp4/QDlkWyfgDNVXa6WEOyNcVxVUJvf+8b19x6CjTwyGIVLwieBX7cqjbEQRvGL g/PVr0/8Ddfi1PhrepJsrGw3HxguDMoebe5vx4FPOouJ2o4DoVyvtUwQ1oWUR7x398DE UGFBh4m8T6fkWipBvoqi1Z30QQGjFwOyP+2/3stPW2Ym8AKy8FjNqR9Tc5tmbCZ5zACS bnqhQY2z2NB0TrCG4vvRFEOeposSIh76g3weLzsGkyAdIAeGQWaB07xFk+MfcwufnZnZ xucw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=QEGeF6OBW8riGXxXx3hB0NnqYxdPp9IxHo6bXovuOA0=; fh=JuegC/vje050XLj6U2KtH3S0d9hYf9AYxo0tX+p7f28=; b=EMlg+BcMaMrniE5k68F6XYT1BILeWFsTQI8LxWRNt+1bW8Q/nPNP4vT9jJ1qiBo8tR rr1p0D4ACs5HpC16ayvqiY1WpQViOfTETtCwikUcO+Pfir7ELORIFaa47hn7QiFajuvx W4s//ZkPJyL9YrjVQ6ELg7G0v+PFCicLrV7YA4p4jWcQYBcPyuz6uwakTBuGs16YMDLr k07ugLzYpjbiOikBrdGIald2l8bu3A20RgydxQ8aAh2D+ioXe7VnizUSebQ3Qo8jhqdk 6ejJiCJkVAD6LmITjeYchXTFrgQjSa1Y2KHlBLH/cLCZHdylXspmNLIH8393iI4jK9GP roMw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@marcusspencer.xyz header.s=protonmail header.b="A/NNiVyM"; 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 sp=NONE dis=NONE) header.from=marcusspencer.xyz Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a7-20020aa7d747000000b00572a2d07ab6si4335032eds.692.2024.05.05.22.32.51; Sun, 05 May 2024 22:32:51 -0700 (PDT) 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=@marcusspencer.xyz header.s=protonmail header.b="A/NNiVyM"; 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 sp=NONE dis=NONE) header.from=marcusspencer.xyz Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 65FAD68D5A4; Mon, 6 May 2024 08:32:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-40111.protonmail.ch (mail-40111.protonmail.ch [185.70.40.111]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B44D468D561 for ; Mon, 6 May 2024 08:32:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marcusspencer.xyz; s=protonmail; t=1714973559; x=1715232759; bh=TAEvkU/Ud+yHfrKkM+pSoWLVASU95ueM8qdvKGxxRgg=; h=From:To:Cc:Subject:Date:Message-ID:From:To:Cc:Date:Subject: Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=A/NNiVyMt9Z9z3bjk3/nB6glEdg2KX3+mWBqNFRCzlCWzigd4tnwFxuwKQaMzlwje FwJgR/pQSEryy/b0E7HR/rHRdpJlwFrG1fCGxj91/sSPjVPxINLPCjPf01FL3CemN2 lYyOuY4204AAZKcQ6qAnQ2zLe+Lj63qsddZg5BvY76utPIvkD4L5+YtcP5Cg3Nc4+1 06QQLuzFE/tnWA4uwdDeQU1uZ2QOnmonz2bMSclWYRhRABiVttOJJ+qiZaPvOpGtdO KNCB/Jve1S5DPPStPql8mcjPrOrKAVHJR2vmz6E+fmQ3InyQm/yT6YmF5T6w5xmnof ya4mN8kk8m0RA== X-Pm-Submission-Id: 4VXqmj4JGtz3v8g From: Marcus B Spencer To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 May 2024 00:32:18 -0500 Message-ID: <20240506053219.216068-1-marcus@marcusspencer.xyz> X-Mailer: git-send-email 2.45.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/bsf: add datamosh bitstream filter X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Marcus B Spencer Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wN57+37ba4Is Has an option called "target". For a positive target, drop the nth keyframe. For a nonpositive target, allow the first n keyframe(s) and drop the remainder. Its primary purpose is for datamoshing, but it can also be used for dropping parts of audio. Signed-off-by: Marcus B Spencer --- libavcodec/bitstream_filters.c | 1 + libavcodec/bsf/Makefile | 1 + libavcodec/bsf/datamosh.c | 88 ++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 libavcodec/bsf/datamosh.c diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c index 12860c332b..cde6090c77 100644 --- a/libavcodec/bitstream_filters.c +++ b/libavcodec/bitstream_filters.c @@ -29,6 +29,7 @@ extern const FFBitStreamFilter ff_av1_frame_merge_bsf; extern const FFBitStreamFilter ff_av1_frame_split_bsf; extern const FFBitStreamFilter ff_av1_metadata_bsf; extern const FFBitStreamFilter ff_chomp_bsf; +extern const FFBitStreamFilter ff_datamosh_bsf; extern const FFBitStreamFilter ff_dump_extradata_bsf; extern const FFBitStreamFilter ff_dca_core_bsf; extern const FFBitStreamFilter ff_dts2pts_bsf; diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile index fb70ad0c21..ad3b870d12 100644 --- a/libavcodec/bsf/Makefile +++ b/libavcodec/bsf/Makefile @@ -6,6 +6,7 @@ OBJS-$(CONFIG_AV1_FRAME_MERGE_BSF) += bsf/av1_frame_merge.o OBJS-$(CONFIG_AV1_FRAME_SPLIT_BSF) += bsf/av1_frame_split.o OBJS-$(CONFIG_AV1_METADATA_BSF) += bsf/av1_metadata.o OBJS-$(CONFIG_CHOMP_BSF) += bsf/chomp.o +OBJS-$(CONFIG_DATAMOSH_BSF) += bsf/datamosh.o OBJS-$(CONFIG_DCA_CORE_BSF) += bsf/dca_core.o OBJS-$(CONFIG_DTS2PTS_BSF) += bsf/dts2pts.o OBJS-$(CONFIG_DUMP_EXTRADATA_BSF) += bsf/dump_extradata.o diff --git a/libavcodec/bsf/datamosh.c b/libavcodec/bsf/datamosh.c new file mode 100644 index 0000000000..8314a4efc8 --- /dev/null +++ b/libavcodec/bsf/datamosh.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2024 Marcus B Spencer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "bsf.h" +#include "bsf_internal.h" + +#include "libavutil/opt.h" + +typedef struct { + const AVClass *class; + + int target, i; +} DatamoshContext; + +static int datamosh_init(AVBSFContext *ctx) +{ + DatamoshContext *s = ctx->priv_data; + + s->i = 0; + + return 0; +} + +static int datamosh(AVBSFContext *ctx, AVPacket *pkt) +{ + DatamoshContext *s = ctx->priv_data; + bool key; + int ret; + + ret = ff_bsf_get_packet_ref(ctx, pkt); + if (ret < 0) + return ret; + + key = pkt->flags & AV_PKT_FLAG_KEY; + if (key) + ++s->i; + + if (s->target < 1) { + if (s->i <= -s->target) + return 0; + else if (key) { + av_packet_unref(pkt); + return AVERROR(EAGAIN); + } + } + + if (key && s->i == s->target) { + av_packet_unref(pkt); + return AVERROR(EAGAIN); + } + + return 0; +} + + +#define OFFSET(x) offsetof(DatamoshContext, x) +#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_BSF_PARAM) + +static const AVOption options[] = { + { "target", NULL, OFFSET(target), AV_OPT_TYPE_INT, { .i64 = 0 }, -INT_MAX, INT_MAX, FLAGS }, + { NULL }, +}; + +static const AVClass datamosh_class = { + .class_name = "datamosh", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; From patchwork Mon May 6 05:32:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcus B Spencer X-Patchwork-Id: 48573 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:e68f:b0:1af:836d:81b3 with SMTP id mz15csp1180622pzb; Sun, 5 May 2024 22:33:03 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUrOmrCJTvNQ5Qm/6QKyJwJRrv4+A6rZQPby96qy9x9Q4SBQKs/HwZIJTB7VZBl9b71Gfu0BtcqZDUgTPdH6cChhXUaT19GpbtLWQ== X-Google-Smtp-Source: AGHT+IFs7Yt0mnTaHytbUSQpfE1lTNEvpznF00PK/pbxV4oJ53KMsKsx76q9J3VJzKKBwPX8BeFI X-Received: by 2002:ac2:46f9:0:b0:51b:6366:3459 with SMTP id q25-20020ac246f9000000b0051b63663459mr7407774lfo.67.1714973583177; Sun, 05 May 2024 22:33:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1714973583; cv=none; d=google.com; s=arc-20160816; b=P1wvHPpdFoTtmFQ4RsiuqBAliwc2bvZFrF5YCbW0xJkwLXRWsFu9T0qCFw1OZeGzPs PoBe3M1QOULd4amEgn+uRdGN8sbIEHFmHVqw58ryresJ5GG1hn72nRcEjMtIm/LJp+9B Tvlzco36jtJ814IuJ1ntMh/GcZXuSFqUgUp/Fl8HfpI5LUr5D1TEUrWsJqL/k6bOk8cD dVWX7TNYHhVYlmBy+ct8z8HAytdU8TVvow2l0PoEOA2JkWUl1i+brE9wDMY7pfM01h1u OS/e4DXNSNaplqi8bn7MGNDx7SLvZr+r2irkKfcDs5JyObyPQIiZJ04Zj6k1YmjhwI1U E+kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=obyrW3yvRvbceLIE/0vLLqAcwpYE8z79R9IWWLZti+I=; fh=JuegC/vje050XLj6U2KtH3S0d9hYf9AYxo0tX+p7f28=; b=iBaEcCzktXsq8K6dC2wi+ZiTnpaQf+cdzO5mVjwc/kQX32CqM7Ev8TzzgZxG5SU1Zp j/QIr07zIS3CDxELkfYo9cP5NZBs0GlSd6N93I6nXrPr96zSp3Q0w7i4EDEjUsBbSZ5x vFcPRvmwl2vUJfBlEUjeyG9fC4sbhaQeI/HZCuUdf5WpbsnutHSyeFfLf1vq5mfG3BLb xXeWVeHh4ymUjPbU+9BddqpYvNA+yY3+Bn4YwqdL3ijlqU3XDmtxfADXlN7LYlA5EHTH MEUkEUXQXFH7YO5BwVd/LebsIRNoNz9hUplxewm56wHtXLY2w+mqtrecYEkUKodxyZXV dfSg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@marcusspencer.xyz header.s=protonmail header.b=Bg40yxUu; 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 sp=NONE dis=NONE) header.from=marcusspencer.xyz Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r8-20020a50c008000000b00572b7f4995bsi4729493edb.276.2024.05.05.22.33.02; Sun, 05 May 2024 22:33:03 -0700 (PDT) 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=@marcusspencer.xyz header.s=protonmail header.b=Bg40yxUu; 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 sp=NONE dis=NONE) header.from=marcusspencer.xyz Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BBB3968D5EC; Mon, 6 May 2024 08:32:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-4330.protonmail.ch (mail-4330.protonmail.ch [185.70.43.30]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 71B4968D5CD for ; Mon, 6 May 2024 08:32:42 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marcusspencer.xyz; s=protonmail; t=1714973561; x=1715232761; bh=v+JnOrFjhbuGatbIuJA5OfXDlda6E9W6KcsnLXUcQok=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:From:To: Cc:Date:Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=Bg40yxUu71vzBJsnQ0U5eCfbxH3sd6Ctk4IhmbAgQdTCIBwo7EvqitySa4faJNRrL 5sQVikBwnOg8bXFW9pJ42EExVoMcalwkmdCj9NMjNvmPVSvK4lhXAJ5MvnwwE7Zpw7 dfU2tTWA987snkAPlHJn/DoX5czsNX7dbH1qyF2AdPwhdgsh92vMav6WzNuXNC+fGH ikCzf03tAOKNftW6nHpcMe8ZMyaElCqsQEDdvUUtGcixUCHhidbfnpHy+DJNiCdLYS 6pT2mVyID/Vyx6FQ01oaWGnrgpYM8NJlonvwC5l1O9zECAB2WDXawEhQ2M9FbDHyxZ bXFX/Cb9Cqk6Q== X-Pm-Submission-Id: 4VXqml3sCSz3v8k From: Marcus B Spencer To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 May 2024 00:32:19 -0500 Message-ID: <20240506053219.216068-2-marcus@marcusspencer.xyz> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20240506053219.216068-1-marcus@marcusspencer.xyz> References: <20240506053219.216068-1-marcus@marcusspencer.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] Changelog: add datamosh bitstream filter entry X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Marcus B Spencer Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: mGKJWKcCW8ey Signed-off-by: Marcus B Spencer --- Changelog | 2 +- libavcodec/bsf/datamosh.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index e827208439..decfc4e4bb 100644 --- a/Changelog +++ b/Changelog @@ -9,7 +9,7 @@ version : - pad_vaapi, drawbox_vaapi filters - vf_scale supports secondary ref input and framesync options - vf_scale2ref deprecated - +- datamosh bitstream filter version 7.0: - DXV DXT1 encoder diff --git a/libavcodec/bsf/datamosh.c b/libavcodec/bsf/datamosh.c index 8314a4efc8..dad65e957d 100644 --- a/libavcodec/bsf/datamosh.c +++ b/libavcodec/bsf/datamosh.c @@ -86,3 +86,11 @@ static const AVClass datamosh_class = { .option = options, .version = LIBAVUTIL_VERSION_INT, }; + +const FFBitStreamFilter ff_datamosh_bsf = { + .p.name = "datamosh", + .p.priv_class = &datamosh_class, + .priv_data_size = sizeof(DatamoshContext), + .init = datamosh_init, + .filter = datamosh, +};