VirtualBox

Changeset 49120 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Oct 15, 2013 3:12:06 PM (11 years ago)
Author:
vboxsync
Message:

Main: emulated webcam updates.

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

Legend:

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

    r48983 r49120  
    3636class AudioSniffer;
    3737class Nvram;
    38 class EmWebcam;
    3938#ifdef VBOX_WITH_USB_CARDREADER
    4039class UsbCardReader;
     
    243242    UsbCardReader *getUsbCardReader() { return mUsbCardReader; }
    244243#endif
    245     EmWebcam *getEmWebcam() { return mEmWebcam; }
    246244
    247245    int VRDPClientLogon(uint32_t u32ClientId, const char *pszUser, const char *pszPassword, const char *pszDomain);
     
    306304    VMMDevMouseInterface *getVMMDevMouseInterface();
    307305    DisplayMouseInterface *getDisplayMouseInterface();
     306
     307    EmulatedUSB *getEmulatedUSB(void) { return mEmulatedUSB; }
    308308
    309309private:
     
    825825    AudioSniffer * const mAudioSniffer;
    826826    Nvram   * const mNvram;
    827     EmWebcam * const mEmWebcam;
    828827#ifdef VBOX_WITH_USB_CARDREADER
    829828    UsbCardReader * const mUsbCardReader;
  • trunk/src/VBox/Main/include/ConsoleVRDPServer.h

    r48406 r49120  
    4040///////////////////////////////////////////////////////////////////////////////
    4141
     42class EmWebcam;
     43
    4244typedef struct _VRDPInputSynch
    4345{
     
    152154    int VideoInControl(void *pvUser, const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
    153155                       const VRDEVIDEOINCTRLHDR *pReq, uint32_t cbReq);
     156
     157    Console *getConsole(void) { return mConsole; }
    154158
    155159private:
     
    339343                                                       const VRDEVIDEOINPAYLOADHDR *pFrame,
    340344                                                       uint32_t cbFrame);
     345    EmWebcam *mEmWebcam;
    341346
    342347    /* Input interface. */
  • trunk/src/VBox/Main/include/EmulatedUSBImpl.h

    r48955 r49120  
    4646                                          const void *pvData, uint32_t cbData);
    4747
     48    HRESULT webcamAttachInternal(const com::Utf8Str &aPath,
     49                                 const com::Utf8Str &aSettings,
     50                                 const char *pszDriver,
     51                                 void *pvObject);
     52    HRESULT webcamDetachInternal(const com::Utf8Str &aPath);
     53
    4854private:
    4955
  • trunk/src/VBox/Main/include/UsbWebcamInterface.h

    r44758 r49120  
    2323#include <VBox/RemoteDesktop/VRDEVideoIn.h>
    2424
    25 class Console;
     25class ConsoleVRDPServer;
    2626typedef struct EMWEBCAMDRV EMWEBCAMDRV;
    2727typedef struct EMWEBCAMREMOTE EMWEBCAMREMOTE;
     
    3030{
    3131    public:
    32         EmWebcam(Console *console);
     32        EmWebcam(ConsoleVRDPServer *pServer);
    3333        virtual ~EmWebcam();
    3434
     
    5656        static DECLCALLBACK(void)   drvDestruct(PPDMDRVINS pDrvIns);
    5757
    58         Console * const mParent;
     58        ConsoleVRDPServer * const mParent;
    5959
    6060        EMWEBCAMDRV *mpDrv;
  • trunk/src/VBox/Main/src-client/ConsoleImpl.cpp

    r48983 r49120  
    5858#include "AudioSnifferInterface.h"
    5959#include "Nvram.h"
    60 #include "UsbWebcamInterface.h"
    6160#ifdef VBOX_WITH_USB_CARDREADER
    6261# include "UsbCardReader.h"
     
    386385    , mAudioSniffer(NULL)
    387386    , mNvram(NULL)
    388     , mEmWebcam(NULL)
    389387#ifdef VBOX_WITH_USB_CARDREADER
    390388    , mUsbCardReader(NULL)
     
    559557        }
    560558
    561         unconst(mEmWebcam) = new EmWebcam(this);
    562         AssertReturn(mEmWebcam, E_FAIL);
    563559#ifdef VBOX_WITH_USB_CARDREADER
    564560        unconst(mUsbCardReader) = new UsbCardReader(this);
     
    656652        delete mNvram;
    657653        unconst(mNvram) = NULL;
    658     }
    659 
    660     if (mEmWebcam)
    661     {
    662         delete mEmWebcam;
    663         unconst(mEmWebcam) = NULL;
    664654    }
    665655
  • trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp

    r48406 r49120  
    14071407    rc = RTCritSectInit(&mTSMFLock);
    14081408    AssertRC(rc);
     1409
     1410    mEmWebcam = new EmWebcam(this);
     1411    AssertPtr(mEmWebcam);
    14091412}
    14101413
     
    14291432            maFramebuffers[i] = NULL;
    14301433        }
     1434    }
     1435
     1436    if (mEmWebcam)
     1437    {
     1438        delete mEmWebcam;
     1439        mEmWebcam = NULL;
    14311440    }
    14321441
     
    26472656{
    26482657    ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvCallback);
    2649     EmWebcam *pWebcam = pThis->mConsole->getEmWebcam();
    2650     pWebcam->EmWebcamCbNotify(u32Id, pvData, cbData);
     2658    if (pThis->mEmWebcam)
     2659    {
     2660        pThis->mEmWebcam->EmWebcamCbNotify(u32Id, pvData, cbData);
     2661    }
    26512662}
    26522663
     
    26592670{
    26602671    ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvCallback);
    2661     EmWebcam *pWebcam = pThis->mConsole->getEmWebcam();
    2662     pWebcam->EmWebcamCbDeviceDesc(rcRequest, pDeviceCtx, pvUser, pDeviceDesc, cbDevice);
     2672    if (pThis->mEmWebcam)
     2673    {
     2674        pThis->mEmWebcam->EmWebcamCbDeviceDesc(rcRequest, pDeviceCtx, pvUser, pDeviceDesc, cbDevice);
     2675    }
    26632676}
    26642677
     
    26712684{
    26722685    ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvCallback);
    2673     EmWebcam *pWebcam = pThis->mConsole->getEmWebcam();
    2674     pWebcam->EmWebcamCbControl(rcRequest, pDeviceCtx, pvUser, pControl, cbControl);
     2686    if (pThis->mEmWebcam)
     2687    {
     2688        pThis->mEmWebcam->EmWebcamCbControl(rcRequest, pDeviceCtx, pvUser, pControl, cbControl);
     2689    }
    26752690}
    26762691
     
    26822697{
    26832698    ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvCallback);
    2684     EmWebcam *pWebcam = pThis->mConsole->getEmWebcam();
    2685     pWebcam->EmWebcamCbFrame(rcRequest, pDeviceCtx, pFrame, cbFrame);
     2699    if (pThis->mEmWebcam)
     2700    {
     2701        pThis->mEmWebcam->EmWebcamCbFrame(rcRequest, pDeviceCtx, pFrame, cbFrame);
     2702    }
    26862703}
    26872704
  • trunk/src/VBox/Main/src-client/EmulatedUSBImpl.cpp

    r48969 r49120  
    5454        EUSBSettingsMap mDrvSettings;
    5555
    56         static DECLCALLBACK(int) emulatedWebcamAttach(PUVM pUVM, EUSBWEBCAM *pThis);
     56        void *mpvObject;
     57
     58        static DECLCALLBACK(int) emulatedWebcamAttach(PUVM pUVM, EUSBWEBCAM *pThis, const char *pszDriver);
    5759        static DECLCALLBACK(int) emulatedWebcamDetach(PUVM pUVM, EUSBWEBCAM *pThis);
    5860
     
    6870            mcRefs(1),
    6971            mpEmulatedUSB(NULL),
    70             enmStatus(EUSBDEVICE_CREATED)
     72            enmStatus(EUSBDEVICE_CREATED),
     73            mpvObject(NULL)
    7174        {
    7275            RT_ZERO(mUuid);
     
    9194                           EmulatedUSB *pEmulatedUSB,
    9295                           const com::Utf8Str *aPath,
    93                            const com::Utf8Str *aSettings);
     96                           const com::Utf8Str *aSettings,
     97                           void *pvObject);
    9498        HRESULT Attach(Console *pConsole,
    95                        PUVM pUVM);
     99                       PUVM pUVM,
     100                       const char *pszDriver);
    96101        HRESULT Detach(Console *pConsole,
    97102                       PUVM pUVM);
     
    103108
    104109
    105 /* static */ DECLCALLBACK(int) EUSBWEBCAM::emulatedWebcamAttach(PUVM pUVM, EUSBWEBCAM *pThis)
     110/* static */ DECLCALLBACK(int) EUSBWEBCAM::emulatedWebcamAttach(PUVM pUVM, EUSBWEBCAM *pThis, const char *pszDriver)
    106111{
    107112    EUSBSettingsMap::const_iterator it;
     
    120125    PCFGMNODE pLunL0;
    121126    CFGMR3InsertNode(pInstance,   "LUN#0", &pLunL0);
    122     CFGMR3InsertString(pLunL0,      "Driver", "HostWebcam");
     127    CFGMR3InsertString(pLunL0,      "Driver", pszDriver);
    123128    CFGMR3InsertNode(pLunL0,        "Config", &pConfig);
    124129    CFGMR3InsertString(pConfig,       "DevicePath", pThis->mPath.c_str());
     130    CFGMR3InsertInteger(pConfig,      "Object", (uintptr_t)pThis->mpvObject);
    125131    for (it = pThis->mDrvSettings.begin(); it != pThis->mDrvSettings.end(); ++it)
    126132        CFGMR3InsertString(pConfig, it->first.c_str(), it->second.c_str());
     
    140146                               EmulatedUSB *pEmulatedUSB,
    141147                               const com::Utf8Str *aPath,
    142                                const com::Utf8Str *aSettings)
     148                               const com::Utf8Str *aSettings,
     149                               void *pvObject)
    143150{
    144151    HRESULT hrc = S_OK;
     
    161168            {
    162169                mpEmulatedUSB = pEmulatedUSB;
     170                mpvObject = pvObject;
    163171            }
    164172        }
     
    183191
    184192HRESULT EUSBWEBCAM::Attach(Console *pConsole,
    185                            PUVM pUVM)
     193                           PUVM pUVM,
     194                           const char *pszDriver)
    186195{
    187196    HRESULT hrc = S_OK;
    188197
    189198    int  vrc = VMR3ReqCallWaitU(pUVM, 0 /* idDstCpu (saved state, see #6232) */,
    190                                 (PFNRT)emulatedWebcamAttach, 2,
    191                                 pUVM, this);
     199                                (PFNRT)emulatedWebcamAttach, 3,
     200                                pUVM, this, pszDriver);
    192201
    193202    if (SUCCEEDED(hrc) && RT_FAILURE(vrc))
     
    322331                                  const com::Utf8Str &aSettings)
    323332{
     333    return webcamAttachInternal(aPath, aSettings, "HostWebcam", NULL);
     334}
     335
     336HRESULT EmulatedUSB::webcamAttachInternal(const com::Utf8Str &aPath,
     337                                          const com::Utf8Str &aSettings,
     338                                          const char *pszDriver,
     339                                          void *pvObject)
     340{
    324341    HRESULT hrc = S_OK;
    325342
     
    332349        if (p)
    333350        {
    334             hrc = p->Initialize(m.pConsole, this, &path, &aSettings);
     351            hrc = p->Initialize(m.pConsole, this, &path, &aSettings, pvObject);
    335352            if (SUCCEEDED(hrc))
    336353            {
     
    362379            if (SUCCEEDED(hrc))
    363380            {
    364                 hrc = p->Attach(m.pConsole, ptrVM.rawUVM());
     381                hrc = p->Attach(m.pConsole, ptrVM.rawUVM(), pszDriver);
    365382            }
    366383
     
    395412
    396413HRESULT EmulatedUSB::webcamDetach(const com::Utf8Str &aPath)
     414{
     415    return webcamDetachInternal(aPath);
     416}
     417
     418HRESULT EmulatedUSB::webcamDetachInternal(const com::Utf8Str &aPath)
    397419{
    398420    HRESULT hrc = S_OK;
  • trunk/src/VBox/Main/src-client/UsbWebcamInterface.cpp

    r47416 r49120  
    2121#include "ConsoleImpl.h"
    2222#include "ConsoleVRDPServer.h"
     23#include "EmulatedUSBImpl.h"
    2324
    2425#include <VBox/vmm/pdmwebcaminfs.h>
    2526
    2627
     28typedef struct EMWEBCAMREMOTE
     29{
     30    EmWebcam *pEmWebcam;
     31
     32    VRDEVIDEOINDEVICEHANDLE deviceHandle; /* The remote identifier. */
     33
     34    /* Received from the remote client. */
     35    uint32_t u32Version;                  /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
     36    uint32_t fu32Capabilities;            /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
     37    VRDEVIDEOINDEVICEDESC *pDeviceDesc;
     38    uint32_t cbDeviceDesc;
     39
     40    /* The device identifier for the PDM device.*/
     41    uint64_t u64DeviceId;
     42} EMWEBCAMREMOTE;
     43
    2744typedef struct EMWEBCAMDRV
    2845{
    29     EmWebcam *pEmWebcam;
     46    EMWEBCAMREMOTE *pRemote;
    3047    PPDMIWEBCAMUP  pIWebcamUp;
    3148    PDMIWEBCAMDOWN IWebcamDown;
    3249} EMWEBCAMDRV, *PEMWEBCAMDRV;
    3350
    34 typedef struct EMWEBCAMREMOTE
    35 {
    36     EmWebcam *pEmWebcam;
    37 
    38     VRDEVIDEOINDEVICEHANDLE deviceHandle; /* The remote identifier. */
    39     uint32_t u32Version;                  /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
    40     uint32_t fu32Capabilities;            /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
    41 
    42     /* The device identifier for the PDM device.*/
    43     uint64_t u64DeviceId;
    44 } EMWEBCAMREMOTE;
    45 
    4651typedef struct EMWEBCAMREQCTX
    4752{
     
    5459                                           bool fReady)
    5560{
     61    NOREF(fReady);
     62
    5663    PEMWEBCAMDRV pThis = RT_FROM_MEMBER(pInterface, EMWEBCAMDRV, IWebcamDown);
    57     NOREF(pThis);
    58     NOREF(fReady);
     64    EMWEBCAMREMOTE *pRemote = pThis->pRemote;
     65
     66    LogFlowFunc(("pRemote:%p\n", pThis->pRemote));
     67
     68    if (pThis->pIWebcamUp)
     69    {
     70        pThis->pIWebcamUp->pfnWebcamUpAttached(pThis->pIWebcamUp,
     71                                               pRemote->u64DeviceId,
     72                                               (const PDMIWEBCAM_DEVICEDESC *)pRemote->pDeviceDesc,
     73                                               pRemote->cbDeviceDesc,
     74                                               pRemote->u32Version,
     75                                               pRemote->fu32Capabilities);
     76    }
    5977}
    6078
     
    6684{
    6785    PEMWEBCAMDRV pThis = RT_FROM_MEMBER(pInterface, EMWEBCAMDRV, IWebcamDown);
    68 
    69     LogFlowFunc(("pEmWebcam:%p, u64DeviceId %lld\n", pThis->pEmWebcam, u64DeviceId));
    70 
    71     return pThis->pEmWebcam->SendControl(pThis, pvUser, u64DeviceId, (const VRDEVIDEOINCTRLHDR *)pCtrl, cbCtrl);
    72 }
    73 
    74 
    75 EmWebcam::EmWebcam(Console *console)
     86    EMWEBCAMREMOTE *pRemote = pThis->pRemote;
     87
     88    LogFlowFunc(("pRemote:%p, u64DeviceId %lld\n", pRemote, u64DeviceId));
     89
     90    return pRemote->pEmWebcam->SendControl(pThis, pvUser, u64DeviceId, (const VRDEVIDEOINCTRLHDR *)pCtrl, cbCtrl);
     91}
     92
     93
     94EmWebcam::EmWebcam(ConsoleVRDPServer *pServer)
    7695    :
    77     mParent(console),
     96    mParent(pServer),
    7897    mpDrv(NULL),
    7998    mpRemote(NULL),
     
    86105    if (mpDrv)
    87106    {
    88         mpDrv->pEmWebcam = NULL;
     107        mpDrv->pRemote = NULL;
    89108        mpDrv = NULL;
    90109    }
     
    104123    if (mpRemote)
    105124    {
    106         mParent->consoleVRDPServer()->VideoInDeviceDetach(&mpRemote->deviceHandle);
     125        mParent->VideoInDeviceDetach(&mpRemote->deviceHandle);
     126
     127        RTMemFree(mpRemote->pDeviceDesc);
     128        mpRemote->pDeviceDesc = NULL;
     129        mpRemote->cbDeviceDesc = 0;
     130
    107131        RTMemFree(mpRemote);
    108132        mpRemote = NULL;
    109133    }
    110134
     135    mpDrv->pRemote = NULL;
    111136    mpDrv = NULL;
    112137}
     
    159184            pRemote->u32Version       = u32Version;
    160185            pRemote->fu32Capabilities = fu32Capabilities;
     186            pRemote->pDeviceDesc      = NULL;
     187            pRemote->cbDeviceDesc     = 0;
    161188            pRemote->u64DeviceId      = ASMAtomicIncU64(&mu64DeviceIdSrc);
    162189
     
    164191
    165192            /* Tell the server that this webcam will be used. */
    166             rc = mParent->consoleVRDPServer()->VideoInDeviceAttach(&mpRemote->deviceHandle, mpRemote);
     193            rc = mParent->VideoInDeviceAttach(&mpRemote->deviceHandle, mpRemote);
    167194            if (RT_FAILURE(rc))
    168195            {
     
    173200
    174201            /* Get the device description. */
    175             rc = mParent->consoleVRDPServer()->VideoInGetDeviceDesc(NULL, &mpRemote->deviceHandle);
     202            rc = mParent->VideoInGetDeviceDesc(NULL, &mpRemote->deviceHandle);
    176203
    177204            if (RT_FAILURE(rc))
    178205            {
    179                 mParent->consoleVRDPServer()->VideoInDeviceDetach(&mpRemote->deviceHandle);
     206                mParent->VideoInDeviceDetach(&mpRemote->deviceHandle);
    180207                RTMemFree(mpRemote);
    181208                mpRemote = NULL;
     
    201228                                                           mpRemote->u64DeviceId);
    202229                }
    203 
    204                 /* No need to tell the server by calling VideoInDeviceDetach because the server is telling. */
    205                 RTMemFree(mpRemote);
    206                 mpRemote = NULL;
     230                /* mpRemote is deallocated in EmWebcamDestruct */
    207231            }
    208232        } break;
     
    228252    if (RT_SUCCESS(rcRequest))
    229253    {
    230         if (mpDrv && mpDrv->pIWebcamUp)
    231         {
    232             mpDrv->pIWebcamUp->pfnWebcamUpAttached(mpDrv->pIWebcamUp,
    233                                                    pRemote->u64DeviceId,
    234                                                    (const PDMIWEBCAM_DEVICEDESC *)pDeviceDesc,
    235                                                    cbDeviceDesc,
    236                                                    pRemote->u32Version,
    237                                                    pRemote->fu32Capabilities);
    238         }
     254        /* Save device description. */
     255        Assert(pRemote->pDeviceDesc == NULL);
     256        pRemote->pDeviceDesc = (VRDEVIDEOINDEVICEDESC *)RTMemDup(pDeviceDesc, cbDeviceDesc);
     257        pRemote->cbDeviceDesc = cbDeviceDesc;
     258
     259        /* Try to attach the device. */
     260        EmulatedUSB *pEUSB = mParent->getConsole()->getEmulatedUSB();
     261        pEUSB->webcamAttachInternal("", "", "EmWebcam", pRemote);
    239262    }
    240263    else
    241264    {
    242         mParent->consoleVRDPServer()->VideoInDeviceDetach(&mpRemote->deviceHandle);
     265        mParent->VideoInDeviceDetach(&mpRemote->deviceHandle);
    243266        RTMemFree(mpRemote);
    244267        mpRemote = NULL;
     
    324347        pCtx->pvUser = pvUser;
    325348
    326         rc = mParent->consoleVRDPServer()->VideoInControl(pCtx, &mpRemote->deviceHandle, pControl, cbControl);
     349        rc = mParent->VideoInControl(pCtx, &mpRemote->deviceHandle, pControl, cbControl);
    327350
    328351        if (RT_FAILURE(rc))
     
    351374    PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
    352375    PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV);
    353 
    354     LogFlowFunc(("iInstance %d, pEmWebcam %p, pIWebcamUp %p\n",
    355                  pDrvIns->iInstance, pThis->pEmWebcam, pThis->pIWebcamUp));
    356 
    357     if (pThis->pEmWebcam)
    358     {
    359         pThis->pEmWebcam->EmWebcamDestruct(pThis);
    360         pThis->pEmWebcam = NULL;
     376    EMWEBCAMREMOTE *pRemote = pThis->pRemote;
     377
     378    LogFlowFunc(("iInstance %d, pRemote %p, pIWebcamUp %p\n",
     379                 pDrvIns->iInstance, pRemote, pThis->pIWebcamUp));
     380
     381    if (pRemote && pRemote->pEmWebcam)
     382    {
     383        pRemote->pEmWebcam->EmWebcamDestruct(pThis);
    361384    }
    362385}
     
    368391
    369392    PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV);
    370 
    371     if (!CFGMR3AreValuesValid(pCfg, "Object\0"))
    372         return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
    373393
    374394    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
     
    392412
    393413    /* Everything ok. Initialize. */
    394     pThis->pEmWebcam = (EmWebcam *)pv;
    395     pThis->pEmWebcam->EmWebcamConstruct(pThis);
     414    pThis->pRemote = (EMWEBCAMREMOTE *)pv;
     415    pThis->pRemote->pEmWebcam->EmWebcamConstruct(pThis);
    396416
    397417    pDrvIns->IBase.pfnQueryInterface = drvQueryInterface;
Note: See TracChangeset for help on using the changeset viewer.

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