-
Notifications
You must be signed in to change notification settings - Fork 0
/
H264PlaybackGraph.hpp
79 lines (75 loc) · 1.94 KB
/
H264PlaybackGraph.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#pragma once
#include "Omx/Graph.hpp"
#include "Omx/H264VideoDecoder.hpp"
#include "Omx/VideoRenderer.hpp"
class CH264PlaybackGraph : public Omx::CGraph
{
private:
Omx::CH264VideoDecoder m_VideoDecoder;
Omx::CVideoRenderer m_VideoRenderer;
bool m_bTunnelActive;
public:
CH264PlaybackGraph() : m_VideoDecoder(0, 0, this), m_bTunnelActive(false)
{
#ifdef DEBUG
std::cout << "Debug: Omx graph created" << std::endl;
#endif
}
~CH264PlaybackGraph()
{
try
{
#ifdef DEBUG
std::cout << "Debug: destroying Omx graph" << std::endl;
#endif
DisableTunnel();
}
catch (std::exception& Exception)
{
std::cerr << "Error: " << Exception.what() << std::endl;
}
}
OMX_BUFFERHEADERTYPE* GetInputBuffer()
{
return m_VideoDecoder.GetInputBuffer();
}
void OnPortSettingsChanged(Omx::CComponent* pComponent, unsigned int nPortId)
{
if (pComponent == &m_VideoDecoder && nPortId == 131)
{
#ifdef DEBUG
std::cout << "Debug: port settings changed for the video decoder output port" << std::endl;
#endif
if (m_bTunnelActive == true)
{
DisableTunnel();
}
#ifdef DEBUG
std::cout << "Debug: setting up tunel and enabling video decoder output port and renderer input port" << std::endl;
#endif
Omx::CTunnel(&m_VideoDecoder.GetOutputPort(), &m_VideoRenderer.GetInputPort());
m_VideoDecoder.GetOutputPort().Enable();
m_VideoRenderer.GetInputPort().Enable();
m_bTunnelActive = true;
}
}
void ProcessBuffer(OMX_BUFFERHEADERTYPE* pBuffer)
{
m_VideoDecoder.ProcessBuffer(pBuffer);
}
private:
void DisableTunnel()
{
if (m_bTunnelActive == true)
{
#ifdef DEBUG
std::cout << "Debug: tunnel between decoder and render is active, flushing and disabling ports and tunnel" << std::endl;
#endif
m_VideoRenderer.GetInputPort().Disable();
m_VideoDecoder.GetOutputPort().Disable();
Omx::CTunnel(&m_VideoDecoder.GetOutputPort(), NULL);
Omx::CTunnel(&m_VideoDecoder.GetOutputPort(), NULL);
m_bTunnelActive = false;
}
}
};