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);
242 #ifndef DRM_FORMAT_R8
243 static 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);