Skip to content

Commit f93614a

Browse files
Merge branch 'master' of github.com:avTranscoder/avTranscoder
Conflicts: src/AvTranscoder/EssenceStream/OutputVideo.cpp
2 parents 702b60b + cc51d11 commit f93614a

File tree

7 files changed

+172
-45
lines changed

7 files changed

+172
-45
lines changed

src/AvTranscoder/EssenceStream/OutputVideo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ void OutputVideo::setProfile( const Profile::ProfileDesc& desc, const avtranscod
215215
}
216216
catch( std::exception& e )
217217
{
218-
std::cout << "OutputVideo warning: " << e.what() << std::endl;
218+
//std::cout << "[OutputVideo] warning: " << e.what() << std::endl;
219219
}
220220
}
221221

@@ -237,7 +237,7 @@ void OutputVideo::setProfile( const Profile::ProfileDesc& desc, const avtranscod
237237
}
238238
catch( std::exception& e )
239239
{
240-
std::cout << "OutputVideo 2.warning: " << e.what() << std::endl;
240+
std::cout << "[OutputVideo] warning: " << e.what() << std::endl;
241241
}
242242
}
243243
}

src/AvTranscoder/File/OutputFile.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ OutputFile::OutputFile( const std::string& filename )
2323
, _stream ( NULL )
2424
, _filename ( filename )
2525
, _packetCount ( 0 )
26+
, _verbose ( false )
2627
{
2728
if( ( _formatContext = avformat_alloc_context() ) == NULL )
2829
{
@@ -127,12 +128,15 @@ bool OutputFile::beginWrap( )
127128
msg += err;
128129
throw std::runtime_error( msg );
129130
}
131+
_frameCount.clear();
132+
_frameCount.resize( _outputStreams.size(), 0 );
130133
return true;
131134
}
132135

133136
bool OutputFile::wrap( const DataStream& data, const size_t streamId )
134137
{
135-
// std::cout << "wrap on stream " << streamId << " (" << data.getSize() << ")" << std::endl;
138+
if( _verbose )
139+
std::cout << "wrap on stream " << streamId << " (" << data.getSize() << " bytes for frame " << _frameCount.at( streamId ) << ")" << std::endl;
136140
AVPacket packet;
137141
av_init_packet( &packet );
138142

@@ -142,10 +146,11 @@ bool OutputFile::wrap( const DataStream& data, const size_t streamId )
142146

143147
packet.data = (uint8_t*)data.getPtr();
144148
packet.size = data.getSize();
145-
packet.dts = 0;
146-
packet.pts = _packetCount;
149+
// packet.dts = _frameCount.at( streamId );
150+
// packet.pts = ;
147151

148-
int ret = av_interleaved_write_frame( _formatContext, &packet );
152+
int ret = av_write_frame( _formatContext, &packet );
153+
// int ret = av_interleaved_write_frame( _formatContext, &packet );
149154

150155
if( ret != 0 )
151156
{
@@ -161,6 +166,7 @@ bool OutputFile::wrap( const DataStream& data, const size_t streamId )
161166
av_free_packet( &packet );
162167

163168
_packetCount++;
169+
_frameCount.at( streamId )++;
164170
return true;
165171
}
166172

src/AvTranscoder/File/OutputFile.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class AvExport OutputFile
9191
*/
9292
virtual void setProfile( const Profile::ProfileDesc& desc );
9393

94+
virtual void setVerbose( bool verbose = false ){ _verbose = verbose; }
95+
9496
private:
9597
std::vector<AvOutputStream*> _outputStreams;
9698
AVOutputFormat* _outputFormat;
@@ -100,9 +102,13 @@ class AvExport OutputFile
100102
AVCodecContext* _codecContext;
101103
AVStream* _stream;
102104

105+
std::vector<size_t> _frameCount;
106+
103107
std::string _filename;
104108

105109
size_t _packetCount;
110+
111+
bool _verbose;
106112
};
107113

108114
}

src/AvTranscoder/Transcoder/StreamTranscoder.cpp

