VirtualBox

Changeset 44758 in vbox for trunk


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
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/RemoteDesktop/VRDEVideoIn.h

    r44528 r44758  
    328328#define VRDE_VIDEOIN_CTRLSEL_VS(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x04)
    329329#define VRDE_VIDEOIN_CTRLSEL_HW(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x05)
     330#define VRDE_VIDEOIN_CTRLSEL_PROT(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x06)
    330331
    331332#define VRDE_VIDEOIN_CTRLSEL_VC_VIDEO_POWER_MODE_CONTROL   VRDE_VIDEOIN_CTRLSEL_VC(0x01)
     
    381382#define VRDE_VIDEOIN_CTRLSEL_HW_BUTTON                    VRDE_VIDEOIN_CTRLSEL_HW(0x01)
    382383
     384#define VRDE_VIDEOIN_CTRLSEL_PROT_PING                    VRDE_VIDEOIN_CTRLSEL_PROT(0x01)
     385#define VRDE_VIDEOIN_CTRLSEL_PROT_SAMPLING                VRDE_VIDEOIN_CTRLSEL_PROT(0x02)
     386#define VRDE_VIDEOIN_CTRLSEL_PROT_FRAMES                  VRDE_VIDEOIN_CTRLSEL_PROT(0x03)
     387
    383388typedef struct VRDEVIDEOINCTRL_VIDEO_POWER_MODE
    384389{
     
    673678    VRDEVIDEOINCTRLHDR hdr;
    674679    uint8_t u8Pressed;
    675 } VRDEVIDEOINCTRL_CT_HW_BUTTON;
     680} VRDEVIDEOINCTRL_HW_BUTTON;
     681
     682typedef struct VRDEVIDEOINCTRL_PROT_PING
     683{
     684    VRDEVIDEOINCTRLHDR hdr;
     685    uint32_t u32Timestamp;      /* Set in the request and the same value must be send back in the response. */
     686} VRDEVIDEOINCTRL_PROT_PING;
     687
     688typedef struct VRDEVIDEOINCTRL_PROT_SAMPLING
     689{
     690    VRDEVIDEOINCTRLHDR hdr;
     691    uint32_t fu32SampleStart;   /* Which parameters must be sampled VRDEVIDEOINCTRL_F_PROT_SAMPLING_*. */
     692    uint32_t fu32SampleStop;    /* Which parameters to disable VRDEVIDEOINCTRL_F_PROT_SAMPLING_*.
     693                                 * If both Start and Stop is set, then restart the sampling.
     694                                 */
     695    uint32_t u32PeriodMS;       /* Sampling period in milliseconds. Applies to all samples in fu32SampleStart.
     696                                 * Not mandatory, the actual sampling period may be different.
     697                                 */
     698} VRDEVIDEOINCTRL_PROT_SAMPLING;
     699
     700#define VRDEVIDEOINCTRL_F_PROT_SAMPLING_FRAMES_SOURCE     0x00000001 /* Periodic VRDEVIDEOINCTRL_PROT_FRAMES samples */
     701#define VRDEVIDEOINCTRL_F_PROT_SAMPLING_FRAMES_CLIENT_OUT 0x00000002 /* Periodic VRDEVIDEOINCTRL_PROT_FRAMES samples */
     702
     703typedef struct VRDEVIDEOINCTRL_PROT_FRAMES
     704{
     705    VRDEVIDEOINCTRLHDR hdr;     /* Note: the message should be sent as VRDE_VIDEOIN_FN_CONTROL_NOTIFY. */
     706    uint32_t u32Sample;         /* Which sample is this, one of VRDEVIDEOINCTRL_F_PROT_SAMPLING_*. */
     707    uint32_t u32TimestampMS;    /* When the period started, milliseconds since the start of sampling. */
     708    uint32_t u32PeriodMS;       /* Actual period during which the frames were counted in milliseconds.
     709                                 * This may be different from VRDEVIDEOINCTRL_PROT_SAMPLING::u32PeriodMS.
     710                                 */
     711    uint32_t u32FramesCount;    /* How many frames per u32PeriodMS milliseconds. */
     712} VRDEVIDEOINCTRL_PROT_FRAMES;
     713
    676714
    677715/*
     
    713751 */
    714752
     753/* The dynamic RDP channel name. */
    715754#define VRDE_VIDEOIN_CHANNEL "RVIDEOIN"
    716755
     
    719758#define VRDE_VIDEOIN_FN_NOTIFY     0x0001 /* Device attach/detach from the client. */
    720759#define VRDE_VIDEOIN_FN_DEVICEDESC 0x0002 /* Query device description. */
    721 #define VRDE_VIDEOIN_FN_CONTROL    0x0003 /* Control the device and start/stop video input. */
    722 #define VRDE_VIDEOIN_FN_CONTROL_NOTIFY 0x0004 /* The client reports a control change, etc. */
     760#define VRDE_VIDEOIN_FN_CONTROL    0x0003 /* Control the device and start/stop video input.
     761                                           * This function is used for sending a request and
     762                                           * the corresponding response.
     763                                           */
     764#define VRDE_VIDEOIN_FN_CONTROL_NOTIFY 0x0004 /* The client reports a control change, etc.
     765                                               * This function indicated that the message is
     766                                               * not a response to a CONTROL request.
     767                                               */
    723768#define VRDE_VIDEOIN_FN_FRAME      0x0005 /* Frame from the client. */
    724769
     
    747792#define VRDE_VIDEOIN_NEGOTIATE_VERSION 1
    748793
    749 #define VRDE_VIDEOIN_NEGOTIATE_CAP_VOID 0
     794/* VRDEVIDEOINMSG_NEGOTIATE::fu32Capabilities */
     795#define VRDE_VIDEOIN_NEGOTIATE_CAP_VOID 0x00000000
     796#define VRDE_VIDEOIN_NEGOTIATE_CAP_PROT 0x00000001 /* Supports VRDE_VIDEOIN_CTRLSEL_PROT_* controls. */
    750797
    751798typedef struct VRDEVIDEOINMSG_NEGOTIATE
     
    763810 * already connected to the client when the VIDEOIN channel is established.
    764811 */
    765 #define VRDE_VIDEOIN_NOTIFY_ATTACH 0
    766 #define VRDE_VIDEOIN_NOTIFY_DETACH 1
     812#define VRDE_VIDEOIN_NOTIFY_EVENT_ATTACH 0
     813#define VRDE_VIDEOIN_NOTIFY_EVENT_DETACH 1
    767814
    768815typedef struct VRDEVIDEOINMSG_NOTIFY
    769816{
    770817    VRDEVIDEOINMSGHDR hdr;
    771     uint32_t u32NotifyEvent; /* VRDE_VIDEOIN_NOTIFY_* */
     818    uint32_t u32NotifyEvent; /* VRDE_VIDEOIN_NOTIFY_EVENT_* */
    772819    /* Event specific data may follow. The underlying protocol provides the length of the message. */
    773820} VRDEVIDEOINMSG_NOTIFY;
     
    906953typedef struct VRDEVIDEOINNOTIFYATTACH
    907954{
    908    VRDEVIDEOINDEVICEHANDLE deviceHandle;
     955    VRDEVIDEOINDEVICEHANDLE deviceHandle;
     956    uint32_t u32Version;       /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
     957    uint32_t fu32Capabilities; /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
    909958} VRDEVIDEOINNOTIFYATTACH;
    910959
    911960typedef struct VRDEVIDEOINNOTIFYDETACH
    912961{
    913    VRDEVIDEOINDEVICEHANDLE deviceHandle;
     962    VRDEVIDEOINDEVICEHANDLE deviceHandle;
    914963} VRDEVIDEOINNOTIFYDETACH;
     964
     965/* Notification codes, */
     966#define VRDE_VIDEOIN_NOTIFY_ID_ATTACH 0
     967#define VRDE_VIDEOIN_NOTIFY_ID_DETACH 1
    915968
    916969
     
    918971typedef struct VRDEVIDEOINCALLBACKS
    919972{
    920     /** The header. */
     973    /* The header. */
    921974    VRDEINTERFACEHDR header;
    922975
  • trunk/include/VBox/vmm/pdmwebcaminfs.h

    r44337 r44758  
    5656
    5757
    58 #define PDMIWEBCAMUP_IID "7921e96b-b8e2-4173-a73d-787620fc3cab"
     58#define PDMIWEBCAMUP_IID "476c5d41-7bd1-4997-825e-722a72577af3"
    5959typedef struct PDMIWEBCAMUP *PPDMIWEBCAMUP;
    6060typedef struct PDMIWEBCAMUP
     
    6767     * @param pDeviceDesc  The device description.
    6868     * @param cbDeviceDesc The size of the device description.
     69     * @param u32Version   The remote video input protocol version.
     70     * @param fu32Capabilities The remote video input protocol capabilities.
    6971     */
    7072    DECLR3CALLBACKMEMBER(int, pfnWebcamUpAttached,(PPDMIWEBCAMUP pInterface,
    7173                                                   uint64_t u64DeviceId,
    7274                                                   const PDMIWEBCAM_DEVICEDESC *pDeviceDesc,
    73                                                    uint32_t cbDeviceDesc));
     75                                                   uint32_t cbDeviceDesc,
     76                                                   uint32_t u32Version,
     77                                                   uint32_t fu32Capabilities));
    7478
    7579    /*
  • 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