MythTV master
mythvideotextureopengl.cpp
Go to the documentation of this file.
1// MythTV
4
5#define LOC QString("MythVidTex: ")
6
8 : MythGLTexture(Texture)
9{
10}
11
13 : MythGLTexture(Texture)
14{
15}
16
18{
19 if (!Context || !Texture)
20 return;
21
22 OpenGLLocker locker(Context);
23 delete Texture->m_copyContext;
24 delete Texture->m_texture;
25 delete [] Texture->m_data;
26 delete Texture->m_vbo;
27
28 delete Texture;
29}
30
31void MythVideoTextureOpenGL::DeleteTextures(MythRenderOpenGL *Context, std::vector<MythVideoTextureOpenGL *> &Textures)
32{
33 if (!Context || Textures.empty())
34 return;
35 for (auto & Texture : Textures)
36 DeleteTexture(Context, Texture);
37 Textures.clear();
38}
39
41 const std::vector<MythVideoTextureOpenGL *> &Textures,
42 QOpenGLTexture::Filter Filter,
43 QOpenGLTexture::WrapMode Wrap)
44{
45 for (uint i = 0; (i < Textures.size()) && Context; i++)
46 {
47 Textures[i]->m_filter = Filter;
48 Context->SetTextureFilters(reinterpret_cast<MythGLTexture*>(Textures[i]), Filter, Wrap);
49 }
50}
51
57std::vector<MythVideoTextureOpenGL*> MythVideoTextureOpenGL::CreateTextures(MythRenderOpenGL *Context,
58 VideoFrameType Type,
60 std::vector<QSize> Sizes,
61 GLenum Target)
62{
63 std::vector<MythVideoTextureOpenGL*> result;
64 if (!Context || Sizes.empty())
65 return result;
66 if (Sizes[0].isEmpty())
67 return result;
68
69 OpenGLLocker locker(Context);
70
71 // Hardware frames
73 return CreateHardwareTextures(Context, Type, Format, Sizes, Target);
74
75 return CreateSoftwareTextures(Context, Type, Format, Sizes, Target);
76}
77
85std::vector<MythVideoTextureOpenGL*> MythVideoTextureOpenGL::CreateHardwareTextures(MythRenderOpenGL *Context,
86 VideoFrameType Type,
88 std::vector<QSize> Sizes,
89 GLenum Target)
90{
91 std::vector<MythVideoTextureOpenGL*> result;
92
94 if (count < 1)
95 {
96 LOG(VB_GENERAL, LOG_ERR, LOC + "Invalid hardware frame format");
97 return result;
98 }
99
100 if (count != Sizes.size())
101 {
102 LOG(VB_GENERAL, LOG_ERR, LOC + "Inconsistent plane count");
103 return result;
104 }
105
106 for (uint plane = 0; plane < count; ++plane)
107 {
108 GLuint textureid = 0;
109 Context->glGenTextures(1, &textureid);
110 if (!textureid)
111 continue;
112
113 auto* texture = new MythVideoTextureOpenGL(textureid);
114 texture->m_frameType = Type;
115 texture->m_frameFormat = Format;
116 texture->m_plane = plane;
117 texture->m_planeCount = count;
118 texture->m_target = Target;
119 texture->m_size = Sizes[plane];
120 texture->m_totalSize = Context->GetTextureSize(Sizes[plane], texture->m_target != QOpenGLTexture::TargetRectangle);
121 texture->m_vbo = Context->CreateVBO(static_cast<int>(MythRenderOpenGL::kVertexSize));
122 result.push_back(texture);
123 }
124
125 SetTextureFilters(Context, result, QOpenGLTexture::Linear);
126 return result;
127}
128
133std::vector<MythVideoTextureOpenGL*> MythVideoTextureOpenGL::CreateSoftwareTextures(MythRenderOpenGL *Context,
134 VideoFrameType Type,
136 std::vector<QSize> Sizes,
137 GLenum Target)
138{
139 std::vector<MythVideoTextureOpenGL*> result;
140
142 if (count < 1)
143 {
144 LOG(VB_GENERAL, LOG_ERR, LOC + "Invalid software frame format");
145 return result;
146 }
147
148 // OpenGL ES 2.0 has very limited texture format support
149 bool legacy = (Context->GetExtraFeatures() & kGLLegacyTextures) != 0;
150 // GLES3 supports GL_RED etc and 16bit formats but there are no unsigned,
151 // normalised 16bit integer formats. So we must use unsigned integer formats
152 // for 10bit video textures which force:-
153 // - only nearest texture filtering - so we must use the resize stage
154 // - no GLSL mix method for uint/uvec4
155 // - must use unsigned samplers in the shaders - and convert uint to normalised float as necessary
156 // - need to use GLSL ES 3.00 - which means new/updated shaders
157 bool gles3 = Context->isOpenGLES() && Context->format().majorVersion() > 2;
158 QOpenGLTexture::PixelFormat r8pixelfmtnorm = QOpenGLTexture::Red;
159 QOpenGLTexture::PixelFormat r8pixelfmtuint = QOpenGLTexture::Red;
160 QOpenGLTexture::PixelFormat rg8pixelfmtnorm = QOpenGLTexture::RG;
161 QOpenGLTexture::PixelFormat rg8pixelfmtuint = QOpenGLTexture::RG;
162 QOpenGLTexture::TextureFormat r8internalfmt = QOpenGLTexture::R8_UNorm;
163 QOpenGLTexture::TextureFormat r16internalfmt = QOpenGLTexture::R16_UNorm;
164 QOpenGLTexture::TextureFormat rg8internalfmt = QOpenGLTexture::RG8_UNorm;
165 QOpenGLTexture::TextureFormat rg16internalfmt = QOpenGLTexture::RG16_UNorm;
166
167 if (gles3)
168 {
169 r8pixelfmtuint = QOpenGLTexture::Red_Integer;
170 rg8pixelfmtuint = QOpenGLTexture::RG_Integer;
171 r16internalfmt = QOpenGLTexture::R16U;
172 rg16internalfmt = QOpenGLTexture::RG16U;
173 }
174 else if (legacy)
175 {
176 r8pixelfmtnorm = QOpenGLTexture::Luminance;
177 r8internalfmt = QOpenGLTexture::LuminanceFormat;
178 }
179
180 for (uint plane = 0; plane < count; ++plane)
181 {
182 QSize size = Sizes[0];
183 MythVideoTextureOpenGL* texture = nullptr;
184 switch (Format)
185 {
186 case FMT_YV12:
187 if (plane > 0)
188 size = QSize(size.width() >> 1, size.height() >> 1);
189 texture = CreateTexture(Context, size, Target,
190 QOpenGLTexture::UInt8, r8pixelfmtnorm, r8internalfmt);
191 break;
192 case FMT_YUV420P9:
193 case FMT_YUV420P10:
194 case FMT_YUV420P12:
195 case FMT_YUV420P14:
196 case FMT_YUV420P16:
197 if (plane > 0)
198 size = QSize(size.width() >> 1, size.height() >> 1);
199 texture = CreateTexture(Context, size, Target,
200 QOpenGLTexture::UInt16, r8pixelfmtuint, r16internalfmt);
201 break;
202 case FMT_YUY2:
203 size.setWidth(size.width() >> 1);
204 texture = CreateTexture(Context, size, Target);
205 break;
206 case FMT_NV12:
207 if (plane == 0)
208 {
209 texture = CreateTexture(Context, size, Target,
210 QOpenGLTexture::UInt8, r8pixelfmtnorm, r8internalfmt);
211 }
212 else
213 {
214 size = QSize(size.width() >> 1, size.height() >> 1);
215 texture = CreateTexture(Context, size, Target,
216 QOpenGLTexture::UInt8, rg8pixelfmtnorm, rg8internalfmt);
217 }
218 break;
219 case FMT_P010:
220 case FMT_P016:
221 if (plane == 0)
222 {
223 texture = CreateTexture(Context, size, Target,
224 QOpenGLTexture::UInt16, r8pixelfmtuint, r16internalfmt);
225 }
226 else
227 {
228 size = QSize(size.width() >> 1, size.height() >> 1);
229 texture = CreateTexture(Context, size, Target,
230 QOpenGLTexture::UInt16, rg8pixelfmtuint, rg16internalfmt);
231 }
232 break;
233 case FMT_YUV422P:
234 if (plane > 0)
235 size = QSize(size.width() >> 1, size.height());
236 texture = CreateTexture(Context, size, Target,
237 QOpenGLTexture::UInt8, r8pixelfmtnorm, r8internalfmt);
238 break;
239 case FMT_YUV422P9:
240 case FMT_YUV422P10:
241 case FMT_YUV422P12:
242 case FMT_YUV422P14:
243 case FMT_YUV422P16:
244 if (plane > 0)
245 size = QSize(size.width() >> 1, size.height());
246 texture = CreateTexture(Context, size, Target,
247 QOpenGLTexture::UInt16, r8pixelfmtuint, r16internalfmt);
248 break;
249 case FMT_YUV444P:
250 texture = CreateTexture(Context, size, Target,
251 QOpenGLTexture::UInt8, r8pixelfmtnorm, r8internalfmt);
252 break;
253 case FMT_YUV444P9:
254 case FMT_YUV444P10:
255 case FMT_YUV444P12:
256 case FMT_YUV444P14:
257 case FMT_YUV444P16:
258 texture = CreateTexture(Context, size, Target,
259 QOpenGLTexture::UInt16, r8pixelfmtuint, r16internalfmt);
260 break;
261 default: break;
262 }
263 if (texture)
264 {
265 texture->m_plane = plane;
266 texture->m_planeCount = count;
267 texture->m_frameType = Type;
268 texture->m_frameFormat = Format;
269 result.push_back(texture);
270 }
271 }
272
273 if (result.size() != count)
274 LOG(VB_GENERAL, LOG_ERR, LOC + QString("Failed to create all textures: %1 < %2")
275 .arg(result.size()).arg(count));
276 return result;
277}
278
282 const MythVideoFrame *Frame,
283 const std::vector<MythVideoTextureOpenGL*> &Textures)
284{
285 if (!Context || !Frame || Textures.empty())
286 {
287 LOG(VB_GENERAL, LOG_ERR, LOC + QString("Texture error: Context %1 Frame %2 Textures %3")
288 .arg(Context != nullptr).arg(Frame != nullptr).arg(Textures.size()));
289 return;
290 }
291
292 if (Frame->m_type != Textures[0]->m_frameType)
293 {
294 LOG(VB_GENERAL, LOG_ERR, LOC + "Inconsistent video and texture frame types");
295 return;
296 }
297
298 uint count = MythVideoFrame::GetNumPlanes(Textures[0]->m_frameFormat);
299 if (!count || (count != Textures.size()))
300 {
301 LOG(VB_GENERAL, LOG_ERR, LOC + "Invalid software frame type");
302 return;
303 }
304
305 OpenGLLocker locker(Context);
306
307 for (uint i = 0; i < count; ++i)
308 {
309 MythVideoTextureOpenGL *texture = Textures[i];
310 if (!texture)
311 continue;
312 if (!texture->m_texture)
313 continue;
314
315 if (i != texture->m_plane)
316 {
317 LOG(VB_GENERAL, LOG_ERR, LOC + "Inconsistent plane numbering");
318 continue;
319 }
320
321 switch (texture->m_frameType)
322 {
323 case FMT_YV12:
324 {
325 switch (texture->m_frameFormat)
326 {
327 case FMT_YV12: YV12ToYV12(Context, Frame, texture, i); break;
328 case FMT_YUY2: YV12ToYUYV(Frame, texture); break;
329 default: break;
330 }
331 break;
332 }
333 case FMT_YUV420P9:
334 case FMT_YUV420P10:
335 case FMT_YUV420P12:
336 case FMT_YUV420P14:
337 case FMT_YUV420P16:
338 {
339 switch (texture->m_frameFormat)
340 {
341 case FMT_YUV420P9:
342 case FMT_YUV420P10:
343 case FMT_YUV420P12:
344 case FMT_YUV420P14:
345 case FMT_YUV420P16: YV12ToYV12(Context, Frame, texture, i); break;
346 default: break;
347 }
348 break;
349 }
350 case FMT_NV12:
351 {
352 switch (texture->m_frameFormat)
353 {
354 case FMT_NV12: NV12ToNV12(Context, Frame, texture, i); break;
355 default: break;
356 }
357 break;
358 }
359 case FMT_P010:
360 case FMT_P016:
361 {
362 switch (texture->m_frameFormat)
363 {
364 case FMT_P010:
365 case FMT_P016: NV12ToNV12(Context, Frame, texture, i); break;
366 default: break;
367 }
368 break;
369 }
370 case FMT_YUV422P:
371 {
372 switch (texture->m_frameFormat)
373 {
374 case FMT_YUV422P: YV12ToYV12(Context, Frame, texture, i); break;
375 default: break;
376 }
377 break;
378 }
379 case FMT_YUV422P9:
380 case FMT_YUV422P10:
381 case FMT_YUV422P12:
382 case FMT_YUV422P14:
383 case FMT_YUV422P16:
384 {
385 switch (texture->m_frameFormat)
386 {
387 case FMT_YUV422P9:
388 case FMT_YUV422P10:
389 case FMT_YUV422P12:
390 case FMT_YUV422P14:
391 case FMT_YUV422P16: YV12ToYV12(Context, Frame, texture, i); break;
392 default: break;
393 }
394 break;
395 }
396 case FMT_YUV444P:
397 {
398 switch (texture->m_frameFormat)
399 {
400 case FMT_YUV444P: YV12ToYV12(Context, Frame, texture, i); break;
401 default: break;
402 }
403 break;
404 }
405 case FMT_YUV444P9:
406 case FMT_YUV444P10:
407 case FMT_YUV444P12:
408 case FMT_YUV444P14:
409 case FMT_YUV444P16:
410 {
411 switch (texture->m_frameFormat)
412 {
413 case FMT_YUV444P9:
414 case FMT_YUV444P10:
415 case FMT_YUV444P12:
416 case FMT_YUV444P14:
417 case FMT_YUV444P16: YV12ToYV12(Context, Frame, texture, i); break;
418 default: break;
419 }
420 break;
421 }
422 default: break;
423 }
424 }
425}
426
433 QSize Size,
434 GLenum Target,
435 QOpenGLTexture::PixelType PixelType,
436 QOpenGLTexture::PixelFormat PixelFormat,
437 QOpenGLTexture::TextureFormat Format,
438 QOpenGLTexture::Filter Filter,
439 QOpenGLTexture::WrapMode Wrap)
440{
441 if (!Context)
442 return nullptr;
443
444 OpenGLLocker locker(Context);
445
446 int datasize = MythRenderOpenGL::GetBufferSize(Size, PixelFormat, PixelType);
447 if (!datasize)
448 return nullptr;
449
450 auto *texture = new QOpenGLTexture(static_cast<QOpenGLTexture::Target>(Target));
451 texture->setAutoMipMapGenerationEnabled(false);
452 texture->setMipLevels(1);
453 texture->setSize(Size.width(), Size.height()); // this triggers creation
454 if (!texture->textureId())
455 {
456 LOG(VB_GENERAL, LOG_INFO, LOC + "Failed to create texture");
457 delete texture;
458 return nullptr;
459 }
460
461 if (Format == QOpenGLTexture::NoFormat)
462 {
463 if (Context->GetExtraFeatures() & kGLLegacyTextures)
464 Format = QOpenGLTexture::RGBAFormat;
465 else
466 Format = QOpenGLTexture::RGBA8_UNorm;
467 }
468 texture->setFormat(Format);
469 texture->allocateStorage(PixelFormat, PixelType);
470 texture->setMinMagFilters(Filter, Filter);
471 texture->setWrapMode(Wrap);
472
473 auto *result = new MythVideoTextureOpenGL(texture);
474 result->m_target = Target;
475 result->m_pixelFormat = PixelFormat;
476 result->m_pixelType = PixelType;
477 result->m_vbo = Context->CreateVBO(static_cast<int>(MythRenderOpenGL::kVertexSize));
478 result->m_totalSize = Context->GetTextureSize(Size, result->m_target != QOpenGLTexture::TargetRectangle);
479 result->m_bufferSize = datasize;
480 result->m_size = Size;
481 return result;
482}
483
486 MythVideoTextureOpenGL *Texture, uint Plane)
487{
488 if (Context->GetExtraFeatures() & kGLExtSubimage)
489 {
490 int pitch = (Frame->m_type == FMT_YV12 || Frame->m_type == FMT_YUV422P || Frame->m_type == FMT_YUV444P) ?
491 Frame->m_pitches[Plane] : Frame->m_pitches[Plane] >> 1;
492 Context->glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch);
493 Texture->m_texture->setData(Texture->m_pixelFormat, Texture->m_pixelType,
494 static_cast<const uint8_t*>(Frame->m_buffer) + Frame->m_offsets[Plane]);
495 Context->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
496 }
497 else
498 {
499 if (!Texture->m_data)
500 if (!CreateBuffer(Texture, Texture->m_bufferSize))
501 return;
502 int pitch = (Frame->m_type == FMT_YV12 || Frame->m_type == FMT_YUV422P || Frame->m_type == FMT_YUV444P) ?
503 Texture->m_size.width() : Texture->m_size.width() << 1;
504 MythVideoFrame::CopyPlane(Texture->m_data, pitch, Frame->m_buffer + Frame->m_offsets[Plane],
505 Frame->m_pitches[Plane], pitch, Texture->m_size.height());
506 Texture->m_texture->setData(Texture->m_pixelFormat, Texture->m_pixelType,
507 static_cast<const uint8_t *>(Texture->m_data));
508 }
509 Texture->m_valid = true;
510}
511
514{
515 // Create a buffer
516 if (!Texture->m_data)
517 if (!CreateBuffer(Texture, Texture->m_bufferSize))
518 return;
519 void* buffer = Texture->m_data;
520
521 // Create a copy context
522 if (!Texture->m_copyContext)
523 {
524 Texture->m_copyContext = new MythAVCopy();
525 if (!Texture->m_copyContext)
526 return;
527 }
528
529 // Convert
530 AVFrame out;
531 Texture->m_copyContext->Copy(&out, Frame, static_cast<unsigned char*>(buffer), AV_PIX_FMT_UYVY422);
532
533 // Update
534 Texture->m_texture->setData(Texture->m_pixelFormat, Texture->m_pixelType,
535 static_cast<const uint8_t *>(buffer));
536 Texture->m_valid = true;
537}
538
541 MythVideoTextureOpenGL *Texture, uint Plane)
542{
543 if (Context->GetExtraFeatures() & kGLExtSubimage)
544 {
545 bool hdr = Texture->m_frameFormat != FMT_NV12;
546 Context->glPixelStorei(GL_UNPACK_ROW_LENGTH, Plane ? Frame->m_pitches[Plane] >> (hdr ? 2 : 1) :
547 Frame->m_pitches[Plane] >> (hdr ? 1 : 0));
548 Texture->m_texture->setData(Texture->m_pixelFormat, Texture->m_pixelType,
549 static_cast<const uint8_t*>(Frame->m_buffer) + Frame->m_offsets[Plane]);
550 Context->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
551 }
552 else
553 {
554 if (!Texture->m_data)
555 if (!CreateBuffer(Texture, Texture->m_bufferSize))
556 return;
557 MythVideoFrame::CopyPlane(Texture->m_data, Frame->m_pitches[Plane], Frame->m_buffer + Frame->m_offsets[Plane],
558 Frame->m_pitches[Plane], Frame->m_pitches[Plane], Texture->m_size.height());
559 Texture->m_texture->setData(Texture->m_pixelFormat, Texture->m_pixelType,
560 static_cast<const uint8_t *>(Texture->m_data));
561 }
562 Texture->m_valid = true;
563}
564
567{
568 if (!Texture || Size < 1)
569 return false;
570
571 unsigned char *scratch = MythVideoFrame::GetAlignedBuffer(static_cast<size_t>(Size));
572 if (scratch)
573 {
574 memset(scratch, 0, static_cast<size_t>(Size));
575 Texture->m_data = scratch;
576 return true;
577 }
578
579 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to allocate texture buffer");
580 return false;
581}
582
584 QSize Size, bool HighPrecision)
585{
586 // Use a 16bit float framebuffer if requested/required and available (not GLES2) to maintain precision.
587 // The depth check will pick up all software formats as well as NVDEC, VideoToolBox and VAAPI DRM.
588 // VAAPI GLXPixmap and GLXCopy are currently not 10/12bit aware and VDPAU has no 10bit support -
589 // and all return RGB formats anyway. The MediaCodec texture format is an unknown but resizing will
590 // never be enabled as it returns an RGB frame - so if MediaCodec uses a 16bit texture, precision
591 // will be preserved.
592 bool sixteenbitfb = Context->GetExtraFeatures() & kGL16BitFBO;
593 bool sixteenbitvid = HighPrecision ? true : MythVideoFrame::ColorDepth(OutputType) > 8;
594 if (sixteenbitfb && sixteenbitvid)
595 LOG(VB_PLAYBACK, LOG_INFO, LOC + "Requesting 16bit framebuffer texture");
596 auto * framebuffer = Context->CreateFramebuffer(Size, sixteenbitfb && sixteenbitvid);
597 if (framebuffer == nullptr)
598 return { nullptr, nullptr };
599 auto * texture = new MythVideoTextureOpenGL(framebuffer->texture());
600 texture->m_size = texture->m_totalSize = framebuffer->size();
601 texture->m_vbo = Context->CreateVBO(static_cast<int>(MythRenderOpenGL::kVertexSize));
602 texture->m_flip = false;
603 texture->m_planeCount = 1;
604 texture->m_frameType = FMT_RGBA32;
605 texture->m_frameFormat = FMT_RGBA32;
606 texture->m_valid = true;
607 return { framebuffer, texture };
608}
AVFrame AVFrame
int Copy(AVFrame *To, const MythVideoFrame *From, unsigned char *Buffer, AVPixelFormat Fmt=AV_PIX_FMT_YUV420P)
Initialise AVFrame and copy contents of VideoFrame frame into it, performing any required conversion.
Definition: mythavutil.cpp:267
unsigned char * m_data
QOpenGLBuffer * m_vbo
QOpenGLTexture::PixelType m_pixelType
QOpenGLTexture::PixelFormat m_pixelFormat
QOpenGLTexture * m_texture
static constexpr GLuint kVertexSize
static int GetBufferSize(QSize Size, QOpenGLTexture::PixelFormat Format, QOpenGLTexture::PixelType Type)
QOpenGLBuffer * CreateVBO(int Size, bool Release=true)
QOpenGLFramebufferObject * CreateFramebuffer(QSize &Size, bool SixteenBit=false)
QSize GetTextureSize(QSize Size, bool Normalised)
int GetExtraFeatures(void) const
void SetTextureFilters(MythGLTexture *Texture, QOpenGLTexture::Filter Filter, QOpenGLTexture::WrapMode Wrap=QOpenGLTexture::ClampToEdge)
static uint GetNumPlanes(VideoFrameType Type)
Definition: mythframe.h:213
static uint8_t * GetAlignedBuffer(size_t Size)
Definition: mythframe.cpp:430
static void CopyPlane(uint8_t *To, int ToPitch, const uint8_t *From, int FromPitch, int PlaneWidth, int PlaneHeight)
Definition: mythframe.cpp:188
static int ColorDepth(int Format)
Definition: mythframe.h:398
static bool HardwareFormat(VideoFrameType Type)
Definition: mythframe.h:424
static void SetTextureFilters(MythRenderOpenGL *Context, const std::vector< MythVideoTextureOpenGL * > &Textures, QOpenGLTexture::Filter Filter, QOpenGLTexture::WrapMode Wrap=QOpenGLTexture::ClampToEdge)
MythVideoTextureOpenGL(GLuint Texture)
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 VideoFramebuffer CreateVideoFrameBuffer(MythRenderOpenGL *Context, VideoFrameType OutputType, QSize Size, bool HighPrecision=true)
static std::vector< MythVideoTextureOpenGL * > CreateHardwareTextures(MythRenderOpenGL *Context, VideoFrameType Type, VideoFrameType Format, std::vector< QSize > Sizes, GLenum Target)
Create a set of hardware textures suitable for the given format.
static void DeleteTextures(MythRenderOpenGL *Context, std::vector< MythVideoTextureOpenGL * > &Textures)
static MythVideoTextureOpenGL * CreateTexture(MythRenderOpenGL *Context, QSize Size, GLenum Target=QOpenGLTexture::Target2D, QOpenGLTexture::PixelType PixelType=QOpenGLTexture::UInt8, QOpenGLTexture::PixelFormat PixelFormat=QOpenGLTexture::RGBA, QOpenGLTexture::TextureFormat Format=QOpenGLTexture::NoFormat, QOpenGLTexture::Filter Filter=QOpenGLTexture::Linear, QOpenGLTexture::WrapMode Wrap=QOpenGLTexture::ClampToEdge)
Create and initialise a MythVideoTexture that is backed by a QOpenGLTexture.
static void YV12ToYUYV(const MythVideoFrame *Frame, MythVideoTextureOpenGL *Texture)
Copy YV12 frame data to a YUYV texture.
static void NV12ToNV12(MythRenderOpenGL *Context, const MythVideoFrame *Frame, MythVideoTextureOpenGL *Texture, uint Plane)
Copy NV12 video frame data to 'NV12' textures.
static bool CreateBuffer(MythVideoTextureOpenGL *Texture, int Size)
Create a data buffer for holding CPU side texture data.
static void DeleteTexture(MythRenderOpenGL *Context, MythVideoTextureOpenGL *Texture)
static void YV12ToYV12(MythRenderOpenGL *Context, const MythVideoFrame *Frame, MythVideoTextureOpenGL *Texture, uint Plane)
Copy YV12 frame data to 'YV12' textures.
static std::vector< MythVideoTextureOpenGL * > CreateSoftwareTextures(MythRenderOpenGL *Context, VideoFrameType Type, VideoFrameType Format, std::vector< QSize > Sizes, GLenum Target)
Create a set of OpenGL textures to represent the given Format.
static void UpdateTextures(MythRenderOpenGL *Context, const MythVideoFrame *Frame, const std::vector< MythVideoTextureOpenGL * > &Textures)
Update the contents of the given Textures for data held in Frame.
unsigned int uint
Definition: freesurround.h:24
VideoFrameType
Definition: mythframe.h:20
@ FMT_YUV420P9
Definition: mythframe.h:24
@ FMT_RGBA32
Definition: mythframe.h:34
@ FMT_YUV444P
Definition: mythframe.h:43
@ FMT_YUV420P14
Definition: mythframe.h:27
@ FMT_YUV420P12
Definition: mythframe.h:26
@ FMT_YUV422P10
Definition: mythframe.h:38
@ FMT_YUV444P16
Definition: mythframe.h:48
@ FMT_YUV422P9
Definition: mythframe.h:37
@ FMT_YUV422P14
Definition: mythframe.h:40
@ FMT_YV12
Definition: mythframe.h:23
@ FMT_P016
Definition: mythframe.h:54
@ FMT_YUV444P12
Definition: mythframe.h:46
@ FMT_YUV444P9
Definition: mythframe.h:44
@ FMT_YUV444P10
Definition: mythframe.h:45
@ FMT_YUV422P
Definition: mythframe.h:36
@ FMT_YUV422P16
Definition: mythframe.h:41
@ FMT_YUV420P10
Definition: mythframe.h:25
@ FMT_YUV420P16
Definition: mythframe.h:28
@ FMT_P010
Definition: mythframe.h:53
@ FMT_NV12
Definition: mythframe.h:52
@ FMT_YUY2
Definition: mythframe.h:50
@ FMT_YUV444P14
Definition: mythframe.h:47
@ FMT_YUV422P12
Definition: mythframe.h:39
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
@ kGLLegacyTextures
@ kGL16BitFBO
@ kGLExtSubimage
#define GL_UNPACK_ROW_LENGTH
#define LOC
std::pair< QOpenGLFramebufferObject *, MythVideoTextureOpenGL * > VideoFramebuffer
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:95