コード例 #1
0
ファイル: VideoPainter.cpp プロジェクト: hihiy/IntelliVoice
void VideoPainter::consume_enter (ssi_size_t stream_in_num,
	ssi_stream_t stream_in[]) {

	if (_video_format.framesPerSecond != stream_in[0].sr) {		
		_video_format.framesPerSecond = stream_in[0].sr;
		ssi_wrn ("sample rate has been adjusted");
	}

	if (ssi_video_size (_video_format) != stream_in[0].byte) {
		ssi_err ("input stream doesn't match video format");
	}

	if (stream_in[0].dim != 1) {
		ssi_wrn ("supports only one dimension");
	}

	_plot = new PaintVideo (_video_format, _options.flip, _options.scale, _options.mirror, _options.maxValue);
	_plot_id = _painter->AddCanvas (_options.name);
	_painter->AddObject (_plot_id, _plot);

	if (_options.move[0] != 0) {
		if (_options.move[1] != 0) {
			_painter->Move (_plot_id, _options.move[2], _options.move[3], _options.move[4] < 0 ? _video_format.widthInPixels : _options.move[4], _options.move[5] < 0 ? _video_format.heightInPixels : _options.move[5], true);
		} else {
			_painter->Move (_plot_id, _options.move[2], _options.move[3],  _options.move[4] < 0 ? _video_format.widthInPixels : _options.move[4], _options.move[5] < 0 ? _video_format.heightInPixels : _options.move[5]);
		}
	}

	if (_options.arrange[0] != 0) {
		_painter->Arrange (_options.arrange[1], _options.arrange[2], _options.arrange[3], _options.arrange[4], _options.arrange[5], _options.arrange[6]);
	}
}
コード例 #2
0
ファイル: FFMPEGReader.cpp プロジェクト: hcmlab/mobileSSI
void FFMPEGReader::setVideoProvider(IProvider *provider){

	if(_video_provider){
		ssi_wrn ("provider already set");
		return;
	}

	_video_provider = provider;	
	_mode = _mode == MODE::UNDEFINED ? MODE::VIDEO : MODE::AUDIOVIDEO;	

	if (_options.stream) {
		ssi_video_params (_video_format, _options.width, _options.height, _options.fps, 8, 3);
	} else {
		if (!_client->peekVideoFormat (_video_format)) {
			ssi_wrn ("could not determine video format, use default options");
			ssi_video_params (_video_format, _options.width, _options.height, _options.fps, 8, 3);
		}
	}
	
	_video_provider->setMetaData (sizeof (ssi_video_params_t), &_video_format);
	ssi_stream_init (_video_channel.stream, 0, 1, ssi_video_size (_video_format), SSI_IMAGE, _video_format.framesPerSecond);
	_video_provider->init (&_video_channel);	
};
コード例 #3
0
ファイル: FFMPEGReader.cpp プロジェクト: hcmlab/mobileSSI
bool FFMPEGReader::pushVideoFrame (ssi_size_t n_bytes, ssi_byte_t *frame) {

	SSI_ASSERT (n_bytes == ssi_video_size (_video_format));

	return _video_buffer->push (frame);	
}
コード例 #4
0
ファイル: FFMPEGReader.cpp プロジェクト: hcmlab/mobileSSI
void FFMPEGReader::run () {

	if (_video_provider) {
		
		ssi_size_t n_bytes;
		bool is_old;
		ssi_byte_t *frame = _video_buffer->pop(n_bytes, is_old);
		
		SSI_ASSERT (n_bytes == ssi_video_size (_video_format));
		
		if (!_options.bestEffort || !is_old) //in bestEffort mode we only provide new frames
		{
			bool result = _video_provider->provide(frame, 1);

			if (!_options.stream) {
				if (result) {
					_video_buffer->pop_done();
				}
			}
			else {
				_video_buffer->pop_done();
			}

			SSI_DBG(SSI_LOG_LEVEL_DEBUG, "video buffer : %.2f%% ", _video_buffer->getFillState() * 100);
		}
	}

	if (_audio_provider) {

		ssi_size_t n_samples;
		bool is_old;
		ssi_real_t *chunk = _audio_buffer->pop(n_samples, is_old);

		if (!_options.bestEffort || !is_old) // in bestEffort mode we only provide new frames
		{
			bool result = _audio_provider->provide(ssi_pcast(ssi_byte_t, chunk), n_samples);
			if (!_options.stream) {
				if (result) {
					_audio_buffer->pop_done(n_samples);
				}
			}
			else {
				_audio_buffer->pop_done(n_samples);
			}

			SSI_DBG(SSI_LOG_LEVEL_DEBUG, "audio buffer : %.2f%% ", _audio_buffer->getFillState() * 100);
		}
	}

	if (_client->getState() == FFMPEGReaderClient::STATE::IDLE || _client->getState() == FFMPEGReaderClient::STATE::TERMINATE)
	{

		if (_audio_provider) // provide remaining samples in buffer
		{
			ssi_size_t n_samples;
			ssi_real_t *chunk = _audio_buffer->pop_all(n_samples);
			if (n_samples > 0)
			{
				_audio_provider->provide(ssi_pcast(ssi_byte_t, chunk), n_samples);
			}
		}

		_interrupted = false;
		_wait_event.release();
	}

	if (!_options.bestEffort)
	{
		_timer->wait();
	}
}
コード例 #5
0
ファイル: FFMPEGReader.cpp プロジェクト: hcmlab/mobileSSI
bool FFMPEGReader::connect () {

	if (!isStream(_options.url) && !ssi_exists(_options.url))
	{
		ssi_err("file not found '%s'", _options.url);
		return false;
	}

	if (!_client)
	{
		_client = new FFMPEGReaderClient(this);
	}

	if (!(_video_provider||_audio_provider)) {
		ssi_wrn ("provider not set");
		return false;
	};

	FFMPEGReaderClient::SetLogLevel (ssi_log_level);

	if (_mode != MODE::AUDIO) {
		_video_buffer = new FFMPEGVideoBuffer (_options.buffer, _video_format.framesPerSecond, ssi_video_size (_video_format));
		_video_buffer->reset ();
	}

	if (_mode != MODE::VIDEO) {
		if (_mode == MODE::AUDIOVIDEO) {
			_audio_buffer = new FFMPEGAudioBuffer (_options.buffer, _audio_channel.stream.sr, 1.0/_video_format.framesPerSecond);
		} else {
			_audio_buffer = new FFMPEGAudioBuffer (_options.buffer, _audio_channel.stream.sr, _options.ablock);
		}
		_audio_buffer->reset ();
	}

	_client->start();
	_wait_event.block();

	return true;
};