MythTV  master
mythvdpauinterop.cpp
Go to the documentation of this file.
1 // MythTV
2 #include "mythcorecontext.h"
3 #include "mythvideocolourspace.h"
4 #include "mythvdpauhelper.h"
5 #include "mythvdpauinterop.h"
6 
7 #define LOC QString("VDPAUInterop: ")
8 
10 {
11  if (Context)
12  return new MythVDPAUInterop(Context, CodecId);
13  return nullptr;
14 }
15 
17 {
18  if ((FMT_VDPAU != Format) || !gCoreContext->IsUIThread())
19  return Unsupported;
20 
22  if (!context)
23  return Unsupported;
24 
26  {
27  if (context->hasExtension("GL_NV_vdpau_interop"))
28  return VDPAU;
29  LOG(VB_GENERAL, LOG_WARNING, LOC + "GL_NV_vdpau_interop is not available");
30  }
31  return Unsupported;
32 }
33 
35  : MythOpenGLInterop(Context, VDPAU),
36  m_codec(CodecId)
37 {
38 }
39 
41 {
42  if (!m_context)
43  return;
44 
45  if (m_colourSpace)
47 
48  OpenGLLocker locker(m_context);
50  Cleanup();
51  delete m_helper;
52 }
53 
55 {
56  OpenGLLocker locker(m_context);
57 
58  // per the spec, this should automatically release any registered
59  // and mapped surfaces
60  if (m_finiNV)
61  m_finiNV();
62 
63  if (m_helper && !m_preempted)
64  {
67  }
68 
69  m_mixer = 0;
70  m_outputSurface = 0;
73  m_mixerSize = QSize();
74  m_mixerChroma = VDP_CHROMA_TYPE_420;
75 
77 }
78 
80 {
81  while (!m_referenceFrames.isEmpty())
82  {
83  AVBufferRef* ref = m_referenceFrames.takeLast();
84  av_buffer_unref(&ref);
85  }
86 }
87 
89 {
90  if (!Buffer)
91  return;
92 
93  // don't retain twice for double rate
94  if (!m_referenceFrames.empty() &&
95  (static_cast<VdpVideoSurface>(reinterpret_cast<uintptr_t>(m_referenceFrames[0]->data)) ==
96  static_cast<VdpVideoSurface>(reinterpret_cast<uintptr_t>(Buffer->data))))
97  {
98  return;
99  }
100 
101  m_referenceFrames.push_front(av_buffer_ref(Buffer));
102 
103  // release old frames
104  while (m_referenceFrames.size() > 3)
105  {
106  AVBufferRef* ref = m_referenceFrames.takeLast();
107  av_buffer_unref(&ref);
108  }
109 }
110 
111 bool MythVDPAUInterop::InitNV(AVVDPAUDeviceContext* DeviceContext)
112 {
113  if (!DeviceContext || !m_context)
114  return false;
115 
117  m_helper && m_helper->IsValid())
118  return true;
119 
120  OpenGLLocker locker(m_context);
121  m_initNV = reinterpret_cast<MYTH_VDPAUINITNV>(m_context->GetProcAddress("glVDPAUInitNV"));
122  m_finiNV = reinterpret_cast<MYTH_VDPAUFININV>(m_context->GetProcAddress("glVDPAUFiniNV"));
123  m_registerNV = reinterpret_cast<MYTH_VDPAUREGOUTSURFNV>(m_context->GetProcAddress("glVDPAURegisterOutputSurfaceNV"));
124  m_accessNV = reinterpret_cast<MYTH_VDPAUSURFACCESSNV>(m_context->GetProcAddress("glVDPAUSurfaceAccessNV"));
125  m_mapNV = reinterpret_cast<MYTH_VDPAUMAPSURFNV>(m_context->GetProcAddress("glVDPAUMapSurfacesNV"));
126  m_unmapNV = reinterpret_cast<MYTH_VDPAUMAPSURFNV>(m_context->GetProcAddress("glVDPAUUnmapSurfacesNV"));
127 
128  delete m_helper;
129  m_helper = nullptr;
130 
132  {
133  m_helper = new MythVDPAUHelper(DeviceContext);
134  if (m_helper->IsValid())
135  {
136  connect(m_helper, &MythVDPAUHelper::DisplayPreempted, this, &MythVDPAUInterop::DisplayPreempted, Qt::DirectConnection);
137  LOG(VB_PLAYBACK, LOG_INFO, LOC + "Ready");
138  return true;
139  }
140  delete m_helper;
141  m_helper = nullptr;
142  }
143 
144  LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to retrieve procs");
145  return false;
146 }
147 
148 bool MythVDPAUInterop::InitVDPAU(AVVDPAUDeviceContext* DeviceContext, VdpVideoSurface Surface,
149  MythDeintType Deint, bool DoubleRate)
150 {
151  if (!m_helper || !m_context || !Surface || !DeviceContext)
152  return false;
153 
154  VdpChromaType chroma = VDP_CHROMA_TYPE_420;
155  QSize size = m_helper->GetSurfaceParameters(Surface, chroma);
156 
157  if (m_mixer && (chroma != m_mixerChroma || size != m_mixerSize || Deint != m_deinterlacer))
158  Cleanup();
159 
160  if (!m_mixer)
161  {
162  m_mixer = m_helper->CreateMixer(size, chroma, Deint);
163  m_deinterlacer = Deint;
164  m_mixerChroma = chroma;
165  m_mixerSize = size;
166  if (DEINT_NONE != m_deinterlacer)
167  LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("Setup deinterlacer '%1'")
169  }
170 
171  if (!m_outputSurface)
172  {
174  if (m_outputSurface)
175  {
176  vector<QSize> sizes;
177  sizes.push_back(size);
178  vector<MythVideoTexture*> textures =
180  if (textures.empty())
181  return false;
182  m_openglTextures.insert(DUMMY_INTEROP_ID, textures);
183  }
184  }
185 
186  if (m_mixer && m_outputSurface)
187  {
188  if (!m_outputSurfaceReg && !m_openglTextures.empty())
189  {
190  // This may fail if another interop is registered (but should not happen if
191  // decoder creataion is working properly). Subsequent surface
192  // registration will then fail and we will try again on the next pass
193  m_initNV(reinterpret_cast<void*>(static_cast<uintptr_t>(DeviceContext->device)),
194  reinterpret_cast<const void*>(DeviceContext->get_proc_address));
195  GLuint texid = m_openglTextures[DUMMY_INTEROP_ID][0]->m_textureId;
196  m_outputSurfaceReg = m_registerNV(reinterpret_cast<void*>(static_cast<uintptr_t>(m_outputSurface)),
197  QOpenGLTexture::Target2D, 1, &texid);
198  // this happens if there is another interop registered to this OpenGL context
199  if (!m_outputSurfaceReg)
200  {
201  LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to register VdpOutputSurface. Will retry.");
202  }
203  else
204  {
205  m_accessNV(m_outputSurfaceReg, QOpenGLBuffer::ReadOnly);
206  }
207  }
208  return true;
209  }
210 
211  return (m_mixer != 0U) && (m_outputSurface != 0U);
212 }
213 
222  MythVideoColourSpace *ColourSpace,
224  FrameScanType Scan)
225 {
226  vector<MythVideoTexture*> result;
227  if (!Frame)
228  return result;
229 
230  if (m_preempted)
231  {
232  // Don't spam the logs with this warning
233  if (!m_preemptedWarning)
234  LOG(VB_PLAYBACK, LOG_INFO, LOC + "Display preempted. Decoder needs to be reset");
235  m_preemptedWarning = true;
236  return result;
237  }
238 
239  if (Context && (Context != m_context))
240  LOG(VB_GENERAL, LOG_WARNING, LOC + "Mismatched OpenGL contexts");
241 
242  // Check size
243  QSize surfacesize(Frame->m_width, Frame->m_height);
244  if (m_openglTextureSize != surfacesize)
245  {
246  if (!m_openglTextureSize.isEmpty())
247  LOG(VB_GENERAL, LOG_WARNING, LOC + "Video texture size changed!");
248  m_openglTextureSize = surfacesize;
249  }
250 
251  // Lock
252  OpenGLLocker locker(m_context);
253 
254  // Retrieve hardware frames context and AVVDPAUDeviceContext
255  if ((Frame->m_pixFmt != AV_PIX_FMT_VDPAU) || (Frame->m_type != FMT_VDPAU) ||
256  !Frame->m_buffer || !Frame->m_priv[1])
257  return result;
258 
259  auto* buffer = reinterpret_cast<AVBufferRef*>(Frame->m_priv[1]);
260  if (!buffer || !buffer->data)
261  return result;
262  auto* frames = reinterpret_cast<AVHWFramesContext*>(buffer->data);
263  if (!frames || !frames->device_ctx)
264  return result;
265  auto *devicecontext = reinterpret_cast<AVVDPAUDeviceContext*>(frames->device_ctx->hwctx);
266  if (!devicecontext)
267  return result;
268 
269  // Initialise
270  if (!InitNV(devicecontext))
271  return result;
272 
273  // Retrieve surface - we need its size to create the mixer and output surface
274  auto surface = static_cast<VdpVideoSurface>(reinterpret_cast<uintptr_t>(Frame->m_buffer));
275  if (!surface)
276  return result;
277 
278  // Workaround HEVC interlaced bug
279  // VDPAU driver hangs if we try to render progressive HEVC as interlaced (tested with version 418.56)
280  // FFmpeg clearly currently has issues with interlaced HEVC (https://trac.ffmpeg.org/ticket/4141).
281  // Streams are always return with the field height.
282  // Deinterlacing does work with (some?) HEVC material flagged as interlaced.
283  if ((kCodec_HEVC_VDPAU == m_codec) && is_interlaced(Scan) && !Frame->m_interlaced)
284  {
285  // This should only be logged a couple of times before the scan is detected as progressive
286  LOG(VB_GENERAL, LOG_INFO, LOC + "Ignoring scan for non-interlaced HEVC frame");
287  Scan = kScan_Progressive;
288  }
289 
290  // Check for deinterlacing - VDPAU deinterlacers trump all others as we can only
291  // deinterlace VDPAU frames here. So accept any deinterlacer.
292  // N.B. basic deinterlacing requires no additional setup and is managed with
293  // the field/frame parameter
294  bool doublerate = true;
295  MythDeintType deinterlacer = DEINT_BASIC;
296  if (is_interlaced(Scan))
297  {
298  MythDeintType driverdeint = Frame->GetDoubleRateOption(DEINT_DRIVER | DEINT_CPU | DEINT_SHADER,
299  DEINT_ALL);
300  if (!driverdeint)
301  {
302  doublerate = false;
303  driverdeint = Frame->GetSingleRateOption(DEINT_DRIVER | DEINT_CPU | DEINT_SHADER, DEINT_ALL);
304  }
305 
306  if (driverdeint)
307  {
308  Frame->m_deinterlaceInuse = driverdeint | DEINT_DRIVER;
309  Frame->m_deinterlaceInuse2x = doublerate;
310  deinterlacer = driverdeint;
311  }
312  }
313 
314  if ((deinterlacer == DEINT_HIGH) || (deinterlacer == DEINT_MEDIUM))
315  {
316  if (qAbs(Frame->m_frameCounter - m_discontinuityCounter) > 1)
318  RotateReferenceFrames(reinterpret_cast<AVBufferRef*>(Frame->m_priv[0]));
319  }
320  else
321  {
323  }
324  m_discontinuityCounter = Frame->m_frameCounter;
325 
326  // We need a mixer, an output surface and mapped texture
327  if (!InitVDPAU(devicecontext, surface, deinterlacer, doublerate))
328  return result;
329 
330  // Update colourspace and initialise on first frame - after mixer is created
331  if (ColourSpace)
332  {
333  if (!m_colourSpace)
334  {
335  if (m_helper->IsFeatureAvailable(VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX))
336  {
339  }
340  else
341  {
342  // N.B. CSC matrix support should always be available so there is no fallback.
344  LOG(VB_GENERAL, LOG_WARNING, LOC + "No VDPAU CSC matrix support");
345  }
346 
347  ColourSpace->IncrRef();
348  m_colourSpace = ColourSpace;
349  }
350  ColourSpace->UpdateColourSpace(Frame);
351  }
352 
353  // Render surface
355  m_helper->MixerRender(m_mixer, surface, m_outputSurface, Scan,
356  static_cast<int>(Frame->m_interlacedReverse ? !Frame->m_topFieldFirst :
357  Frame->m_topFieldFirst), m_referenceFrames);
360 }
361 
362 void MythVDPAUInterop::UpdateColourSpace(bool /*PrimariesChanged*/)
363 {
364  if (!m_mixer || !m_context || !m_colourSpace || !m_helper)
365  return;
366 
367  OpenGLLocker locker(m_context);
369 }
370 
372 {
373  // N.B. Pre-emption is irrecoverable here. We ensure the error state is recorded
374  // and when AvFormatDecoder/MythCodecContext hit a problem, IsPreempted is checked.
375  // The decoder context is then released, along with the associated interop
376  // class (i.e. this) and a new interop is created.
377  LOG(VB_GENERAL, LOG_INFO, LOC + "VDPAU display preempted");
378  m_preempted = true;
379 }
380 
382 {
383  return m_preempted;
384 }
MythVDPAUInterop::Acquire
vector< MythVideoTexture * > Acquire(MythRenderOpenGL *Context, MythVideoColourSpace *ColourSpace, MythVideoFrame *Frame, FrameScanType Scan) override
Map VDPAU video surfaces to an OpenGL texture.
Definition: mythvdpauinterop.cpp:221
DEINT_DRIVER
@ DEINT_DRIVER
Definition: mythframe.h:70
DEINT_MEDIUM
@ DEINT_MEDIUM
Definition: mythframe.h:66
MythVDPAUInterop::m_mixerSize
QSize m_mixerSize
Definition: mythvdpauinterop.h:60
ReferenceCounter::DecrRef
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
Definition: referencecounter.cpp:125
MythVDPAUInterop::RotateReferenceFrames
void RotateReferenceFrames(AVBufferRef *Buffer)
Definition: mythvdpauinterop.cpp:88
MythVideoTexture::CreateTextures
static std::vector< MythVideoTexture * > 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.
Definition: mythvideotexture.cpp:57
mythvdpauinterop.h
DEINT_SHADER
@ DEINT_SHADER
Definition: mythframe.h:69
MythVDPAUHelper::SetCSCMatrix
void SetCSCMatrix(VdpVideoMixer Mixer, MythVideoColourSpace *ColourSpace)
Definition: mythvdpauhelper.cpp:542
MythVDPAUInterop::m_initNV
MYTH_VDPAUINITNV m_initNV
Definition: mythvdpauinterop.h:63
MYTH_VDPAUREGOUTSURFNV
MythVDPAUSurfaceNV(APIENTRY *)(const void *, GLenum, GLsizei, const GLuint *) MYTH_VDPAUREGOUTSURFNV
Definition: mythvdpauinterop.h:21
MYTH_VDPAUMAPSURFNV
void(APIENTRY *)(GLsizei, MythVDPAUSurfaceNV *) MYTH_VDPAUMAPSURFNV
Definition: mythvdpauinterop.h:23
LOC
#define LOC
Definition: mythvdpauinterop.cpp:7
MythVDPAUInterop::m_colourSpace
MythVideoColourSpace * m_colourSpace
Definition: mythvdpauinterop.h:54
Frame
Definition: zmdefines.h:94
MythRenderOpenGL::GetProcAddress
QFunctionPointer GetProcAddress(const QString &Proc) const
Definition: mythrenderopengl.cpp:1206
MythVideoColourSpace::UpdateColourSpace
bool UpdateColourSpace(const MythVideoFrame *Frame)
Set the current colourspace to use.
Definition: mythvideocolourspace.cpp:329
MythVDPAUInterop::~MythVDPAUInterop
~MythVDPAUInterop() override
Definition: mythvdpauinterop.cpp:40
DEINT_NONE
@ DEINT_NONE
Definition: mythframe.h:64
arg
arg(title).arg(filename).arg(doDelete))
Surface
Definition: surface.h:4
FrameScanType
FrameScanType
Definition: videoouttypes.h:95
MythCoreContext::IsUIThread
bool IsUIThread(void)
Definition: mythcorecontext.cpp:1357
Context
QHash< QString, Action * > Context
Definition: action.h:77
MythVDPAUInterop::InitNV
bool InitNV(AVVDPAUDeviceContext *DeviceContext)
Definition: mythvdpauinterop.cpp:111
MythDate::Format
Format
Definition: mythdate.h:13
MythVideoColourSpace::SetSupportedAttributes
void SetSupportedAttributes(PictureAttributeSupported Supported)
Enable the given set of picture attributes.
Definition: mythvideocolourspace.cpp:122
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23
MythVDPAUInterop::m_helper
MythVDPAUHelper * m_helper
Definition: mythvdpauinterop.h:55
DEINT_ALL
@ DEINT_ALL
Definition: mythframe.h:71
MythVDPAUHelper::HaveVDPAU
static bool HaveVDPAU(void)
Definition: mythvdpauhelper.cpp:53
DUMMY_INTEROP_ID
#define DUMMY_INTEROP_ID
Definition: mythopenglinterop.h:21
MythVDPAUHelper::IsFeatureAvailable
bool IsFeatureAvailable(uint Feature)
Definition: mythvdpauhelper.cpp:555
MythVDPAUHelper::CreateOutputSurface
VdpOutputSurface CreateOutputSurface(QSize Size)
Definition: mythvdpauhelper.cpp:398
MythVDPAUInterop::Cleanup
void Cleanup(void)
Definition: mythvdpauinterop.cpp:54
kPictureAttributeSupported_None
@ kPictureAttributeSupported_None
Definition: videoouttypes.h:118
MythVDPAUInterop::Create
static MythVDPAUInterop * Create(MythRenderOpenGL *Context, MythCodecID CodecId)
Definition: mythvdpauinterop.cpp:9
kCodec_HEVC_VDPAU
@ kCodec_HEVC_VDPAU
Definition: mythcodecid.h:46
MythOpenGLInterop::VDPAU
@ VDPAU
Definition: mythopenglinterop.h:38
MYTH_VDPAUFININV
void(APIENTRY *)(void) MYTH_VDPAUFININV
Definition: mythvdpauinterop.h:20
DEINT_CPU
@ DEINT_CPU
Definition: mythframe.h:68
MythVDPAUHelper::DeleteOutputSurface
void DeleteOutputSurface(VdpOutputSurface Surface)
Definition: mythvdpauhelper.cpp:412
MythVDPAUInterop::m_deinterlacer
MythDeintType m_deinterlacer
Definition: mythvdpauinterop.h:61
MythCodecID
MythCodecID
Definition: mythcodecid.h:11
mythvideocolourspace.h
MythOpenGLInterop::m_discontinuityCounter
uint64_t m_discontinuityCounter
Definition: mythopenglinterop.h:77
MythVDPAUInterop::m_preemptedWarning
bool m_preemptedWarning
Definition: mythvdpauinterop.h:71
MythOpenGLInterop
Definition: mythopenglinterop.h:24
MythVDPAUInterop::m_outputSurface
VdpOutputSurface m_outputSurface
Definition: mythvdpauinterop.h:56
mythvdpauhelper.h
MythOpenGLInterop::Unsupported
@ Unsupported
Definition: mythopenglinterop.h:31
kScan_Progressive
@ kScan_Progressive
Definition: videoouttypes.h:100
MythVDPAUInterop::GetInteropType
static Type GetInteropType(VideoFrameType Format)
Definition: mythvdpauinterop.cpp:16
MythVDPAUHelper::DisplayPreempted
void DisplayPreempted(void)
MythVDPAUHelper
A simple wrapper around VDPAU functionality.
Definition: mythvdpauhelper.h:41
MythVDPAUInterop::MythVDPAUInterop
MythVDPAUInterop(MythRenderOpenGL *Context, MythCodecID CodecID)
Definition: mythvdpauinterop.cpp:34
MythVDPAUHelper::DeleteMixer
void DeleteMixer(VdpVideoMixer Mixer)
Definition: mythvdpauhelper.cpp:532
MythVDPAUInterop
Definition: mythvdpauinterop.h:26
MythVDPAUHelper::GetSurfaceParameters
QSize GetSurfaceParameters(VdpVideoSurface Surface, VdpChromaType &Chroma)
Definition: mythvdpauhelper.cpp:567
MythVDPAUInterop::m_accessNV
MYTH_VDPAUSURFACCESSNV m_accessNV
Definition: mythvdpauinterop.h:66
MythVDPAUHelper::IsValid
bool IsValid(void) const
Definition: mythvdpauhelper.cpp:312
MythVDPAUInterop::m_codec
MythCodecID m_codec
Definition: mythvdpauinterop.h:69
MythOpenGLInterop::m_context
MythRenderOpenGL * m_context
Definition: mythopenglinterop.h:73
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:60
MythVDPAUHelper::CreateMixer
VdpVideoMixer CreateMixer(QSize Size, VdpChromaType ChromaType=VDP_CHROMA_TYPE_420, MythDeintType Deinterlacer=DEINT_BASIC)
Definition: mythvdpauhelper.cpp:422
MythOpenGLInterop::Type
Type
Definition: mythopenglinterop.h:30
MYTH_VDPAUINITNV
void(APIENTRY *)(const void *, const void *) MYTH_VDPAUINITNV
Definition: mythvdpauinterop.h:19
FMT_ARGB32
@ FMT_ARGB32
Definition: mythframe.h:29
ALL_PICTURE_ATTRIBUTES
#define ALL_PICTURE_ATTRIBUTES
Definition: videoouttypes.h:127
MythVDPAUInterop::CleanupDeinterlacer
void CleanupDeinterlacer(void)
Definition: mythvdpauinterop.cpp:79
MythVDPAUInterop::m_referenceFrames
QVector< AVBufferRef * > m_referenceFrames
Definition: mythvdpauinterop.h:62
MythRenderOpenGL
Definition: mythrenderopengl.h:99
MythDeintType
MythDeintType
Definition: mythframe.h:63
Buffer
Definition: MythExternControl.h:37
mythcorecontext.h
FMT_VDPAU
@ FMT_VDPAU
Definition: mythframe.h:52
MythVideoColourSpace::Updated
void Updated(bool PrimariesChanged)
MythVDPAUInterop::m_mixerChroma
VdpChromaType m_mixerChroma
Definition: mythvdpauinterop.h:59
MythVideoFrame::DeinterlacerName
static QString DeinterlacerName(MythDeintType Deint, bool DoubleRate, VideoFrameType Format=FMT_NONE)
Definition: mythframe.cpp:457
DEINT_HIGH
@ DEINT_HIGH
Definition: mythframe.h:67
MYTH_VDPAUSURFACCESSNV
void(APIENTRY *)(MythVDPAUSurfaceNV, GLenum) MYTH_VDPAUSURFACCESSNV
Definition: mythvdpauinterop.h:22
MythRenderOpenGL::GetOpenGLRender
static MythRenderOpenGL * GetOpenGLRender(void)
Definition: mythrenderopengl.cpp:66
MythVDPAUInterop::m_mixer
VdpVideoMixer m_mixer
Definition: mythvdpauinterop.h:58
MythVDPAUInterop::IsPreempted
bool IsPreempted(void) const
Definition: mythvdpauinterop.cpp:381
MythVDPAUHelper::MixerRender
void MixerRender(VdpVideoMixer Mixer, VdpVideoSurface Source, VdpOutputSurface Dest, FrameScanType Scan, int TopFieldFirst, QVector< AVBufferRef * > &Frames)
Definition: mythvdpauhelper.cpp:476
VideoFrameType
VideoFrameType
Definition: mythframe.h:16
MythVDPAUInterop::UpdateColourSpace
void UpdateColourSpace(bool PrimariesChanged)
Definition: mythvdpauinterop.cpp:362
MythVideoFrame
Definition: mythframe.h:83
MythVDPAUInterop::m_preempted
bool m_preempted
Definition: mythvdpauinterop.h:70
MythOpenGLInterop::DeleteTextures
virtual void DeleteTextures(void)
Definition: mythopenglinterop.cpp:244
DEINT_BASIC
@ DEINT_BASIC
Definition: mythframe.h:65
MythOpenGLInterop::m_openglTextures
QHash< unsigned long long, vector< MythVideoTexture * > > m_openglTextures
Definition: mythopenglinterop.h:75
MythVDPAUInterop::m_finiNV
MYTH_VDPAUFININV m_finiNV
Definition: mythvdpauinterop.h:64
MythVDPAUInterop::m_unmapNV
MYTH_VDPAUMAPSURFNV m_unmapNV
Definition: mythvdpauinterop.h:68
MythVDPAUInterop::m_outputSurfaceReg
MythVDPAUSurfaceNV m_outputSurfaceReg
Definition: mythvdpauinterop.h:57
ReferenceCounter::IncrRef
virtual int IncrRef(void)
Increments reference count.
Definition: referencecounter.cpp:101
MythVDPAUInterop::m_registerNV
MYTH_VDPAUREGOUTSURFNV m_registerNV
Definition: mythvdpauinterop.h:65
is_interlaced
bool is_interlaced(FrameScanType Scan)
Definition: videoouttypes.h:188
MythVDPAUInterop::DisplayPreempted
void DisplayPreempted(void)
Definition: mythvdpauinterop.cpp:371
MythOpenGLInterop::m_openglTextureSize
QSize m_openglTextureSize
Definition: mythopenglinterop.h:76
MythVideoColourSpace
MythVideoColourSpace contains a QMatrix4x4 that can convert YCbCr data to RGB.
Definition: mythvideocolourspace.h:21
MythVDPAUInterop::m_mapNV
MYTH_VDPAUMAPSURFNV m_mapNV
Definition: mythvdpauinterop.h:67
OpenGLLocker
Definition: mythrenderopengl.h:255
MythVDPAUInterop::InitVDPAU
bool InitVDPAU(AVVDPAUDeviceContext *DeviceContext, VdpVideoSurface Surface, MythDeintType Deint, bool DoubleRate)
Definition: mythvdpauinterop.cpp:148