#include <tbb/atomic.h>
#include <tbb/recursive_mutex.h>
-#include <boost/rational.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/mutex.hpp>
const bool thumbnail_mode_;
tbb::atomic<bool> loop_;
uint32_t frame_number_ = 0;
- boost::rational<int> framerate_ = read_framerate(*format_context_, 1);
tbb::concurrent_bounded_queue<std::shared_ptr<AVPacket>> buffer_;
tbb::atomic<size_t> buffer_size_;
auto resource_name = std::wstring();
auto parts = caspar::protocol_split(url_or_file);
+ auto protocol = parts.at(0);
+ auto path = parts.at(1);
AVInputFormat* input_format = nullptr;
- if (parts.at(0).empty())
- resource_name = parts.at(1);
- else if (parts.at(0) == L"dshow")
+ static const std::set<std::wstring> PROTOCOLS_TREATED_AS_FORMATS = { L"dshow", L"v4l2" };
+
+ if (protocol.empty())
+ resource_name = path;
+ else if (PROTOCOLS_TREATED_AS_FORMATS.find(protocol) != PROTOCOLS_TREATED_AS_FORMATS.end())
{
- input_format = av_find_input_format("dshow");
- resource_name = parts.at(1);
+ input_format = av_find_input_format(u8(protocol).c_str());
+ resource_name = path;
}
else
- resource_name = parts.at(0) + L"://" + parts.at(1);
+ resource_name = protocol + L"://" + path;
AVFormatContext* weak_context = nullptr;
THROW_ON_ERROR2(avformat_open_input(&weak_context, u8(resource_name).c_str(), input_format, &format_options), resource_name);
{
return 0; // TODO
}
-
- boost::rational<int> framerate() const
- {
- return framerate_;
- }
};
input::input(const spl::shared_ptr<diagnostics::graph>& graph, const std::wstring& url_or_file, bool loop, uint32_t start, uint32_t length, bool thumbnail_mode, const ffmpeg_options& vid_params)
void input::loop(bool value){impl_->loop_ = value;}
bool input::loop() const{return impl_->loop_;}
int input::num_audio_streams() const { return impl_->num_audio_streams(); }
-boost::rational<int> input::framerate() const { return impl_->framerate(); }
std::future<bool> input::seek(uint32_t target){return impl_->seek(target);}
}}