12 #include "libavutil/hwcontext_drm.h"
15 #define LOC QString("EGLDMABUF: ")
31 return (Context->
IsEGL() && Context->hasExtension(
"GL_OES_EGL_image") &&
37 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"DRM frame: Layers %1 Objects %2")
38 .arg(Desc->nb_layers).arg(Desc->nb_objects));
39 for (
int i = 0; i < Desc->nb_layers; ++i)
41 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"Layer %1: Format %2 Planes %3")
42 .arg(i).arg(
fourcc_str(
static_cast<int>(Desc->layers[i].format)))
43 .arg(Desc->layers[i].nb_planes));
44 for (
int j = 0; j < Desc->layers[i].nb_planes; ++j)
46 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
" Plane %1: Index %2 Offset %3 Pitch %4")
47 .arg(j).arg(Desc->layers[i].planes[j].object_index)
48 .arg(Desc->layers[i].planes[j].offset).arg(Desc->layers[i].planes[j].pitch));
51 for (
int i = 0; i < Desc->nb_objects; ++i)
52 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"Object: %1 FD %2 Mods 0x%3")
53 .arg(i).arg(Desc->objects[i].fd).arg(Desc->objects[i].format_modifier, 0 , 16));
65 Frame->m_alreadyDeinterlaced =
true;
66 std::vector<MythVideoTextureOpenGL*> result;
69 std::vector<QSize> sizes;
71 sizes.emplace_back(
Frame->m_width, frameheight);
72 std::vector<MythVideoTextureOpenGL*> textures =
81 textures[0]->m_allowGLSLDeint =
false;
84 switch (
Frame->m_colorspace)
86 case AVCOL_SPC_BT470BG:
87 case AVCOL_SPC_SMPTE170M:
88 case AVCOL_SPC_SMPTE240M:
91 case AVCOL_SPC_BT2020_CL:
92 case AVCOL_SPC_BT2020_NCL:
96 if (
Frame->m_width < 1280)
101 static constexpr std::array<EGLint,4> kPlaneFd
104 static constexpr std::array<EGLint,4> kPlaneOffset
107 static constexpr std::array<EGLint,4> kPlanePitch
110 static constexpr std::array<EGLint,4> kPlaneModlo
113 static constexpr std::array<EGLint,4> kPlaneModhi
117 AVDRMLayerDescriptor* layer = &Desc->layers[0];
119 QVector<EGLint> attribs = {
121 EGL_WIDTH,
Frame->m_width,
122 EGL_HEIGHT, frameheight,
129 for (
int plane = 0; plane < layer->nb_planes; ++plane)
131 AVDRMPlaneDescriptor* drmplane = &layer->planes[plane];
132 ptrdiff_t pitch = drmplane->pitch;
133 ptrdiff_t offset = drmplane->offset;
140 attribs << kPlaneFd[plane] << Desc->objects[drmplane->object_index].fd
141 << kPlaneOffset[plane] <<
static_cast<EGLint
>(offset)
142 << kPlanePitch[plane] <<
static_cast<EGLint
>(pitch);
143 if (
m_useModifiers && (Desc->objects[drmplane->object_index].format_modifier != 0 ))
145 attribs << kPlaneModlo[plane]
146 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier & 0xffffffff)
147 << kPlaneModhi[plane]
148 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier >> 32);
157 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No EGLImage '%1'").arg(Context->
GetEGLError()));
166 Context->glBindTexture(texture->
m_target, 0);
167 texture->
m_data =
static_cast<unsigned char *
>(image);
168 result.push_back(texture);
183 std::vector<QSize> sizes;
184 for (
int plane = 0 ; plane < Desc->nb_layers; ++plane)
186 int width =
Frame->m_width >> ((plane > 0) ? 1 : 0);
187 int height =
Frame->m_height >> ((plane > 0) ? 1 : 0);
188 sizes.emplace_back(width, height);
192 std::vector<MythVideoTextureOpenGL*> result =
194 QOpenGLTexture::Target2D);
198 for (
uint plane = 0; plane < result.size(); ++plane)
200 result[plane]->m_allowGLSLDeint =
true;
201 AVDRMLayerDescriptor* layer = &Desc->layers[plane];
202 AVDRMPlaneDescriptor* drmplane = &layer->planes[0];
203 QVector<EGLint> attribs = {
205 EGL_WIDTH, result[plane]->m_size.width(),
206 EGL_HEIGHT, result[plane]->m_size.height(),
212 if (
m_useModifiers && (Desc->objects[drmplane->object_index].format_modifier != 0 ))
215 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier & 0xffffffff)
217 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier >> 32);
226 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No EGLImage for plane %1 %2")
232 Context->glBindTexture(result[plane]->m_target, result[plane]->m_textureId);
234 Context->glBindTexture(result[plane]->m_target, 0);
235 result[plane]->m_data =
static_cast<unsigned char *
>(image);
241 #ifndef DRM_FORMAT_R8
242 static constexpr uint32_t
MKTAG2(uint8_t a, uint8_t b, uint8_t c, uint8_t
d)
243 {
return ((
static_cast<uint32_t
>(a) ) |
244 (
static_cast<uint32_t
>(b) << 8) |
245 (
static_cast<uint32_t
>(c) << 16) |
246 (
static_cast<uint32_t
>(
d) << 24)); }
280 AVDRMLayerDescriptor* layer = &Desc->layers[0];
281 std::vector<QSize> sizes;
282 for (
int plane = 0 ; plane < layer->nb_planes; ++plane)
284 int width =
Frame->m_width >> ((plane > 0) ? 1 : 0);
285 int height =
Frame->m_height >> ((plane > 0) ? 1 : 0);
286 sizes.emplace_back(width, height);
306 std::vector<MythVideoTextureOpenGL*> result =
308 QOpenGLTexture::Target2D);
312 for (
uint plane = 0; plane < result.size(); ++plane)
314 result[plane]->m_allowGLSLDeint =
true;
315 EGLint fourcc = fourcc1;
318 AVDRMPlaneDescriptor* drmplane = &layer->planes[plane];
319 QVector<EGLint> attribs = {
321 EGL_WIDTH, result[plane]->m_size.width(),
322 EGL_HEIGHT, result[plane]->m_size.height(),
328 if (
m_useModifiers && (Desc->objects[drmplane->object_index].format_modifier != 0 ))
331 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier & 0xffffffff)
333 <<
static_cast<EGLint
>(Desc->objects[drmplane->object_index].format_modifier >> 32);
342 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No EGLImage for plane %1 %2")
348 Context->glBindTexture(result[plane]->m_target, result[plane]->m_textureId);
350 Context->glBindTexture(result[plane]->m_target, 0);
351 result[plane]->m_data =
static_cast<unsigned char *
>(image);
358 std::vector<MythVideoTextureOpenGL *> &Textures)
360 for (
auto & texture : Textures)
364 texture->m_data =
nullptr;
365 if (texture->m_textureId)
366 Context->glDeleteTextures(1, &texture->m_textureId);
378 std::vector<MythVideoTextureOpenGL*> result;
379 if (!Desc || !Context || !
Frame)
385 uint numlayers =
static_cast<uint>(Desc->nb_layers);