VirtualBox

Ignore:
Timestamp:
Feb 3, 2014 6:46:27 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
92022
Message:

crOpenGL: video recording working

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r50251 r50313  
    4343PVBOXHGCMSVCHELPERS g_pHelpers;
    4444static IConsole* g_pConsole = NULL;
     45static uint32_t g_u32ScreenCount = 0;
    4546static PVM g_pVM = NULL;
    4647
     
    10251026
    10261027                    g_pConsole = pConsole;
     1028                    g_u32ScreenCount = monitorCount;
    10271029
    10281030                    rc = crVBoxServerSetScreenCount(monitorCount);
     
    11831185
    11841186                rc = VINF_SUCCESS;
     1187            }
     1188            break;
     1189        }
     1190        case SHCRGL_HOST_FN_TAKE_SCREENSHOT:
     1191        {
     1192            if (cParms != 1)
     1193            {
     1194                LogRel(("SHCRGL_HOST_FN_TAKE_SCREENSHOT: cParms invalid - %d", cParms));
     1195                rc = VERR_INVALID_PARAMETER;
     1196                break;
     1197            }
     1198
     1199            if (paParms->type != VBOX_HGCM_SVC_PARM_PTR)
     1200            {
     1201                AssertMsgFailed(("invalid param\n"));
     1202                rc = VERR_INVALID_PARAMETER;
     1203                break;
     1204            }
     1205
     1206            if (!paParms->u.pointer.addr)
     1207            {
     1208                AssertMsgFailed(("invalid param\n"));
     1209                rc = VERR_INVALID_PARAMETER;
     1210                break;
     1211            }
     1212
     1213            if (paParms->u.pointer.size != sizeof (CRVBOXHGCMTAKESCREENSHOT))
     1214            {
     1215                AssertMsgFailed(("invalid param\n"));
     1216                rc = VERR_INVALID_PARAMETER;
     1217                break;
     1218            }
     1219
     1220            CRVBOXHGCMTAKESCREENSHOT *pScreenshot = (CRVBOXHGCMTAKESCREENSHOT*)paParms->u.pointer.addr;
     1221            uint64_t u64Now = RTTimeProgramMilliTS();
     1222
     1223            if (pScreenshot->u32Screen == CRSCREEN_ALL)
     1224            {
     1225                for (uint32_t i = 0; i < g_u32ScreenCount; ++i)
     1226                {
     1227                    CR_SCREENSHOT Screenshot;
     1228
     1229                    int rc = crServerVBoxScreenshotGet(i, &Screenshot);
     1230                    if (RT_SUCCESS(rc))
     1231                    {
     1232                        pScreenshot->pfnScreenshot(pScreenshot->pvContext, i,
     1233                                0, 0, 32,
     1234                                Screenshot.Img.pitch, Screenshot.Img.width, Screenshot.Img.height,
     1235                                (uint8_t*)Screenshot.Img.pvData, u64Now);
     1236                        crServerVBoxScreenshotRelease(&Screenshot);
     1237                    }
     1238                    else
     1239                    {
     1240                        Assert(rc == VERR_INVALID_STATE);
     1241                    }
     1242                }
     1243            }
     1244            else if (pScreenshot->u32Screen < g_u32ScreenCount)
     1245            {
     1246                CR_SCREENSHOT Screenshot;
     1247
     1248                int rc = crServerVBoxScreenshotGet(pScreenshot->u32Screen, &Screenshot);
     1249                if (RT_SUCCESS(rc))
     1250                {
     1251                    pScreenshot->pfnScreenshot(pScreenshot->pvContext, pScreenshot->u32Screen,
     1252                            0, 0, 32,
     1253                            Screenshot.Img.pitch, Screenshot.Img.width, Screenshot.Img.height,
     1254                            (uint8_t*)Screenshot.Img.pvData, u64Now);
     1255                    crServerVBoxScreenshotRelease(&Screenshot);
     1256                }
     1257                else
     1258                {
     1259                    Assert(rc == VERR_INVALID_STATE);
     1260                }
     1261            }
     1262            else
     1263            {
     1264                AssertMsgFailed(("invalid screen id\n"));
     1265                rc = VERR_INVALID_PARAMETER;
     1266                break;
    11851267            }
    11861268            break;
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