-
Notifications
You must be signed in to change notification settings - Fork 10
/
VideoFrame.cpp
127 lines (101 loc) · 3.06 KB
/
VideoFrame.cpp
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "VideoFrame.h"
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QQmlContext>
#include "QVideoFrameToQImage.h"
//----------------------------------------------------------------------
VideoFrame::VideoFrame( QObject* parent ) :
QObject( parent ),
m_Input( nullptr ),
m_MappedImage( nullptr ),
m_MapMode( QAbstractVideoBuffer::MapMode::NotMapped ),
m_BottomToTop( false )
{
}
//----------------------------------------------------------------------
VideoFrame::VideoFrame( QVideoFrame* input, QObject* parent ) :
QObject( parent ),
m_Input( input ),
m_MappedImage( nullptr ),
m_MapMode( QAbstractVideoBuffer::NotMapped ),
m_BottomToTop( false )
{
}
//----------------------------------------------------------------------
VideoFrame::~VideoFrame()
{
if ( m_MapMode != QAbstractVideoBuffer::NotMapped )
{
finish();
}
}
//----------------------------------------------------------------------
QImage* VideoFrame::startReading()
{
return start( QAbstractVideoBuffer::ReadOnly );
}
//----------------------------------------------------------------------
QImage* VideoFrame::startEditing()
{
return start( QAbstractVideoBuffer::ReadWrite );
}
//----------------------------------------------------------------------
QVideoFrame VideoFrame::finish()
{
if ( !m_Input )
{
return QVideoFrame();
}
if ( m_MappedImage )
{
delete m_MappedImage;
m_MappedImage = nullptr;
m_Input->unmap();
m_MapMode = QAbstractVideoBuffer::NotMapped;
return *m_Input;
}
if ( ( m_MapMode & QAbstractVideoBuffer::WriteOnly) == 0 )
{
m_MapMode = QAbstractVideoBuffer::NotMapped;
return *m_Input;
}
m_MapMode = QAbstractVideoBuffer::NotMapped;
return QVideoFrame( m_Image );
}
//----------------------------------------------------------------------
QImage* VideoFrame::start( QAbstractVideoBuffer::MapMode mode )
{
if ( !m_Input )
{
return nullptr;
}
m_MapMode = mode;
if ( m_Input->handleType() == QAbstractVideoBuffer::NoHandle
&& m_Input->pixelFormat() == QVideoFrame::PixelFormat::Format_ARGB32 )
{
if ( m_Input->map( mode ) )
{
m_MappedImage = new QImage(
m_Input->bits(),
m_Input->width(),
m_Input->height(),
m_Input->bytesPerLine(),
QVideoFrame::imageFormatFromPixelFormat( m_Input->pixelFormat() )
);
return m_MappedImage;
}
}
m_Image = QVideoFrameToQImage( *m_Input );
return &m_Image;
}
//----------------------------------------------------------------------
void VideoFrame::setOptions( QVideoSurfaceFormat* surfaceFormat )
{
m_BottomToTop = false;
if ( !surfaceFormat )
{
return;
}
m_BottomToTop = ( surfaceFormat->scanLineDirection() == QVideoSurfaceFormat::Direction::BottomToTop );
}
//----------------------------------------------------------------------