/** * Handles the inject sub-command. * * @returns Suitable exit code. * @param pArgs The handler arguments. * @param pDebugger Pointer to the debugger interface. */ static RTEXITCODE handleDebugVM_DumpVMCore(HandlerArg *pArgs, IMachineDebugger *pDebugger) { /* * Parse arguments. */ const char *pszFilename = NULL; const char *pszCompression = NULL; RTGETOPTSTATE GetState; RTGETOPTUNION ValueUnion; static const RTGETOPTDEF s_aOptions[] = { { "--filename", 'f', RTGETOPT_REQ_STRING }, { "--compression", 'c', RTGETOPT_REQ_STRING } }; int rc = RTGetOptInit(&GetState, pArgs->argc, pArgs->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, 0 /*fFlags*/); AssertRCReturn(rc, RTEXITCODE_FAILURE); while ((rc = RTGetOpt(&GetState, &ValueUnion)) != 0) { switch (rc) { case 'c': if (pszCompression) return errorSyntax("The --compression option has already been given"); pszCompression = ValueUnion.psz; break; case 'f': if (pszFilename) return errorSyntax("The --filename option has already been given"); pszFilename = ValueUnion.psz; break; default: return errorGetOpt(rc, &ValueUnion); } } if (!pszFilename) return errorSyntax("The --filename option is required"); /* * Make the filename absolute before handing it on to the API. */ char szAbsFilename[RTPATH_MAX]; rc = RTPathAbs(pszFilename, szAbsFilename, sizeof(szAbsFilename)); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTPathAbs failed on '%s': %Rrc", pszFilename, rc); com::Bstr bstrFilename(szAbsFilename); com::Bstr bstrCompression(pszCompression); CHECK_ERROR2I_RET(pDebugger, DumpGuestCore(bstrFilename.raw(), bstrCompression.raw()), RTEXITCODE_FAILURE); return RTEXITCODE_SUCCESS; }
UINT CFrameGrabThread::GrabFrames(){ #define TIMEBETWEENFRAMES 50.0 // could be a param later, if needed for (int i = 0; i!= nFramesToGrab; i++) imgResults[i] = NULL; try{ HRESULT hr; CComPtr<IMediaDet> pDet; hr = pDet.CoCreateInstance(__uuidof(MediaDet)); if (!SUCCEEDED(hr)) return 0; // Convert the file name to a BSTR. CComBSTR bstrFilename(strFileName); hr = pDet->put_Filename(bstrFilename); long lStreams; bool bFound = false; hr = pDet->get_OutputStreams(&lStreams); for (long i = 0; i < lStreams; i++) { GUID major_type; hr = pDet->put_CurrentStream(i); hr = pDet->get_StreamType(&major_type); if (major_type == MEDIATYPE_Video) { bFound = true; break; } } if (!bFound) return 0; double dLength = 0; pDet->get_StreamLength(&dLength); if (dStartTime > dLength) dStartTime = 0; long width = 0, height = 0; AM_MEDIA_TYPE mt; hr = pDet->get_StreamMediaType(&mt); if (mt.formattype == FORMAT_VideoInfo) { VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat); width = pVih->bmiHeader.biWidth; height = pVih->bmiHeader.biHeight; // We want the absolute height, don't care about orientation. if (height < 0) height *= -1; } else { return 0; // Should not happen, in theory. } /*FreeMediaType(mt); = */ if (mt.cbFormat != 0){ CoTaskMemFree((PVOID)mt.pbFormat); mt.cbFormat = 0; mt.pbFormat = NULL; } if (mt.pUnk != NULL){ mt.pUnk->Release(); mt.pUnk = NULL; } /**/ long size; uint32 nFramesGrabbed; for (nFramesGrabbed = 0; nFramesGrabbed != nFramesToGrab; nFramesGrabbed++){ hr = pDet->GetBitmapBits(dStartTime + (nFramesGrabbed*TIMEBETWEENFRAMES), &size, NULL, width, height); if (SUCCEEDED(hr)) { // we could also directly create a Bitmap in memory, however this caused problems/failed with *some* movie files // when I tried it for the MMPreview, while this method works always - so I'll continue to use this one long nFullBufferLen = sizeof( BITMAPFILEHEADER ) + size; char* buffer = new char[nFullBufferLen]; BITMAPFILEHEADER bfh; memset( &bfh, 0, sizeof( bfh ) ); bfh.bfType = 'MB'; bfh.bfSize = nFullBufferLen; bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER ); memcpy(buffer,&bfh,sizeof( bfh ) ); try { hr = pDet->GetBitmapBits(dStartTime+ (nFramesGrabbed*TIMEBETWEENFRAMES), NULL, buffer + sizeof( bfh ), width, height); } catch (...) { ASSERT(0); hr = E_FAIL; } if (SUCCEEDED(hr)) { // decode CxImage* imgResult = new CxImage(); imgResult->Decode((BYTE*)buffer, nFullBufferLen, CXIMAGE_FORMAT_BMP); delete[] buffer; if (!imgResult->IsValid()){ delete imgResult; break; } // resize if needed if (nMaxWidth > 0 && nMaxWidth < width){ float scale = (float)nMaxWidth / imgResult->GetWidth(); int nMaxHeigth = (int)(imgResult->GetHeight() * scale); imgResult->Resample(nMaxWidth, nMaxHeigth, 0); } // decrease bpp if needed if (bReduceColor){ RGBQUAD* ppal=(RGBQUAD*)malloc(256*sizeof(RGBQUAD)); if (ppal) { CQuantizer q(256,8); q.ProcessImage(imgResult->GetDIB()); q.SetColorTable(ppal); imgResult->DecreaseBpp(8, true, ppal); free(ppal); } } //CString TestName; //TestName.Format("G:\\testframe%i.png",nFramesGrabbed); //imgResult->Save(TestName,CXIMAGE_FORMAT_PNG); // done imgResults[nFramesGrabbed] = imgResult; } else{ delete[] buffer; break; } } } return nFramesGrabbed; } catch(...){ ASSERT(0); return 0; } }