VirtualBox

Changeset 42838 in vbox for trunk/src


Ignore:
Timestamp:
Aug 16, 2012 9:21:09 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
80095
Message:

Main/EncodeAndVideoRecording Module and API implementation: Integrating an independent encoding and video recording module that will serve all the frontends.
Introducing settings settings and API implementation for accessing and modifying video recording parameters:
->target video capture file
->video capture width
->video capture height
->enable video capturing

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/Makefile.kmk

    r41477 r42838  
    7676        $(if $(VBOX_WITH_VIRTIO),VBOX_WITH_VIRTIO) \
    7777        $(if $(VBOX_WITH_USB_CARDREADER),VBOX_WITH_USB_CARDREADER) \
    78         $(if $(VBOX_WITH_PCI_PASSTHROUGH),VBOX_WITH_PCI_PASSTHROUGH)
     78        $(if $(VBOX_WITH_PCI_PASSTHROUGH),VBOX_WITH_PCI_PASSTHROUGH) \
     79        $(if $(VBOX_WITH_VPX),VBOX_WITH_VPX)
    7980
    8081ifneq ($(KBUILD_TARGET),win)
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r42551 r42838  
    3838#include <iprt/getopt.h>
    3939#include <VBox/log.h>
    40 
     40#include <iprt/log.h>
    4141#include "VBoxManage.h"
    4242
    4343#ifndef VBOX_ONLY_DOCS
    4444using namespace com;
    45 
    46 
     45#define LOG_GROUP LOG_GROUP_MAIN
    4746/** @todo refine this after HDD changes; MSC 8.0/64 has trouble with handleModifyVM.  */
    4847#if defined(_MSC_VER)
     
    192191    MODIFYVM_USBCARDREADER,
    193192#endif
    194     MODIFYVM_CHIPSET
     193    MODIFYVM_CHIPSET,
     194#ifdef VBOX_WITH_VPX
     195    MODIFYVM_VCP,
     196    MODIFYVM_VCP_FILENAME,
     197    MODIFYVM_VCP_WIDTH,
     198    MODIFYVM_VCP_HEIGHT
     199#endif
    195200};
    196201
     
    329334    { "--faulttolerancesyncinterval", MODIFYVM_FAULT_TOLERANCE_SYNC_INTERVAL, RTGETOPT_REQ_UINT32 },
    330335    { "--chipset",                  MODIFYVM_CHIPSET,                   RTGETOPT_REQ_STRING },
     336#ifdef VBOX_WITH_VPX
     337    { "--videocapture",             MODIFYVM_VCP    ,                   RTGETOPT_REQ_BOOL_ONOFF },
     338    { "--vcpfilename",              MODIFYVM_VCP_FILENAME,              RTGETOPT_REQ_STRING },
     339    { "--vcpwidth",                 MODIFYVM_VCP_WIDTH,                 RTGETOPT_REQ_UINT32 },
     340    { "--vcpheight",                MODIFYVM_VCP_HEIGHT,                RTGETOPT_REQ_UINT32 },
     341#endif
    331342    { "--autostart-enabled",        MODIFYVM_AUTOSTART_ENABLED,         RTGETOPT_REQ_BOOL_ONOFF },
    332343    { "--autostart-delay",          MODIFYVM_AUTOSTART_DELAY,           RTGETOPT_REQ_UINT32 },
     
    467478            case MODIFYVM_VRAM:
    468479            {
     480                LogFlow(("Modify VRANM\n"));
    469481                CHECK_ERROR(machine, COMSETTER(VRAMSize)(ValueUnion.u32));
    470482                break;
     
    23952407                break;
    23962408            }
     2409#ifdef VBOX_WITH_VPX
     2410            case MODIFYVM_VCP:
     2411            {
     2412                CHECK_ERROR(machine, COMSETTER(VideoCaptureEnabled)(ValueUnion.f));
     2413                break;
     2414            }
     2415            case MODIFYVM_VCP_FILENAME:
     2416            {
     2417                //CHECK_ERROR(machine, COMSETTER(VideoRecFilename)(ValueUnion.psz));
     2418                break;
     2419            }
     2420            case MODIFYVM_VCP_WIDTH:
     2421            {
     2422                CHECK_ERROR(machine, COMSETTER(VideoCaptureWidth)(ValueUnion.u32));
     2423                break;
     2424            }
     2425            case MODIFYVM_VCP_HEIGHT:
     2426            {
     2427                CHECK_ERROR(machine, COMSETTER(VideoCaptureHeight)(ValueUnion.u32));
     2428                break;
     2429            }
     2430#endif
    23972431            case MODIFYVM_AUTOSTART_ENABLED:
    23982432            {
  • trunk/src/VBox/Main/Makefile.kmk

    r42810 r42838  
    6767        $(if $(VBOX_WITH_USB_CARDREADER),VBOX_WITH_USB_CARDREADER,) \
    6868        $(if $(VBOX_WITH_USB_CARDREADER_TEST),VBOX_WITH_USB_CARDREADER_TEST,) \
    69         $(if $(VBOX_WITH_HOSTNETIF_API),VBOX_WITH_HOSTNETIF_API,)
     69        $(if $(VBOX_WITH_HOSTNETIF_API),VBOX_WITH_HOSTNETIF_API,) \
    7070
    7171# Unconditionally enable the new semaphore key generation code
     
    518518DLLS += VBoxC
    519519VBoxC_TEMPLATE = VBOXMAINCOMP
    520 VBoxC_SDKS =  VBOX_LIBPNG VBOX_ZLIB
    521520VBoxC_DEFS = \
    522521        IN_RING3 \
     
    542541        $(if-expr defined(VBOX_WITH_EHCI) && defined(VBOX_WITH_USB),VBOX_WITH_EHCI,) \
    543542        $(if $(VBOX_WITH_EXTPACK),VBOX_WITH_EXTPACK,) \
    544         $(if $(VBOX_WITH_PCI_PASSTHROUGH),VBOX_WITH_PCI_PASSTHROUGH,)
     543        $(if $(VBOX_WITH_PCI_PASSTHROUGH),VBOX_WITH_PCI_PASSTHROUGH,) \
     544        $(if $(VBOX_WITH_VPX),VBOX_WITH_VPX,)
    545545
    546546VBoxC_DEFS.darwin.x86 = VBOX_WITH_2X_4GB_ADDR_SPACE
    547547VBoxC_DEFS.win.x86 += _WIN32_WINNT=0x0500
    548548VBoxC_DEFS.win.amd64 += _WIN32_WINNT=0x0510
     549
     550ifdef VBOX_WITH_VPX
     551  VBoxC_SDKS =  VBOX_LIBPNG VBOX_ZLIB VBOX_VPX
     552else
     553  VBoxC_SDKS =  VBOX_LIBPNG VBOX_ZLIB
     554endif
    549555
    550556VBoxC_INCS          = \
     
    671677endif
    672678
     679ifdef VBOX_WITH_VPX
     680VBoxC_SOURCES += \
     681        src-client/EbmlWriter.cpp \
     682        src-client/VideoRec.cpp
     683endif
     684
    673685ifdef VBOX_WITH_NETSHAPER
    674686VBoxC_DEFS += VBOX_WITH_NETSHAPER
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r42819 r42838  
    40384038    </attribute>
    40394039
     4040    <attribute name="VideoCaptureEnabled" type="boolean" default="false">
     4041      <desc>
     4042        This setting determines whether VirtualBox uses video recording to
     4043        record VM session.</desc>
     4044    </attribute>
     4045
     4046    <attribute name="VideoCaptureFile" type="wstring" default="Test.webm">
     4047      <desc>
     4048        This setting determines what filename VirtualBox uses to save
     4049        the recorded content.</desc>
     4050    </attribute>
     4051
     4052    <attribute name="VideoCaptureWidth" type="unsigned long" default="640">
     4053      <desc>
     4054        This setting determines what should be the horizontal resolution of
     4055        recorded video.</desc>
     4056    </attribute>
     4057
     4058    <attribute name="VideoCaptureHeight" type="unsigned long" default="480">
     4059      <desc>
     4060        This setting determines what should be the vertical resolution
     4061        of recorded video.</desc>
     4062    </attribute>
     4063
    40404064    <attribute name="BIOSSettings" type="IBIOSSettings" readonly="yes">
    40414065      <desc>Object containing all BIOS settings.</desc>
  • trunk/src/VBox/Main/include/MachineImpl.h

    r42569 r42838  
    258258        BOOL                 mPageFusionEnabled;
    259259        ULONG                mVRAMSize;
     260        ULONG                mVideoCaptureWidth;
     261        ULONG                mVideoCaptureHeight;
     262        Bstr                 mVideoCaptureFile;
     263        BOOL                 mVideoCaptureEnabled;
    260264        ULONG                mMonitorCount;
    261265        BOOL                 mHWVirtExEnabled;
     
    414418    STDMETHOD(COMGETTER(VRAMSize))(ULONG *memorySize);
    415419    STDMETHOD(COMSETTER(VRAMSize))(ULONG memorySize);
     420    STDMETHOD(COMGETTER(VideoCaptureEnabled))(BOOL *u8VideoRecEnabled);
     421    STDMETHOD(COMSETTER(VideoCaptureEnabled))(BOOL  u8VideoRecEnabled);
     422    STDMETHOD(COMGETTER(VideoCaptureFile))(BSTR * ppChVideoRecFilename);
     423    STDMETHOD(COMSETTER(VideoCaptureFile))(IN_BSTR pChVideoRecFilename);
     424    STDMETHOD(COMGETTER(VideoCaptureWidth))(ULONG *u32VideoRecHorzRes);
     425    STDMETHOD(COMSETTER(VideoCaptureWidth))(ULONG u32VideoRecHorzRes);
     426    STDMETHOD(COMGETTER(VideoCaptureHeight))(uint32_t *u32VideoRecVertRes);
     427    STDMETHOD(COMSETTER(VideoCaptureHeight))(uint32_t u32VideoRecVertRes);
    416428    STDMETHOD(COMGETTER(MonitorCount))(ULONG *monitorCount);
    417429    STDMETHOD(COMSETTER(MonitorCount))(ULONG monitorCount);
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r42646 r42838  
    4848#include <VBox/com/array.h>
    4949
    50 #ifdef VBOX_WITH_VPX_MAIN
    51 # include "EncodeAndWrite.h"
     50#ifdef VBOX_WITH_VPX
     51# include "VideoRec.h"
    5252  PVIDEORECCONTEXT pVideoRecContext;
    5353#endif
    54 
     54#define DEBUG_sunlover
    5555/**
    5656 * Display driver instance data.
     
    447447    ULONG ul;
    448448    mParent->machine()->COMGETTER(MonitorCount)(&ul);
     449#ifdef VBOX_WITH_VPX
     450    ULONG ulVideoCaptureHorzRes;
     451    ULONG ulVideoCaptureVertRes;
     452    char *pchVideoCaptureFile;
     453    BSTR strVideoCaptureFile;
     454    bool Enabled;
     455    LogFlow(("Init And Create\n"));
     456    int res = VideoRecContextCreate(&pVideoRecContext);
     457    res = RTCritSectInit(&pVideoRecContext->CritSect);
     458    AssertReturn(res == VINF_SUCCESS, E_UNEXPECTED);
     459    mParent->machine()->COMGETTER(VideoCaptureWidth)(&ulVideoCaptureHorzRes);
     460    mParent->machine()->COMGETTER(VideoCaptureHeight)(&ulVideoCaptureVertRes);
     461    mParent->machine()->COMGETTER(VideoCaptureFile)(&strVideoCaptureFile);
     462    if(res == VINF_SUCCESS)
     463        res = VideoRecContextInit(pVideoRecContext,strVideoCaptureFile, ulVideoCaptureHorzRes, ulVideoCaptureVertRes);
     464#endif
    449465    mcMonitors = ul;
    450466
     
    31743190    unsigned uScreenId;
    31753191
     3192    LogFlow(("DisplayRefreshCallback \n"));
    31763193    for (uScreenId = 0; uScreenId < pDisplay->mcMonitors; uScreenId++)
    31773194    {
     
    32113228    {
    32123229        int rc = pDisplay->videoAccelRefreshProcess();
    3213 
    32143230        if (rc != VINF_TRY_AGAIN) /* Means 'do nothing' here. */
    32153231        {
     
    32453261        }
    32463262    }
    3247 #ifdef VBOX_WITH_VPX_MAIN
    3248     ULONG u32PixelFormat;
    3249     uint8_t *u8TmpBuf;
     3263#ifdef VBOX_WITH_VPX
    32503264    uint32_t u32VideoRecImgFormat = VPX_IMG_FMT_NONE;
    32513265    DISPLAYFBINFO *pFBInfo = &pDisplay->maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN];
    32523266    int rc;
    3253 
    32543267
    32553268    if (!pFBInfo->pFramebuffer.isNull() && !(pFBInfo->fDisabled)
     
    32803293        rc = pFBInfo->pFramebuffer->COMGETTER(BytesPerLine) (&ulBytesPerLine);
    32813294        AssertComRC (rc);
    3282 
    3283 
    3284         switch (ulBitsPerPixel)
    3285         {
    3286             case 32:
    3287             case 24:
    3288             case 16:
    3289                 u32PixelFormat = FramebufferPixelFormat_FOURCC_RGB;
    3290             break;
    3291             default:
    3292                 u32PixelFormat = FramebufferPixelFormat_Opaque;
    3293             break;
    3294         }
    32953295
    32963296        if(ulPixelFormat == FramebufferPixelFormat_FOURCC_RGB)
     
    33193319        {
    33203320            VideoRecCopyToIntBuffer(pVideoRecContext, pFBInfo->xOrigin, pFBInfo->yOrigin,
    3321                               u32PixelFormat, ulBitsPerPixel, ulBytesPerLine,
     3321                              ulPixelFormat, ulBitsPerPixel, ulBytesPerLine,
    33223322                              ulGuestWidth, ulGuestHeight, address);
    33233323
    3324 
    3325             LogFlow(("RGB:YUV\n"));
    33263324            VideoRecDoRGBToYUV(pVideoRecContext, u32VideoRecImgFormat);
    3327             LogFlow(("Encode\n"));
    33283325            VideoRecEncodeAndWrite(pVideoRecContext, ulGuestWidth, ulGuestHeight);
    33293326        }
     
    43104307    pData->IConnector.pfnVBVAMousePointerShape = Display::displayVBVAMousePointerShape;
    43114308#endif
    4312 #ifdef VBOX_WITH_VPX_MAIN
    4313     LogFlow(("Init And Create\n"));
    4314     int res = VideoRecContextCreate(&pVideoRecContext);
    4315     res = RTCritSectInit(&pVideoRecContext->CritSect);
    4316     AssertReturn(res == VINF_SUCCESS, E_UNEXPECTED);
    4317 
    4318     if(res == VINF_SUCCESS)
    4319         res = VideoRecContextInit(pVideoRecContext, "test.webm", 640, 480);
    4320 
    4321 #endif
    4322 
    43234309
    43244310    /*
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r42831 r42838  
    166166    mAccelerate2DVideoEnabled = false;
    167167    mMonitorCount = 1;
     168    mVideoCaptureFile = "Test.webm";
     169    mVideoCaptureWidth = 640;
     170    mVideoCaptureHeight = 480;
     171    mVideoCaptureEnabled = true;
     172
    168173    mHWVirtExEnabled = true;
    169174    mHWVirtExNestedPagingEnabled = true;
     
    16561661
    16571662    return rc;
     1663}
     1664
     1665STDMETHODIMP Machine::COMGETTER(VideoCaptureEnabled)(BOOL * fEnabled)
     1666{
     1667    AutoCaller autoCaller(this);
     1668    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1669
     1670    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1671
     1672    *fEnabled = mHWData->mVideoCaptureEnabled;
     1673    return S_OK;
     1674}
     1675
     1676STDMETHODIMP Machine::COMSETTER(VideoCaptureEnabled)(BOOL  fEnabled)
     1677{
     1678    AutoCaller autoCaller(this);
     1679    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1680
     1681    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1682    mHWData->mVideoCaptureEnabled = fEnabled;
     1683    return S_OK;
     1684}
     1685
     1686STDMETHODIMP Machine::COMGETTER(VideoCaptureFile)(BSTR * ppChFile)
     1687{
     1688    AutoCaller autoCaller(this);
     1689    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1690
     1691    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1692    mHWData->mVideoCaptureFile.cloneTo(ppChFile);
     1693    return S_OK;
     1694}
     1695
     1696STDMETHODIMP Machine::COMSETTER(VideoCaptureFile)(IN_BSTR pChFile)
     1697{
     1698    AutoCaller autoCaller(this);
     1699    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1700
     1701    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1702    mHWData->mVideoCaptureFile = pChFile;
     1703    return S_OK;
     1704}
     1705
     1706
     1707STDMETHODIMP Machine::COMGETTER(VideoCaptureWidth)(uint32_t *u32HorzRes)
     1708{
     1709    AutoCaller autoCaller(this);
     1710    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1711
     1712    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1713    *u32HorzRes = mHWData->mVideoCaptureWidth;
     1714    return S_OK;
     1715}
     1716
     1717STDMETHODIMP Machine::COMSETTER(VideoCaptureWidth)(uint32_t u32HorzRes)
     1718{
     1719    AutoCaller autoCaller(this);
     1720    if (FAILED(autoCaller.rc()))
     1721    {
     1722        LogFlow(("Autolocked failed\n"));
     1723        return autoCaller.rc();
     1724    }
     1725
     1726    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1727    mHWData->mVideoCaptureWidth = u32HorzRes;
     1728    return S_OK;
     1729}
     1730
     1731STDMETHODIMP Machine::COMGETTER(VideoCaptureHeight)(uint32_t *u32VertRes)
     1732{
     1733    AutoCaller autoCaller(this);
     1734    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1735
     1736    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1737     *u32VertRes = mHWData->mVideoCaptureHeight;
     1738    return S_OK;
     1739}
     1740
     1741STDMETHODIMP Machine::COMSETTER(VideoCaptureHeight)(uint32_t u32VertRes)
     1742{
     1743    AutoCaller autoCaller(this);
     1744    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     1745
     1746    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1747    mHWData->mVideoCaptureHeight = u32VertRes;
     1748    return S_OK;
    16581749}
    16591750
     
    84228513        mHWData->mAccelerate3DEnabled = data.fAccelerate3D;
    84238514        mHWData->mAccelerate2DVideoEnabled = data.fAccelerate2DVideo;
     8515        mHWData->mVideoCaptureWidth = data.ulVideoCaptureHorzRes;
     8516        mHWData->mVideoCaptureHeight = data.ulVideoCaptureVertRes;
     8517        mHWData->mVideoCaptureEnabled = data.fVideoCaptureEnabled;
     8518        mHWData->mVideoCaptureFile = data.strVideoCaptureFile;
    84248519        mHWData->mFirmwareType = data.firmwareType;
    84258520        mHWData->mPointingHIDType = data.pointingHIDType;
     
    96229717        data.fAccelerate3D = !!mHWData->mAccelerate3DEnabled;
    96239718        data.fAccelerate2DVideo = !!mHWData->mAccelerate2DVideoEnabled;
     9719        data.ulVideoCaptureHorzRes = mHWData->mVideoCaptureWidth;
     9720        data.ulVideoCaptureVertRes = mHWData->mVideoCaptureHeight;
     9721        data.fVideoCaptureEnabled  = !! mHWData->mVideoCaptureEnabled;
     9722        data.strVideoCaptureFile = mHWData->mVideoCaptureFile;
    96249723
    96259724        /* VRDEServer settings (optional) */
  • trunk/src/VBox/Main/xml/Settings.cpp

    r42551 r42838  
    15891589#endif
    15901590
    1591 /**
    1592  * Hardware struct constructor.
    1593  */
    15941591Hardware::Hardware()
    15951592        : strVersion("1"),
     
    16101607          fAccelerate3D(false),
    16111608          fAccelerate2DVideo(false),
     1609          ulVideoCaptureHorzRes(640),
     1610          ulVideoCaptureVertRes(480),
     1611          fVideoCaptureEnabled(false),
     1612          strVideoCaptureFile("Test.webm"),
    16121613          firmwareType(FirmwareType_BIOS),
    16131614          pointingHIDType(PointingHIDType_PS2Mouse),
     
    16741675                  && (fAccelerate3D             == h.fAccelerate3D)
    16751676                  && (fAccelerate2DVideo        == h.fAccelerate2DVideo)
     1677                  && (fVideoCaptureEnabled      == h.fVideoCaptureEnabled)
     1678                  && (strVideoCaptureFile       == h.strVideoCaptureFile)
     1679                  && (ulVideoCaptureHorzRes     == h.ulVideoCaptureHorzRes)
     1680                  && (ulVideoCaptureVertRes     == h.ulVideoCaptureVertRes)
    16761681                  && (firmwareType              == h.firmwareType)
    16771682                  && (pointingHIDType           == h.pointingHIDType)
     
    25562561            pelmHwChild->getAttributeValue("accelerate2DVideo", hw.fAccelerate2DVideo);
    25572562        }
     2563        else if (pelmHwChild->nameEquals("VideoRecording"))
     2564        {
     2565            pelmHwChild->getAttributeValue("enabled", hw.fVideoCaptureEnabled);
     2566            pelmHwChild->getAttributeValue("file",    hw.strVideoCaptureFile);
     2567            pelmHwChild->getAttributeValue("horzRes", hw.ulVideoCaptureHorzRes);
     2568            pelmHwChild->getAttributeValue("vertRes", hw.ulVideoCaptureVertRes);
     2569        }
     2570
    25582571        else if (pelmHwChild->nameEquals("RemoteDisplay"))
    25592572        {
     
    37023715    if (m->sv >= SettingsVersion_v1_8)
    37033716        pelmDisplay->setAttribute("accelerate2DVideo", hw.fAccelerate2DVideo);
     3717    xml::ElementNode *pelmVideoCapture = pelmHardware->createChild("VideoRecording");
     3718
     3719    if (m->sv >= SettingsVersion_v1_12)
     3720    {
     3721        pelmVideoCapture->setAttribute("enabled", hw.fVideoCaptureEnabled);
     3722        pelmVideoCapture->setAttribute("file",    hw.strVideoCaptureFile);
     3723        pelmVideoCapture->setAttribute("horzRes", hw.ulVideoCaptureHorzRes);
     3724        pelmVideoCapture->setAttribute("vertRes", hw.ulVideoCaptureVertRes);
     3725    }
    37043726
    37053727    xml::ElementNode *pelmVRDE = pelmHardware->createChild("RemoteDisplay");
  • trunk/src/VBox/Main/xml/VirtualBox-settings-common.xsd

    r42261 r42838  
    460460
    461461<xsd:complexType name="TDisplay">
     462  <xsd:element name="VideoRecording">
     463    <xsd:complexType>
     464      <xsd:attribute name="enabled" type="xsd:boolean"/>
     465      <xsd:attribute name="file" type="xsd:string"/>
     466      <xsd:attribute name="horzRes" use="required">
     467        <xsd:simpleType>
     468          <xsd:restriction base="xsd:unsignedInt">
     469            <xsd:minInclusive value="4"/>
     470            <xsd:maxInclusive value="2097152"/>
     471           </xsd:restriction>
     472         </xsd:simpleType>
     473      </xsd:attribute>
     474      <xsd:attribute name="vertRes" type="xsd:unsignedInt"/>
     475    </xsd:complexType>
     476  </xsd:element>
    462477  <xsd:attribute name="VRAMSize" use="required">
    463478    <xsd:simpleType>
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