VirtualBox

Changeset 46523 in vbox for trunk


Ignore:
Timestamp:
Jun 13, 2013 12:02:48 PM (12 years ago)
Author:
vboxsync
Message:

Main/VBoxManage: allow to enable video recording at VM runtime

Location:
trunk/src/VBox
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp

    r46466 r46523  
    13401340            RTFileClose(pngFile);
    13411341        }
    1342         else if (   !strcmp(a->argv[1], "enablevideocapture")
    1343                  || !strcmp(a->argv[1], "disablevideocapture"))
     1342        else if (   !strcmp(a->argv[1], "vcpenabled"))
     1343        {
     1344            if (a->argc != 3)
     1345            {
     1346                errorArgument("Missing argument to '%s'", a->argv[1]);
     1347                rc = E_FAIL;
     1348                break;
     1349            }
     1350            if (!strcmp(a->argv[2], "on"))
     1351            {
     1352                CHECK_ERROR_RET(sessionMachine, COMSETTER(VideoCaptureEnabled)(TRUE), 1);
     1353            }
     1354            else if (!strcmp(a->argv[2], "off"))
     1355            {
     1356                CHECK_ERROR_RET(sessionMachine, COMSETTER(VideoCaptureEnabled)(FALSE), 1);
     1357            }
     1358            else
     1359            {
     1360                errorArgument("Invalid state '%s'", Utf8Str(a->argv[2]).c_str());
     1361                rc = E_FAIL;
     1362                break;
     1363            }
     1364        }
     1365        else if (   !strcmp(a->argv[1], "videocapturescreens"))
    13441366        {
    13451367            ULONG cMonitors = 64;
    13461368            CHECK_ERROR_BREAK(machine, COMGETTER(MonitorCount)(&cMonitors));
    13471369            com::SafeArray<BOOL> saScreens(cMonitors);
    1348             bool fEnable = !strcmp(a->argv[1], "enablevideocapture");
    1349             if (a->argc < 3)
    1350             {
    1351                 /* default: handle all screens */
     1370            if (   a->argc == 3
     1371                && !strcmp(a->argv[2], "all"))
     1372            {
     1373                /* enable all screens */
    13521374                for (unsigned i = 0; i < cMonitors; i++)
    13531375                    saScreens[i] = true;
    13541376            }
     1377            else if (   a->argc == 3
     1378                     && !strcmp(a->argv[2], "none"))
     1379            {
     1380                /* disable all screens */
     1381                for (unsigned i = 0; i < cMonitors; i++)
     1382                    saScreens[i] = false;
     1383            }
    13551384            else
    13561385            {
    1357                 /* handle selected screens */
    1358                 CHECK_ERROR_BREAK(machine, COMGETTER(VideoCaptureScreens)(ComSafeArrayAsOutParam(saScreens)));
     1386                /* enable selected screens */
     1387                for (unsigned i = 0; i < cMonitors; i++)
     1388                    saScreens[i] = false;
    13591389                for (int i = 2; SUCCEEDED(rc) && i < a->argc; i++)
    13601390                {
     
    13731403                        break;
    13741404                    }
    1375                     saScreens[iScreen] = fEnable;
     1405                    saScreens[iScreen] = true;
    13761406                }
    13771407            }
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r46290 r46523  
    470470                     "                                              [<xorigin> <yorigin>]]] |\n"
    471471                     "                            screenshotpng <file> [display] |\n"
    472                      "                            enablevideocapture <screen>,[<screen>...]\n"
    473                      "                            disablevideocapture <screen>,[<screen>...]\n"
     472                     "                            vcpenabled on|off |\n"
     473                     "                            vcpscreens all|none|<screen>,[<screen>...] |\n"
    474474                     "                            setcredentials <username>\n"
    475475                     "                                           --passwordfile <file> | <password>\n"
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r46478 r46523  
    42634263      <desc>
    42644264        This setting determines the filename VirtualBox uses to save
    4265         the recorded content.</desc>
     4265        the recorded content. This setting cannot be changed while video
     4266        capturing is enabled.
     4267      </desc>
    42664268    </attribute>
    42674269
    42684270    <attribute name="VideoCaptureWidth" type="unsigned long" default="640">
    42694271      <desc>
    4270         This setting determines the horizontal resolution of the recorded video.</desc>
     4272        This setting determines the horizontal resolution of the recorded
     4273        video. This setting cannot be changed while video capturing is
     4274        enabled.
     4275      </desc>
    42714276    </attribute>
    42724277
    42734278    <attribute name="VideoCaptureHeight" type="unsigned long" default="480">
    42744279      <desc>
    4275         This setting determines the vertical resolution of the recorded video.</desc>
     4280        This setting determines the vertical resolution of the recorded
     4281        video. This setting cannot be changed while video capturing is
     4282        enabled.
     4283      </desc>
    42764284    </attribute>
    42774285
     
    42804288        This setting determines the bitrate in kilobits per second.
    42814289        Increasing this value makes the video look better for the
    4282         cost of an increased file size.
     4290        cost of an increased file size. This setting cannot be changed
     4291        while video capturing is enabled.
    42834292      </desc>
    42844293    </attribute>
     
    42894298        Frames with a higher frequency will be skipped. Reducing this
    42904299        value increses the number of skipped frames but reduces the
    4291         file size.
     4300        file size. This setting cannot be changed while video capturing
     4301        is enabled.
    42924302      </desc>
    42934303    </attribute>
     
    1469114701  <interface
    1469214702    name="IDisplay" extends="$unknown"
    14693     uuid="0598a3df-3dc0-43c7-a79c-237fb5bb633d"
     14703    uuid="23efdcab-1ae5-47ee-951e-e0f9a3935f2a"
    1469414704    wsmap="managed"
    1469514705    >
     
    1489614906        <desc>
    1489714907          Array with resulting screen data.
    14898         </desc>
    14899       </param>
    14900     </method>
    14901 
    14902     <method name="enableVideoCaptureScreens">
    14903       <desc>
    14904         Start/stop video capture on selected screens.
    14905       </desc>
    14906       <param name="screens" type="boolean" safearray="yes" dir="in">
    14907         <desc>
    14908           The screens to start/stop capturing.
    1490914908        </desc>
    1491014909      </param>
  • trunk/src/VBox/Main/include/DisplayImpl.h

    r46465 r46523  
    3030struct VIDEORECCONTEXT;
    3131
    32 enum {
     32enum
     33{
    3334    ResizeStatus_Void,
    3435    ResizeStatus_InProgress,
     
    6869    bool fDefaultFormat;
    6970
    70     struct {
     71    struct
     72    {
    7173        /* The rectangle that includes all dirty rectangles. */
    7274        int32_t xLeft;
     
    7678    } dirtyRect;
    7779
    78     struct {
     80    struct
     81    {
    7982        bool fPending;
    8083        ULONG pixelFormat;
     
    9093    bool fVBVAEnabled;
    9194    uint32_t cVBVASkipUpdate;
    92     struct {
     95    struct
     96    {
    9397       int32_t xLeft;
    9498       int32_t yTop;
     
    129133
    130134    // public methods only for internal purposes
    131     int handleDisplayResize(unsigned uScreenId, uint32_t bpp, void *pvVRAM, uint32_t cbLine, int w, int h, uint16_t flags);
     135    int  handleDisplayResize(unsigned uScreenId, uint32_t bpp, void *pvVRAM, uint32_t cbLine, int w, int h, uint16_t flags);
    132136    void handleDisplayUpdateLegacy(int x, int y, int cx, int cy);
    133137    void handleDisplayUpdate(unsigned uScreenId, int x, int y, int w, int h);
     
    146150        return maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer;
    147151    }
    148     void getFramebufferDimensions(int32_t *px1, int32_t *py1, int32_t *px2,
    149                                   int32_t *py2);
    150 
    151     int handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect);
    152     int handleQueryVisibleRegion(uint32_t *pcRect, PRTRECT pRect);
    153 
    154     int VideoAccelEnable(bool fEnable, VBVAMEMORY *pVbvaMemory);
     152    void getFramebufferDimensions(int32_t *px1, int32_t *py1, int32_t *px2, int32_t *py2);
     153
     154    int  handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect);
     155    int  handleQueryVisibleRegion(uint32_t *pcRect, PRTRECT pRect);
     156
     157    int  VideoAccelEnable(bool fEnable, VBVAMEMORY *pVbvaMemory);
    155158    void VideoAccelFlush(void);
    156 
    157159    bool VideoAccelAllowed(void);
    158 
    159160    void VideoAccelVRDP(bool fEnable);
     161
     162    int  VideoCaptureStart();
     163    void VideoCaptureStop();
     164    int  VideoCaptureEnableScreens(ComSafeArrayIn(BOOL, aScreens));
    160165
    161166    // IEventListener methods
     
    170175    STDMETHOD(TakeScreenShotToArray)(ULONG aScreenId, ULONG width, ULONG height, ComSafeArrayOut(BYTE, aScreenData));
    171176    STDMETHOD(TakeScreenShotPNGToArray)(ULONG aScreenId, ULONG width, ULONG height, ComSafeArrayOut(BYTE, aScreenData));
    172     STDMETHOD(EnableVideoCaptureScreens)(ComSafeArrayIn(BOOL, aScreens));
    173177    STDMETHOD(DrawToScreen)(ULONG aScreenId, BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
    174178    STDMETHOD(InvalidateAndUpdate)();
     
    213217    static DECLCALLBACK(void)  displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl);
    214218
    215     static DECLCALLBACK(void) displayCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
    216     static DECLCALLBACK(void) displayCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
     219    static DECLCALLBACK(void)  displayCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
     220    static DECLCALLBACK(void)  displayCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
    217221#endif
    218222
     
    227231#endif
    228232
    229 
    230233    static DECLCALLBACK(void)  displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser);
    231234    static DECLCALLBACK(int)   displaySSMLoadScreenshot(PSSMHANDLE pSSM, void *pvUser, uint32_t uVersion, uint32_t uPass);
     
    245248
    246249    /* arguments of the last handleDisplayResize() call */
    247     void *mLastAddress;
    248     uint32_t mLastBytesPerLine;
    249     uint32_t mLastBitsPerPixel;
    250     int mLastWidth;
    251     int mLastHeight;
    252     uint16_t mLastFlags;
     250    void       *mLastAddress;
     251    uint32_t    mLastBytesPerLine;
     252    uint32_t    mLastBitsPerPixel;
     253    int         mLastWidth;
     254    int         mLastHeight;
     255    uint16_t    mLastFlags;
    253256
    254257    VBVAMEMORY *mpVbvaMemory;
     
    264267
    265268    uint8_t    *mpu8VbvaPartial;
    266     uint32_t   mcbVbvaPartial;
     269    uint32_t    mcbVbvaPartial;
    267270
    268271#ifdef VBOX_WITH_CRHGSMI
     
    279282    volatile uint32_t mfu32PendingVideoAccelDisable;
    280283
    281     int vbvaLock(void);
     284    int  vbvaLock(void);
    282285    void vbvaUnlock(void);
    283286   
    284287    RTCRITSECT mSaveSeamlessRectLock;
    285     int SaveSeamlessRectLock(void);
     288    int  SaveSeamlessRectLock(void);
    286289    void SaveSeamlessRectUnLock(void);
    287290   
    288291public:
    289     static int displayTakeScreenshotEMT(Display *pDisplay, ULONG aScreenId, uint8_t **ppu8Data, size_t *pcbData, uint32_t *pu32Width, uint32_t *pu32Height);
     292    static int  displayTakeScreenshotEMT(Display *pDisplay, ULONG aScreenId, uint8_t **ppu8Data, size_t *pcbData, uint32_t *pu32Width, uint32_t *pu32Height);
    290293
    291294private:
    292295    static void InvalidateAndUpdateEMT(Display *pDisplay, unsigned uId, bool fUpdateAll);
    293     static int drawToScreenEMT(Display *pDisplay, ULONG aScreenId, BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
    294 
    295     int videoAccelRefreshProcess(void);
     296    static int  drawToScreenEMT(Display *pDisplay, ULONG aScreenId, BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
     297
     298    int  videoAccelRefreshProcess(void);
    296299
    297300    /* Functions run under VBVA lock. */
    298     int videoAccelEnable(bool fEnable, VBVAMEMORY *pVbvaMemory);
     301    int  videoAccelEnable(bool fEnable, VBVAMEMORY *pVbvaMemory);
    299302    void videoAccelFlush(void);
    300303
     
    310313
    311314void gdImageCopyResampled(uint8_t *dst, uint8_t *src,
    312                           int dstX, int dstY,
    313                           int srcX, int srcY,
     315                          int dstX, int dstY, int srcX, int srcY,
    314316                          int dstW, int dstH, int srcW, int srcH);
    315317
    316 
    317 void BitmapScale32(uint8_t *dst,
    318                        int dstW, int dstH,
    319                        const uint8_t *src,
    320                        int iDeltaLine,
    321                        int srcW, int srcH);
     318void BitmapScale32(uint8_t *dst, int dstW, int dstH,
     319                   const uint8_t *src, int iDeltaLine, int srcW, int srcH);
    322320
    323321int DisplayMakePNG(uint8_t *pu8Data, uint32_t cx, uint32_t cy,
  • trunk/src/VBox/Main/src-client/ConsoleImpl.cpp

    r46465 r46523  
    51085108    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    51095109
     5110    BOOL fEnabled;
     5111    HRESULT rc = mMachine->COMGETTER(VideoCaptureEnabled)(&fEnabled);
    51105112    SafeArray<BOOL> screens;
    5111     HRESULT rc = mMachine->COMGETTER(VideoCaptureScreens)(ComSafeArrayAsOutParam(screens));
     5113    if (SUCCEEDED(rc))
     5114        rc = mMachine->COMGETTER(VideoCaptureScreens)(ComSafeArrayAsOutParam(screens));
    51125115    if (mDisplay)
    51135116    {
     5117        int vrc = VINF_SUCCESS;
    51145118        if (SUCCEEDED(rc))
    5115             rc = mDisplay->EnableVideoCaptureScreens(ComSafeArrayAsInParam(screens));
    5116         if (SUCCEEDED(rc))
    5117             fireVideoCaptureChangedEvent(mEventSource);
     5119            vrc = mDisplay->VideoCaptureEnableScreens(ComSafeArrayAsInParam(screens));
     5120        if (RT_SUCCESS(vrc))
     5121        {
     5122            if (fEnabled)
     5123                vrc = mDisplay->VideoCaptureStart();
     5124            else
     5125                mDisplay->VideoCaptureStop();
     5126            if (RT_SUCCESS(vrc))
     5127                fireVideoCaptureChangedEvent(mEventSource);
     5128            else
     5129                rc = E_FAIL;
     5130        }
    51185131    }
    51195132
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r46471 r46523  
    123123    int rc = RTCritSectInit(&mVBVALock);
    124124    AssertRC(rc);
    125    
     125
    126126    rc = RTCritSectInit(&mSaveSeamlessRectLock);
    127127    AssertRC(rc);
    128    
     128
    129129    mfu32PendingVideoAccelDisable = false;
    130130
     
    150150        memset (&mVBVALock, 0, sizeof (mVBVALock));
    151151    }
    152    
     152
    153153    if (RTCritSectIsInitialized(&mSaveSeamlessRectLock))
    154154    {
     
    837837        LogRelFlow(("[%d]: default format %d\n", uScreenId, pFBInfo->fDefaultFormat));
    838838
    839         /* Handle the case if there are some saved visible region that needs to be 
    840          * applied after the resize of the framebuffer is completed 
     839        /* Handle the case if there are some saved visible region that needs to be
     840         * applied after the resize of the framebuffer is completed
    841841         */
    842842        SaveSeamlessRectLock();
     
    11251125                 * for the new region (THis is checked in the above if condition ). With 0 intersection,
    11261126                 * cRectVisibleRegions = 0  is returned to the GUI and if GUI has invalidated its
    1127                  * earlier region then it draws nothihing and seamless mode doesn't display the 
     1127                 * earlier region then it draws nothihing and seamless mode doesn't display the
    11281128                 * guest desktop.
    11291129                 */
     
    14231423    RTCritSectLeave(&mVBVALock);
    14241424}
    1425  
     1425
    14261426int Display::SaveSeamlessRectLock(void)
    14271427{
    14281428    return RTCritSectEnter(&mSaveSeamlessRectLock);
    14291429}
    1430    
     1430
    14311431void Display::SaveSeamlessRectUnLock(void)
    14321432{
    14331433    RTCritSectLeave(&mSaveSeamlessRectLock);
    14341434}
    1435    
     1435
    14361436
    14371437/**
     
    25092509                      tr("Could not take a screenshot (%Rrc)"), vrc);
    25102510
    2511     LogRelFlowFunc(("rc=%08X\n", rc));
     2511    LogRelFlowFunc(("rc=%Rhrc\n", rc));
    25122512    return rc;
    25132513}
     
    25872587    RTMemFree(pu8Data);
    25882588
    2589     LogRelFlowFunc(("rc=%08X\n", rc));
     2589    LogRelFlowFunc(("rc=%Rhrc\n", rc));
    25902590    return rc;
    25912591}
     
    26702670    RTMemFree(pu8Data);
    26712671
    2672     LogRelFlowFunc(("rc=%08X\n", rc));
     2672    LogRelFlowFunc(("rc=%Rhrc\n", rc));
    26732673    return rc;
    26742674}
    26752675
    2676 STDMETHODIMP Display::EnableVideoCaptureScreens(ComSafeArrayIn(BOOL, aScreens))
     2676int Display::VideoCaptureEnableScreens(ComSafeArrayIn(BOOL, aScreens))
    26772677{
    26782678#ifdef VBOX_WITH_VPX
     
    26802680    for (unsigned i = 0; i < Screens.size(); i++)
    26812681        maVideoRecEnabled[i] = Screens[i];
    2682     return S_OK;
     2682    return VINF_SUCCESS;
    26832683#else
    2684     return E_NOTIMPL;
     2684    return VERR_NOT_IMPLEMENTED;
     2685#endif
     2686}
     2687
     2688/**
     2689 * Start video capturing. Does nothing if capturing is already active.
     2690 */
     2691int Display::VideoCaptureStart()
     2692{
     2693#ifdef VBOX_WITH_VPX
     2694    if (VideoRecIsEnabled(mpVideoRecCtx))
     2695        return VINF_SUCCESS;
     2696
     2697    int rc = VideoRecContextCreate(&mpVideoRecCtx, mcMonitors);
     2698    if (RT_FAILURE(rc))
     2699    {
     2700        LogFlow(("Failed to create video recording context (%Rrc)!\n", rc));
     2701        return rc;
     2702    }
     2703    ComPtr<IMachine> pMachine = mParent->machine();
     2704    com::SafeArray<BOOL> screens;
     2705    HRESULT hrc = pMachine->COMGETTER(VideoCaptureScreens)(ComSafeArrayAsOutParam(screens));
     2706    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
     2707    for (unsigned i = 0; i < RT_ELEMENTS(maVideoRecEnabled); i++)
     2708        maVideoRecEnabled[i] = i < screens.size() && screens[i];
     2709    ULONG ulWidth;
     2710    hrc = pMachine->COMGETTER(VideoCaptureWidth)(&ulWidth);
     2711    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
     2712    ULONG ulHeight;
     2713    hrc = pMachine->COMGETTER(VideoCaptureHeight)(&ulHeight);
     2714    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
     2715    ULONG ulRate;
     2716    hrc = pMachine->COMGETTER(VideoCaptureRate)(&ulRate);
     2717    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
     2718    ULONG ulFps;
     2719    hrc = pMachine->COMGETTER(VideoCaptureFps)(&ulFps);
     2720    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
     2721    BSTR strFile;
     2722    hrc = pMachine->COMGETTER(VideoCaptureFile)(&strFile);
     2723    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
     2724    for (unsigned uScreen = 0; uScreen < mcMonitors; uScreen++)
     2725    {
     2726        char *pszAbsPath = RTPathAbsDup(com::Utf8Str(strFile).c_str());
     2727        char *pszExt = RTPathExt(pszAbsPath);
     2728        if (pszExt)
     2729            pszExt = RTStrDup(pszExt);
     2730        RTPathStripExt(pszAbsPath);
     2731        if (!pszAbsPath)
     2732            rc = VERR_INVALID_PARAMETER;
     2733        if (!pszExt)
     2734            pszExt = RTStrDup(".webm");
     2735        char *pszName = NULL;
     2736        if (RT_SUCCESS(rc))
     2737        {
     2738            if (mcMonitors > 1)
     2739                rc = RTStrAPrintf(&pszName, "%s-%u%s", pszAbsPath, uScreen+1, pszExt);
     2740            else
     2741                rc = RTStrAPrintf(&pszName, "%s%s", pszAbsPath, pszExt);
     2742        }
     2743        if (RT_SUCCESS(rc))
     2744            rc = VideoRecStrmInit(mpVideoRecCtx, uScreen,
     2745                                  pszName, ulWidth, ulHeight, ulRate, ulFps);
     2746        if (RT_SUCCESS(rc))
     2747            LogRel(("WebM/VP8 video recording screen #%u with %ux%u @ %u kbps, %u fps to '%s' enabled!\n",
     2748                   uScreen, ulWidth, ulHeight, ulRate, ulFps, pszName));
     2749        else
     2750            LogRel(("Failed to initialize video recording context #%u (%Rrc)!\n", uScreen, rc));
     2751        RTStrFree(pszName);
     2752        RTStrFree(pszExt);
     2753        RTStrFree(pszAbsPath);
     2754    }
     2755    return rc;
     2756#else
     2757    return VERR_NOT_IMPLEMENTED;
     2758#endif
     2759}
     2760
     2761/**
     2762 * Stop video capturing. Does nothing if video capturing is not active.
     2763 */
     2764void Display::VideoCaptureStop()
     2765{
     2766#ifdef VBOX_WITH_VPX
     2767    VideoRecContextClose(mpVideoRecCtx);
     2768    mpVideoRecCtx = NULL;
    26852769#endif
    26862770}
     
    28482932//    }
    28492933
    2850     LogRelFlowFunc(("rc=%08X\n", rc));
     2934    LogRelFlowFunc(("rc=%Rhrc\n", rc));
    28512935    return rc;
    28522936}
     
    29703054                      tr("Could not invalidate and update the screen (%Rrc)"), rcVBox);
    29713055
    2972     LogRelFlowFunc(("rc=%08X\n", rc));
     3056    LogRelFlowFunc(("rc=%Rhrc\n", rc));
    29733057    return rc;
    29743058}
     
    43304414        AutoWriteLock displayLock(pThis->pDisplay COMMA_LOCKVAL_SRC_POS);
    43314415#ifdef VBOX_WITH_VPX
    4332         VideoRecContextClose(pThis->pDisplay->mpVideoRecCtx);
    4333         pThis->pDisplay->mpVideoRecCtx = NULL;
     4416        pThis->pDisplay->VideoCaptureStop();
    43344417#endif
    43354418#ifdef VBOX_WITH_CRHGSMI
     
    44434526    ComPtr<IMachine> pMachine = pDisplay->mParent->machine();
    44444527    BOOL fEnabled = false;
    4445     pMachine->COMGETTER(VideoCaptureEnabled)(&fEnabled);
     4528    HRESULT hrc = pMachine->COMGETTER(VideoCaptureEnabled)(&fEnabled);
     4529    AssertComRCReturn(hrc, VERR_COM_UNEXPECTED);
    44464530    if (fEnabled)
    4447     {
    4448         rc = VideoRecContextCreate(&pDisplay->mpVideoRecCtx, pDisplay->mcMonitors);
    4449         if (RT_FAILURE(rc))
    4450         {
    4451             LogFlow(("Failed to create video recording context (%Rrc)!\n", rc));
    4452             return E_FAIL;
    4453         }
    4454         com::SafeArray<BOOL> screens;
    4455         HRESULT hrc = pMachine->COMGETTER(VideoCaptureScreens)(ComSafeArrayAsOutParam(screens));
    4456         AssertComRCReturnRC(hrc);
    4457         for (unsigned i = 0; i < RT_ELEMENTS(pDisplay->maVideoRecEnabled); i++)
    4458             pDisplay->maVideoRecEnabled[i] = i < screens.size() && screens[i];
    4459         ULONG ulWidth;
    4460         hrc = pMachine->COMGETTER(VideoCaptureWidth)(&ulWidth);
    4461         AssertComRCReturnRC(hrc);
    4462         ULONG ulHeight;
    4463         hrc = pMachine->COMGETTER(VideoCaptureHeight)(&ulHeight);
    4464         AssertComRCReturnRC(hrc);
    4465         ULONG ulRate;
    4466         hrc = pMachine->COMGETTER(VideoCaptureRate)(&ulRate);
    4467         AssertComRCReturnRC(hrc);
    4468         ULONG ulFps;
    4469         hrc = pMachine->COMGETTER(VideoCaptureFps)(&ulFps);
    4470         AssertComRCReturnRC(hrc);
    4471         BSTR strFile;
    4472         hrc = pMachine->COMGETTER(VideoCaptureFile)(&strFile);
    4473         AssertComRCReturnRC(hrc);
    4474         for (unsigned uScreen = 0; uScreen < pDisplay->mcMonitors; uScreen++)
    4475         {
    4476             char *pszAbsPath = RTPathAbsDup(com::Utf8Str(strFile).c_str());
    4477             char *pszExt = RTPathExt(pszAbsPath);
    4478             if (pszExt)
    4479                 pszExt = RTStrDup(pszExt);
    4480             RTPathStripExt(pszAbsPath);
    4481             if (!pszAbsPath)
    4482                 rc = VERR_INVALID_PARAMETER;
    4483             if (!pszExt)
    4484                 pszExt = RTStrDup(".webm");
    4485             char *pszName = NULL;
    4486             if (RT_SUCCESS(rc))
    4487             {
    4488                 if (pDisplay->mcMonitors > 1)
    4489                     rc = RTStrAPrintf(&pszName, "%s-%u%s", pszAbsPath, uScreen+1, pszExt);
    4490                 else
    4491                     rc = RTStrAPrintf(&pszName, "%s%s", pszAbsPath, pszExt);
    4492             }
    4493             if (RT_SUCCESS(rc))
    4494                 rc = VideoRecStrmInit(pDisplay->mpVideoRecCtx, uScreen,
    4495                                       pszName, ulWidth, ulHeight, ulRate, ulFps);
    4496             if (RT_SUCCESS(rc))
    4497                 LogRel(("WebM/VP8 video recording screen #%u with %ux%u @ %u kbps, %u fps to '%s' enabled!\n",
    4498                         uScreen, ulWidth, ulHeight, ulRate, ulFps, pszName));
    4499             else
    4500                 LogRel(("Failed to initialize video recording context #%u (%Rrc)!\n", uScreen, rc));
    4501             RTStrFree(pszName);
    4502             RTStrFree(pszExt);
    4503             RTStrFree(pszAbsPath);
    4504         }
    4505     }
     4531        rc = pDisplay->VideoCaptureStart();
    45064532#endif
    45074533
    4508     return VINF_SUCCESS;
     4534    return rc;
    45094535}
    45104536
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r46465 r46523  
    15161516    mHWData->mCpuExecutionCap = aExecutionCap;
    15171517
    1518     /* Save settings if online - todo why is this required?? */
     1518    /** Save settings if online - @todo why is this required? -- @bugref{6818} */
    15191519    if (Global::IsOnline(mData->mMachineState))
    15201520        saveSettings(NULL);
     
    17271727    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    17281728
    1729     rc = checkStateDependency(MutableStateDep);
    1730     if (FAILED(rc)) return rc;
    1731 
    17321729    setModified(IsModified_MachineData);
    17331730    mHWData.backup();
    1734 
    17351731    mHWData->mVideoCaptureEnabled = fEnabled;
     1732
     1733    /** Save settings if online - @todo why is this required? -- @bugref{6818} */
     1734    if (Global::IsOnline(mData->mMachineState))
     1735        saveSettings(NULL);
     1736
     1737    alock.release();
     1738    rc = onVideoCaptureChange();
    17361739
    17371740    return rc;
     
    17771780        if (FAILED(rc)) return rc;
    17781781        setModified(IsModified_MachineData);
     1782
     1783        /** Save settings if online - @todo why is this required? -- @bugref{6818} */
    17791784        if (Global::IsOnline(mData->mMachineState))
    17801785            saveSettings(NULL);
     
    18021807    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    18031808
    1804     HRESULT rc = checkStateDependency(MutableStateDep);
    1805     if (FAILED(rc)) return rc;
     1809    if (mHWData->mVideoCaptureEnabled)
     1810        return setError(E_INVALIDARG, tr("Cannot change parameters while capturing is enabled"));
    18061811
    18071812    if (strFile.isEmpty())
     
    18321837    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    18331838
    1834     HRESULT rc = checkStateDependency(MutableStateDep);
    1835     if (FAILED(rc)) return rc;
     1839    if (mHWData->mVideoCaptureEnabled)
     1840        return setError(E_INVALIDARG, tr("Cannot change parameters while capturing is enabled"));
    18361841
    18371842    setModified(IsModified_MachineData);
     
    18591864    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    18601865
    1861     HRESULT rc = checkStateDependency(MutableStateDep);
    1862     if (FAILED(rc)) return rc;
     1866    if (mHWData->mVideoCaptureEnabled)
     1867        return setError(E_INVALIDARG, tr("Cannot change parameters while capturing is enabled"));
    18631868
    18641869    setModified(IsModified_MachineData);
     
    18861891    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    18871892
    1888     HRESULT rc = checkStateDependency(MutableStateDep);
    1889     if (FAILED(rc)) return rc;
     1893    if (mHWData->mVideoCaptureEnabled)
     1894        return setError(E_INVALIDARG, tr("Cannot change parameters while capturing is enabled"));
    18901895
    18911896    setModified(IsModified_MachineData);
     
    19131918    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    19141919
    1915     HRESULT rc = checkStateDependency(MutableStateDep);
    1916     if (FAILED(rc)) return rc;
     1920    if (mHWData->mVideoCaptureEnabled)
     1921        return setError(E_INVALIDARG, tr("Cannot change parameters while capturing is enabled"));
    19171922
    19181923    setModified(IsModified_MachineData);
     
    29442949}
    29452950
    2946 STDMETHODIMP
    2947 Machine::COMSETTER(ClipboardMode)(ClipboardMode_T aClipboardMode)
     2951STDMETHODIMP Machine::COMSETTER(ClipboardMode)(ClipboardMode_T aClipboardMode)
    29482952{
    29492953    HRESULT rc = S_OK;
     
    29632967    mHWData->mClipboardMode = aClipboardMode;
    29642968
    2965     /* Save settings if online - todo why is this required?? */
     2969    /** Save settings if online - @todo why is this required? -- @bugref{6818} */
    29662970    if (Global::IsOnline(mData->mMachineState))
    29672971        saveSettings(NULL);
     
    29842988}
    29852989
    2986 STDMETHODIMP
    2987 Machine::COMSETTER(DragAndDropMode)(DragAndDropMode_T aDragAndDropMode)
     2990STDMETHODIMP Machine::COMSETTER(DragAndDropMode)(DragAndDropMode_T aDragAndDropMode)
    29882991{
    29892992    HRESULT rc = S_OK;
     
    30033006    mHWData->mDragAndDropMode = aDragAndDropMode;
    30043007
    3005     /* Save settings if online - todo why is this required?? */
     3008    /** Save settings if online - @todo why is this required? -- @bugref{6818} */
    30063009    if (Global::IsOnline(mData->mMachineState))
    30073010        saveSettings(NULL);
     
    30103013}
    30113014
    3012 STDMETHODIMP
    3013 Machine::COMGETTER(GuestPropertyNotificationPatterns)(BSTR *aPatterns)
     3015STDMETHODIMP Machine::COMGETTER(GuestPropertyNotificationPatterns)(BSTR *aPatterns)
    30143016{
    30153017    CheckComArgOutPointerValid(aPatterns);
     
    30323034}
    30333035
    3034 STDMETHODIMP
    3035 Machine::COMSETTER(GuestPropertyNotificationPatterns)(IN_BSTR aPatterns)
     3036STDMETHODIMP Machine::COMSETTER(GuestPropertyNotificationPatterns)(IN_BSTR aPatterns)
    30363037{
    30373038    AutoCaller autoCaller(this);
     
    30493050}
    30503051
    3051 STDMETHODIMP
    3052 Machine::COMGETTER(StorageControllers)(ComSafeArrayOut(IStorageController *, aStorageControllers))
     3052STDMETHODIMP Machine::COMGETTER(StorageControllers)(ComSafeArrayOut(IStorageController *, aStorageControllers))
    30533053{
    30543054    CheckComArgOutSafeArrayPointerValid(aStorageControllers);
     
    30653065}
    30663066
    3067 STDMETHODIMP
    3068 Machine::COMGETTER(TeleporterEnabled)(BOOL *aEnabled)
     3067STDMETHODIMP Machine::COMGETTER(TeleporterEnabled)(BOOL *aEnabled)
    30693068{
    30703069    CheckComArgOutPointerValid(aEnabled);
     
    68056804    mHWData->mCPUAttached[aCpu] = true;
    68066805
    6807     /* Save settings if online */
     6806    /** Save settings if online - @todo why is this required? -- @bugref{6818} */
    68086807    if (Global::IsOnline(mData->mMachineState))
    68096808        saveSettings(NULL);
     
    68466845    mHWData->mCPUAttached[aCpu] = false;
    68476846
    6848     /* Save settings if online */
     6847    /** Save settings if online - @todo why is this required? -- @bugref{6818} */
    68496848    if (Global::IsOnline(mData->mMachineState))
    68506849        saveSettings(NULL);
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