?? capprop.c
字號:
PHW_STREAM_REQUEST_BLOCK pSrb
)
{
PHW_DEVICE_EXTENSION pHwDevExt = ((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
ULONG Id = pSPD->Property->Id; // index of the property
PSTREAMEX pStrmEx;
ULONG StreamIndex;
ULONG *pVideoControlMode;
// For this property set, the StreamIndex is always in the same place
// for each property
StreamIndex = ((PKSPROPERTY_VIDEOCONTROL_CAPS_S) pSPD->Property)->StreamIndex;
ASSERT (StreamIndex < MAX_TESTCAP_STREAMS);
// Verify the stream index is valid
if (StreamIndex >= MAX_TESTCAP_STREAMS) {
pSrb->Status = STATUS_INVALID_PARAMETER;
return;
}
pStrmEx = (PSTREAMEX) pHwDevExt->pStrmEx[StreamIndex];
// If the stream is not opened when this property set is used,
// store the values in the HwDevExt
if (pStrmEx) {
pVideoControlMode = &pStrmEx->VideoControlMode;
}
else {
pVideoControlMode = &pHwDevExt->VideoControlMode;
}
switch (Id) {
case KSPROPERTY_VIDEOCONTROL_CAPS:
{
PKSPROPERTY_VIDEOCONTROL_CAPS_S pS = (PKSPROPERTY_VIDEOCONTROL_CAPS_S) pSPD->PropertyInfo; // pointer to the data
ASSERT (pSPD->PropertyOutputSize >= sizeof (KSPROPERTY_VIDEOCONTROL_CAPS_S));
pS->VideoControlCaps =
KS_VideoControlFlag_FlipHorizontal
// | KS_VideoControlFlag_FlipVertical
// | KS_VideoControlFlag_ExternalTriggerEnable
// | KS_VideoControlFlag_Trigger
;
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCONTROL_CAPS_S);
}
break;
case KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE:
{
PKSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S pS =
(PKSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S) pSPD->PropertyInfo; // pointer to the data
ASSERT (pSPD->PropertyOutputSize >= sizeof (KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S));
pS->CurrentActualFrameRate = 15; // TODO: Implement the right rates in shipping drivers.
pS->CurrentMaxAvailableFrameRate = 15; // TODO: Implement the right rates in shipping drivers.
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S);
}
break;
case KSPROPERTY_VIDEOCONTROL_FRAME_RATES:
{
// todo
}
break;
case KSPROPERTY_VIDEOCONTROL_MODE:
{
PKSPROPERTY_VIDEOCONTROL_MODE_S pS = (PKSPROPERTY_VIDEOCONTROL_MODE_S) pSPD->PropertyInfo; // pointer to the data
ASSERT (pSPD->PropertyOutputSize >= sizeof (KSPROPERTY_VIDEOCONTROL_MODE_S));
pS->Mode = *pVideoControlMode;
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCONTROL_MODE_S);
}
break;
default:
TRAP;
break;
}
}
/*
** AdapterGetVideoCompressionProperty()
**
** Gets compressor settings
**
** Arguments:
**
** pSrb - pointer to the stream request block for properties
**
** Returns:
**
** Side Effects: none
*/
VOID
STREAMAPI
AdapterGetVideoCompressionProperty(
PHW_STREAM_REQUEST_BLOCK pSrb
)
{
PHW_DEVICE_EXTENSION pHwDevExt = ((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
PSTREAMEX pStrmEx;
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
ULONG Id = pSPD->Property->Id; // index of the property
ULONG StreamIndex;
PCOMPRESSION_SETTINGS pCompressionSettings;
// For this property set, the StreamIndex is always in the same place
// for each property
StreamIndex = ((PKSPROPERTY_VIDEOCOMPRESSION_S) pSPD->Property)->StreamIndex;
ASSERT (StreamIndex < MAX_TESTCAP_STREAMS);
// Verify the stream index is valid
if (StreamIndex >= MAX_TESTCAP_STREAMS) {
pSrb->Status = STATUS_INVALID_PARAMETER;
return;
}
pStrmEx = (PSTREAMEX) pHwDevExt->pStrmEx[StreamIndex];
// If the stream is not opened when this property set is used,
// store the values in the HwDevExt
if (pStrmEx) {
pCompressionSettings = &pStrmEx->CompressionSettings;
}
else {
pCompressionSettings = &pHwDevExt->CompressionSettings;
}
switch (Id) {
case KSPROPERTY_VIDEOCOMPRESSION_GETINFO:
{
PKSPROPERTY_VIDEOCOMPRESSION_GETINFO_S pS =
(PKSPROPERTY_VIDEOCOMPRESSION_GETINFO_S) pSPD->PropertyInfo;
pS->DefaultKeyFrameRate = 15; // Key frame rate
pS->DefaultPFrameRate = 3; // Predeicted frames per Key frame
pS->DefaultQuality = 5000; // 0 to 10000
pS->Capabilities =
KS_CompressionCaps_CanQuality |
KS_CompressionCaps_CanKeyFrame |
KS_CompressionCaps_CanBFrame ;
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCOMPRESSION_GETINFO_S);
}
break;
case KSPROPERTY_VIDEOCOMPRESSION_KEYFRAME_RATE:
{
PKSPROPERTY_VIDEOCOMPRESSION_S pS =
(PKSPROPERTY_VIDEOCOMPRESSION_S) pSPD->PropertyInfo;
pS->Value = pCompressionSettings->CompressionKeyFrameRate;
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCOMPRESSION_S);
}
break;
case KSPROPERTY_VIDEOCOMPRESSION_PFRAMES_PER_KEYFRAME:
{
PKSPROPERTY_VIDEOCOMPRESSION_S pS =
(PKSPROPERTY_VIDEOCOMPRESSION_S) pSPD->PropertyInfo;
pS->Value = pCompressionSettings->CompressionPFramesPerKeyFrame;
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCOMPRESSION_S);
}
break;
case KSPROPERTY_VIDEOCOMPRESSION_QUALITY:
{
PKSPROPERTY_VIDEOCOMPRESSION_S pS =
(PKSPROPERTY_VIDEOCOMPRESSION_S) pSPD->PropertyInfo;
pS->Value = pCompressionSettings->CompressionQuality;
pSrb->ActualBytesTransferred = sizeof (KSPROPERTY_VIDEOCOMPRESSION_S);
}
break;
default:
TRAP;
break;
}
}
/*
** AdapterSetVideoCompressionProperty()
**
** Sets compressor settings
**
** Arguments:
**
** pSrb - pointer to the stream request block for properties
**
** Returns:
**
** Side Effects: none
*/
VOID
STREAMAPI
AdapterSetVideoCompressionProperty(
PHW_STREAM_REQUEST_BLOCK pSrb
)
{
PHW_DEVICE_EXTENSION pHwDevExt = ((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
PSTREAMEX pStrmEx;
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
PKSPROPERTY_VIDEOCOMPRESSION_S pS = (PKSPROPERTY_VIDEOCOMPRESSION_S) pSPD->Property;
ULONG Id = pSPD->Property->Id; // index of the property
ULONG StreamIndex;
PCOMPRESSION_SETTINGS pCompressionSettings;
// For this property set, the StreamIndex is always in the same place
// for each property
StreamIndex = ((PKSPROPERTY_VIDEOCOMPRESSION_S) pSPD->Property)->StreamIndex;
ASSERT (StreamIndex < MAX_TESTCAP_STREAMS);
// Verify the stream index is valid
if (StreamIndex >= MAX_TESTCAP_STREAMS) {
pSrb->Status = STATUS_INVALID_PARAMETER;
return;
}
pStrmEx = (PSTREAMEX) pHwDevExt->pStrmEx[StreamIndex];
// If the stream is not opened when this property set is used,
// store the values in the HwDevExt
if (pStrmEx) {
pCompressionSettings = &pStrmEx->CompressionSettings;
}
else {
pCompressionSettings = &pHwDevExt->CompressionSettings;
}
switch (Id) {
case KSPROPERTY_VIDEOCOMPRESSION_KEYFRAME_RATE:
{
pCompressionSettings->CompressionKeyFrameRate = pS->Value;
}
break;
case KSPROPERTY_VIDEOCOMPRESSION_PFRAMES_PER_KEYFRAME:
{
pCompressionSettings->CompressionPFramesPerKeyFrame = pS->Value;
}
break;
case KSPROPERTY_VIDEOCOMPRESSION_QUALITY:
{
pCompressionSettings->CompressionQuality = pS->Value;
}
break;
default:
TRAP;
break;
}
}
// -------------------------------------------------------------------
// General entry point for all get/set adapter properties
// -------------------------------------------------------------------
/*
** AdapterSetProperty ()
**
** Handles Set operations for all adapter properties.
**
** Arguments:
**
** pSRB -
** Pointer to the HW_STREAM_REQUEST_BLOCK
**
** Returns:
**
** Side Effects: none
*/
VOID STREAMAPI AdapterSetProperty(PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
DbgLogInfo(("TestCap: Enter AdapterSetProperty\n"));
if(IsEqualGUID(&PROPSETID_VIDCAP_VIDEOPROCAMP, &pSPD->Property->Set)){
AdapterSetVideoProcAmpProperty (pSrb);
}else if(IsEqualGUID(&PROPSETID_VIDCAP_CAMERACONTROL, &pSPD->Property->Set)){
AdapterSetCameraControlProperty (pSrb);
}else if(IsEqualGUID(&PROPSETID_VIDCAP_VIDEOCONTROL, &pSPD->Property->Set)){
AdapterSetVideoControlProperty (pSrb);
}else if(IsEqualGUID (&PROPSETID_VIDCAP_VIDEOCOMPRESSION, &pSPD->Property->Set)){
AdapterSetVideoCompressionProperty (pSrb);
}else{
// We should never get here
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
}
}
/*
** AdapterGetProperty ()
**
** Handles Get operations for all adapter properties.
**
** Arguments:
**
** pSRB -
** Pointer to the HW_STREAM_REQUEST_BLOCK
**
** Returns:
**
** Side Effects: none
*/
VOID STREAMAPI AdapterGetProperty(PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
DbgLogInfo(("TestCap: Enter AdapterGetProperty\n"));
if(IsEqualGUID(&PROPSETID_VIDCAP_VIDEOPROCAMP, &pSPD->Property->Set)){
AdapterGetVideoProcAmpProperty (pSrb);
//DbgLogInfo(("TestCap: 1\n"));
}else if(IsEqualGUID(&PROPSETID_VIDCAP_CAMERACONTROL, &pSPD->Property->Set)){
AdapterGetCameraControlProperty (pSrb);
//DbgLogInfo(("TestCap: 2\n"));
}else if(IsEqualGUID(&PROPSETID_VIDCAP_VIDEOCONTROL, &pSPD->Property->Set)){
AdapterGetVideoControlProperty (pSrb);
//DbgLogInfo(("TestCap: 3\n"));
}else if(IsEqualGUID (&PROPSETID_VIDCAP_VIDEOCOMPRESSION, &pSPD->Property->Set)){
AdapterGetVideoCompressionProperty (pSrb);
//DbgLogInfo(("TestCap: 4\n"));
}else{
// We should never get here
//DbgLogInfo(("TestCap: 0\n"));
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -