From patchwork Wed Nov 24 15:27:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 31625 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp10608389iob; Wed, 24 Nov 2021 07:29:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJypaGAGSPA4aPq8+iKNlZAO2AZH9jiW+fRdpjx6zdeELKXZynuNk9p72OpJoc61+gRg4wYm X-Received: by 2002:a05:6402:4248:: with SMTP id g8mr26526707edb.182.1637767779017; Wed, 24 Nov 2021 07:29:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1637767779; cv=none; d=google.com; s=arc-20160816; b=zD2tKkN9XmOoMlAoc+kRKsb0pFrg0X21dZipR6UqtoSj1JFUFCM9aRWh/XApP8BArZ MlWaSiBtq9WjD9OJ6lr3hSurzdOaJYoKUFxTxE0B7Ky8c+juV7GwR8Xnpf7C840AFtyb 492m2ts9iXe64qdoh2eNuTqZUyGx4xchECgEaDHn1vRm9XfznGdyFKdCG0wh2FaKGF54 7GbFJP7Fde18PBBByTu9KOegI80+8ceGlWxerJ147C/SNZn4sEa39BZDKxdQTvY9T+On tH98bE/BDzLAkdnRQ4oT49RSrIFQ7zeC/iphGhwySwP9OEd7SUi1tcUDBeyIYepTr44Y 4bcg== 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=K9mmHZomnRLojmVWRRgV0U6kMBZpyOh0E59UTwF+Qv0=; b=LW9kSka8zhQQc3E04pJqRewLVvQi8S0KRTlk5lNgEnRGMznr0865akZxonxKe/3xEL 6KH9QbHBOB9IpJnakzYlUdRczYsjlqMnLEexU4tsPVS7doEyoqFuUeaP+gbOG9dMYmGa MQCjgTFYU6Cj9VUWlDVidJfUxrDQbt6GkqeCp7bKvA/MqJ22JCjbAlIjmDXfgSAT1nHN VGErA5WJq8TzoqBEXqwn4w+A1tcVz1GRLYR4irLO5dIlPamO1WkWGfKqCFGbFMI+CNsf 0tsHgS5J23kY6yvJCZdNYj2GS4pXd8AzFXOdgCH1ofSiRMdb2HxrrEb5Sb4BIT//PDtd m13g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=nP2cxJ+s; 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 hc16si244683ejc.214.2021.11.24.07.29.38; Wed, 24 Nov 2021 07:29:38 -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=nP2cxJ+s; 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 2E22568ABD1; Wed, 24 Nov 2021 17:29:04 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1860768A5AF for ; Wed, 24 Nov 2021 17:28:55 +0200 (EET) Received: by mail-pl1-f172.google.com with SMTP id o14so2147640plg.5 for ; Wed, 24 Nov 2021 07:28:55 -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=7Tg9RKVX1FA5m9ZWGl4cUpkI37tkD8bfD+dhiKP4taU=; b=nP2cxJ+sTiqlEnapk0oNl2pD9iaswjeYDiJA+RbhgDzY6PpiSED3SqWQmweWVfU3ap vTDCHP7pv9uPSfTroh2FYpo4s51GQ/RLMNAUVBYQSAnztvW2Yyh6ajBXD9pKMwYDYGYm 4L5/udScPnrNc0E8pzJRTMsG3Eq6Znm8zbvHD8/kKB3T3/QtAEA1SbqK5Cb6NJPoWz+E jnvfbWHMRVNtKL+AcASKjhb3a9B2a3AYmjAmpUiPq1QfDKnA8wapMEQLnZZp+3SQLWnj hUfeGXz9tV69cm0D2No2dBZ3SoC0o1EZ4J4Vecp/fRpbX5kGxI/fuHMp7n5M/3l3dBYL SjXw== 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=7Tg9RKVX1FA5m9ZWGl4cUpkI37tkD8bfD+dhiKP4taU=; b=YUW4iFnw4amPYoeXCfqOR3dE/qu/0ixyxcwOsf/zTYT+2deOAPS/NMLGTMoxM0ZroV hVycsQ0hxpzIpCmgk2DGAAJilJRXiDOhFMFdPiIWG8UlIFjA2ZzBk7VitBGmSdJ7G8zt zSMx0aU/H2CmvwpYReyJ8Lg3s01hk9j4i/T8oIw4u5flXZs0C/VjOI/HZPnTLDSKoq3F QUtd7jCjBKLFhdOiyG7H/nJbJli+ifTQ8svTyQRWNSZRjlOypKz+cwdRkUZACAda4p/y sW8J/zVwBiUDSCENeCQzAqUqgX4XuWImttEpyz5dGHs9KWxWggtguFp88ec6QyeBHV13 BAKA== X-Gm-Message-State: AOAM5332iaLS21E9di+dwW8X2bAsT0/KOQ9xXKmSmNeJIoGEzRHpzdkm oPZ7wnZaenqpcvT4bwTFY1HVIsDDP7M= X-Received: by 2002:a17:90b:1a87:: with SMTP id ng7mr16582401pjb.86.1637767732898; Wed, 24 Nov 2021 07:28:52 -0800 (PST) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id b6sm83842pfm.170.2021.11.24.07.28.51 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Nov 2021 07:28:52 -0800 (PST) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Nov 2021 23:27:42 +0800 Message-Id: <1637767665-6777-4-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1637767665-6777-1-git-send-email-lance.lmwang@gmail.com> References: <1636712536-13114-1-git-send-email-lance.lmwang@gmail.com> <1637767665-6777-1-git-send-email-lance.lmwang@gmail.com> Subject: [FFmpeg-devel] [PATCH v3 4/7] avcodec: rename bitpacked.c to bitpacked_dec.c 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: 4MQa93YrSDjq From: Limin Wang Signed-off-by: Limin Wang --- libavcodec/Makefile | 2 +- libavcodec/bitpacked.c | 158 --------------------------------------------- libavcodec/bitpacked_dec.c | 158 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 159 deletions(-) delete mode 100644 libavcodec/bitpacked.c create mode 100644 libavcodec/bitpacked_dec.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 14fbd2e..fbb2b79 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -243,7 +243,7 @@ OBJS-$(CONFIG_BINK_DECODER) += bink.o binkdsp.o OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER) += binkaudio.o OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o OBJS-$(CONFIG_BINTEXT_DECODER) += bintext.o cga_data.o -OBJS-$(CONFIG_BITPACKED_DECODER) += bitpacked.o +OBJS-$(CONFIG_BITPACKED_DECODER) += bitpacked_dec.o OBJS-$(CONFIG_BMP_DECODER) += bmp.o msrledec.o OBJS-$(CONFIG_BMP_ENCODER) += bmpenc.o OBJS-$(CONFIG_BMV_AUDIO_DECODER) += bmvaudio.o diff --git a/libavcodec/bitpacked.c b/libavcodec/bitpacked.c deleted file mode 100644 index 0440df9..0000000 --- a/libavcodec/bitpacked.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Unpack bit-packed streams to formats supported by FFmpeg - * Copyright (c) 2017 Savoir-faire Linux, Inc - * - * 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 - */ - -/* Development sponsored by CBC/Radio-Canada */ - -/** - * @file - * Bitpacked - */ - -#include "avcodec.h" -#include "internal.h" -#include "get_bits.h" -#include "libavutil/imgutils.h" - -struct BitpackedContext { - int (*decode)(AVCodecContext *avctx, AVFrame *frame, - const AVPacket *pkt); -}; - -/* For this format, it's a simple passthrough */ -static int bitpacked_decode_uyvy422(AVCodecContext *avctx, AVFrame *frame, - const AVPacket *avpkt) -{ - int ret; - - /* there is no need to copy as the data already match - * a known pixel format */ - frame->buf[0] = av_buffer_ref(avpkt->buf); - if (!frame->buf[0]) { - return AVERROR(ENOMEM); - } - - ret = av_image_fill_arrays(frame->data, frame->linesize, avpkt->data, - avctx->pix_fmt, avctx->width, avctx->height, 1); - if (ret < 0) { - av_buffer_unref(&frame->buf[0]); - return ret; - } - - return 0; -} - -static int bitpacked_decode_yuv422p10(AVCodecContext *avctx, AVFrame *frame, - const AVPacket *avpkt) -{ - uint64_t frame_size = (uint64_t)avctx->width * (uint64_t)avctx->height * 20; - uint64_t packet_size = (uint64_t)avpkt->size * 8; - GetBitContext bc; - uint16_t *y, *u, *v; - int ret, i, j; - - ret = ff_get_buffer(avctx, frame, 0); - if (ret < 0) - return ret; - - if (frame_size > packet_size) - return AVERROR_INVALIDDATA; - - if (avctx->width % 2) - return AVERROR_PATCHWELCOME; - - ret = init_get_bits(&bc, avpkt->data, avctx->width * avctx->height * 20); - if (ret) - return ret; - - for (i = 0; i < avctx->height; i++) { - y = (uint16_t*)(frame->data[0] + i * frame->linesize[0]); - u = (uint16_t*)(frame->data[1] + i * frame->linesize[1]); - v = (uint16_t*)(frame->data[2] + i * frame->linesize[2]); - - for (j = 0; j < avctx->width; j += 2) { - *u++ = get_bits(&bc, 10); - *y++ = get_bits(&bc, 10); - *v++ = get_bits(&bc, 10); - *y++ = get_bits(&bc, 10); - } - } - - return 0; -} - -static av_cold int bitpacked_init_decoder(AVCodecContext *avctx) -{ - struct BitpackedContext *bc = avctx->priv_data; - - if (!avctx->codec_tag || !avctx->width || !avctx->height) - return AVERROR_INVALIDDATA; - - if (avctx->codec_tag == MKTAG('U', 'Y', 'V', 'Y')) { - if (avctx->bits_per_coded_sample == 16 && - avctx->pix_fmt == AV_PIX_FMT_UYVY422) - bc->decode = bitpacked_decode_uyvy422; - else if (avctx->bits_per_coded_sample == 20 && - avctx->pix_fmt == AV_PIX_FMT_YUV422P10) - bc->decode = bitpacked_decode_yuv422p10; - else - return AVERROR_INVALIDDATA; - } else { - return AVERROR_INVALIDDATA; - } - - return 0; -} - -static int bitpacked_decode(AVCodecContext *avctx, void *data, int *got_frame, - AVPacket *avpkt) -{ - struct BitpackedContext *bc = avctx->priv_data; - int buf_size = avpkt->size; - AVFrame *frame = data; - int res; - - frame->pict_type = AV_PICTURE_TYPE_I; - frame->key_frame = 1; - - res = bc->decode(avctx, frame, avpkt); - if (res) - return res; - - *got_frame = 1; - return buf_size; - -} - -const AVCodec ff_bitpacked_decoder = { - .name = "bitpacked", - .long_name = NULL_IF_CONFIG_SMALL("Bitpacked"), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_BITPACKED, - .priv_data_size = sizeof(struct BitpackedContext), - .init = bitpacked_init_decoder, - .decode = bitpacked_decode, - .capabilities = AV_CODEC_CAP_EXPERIMENTAL, - .codec_tags = (const uint32_t []){ - MKTAG('U', 'Y', 'V', 'Y'), - FF_CODEC_TAGS_END, - }, - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, -}; diff --git a/libavcodec/bitpacked_dec.c b/libavcodec/bitpacked_dec.c new file mode 100644 index 0000000..0440df9 --- /dev/null +++ b/libavcodec/bitpacked_dec.c @@ -0,0 +1,158 @@ +/* + * Unpack bit-packed streams to formats supported by FFmpeg + * Copyright (c) 2017 Savoir-faire Linux, Inc + * + * 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 + */ + +/* Development sponsored by CBC/Radio-Canada */ + +/** + * @file + * Bitpacked + */ + +#include "avcodec.h" +#include "internal.h" +#include "get_bits.h" +#include "libavutil/imgutils.h" + +struct BitpackedContext { + int (*decode)(AVCodecContext *avctx, AVFrame *frame, + const AVPacket *pkt); +}; + +/* For this format, it's a simple passthrough */ +static int bitpacked_decode_uyvy422(AVCodecContext *avctx, AVFrame *frame, + const AVPacket *avpkt) +{ + int ret; + + /* there is no need to copy as the data already match + * a known pixel format */ + frame->buf[0] = av_buffer_ref(avpkt->buf); + if (!frame->buf[0]) { + return AVERROR(ENOMEM); + } + + ret = av_image_fill_arrays(frame->data, frame->linesize, avpkt->data, + avctx->pix_fmt, avctx->width, avctx->height, 1); + if (ret < 0) { + av_buffer_unref(&frame->buf[0]); + return ret; + } + + return 0; +} + +static int bitpacked_decode_yuv422p10(AVCodecContext *avctx, AVFrame *frame, + const AVPacket *avpkt) +{ + uint64_t frame_size = (uint64_t)avctx->width * (uint64_t)avctx->height * 20; + uint64_t packet_size = (uint64_t)avpkt->size * 8; + GetBitContext bc; + uint16_t *y, *u, *v; + int ret, i, j; + + ret = ff_get_buffer(avctx, frame, 0); + if (ret < 0) + return ret; + + if (frame_size > packet_size) + return AVERROR_INVALIDDATA; + + if (avctx->width % 2) + return AVERROR_PATCHWELCOME; + + ret = init_get_bits(&bc, avpkt->data, avctx->width * avctx->height * 20); + if (ret) + return ret; + + for (i = 0; i < avctx->height; i++) { + y = (uint16_t*)(frame->data[0] + i * frame->linesize[0]); + u = (uint16_t*)(frame->data[1] + i * frame->linesize[1]); + v = (uint16_t*)(frame->data[2] + i * frame->linesize[2]); + + for (j = 0; j < avctx->width; j += 2) { + *u++ = get_bits(&bc, 10); + *y++ = get_bits(&bc, 10); + *v++ = get_bits(&bc, 10); + *y++ = get_bits(&bc, 10); + } + } + + return 0; +} + +static av_cold int bitpacked_init_decoder(AVCodecContext *avctx) +{ + struct BitpackedContext *bc = avctx->priv_data; + + if (!avctx->codec_tag || !avctx->width || !avctx->height) + return AVERROR_INVALIDDATA; + + if (avctx->codec_tag == MKTAG('U', 'Y', 'V', 'Y')) { + if (avctx->bits_per_coded_sample == 16 && + avctx->pix_fmt == AV_PIX_FMT_UYVY422) + bc->decode = bitpacked_decode_uyvy422; + else if (avctx->bits_per_coded_sample == 20 && + avctx->pix_fmt == AV_PIX_FMT_YUV422P10) + bc->decode = bitpacked_decode_yuv422p10; + else + return AVERROR_INVALIDDATA; + } else { + return AVERROR_INVALIDDATA; + } + + return 0; +} + +static int bitpacked_decode(AVCodecContext *avctx, void *data, int *got_frame, + AVPacket *avpkt) +{ + struct BitpackedContext *bc = avctx->priv_data; + int buf_size = avpkt->size; + AVFrame *frame = data; + int res; + + frame->pict_type = AV_PICTURE_TYPE_I; + frame->key_frame = 1; + + res = bc->decode(avctx, frame, avpkt); + if (res) + return res; + + *got_frame = 1; + return buf_size; + +} + +const AVCodec ff_bitpacked_decoder = { + .name = "bitpacked", + .long_name = NULL_IF_CONFIG_SMALL("Bitpacked"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_BITPACKED, + .priv_data_size = sizeof(struct BitpackedContext), + .init = bitpacked_init_decoder, + .decode = bitpacked_decode, + .capabilities = AV_CODEC_CAP_EXPERIMENTAL, + .codec_tags = (const uint32_t []){ + MKTAG('U', 'Y', 'V', 'Y'), + FF_CODEC_TAGS_END, + }, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, +};