2025-05-10 21:49:39 +08:00

103 lines
3.1 KiB
C

/*
* Copyright 2021 Rockchip Electronics Co., Ltd
* Author: Jeffy Chen <jeffy.chen@rock-chips.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef __GST_MPP_H__
#define __GST_MPP_H__
#include <gst/video/video.h>
#include <gst/allocators/gstdmabuf.h>
#ifdef HAVE_RGA
#include <rga/rga.h>
#include <rga/RgaApi.h>
#endif
#include <rockchip/rk_mpi.h>
G_BEGIN_DECLS;
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
#endif
#ifndef SWAP
#define SWAP(x, y) ({ x ^= y; y ^= x; x ^= y; })
#endif
#define MPP_FMT_LE(f) (f | MPP_FRAME_FMT_LE_MASK)
#define MPP_FMT_RGB565LE MPP_FMT_LE(MPP_FMT_RGB565)
#define MPP_FMT_BGR565LE MPP_FMT_LE(MPP_FMT_BGR565)
#define GST_MPP_VIDEO_INFO_HSTRIDE(i) GST_VIDEO_INFO_PLANE_STRIDE(i, 0)
#define GST_MPP_VIDEO_INFO_VSTRIDE(i) \
(GST_VIDEO_INFO_N_PLANES(i) == 1 ? GST_VIDEO_INFO_HEIGHT(i) : \
(gint) (GST_VIDEO_INFO_PLANE_OFFSET(i, 1) / GST_MPP_VIDEO_INFO_HSTRIDE(i)))
#ifndef GST_VIDEO_FLAG_ARM_AFBC
#define GST_VIDEO_FLAG_ARM_AFBC (1UL << 31)
#define GST_VIDEO_INFO_SET_AFBC(i) \
GST_VIDEO_INFO_FLAG_SET (i, GST_VIDEO_FLAG_ARM_AFBC)
#define GST_VIDEO_INFO_UNSET_AFBC(i) \
GST_VIDEO_INFO_FLAG_UNSET (i, GST_VIDEO_FLAG_ARM_AFBC)
#define GST_VIDEO_INFO_IS_AFBC(i) \
GST_VIDEO_INFO_FLAG_IS_SET (i, GST_VIDEO_FLAG_ARM_AFBC)
#endif
/* The MPP requires alignment 16 by default */
#define GST_MPP_ALIGNMENT 16
#define GST_MPP_ALIGN(v) GST_ROUND_UP_N (v, GST_MPP_ALIGNMENT)
#ifdef HAVE_RGA
#define GST_RGA_FORMATS \
"NV12, NV21, I420, YV12, NV16, NV61, " \
"BGR16, RGB, BGR, RGBA, BGRA, RGBx, BGRx"
#endif
gboolean gst_mpp_use_rga ();
const gchar *gst_mpp_video_format_to_string (GstVideoFormat format);
GstVideoFormat gst_mpp_mpp_format_to_gst_format (MppFrameFormat mpp_format);
MppFrameFormat gst_mpp_gst_format_to_mpp_format (GstVideoFormat format);
#ifdef HAVE_RGA
gboolean gst_mpp_rga_convert (GstBuffer * inbuf, GstVideoInfo * src_vinfo,
GstMemory * out_mem, GstVideoInfo * dst_vinfo, gint rotation);
gboolean gst_mpp_rga_convert_from_mpp_frame (MppFrame * mframe,
GstMemory * out_mem, GstVideoInfo * dst_vinfo, gint rotation);
#endif
/* Apply new format and size without reinit the video info */
void
gst_mpp_video_info_update_format (GstVideoInfo * info, GstVideoFormat format,
guint width, guint height);
gboolean gst_mpp_video_info_align (GstVideoInfo * info,
gint hstride, gint vstride);
guint gst_mpp_get_pixel_stride (GstVideoInfo * info);
G_END_DECLS;
#endif /* __GST_MPP_H__ */