/*
* Copyright (c) 2018-2023, NVIDIA CORPORATION. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License, version 2.1, as published by the Free Software Foundation.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program. If not, see
* .
*/
#include
#include "renderer.h"
#include "context.h"
#if NV_VIDEO_SINKS_HAS_GL
#include "renderer_gl.h"
#endif
#define GST_CAT_DEFAULT gst_debug_nv_video_renderer
GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
G_DEFINE_ABSTRACT_TYPE (GstNvVideoRenderer, gst_nv_video_renderer,
GST_TYPE_OBJECT);
static void
gst_nv_video_renderer_init (GstNvVideoRenderer * renderer)
{
}
static void
gst_nv_video_renderer_class_init (GstNvVideoRendererClass * klass)
{
}
GstNvVideoRenderer *
gst_nv_video_renderer_new (GstNvVideoContext * context, const char *name)
{
GstNvVideoRenderer *renderer = NULL;
static gsize debug_init = 0;
if (g_once_init_enter (&debug_init)) {
GST_DEBUG_CATEGORY_INIT (gst_debug_nv_video_renderer, "nvvideorenderer", 0,
"nvvideorenderer");
g_once_init_leave (&debug_init, 1);
}
if (!name) {
GST_ERROR ("renderer name not valid");
}
#if NV_VIDEO_SINKS_HAS_GL
if (g_strstr_len (name, 2, "gl")) {
renderer = GST_NV_VIDEO_RENDERER (gst_nv_video_renderer_gl_new (context));
}
#endif
if (!renderer) {
GST_ERROR ("couldn't create renderer name = %s", name);
return NULL;
}
renderer->format = context->configured_info.finfo->format;
GST_DEBUG_OBJECT (renderer, "created %s renderer for context %" GST_PTR_FORMAT, name, context);
return renderer;
}
gboolean
gst_nv_video_renderer_cuda_init (GstNvVideoContext * context, GstNvVideoRenderer * renderer)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
return renderer_class->cuda_init (context, renderer);
}
void
gst_nv_video_renderer_cuda_cleanup (GstNvVideoContext * context, GstNvVideoRenderer * renderer)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
renderer_class->cuda_cleanup (context, renderer);
}
void
gst_nv_video_renderer_cleanup (GstNvVideoRenderer * renderer)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
renderer_class->cleanup (renderer);
}
gboolean
gst_nv_video_renderer_setup (GstNvVideoRenderer * renderer)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
return renderer_class->setup (renderer);
}
void
gst_nv_video_renderer_update_viewport (GstNvVideoRenderer * renderer, int width, int height)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
renderer_class->update_viewport (renderer, width, height);
}
gboolean
gst_nv_video_renderer_fill_texture (GstNvVideoContext *context, GstNvVideoRenderer * renderer, GstBuffer * buf)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
return renderer_class->fill_texture (context, renderer, buf);
}
gboolean
gst_nv_video_renderer_cuda_buffer_copy (GstNvVideoContext *context, GstNvVideoRenderer * renderer, GstBuffer * buf)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
return renderer_class->cuda_buffer_copy (context, renderer, buf);
}
gboolean
gst_nv_video_renderer_draw_2D_Texture (GstNvVideoRenderer * renderer)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
return renderer_class->draw_2D_Texture (renderer);
}
gboolean
gst_nv_video_renderer_draw_eglimage (GstNvVideoRenderer * renderer, void * image)
{
GstNvVideoRendererClass *renderer_class;
renderer_class = GST_NV_VIDEO_RENDERER_GET_CLASS (renderer);
return renderer_class->draw_eglimage (renderer, image);
}