Skip to content

Commit 54cf3c6

Browse files
committed
Merge pull request #84 from cchampet/dev_switch_rewrap_to_transcode
Can switch to generator at the end of rewrap
2 parents ce1a378 + fa359ad commit 54cf3c6

File tree

7 files changed

+231
-79
lines changed

7 files changed

+231
-79
lines changed

src/AvTranscoder/mediaProperty/FileProperties.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,54 @@ size_t FileProperties::getPacketSize() const
7474
return _formatContext->packet_size;
7575
}
7676

77+
VideoProperties& FileProperties::getVideoPropertiesWithStreamIndex( const size_t streamIndex )
78+
{
79+
for( std::vector< VideoProperties >::iterator it = _videoStreams.begin(); it != _videoStreams.end(); ++it )
80+
{
81+
if( it->getStreamIndex() == streamIndex )
82+
return *it;
83+
}
84+
std::string msg( "no video properties correspond to stream at index " );
85+
msg += streamIndex;
86+
throw std::runtime_error( msg );
87+
}
88+
89+
const avtranscoder::VideoProperties& FileProperties::getVideoPropertiesWithStreamIndex( const size_t streamIndex ) const
90+
{
91+
for( std::vector< VideoProperties >::const_iterator it = _videoStreams.begin(); it != _videoStreams.end(); ++it )
92+
{
93+
if( it->getStreamIndex() == streamIndex )
94+
return *it;
95+
}
96+
std::string msg( "no video properties correspond to stream at index " );
97+
msg += streamIndex;
98+
throw std::runtime_error( msg );
99+
}
100+
101+
AudioProperties& FileProperties::getAudioPropertiesWithStreamIndex( const size_t streamIndex )
102+
{
103+
for( std::vector< AudioProperties >::iterator it = _audioStreams.begin(); it != _audioStreams.end(); ++it )
104+
{
105+
if( it->getStreamIndex() == streamIndex )
106+
return *it;
107+
}
108+
std::string msg( "no audio properties correspond to stream at index " );
109+
msg += streamIndex;
110+
throw std::runtime_error( msg );
111+
}
112+
113+
const avtranscoder::AudioProperties& FileProperties::getAudioPropertiesWithStreamIndex( const size_t streamIndex ) const
114+
{
115+
for( std::vector< AudioProperties >::const_iterator it = _audioStreams.begin(); it != _audioStreams.end(); ++it )
116+
{
117+
if( it->getStreamIndex() == streamIndex )
118+
return *it;
119+
}
120+
std::string msg( "no audio properties correspond to stream at index " );
121+
msg += streamIndex;
122+
throw std::runtime_error( msg );
123+
}
124+
77125
size_t FileProperties::getNbStreams() const
78126
{
79127
if( ! _formatContext )

src/AvTranscoder/mediaProperty/FileProperties.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,28 @@ class AvExport FileProperties
4242
size_t getNbAttachementStreams() const { return _attachementStreams.size(); }
4343
size_t getNbUnknownStreams() const { return _unknownStreams.size(); }
4444

45+
//@{
46+
// @brief Get the properties with the indicated stream index
47+
avtranscoder::VideoProperties& getVideoPropertiesWithStreamIndex( const size_t streamIndex );
48+
avtranscoder::AudioProperties& getAudioPropertiesWithStreamIndex( const size_t streamIndex );
49+
//@}
50+
51+
//@{
52+
// @brief Get the list of properties for a given type (video, audio...)
4553
std::vector< avtranscoder::VideoProperties >& getVideoProperties() { return _videoStreams; }
4654
std::vector< avtranscoder::AudioProperties >& getAudioProperties() { return _audioStreams; }
4755
std::vector< avtranscoder::DataProperties >& getDataProperties() { return _dataStreams; }
4856
std::vector< avtranscoder::SubtitleProperties >& getSubtitleProperties() { return _subtitleStreams; }
4957
std::vector< avtranscoder::AttachementProperties >& getAttachementProperties() { return _attachementStreams; }
5058
std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() { return _unknownStreams; }
59+
//@}
5160

5261
#ifndef SWIG
5362
const AVFormatContext& getAVFormatContext() { return *_formatContext; }
63+
64+
const avtranscoder::VideoProperties& getVideoPropertiesWithStreamIndex( const size_t streamIndex ) const;
65+
const avtranscoder::AudioProperties& getAudioPropertiesWithStreamIndex( const size_t streamIndex ) const;
66+
5467
const std::vector< avtranscoder::VideoProperties >& getVideoProperties() const { return _videoStreams; }
5568
const std::vector< avtranscoder::AudioProperties >& getAudioProperties() const { return _audioStreams; }
5669
const std::vector< avtranscoder::DataProperties >& getDataProperties() const { return _dataStreams; }

src/AvTranscoder/mediaProperty/PixelProperties.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ std::string PixelProperties::getPixelName() const
3535
return "unknown pixel name";
3636
}
3737

