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".