AM 3517 WINCE 7 capturetest APPカメラ機器情報取得


AM 3517 wince 7 camera driverをデバッグしたところ、TIのCAMERAテストプログラムCaptureTestの実行時に次の情報が印刷されていることがわかりました
PID:04C8012E TID:0482012E CaptureTest: Capabilities of capture driver --->
PID:04C8012E TID:0482012E CaptureTest:0 - (Video, UYVY, 720x480, 16 bpp, 30 fps, 165.888 mbps)
PID:04C8012E TID:0482012E CaptureTest:1 - (Video, UYVY, 704x480, 16 bpp, 30 fps, 162.201 mbps)
PID:04C8012E TID:0482012E CaptureTest:2 - (Video, UYVY, 352x240, 16 bpp, 30 fps, 40.550 mbps)
PID:04C8012E TID:0482012E CaptureTest:3 - (Video, UYVY, 176x120, 16 bpp, 30 fps, 10.137 mbps)
PID:04C8012E TID:0482012E CaptureTest:4 - (Video, YUY2, 720x480, 16 bpp, 30 fps, 165.888 mbps)
PID:04C8012E TID:0482012E CaptureTest:5 - (Video, YUY2, 704x480, 16 bpp, 30 fps, 162.201 mbps)
PID:04C8012E TID:0482012E CaptureTest:6 - (Video, YUY2, 352x240, 16 bpp, 30 fps, 40.550 mbps)
PID:04C8012E TID:0482012E CaptureTest:7 - (Video, YUY2, 176x120, 16 bpp, 30 fps, 10.137 mbps)
PID:04C8012E TID:0482012E CaptureTest:8 - (Video, UYVY, 720x576, 16 bpp, 25 fps, 165.888 mbps)
PID:04C8012E TID:0482012E CaptureTest:9 - (Video, UYVY, 704x576, 16 bpp, 25 fps, 162.201 mbps)
PID:04C8012E TID:0482012E CaptureTest:10 - (Video, UYVY, 352x288, 16 bpp, 25 fps, 40.550 mbps)
PID:04C8012E TID:0482012E CaptureTest:11 - (Video, UYVY, 176x144, 16 bpp, 25 fps, 10.137 mbps)
PID:04C8012E TID:0482012E CaptureTest:12 - (Video, YUY2, 720x576, 16 bpp, 25 fps, 165.888 mbps)
PID:04C8012E TID:0482012E CaptureTest:13 - (Video, YUY2, 704x576, 16 bpp, 25 fps, 162.201 mbps)
PID:04C8012E TID:0482012E CaptureTest:14 - (Video, YUY2, 352x288, 16 bpp, 25 fps, 40.550 mbps)
PID:04C8012E TID:0482012E CaptureTest:15 - (Video, YUY2, 176x144, 16 bpp, 25 fps, 10.137 mbps)
PID:04C8012E TID:0482012E CaptureTest:16 - (Video, UYVY, 640x480, 16 bpp, 30 fps, 147.456 mbps)
PID:04C8012E TID:0482012E CaptureTest:17 - (Video, UYVY, 320x240, 16 bpp, 30 fps, 36.864 mbps)
PID:04C8012E TID:0482012E CaptureTest:18 - (Video, YUY2, 640x480, 16 bpp, 30 fps, 147.456 mbps)
PID:04C8012E TID:0482012E CaptureTest:19 - (Video, YUY2, 320x240, 16 bpp, 30 fps, 36.864 mbps)

これらの情報はどこからどのように印刷されたのでしょうか.
WinMainで
hr = AddFiltersToGraph();
AddFiltersToGraph()中
hr = pCaptureGraphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,
                                              &MEDIATYPE_Video, 
                                              pVideoCapture,
                                              IID_IAMStreamConfig, 
                                              (void **)&<span style="color:#ff0000;">pCaptureStreamConfig</span>);
