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]); } }
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); };
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); }
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(); } }
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; };