﻿id	summary	reporter	owner	description	type	status	component	version	resolution	keywords	cc	guest	host
15443	Video recording not working	gim		"Since 5.0 video recording not working anymore in VBoxHeadless mode.

Step to reproduce:
{{{
VBoxManage createvm --name ""test"" --register
VBoxManage modifyvm ""test"" --memory 512 --acpi on --boot1 dvd
VBoxManage modifyvm ""test"" --hostonlyadapter1 vboxnet0
VBoxManage modifyvm ""test"" --nic1 hostonly
VBoxManage modifyvm ""test"" --ostype Debian
VBoxManage createhd --filename test.vdi --size 10000
VBoxManage storagectl ""test"" --name ""IDE Controller"" --add ide
VBoxManage storageattach ""test"" --storagectl ""IDE Controller"" --port 0 --device 0 --type hdd --medium test.vdi
VBoxManage modifyvm ""test"" --videocap on --videocapfile video.webm

VBoxManage startvm ""test"" --type headless
}}}
So video.webm contains only header and footer (after poweroffing) of the VPX format.

After digging a little I found that video not writing because pFramebuffer always is NULL:

{{{
...
                if (   !pFBInfo->pFramebuffer.isNull()          // <-------- HERE
                    && !pFBInfo->fDisabled)
                {
                    rc = VERR_NOT_SUPPORTED;
                    if (   pFBInfo->fVBVAEnabled
                        && pFBInfo->pu8FramebufferVRAM)
                    {
                        rc = VideoRecCopyToIntBuf(pDisplay->mpVideoRecCtx, uScreenId, 0, 0,
                                                  BitmapFormat_BGR,
                                                  pFBInfo->u16BitsPerPixel,
                                                  pFBInfo->u32LineSize, pFBInfo->w, pFBInfo->h,
                                                  pFBInfo->pu8FramebufferVRAM, u64Now);
...
}}}
(VirtualBox-5.0.20\src\VBox\Main\src-client\DisplayImpl.cpp)
So VideoRecCopyToIntBuf will never called and as a result will never trigging write video.


After digging a littel more I found that pFramebuffer doesn't attach anymore in 5.0:
{{{
...
#ifdef VBOX_WITH_VPX
        if (fVideoRec)
        {
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureFile)(Bstr(szMpegFile).raw()));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureWidth)(ulFrameWidth));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureHeight)(ulFrameHeight));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureRate)(ulBitRate));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureEnabled)(TRUE));
        }
#endif /* defined(VBOX_WITH_VPX) */

// ---- PROBABLY HERE ATTACH? ---- 

        /* get the machine debugger (isn't necessarily available) */
        ComPtr <IMachineDebugger> machineDebugger;
        console->COMGETTER(Debugger)(machineDebugger.asOutParam());
        if (machineDebugger)
        {
            Log((""Machine debugger available!\n""));
        }
...
}}}
(VirtualBox-5.0.20\src\VBox\Frontends\VBoxHeadless\VBoxHeadless.cpp)


Versus 4.3.xx:
{{{
#ifdef VBOX_WITH_VPX
        if (fVideoRec)
        {
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureFile)(Bstr(szMpegFile).raw()));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureWidth)(ulFrameWidth));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureHeight)(ulFrameHeight));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureRate)(ulBitRate));
            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureEnabled)(TRUE));
        }
#endif /* defined(VBOX_WITH_VPX) */
        ULONG cMonitors = 1;
        machine->COMGETTER(MonitorCount)(&cMonitors);

        unsigned uScreenId;
        for (uScreenId = 0; uScreenId < cMonitors; uScreenId++)
        {
            VRDPFramebuffer *pVRDPFramebuffer = new VRDPFramebuffer();
            if (!pVRDPFramebuffer)
            {
                RTPrintf(""Error: could not create framebuffer object %d\n"", uScreenId);
                break;
            }
            pVRDPFramebuffer->AddRef();
            display->SetFramebuffer(uScreenId, pVRDPFramebuffer);
        }
        if (uScreenId < cMonitors)
        {
            break;
        }

        // fill in remaining slots with null framebuffers
        for (uScreenId = 0; uScreenId < cMonitors; uScreenId++)
        {
            ComPtr<IFramebuffer> fb;
            LONG xOrigin, yOrigin;
            HRESULT hrc2 = display->GetFramebuffer(uScreenId,
                                                   fb.asOutParam(),
                                                   &xOrigin, &yOrigin);
            if (hrc2 == S_OK && fb.isNull())
            {
                NullFB *pNullFB =  new NullFB();
                pNullFB->AddRef();
                pNullFB->init();
                display->SetFramebuffer(uScreenId, pNullFB);
            }
        }
}}}
(src\VBox\Frontends\VBoxHeadless\VBoxHeadless.cpp)"	defect	closed	other	VirtualBox 5.0.20	fixed	Video, IFrameBuffer, Headless, regression		all	Linux
