From patchwork Wed Dec 22 23:03:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 32844 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp6789481iog; Wed, 22 Dec 2021 15:03:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJzE63qlilsHlO+TFE09IWLkWcz0sdW9FVZneByqrXy/DB0Z9BIUEpF81G9uLK2UrWsWDHjh X-Received: by 2002:a17:907:6089:: with SMTP id ht9mr4107376ejc.292.1640214203800; Wed, 22 Dec 2021 15:03:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1640214203; cv=none; d=google.com; s=arc-20160816; b=booTzr7Lx8bwuQ2Xi2fNE69fCo7V4we/W00ZCn4suA6TeoseXJd/u+sozYtXd9yl6/ uy76tOXlV/Pn2VGaoDm+akc5mXFlerOTapIIBYs3JK5ldmVbtRBSkFjh6l8bSw7bobni +VKpxONdrTP0nJOSNFb14NWI5Whco/Icqyh4BC5zjM1BfHtt9oLsZmowcYD4WLJ3S3rF LCQZzlcmbAnbekKJHysQXu73tGPbw7bUuvLDMR1CKlK1VTY89FIQkV8RATRLVtXafFPx ZVVS41xTVLJcq+wTFyj+KSXs8R9xQhlCmGLbqHry8PkCe/fx5MIcgxAB2oWQbzg1QgSo rePw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=KTKEc1friUWiQD6vyx7NitajCP1OmKVuzRrwbvlqlkI=; b=CJ9agQ7O0Z5CgefEFSGmijcg+CNQ9QaLlAjXx/hvkoOzzeBr7lk4EpO5wzJC2dJUj9 6lNiDjTj0ma+qRhADI36tvwvPSecISZs/pUEkjEjz7wCxzWAaC/UvGYjRzpAKjNFZp11 61nTtA2zmQHjIPbT8CG41n1zonTcVnoGy14eUlagJ6PUbTLuRKia8mPPRk4OamXy2ivN /tPgYoM+Mb/IgNhgOx7fw5rJYFKW5kGBw6IRCfM4o/GGSiTsvbSI5zXdjquq4+7pC7Bt C/miPleQ6px3FjYG0IB1haPVniNV5siWybX8x9aX/p/B0cr9aIsNWuET0aP/iabT4Jma pVjg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=JotH7zfc; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h8si1349115ejj.833.2021.12.22.15.03.23; Wed, 22 Dec 2021 15:03:23 -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 header.s=20210112 header.b=JotH7zfc; 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=QUARANTINE 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 C53F468B0E3; Thu, 23 Dec 2021 01:03:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2A09168B04B for ; Thu, 23 Dec 2021 01:03:12 +0200 (EET) Received: by mail-pl1-f176.google.com with SMTP id v19so2933450plo.7 for ; Wed, 22 Dec 2021 15:03:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HCCYl1Hijtny7nk4GKZs2ASXPzj9PfUE1zs7BB+bbn0=; b=JotH7zfcRcQRf1N2aeHnwQDfqwDdqCV7ZQHYClYccNASm40i2gXZVb4csGz4fF85BG Xl9XwwYGDrD8S18glVQUIR14QlyUxJLflfdzajS1oSb1J1JCOEQKXXfZf/rsCOYov1PK Gw62Ujy9Y4M5zTvZy9PrIcP9MRYHjcXdXcR1SC/aQyTo5Y+oFa+hAu4ltUOqCOlI9ffU V98V6gdXmVO2b7wn0E1R6SNBHIvbaxF3klr31At2rP312JBj85fMWVgJJ/w0IVSHd1mb o+7Mgx7Gjal5n9TmppZZ/iJCBcKoGrYHG9fTypaa8JIiuvdBhfXthXeliTV1RSkZcPmz AncA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HCCYl1Hijtny7nk4GKZs2ASXPzj9PfUE1zs7BB+bbn0=; b=0xZDx4p64zWbgZtPZUyidOI1mf61fPeFSe4UX4cD9D5/IMy+g4wPhmlATnkUttRESX H4sTsvKNIE+iwTLIeJKfk3F1ZRLYPchkmDJtd9L/NBil8FHVtkl2nR0rCAGUzooQs2Ok 1cye8XRu7dkLLDF5nbOPj4lnuTNSXNIHZaBRksxcHzJBdceBOQJFCOmYonEDKN7haQW8 lJj7L8DElDqdRO6UGUfE5LVE6iE5C14bXfn/gkHCuiSH3NJOXn/0uySpW6hwGSx/ObCN VoX7CITrfXf5e83M6Z63cVhnpV+3MuCKs4VtopPEpikq9jkxbeA04k4l510EZwQpsci2 QjlA== X-Gm-Message-State: AOAM531Pplhn1fauWA1bw58WWmSP1DAOJohbNs71g/Eu575PD5bapE7S HZwXFGHd8chGOnkC3Mv9pu+ajTVUkfA= X-Received: by 2002:a17:90b:4c11:: with SMTP id na17mr18059pjb.84.1640214190005; Wed, 22 Dec 2021 15:03:10 -0800 (PST) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id v63sm2962973pgv.71.2021.12.22.15.03.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 22 Dec 2021 15:03:09 -0800 (PST) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 23 Dec 2021 07:03:02 +0800 Message-Id: <1640214184-12529-1-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1639492513-12002-1-git-send-email-lance.lmwang@gmail.com> References: <1639492513-12002-1-git-send-email-lance.lmwang@gmail.com> Subject: [FFmpeg-devel] [PATCH v2 1/3] avformat: add bitpacked demuxer 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: Limin Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Wn1a/2reJr4n From: Limin Wang Allows user can playback bitpacked pixel format directly: ffplay -video_size 1280x720 -pixel_format yuv422p10 test.bitpacked ffplay -f bitpacked -video_size 1280x720 -pixel_format uyvy422 test.yuv Signed-off-by: Limin Wang --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/rawvideodec.c | 56 ++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index 2b5caf9..65fb789 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -138,6 +138,7 @@ OBJS-$(CONFIG_BINKA_DEMUXER) += binka.o OBJS-$(CONFIG_BINTEXT_DEMUXER) += bintext.o sauce.o OBJS-$(CONFIG_BIT_DEMUXER) += bit.o OBJS-$(CONFIG_BIT_MUXER) += bit.o +OBJS-$(CONFIG_BITPACKED_DEMUXER) += rawvideodec.o OBJS-$(CONFIG_BMV_DEMUXER) += bmv.o OBJS-$(CONFIG_BOA_DEMUXER) += boadec.o OBJS-$(CONFIG_BFSTM_DEMUXER) += brstm.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 1054ac9..a100639 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -96,6 +96,7 @@ extern const AVInputFormat ff_bink_demuxer; extern const AVInputFormat ff_binka_demuxer; extern const AVInputFormat ff_bit_demuxer; extern const AVOutputFormat ff_bit_muxer; +extern const AVInputFormat ff_bitpacked_demuxer; extern const AVInputFormat ff_bmv_demuxer; extern const AVInputFormat ff_bfstm_demuxer; extern const AVInputFormat ff_brstm_demuxer; diff --git a/libavformat/rawvideodec.c b/libavformat/rawvideodec.c index 5049a29..a2ce423 100644 --- a/libavformat/rawvideodec.c +++ b/libavformat/rawvideodec.c @@ -59,10 +59,39 @@ static int rawvideo_read_header(AVFormatContext *ctx) st->codecpar->width = s->width; st->codecpar->height = s->height; + + if (ctx->iformat->raw_codec_id == AV_CODEC_ID_BITPACKED) { + unsigned int pgroup; /* size of the pixel group in bytes */ + unsigned int xinc; + const AVPixFmtDescriptor *desc; + int tag; + + desc = av_pix_fmt_desc_get(pix_fmt); + st->codecpar->bits_per_coded_sample = av_get_bits_per_pixel(desc); + if (pix_fmt == AV_PIX_FMT_YUV422P10) { + tag = MKTAG('U', 'Y', 'V', 'Y'); + pgroup = 5; + xinc = 2; + } else if (pix_fmt == AV_PIX_FMT_UYVY422) { + tag = MKTAG('U', 'Y', 'V', 'Y'); + pgroup = 4; + xinc = 2; + pix_fmt = AV_PIX_FMT_UYVY422; + st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO; + } else { + av_log(ctx, AV_LOG_ERROR, "unsupported format: %s for bitpacked.\n", + s->pixel_format); + return AVERROR(EINVAL); + } + st->codecpar->codec_tag = tag; + packet_size = s->width * s->height * pgroup / xinc; + } else { + packet_size = av_image_get_buffer_size(pix_fmt, s->width, s->height, 1); + if (packet_size < 0) + return packet_size; + } + st->codecpar->format = pix_fmt; - packet_size = av_image_get_buffer_size(st->codecpar->format, s->width, s->height, 1); - if (packet_size < 0) - return packet_size; ctx->packet_size = packet_size; st->codecpar->bit_rate = av_rescale_q(ctx->packet_size, (AVRational){8,1}, st->time_base); @@ -111,3 +140,24 @@ const AVInputFormat ff_rawvideo_demuxer = { .raw_codec_id = AV_CODEC_ID_RAWVIDEO, .priv_class = &rawvideo_demuxer_class, }; + +static const AVClass bitpacked_demuxer_class = { + .class_name = "bitpacked demuxer", + .item_name = av_default_item_name, + .option = rawvideo_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +#if CONFIG_BITPACKED_DEMUXER +const AVInputFormat ff_bitpacked_demuxer = { + .name = "bitpacked", + .long_name = NULL_IF_CONFIG_SMALL("Bitpacked"), + .priv_data_size = sizeof(RawVideoDemuxerContext), + .read_header = rawvideo_read_header, + .read_packet = rawvideo_read_packet, + .flags = AVFMT_GENERIC_INDEX, + .extensions = "bitpacked", + .raw_codec_id = AV_CODEC_ID_BITPACKED, + .priv_class = &bitpacked_demuxer_class, +}; +#endif // CONFIG_BITPACKED_DEMUXER