Lines changed: 84 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ StreamTranscoder::StreamTranscoder(
2828
, _sourceBuffer( NULL )
2929
, _frameBuffer( NULL )
3030
, _inputEssence( NULL )
31+
, _dummyEssence( NULL )
3132
, _outputEssence( NULL )
3233
, _transform( NULL )
3334
, _subStreamIndex( -1 )
3435
, _transcodeStream( false )
36+
, _infiniteProcess( false )
3537
, _verbose( false )
3638
{
3739
// create a re-wrapping case
@@ -63,10 +65,12 @@ StreamTranscoder::StreamTranscoder(
6365
, _sourceBuffer( NULL )
6466
, _frameBuffer( NULL )
6567
, _inputEssence( NULL )
68+
, _dummyEssence( NULL )
6669
, _outputEssence( NULL )
6770
, _transform( NULL )
6871
, _subStreamIndex( subStreamIndex )
6972
, _transcodeStream( true )
73+
, _infiniteProcess( false )
7074
, _verbose( false )
7175
{
7276
// create a transcode case
@@ -92,6 +96,12 @@ StreamTranscoder::StreamTranscoder(
9296

9397
_transform = new VideoEssenceTransform();
9498

99+
DummyVideo* dummyVideo = new DummyVideo();
100+
dummyVideo->setVideoDesc( outputVideo->getVideoDesc() );
101+
_dummyEssence = dummyVideo;
102+
103+
_currentEssence = _inputEssence;
104+
95105
break;
96106
}
97107
case AVMEDIA_TYPE_AUDIO :
@@ -123,6 +133,12 @@ StreamTranscoder::StreamTranscoder(
123133

124134
_transform = new AudioEssenceTransform();
125135

136+
DummyAudio* dummyAudio = new DummyAudio();
137+
dummyAudio->setAudioDesc( outputAudio->getAudioDesc() );
138+
_dummyEssence = dummyAudio;
139+
140+
_currentEssence = _inputEssence;
141+
126142
break;
127143
}
128144
default:
@@ -143,16 +159,37 @@ StreamTranscoder::StreamTranscoder(
143159
, _sourceBuffer( NULL )
144160
, _frameBuffer( NULL )
145161
, _inputEssence( &inputEssence )
162+
, _dummyEssence( NULL )
146163
, _outputEssence( NULL )
147164
, _transform( NULL )
148165
, _subStreamIndex( -1 )
149166
, _transcodeStream( true )
167+
, _infiniteProcess( false )
150168
, _verbose( false )
151169
{
152170
// create a coding case based on a InputEssence (aka dummy reader)
153171
if( ! profile.count( Profile::avProfileType ) )
154172
throw std::runtime_error( "unable to found stream type (audio, video, etc.)" );
155173

174+
if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeVideo )
175+
{
176+
OutputVideo* outputVideo = new OutputVideo();
177+
178+
_outputEssence = outputVideo;
179+
VideoFrameDesc inputVideoFrameDesc = static_cast<DummyVideo*>( _inputEssence )->getVideoDesc().getVideoFrameDesc();
180+
outputVideo->setProfile( profile, inputVideoFrameDesc );
181+
182+
_outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() );
183+
_sourceBuffer = new VideoFrame( outputVideo->getVideoDesc().getVideoFrameDesc() );
184+
_frameBuffer = new VideoFrame( outputVideo->getVideoDesc().getVideoFrameDesc() );
185+
186+
_transform = new VideoEssenceTransform();
187+
188+
_currentEssence = _inputEssence;
189+
190+
return;
191+
}
192+
156193
if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeAudio )
157194
{
158195
OutputAudio* outputAudio = new OutputAudio();
@@ -169,23 +206,7 @@ StreamTranscoder::StreamTranscoder(
169206

170207
_transform = new AudioEssenceTransform();
171208

172-
return;
173-
}
174-
175-
if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeVideo )
176-
{
177-
OutputVideo* outputVideo = new OutputVideo();
178-
179-
_outputEssence = outputVideo;
180-
VideoFrameDesc inputVideoFrameDesc = static_cast<DummyVideo*>( _inputEssence )->getVideoDesc().getVideoFrameDesc();
181-
outputVideo->setProfile( profile, inputVideoFrameDesc );
182-
183-
_outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() );
184-
_sourceBuffer = new VideoFrame( outputVideo->getVideoDesc().getVideoFrameDesc() );
185-
_frameBuffer = new VideoFrame( outputVideo->getVideoDesc().getVideoFrameDesc() );
186-
187-
_transform = new VideoEssenceTransform();
188-
209+
_currentEssence = _inputEssence;
189210
return;
190211
}
191212

@@ -200,6 +221,8 @@ StreamTranscoder::~StreamTranscoder()
200221
delete _sourceBuffer;
201222
if( _inputEssence && _inputStream )
202223
delete _inputEssence;
224+
if( _dummyEssence )
225+
delete _dummyEssence;
203226
if( _outputEssence )
204227
delete _outputEssence;
205228
if( _transform )
@@ -258,16 +281,17 @@ bool StreamTranscoder::processRewrap( const int subStreamIndex )
258281

259282
bool StreamTranscoder::processTranscode()
260283
{
261-
assert( _inputEssence != NULL );
262-
assert( _outputEssence != NULL );
263-
assert( _sourceBuffer != NULL );
264-
assert( _frameBuffer != NULL );
265-
assert( _transform != NULL );
284+
assert( _inputEssence != NULL );
285+
assert( _currentEssence != NULL );
286+
assert( _outputEssence != NULL );
287+
assert( _sourceBuffer != NULL );
288+
assert( _frameBuffer != NULL );
289+
assert( _transform != NULL );
266290

267291
DataStream dataStream;
268292
if( _verbose )
269293
std::cout << "transcode a frame " << std::endl;
270-
if( _inputEssence->readNextFrame( *_sourceBuffer ) )
294+
if( _currentEssence->readNextFrame( *_sourceBuffer ) )
271295
{
272296
if( _verbose )
273297
std::cout << "convert " << _sourceBuffer->getSize() << std::endl;
@@ -278,6 +302,12 @@ bool StreamTranscoder::processTranscode()
278302
}
279303
else
280304
{
305+
if( _infiniteProcess )
306+
{
307+
switchToDummyEssence();
308+
return processTranscode( );
309+
}
310+
281311
if( _verbose )
282312
std::cout << "encode last frame(s)" << std::endl;
283313
if( ! _outputEssence->encodeFrame( dataStream ) )
@@ -294,16 +324,17 @@ bool StreamTranscoder::processTranscode()
294324

295325
bool StreamTranscoder::processTranscode( const int subStreamIndex )
296326
{
297-
assert( _inputEssence != NULL );
298-
assert( _outputEssence != NULL );
299-
assert( _sourceBuffer != NULL );
300-
assert( _frameBuffer != NULL );
301-
assert( _transform != NULL );
327+
assert( _inputEssence != NULL );
328+
assert( _currentEssence != NULL );
329+
assert( _outputEssence != NULL );
330+
assert( _sourceBuffer != NULL );
331+
assert( _frameBuffer != NULL );
332+
assert( _transform != NULL );
302333

303334
DataStream dataStream;
304335
if( _verbose )
305336
std::cout << "transcode a frame " << std::endl;
306-
if( _inputEssence->readNextFrame( *_sourceBuffer, subStreamIndex ) )
337+
if( _currentEssence->readNextFrame( *_sourceBuffer, subStreamIndex ) )
307338
{
308339
if( _verbose )
309340
std::cout << "convert " << std::endl;
@@ -314,6 +345,12 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
314345
}
315346
else
316347
{
348+
if( _infiniteProcess )
349+
{
350+
switchToDummyEssence();
351+
return processTranscode( );
352+
}
353+
317354
if( ! _outputEssence->encodeFrame( dataStream ) )
318355
{
319356
return false;
@@ -325,4 +362,22 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
325362
return true;
326363
}
327364

365+
void StreamTranscoder::switchToDummyEssence()
366+
{
367+
if( _dummyEssence == NULL )
368+
return;
369+
_takeFromDummy = true;
370+
_currentEssence = _dummyEssence;
371+
assert( _currentEssence != NULL );
372+
}
373+
374+
void StreamTranscoder::switchToInputEssence()
375+
{
376+
if( _inputEssence == NULL )
377+
return;
378+
_takeFromDummy = false;
379+
_currentEssence = _inputEssence;
380+
assert( _currentEssence != NULL );
381+
}
382+
328383
}

src/AvTranscoder/Transcoder/StreamTranscoder.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class StreamTranscoder
4747

4848
void setVerbose( bool verbose = true ){ _verbose = verbose; }
4949

50+
void switchToDummyEssence();
51+
void switchToInputEssence();
52+
void setInfinityProcess( bool infinity = true ){ _infiniteProcess = infinity; }
53+
5054
private:
5155
bool processRewrap();
5256
bool processRewrap( const int subStreamIndex );
@@ -61,12 +65,17 @@ class StreamTranscoder
6165
Frame* _frameBuffer;
6266

6367
InputEssence* _inputEssence;
68+
InputEssence* _dummyEssence;
69+
InputEssence* _currentEssence;
6470
OutputEssence* _outputEssence;
6571

6672
EssenceTransform* _transform;
6773

6874
int _subStreamIndex;
6975
bool _transcodeStream;
76+
bool _takeFromDummy;
77+
bool _infiniteProcess;
78+
7079
bool _verbose;
7180
};
7281

0 commit comments

Comments
 (0)