From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <ffmpeg-devel-bounces@ffmpeg.org> Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 42D3F4D12F for <ffmpegdev@gitmailbox.com>; Wed, 16 Apr 2025 06:12:43 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6C91D687D43; Wed, 16 Apr 2025 09:12:39 +0300 (EEST) Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DC4AA687B1C for <ffmpeg-devel@ffmpeg.org>; Wed, 16 Apr 2025 09:12:38 +0300 (EEST) Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-af9925bbeb7so4718691a12.3 for <ffmpeg-devel@ffmpeg.org>; Tue, 15 Apr 2025 23:12:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744783956; x=1745388756; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ABeKItOtalndOTO6jh11h3GY+5PZ+/wyq/zKdNXZdUw=; b=dut9w0YvONBqIWwnLPeT5rw6D0oT5hhTkodXw+9dz3ROlwB8G1gfnqYQyjZjT90aBa 5IQwwwLCSI9yEN57dur7JaV+/8sTOwhODhJvgXkvO8GNclYjwAgwjot2lN63xcqLOV+6 wopUR5fXaWn9bmfsHTqLyXByxJWR7tdSaLAEtEnD3vyNltsed+9jM571n5pOM2maN/9t HY9qGUlFjjyFf654vbNk/gqz0FsBXhx73GlNg+utTkbET2eNaZoI6KjdknQorzpakgVP Bl4aok8TT1SqoBQc6r9DWefeXG7Qf7CaN53p/40bLwGFOYfOgeU7YdVPzGouH8+tFLJ+ plwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744783956; x=1745388756; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ABeKItOtalndOTO6jh11h3GY+5PZ+/wyq/zKdNXZdUw=; b=nMQ1Qnv0GhN7JLd0T18CWjqOvxblcg87rDqDq1BMogM0NrGmjcfINNXnPw0BnWDTWg iFcc/mH2nglGjHo+wreb+iNaJ/WQWk4WYCQFSpHIkJOTq4E/W1zhQdhFtehBsgl4K7L2 nbWpPi22F711a3CyQh/4m1rmaMkyYh+KIbT+7AQARcbvnXJVBPE+BMdsldVsurCHTeDN Ux5IYL3o0cFmkYrpbGwVQokmXpeZeKPaPSDx1DXZzr9kxTco6ZnjVA+AbJJGoEtD4VWS uOX7rF4hHpJNgl9X3fcPzlC5LlrNy+nAtHwDh2UYBsiVl9H5GcdqX+dffDFks9V8LFhI +Z8w== X-Gm-Message-State: AOJu0YxE+wRpg5pQz5UybTGUcQk854RVbGWcEN0xc3D0SIdedCuAsJ2n yC08em2L+WktqELRejRJu1/etEh/AEHVUDfJL05jqda+Hk4ktHm9ooeoZA== X-Gm-Gg: ASbGncvb9nzl8otuaFjwosfnLPfTQQa/f7DjUKBk19lN/GcfO/blqN3K74s1bzPQa1+ DZKcWsz4ZRWHacLJG76sTv2F5XfFpKNthI8zjrucc0gNcxSqp3rNSx5bSPDtz63R2om2Uy7R0f+ 9/GBJWsirb0PPrcsk6mxs6M6y0ViQtdDFjTlqyZpg346fmwU2SWmZHLmIrQQ64UEZC9OEqchY17 Zds1At49fwCNytDbuzoLq1jTuRRfi+4jk37Q/FVLYZnpj3XoTX56qF0sAFu5C4m5oJbRKPh0SXi x4zeFmHWBrRdCEe4X/JPxI99EwrHla1YvMqvA7uA9au8 X-Google-Smtp-Source: AGHT+IGZVeNl22ojHMm4fQ/QIvRQZ5Dw0B00F3TQSWLgxnkROSMdM0T5XbP7JWhMFhwCxEbuoZkuVw== X-Received: by 2002:a17:90b:2dc9:b0:2fa:1e3e:9be5 with SMTP id 98e67ed59e1d1-30863c507e2mr1018852a91.0.1744783954646; Tue, 15 Apr 2025 23:12:34 -0700 (PDT) Received: from pc.mioffice.cn ([43.224.245.228]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-308613cb073sm695157a91.45.2025.04.15.23.12.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Apr 2025 23:12:34 -0700 (PDT) From: Shiqi Zhu <hiccupzhu@gmail.com> To: ffmpeg-devel@ffmpeg.org Date: Wed, 16 Apr 2025 14:12:21 +0800 Message-Id: <20250416061221.1809666-1-hiccupzhu@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/h264bsd_dec: add h264dec base on h264bsd X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org> List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe> List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel> List-Post: <mailto:ffmpeg-devel@ffmpeg.org> List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help> List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe> Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Cc: Shiqi Zhu <hiccupzhu@gmail.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org> Archived-At: <https://master.gitmailbox.com/ffmpegdev/20250416061221.1809666-1-hiccupzhu@gmail.com/> List-Archive: <https://master.gitmailbox.com/ffmpegdev/> List-Post: <mailto:ffmpegdev@gitmailbox.com> h264bsd url https://github.com/oneam/h264bsd ./configure --enable-decoder="h264_bsd" --extra-cflags="-I<path>/h264bsd/src" --extra-ldflags="-L<path>/h264bsd/posix/lib" --extra-libs="-lh264bsd" Test ./ffmpeg -y -codec:v h264_bsd -i <path>/h264bsd/test/test_640x360.h264 ./test_640x360.yuv Signed-off-by: Shiqi Zhu <hiccupzhu@gmail.com> --- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/h264bsd_dec.c | 183 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 libavcodec/h264bsd_dec.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 7bd1dbec9a..68cfc3abb5 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -419,6 +419,7 @@ OBJS-$(CONFIG_H264_DECODER) += h264dec.o h264_cabac.o h264_cavlc.o \ h264_slice.o h264data.o h274.o OBJS-$(CONFIG_H264_AMF_ENCODER) += amfenc_h264.o OBJS-$(CONFIG_H264_AMF_DECODER) += amfdec.o +OBJS-$(CONFIG_H264_BSD_DECODER) += h264bsd_dec.o OBJS-$(CONFIG_H264_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_H264_MEDIACODEC_DECODER) += mediacodecdec.o OBJS-$(CONFIG_H264_MEDIACODEC_ENCODER) += mediacodecenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index f10519617e..a752f83210 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -148,6 +148,7 @@ extern const FFCodec ff_h263i_decoder; extern const FFCodec ff_h263p_encoder; extern const FFCodec ff_h263p_decoder; extern const FFCodec ff_h263_v4l2m2m_decoder; +extern const FFCodec ff_h264_bsd_decoder; extern const FFCodec ff_h264_decoder; extern const FFCodec ff_h264_v4l2m2m_decoder; extern const FFCodec ff_h264_mediacodec_decoder; diff --git a/libavcodec/h264bsd_dec.c b/libavcodec/h264bsd_dec.c new file mode 100644 index 0000000000..e687dbf8e3 --- /dev/null +++ b/libavcodec/h264bsd_dec.c @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2025 Shiqi Zhu <hiccupzhu@gmail.com> + * 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 + */ + +/** + * @file + * MCV hardware video decoder + */ + +#include "config_components.h" +#include "avcodec.h" +#include "codec_internal.h" +#include "decode.h" +#include "internal.h" +#include "packet.h" +#include "libavutil/opt.h" +#include "libavutil/fifo.h" +#include "h264bsd_decoder.h" + +typedef struct DecodeContext { + AVClass *av_class; + storage_t vdec; + AVCodecContext *avctx; + uint32_t ext_buffer_num; + int coded_width; + int coded_height; + enum AVPixelFormat format; +} DecodeContext; + +static av_cold int h264_bsd_init_decoder(AVCodecContext *avctx) +{ + DecodeContext *x = avctx->priv_data; + int ret; + + ret = h264bsdInit(&x->vdec, 0); + if (ret != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to open hifi decoder\n"); + return AVERROR_UNKNOWN; + } + + x->avctx = avctx; + x->format = AV_PIX_FMT_YUV420P; + + return 0; +} + +static av_cold int h264_bsd_close_decoder(AVCodecContext *avctx) +{ + DecodeContext *x = avctx->priv_data; + int ret; + + x->avctx = NULL; + h264bsdShutdown(&x->vdec); + + return 0; +} + +static void h264_bsd_flush(AVCodecContext *avctx) +{ + DecodeContext *x = avctx->priv_data; + + h264bsdFlushBuffer(&x->vdec); +} + +static int h264_bsd_decode_frame(AVCodecContext *avctx, AVFrame *frame, + int *got_frame, AVPacket *avpkt) +{ + DecodeContext *x = avctx->priv_data; + int ret, i, w, h; + uint32_t readBytes; + int numPics = 0; + uint32_t picId, isIdrPic, numErrMbs; + uint8_t *data; + + while (avpkt->size > 0) { + ret = h264bsdDecode(&x->vdec, avpkt->data, avpkt->size, 0, &readBytes); + avpkt->data += readBytes; + avpkt->size -= readBytes; + + switch (ret) + { + case H264BSD_PIC_RDY: + data = h264bsdNextOutputPicture(&x->vdec, &picId, &isIdrPic, &numErrMbs); + if (isIdrPic) { + av_log(avctx, AV_LOG_DEBUG, "IDR picture %d\n", picId); + } else { + av_log(avctx, AV_LOG_DEBUG, "Non-IDR picture %d\n", picId); + } + if (numErrMbs > 0) { + av_log(avctx, AV_LOG_DEBUG, "Picture %d has %d errors\n", picId, numErrMbs); + } else { + av_log(avctx, AV_LOG_DEBUG, "Picture %d has no errors\n", picId); + } + + frame->width = avctx->width; + frame->height = avctx->height; + frame->format = x->format; + ret = avcodec_default_get_buffer2(avctx, frame, 0); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to get buffer\n"); + return ret; + } + + for (h = 0; h < frame->height; h++) { + memcpy(frame->data[0] + h * frame->linesize[0], data + h * x->coded_width, frame->width); + } + data += x->coded_width * x->coded_height; + w = x->coded_width >> 1; + for (i = 1; i < 3; i++) { + for (h = 0; h < (frame->height >> 1); h++) { + memcpy(frame->data[i] + h * frame->linesize[i], data + h * w, frame->width >> 1); + } + data += w * h; + } + frame->pts = avpkt->pts; + frame->pkt_dts = avpkt->dts; + frame->sample_aspect_ratio = avctx->sample_aspect_ratio; + *got_frame = 1; + break; + case H264BSD_HDRS_RDY: + x->coded_width = h264bsdPicWidth(&x->vdec) * 16; + x->coded_height = h264bsdPicHeight(&x->vdec) * 16; + av_log(avctx, AV_LOG_INFO, "Output dimensions: %dx%d\n", w, h); + break; + + case H264BSD_RDY: + av_log(avctx, AV_LOG_DEBUG, "Picture %d is ready\n", picId); + break; + default: + av_log(avctx, AV_LOG_ERROR, "Error decoding frame: %d\n", ret); + goto out; + } + } + +out: + return avpkt->size; +} + +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM +static const AVOption options[] = { + {"ext_buffer_num", "extra buffer number", offsetof(DecodeContext, ext_buffer_num), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 16, VD}, + {NULL} +}; + +static const AVClass h264_bsd_dec_class = { + .class_name = "h264_bsd_decoder", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +const FFCodec ff_h264_bsd_decoder = { + .p.name = "h264_bsd", + CODEC_LONG_NAME("h264bsd video decoder for ffmpeg"), + .p.type = AVMEDIA_TYPE_VIDEO, + .p.id = AV_CODEC_ID_H264, + .priv_data_size = sizeof(DecodeContext), + .init = h264_bsd_init_decoder, + .close = h264_bsd_close_decoder, + FF_CODEC_DECODE_CB(h264_bsd_decode_frame), + .flush = h264_bsd_flush, + .p.priv_class = &h264_bsd_dec_class, + .bsfs = "h264_mp4toannexb", + .p.capabilities = AV_CODEC_CAP_DELAY, + .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, + .p.wrapper_name = "ff_h264_bsd_decoder", + .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING, +}; \ No newline at end of file -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".