30#include "../video_device.h"
49 std::vector<VideoSize>
getSizeList(
const std::string& channel)
const;
57 std::unique_ptr<CaptureGraphInterfaces> cInterface;
60 std::vector<VideoSize> sizeList_;
61 std::map<VideoSize, std::vector<FrameRate>> rateList_;
62 std::map<VideoSize, AM_MEDIA_TYPE*> capMap_;
65 void fail(
const std::string& error);
71 , cInterface(
new CaptureGraphInterfaces())
77VideoDeviceImpl::setup()
82 sizeList_.emplace_back(size);
99 (
void**) &cInterface->captureGraph_);
101 return fail(
"Unable to create the Filter Graph Manager");
107 (
void**) &cInterface->graph_);
109 return fail(
"Unable to add the graph builder!");
111 hr = cInterface->captureGraph_->SetFiltergraph(cInterface->graph_);
113 return fail(
"Unable to set filtergraph.");
127 if (FAILED(
hr) ||
pEnum ==
nullptr) {
191 (
void**) &cInterface->videoInputFilter_);
193 hr = cInterface->graph_->AddFilter(cInterface->videoInputFilter_,
var.bstrVal);
195 fail(
"Unable to add filter to video device.");
199 cInterface->videoInputFilter_,
201 (
void**) &cInterface->streamConf_);
205 cInterface->videoInputFilter_,
207 (
void**) &cInterface->streamConf_);
209 fail(
"Unable to config the stream!");
221 if (FAILED(
hr) || cInterface->streamConf_ ==
NULL) {
222 fail(
"Unable to find the video device.");
227 cInterface->streamConf_->GetNumberOfCapabilities(&
piCount, &
piSize);
230 std::map<std::pair<jami::video::VideoSize, jami::video::FrameRate>,
LONG>
bitrateList;
232 cInterface->streamConf_->GetStreamCaps(
i, &
pmt, (
BYTE*) &
pSCC);
246 auto ratesIt = rateList_.find(size);
251 auto key = std::make_pair(size,
rate);
259 sizeList_.emplace_back(size);
267VideoDeviceImpl::fail(
const std::string& error)
269 throw std::runtime_error(error);
281 params.format =
"dxgigrab";
282 params.framerate = desktopFrameRate_;
305 desktopFrameRate_ =
params.framerate;
310 if (
pmt !=
nullptr) {
313 if (FAILED(cInterface->streamConf_->SetFormat(
pmt))) {
314 JAMI_ERR(
"Unable to set settings.");
320std::vector<VideoSize>
326std::vector<FrameRate>
330 return rateList_.at(size);
333std::vector<VideoSize>
340std::vector<std::string>
347 const std::vector<std::map<std::string, std::string>>&)
348 : deviceImpl_(
new VideoDeviceImpl(path))
351 name = deviceImpl_->name;
357 return deviceImpl_->getDeviceParams();
361VideoDevice::setDeviceParams(
const DeviceParams&
params)
363 return deviceImpl_->setDeviceParams(
params);
366std::vector<std::string>
369 return deviceImpl_->getChannelList();
372std::vector<VideoSize>
373VideoDevice::getSizeList(
const std::string& channel)
const
375 return deviceImpl_->getSizeList(channel);
378std::vector<FrameRate>
379VideoDevice::getRateList(
const std::string& channel,
VideoSize size)
const
381 return deviceImpl_->getRateList(channel, size);
VideoDeviceImpl(const std::string &id)
std::vector< VideoSize > getSizeList() const
std::vector< std::string > getChannelList() const
VideoDeviceImpl(const std::string &path)
std::vector< FrameRate > getRateList(const std::string &channel, VideoSize size) const
void setDeviceParams(const DeviceParams &)
DeviceParams getDeviceParams() const
std::vector< FrameRate > getRateList() const
std::vector< VideoSize > getSizeList(const std::string &channel) const
std::vector< std::string > getChannelList() const
VideoDevice(const std::string &path, const std::vector< std::map< std::string, std::string > > &devInfo)
DeviceParams getDeviceParams() const
Returns the parameters needed for actual use of the device.
int64_t size(const std::filesystem::path &path)
static constexpr const char DEVICE_DESKTOP[]
std::pair< unsigned, unsigned > VideoSize
rational< double > FrameRate
void emitSignal(Args... args)
std::string to_string(double value)
DeviceParams Parameters used by MediaDecoder and MediaEncoder to open a LibAV device/stream.