Skip to content

Commit

Permalink
Added default stride to support bottom-up clients.
Browse files Browse the repository at this point in the history
  • Loading branch information
smourier committed Jan 22, 2024
1 parent 51b0a63 commit 0ee0413
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 2 deletions.
13 changes: 13 additions & 0 deletions VCamSampleSource/EnumNames.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,18 @@ static DWORDAndNameW __KSPROPERTY_PIN[]
ID_AND_NAME_W(KSPROPERTY_PIN_MODEDATAFORMATS),
};

static DWORDAndNameW __KSPROPERTY_CONNECTION[]
{
ID_AND_NAME_W(KSPROPERTY_CONNECTION_STATE),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_PRIORITY),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_DATAFORMAT),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_ALLOCATORFRAMING),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_ACQUIREORDERING),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX),
ID_AND_NAME_W(KSPROPERTY_CONNECTION_STARTAT),
};

static DWORDAndNameW __MF_ATTRIBUTE_TYPE[]
{
ID_AND_NAME_W(MF_ATTRIBUTE_UINT32),
Expand Down Expand Up @@ -559,6 +571,7 @@ const std::wstring KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_ToString(ULONG va
const std::wstring PROPSETID_VIDCAP_CAMERACONTROL_IMAGE_PIN_CAPABILITY_ToString(ULONG value) { return ToString(__KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY, sizeof(__KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY) / sizeof(DWORDAndNameA), value); }
const std::wstring KSPROPERTY_TOPOLOGY_ToString(ULONG value) { return ToString(__KSPROPERTY_TOPOLOGY, sizeof(__KSPROPERTY_TOPOLOGY) / sizeof(DWORDAndNameA), value); }
const std::wstring KSPROPERTY_PIN_ToString(ULONG value) { return ToString(__KSPROPERTY_PIN, sizeof(__KSPROPERTY_PIN) / sizeof(DWORDAndNameA), value); }
const std::wstring KSPROPSETID_Connection_ToString(ULONG value) { return ToString(__KSPROPERTY_CONNECTION, sizeof(__KSPROPERTY_CONNECTION) / sizeof(DWORDAndNameA), value); }

const std::wstring KSPROPERTY_TYPE_ToString(ULONG value) { return ToString(__KSPROPERTY_TYPE, sizeof(__KSPROPERTY_TYPE) / sizeof(DWORDAndNameA), value, true); }
const std::wstring MF_ATTRIBUTE_TYPE_ToString(MF_ATTRIBUTE_TYPE value) { return ToString(__MF_ATTRIBUTE_TYPE, sizeof(__MF_ATTRIBUTE_TYPE) / sizeof(DWORDAndNameA), value); }
Expand Down
1 change: 1 addition & 0 deletions VCamSampleSource/EnumNames.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ const std::wstring KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_PROPERTY_ToString(UL
const std::wstring KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_ToString(ULONG value);
const std::wstring KSPROPERTY_TOPOLOGY_ToString(ULONG value);
const std::wstring KSPROPERTY_PIN_ToString(ULONG value);
const std::wstring KSPROPSETID_Connection_ToString(ULONG value);


2 changes: 1 addition & 1 deletion VCamSampleSource/FrameGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ HRESULT FrameGenerator::Generate(IMFSample* sample, REFGUID format, IMFSample**
hr = lock->GetDataPointer(&wicSize, &wicPointer);
if (SUCCEEDED(hr))
{
//WINTRACE(L"WIC stride:%u WIC size:%u MF pitch:%u MF length:%u frame:%u format:%s", wicStride, wicSize, pitch, length, _frame, GUID_ToStringW(format).c_str());
WINTRACE(L"WIC stride:%u WIC size:%u MF pitch:%u MF length:%u frame:%u format:%s", wicStride, wicSize, pitch, length, _frame, GUID_ToStringW(format).c_str());
if (format == MFVideoFormat_NV12)
{
// note we could use MF's converter too
Expand Down
3 changes: 3 additions & 0 deletions VCamSampleSource/MFTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,8 @@ std::wstring PKSIDENTIFIER_ToString(PKSIDENTIFIER id, ULONG length)
if (id->Set == KSPROPSETID_Pin)
return L"KSPROPSETID_Pin " + KSPROPERTY_PIN_ToString(id->Id) + L" " + flags;

if (id->Set == KSPROPSETID_Connection)
return L"KSPROPSETID_Connection " + KSPROPSETID_Connection_ToString(id->Id) + L" " + flags;

return std::format(L"{} {} {}", GUID_ToStringW(id->Set), id->Id, flags);
}
37 changes: 37 additions & 0 deletions VCamSampleSource/MediaStream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ HRESULT MediaStream::Initialize(IMFMediaSource* source, int index)
rgbType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
rgbType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32);
MFSetAttributeSize(rgbType.get(), MF_MT_FRAME_SIZE, NUM_IMAGE_COLS, NUM_IMAGE_ROWS);
rgbType->SetUINT32(MF_MT_DEFAULT_STRIDE, NUM_IMAGE_COLS * 4);
rgbType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
rgbType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
MFSetAttributeRatio(rgbType.get(), MF_MT_FRAME_RATE, 30, 1);
Expand All @@ -48,6 +49,7 @@ HRESULT MediaStream::Initialize(IMFMediaSource* source, int index)
nv12Type->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
nv12Type->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
MFSetAttributeSize(nv12Type.get(), MF_MT_FRAME_SIZE, NUM_IMAGE_COLS, NUM_IMAGE_ROWS);
nv12Type->SetUINT32(MF_MT_DEFAULT_STRIDE, (UINT)(NUM_IMAGE_COLS * 1.5));
MFSetAttributeRatio(nv12Type.get(), MF_MT_FRAME_RATE, 30, 1);
// frame size * pixel bit size * framerate
bitrate = (uint32_t)(NUM_IMAGE_COLS * 1.5 * NUM_IMAGE_ROWS * 8 * 30);
Expand Down Expand Up @@ -260,3 +262,38 @@ STDMETHODIMP MediaStream::GetStreamState(MF_STREAM_STATE* value)
*value = _state;
return S_OK;
}

// IKsControl
STDMETHODIMP_(NTSTATUS) MediaStream::KsProperty(PKSPROPERTY property, ULONG length, LPVOID data, ULONG dataLength, ULONG* bytesReturned)
{
WINTRACE(L"MediaStream::KsProperty len:%u data:%p dataLength:%u", length, data, dataLength);
RETURN_HR_IF_NULL(E_POINTER, property);
RETURN_HR_IF_NULL(E_POINTER, bytesReturned);
winrt::slim_lock_guard lock(_lock);

WINTRACE(L"MediaStream::KsProperty prop:%s", PKSIDENTIFIER_ToString(property, length).c_str());

return HRESULT_FROM_WIN32(ERROR_SET_NOT_FOUND);
}

STDMETHODIMP_(NTSTATUS) MediaStream::KsMethod(PKSMETHOD method, ULONG length, LPVOID data, ULONG dataLength, ULONG* bytesReturned)
{
WINTRACE(L"MediaStream::KsMethod len:%u data:%p dataLength:%u", length, data, dataLength);
RETURN_HR_IF_NULL(E_POINTER, method);
RETURN_HR_IF_NULL(E_POINTER, bytesReturned);
winrt::slim_lock_guard lock(_lock);

WINTRACE(L"MediaStream::KsMethod method:%s", PKSIDENTIFIER_ToString(method, length).c_str());

return HRESULT_FROM_WIN32(ERROR_SET_NOT_FOUND);
}

STDMETHODIMP_(NTSTATUS) MediaStream::KsEvent(PKSEVENT evt, ULONG length, LPVOID data, ULONG dataLength, ULONG* bytesReturned)
{
WINTRACE(L"MediaStream::KsEvent evt:%p len:%u data:%p dataLength:%u", evt, length, data, dataLength);
RETURN_HR_IF_NULL(E_POINTER, bytesReturned);
winrt::slim_lock_guard lock(_lock);

WINTRACE(L"MediaStream::KsEvent event:%s", PKSIDENTIFIER_ToString(evt, length).c_str());
return HRESULT_FROM_WIN32(ERROR_SET_NOT_FOUND);
}
7 changes: 6 additions & 1 deletion VCamSampleSource/MediaStream.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

struct MediaStream : winrt::implements<MediaStream, CBaseAttributes<IMFAttributes>, IMFMediaStream2>
struct MediaStream : winrt::implements<MediaStream, CBaseAttributes<IMFAttributes>, IMFMediaStream2, IKsControl>
{
public:
// IMFMediaEventGenerator
Expand All @@ -18,6 +18,11 @@ struct MediaStream : winrt::implements<MediaStream, CBaseAttributes<IMFAttribute
STDMETHOD(SetStreamState)(MF_STREAM_STATE value);
STDMETHOD(GetStreamState)(MF_STREAM_STATE* value);

// IKsControl
STDMETHOD_(NTSTATUS, KsProperty)(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
STDMETHOD_(NTSTATUS, KsMethod)(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
STDMETHOD_(NTSTATUS, KsEvent)(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);

public:
MediaStream() :
_index(0),
Expand Down
1 change: 1 addition & 0 deletions VCamSampleSource/Tools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ const std::wstring GUID_ToStringW(const GUID& guid, bool resolve)

IFGUID(KSPROPSETID_Pin);
IFGUID(KSPROPSETID_Topology);
IFGUID(KSPROPSETID_Connection);
IFGUID(PROPSETID_VIDCAP_CAMERACONTROL);
IFGUID(PROPSETID_VIDCAP_VIDEOPROCAMP);
IFGUID(PROPSETID_VIDCAP_CAMERACONTROL_REGION_OF_INTEREST);
Expand Down

0 comments on commit 0ee0413

Please sign in to comment.