mirror of
https://github.com/pion/mediadevices.git
synced 2025-09-26 20:41:46 +08:00
115 lines
2.3 KiB
C++
115 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
int width;
|
|
int height;
|
|
uint32_t fcc;
|
|
} imageProp;
|
|
|
|
typedef struct
|
|
{
|
|
int width;
|
|
int height;
|
|
size_t buf; // uintptr
|
|
|
|
char* name;
|
|
int numProps;
|
|
imageProp* props;
|
|
|
|
void* grabber;
|
|
void* mediaControl;
|
|
void* callback;
|
|
} camera;
|
|
|
|
typedef struct
|
|
{
|
|
int num;
|
|
char** name;
|
|
} cameraList;
|
|
|
|
int openCamera(camera* cam, const char** errstr);
|
|
void freeCamera(camera* cam);
|
|
int listResolution(camera* cam, const char** errstr);
|
|
int listCamera(cameraList* list, const char** errstr);
|
|
int freeCameraList(cameraList* list, const char** errstr);
|
|
|
|
imageProp* getProp(camera* cam, int i);
|
|
|
|
char* getName(cameraList* list, int i);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
#include <windows.h>
|
|
#include <string>
|
|
#include <dshow.h>
|
|
std::string utf16Decode(LPOLESTR olestr);
|
|
IPin* getPin(IBaseFilter* filter, PIN_DIRECTION dir);
|
|
char* getCameraName(IMoniker* monier);
|
|
|
|
template <class T>
|
|
void safeRelease(T** p)
|
|
{
|
|
if (*p)
|
|
{
|
|
(*p)->Release();
|
|
*p = nullptr;
|
|
}
|
|
}
|
|
|
|
class SampleGrabberCallback : public ISampleGrabberCB
|
|
{
|
|
private:
|
|
camera* cam_;
|
|
|
|
public:
|
|
inline SampleGrabberCallback(camera* cam)
|
|
: cam_(cam)
|
|
{
|
|
}
|
|
|
|
HRESULT SampleCB(double sampleTime, IMediaSample* sample) final;
|
|
HRESULT BufferCB(double sampleTime, BYTE* buffer, LONG bufferLen) final;
|
|
|
|
inline ULONG STDMETHODCALLTYPE AddRef() final
|
|
{
|
|
return 2;
|
|
}
|
|
inline ULONG STDMETHODCALLTYPE Release() final
|
|
{
|
|
return 1;
|
|
}
|
|
inline HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) final
|
|
{
|
|
if (riid == IID_ISampleGrabberCB || riid == IID_IUnknown)
|
|
{
|
|
*ppv = (void*)static_cast<ISampleGrabberCB*>(this);
|
|
return NOERROR;
|
|
}
|
|
return E_NOINTERFACE;
|
|
}
|
|
};
|
|
|
|
EXTERN_C const CLSID CLSID_NullRenderer;
|
|
EXTERN_C const CLSID CLSID_SampleGrabber;
|
|
|
|
const static char* errAddFilter = "failed to add filter";
|
|
const static char* errConnectFilters = "failed to connect filters";
|
|
const static char* errEnumDevice = "failed to enum device";
|
|
const static char* errGrabber = "failed to create grabber";
|
|
const static char* errGraphBuilder = "failed to build graph";
|
|
const static char* errNoControl = "failed to control media";
|
|
const static char* errTerminator = "failed to create graph terminator";
|
|
const static char* errGetConfig = "failed to get config";
|
|
|
|
#endif
|