xref: /OK3568_Linux_fs/external/gstreamer-rockchip/gst/rockchipmpp/gstmpp.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2017 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *     Author: Randy Li <randy.li@rock-chips.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2021 Rockchip Electronics Co., Ltd
6*4882a593Smuzhiyun  *     Author: Jeffy Chen <jeffy.chen@rock-chips.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * This library is free software; you can redistribute it and/or
9*4882a593Smuzhiyun  * modify it under the terms of the GNU Library General Public
10*4882a593Smuzhiyun  * License as published by the Free Software Foundation; either
11*4882a593Smuzhiyun  * version 2 of the License, or (at your option) any later version.
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * This library is distributed in the hope that it will be useful,
14*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16*4882a593Smuzhiyun  * Library General Public License for more details.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * You should have received a copy of the GNU Library General Public
19*4882a593Smuzhiyun  * License along with this library; if not, write to the
20*4882a593Smuzhiyun  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21*4882a593Smuzhiyun  * Boston, MA 02110-1301, USA.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun #ifdef HAVE_CONFIG_H
25*4882a593Smuzhiyun #include "config.h"
26*4882a593Smuzhiyun #endif
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #include <string.h>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include <gst/allocators/gstdmabuf.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include "gstmpp.h"
33*4882a593Smuzhiyun #include "gstmpph264enc.h"
34*4882a593Smuzhiyun #include "gstmpph265enc.h"
35*4882a593Smuzhiyun #include "gstmppvp8enc.h"
36*4882a593Smuzhiyun #include "gstmppjpegenc.h"
37*4882a593Smuzhiyun #include "gstmppjpegdec.h"
38*4882a593Smuzhiyun #include "gstmppvideodec.h"
39*4882a593Smuzhiyun #include "gstmppvpxalphadecodebin.h"
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun GST_DEBUG_CATEGORY_STATIC (mpp_debug);
42*4882a593Smuzhiyun #define GST_CAT_DEFAULT mpp_debug
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun struct gst_mpp_format
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun   GstVideoFormat gst_format;
47*4882a593Smuzhiyun   MppFrameFormat mpp_format;
48*4882a593Smuzhiyun #ifdef HAVE_RGA
49*4882a593Smuzhiyun   RgaSURF_FORMAT rga_format;
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun   gint pixel_stride0;
52*4882a593Smuzhiyun   gboolean is_yuv;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef HAVE_RGA
56*4882a593Smuzhiyun #define GST_MPP_FORMAT(gst, mpp, rga, pixel_stride0, yuv) \
57*4882a593Smuzhiyun   { GST_VIDEO_FORMAT_ ## gst, MPP_FMT_ ## mpp, RK_FORMAT_ ## rga, \
58*4882a593Smuzhiyun     pixel_stride0, yuv }
59*4882a593Smuzhiyun #else
60*4882a593Smuzhiyun #define GST_MPP_FORMAT(gst, mpp, rga, pixel_stride0, yuv) \
61*4882a593Smuzhiyun   { GST_VIDEO_FORMAT_ ## gst, MPP_FMT_ ## mpp, pixel_stride0, yuv}
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun struct gst_mpp_format gst_mpp_formats[] = {
65*4882a593Smuzhiyun   GST_MPP_FORMAT (I420, YUV420P, YCbCr_420_P, 1, 1),
66*4882a593Smuzhiyun   GST_MPP_FORMAT (YV12, BUTT, YCrCb_420_P, 1, 1),
67*4882a593Smuzhiyun   GST_MPP_FORMAT (NV12, YUV420SP, YCbCr_420_SP, 1, 1),
68*4882a593Smuzhiyun   GST_MPP_FORMAT (NV21, YUV420SP_VU, YCrCb_420_SP, 1, 1),
69*4882a593Smuzhiyun #ifdef HAVE_NV12_10LE40
70*4882a593Smuzhiyun   GST_MPP_FORMAT (NV12_10LE40, YUV420SP_10BIT, YCbCr_420_SP_10B, 1, 1),
71*4882a593Smuzhiyun #else
72*4882a593Smuzhiyun   GST_MPP_FORMAT (UNKNOWN, YUV420SP_10BIT, YCbCr_420_SP_10B, 1, 1),
73*4882a593Smuzhiyun #endif
74*4882a593Smuzhiyun #ifdef HAVE_NV16_10LE40
75*4882a593Smuzhiyun   GST_MPP_FORMAT (NV16_10LE40, YUV422SP_10BIT, YCbCr_422_SP_10B, 1, 1),
76*4882a593Smuzhiyun #else
77*4882a593Smuzhiyun   GST_MPP_FORMAT (UNKNOWN, YUV422SP_10BIT, YCbCr_422_SP_10B, 1, 1),
78*4882a593Smuzhiyun #endif
79*4882a593Smuzhiyun   GST_MPP_FORMAT (Y42B, YUV422P, YCbCr_422_P, 1, 1),
80*4882a593Smuzhiyun   GST_MPP_FORMAT (NV16, YUV422SP, YCbCr_422_SP, 1, 1),
81*4882a593Smuzhiyun   GST_MPP_FORMAT (NV61, YUV422SP_VU, YCrCb_422_SP, 1, 1),
82*4882a593Smuzhiyun   GST_MPP_FORMAT (NV24, YUV444SP, UNKNOWN, 1, 1),
83*4882a593Smuzhiyun   GST_MPP_FORMAT (Y444, YUV444P, UNKNOWN, 1, 1),
84*4882a593Smuzhiyun   GST_MPP_FORMAT (YUY2, YUV422_YUYV, UNKNOWN, 2, 1),
85*4882a593Smuzhiyun   GST_MPP_FORMAT (YVYU, YUV422_YVYU, UNKNOWN, 2, 1),
86*4882a593Smuzhiyun   GST_MPP_FORMAT (UYVY, YUV422_UYVY, UNKNOWN, 2, 1),
87*4882a593Smuzhiyun   GST_MPP_FORMAT (VYUY, YUV422_VYUY, UNKNOWN, 2, 1),
88*4882a593Smuzhiyun   GST_MPP_FORMAT (RGB16, RGB565LE, UNKNOWN, 2, 0),
89*4882a593Smuzhiyun   GST_MPP_FORMAT (BGR16, BGR565LE, RGB_565, 2, 0),
90*4882a593Smuzhiyun   GST_MPP_FORMAT (RGB, RGB888, RGB_888, 3, 0),
91*4882a593Smuzhiyun   GST_MPP_FORMAT (BGR, BGR888, BGR_888, 3, 0),
92*4882a593Smuzhiyun   GST_MPP_FORMAT (ARGB, ARGB8888, UNKNOWN, 4, 0),
93*4882a593Smuzhiyun   GST_MPP_FORMAT (ABGR, ABGR8888, UNKNOWN, 4, 0),
94*4882a593Smuzhiyun   GST_MPP_FORMAT (RGBA, RGBA8888, RGBA_8888, 4, 0),
95*4882a593Smuzhiyun   GST_MPP_FORMAT (BGRA, BGRA8888, BGRA_8888, 4, 0),
96*4882a593Smuzhiyun   GST_MPP_FORMAT (xRGB, ARGB8888, UNKNOWN, 4, 0),
97*4882a593Smuzhiyun   GST_MPP_FORMAT (xBGR, ABGR8888, UNKNOWN, 4, 0),
98*4882a593Smuzhiyun   GST_MPP_FORMAT (RGBx, RGBA8888, RGBX_8888, 4, 0),
99*4882a593Smuzhiyun   GST_MPP_FORMAT (BGRx, BGRA8888, BGRX_8888, 4, 0),
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define GST_MPP_GET_FORMAT(type, format) ({ \
103*4882a593Smuzhiyun   struct gst_mpp_format *_tmp; \
104*4882a593Smuzhiyun   for (guint i = 0; i < ARRAY_SIZE (gst_mpp_formats) || (_tmp = NULL); i++) { \
105*4882a593Smuzhiyun     _tmp = &gst_mpp_formats[i]; \
106*4882a593Smuzhiyun     if (_tmp->type ## _format == (format)) break;\
107*4882a593Smuzhiyun   }; _tmp; \
108*4882a593Smuzhiyun })
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun gboolean
gst_mpp_use_rga()111*4882a593Smuzhiyun gst_mpp_use_rga ()
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun   static int mpp_use_rga = -1;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #ifdef HAVE_RGA
116*4882a593Smuzhiyun   if (mpp_use_rga < 0) {
117*4882a593Smuzhiyun     const gchar *buf = g_getenv ("GST_MPP_NO_RGA");
118*4882a593Smuzhiyun     if (!buf || buf[0] == '0')
119*4882a593Smuzhiyun       mpp_use_rga = 1;
120*4882a593Smuzhiyun     else
121*4882a593Smuzhiyun       mpp_use_rga = 0;
122*4882a593Smuzhiyun   }
123*4882a593Smuzhiyun #endif
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun   return mpp_use_rga > 0;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun const gchar *
gst_mpp_video_format_to_string(GstVideoFormat format)129*4882a593Smuzhiyun gst_mpp_video_format_to_string (GstVideoFormat format)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun   if (format == GST_VIDEO_FORMAT_UNKNOWN)
132*4882a593Smuzhiyun     return "UNKNOWN";
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun   return gst_video_format_to_string (format);
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun GstVideoFormat
gst_mpp_mpp_format_to_gst_format(MppFrameFormat mpp_format)138*4882a593Smuzhiyun gst_mpp_mpp_format_to_gst_format (MppFrameFormat mpp_format)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun   struct gst_mpp_format *format = GST_MPP_GET_FORMAT (mpp,
141*4882a593Smuzhiyun       mpp_format & MPP_FRAME_FMT_MASK);
142*4882a593Smuzhiyun   return format ? format->gst_format : GST_VIDEO_FORMAT_UNKNOWN;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun MppFrameFormat
gst_mpp_gst_format_to_mpp_format(GstVideoFormat gst_format)146*4882a593Smuzhiyun gst_mpp_gst_format_to_mpp_format (GstVideoFormat gst_format)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun   struct gst_mpp_format *format = GST_MPP_GET_FORMAT (gst, gst_format);
149*4882a593Smuzhiyun   return format ? format->mpp_format : MPP_FMT_BUTT;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #ifdef HAVE_RGA
153*4882a593Smuzhiyun static RgaSURF_FORMAT
gst_mpp_mpp_format_to_rga_format(MppFrameFormat mpp_format)154*4882a593Smuzhiyun gst_mpp_mpp_format_to_rga_format (MppFrameFormat mpp_format)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun   struct gst_mpp_format *format = GST_MPP_GET_FORMAT (mpp,
157*4882a593Smuzhiyun       mpp_format & MPP_FRAME_FMT_MASK);
158*4882a593Smuzhiyun   return format ? format->rga_format : RK_FORMAT_UNKNOWN;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun static RgaSURF_FORMAT
gst_mpp_gst_format_to_rga_format(GstVideoFormat gst_format)162*4882a593Smuzhiyun gst_mpp_gst_format_to_rga_format (GstVideoFormat gst_format)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun   struct gst_mpp_format *format = GST_MPP_GET_FORMAT (gst, gst_format);
165*4882a593Smuzhiyun   return format ? format->rga_format : RK_FORMAT_UNKNOWN;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun static gboolean
gst_mpp_set_rga_info(rga_info_t * info,RgaSURF_FORMAT rga_format,guint width,guint height,guint hstride,guint vstride)169*4882a593Smuzhiyun gst_mpp_set_rga_info (rga_info_t * info, RgaSURF_FORMAT rga_format,
170*4882a593Smuzhiyun     guint width, guint height, guint hstride, guint vstride)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun   struct gst_mpp_format *format = GST_MPP_GET_FORMAT (rga, rga_format);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun   g_assert (format);
175*4882a593Smuzhiyun   if (format->is_yuv) {
176*4882a593Smuzhiyun     /* RGA requires yuv image rect align to 2 */
177*4882a593Smuzhiyun     width &= ~1;
178*4882a593Smuzhiyun     height &= ~1;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     if (vstride % 2)
181*4882a593Smuzhiyun       return FALSE;
182*4882a593Smuzhiyun   }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun   if (info->fd < 0 && !info->virAddr)
185*4882a593Smuzhiyun     return FALSE;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun   info->mmuFlag = 1;
188*4882a593Smuzhiyun   rga_set_rect (&info->rect, 0, 0, width, height, hstride, vstride, rga_format);
189*4882a593Smuzhiyun   return TRUE;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun static gboolean
gst_mpp_rga_info_from_mpp_frame(rga_info_t * info,MppFrame mframe)193*4882a593Smuzhiyun gst_mpp_rga_info_from_mpp_frame (rga_info_t * info, MppFrame mframe)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun   MppFrameFormat mpp_format = mpp_frame_get_fmt (mframe);
196*4882a593Smuzhiyun   MppBuffer mbuf = mpp_frame_get_buffer (mframe);
197*4882a593Smuzhiyun   guint width = mpp_frame_get_width (mframe);
198*4882a593Smuzhiyun   guint height = mpp_frame_get_height (mframe);
199*4882a593Smuzhiyun   guint hstride = mpp_frame_get_hor_stride (mframe);
200*4882a593Smuzhiyun   guint vstride = mpp_frame_get_ver_stride (mframe);
201*4882a593Smuzhiyun   RgaSURF_FORMAT rga_format = gst_mpp_mpp_format_to_rga_format (mpp_format);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun   g_return_val_if_fail (mbuf, FALSE);
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun   info->fd = mpp_buffer_get_fd (mbuf);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun   return gst_mpp_set_rga_info (info, rga_format, width, height,
208*4882a593Smuzhiyun       hstride, vstride);
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun static gboolean
gst_mpp_rga_info_from_video_info(rga_info_t * info,GstVideoInfo * vinfo)212*4882a593Smuzhiyun gst_mpp_rga_info_from_video_info (rga_info_t * info, GstVideoInfo * vinfo)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun   GstVideoFormat format = GST_VIDEO_INFO_FORMAT (vinfo);
215*4882a593Smuzhiyun   guint width = GST_VIDEO_INFO_WIDTH (vinfo);
216*4882a593Smuzhiyun   guint height = GST_VIDEO_INFO_HEIGHT (vinfo);
217*4882a593Smuzhiyun   guint hstride = GST_MPP_VIDEO_INFO_HSTRIDE (vinfo);
218*4882a593Smuzhiyun   guint vstride = GST_MPP_VIDEO_INFO_VSTRIDE (vinfo);
219*4882a593Smuzhiyun   RgaSURF_FORMAT rga_format = gst_mpp_gst_format_to_rga_format (format);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun   return gst_mpp_set_rga_info (info, rga_format, width, height,
222*4882a593Smuzhiyun       hstride, vstride);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun static gboolean
gst_mpp_rga_do_convert(rga_info_t * src_info,rga_info_t * dst_info)226*4882a593Smuzhiyun gst_mpp_rga_do_convert (rga_info_t * src_info, rga_info_t * dst_info)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun   static gint rga_supported = 1;
229*4882a593Smuzhiyun   static gint rga_inited = 0;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun   if (!rga_supported || !gst_mpp_use_rga ())
232*4882a593Smuzhiyun     return FALSE;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun   if (!rga_inited) {
235*4882a593Smuzhiyun     if (c_RkRgaInit () < 0) {
236*4882a593Smuzhiyun       rga_supported = 0;
237*4882a593Smuzhiyun       GST_WARNING ("failed to init RGA");
238*4882a593Smuzhiyun       return FALSE;
239*4882a593Smuzhiyun     }
240*4882a593Smuzhiyun     rga_inited = 1;
241*4882a593Smuzhiyun   }
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun   if (c_RkRgaBlit (src_info, dst_info, NULL) < 0) {
244*4882a593Smuzhiyun     GST_WARNING ("failed to blit");
245*4882a593Smuzhiyun     return FALSE;
246*4882a593Smuzhiyun   }
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun   GST_DEBUG ("converted with RGA");
249*4882a593Smuzhiyun   return TRUE;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun static gint
gst_mpp_rga_get_rotation(gint rotation)253*4882a593Smuzhiyun gst_mpp_rga_get_rotation (gint rotation)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun   switch (rotation) {
256*4882a593Smuzhiyun     case 0:
257*4882a593Smuzhiyun       return 0;
258*4882a593Smuzhiyun     case 90:
259*4882a593Smuzhiyun       return HAL_TRANSFORM_ROT_90;
260*4882a593Smuzhiyun     case 180:
261*4882a593Smuzhiyun       return HAL_TRANSFORM_ROT_180;
262*4882a593Smuzhiyun     case 270:
263*4882a593Smuzhiyun       return HAL_TRANSFORM_ROT_270;
264*4882a593Smuzhiyun     default:
265*4882a593Smuzhiyun       return -1;
266*4882a593Smuzhiyun   }
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun gboolean
gst_mpp_rga_convert(GstBuffer * inbuf,GstVideoInfo * src_vinfo,GstMemory * out_mem,GstVideoInfo * dst_vinfo,gint rotation)270*4882a593Smuzhiyun gst_mpp_rga_convert (GstBuffer * inbuf, GstVideoInfo * src_vinfo,
271*4882a593Smuzhiyun     GstMemory * out_mem, GstVideoInfo * dst_vinfo, gint rotation)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun   GstMapInfo mapinfo = { 0, };
274*4882a593Smuzhiyun   gboolean ret;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun   rga_info_t src_info = { 0, };
277*4882a593Smuzhiyun   rga_info_t dst_info = { 0, };
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun   if (!gst_mpp_rga_info_from_video_info (&src_info, src_vinfo))
280*4882a593Smuzhiyun     return FALSE;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun   if (!gst_mpp_rga_info_from_video_info (&dst_info, dst_vinfo))
283*4882a593Smuzhiyun     return FALSE;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun   /* Prefer using dma fd */
286*4882a593Smuzhiyun   if (gst_buffer_n_memory (inbuf) == 1) {
287*4882a593Smuzhiyun     GstMemory *mem = gst_buffer_peek_memory (inbuf, 0);
288*4882a593Smuzhiyun     gsize offset;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun     if (gst_is_dmabuf_memory (mem)) {
291*4882a593Smuzhiyun       gst_memory_get_sizes (mem, &offset, NULL);
292*4882a593Smuzhiyun       if (!offset)
293*4882a593Smuzhiyun         src_info.fd = gst_dmabuf_memory_get_fd (mem);
294*4882a593Smuzhiyun     }
295*4882a593Smuzhiyun   }
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun   if (src_info.fd <= 0) {
298*4882a593Smuzhiyun     gst_buffer_map (inbuf, &mapinfo, GST_MAP_READ);
299*4882a593Smuzhiyun     src_info.virAddr = mapinfo.data;
300*4882a593Smuzhiyun   }
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun   dst_info.fd = gst_dmabuf_memory_get_fd (out_mem);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun   src_info.rotation = gst_mpp_rga_get_rotation (rotation);
305*4882a593Smuzhiyun   if (src_info.rotation < 0)
306*4882a593Smuzhiyun     return FALSE;
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun   ret = gst_mpp_rga_do_convert (&src_info, &dst_info);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun   gst_buffer_unmap (inbuf, &mapinfo);
311*4882a593Smuzhiyun   return ret;
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun gboolean
gst_mpp_rga_convert_from_mpp_frame(MppFrame * mframe,GstMemory * out_mem,GstVideoInfo * dst_vinfo,gint rotation)315*4882a593Smuzhiyun gst_mpp_rga_convert_from_mpp_frame (MppFrame * mframe,
316*4882a593Smuzhiyun     GstMemory * out_mem, GstVideoInfo * dst_vinfo, gint rotation)
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun   rga_info_t src_info = { 0, };
319*4882a593Smuzhiyun   rga_info_t dst_info = { 0, };
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun   if (!gst_mpp_rga_info_from_mpp_frame (&src_info, mframe))
322*4882a593Smuzhiyun     return FALSE;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun   if (!gst_mpp_rga_info_from_video_info (&dst_info, dst_vinfo))
325*4882a593Smuzhiyun     return FALSE;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun   dst_info.fd = gst_dmabuf_memory_get_fd (out_mem);
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun   src_info.rotation = gst_mpp_rga_get_rotation (rotation);
330*4882a593Smuzhiyun   if (src_info.rotation < 0)
331*4882a593Smuzhiyun     return FALSE;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun   return gst_mpp_rga_do_convert (&src_info, &dst_info);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun #endif
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun void
gst_mpp_video_info_update_format(GstVideoInfo * info,GstVideoFormat format,guint width,guint height)338*4882a593Smuzhiyun gst_mpp_video_info_update_format (GstVideoInfo * info, GstVideoFormat format,
339*4882a593Smuzhiyun     guint width, guint height)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun   GstCaps *caps;
342*4882a593Smuzhiyun   const gchar *fmt = gst_mpp_video_format_to_string (format);
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun   GST_DEBUG ("update format to %s (%dx%d)", fmt, width, height);
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun   if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_UNKNOWN) {
347*4882a593Smuzhiyun     gst_video_info_set_format (info, format, width, height);
348*4882a593Smuzhiyun     return;
349*4882a593Smuzhiyun   }
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun   caps = gst_video_info_to_caps (info);
352*4882a593Smuzhiyun   gst_caps_set_simple (caps, "format", G_TYPE_STRING, fmt,
353*4882a593Smuzhiyun       "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
354*4882a593Smuzhiyun   gst_video_info_from_caps (info, caps);
355*4882a593Smuzhiyun   gst_caps_unref (caps);
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun gboolean
gst_mpp_video_info_align(GstVideoInfo * info,gint hstride,gint vstride)359*4882a593Smuzhiyun gst_mpp_video_info_align (GstVideoInfo * info, gint hstride, gint vstride)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun   GstVideoAlignment align;
362*4882a593Smuzhiyun   guint stride;
363*4882a593Smuzhiyun   guint i;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun   if (!hstride)
366*4882a593Smuzhiyun     hstride = GST_MPP_ALIGN (GST_MPP_VIDEO_INFO_HSTRIDE (info));
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun   if (!vstride)
369*4882a593Smuzhiyun     vstride = GST_MPP_ALIGN (GST_MPP_VIDEO_INFO_VSTRIDE (info));
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun   GST_DEBUG ("aligning %dx%d to %dx%d", GST_VIDEO_INFO_WIDTH (info),
372*4882a593Smuzhiyun       GST_VIDEO_INFO_HEIGHT (info), hstride, vstride);
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun   gst_video_alignment_reset (&align);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun   /* Apply vstride */
377*4882a593Smuzhiyun   align.padding_bottom = vstride - GST_VIDEO_INFO_HEIGHT (info);
378*4882a593Smuzhiyun   if (!gst_video_info_align (info, &align))
379*4882a593Smuzhiyun     return FALSE;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun   /* Apply vstride for single-plane */
382*4882a593Smuzhiyun   if (GST_VIDEO_INFO_N_PLANES (info) == 1)
383*4882a593Smuzhiyun     GST_VIDEO_INFO_SIZE (info) =
384*4882a593Smuzhiyun         GST_VIDEO_INFO_PLANE_STRIDE (info, 0) * vstride;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun   if (GST_VIDEO_INFO_PLANE_STRIDE (info, 0) == hstride)
387*4882a593Smuzhiyun     return TRUE;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun   /* Apply hstride */
390*4882a593Smuzhiyun   stride = GST_VIDEO_INFO_PLANE_STRIDE (info, 0);
391*4882a593Smuzhiyun   for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
392*4882a593Smuzhiyun     GST_VIDEO_INFO_PLANE_STRIDE (info, i) =
393*4882a593Smuzhiyun         GST_VIDEO_INFO_PLANE_STRIDE (info, i) * hstride / stride;
394*4882a593Smuzhiyun     GST_VIDEO_INFO_PLANE_OFFSET (info, i) =
395*4882a593Smuzhiyun         GST_VIDEO_INFO_PLANE_OFFSET (info, i) / stride * hstride;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun     GST_DEBUG ("plane %d, stride %d, offset %" G_GSIZE_FORMAT, i,
398*4882a593Smuzhiyun         GST_VIDEO_INFO_PLANE_STRIDE (info, i),
399*4882a593Smuzhiyun         GST_VIDEO_INFO_PLANE_OFFSET (info, i));
400*4882a593Smuzhiyun   }
401*4882a593Smuzhiyun   GST_VIDEO_INFO_SIZE (info) = GST_VIDEO_INFO_SIZE (info) / stride * hstride;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun   GST_DEBUG ("aligned size %" G_GSIZE_FORMAT, GST_VIDEO_INFO_SIZE (info));
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun   return TRUE;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun guint
gst_mpp_get_pixel_stride(GstVideoInfo * info)409*4882a593Smuzhiyun gst_mpp_get_pixel_stride (GstVideoInfo * info)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun   GstVideoFormat gst_format = GST_VIDEO_INFO_FORMAT (info);
412*4882a593Smuzhiyun   struct gst_mpp_format *format = GST_MPP_GET_FORMAT (gst, gst_format);
413*4882a593Smuzhiyun   guint hstride = GST_MPP_VIDEO_INFO_HSTRIDE (info);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun   if (!format)
416*4882a593Smuzhiyun     return hstride;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun   return hstride / format->pixel_stride0;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun static gboolean
plugin_init(GstPlugin * plugin)422*4882a593Smuzhiyun plugin_init (GstPlugin * plugin)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun   GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "mpp", 0, "MPP");
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun   gst_mpp_h264_enc_register (plugin, GST_RANK_PRIMARY + 1);
427*4882a593Smuzhiyun   gst_mpp_h265_enc_register (plugin, GST_RANK_PRIMARY + 1);
428*4882a593Smuzhiyun   gst_mpp_vp8_enc_register (plugin, GST_RANK_PRIMARY + 1);
429*4882a593Smuzhiyun   gst_mpp_jpeg_enc_register (plugin, GST_RANK_PRIMARY + 1);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun   gst_mpp_video_dec_register (plugin, GST_RANK_PRIMARY + 1);
432*4882a593Smuzhiyun   gst_mpp_jpeg_dec_register (plugin, GST_RANK_PRIMARY + 1);
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun #ifdef USE_VPXALPHADEC
435*4882a593Smuzhiyun   gst_mpp_vpx_alpha_decode_bin_register (plugin,
436*4882a593Smuzhiyun       GST_RANK_PRIMARY + GST_MPP_ALPHA_DECODE_BIN_RANK_OFFSET);
437*4882a593Smuzhiyun #endif
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun   return TRUE;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
443*4882a593Smuzhiyun     GST_VERSION_MINOR,
444*4882a593Smuzhiyun     rockchipmpp,
445*4882a593Smuzhiyun     "Rockchip Mpp Video Plugin",
446*4882a593Smuzhiyun     plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
447