13#include "libavutil/hwcontext_drm.h"
16#define LOC QString("EGLDMABUF: ")
32 return (Context->
IsEGL() && Context->hasExtension(
"GL_OES_EGL_image") &&
38 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"DRM frame: Layers %1 Objects %2")
39 .arg(Desc->nb_layers).arg(Desc->nb_objects));
40 for (
int i = 0; i < Desc->nb_layers; ++i)
42 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"Layer %1: Format %2 Planes %3")
43 .arg(i).arg(
fourcc_str(
static_cast<int>(Desc->layers[i].format)))
44 .arg(Desc->layers[i].nb_planes));
45 for (
int j = 0; j < Desc->layers[i].nb_planes; ++j)
47 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
" Plane %1: Index %2 Offset %3 Pitch %4")
48 .arg(j).arg(Desc->layers[i].planes[j].object_index)
49 .arg(Desc->layers[i].planes[j].offset).arg(Desc->layers[i].planes[j].pitch));
52 for (
int i = 0; i < Desc->nb_objects; ++i)
53 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"Object: %1 FD %2 Mods 0x%3")
54 .arg(i).arg(Desc->objects[i].fd).arg(Desc->objects[i].format_modifier, 0 , 16));
66 Frame->m_alreadyDeinterlaced =
true;
67 std::vector<MythVideoTextureOpenGL*> result;
70 std::vector<QSize> sizes;
72 sizes.emplace_back(
Frame->m_width, frameheight);
73 std::vector<MythVideoTextureOpenGL*> textures =
82 textures[0]->m_allowGLSLDeint =
false;
85 switch (
Frame->m_colorspace)
87 case AVCOL_SPC_BT470BG:
88 case AVCOL_SPC_SMPTE170M:
89 case AVCOL_SPC_SMPTE240M:
92 case AVCOL_SPC_BT2020_CL:
93 case AVCOL_SPC_BT2020_NCL:
97 if (
Frame->m_width < 1280)
102 static constexpr std::array<EGLint,4> kPlaneFd
105 static constexpr std::array<EGLint,4> kPlaneOffset
108 static constexpr std::array<EGLint,4> kPlanePitch
111 static constexpr std::array<EGLint,4> kPlaneModlo
114 static constexpr std::array<EGLint,4> kPlaneModhi
118 AVDRMLayerDescriptor* layer = &Desc->layers[0];
120 QVector<EGLint> attribs = {
122 EGL_WIDTH,
Frame->m_width,
123 EGL_HEIGHT, frameheight,
130 for (
int plane = 0; plane < layer->nb_planes; ++plane)
132 AVDRMPlaneDescriptor* drmplane = &layer->planes[plane];
133 ptrdiff_t pitch = drmplane->pitch;
134 ptrdiff_t offset = drmplane->offset;
141 attribs << kPlaneFd[plane] << Desc->objects[drmplane->object_index].fd
142 << kPlaneOffset[plane] <<
static_cast<EGLint
>(offset)
143 << kPlanePitch[plane] <<
static_cast<EGLint
>(pitch);
144 if (
m_useModifiers && (Desc->objects[drmplane->object_index].format_modifier != 0 ))
146 attribs << kPlaneModlo[plane]
147 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier & 0xffffffff)
148 << kPlaneModhi[plane]
149 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier >> 32);
158 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No EGLImage '%1'").arg(Context->
GetEGLError()));
167 Context->glBindTexture(texture->
m_target, 0);
168 texture->
m_data =
static_cast<unsigned char *
>(image);
169 result.push_back(texture);
184 std::vector<QSize> sizes;
185 for (
int plane = 0 ; plane < Desc->nb_layers; ++plane)
187 int width =
Frame->m_width >> ((plane > 0) ? 1 : 0);
188 int height =
Frame->m_height >> ((plane > 0) ? 1 : 0);
189 sizes.emplace_back(width, height);
193 std::vector<MythVideoTextureOpenGL*> result =
195 QOpenGLTexture::Target2D);
199 for (
uint plane = 0; plane < result.size(); ++plane)
201 result[plane]->m_allowGLSLDeint =
true;
202 AVDRMLayerDescriptor* layer = &Desc->layers[plane];
203 AVDRMPlaneDescriptor* drmplane = &layer->planes[0];
204 QVector<EGLint> attribs = {
206 EGL_WIDTH, result[plane]->m_size.width(),
207 EGL_HEIGHT, result[plane]->m_size.height(),
213 if (
m_useModifiers && (Desc->objects[drmplane->object_index].format_modifier != 0 ))
216 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier & 0xffffffff)
218 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier >> 32);
227 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No EGLImage for plane %1 %2")
233 Context->glBindTexture(result[plane]->m_target, result[plane]->m_textureId);
235 Context->glBindTexture(result[plane]->m_target, 0);
236 result[plane]->m_data =
static_cast<unsigned char *
>(image);
243static constexpr uint32_t
MKTAG2(uint8_t a, uint8_t b, uint8_t c, uint8_t
d)
244{
return ((
static_cast<uint32_t
>(a) ) |
245 (
static_cast<uint32_t
>(b) << 8) |
246 (
static_cast<uint32_t
>(c) << 16) |
247 (
static_cast<uint32_t
>(
d) << 24)); }
281 AVDRMLayerDescriptor* layer = &Desc->layers[0];
282 std::vector<QSize> sizes;
283 for (
int plane = 0 ; plane < layer->nb_planes; ++plane)
285 int width =
Frame->m_width >> ((plane > 0) ? 1 : 0);
286 int height =
Frame->m_height >> ((plane > 0) ? 1 : 0);
287 sizes.emplace_back(width, height);
307 std::vector<MythVideoTextureOpenGL*> result =
309 QOpenGLTexture::Target2D);
313 for (
uint plane = 0; plane < result.size(); ++plane)
315 result[plane]->m_allowGLSLDeint =
true;
316 EGLint fourcc = fourcc1;
319 AVDRMPlaneDescriptor* drmplane = &layer->planes[plane];
320 QVector<EGLint> attribs = {
322 EGL_WIDTH, result[plane]->m_size.width(),
323 EGL_HEIGHT, result[plane]->m_size.height(),
329 if (
m_useModifiers && (Desc->objects[drmplane->object_index].format_modifier != 0 ))
332 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier & 0xffffffff)
334 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier >> 32);
343 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No EGLImage for plane %1 %2")
349 Context->glBindTexture(result[plane]->m_target, result[plane]->m_textureId);
351 Context->glBindTexture(result[plane]->m_target, 0);
352 result[plane]->m_data =
static_cast<unsigned char *
>(image);
359 std::vector<MythVideoTextureOpenGL *> &Textures)
361 for (
auto & texture : Textures)
365 texture->m_data =
nullptr;
366 if (texture->m_textureId)
367 Context->glDeleteTextures(1, &texture->m_textureId);
379 std::vector<MythVideoTextureOpenGL*> result;
380 if (!Desc || !Context || !
Frame)
386 uint numlayers =
static_cast<uint>(Desc->nb_layers);
static VideoFrameType PixelFormatToFrameType(AVPixelFormat Fmt)
MythEGLDMABUF(MythRenderOpenGL *Context)
static void ClearDMATextures(MythRenderOpenGL *Context, std::vector< MythVideoTextureOpenGL * > &Textures)
static bool HaveDMABuf(MythRenderOpenGL *Context)
std::vector< MythVideoTextureOpenGL * > CreateSeparate2(AVDRMFrameDescriptor *Desc, MythRenderOpenGL *Context, MythVideoFrame *Frame) const
Create multiple textures that represent the planes for the given AVDRMFrameDescriptor.
std::vector< MythVideoTextureOpenGL * > CreateComposed(AVDRMFrameDescriptor *Desc, MythRenderOpenGL *Context, MythVideoFrame *Frame, FrameScanType Scan) const
Create a single RGBA32 texture using the provided AVDRMFramDescriptor.
std::vector< MythVideoTextureOpenGL * > CreateSeparate(AVDRMFrameDescriptor *Desc, MythRenderOpenGL *Context, MythVideoFrame *Frame) const
Create multiple textures that represent the planes for the given AVDRMFrameDescriptor.
std::vector< MythVideoTextureOpenGL * > CreateTextures(AVDRMFrameDescriptor *Desc, MythRenderOpenGL *Context, MythVideoFrame *Frame, bool UseSeparate, FrameScanType Scan=kScan_Progressive)
void * GetEGLDisplay(void)
void eglImageTargetTexture2DOES(GLenum Target, void *Image)
bool HasEGLExtension(QString Extension)
void eglDestroyImageKHR(void *Disp, void *Image)
static qint32 GetEGLError(void)
void * eglCreateImageKHR(void *Disp, void *Context, unsigned int Target, void *Buffer, const int32_t *Attributes)
static std::vector< MythVideoTextureOpenGL * > CreateTextures(MythRenderOpenGL *Context, VideoFrameType Type, VideoFrameType Format, std::vector< QSize > Sizes, GLenum Target=QOpenGLTexture::Target2D)
Create a set of textures suitable for the given Type and Format.
static void DeleteTexture(MythRenderOpenGL *Context, MythVideoTextureOpenGL *Texture)
static const char * fourcc_str(int i)
static const iso6937table * d
static constexpr uint16_t EGL_YUV_CHROMA_SITING_0_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE1_FD_EXT
static constexpr uint16_t EGL_ITU_REC601_EXT
static constexpr uint16_t EGL_SAMPLE_RANGE_HINT_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE1_PITCH_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE3_PITCH_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE0_PITCH_EXT
static constexpr uint16_t EGL_YUV_COLOR_SPACE_HINT_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE2_FD_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE3_FD_EXT
static constexpr uint16_t EGL_LINUX_DMA_BUF_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE3_OFFSET_EXT
static constexpr uint16_t EGL_YUV_NARROW_RANGE_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE2_PITCH_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT
static constexpr uint16_t EGL_ITU_REC2020_EXT
static constexpr uint16_t EGL_ITU_REC709_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE0_FD_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE2_OFFSET_EXT
static constexpr uint16_t EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT
static constexpr uint16_t EGL_LINUX_DRM_FOURCC_EXT
static constexpr uint16_t EGL_YUV_FULL_RANGE_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE1_OFFSET_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT
static constexpr uint16_t EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT
static constexpr uint16_t EGL_DMA_BUF_PLANE0_OFFSET_EXT
static constexpr uint32_t DRM_FORMAT_P010
static constexpr uint32_t DRM_FORMAT_GR32
static constexpr uint32_t DRM_FORMAT_NV12
static constexpr uint32_t DRM_FORMAT_NV21
static constexpr uint32_t DRM_FORMAT_R8
static constexpr uint32_t MKTAG2(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
static constexpr uint32_t DRM_FORMAT_GR88
static void DebugDRMFrame(AVDRMFrameDescriptor *Desc)
static constexpr uint32_t DRM_FORMAT_YVU420
static constexpr uint32_t DRM_FORMAT_R16
static constexpr uint32_t DRM_FORMAT_YUV420
static bool VERBOSE_LEVEL_CHECK(uint64_t mask, LogLevel_t level)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
#define GL_TEXTURE_EXTERNAL_OES