1
1
#include " FilterGraph.hpp"
2
2
3
3
#include < AvTranscoder/util.hpp>
4
- #include < AvTranscoder/data/decoded/AudioFrame.hpp>
5
4
#include < AvTranscoder/data/decoded/VideoFrame.hpp>
6
5
7
6
extern " C" {
@@ -16,6 +15,103 @@ extern "C" {
16
15
namespace avtranscoder
17
16
{
18
17
18
+
19
+ /* *****************
20
+
21
+ FrameBuffer
22
+
23
+ ******************/
24
+
25
+ FrameBuffer::FrameBuffer (const AudioFrameDesc& audioFrameDesc)
26
+ : _audioFrameDesc(audioFrameDesc)
27
+ , _frameQueue()
28
+ , _totalDataSize(0 )
29
+ , _positionInFrontFrame(0 )
30
+ {
31
+ }
32
+
33
+ FrameBuffer::~FrameBuffer ()
34
+ {
35
+ for (int i = 0 ; i < _frameQueue.size (); ++i)
36
+ popFrame ();
37
+ }
38
+
39
+ void FrameBuffer::addFrame (IFrame* frame)
40
+ {
41
+ AudioFrame* newAudioFrame = new AudioFrame (_audioFrameDesc, false );
42
+ const size_t expectedNbSamples = frame->getDataSize () / (newAudioFrame->getNbChannels () * newAudioFrame->getBytesPerSample ());
43
+ newAudioFrame->setNbSamplesPerChannel (expectedNbSamples);
44
+ newAudioFrame->allocateData ();
45
+ newAudioFrame->copyData (*frame);
46
+
47
+ _totalDataSize += newAudioFrame->getDataSize ();
48
+ _frameQueue.push (newAudioFrame);
49
+ }
50
+
51
+ void FrameBuffer::popFrame ()
52
+ {
53
+ _frameQueue.pop ();
54
+ }
55
+
56
+ IFrame* FrameBuffer::getFrame (const size_t size)
57
+ {
58
+ IFrame* next = _frameQueue.front ();
59
+ const size_t nextFrameSize = next->getDataSize ();
60
+
61
+ // If no expected size, or if the expected size equals the front frame of the queue (with no offset)
62
+ if (size == 0 || (size == nextFrameSize && _positionInFrontFrame == 0 ))
63
+ {
64
+ _totalDataSize -= nextFrameSize;
65
+ popFrame ();
66
+ return next;
67
+ }
68
+
69
+ // Create a new frame
70
+ AudioFrame* newAudioFrame = new AudioFrame (_audioFrameDesc, false );
71
+ const size_t expectedNbSamples = size / (newAudioFrame->getNbChannels () * newAudioFrame->getBytesPerSample ());
72
+ newAudioFrame->setNbSamplesPerChannel (expectedNbSamples);
73
+ newAudioFrame->allocateData ();
74
+
75
+ // Concatenate frames data
76
+ size_t extractedDataSize = 0 ;
77
+ unsigned char * outputData = new unsigned char [size];
78
+ while (extractedDataSize != size && _frameQueue.size () != 0 )
79
+ {
80
+ next = _frameQueue.front ();
81
+ size_t dataToGet = size - extractedDataSize;
82
+ size_t remainingDataInNextFrame = next->getDataSize () - _positionInFrontFrame;
83
+
84
+ if (dataToGet > remainingDataInNextFrame)
85
+ dataToGet = remainingDataInNextFrame;
86
+
87
+ for (size_t i = 0 ; i < dataToGet; i++)
88
+ outputData[extractedDataSize++] = next->getData ()[0 ][_positionInFrontFrame + i];
89
+
90
+ if (dataToGet < remainingDataInNextFrame)
91
+ {
92
+ _positionInFrontFrame += dataToGet;
93
+ }
94
+ else
95
+ {
96
+ popFrame ();
97
+ _positionInFrontFrame = 0 ;
98
+ }
99
+ }
100
+
101
+ _totalDataSize -= extractedDataSize;
102
+ newAudioFrame->assignBuffer (outputData);
103
+
104
+ return newAudioFrame;
105
+ }
106
+
107
+
108
+
109
+ /* *****************
110
+
111
+ FilterGraph
112
+
113
+ ******************/
114
+
19
115
FilterGraph::FilterGraph (const ICodec& codec)
20
116
: _graph(avfilter_graph_alloc())
21
117
, _filters()
0 commit comments