VirtualBox

Changeset 44758 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 20, 2013 11:45:18 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
83867
Message:

include,ExtPacks\Puel\UsbWebcam,Main,VRDP: emulated USB webcam updates.

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/UsbWebcamInterface.h

    r44337 r44758  
    3434
    3535        static const PDMDRVREG DrvReg;
    36         EMWEBCAMDRV *mpDrv;
    3736
     37        void EmWebcamConstruct(EMWEBCAMDRV *pDrv);
    3838        void EmWebcamDestruct(EMWEBCAMDRV *pDrv);
    3939
     
    5858        Console * const mParent;
    5959
     60        EMWEBCAMDRV *mpDrv;
    6061        EMWEBCAMREMOTE *mpRemote;
    6162        uint64_t volatile mu64DeviceIdSrc;
  • trunk/src/VBox/Main/src-client/UsbWebcamInterface.cpp

    r44440 r44758  
    2525
    2626
    27 typedef struct EMWEBCAMDRV *PEMWEBCAMDRV;
    28 
    29 struct EMWEBCAMDRV
     27typedef struct EMWEBCAMDRV
    3028{
    3129    EmWebcam *pEmWebcam;
     30    PPDMIWEBCAMUP  pIWebcamUp;
    3231    PDMIWEBCAMDOWN IWebcamDown;
    33     PPDMIWEBCAMUP  pIWebcamUp;
    34 
    35 };
    36 
    37 struct EMWEBCAMREMOTE
     32} EMWEBCAMDRV, *PEMWEBCAMDRV;
     33
     34typedef struct EMWEBCAMREMOTE
    3835{
    3936    EmWebcam *pEmWebcam;
    4037
    41     /* The remote identifier. */
    42     VRDEVIDEOINDEVICEHANDLE deviceHandle;
     38    VRDEVIDEOINDEVICEHANDLE deviceHandle; /* The remote identifier. */
     39    uint32_t u32Version;                  /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
     40    uint32_t fu32Capabilities;            /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
    4341
    4442    /* The device identifier for the PDM device.*/
    4543    uint64_t u64DeviceId;
    46 };
     44} EMWEBCAMREMOTE;
    4745
    4846typedef struct EMWEBCAMREQCTX
     
    5957                                            uint32_t cbCtrl)
    6058{
    61     LogFlowFunc(("pInterface:%p\n", pInterface));
    62 
    6359    PEMWEBCAMDRV pThis = RT_FROM_MEMBER(pInterface, EMWEBCAMDRV, IWebcamDown);
     60
     61    LogFlowFunc(("pEmWebcam:%p, u64DeviceId %lld\n", pThis->pEmWebcam, u64DeviceId));
    6462
    6563    return pThis->pEmWebcam->SendControl(pThis, pvUser, u64DeviceId, (const VRDEVIDEOINCTRLHDR *)pCtrl, cbCtrl);
     
    8482}
    8583
     84void EmWebcam::EmWebcamConstruct(EMWEBCAMDRV *pDrv)
     85{
     86    AssertReturnVoid(mpDrv == NULL);
     87
     88    mpDrv = pDrv;
     89}
     90
    8691void EmWebcam::EmWebcamDestruct(EMWEBCAMDRV *pDrv)
    8792{
     
    9499        mpRemote = NULL;
    95100    }
     101
     102    mpDrv = NULL;
    96103}
    97104
     
    102109    switch (u32Id)
    103110    {
    104         case VRDE_VIDEOIN_NOTIFY_ATTACH:
     111        case VRDE_VIDEOIN_NOTIFY_ID_ATTACH:
    105112        {
    106113            VRDEVIDEOINNOTIFYATTACH *p = (VRDEVIDEOINNOTIFYATTACH *)pvData;
    107             Assert(cbData == sizeof(VRDEVIDEOINNOTIFYATTACH));
    108 
    109             LogFlowFunc(("ATTACH[%d,%d]\n", p->deviceHandle.u32ClientId, p->deviceHandle.u32DeviceId));
     114
     115            /* Older versions did not report u32Version and fu32Capabilities. */
     116            uint32_t u32Version = 1;
     117            uint32_t fu32Capabilities = VRDE_VIDEOIN_NEGOTIATE_CAP_VOID;
     118
     119            if (cbData >= RT_OFFSETOF(VRDEVIDEOINNOTIFYATTACH, u32Version) + sizeof(p->u32Version))
     120            {
     121                u32Version = p->u32Version;
     122            }
     123
     124            if (cbData >= RT_OFFSETOF(VRDEVIDEOINNOTIFYATTACH, fu32Capabilities) + sizeof(p->fu32Capabilities))
     125            {
     126                fu32Capabilities = p->fu32Capabilities;
     127            }
     128
     129            LogFlowFunc(("ATTACH[%d,%d] version %d, caps 0x%08X\n",
     130                         p->deviceHandle.u32ClientId, p->deviceHandle.u32DeviceId,
     131                         u32Version, fu32Capabilities));
    110132
    111133            /* Currently only one device is allowed. */
     
    124146            }
    125147
    126             pRemote->pEmWebcam = this;
    127             pRemote->deviceHandle = p->deviceHandle;
    128             pRemote->u64DeviceId = ASMAtomicIncU64(&mu64DeviceIdSrc);
     148            pRemote->pEmWebcam        = this;
     149            pRemote->deviceHandle     = p->deviceHandle;
     150            pRemote->u32Version       = u32Version;
     151            pRemote->fu32Capabilities = fu32Capabilities;
     152            pRemote->u64DeviceId      = ASMAtomicIncU64(&mu64DeviceIdSrc);
    129153
    130154            mpRemote = pRemote;
     
    153177        } break;
    154178
    155         case VRDE_VIDEOIN_NOTIFY_DETACH:
     179        case VRDE_VIDEOIN_NOTIFY_ID_DETACH:
    156180        {
    157181            VRDEVIDEOINNOTIFYDETACH *p = (VRDEVIDEOINNOTIFYDETACH *)pvData;
     
    163187            if (mpRemote)
    164188            {
    165                 if (mpDrv->pIWebcamUp)
     189                if (mpDrv && mpDrv->pIWebcamUp)
    166190                {
    167191                    mpDrv->pIWebcamUp->pfnWebcamUpDetached(mpDrv->pIWebcamUp,
     
    190214    Assert(pRemote == mpRemote);
    191215
    192     LogFlowFunc(("rcRequest %Rrc %p %p %p %d\n",
    193                  rcRequest, pDeviceCtx, pvUser, pDeviceDesc, cbDeviceDesc));
     216    LogFlowFunc(("mpDrv %p, rcRequest %Rrc %p %p %p %d\n",
     217                 mpDrv, rcRequest, pDeviceCtx, pvUser, pDeviceDesc, cbDeviceDesc));
    194218
    195219    if (RT_SUCCESS(rcRequest))
    196220    {
    197         if (mpDrv->pIWebcamUp)
     221        if (mpDrv && mpDrv->pIWebcamUp)
    198222        {
    199223            mpDrv->pIWebcamUp->pfnWebcamUpAttached(mpDrv->pIWebcamUp,
    200224                                                   pRemote->u64DeviceId,
    201225                                                   (const PDMIWEBCAM_DEVICEDESC *)pDeviceDesc,
    202                                                    cbDeviceDesc);
     226                                                   cbDeviceDesc,
     227                                                   pRemote->u32Version,
     228                                                   pRemote->fu32Capabilities);
    203229        }
    204230    }
     
    222248    bool fResponse = (pvUser != NULL);
    223249
    224     if (mpDrv->pIWebcamUp)
     250    if (mpDrv && mpDrv->pIWebcamUp)
    225251    {
    226252        mpDrv->pIWebcamUp->pfnWebcamUpControl(mpDrv->pIWebcamUp,
     
    241267                 rcRequest, pDeviceCtx, pFrame, cbFrame));
    242268
    243     if (mpDrv->pIWebcamUp)
     269    if (mpDrv && mpDrv->pIWebcamUp)
    244270    {
    245271        mpDrv->pIWebcamUp->pfnWebcamUpFrame(mpDrv->pIWebcamUp,
     
    293319/* static */ DECLCALLBACK(void *) EmWebcam::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID)
    294320{
    295     LogFlowFunc(("pInterface:%p, pszIID:%s\n", __FUNCTION__, pInterface, pszIID));
    296321    PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
    297322    PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV);
     323
     324    LogFlowFunc(("pszIID:%s\n", pszIID));
    298325
    299326    PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
     
    304331/* static */ DECLCALLBACK(int) EmWebcam::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
    305332{
    306     LogFlow(("%s: iInstance/#d, pCfg:%p, fFlags:%x\n", __FUNCTION__, pDrvIns->iInstance, pCfg, fFlags));
     333    LogFlowFunc(("iInstance:%d, pCfg:%p, fFlags:%x\n", pDrvIns->iInstance, pCfg, fFlags));
    307334
    308335    PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV);
     
    315342                    VERR_PDM_DRVINS_NO_ATTACH);
    316343
     344    /* Check early that there is a device. No need to init anything if there is no device. */
     345    pThis->pIWebcamUp = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIWEBCAMUP);
     346    if (pThis->pIWebcamUp == NULL)
     347    {
     348        LogRel(("USBWEBCAM: Emulated webcam device does not exist.\n"));
     349        return VERR_PDM_MISSING_INTERFACE;
     350    }
     351
    317352    void *pv = NULL;
    318353    int rc = CFGMR3QueryPtr(pCfg, "Object", &pv);
    319     AssertMsgRCReturn(rc, ("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc), rc);
    320 
     354    if (!RT_VALID_PTR(pv))
     355         rc = VERR_INVALID_PARAMETER;
     356    AssertMsgReturn(RT_SUCCESS(rc),
     357                    ("Configuration error: No/bad \"Object\" %p value! rc=%Rrc\n", pv, rc), rc);
     358
     359    /* Everything ok. Initialize. */
    321360    pThis->pEmWebcam = (EmWebcam *)pv;
    322     pThis->pEmWebcam->mpDrv = pThis;
     361    pThis->pEmWebcam->EmWebcamConstruct(pThis);
    323362
    324363    pDrvIns->IBase.pfnQueryInterface = drvQueryInterface;
     
    326365    pThis->IWebcamDown.pfnWebcamDownControl = drvEmWebcamControl;
    327366
    328     pThis->pIWebcamUp = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIWEBCAMUP);
    329 
    330     AssertReturn(pThis->pIWebcamUp, VERR_PDM_MISSING_INTERFACE);
    331 
    332367    return VINF_SUCCESS;
    333368}
     
    335370/* static */ DECLCALLBACK(void) EmWebcam::drvDestruct(PPDMDRVINS pDrvIns)
    336371{
    337     LogFlow(("%s: iInstance/#d\n", __FUNCTION__, pDrvIns->iInstance));
    338372    PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV);
     373
     374    LogFlowFunc(("iInstance %d, pEmWebcam %p, pIWebcamUp %p\n",
     375                 pDrvIns->iInstance, pThis->pEmWebcam, pThis->pIWebcamUp));
     376
    339377    if (pThis->pEmWebcam)
    340378    {
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette