void VideoFrameDesc::setParameters( const ProfileLoader::Profile& profile ) { // width if( profile.count( constants::avProfileWidth ) ) setWidth( atoi( profile.find( constants::avProfileWidth )->second.c_str() ) ); // height if( profile.count( constants::avProfileHeight ) ) setHeight( atoi( profile.find( constants::avProfileHeight )->second.c_str() ) ); // pixel format if( profile.count( constants::avProfilePixelFormat ) ) setPixelFormat( profile.find( constants::avProfilePixelFormat )->second ); // fps if( profile.count( constants::avProfileFrameRate ) ) setFps( atof( profile.find( constants::avProfileFrameRate )->second.c_str() ) ); }
StreamTranscoder::StreamTranscoder( const ICodec& inputCodec, IOutputFile& outputFile, const ProfileLoader::Profile& profile ) : _inputStream( NULL ) , _outputStream( NULL ) , _sourceBuffer( NULL ) , _frameBuffer( NULL ) , _inputDecoder( NULL ) , _generator( NULL ) , _currentDecoder( NULL ) , _outputEncoder( NULL ) , _transform( NULL ) , _subStreamIndex( -1 ) , _offset( 0 ) , _canSwitchToGenerator( false ) { if( profile.find( constants::avProfileType )->second == constants::avProfileTypeVideo ) { // generator decoder VideoGenerator* generatorVideo = new VideoGenerator(); const VideoCodec& inputVideoCodec = static_cast<const VideoCodec&>( inputCodec ); generatorVideo->setVideoFrameDesc( inputVideoCodec.getVideoFrameDesc() ); _currentDecoder = generatorVideo; // buffers to process VideoFrameDesc inputFrameDesc = inputVideoCodec.getVideoFrameDesc(); VideoFrameDesc outputFrameDesc = inputFrameDesc; outputFrameDesc.setParameters( profile ); _sourceBuffer = new VideoFrame( inputFrameDesc ); _frameBuffer = new VideoFrame( outputFrameDesc ); // transform _transform = new VideoTransform(); // output encoder VideoEncoder* outputVideo = new VideoEncoder( profile.at( constants::avProfileCodec ) ); outputVideo->setProfile( profile, outputFrameDesc ); _outputEncoder = outputVideo; // output stream _outputStream = &outputFile.addVideoStream( outputVideo->getVideoCodec() ); } else if( profile.find( constants::avProfileType )->second == constants::avProfileTypeAudio ) { // generator decoder AudioGenerator* generatorAudio = new AudioGenerator(); const AudioCodec& inputAudioCodec = static_cast<const AudioCodec&>( inputCodec ); generatorAudio->setAudioFrameDesc( inputAudioCodec.getAudioFrameDesc() ); _currentDecoder = generatorAudio; // buffers to process AudioFrameDesc inputFrameDesc = inputAudioCodec.getAudioFrameDesc(); AudioFrameDesc outputFrameDesc = inputFrameDesc; outputFrameDesc.setParameters( profile ); _sourceBuffer = new AudioFrame( inputFrameDesc ); _frameBuffer = new AudioFrame( outputFrameDesc ); // transform _transform = new AudioTransform(); // output encoder AudioEncoder* outputAudio = new AudioEncoder( profile.at( constants::avProfileCodec ) ); outputAudio->setProfile( profile, outputFrameDesc ); _outputEncoder = outputAudio; // output stream _outputStream = &outputFile.addAudioStream( outputAudio->getAudioCodec() ); } else { throw std::runtime_error( "unupported stream type" ); } }