RETAILMSG(DBGZONE_STATS, 
            (TEXT("%s: Capabilities of capture driver --->\r
"), APP_NAME)); DumpStreamCaps(<span style="color:#ff0000;">pCaptureStreamConfig</span>);
DDumpStreamCaps(IAMStreamConfig*pStreamConfig)中
hr = <span style="color:#ff0000;">pStreamConfig</span>-><span style="color:#000099;">GetNumberOfCapabilities</span>(&count, &size);
 int i = 0;
    while(i < count) {
        static TCHAR formatString[256];
    
        hr =<span style="color:#ff0000;"> pStreamConfig</span>-><span style="color:#000099;">GetStreamCaps</span>(
                                i,
                                &pMediaType,
                                pSCC);
        
        DumpMediaType(pMediaType, formatString, 256);
        RETAILMSG(DBGZONE_STATS, 
            (TEXT("%s:%d - (%s)\r
"), APP_NAME, i, formatString)); DeleteMediaType(pMediaType); i++; }
1.pStreamConfig->GetNumberOfCapabilities(&count, &size);
2.hr = pStreamConfig->GetStreamCaps(
                                i,
                                &pMediaType,
                                pSCC);

この2つの文が呼び出されました IAMStreamConfigインタフェース、祥は前の1篇の紹介を見ますhttp://blog.csdn.net/zhangjikuan/article/details/42462715
これらの情報はドライバでどのように定義されているのでしょうか.
cameraPDDParams.hで解像度サイズが定義されています
#define TV_D1_PAL_HORZ_RES          (704)
#define TV_D1_PAL_VERT_RES          (576)
#define DVD_PAL_HORZ_RES            (720)
#define DVD_PAL_VERT_RES            (576)
#define CIF_PAL_HORZ_RES            (352)
#define CIF_PAL_VERT_RES            (288)
#define QCIF_PAL_HORZ_RES           (176)
#define QCIF_PAL_VERT_RES           (144)

#define TV_D1_NTSC_HORZ_RES         (704)
#define TV_D1_NTSC_VERT_RES         (480)
#define DVD_NTSC_HORZ_RES           (720)
#define DVD_NTSC_VERT_RES           (480)
#define CIF_NTSC_HORZ_RES           (352)
#define CIF_NTSC_VERT_RES           (240)
#define QCIF_NTSC_HORZ_RES          (176)
#define QCIF_NTSC_VERT_RES          (120)

#define VGA_HORZ_RES                (640)
#define VGA_VERT_RES                (480)
#define QVGA_HORZ_RES               (320)
#define QVGA_VERT_RES               (240)

#define MAX_X_RES               (DVD_PAL_HORZ_RES)
#define MAX_Y_RES               (DVD_PAL_VERT_RES)

#define HORZ_INFO_SPH_VAL       (202)
#define VERT_START_VAL          (24)

#define ENABLE_BT656            // using BT656 output from video decoder
// for AM3517: Do not Define ENABLE_PACk8 if using older App boards - 1013690, 1014473; Define if using newer app board 1015189
#define ENABLE_PACK8            // use 8-bit data width
//#define ENABLE_YUY2           // uncomment this to enable YUY2 output
#define ENABLE_PAL            // uncomment to enable PAL resolutions and frame rates

//#define ENABLE_DEINTERLACED_OUTPUT
#define ENABLE_PROGRESSIVE_INPUT
cameraPDDSensorformals.hでマクロ関数MAKE_が呼び出されましたSTREAM_MODE_YUY 2とMAKE_STREAM_MODE_UYVY
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_TV_D1_NTSC_UYVY, TV_D1_NTSC_HORZ_RES, -TV_D1_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_TV_D1_NTSC_YUY2, TV_D1_NTSC_HORZ_RES, -TV_D1_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_DVD_NTSC_UYVY, DVD_NTSC_HORZ_RES, -DVD_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_DVD_NTSC_YUY2, DVD_NTSC_HORZ_RES, -DVD_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_CIF_NTSC_UYVY, CIF_NTSC_HORZ_RES, -CIF_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_CIF_NTSC_YUY2, CIF_NTSC_HORZ_RES, -CIF_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_QCIF_NTSC_UYVY, QCIF_NTSC_HORZ_RES, -QCIF_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_QCIF_NTSC_YUY2, QCIF_NTSC_HORZ_RES, -QCIF_NTSC_VERT_RES, 16, 30);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_TV_D1_PAL_UYVY, TV_D1_PAL_HORZ_RES, -TV_D1_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_TV_D1_PAL_YUY2, TV_D1_PAL_HORZ_RES, -TV_D1_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_DVD_PAL_UYVY, DVD_PAL_HORZ_RES, -DVD_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_DVD_PAL_YUY2, DVD_PAL_HORZ_RES, -DVD_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_CIF_PAL_UYVY, CIF_PAL_HORZ_RES, -CIF_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_CIF_PAL_YUY2, CIF_PAL_HORZ_RES, -CIF_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_QCIF_PAL_UYVY, QCIF_PAL_HORZ_RES, -QCIF_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_QCIF_PAL_YUY2, QCIF_PAL_HORZ_RES, -QCIF_PAL_VERT_RES, 16, 25);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_VGA_UYVY_30, VGA_HORZ_RES, -VGA_VERT_RES, 16, 30);
MAKE_STREAM_MODE_UYVY(DCAM_StreamMode_QVGA_UYVY_30, QVGA_HORZ_RES, -QVGA_VERT_RES, 16, 30);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_VGA_YUY2_30, VGA_HORZ_RES, -VGA_VERT_RES, 16, 30);
MAKE_STREAM_MODE_YUY2(DCAM_StreamMode_QVGA_YUY2_30, QVGA_HORZ_RES, -QVGA_VERT_RES, 16, 30);
cameraPDDCameraDrvPdd.cppにこれらの関数が統合されていますpcsDataRangeVideo配列では、APPではこの配列の順に情報を印刷しています
static PCS_DATARANGE_VIDEO pcsDataRangeVideo[] = 
    {
        &DCAM_StreamMode_DVD_NTSC_UYVY,
        &DCAM_StreamMode_TV_D1_NTSC_UYVY,
        &DCAM_StreamMode_CIF_NTSC_UYVY,
        &DCAM_StreamMode_QCIF_NTSC_UYVY,
#ifdef ENABLE_YUY2
        &DCAM_StreamMode_DVD_NTSC_YUY2,
        &DCAM_StreamMode_TV_D1_NTSC_YUY2,
        &DCAM_StreamMode_CIF_NTSC_YUY2,
        &DCAM_StreamMode_QCIF_NTSC_YUY2,
#endif
#ifdef ENABLE_PAL
        &DCAM_StreamMode_DVD_PAL_UYVY,
        &DCAM_StreamMode_TV_D1_PAL_UYVY,
        &DCAM_StreamMode_CIF_PAL_UYVY,
        &DCAM_StreamMode_QCIF_PAL_UYVY,
#ifdef ENABLE_YUY2
        &DCAM_StreamMode_DVD_PAL_YUY2,
        &DCAM_StreamMode_TV_D1_PAL_YUY2,
        &DCAM_StreamMode_CIF_PAL_YUY2,
        &DCAM_StreamMode_QCIF_PAL_YUY2,
#endif
#endif
        &DCAM_StreamMode_VGA_UYVY_30, 
        &DCAM_StreamMode_QVGA_UYVY_30,
#ifdef ENABLE_YUY2
        &DCAM_StreamMode_VGA_YUY2_30, 
        &DCAM_StreamMode_QVGA_YUY2_30,
#endif
    };

上の配列はどこで呼び出されたのですかcameraDrvPdd.cppは配列中のすべてのメンバーをm_に割り当てましたpModeVideoFormat[CAPTURE].pCsDataRangeVideo[i]
実はpreviewとskillにも与えられています
for (int i = 0; i < count; i++) 
    {
         m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[i] = pcsDataRangeVideo[i];
    }

cameraDrvPdd.hで定義したm_pModeVideoFormat
//All the Video Formats supported by all the pins
    PPINVIDEOFORMAT   m_pModeVideoFormat;
CameraPDDCameraDrvPdd.cppで付与
DWORD CCameraPdd::GetSensorModeInfo( ULONG ulModeType, PSENSORMODEINFO pSensorModeInfo )
{
    pSensorModeInfo->MemoryModel = m_SensorModeInfo[ulModeType].MemoryModel;
    pSensorModeInfo->MaxNumOfBuffers = m_SensorModeInfo[ulModeType].MaxNumOfBuffers;
    pSensorModeInfo->PossibleCount = m_SensorModeInfo[ulModeType].PossibleCount;
    pSensorModeInfo->VideoCaps.DefaultVideoControlCaps = DefaultVideoControlCaps[ulModeType];
    pSensorModeInfo->VideoCaps.CurrentVideoControlCaps = m_pModeVideoCaps[ulModeType].CurrentVideoControlCaps;
   <span style="color:#ff0000;"> pSensorModeInfo->pVideoFormat = &m_pModeVideoFormat[ulModeType];</span>
    
    return ERROR_SUCCESS;
}
<span style="font-family: Arial, Helvetica, sans-serif;">SensorModeInfo        GetSensorModeInfo  </span>
CCameraDevice::GetPDDPinInfo()
{
    SENSORMODEINFO SensorModeInfo;
    if (NULL == m_pStrmInstances)
    {
        return false;
    }


    for (UINT i=0; i < m_AdapterInfo.ulCTypes; i++)
    {
        if (ERROR_SUCCESS != PDDGetPinInfo(i, &SensorModeInfo))
        {
            return false ;
        }
        m_pStrmInstances[i].ulPossibleCount = SensorModeInfo.PossibleCount ;
        m_pStrmInstances[i].VideoCaps.DefaultVideoControlCaps = 


SensorModeInfo.VideoCaps.DefaultVideoControlCaps;
        m_pStrmInstances[i].VideoCaps.CurrentVideoControlCaps = 


SensorModeInfo.VideoCaps.CurrentVideoControlCaps;
        <span style="color:#ff0000;">m_pStrmInstances[i].pVideoFormat = SensorModeInfo.pVideoFormat;</span>


        if (SensorModeInfo.MemoryModel == CSPROPERTY_BUFFER_DRIVER &&
            (NULL == m_pPDDFuncTbl->PDD_AllocateBuffer || NULL == m_pPDDFuncTbl-


>PDD_DeAllocateBuffer))
        {
            return false;
        }


        if (SensorModeInfo.MemoryModel != CSPROPERTY_BUFFER_DRIVER &&
            (NULL == m_pPDDFuncTbl->PDD_RegisterClientBuffer || NULL == m_pPDDFuncTbl-


>PDD_UnRegisterClientBuffer))
        {
            return false;
        }
    }


    return true;
}
mdd\CaneraDevice.cpp    CCameraDevice::AdapterHandleVideoControlRequests  
switch (csProp.Id)
    {
    case CSPROPERTY_VIDEOCONTROL_CAPS:
        if (NULL == (pCsPropVideoControlCapsInput = reinterpret_cast<PCSPROPERTY_VIDEOCONTROL_CAPS_S>(ValidateBuffer(pInBuf, InBufLen, sizeof(CSPROPERTY_VIDEOCONTROL_CAPS_S), &dwError))))
        {
            break;
        }


        lIndex = pCsPropVideoControlCapsInput->StreamIndex;
        if (false == IsValidPin(lIndex))
        {
            DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r
"), this));             break;         }
<span style="font-family: Arial, Helvetica, sans-serif;">switch (csProp.Flags)</span>
        {
        case CSPROPERTY_TYPE_GET:
            *pdwBytesTransferred = sizeof(CSPROPERTY_VIDEOCONTROL_CAPS_S);
            if (NULL == (pCsPropVideoControlCapsOutput = reinterpret_cast<PCSPROPERTY_VIDEOCONTROL_CAPS_S>(ValidateBuffer(pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError))))
            {
                dwError = ERROR_MORE_DATA;
                break;
            }


            //Copy the CSPROPERTY structure to the output buffer just in case!
            memcpy(pCsPropVideoControlCapsOutput, pCsPropVideoControlCapsInput, sizeof(CSPROPERTY));


            pCsPropVideoControlCapsOutput->StreamIndex      = lIndex;


            <span style="color:#ff0000;">if (true == GetPDDPinInfo())
            {
                pCsPropVideoControlCapsOutput->VideoControlCaps = m_pStrmInstances[lIndex].VideoCaps.CurrentVideoControlCaps;


                dwError = ERROR_SUCCESS;
            }</span>
            break;


        case CSPROPERTY_TYPE_SET:
            lIndex = pCsPropVideoControlCapsInput->StreamIndex;


            ulCaps = pCsPropVideoControlCapsInput->VideoControlCaps;
            if (ulCaps & ~(CS_VideoControlFlag_FlipHorizontal        |
                             CS_VideoControlFlag_FlipVertical          |
                             CS_VideoControlFlag_ExternalTriggerEnable |
                             CS_VideoControlFlag_Trigger               |
                             CS_VideoControlFlag_Sample_Scanned_Notification))
            {
                DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid flag specified as Video Control Caps.\r
"), this));                 break;             }             if (false == IsValidPin(lIndex))             {                 DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid pin index.\r
"), this));                 break;             }             dwError = m_pPDDFuncTbl->PDD_HandleVideoControlCapsChanges(m_PDDContext, lIndex ,ulCaps);             break;         case CSPROPERTY_TYPE_DEFAULTVALUES:             *pdwBytesTransferred = sizeof(CSPROPERTY_VIDEOCONTROL_CAPS_S);             if (NULL == (pCsPropVideoControlCapsOutput = reinterpret_cast<PCSPROPERTY_VIDEOCONTROL_CAPS_S>(ValidateBuffer(pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError))))             {                 dwError = ERROR_MORE_DATA;                 break;             }             lIndex = pCsPropVideoControlCapsInput->StreamIndex;             if (false == IsValidPin(lIndex))             {                 DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid pin index.\r
"), this));                 break;             }             //Copy the CSPROPERTY structure to the output buffer just in case!             memcpy(pCsPropVideoControlCapsOutput, pCsPropVideoControlCapsInput, sizeof(CSPROPERTY));             pCsPropVideoControlCapsOutput->StreamIndex      = lIndex;             pCsPropVideoControlCapsOutput->VideoControlCaps =  m_pStrmInstances[lIndex].VideoCaps.DefaultVideoControlCaps;             dwError = ERROR_SUCCESS;             break;         default:             DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid Request\r
"), this));             break;         }
   PPINVIDEOFORMAT       ,              ,    
 

:http://justtotry.blog.163.com/blog/static/4463081220122554515509/



#define ENABLE_PAL  #define ENABLE_YUY2

PAL 25fps,NTSC 30fps, CaptureTest 。

720x576 , , , 。

ce7 camera , , , 。