File tree Expand file tree Collapse file tree 16 files changed +97
-99
lines changed Expand file tree Collapse file tree 16 files changed +97
-99
lines changed Original file line number Diff line number Diff line change @@ -66,7 +66,16 @@ class AvExport AudioFrame : public Frame
66
66
void assign (const unsigned char * ptrValue);
67
67
68
68
private:
69
+ /* *
70
+ * @brief Allocate the audio buffer of the frame.
71
+ */
69
72
void allocateAVSample (const AudioFrameDesc& ref);
73
+
74
+ /* *
75
+ * @note To allocate new audio buffer if needed.
76
+ * @see allocateAVSample
77
+ */
78
+ friend class AudioGenerator ;
70
79
};
71
80
}
72
81
Original file line number Diff line number Diff line change @@ -18,6 +18,7 @@ class AvExport Frame
18
18
public:
19
19
/* *
20
20
* @brief Allocate an empty frame.
21
+ * @warn This only allocates the AVFrame itself, not the data buffers.
21
22
*/
22
23
Frame ();
23
24
Original file line number Diff line number Diff line change @@ -66,7 +66,16 @@ class AvExport VideoFrame : public Frame
66
66
void assign (const unsigned char * ptrValue);
67
67
68
68
private:
69
+ /* *
70
+ * @brief Allocate the image buffer of the frame.
71
+ */
69
72
void allocateAVPicture (const VideoFrameDesc& desc);
73
+
74
+ /* *
75
+ * @note To allocate new image buffer if needed.
76
+ * @see allocateAVPicture
77
+ */
78
+ friend class VideoGenerator ;
70
79
};
71
80
}
72
81
Original file line number Diff line number Diff line change @@ -87,13 +87,8 @@ bool AudioDecoder::decodeNextFrame(Frame& frameBuffer)
87
87
{
88
88
CodedData data;
89
89
90
+ // reading
90
91
const bool nextPacketRead = _inputStream->readNextPacket (data);
91
- // if error or end of file
92
- if (!nextPacketRead && !decodeNextFrame)
93
- {
94
- data.clear ();
95
- return false ;
96
- }
97
92
98
93
// decoding
99
94
// @note could be called several times to return the remaining frames (last call with an empty packet)
@@ -110,6 +105,13 @@ bool AudioDecoder::decodeNextFrame(Frame& frameBuffer)
110
105
decodeNextFrame = false ;
111
106
else
112
107
decodeNextFrame = true ;
108
+
109
+ // if no frame read and decompressed
110
+ if (!nextPacketRead && !decodeNextFrame)
111
+ {
112
+ data.clear ();
113
+ return false ;
114
+ }
113
115
}
114
116
return decodeNextFrame;
115
117
}
Original file line number Diff line number Diff line change 7
7
namespace avtranscoder
8
8
{
9
9
10
- AudioGenerator::AudioGenerator ()
10
+ AudioGenerator::AudioGenerator (const AudioFrameDesc& frameDesc )
11
11
: _inputFrame(NULL )
12
12
, _silent(NULL )
13
+ , _frameDesc(frameDesc)
13
14
{
14
15
}
15
16
16
- AudioGenerator::AudioGenerator (const AudioGenerator& audioGenerator)
17
- : _inputFrame(NULL )
18
- , _silent(NULL )
19
- {
20
- }
21
-
22
- AudioGenerator& AudioGenerator::operator =(const AudioGenerator& audioGenerator)
23
- {
24
- _inputFrame = NULL ;
25
- _silent = NULL ;
26
- return *this ;
27
- }
28
-
29
17
AudioGenerator::~AudioGenerator ()
30
18
{
31
19
delete _silent;
32
20
}
33
21
34
- void AudioGenerator::setNextFrame (Frame& inputFrame)
35
- {
36
- _inputFrame = &inputFrame;
37
- }
38
-
39
22
bool AudioGenerator::decodeNextFrame (Frame& frameBuffer)
40
23
{
24
+ // check the given frame
25
+ if (!frameBuffer.isAudioFrame ())
26
+ {
27
+ LOG_WARN (" The given frame is not a valid audio frame: allocate a new AVSample to put generated data into it." );
28
+ frameBuffer.clear ();
29
+ static_cast <AudioFrame&>(frameBuffer).allocateAVSample (_frameDesc);
30
+ }
31
+
41
32
// Check channel layout of the given frame to be able to copy audio data to it.
42
33
// @see Frame.copyData method
43
34
if (frameBuffer.getAVFrame ().channel_layout == 0 )
Original file line number Diff line number Diff line change @@ -9,21 +9,24 @@ namespace avtranscoder
9
9
10
10
class AvExport AudioGenerator : public IDecoder
11
11
{
12
- public:
13
- AudioGenerator ();
14
- AudioGenerator (const AudioGenerator& audioGenerator);
12
+ private:
15
13
AudioGenerator& operator =(const AudioGenerator& audioGenerator);
14
+ AudioGenerator (const AudioGenerator& audioGenerator);
15
+
16
+ public:
17
+ AudioGenerator (const AudioFrameDesc& frameDesc);
16
18
17
19
~AudioGenerator ();
18
20
19
21
bool decodeNextFrame (Frame& frameBuffer);
20
22
bool decodeNextFrame (Frame& frameBuffer, const size_t subStreamIndex);
21
23
22
- void setNextFrame (Frame& inputFrame);
24
+ void setNextFrame (Frame& inputFrame) { _inputFrame = &inputFrame; }
23
25
24
26
private:
25
27
Frame* _inputFrame; // /< Has link (no ownership)
26
28
AudioFrame* _silent; // /< The generated silent (has ownership)
29
+ const AudioFrameDesc _frameDesc; // /< The description of the silence (sampleRate, channels...)
27
30
};
28
31
}
29
32
Original file line number Diff line number Diff line change @@ -23,6 +23,9 @@ class AvExport IDecoder
23
23
/* *
24
24
* @brief Decode next frame
25
25
* @param frameBuffer: the frame decoded
26
+ * @warn the frameBuffer reference belongs to the decoder and is valid only until the
27
+ * next call to this function or until closing or flushing the
28
+ * decoder. The caller may not write to it.
26
29
* @return status of decoding
27
30
*/
28
31
virtual bool decodeNextFrame (Frame& frameBuffer) = 0;
Original file line number Diff line number Diff line change @@ -85,13 +85,8 @@ bool VideoDecoder::decodeNextFrame(Frame& frameBuffer)
85
85
{
86
86
CodedData data;
87
87
88
+ // reading
88
89
const bool nextPacketRead = _inputStream->readNextPacket (data);
89
- // if error or end of file
90
- if (!nextPacketRead && !decodeNextFrame)
91
- {
92
- data.clear ();
93
- return false ;
94
- }
95
90
96
91
// decoding
97
92
// @note could be called several times to return the remaining frames (last call with an empty packet)
@@ -108,6 +103,13 @@ bool VideoDecoder::decodeNextFrame(Frame& frameBuffer)
108
103
decodeNextFrame = false ;
109
104
else
110
105
decodeNextFrame = true ;
106
+
107
+ // if no frame read and decompressed
108
+ if (!nextPacketRead && !decodeNextFrame)
109
+ {
110
+ data.clear ();
111
+ return false ;
112
+ }
111
113
}
112
114
return decodeNextFrame;
113
115
}
Original file line number Diff line number Diff line change 8
8
namespace avtranscoder
9
9
{
10
10
11
- VideoGenerator::VideoGenerator ()
11
+ VideoGenerator::VideoGenerator (const VideoFrameDesc& frameDesc )
12
12
: _inputFrame(NULL )
13
13
, _blackImage(NULL )
14
- , _frameDesc()
14
+ , _frameDesc(frameDesc )
15
15
{
16
16
}
17
17
18
- VideoGenerator::VideoGenerator (const VideoGenerator& videoGenerator)
19
- : _inputFrame(NULL )
20
- , _blackImage(NULL )
21
- , _frameDesc(videoGenerator.getVideoFrameDesc())
22
- {
23
- }
24
-
25
- VideoGenerator& VideoGenerator::operator =(const VideoGenerator& videoGenerator)
26
- {
27
- _inputFrame = NULL ;
28
- _blackImage = NULL ;
29
- _frameDesc = videoGenerator.getVideoFrameDesc ();
30
- return *this ;
31
- }
32
-
33
18
VideoGenerator::~VideoGenerator ()
34
19
{
35
20
delete _blackImage;
36
21
}
37
22
38
- void VideoGenerator::setVideoFrameDesc (const VideoFrameDesc& frameDesc)
39
- {
40
- _frameDesc = frameDesc;
41
- }
42
-
43
- void VideoGenerator::setNextFrame (Frame& inputFrame)
44
- {
45
- _inputFrame = &inputFrame;
46
- }
47
-
48
23
bool VideoGenerator::decodeNextFrame (Frame& frameBuffer)
49
24
{
25
+ // check the given frame
26
+ if (!frameBuffer.isVideoFrame ())
27
+ {
28
+ LOG_WARN (" The given frame is not a valid video frame: allocate a new AVPicture to put generated data into it." );
29
+ frameBuffer.clear ();
30
+ static_cast <VideoFrame&>(frameBuffer).allocateAVPicture (_frameDesc);
31
+ }
32
+
50
33
// Generate black image
51
34
if (!_inputFrame)
52
35
{
Original file line number Diff line number Diff line change @@ -9,25 +9,24 @@ namespace avtranscoder
9
9
10
10
class AvExport VideoGenerator : public IDecoder
11
11
{
12
- public:
13
- VideoGenerator ();
12
+ private:
14
13
VideoGenerator (const VideoGenerator& videoGenerator);
15
14
VideoGenerator& operator =(const VideoGenerator& videoGenerator);
16
15
16
+ public:
17
+ VideoGenerator (const VideoFrameDesc& frameDesc);
18
+
17
19
~VideoGenerator ();
18
20
19
21
bool decodeNextFrame (Frame& frameBuffer);
20
22
bool decodeNextFrame (Frame& frameBuffer, const size_t channelIndex);
21
23
22
- const VideoFrameDesc& getVideoFrameDesc () const { return _frameDesc; }
23
- void setVideoFrameDesc (const VideoFrameDesc& frameDesc);
24
-
25
- void setNextFrame (Frame& inputFrame);
24
+ void setNextFrame (Frame& inputFrame) { _inputFrame = &inputFrame; }
26
25
27
26
private:
28
27
Frame* _inputFrame; // /< A frame given from outside (has link, no ownership)
29
28
VideoFrame* _blackImage; // /< The generated black image (has ownership)
30
- VideoFrameDesc _frameDesc; // /< The description of the black image (width, height...)
29
+ const VideoFrameDesc _frameDesc; // /< The description of the black image (width, height...)
31
30
};
32
31
}
33
32
You can’t perform that action at this time.
0 commit comments