38+
std::string PixelProperties::getPixelFormatName() const
39+
{
40+
if( ! _pixelFormat )
41+
throw std::runtime_error( "unable to find pixel format." );
42+
43+
const char* formatName = av_get_pix_fmt_name( _pixelFormat );
44+
return formatName ? std::string( formatName ) : "unknown pixel format";
45+
}
46+
3847
size_t PixelProperties::getBitsPerPixel() const
3948
{
4049
if( ! _pixelDesc )
@@ -214,6 +223,7 @@ PropertiesMap PixelProperties::getPropertiesAsMap() const
214223
PropertiesMap dataMap;
215224

216225
detail::add( dataMap, "pixelName", getPixelName() );
226+
detail::add( dataMap, "pixelFormatName", getPixelFormatName() );
217227
detail::add( dataMap, "bitDepth", getBitsPerPixel() );
218228
detail::add( dataMap, "nbComponents", getNbComponents() );
219229
detail::add( dataMap, "chromaWidth", getChromaWidth() );

src/AvTranscoder/mediaProperty/PixelProperties.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class AvExport PixelProperties
5353
PixelProperties( const AVPixelFormat avPixelFormat );
5454

5555
std::string getPixelName() const;
56+
std::string getPixelFormatName() const;
5657

5758
size_t getBitsPerPixel() const;
5859
size_t getNbComponents() const;

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 92 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,61 @@ StreamTranscoder::StreamTranscoder(
4343
{
4444
case AVMEDIA_TYPE_VIDEO :
4545
{
46+
VideoFrameDesc inputFrameDesc( _inputStream->getVideoCodec().getVideoFrameDesc() );
47+
48+
// generator decoder
49+
VideoGenerator* generatorVideo = new VideoGenerator();
50+
generatorVideo->setVideoFrameDesc( inputFrameDesc );
51+
_generator = generatorVideo;
52+
53+
// buffers to process
54+
_sourceBuffer = new VideoFrame( inputFrameDesc );
55+
_frameBuffer = new VideoFrame( inputFrameDesc );
56+
57+
// transform
58+
_transform = new VideoTransform();
59+
60+
// output encoder
61+
VideoEncoder* outputVideo = new VideoEncoder( _inputStream->getVideoCodec().getCodecName() );
62+
outputVideo->getVideoCodec().setImageParameters( inputFrameDesc );
63+
outputVideo->setup();
64+
_outputEncoder = outputVideo;
65+
66+
// output stream
4667
_outputStream = &outputFile.addVideoStream( _inputStream->getVideoCodec() );
68+
4769
break;
4870
}
4971
case AVMEDIA_TYPE_AUDIO :
5072
{
73+
AudioFrameDesc inputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() );
74+
75+
// generator decoder
76+
AudioGenerator* generatorAudio = new AudioGenerator();
77+
generatorAudio->setAudioFrameDesc( inputFrameDesc );
78+
_generator = generatorAudio;
79+
80+
// buffers to process
81+
_sourceBuffer = new AudioFrame( inputFrameDesc );
82+
_frameBuffer = new AudioFrame( inputFrameDesc );
83+
84+
// transform
85+
_transform = new AudioTransform();
86+
87+
// output encoder
88+
AudioEncoder* outputAudio = new AudioEncoder( _inputStream->getAudioCodec().getCodecName() );
89+
outputAudio->getAudioCodec().setAudioParameters( inputFrameDesc );
90+
outputAudio->setup();
91+
_outputEncoder = outputAudio;
92+
93+
// output stream
5194
_outputStream = &outputFile.addAudioStream( _inputStream->getAudioCodec() );
95+
5296
break;
5397
}
5498
case AVMEDIA_TYPE_DATA :
5599
{
100+
// @warning: rewrap a data stream can't be lengthen by a generator (end of rewrapping will end the all process)
56101
_outputStream = &outputFile.addDataStream( _inputStream->getDataCodec() );
57102
break;
58103
}
@@ -87,41 +132,47 @@ StreamTranscoder::StreamTranscoder(
87132
{
88133
case AVMEDIA_TYPE_VIDEO :
89134
{
135+
// input decoder
90136
_inputDecoder = new VideoDecoder( *static_cast<InputStream*>( _inputStream ) );
91137
_inputDecoder->setup();
138+
_currentDecoder = _inputDecoder;
92139

140+
// output encoder
93141
VideoEncoder* outputVideo = new VideoEncoder( profile.at( constants::avProfileCodec ) );
94-
95142
_outputEncoder = outputVideo;
96143

97144
VideoFrameDesc outputFrameDesc = _inputStream->getVideoCodec().getVideoFrameDesc();
98145
outputFrameDesc.setParameters( profile );
99146
outputVideo->setProfile( profile, outputFrameDesc );
100-
147+
148+
// output stream
101149
_outputStream = &outputFile.addVideoStream( outputVideo->getVideoCodec() );
102150

151+
// buffers to process
103152
_sourceBuffer = new VideoFrame( _inputStream->getVideoCodec().getVideoFrameDesc() );
104153
_frameBuffer = new VideoFrame( outputVideo->getVideoCodec().getVideoFrameDesc() );
105-
154+
155+
// transform
106156
_transform = new VideoTransform();
107157

158+
// generator decoder
108159
VideoGenerator* generatorVideo = new VideoGenerator();
109160
generatorVideo->setVideoFrameDesc( outputVideo->getVideoCodec().getVideoFrameDesc() );
110161
_generator = generatorVideo;
111162

112-
_currentDecoder = _inputDecoder;
113-
114163
break;
115164
}
116165
case AVMEDIA_TYPE_AUDIO :
117166
{
167+
// input decoder
118168
_inputDecoder = new AudioDecoder( *static_cast<InputStream*>( _inputStream ) );
119169
_inputDecoder->setup();
120-
121-
AudioEncoder* outputAudio = new AudioEncoder( profile.at( constants::avProfileCodec ) );
170+
_currentDecoder = _inputDecoder;
122171

172+
// output encoder
173+
AudioEncoder* outputAudio = new AudioEncoder( profile.at( constants::avProfileCodec ) );
123174
_outputEncoder = outputAudio;
124-
175+
125176
AudioFrameDesc outputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() );
126177
outputFrameDesc.setParameters( profile );
127178
if( subStreamIndex > -1 )
@@ -131,23 +182,25 @@ StreamTranscoder::StreamTranscoder(
131182
}
132183
outputAudio->setProfile( profile, outputFrameDesc );
133184

185+
// output stream
134186
_outputStream = &outputFile.addAudioStream( outputAudio->getAudioCodec() );
135187

188+
// buffers to process
136189
AudioFrameDesc inputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() );
137190
if( subStreamIndex > -1 )
138191
inputFrameDesc.setChannels( 1 );
139-
192+
140193
_sourceBuffer = new AudioFrame( inputFrameDesc );
141194
_frameBuffer = new AudioFrame( outputAudio->getAudioCodec().getAudioFrameDesc() );
142-
195+
196+
// transform
143197
_transform = new AudioTransform();
144198

199+
// generator decoder
145200
AudioGenerator* generatorAudio = new AudioGenerator();
146201
generatorAudio->setAudioFrameDesc( outputAudio->getAudioCodec().getAudioFrameDesc() );
147202
_generator = generatorAudio;
148203

149-
_currentDecoder = _inputDecoder;
150-
151204
break;
152205
}
153206
default:
@@ -181,57 +234,55 @@ StreamTranscoder::StreamTranscoder(
181234
{
182235
if( profile.find( constants::avProfileType )->second == constants::avProfileTypeVideo )
183236
{
184-
// Create input essence based on a given input VideoCodec
237+
// generator decoder
185238
VideoGenerator* generatorVideo = new VideoGenerator();
186239
const VideoCodec& inputVideoCodec = static_cast<const VideoCodec&>( inputCodec );
187240
generatorVideo->setVideoFrameDesc( inputVideoCodec.getVideoFrameDesc() );
188-
_inputDecoder = generatorVideo;
241+
_currentDecoder = generatorVideo;
189242

190-
// Create inputFrame, and outputFrame which is based on a given profile
243+
// buffers to process
191244
VideoFrameDesc inputFrameDesc = inputVideoCodec.getVideoFrameDesc();
192245
VideoFrameDesc outputFrameDesc = inputFrameDesc;
193246
outputFrameDesc.setParameters( profile );
194247
_sourceBuffer = new VideoFrame( inputFrameDesc );
195248
_frameBuffer = new VideoFrame( outputFrameDesc );
196249

197-
// Create output essence
250+
// transform
251+
_transform = new VideoTransform();
252+
253+
// output encoder
198254
VideoEncoder* outputVideo = new VideoEncoder( profile.at( constants::avProfileCodec ) );
199255
outputVideo->setProfile( profile, outputFrameDesc );
200256
_outputEncoder = outputVideo;
201257

202-
// Create a video stream in the output file
258+
// output stream
203259
_outputStream = &outputFile.addVideoStream( outputVideo->getVideoCodec() );
204-
205-
_transform = new VideoTransform();
206-
207-
_currentDecoder = _inputDecoder;
208260
}
209261
else if( profile.find( constants::avProfileType )->second == constants::avProfileTypeAudio )
210262
{
211-
// Create input essence based on a given input AudioCodec
263+
// generator decoder
212264
AudioGenerator* generatorAudio = new AudioGenerator();
213265
const AudioCodec& inputAudioCodec = static_cast<const AudioCodec&>( inputCodec );
214266
generatorAudio->setAudioFrameDesc( inputAudioCodec.getAudioFrameDesc() );
215-
_inputDecoder = generatorAudio;
267+
_currentDecoder = generatorAudio;
216268

217-
// Create inputFrame, and outputFrame which is based on a given profile
269+
// buffers to process
218270
AudioFrameDesc inputFrameDesc = inputAudioCodec.getAudioFrameDesc();
219271
AudioFrameDesc outputFrameDesc = inputFrameDesc;
220272
outputFrameDesc.setParameters( profile );
221273
_sourceBuffer = new AudioFrame( inputFrameDesc );
222274
_frameBuffer = new AudioFrame( outputFrameDesc );
223275

224-
// Create output essence
276+
// transform
277+
_transform = new AudioTransform();
278+
279+
// output encoder
225280
AudioEncoder* outputAudio = new AudioEncoder( profile.at( constants::avProfileCodec ) );
226281
outputAudio->setProfile( profile, outputFrameDesc );
227282
_outputEncoder = outputAudio;
228283

229-
// Create an audio stream in the output file
284+
// output stream
230285
_outputStream = &outputFile.addAudioStream( outputAudio->getAudioCodec() );
231-
232-
_transform = new AudioTransform();
233-
234-
_currentDecoder = _inputDecoder;
235286
}
236287
else
237288
{
@@ -241,8 +292,8 @@ StreamTranscoder::StreamTranscoder(
241292

242293
StreamTranscoder::~StreamTranscoder()
243294
{
244-
delete _frameBuffer;
245295
delete _sourceBuffer;
296+
delete _frameBuffer;
246297
delete _generator;
247298
delete _outputEncoder;
248299
delete _transform;
@@ -252,7 +303,7 @@ StreamTranscoder::~StreamTranscoder()
252303
void StreamTranscoder::preProcessCodecLatency()
253304
{
254305
// rewrap case: no need to take care of the latency of codec
255-
if( ! _inputDecoder )
306+
if( ! _currentDecoder )
256307
return;
257308

258309
int latency = _outputEncoder->getCodec().getLatency();
@@ -271,7 +322,7 @@ void StreamTranscoder::preProcessCodecLatency()
271322

272323
bool StreamTranscoder::processFrame()
273324
{
274-
if( ! _inputDecoder )
325+
if( ! _currentDecoder )
275326
{
276327
return processRewrap();
277328
}
@@ -291,7 +342,14 @@ bool StreamTranscoder::processRewrap()
291342
CodedData data;
292343

293344
if( ! _inputStream->readNextPacket( data ) )
345+
{
346+
if( _canSwitchToGenerator )
347+
{
348+
switchToGeneratorDecoder();
349+
return processTranscode();
350+
}
294351
return false;
352+
}
295353

296354
IOutputStream::EWrappingStatus wrappingStatus = _outputStream->wrap( data );
297355

@@ -311,7 +369,7 @@ bool StreamTranscoder::processRewrap()
311369

312370
bool StreamTranscoder::processTranscode( const int subStreamIndex )
313371
{
314-
assert( _inputDecoder != NULL );
372+
assert( _outputStream != NULL );
315373
assert( _currentDecoder != NULL );
316374
assert( _outputEncoder != NULL );
317375
assert( _sourceBuffer != NULL );

0 commit comments

Comments
 (0)