IMFExtendedCameraControl
COM公式ドキュメント
このインターフェイスは、キャプチャデバイスの拡張プロパティを構成するために使用します。
解説(Remarks)
このインターフェイスのインスタンスは、IMFExtendedCameraController::GetExtendedCameraControl を呼び出して取得します。
サポートされないプロパティ
一部の KSCAMERA_EXTENDEDPROP_ プロパティは、この API ではサポートされていない点に注意してください。それらの機能は、クライアントアプリからは WinRT のメディアキャプチャ API を通じてのみアクセスできます。
KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART
このプロパティの動作は、次の WinRT API を通じて公開されます。
- PrepareLowLagPhotoCaptureAsync
- PrepareLowLagRecordToCustomSinkAsync
- PrepareLowLagRecordToStorageFileAsync
- PrepareLowLagRecordToStreamAsync
これらの API は、選択されたメディアタイプでキャプチャパイプラインを構成し、ドライバーピンを一時停止状態にします。これによりドライバーに対して、その操作に必要なハードウェアリソースを割り当て・構成するよう通知されます。これは、リソースの準備を前倒しで行うことで、レイテンシを最小化するのに役立ちます。
ウォームスタート機能はキャプチャデバイスにとって任意のコントロールである点に注意してください。したがって、そのコントロールが利用できない場合、上記の API はウォームスタントの動作を提供しません。ただしこれらの API はキャプチャのシンク側は引き続き構成するため、使用することで一定の利点があります。
KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE
このプロパティの動作は、次の WinRT API を通じて公開されます。
これらの API は、パイプラインのキャプチャ側とシンク側の両方を構成し、ドライバーピンを実行状態にして、フレームをキャプチャしますが、まだパイプラインには渡しません。フレームは、キャプチャ操作が開始されたときにパイプラインを通じて渡され始めます。
この機能はキャプチャデバイスにとって任意のコントロールである点に注意してください。したがって、そのコントロールが利用できない場合、上記の API はエラーを返します。
例
次の例は、KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON フラグを設定し、その設定をコミットする方法を示します。
if (FAILED(m_cameraController->GetExtendedCameraControl(MF_CAPTURE_ENGINE_MEDIASOURCE,
KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE,
cameraControl.put())))
{
// Return false to indicate that the Torch Mode control is not available.
return false;
}
ULONGLONG capabilities = cameraControl->GetCapabilities();
// Check if the torch can be turned on.
if (capabilities & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON)
{
// Check if the torch is off.
if ((cameraControl->GetFlags() & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON) == 0)
{
// Torch is off. Tell the camera to turn it on.
check_hresult(cameraControl->SetFlags(KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON));
// Write the changed settings to the driver.
check_hresult(cameraControl->CommitSettings());
}
}
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
キャプチャデバイスがサポートするプロパティ機能を照会します。
戻り値
プロパティ機能に対応する ULONGLONG です。サポートされるプロパティと機能は、ksmedia.h で定義されるヘッダーファイル内に、命名規則 KSCAMERA_EXTENDEDPROP_ に従った定数として定義されています。詳細については、KSPROPERTYSETID_ExtendedCameraControl を参照してください。
解説(Remarks)
特定の機能が存在するかどうかは、この関数の戻り値とビットごとの AND 演算を行うことで確認します。一部のドライバーでは、どのコントロールがサポートされているかを判別できるようにするために、カメラデバイスのプレビューが実行状態である必要があります。プレビューストリームが実行される前に特定のコントロールがサポートされているかを確認した場合、そのコントロールはビデオデバイスによってサポートされていても、サポートされていない(したがって利用できない)と示されることがあります。
次の例は、KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON 機能のサポートを照会する方法を示します。
if (FAILED(m_cameraController->GetExtendedCameraControl(MF_CAPTURE_ENGINE_MEDIASOURCE,
KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE,
cameraControl.put())))
{
// Return false to indicate that the Torch Mode control is not available.
return false;
}
ULONGLONG capabilities = cameraControl->GetCapabilities();
// Check if the torch can be turned on.
if (capabilities & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON)
{
// Check if the torch is off.
if ((cameraControl->GetFlags() & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON) == 0)
{
// Torch is off. Tell the camera to turn it on.
check_hresult(cameraControl->SetFlags(KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON));
// Write the changed settings to the driver.
check_hresult(cameraControl->CommitSettings());
}
}
キャプチャデバイス上のプロパティにフラグを設定します。
| ulFlags | ULONGLONG | in | プロパティフラグに対応する ULONGLONG です。サポートされるプロパティとフラグは、ksmedia.h で定義されるヘッダーファイル内に、命名規則 KSCAMERA_EXTENDEDPROP_ に従った定数として定義されています。詳細については、KSPROPERTYSETID_ExtendedCameraControl を参照してください。 |
戻り値
成功した場合は S_OK を返します。
解説(Remarks)
プロパティフラグを設定する前に、IMFExtendedCameraControl::GetCapabilities を呼び出してサポートされる機能を確認できます。次の例は、KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON 機能のサポートを照会する方法を示します。
if (FAILED(m_cameraController->GetExtendedCameraControl(MF_CAPTURE_ENGINE_MEDIASOURCE,
KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE,
cameraControl.put())))
{
// Return false to indicate that the Torch Mode control is not available.
return false;
}
ULONGLONG capabilities = cameraControl->GetCapabilities();
// Check if the torch can be turned on.
if (capabilities & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON)
{
// Check if the torch is off.
if ((cameraControl->GetFlags() & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON) == 0)
{
// Torch is off. Tell the camera to turn it on.
check_hresult(cameraControl->SetFlags(KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON));
// Write the changed settings to the driver.
check_hresult(cameraControl->CommitSettings());
}
}
キャプチャデバイス上のプロパティフラグを照会します。
戻り値
プロパティフラグに対応する ULONGLONG です。サポートされるプロパティとフラグは、ksmedia.h で定義されるヘッダーファイル内に、命名規則 KSCAMERA_EXTENDEDPROP_ に従った定数として定義されています。詳細については、KSPROPERTYSETID_ExtendedCameraControl を参照してください。
解説(Remarks)
キャプチャデバイス上のプロパティフラグは、IMFExtendedCameraControl::SetFlags を呼び出して設定します。プロパティフラグを設定する前に、IMFExtendedCameraControl::GetCapabilities を呼び出してサポートされる機能を確認できます。次の例は、KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON 機能のサポートを照会する方法を示します。
if (FAILED(m_cameraController->GetExtendedCameraControl(MF_CAPTURE_ENGINE_MEDIASOURCE,
KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE,
cameraControl.put())))
{
// Return false to indicate that the Torch Mode control is not available.
return false;
}
ULONGLONG capabilities = cameraControl->GetCapabilities();
// Check if the torch can be turned on.
if (capabilities & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON)
{
// Check if the torch is off.
if ((cameraControl->GetFlags() & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON) == 0)
{
// Torch is off. Tell the camera to turn it on.
check_hresult(cameraControl->SetFlags(KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON));
// Write the changed settings to the driver.
check_hresult(cameraControl->CommitSettings());
}
}
ペイロードの照会または変更を可能にするため、キャプチャデバイスコントロールに含まれる内部ペイロードバッファをロックします。
| ppPayload | BYTE** | out | 生のペイロードを格納するバッファへの BYTE ポインターを受け取ります。呼び出し元はこのバッファを直接解放してはならず、代わりに IMFExtendedCameraControl::UnlockPayload を呼び出してリソースを解放してください。 |
| pulPayload | DWORD* | out | ppPayload で返されるバッファのサイズを受け取ります。 |
戻り値
成功した場合は S_OK を返します。
キャプチャデバイスコントロールに含まれる生のペイロードのロックを解除します。
戻り値
成功した場合は S_OK を返します。
解説(Remarks)
キャプチャデバイスコントロール内のペイロードは、IMFExtendedCameraControl::LockPayload を呼び出してロックします。
構成したコントロール設定をカメラドライバーにコミットします。
戻り値
成功した場合は S_OK を返します。
解説(Remarks)
次の例は、KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON フラグを設定し、その設定をコミットする方法を示します。
if (FAILED(m_cameraController->GetExtendedCameraControl(MF_CAPTURE_ENGINE_MEDIASOURCE,
KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE,
cameraControl.put())))
{
// Return false to indicate that the Torch Mode control is not available.
return false;
}
ULONGLONG capabilities = cameraControl->GetCapabilities();
// Check if the torch can be turned on.
if (capabilities & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON)
{
// Check if the torch is off.
if ((cameraControl->GetFlags() & KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON) == 0)
{
// Torch is off. Tell the camera to turn it on.
check_hresult(cameraControl->SetFlags(KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON));
// Write the changed settings to the driver.
check_hresult(cameraControl->CommitSettings());
}
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFExtendedCameraControl "{38E33520-FCA1-4845-A27A-68B7C6AB3789}" #usecom global IMFExtendedCameraControl IID_IMFExtendedCameraControl "{}" #comfunc global IMFExtendedCameraControl_GetCapabilities 3 #comfunc global IMFExtendedCameraControl_SetFlags 4 int64 #comfunc global IMFExtendedCameraControl_GetFlags 5 #comfunc global IMFExtendedCameraControl_LockPayload 6 var,var #comfunc global IMFExtendedCameraControl_UnlockPayload 7 #comfunc global IMFExtendedCameraControl_CommitSettings 8 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IMFExtendedCameraControl "{38E33520-FCA1-4845-A27A-68B7C6AB3789}" #usecom global IMFExtendedCameraControl IID_IMFExtendedCameraControl "{}" #comfunc global IMFExtendedCameraControl_GetCapabilities 3 #comfunc global IMFExtendedCameraControl_SetFlags 4 int64 #comfunc global IMFExtendedCameraControl_GetFlags 5 #comfunc global IMFExtendedCameraControl_LockPayload 6 sptr,sptr #comfunc global IMFExtendedCameraControl_UnlockPayload 7 #comfunc global IMFExtendedCameraControl_CommitSettings 8 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。