You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
6.3 KiB
182 lines
6.3 KiB
/*****************************************************************************
|
|
* vlc_opengl_interop.h: VLC picture_t to GL texture API
|
|
*****************************************************************************
|
|
* Copyright (C) 2019-2022 Videolabs
|
|
*
|
|
* This program 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.
|
|
*
|
|
* This program 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, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
#ifndef VLC_GL_INTEROP_H
|
|
#define VLC_GL_INTEROP_H 1
|
|
|
|
#include <vlc_es.h>
|
|
#include <vlc_picture.h>
|
|
|
|
typedef struct vlc_gl_t vlc_gl_t;
|
|
struct vlc_gl_interop;
|
|
struct vlc_video_context;
|
|
|
|
struct vlc_gl_interop_ops {
|
|
/**
|
|
* Callback to allocate data for bound textures
|
|
*
|
|
* This function pointer can be NULL. Software converters should call
|
|
* glTexImage2D() to allocate textures data (it will be deallocated by the
|
|
* caller when calling glDeleteTextures()). Won't be called if
|
|
* handle_texs_gen is true.
|
|
*
|
|
* \param interop the OpenGL interop
|
|
* \param textures array of textures to bind (one per plane)
|
|
* \param tex_width array of tex width (one per plane)
|
|
* \param tex_height array of tex height (one per plane)
|
|
* \return VLC_SUCCESS or a VLC error
|
|
*/
|
|
int (*allocate_textures)(const struct vlc_gl_interop *interop,
|
|
uint32_t textures[], const int32_t tex_width[],
|
|
const int32_t tex_height[]);
|
|
|
|
/**
|
|
* Callback to deallocate data for bound texture
|
|
*
|
|
* This function pointer can be NULL. it will be called before calling glDeleteTextures
|
|
*
|
|
* \param interop the OpenGL interop
|
|
* \param textures array of textures to bind (one per plane)
|
|
*/
|
|
void (*deallocate_textures)(const struct vlc_gl_interop *interop, uint32_t textures[]);
|
|
|
|
/**
|
|
* Callback to update a picture
|
|
*
|
|
* This function pointer cannot be NULL. The implementation should upload
|
|
* every planes of the picture.
|
|
*
|
|
* \param interop the OpenGL interop
|
|
* \param textures array of textures to bind (one per plane)
|
|
* \param tex_width array of tex width (one per plane)
|
|
* \param tex_height array of tex height (one per plane)
|
|
* \param pic picture to update
|
|
* \param plane_offset offsets of each picture planes to read data from
|
|
* (one per plane, can be NULL)
|
|
* \return VLC_SUCCESS or a VLC error
|
|
*/
|
|
int (*update_textures)(const struct vlc_gl_interop *interop,
|
|
uint32_t textures[], const int32_t tex_width[],
|
|
const int32_t tex_height[], picture_t *pic,
|
|
const size_t plane_offsets[]);
|
|
|
|
/**
|
|
* Callback to retrieve the transform matrix to apply to texture coordinates
|
|
*
|
|
* This function pointer can be NULL. If it is set, it may return NULL.
|
|
*
|
|
* Otherwise, it must return a 2x3 matrix, as an array of 6 floats in
|
|
* column-major order.
|
|
*
|
|
* This transform matrix maps 2D homogeneous texture coordinates of the
|
|
* form (s, t, 1) with s and t in the inclusive range [0, 1] to the
|
|
* texture coordinate that should be used to sample that location from the
|
|
* texture.
|
|
*
|
|
* The returned pointer is owned by the converter module, and must not be
|
|
* freed before the module is closed.
|
|
*
|
|
* \param interop the OpenGL interop
|
|
* \return a 2x3 transformation matrix (possibly NULL)
|
|
*/
|
|
const float *
|
|
(*get_transform_matrix)(const struct vlc_gl_interop *interop);
|
|
|
|
/**
|
|
* Called before the interop is destroyed
|
|
*
|
|
* This function pointer can be NULL.
|
|
*
|
|
* \param interop the OpenGL interop
|
|
*/
|
|
void (*close)(struct vlc_gl_interop *interop);
|
|
};
|
|
|
|
struct vlc_gl_interop {
|
|
vlc_object_t obj;
|
|
module_t *module;
|
|
|
|
vlc_gl_t *gl;
|
|
uint32_t tex_target;
|
|
|
|
/* Input format
|
|
*
|
|
* This is the format of the pictures received from the core.
|
|
*
|
|
* It can be modified from the module open function to request changes from
|
|
* the core.
|
|
*/
|
|
video_format_t fmt_in;
|
|
|
|
/* Output format
|
|
*
|
|
* This is the format of the pictures exposed by the interop to the sampler.
|
|
*
|
|
* It may differ from the input format:
|
|
* - the orientation may be vertically flipped
|
|
* - the chroma contains the "software" chroma if the input chroma is opaque
|
|
* - the chroma may also be changed internally to a fallback (see
|
|
* opengl_interop_generic_init())
|
|
*/
|
|
video_format_t fmt_out;
|
|
|
|
/* Pointer to decoder video context, set by the caller (can be NULL) */
|
|
struct vlc_video_context *vctx;
|
|
|
|
/* Set to true if textures are generated from pf_update() */
|
|
bool handle_texs_gen;
|
|
|
|
/* Initialized by the interop */
|
|
struct vlc_gl_tex_cfg {
|
|
/*
|
|
* Texture scale factor, cannot be 0.
|
|
* In 4:2:0, 1/1 for the Y texture and 1/2 for the UV texture(s)
|
|
*/
|
|
vlc_rational_t w;
|
|
vlc_rational_t h;
|
|
|
|
int32_t internal;
|
|
uint32_t format;
|
|
uint32_t type;
|
|
} texs[PICTURE_PLANE_MAX];
|
|
unsigned tex_count;
|
|
|
|
void *priv;
|
|
const struct vlc_gl_interop_ops *ops;
|
|
|
|
/* This avoids each module to link against GetTexFormatSize() directly. */
|
|
int
|
|
(*get_tex_format_size)(struct vlc_gl_interop *interop, uint32_t target,
|
|
uint32_t format, int32_t internal, uint32_t type);
|
|
};
|
|
|
|
/* Activation function for the OpenGL interop implementations. */
|
|
typedef int (*vlc_gl_interop_probe)(struct vlc_gl_interop *interop);
|
|
|
|
static inline int
|
|
vlc_gl_interop_GetTexFormatSize(struct vlc_gl_interop *interop, uint32_t target,
|
|
uint32_t format, int32_t internal,
|
|
uint32_t type)
|
|
{
|
|
return interop->get_tex_format_size(interop, target, format, internal,
|
|
type);
|
|
}
|
|
|
|
#endif
|
|
|