void CMultimediaRender::UpLoad() { if (Pixformat == ColorType_RGB24) { D3DRender->SetImage(texture, m_pDes, GS_IMAGEFORMAT_BGR, m_size.x * 3); } else if (Pixformat == ColorType_RGBA32REVERSE) { D3DRender->SetImage(texture, m_pDes, GS_IMAGEFORMAT_BGRA, m_size.x * 4); } else if (Pixformat == ColorType_RGB) { D3DRender->SetImage(texture, m_pDes, GS_IMAGEFORMAT_BGRX, m_size.x * 4); } else if (Pixformat == ColorType_I420 || Pixformat == ColorType_YV12 || Pixformat == ColorType_YUY2 || Pixformat == ColorType_UYVY) { LPBYTE lpData; UINT pitch; if (S_OK == D3DRender->Map(texture, lpData, pitch, D3D11_MAP_WRITE_DISCARD)) { PackPlanar(lpData, m_pDes, m_size.x, m_size.y, pitch, 0, m_size.y, m_size.x, 0); D3DRender->Unmap(texture); } } }
DWORD STDCALL PackPlanarThread(ConvertData *data) { do { WaitForSingleObject(data->hSignalConvert, INFINITE); if(data->bKillThread) break; PackPlanar(data->output, data->input, data->width, data->height, data->pitch, data->startY, data->endY); data->sample->Release(); SetEvent(data->hSignalComplete); } while(!data->bKillThread); return 0; }
void DeviceSource::Preprocess() { if(!bCapturing) return; //---------------------------------------- if(bRequestVolume) { if(audioOut) audioOut->SetVolume(fNewVol); else if(audioFilter) { IBasicAudio *basicAudio; if(SUCCEEDED(audioFilter->QueryInterface(IID_IBasicAudio, (void**)&basicAudio))) { long lVol = long((double(fNewVol)*NEAR_SILENTf)-NEAR_SILENTf); if(lVol <= -NEAR_SILENT) lVol = -10000; basicAudio->put_Volume(lVol); basicAudio->Release(); } } bRequestVolume = false; } //---------------------------------------- SampleData *lastSample = NULL; OSEnterMutex(hSampleMutex); lastSample = latestVideoSample; latestVideoSample = NULL; OSLeaveMutex(hSampleMutex); //---------------------------------------- int numThreads = MAX(OSGetTotalCores()-2, 1); if(lastSample) { /*REFERENCE_TIME refTimeStart, refTimeFinish; lastSample->GetTime(&refTimeStart, &refTimeFinish); static REFERENCE_TIME lastRefTime = 0; Log(TEXT("refTimeStart: %llu, refTimeFinish: %llu, offset = %llu"), refTimeStart, refTimeFinish, refTimeStart-lastRefTime); lastRefTime = refTimeStart;*/ if(colorType == DeviceOutputType_RGB) { if(texture) { texture->SetImage(lastSample->lpData, GS_IMAGEFORMAT_BGRX, renderCX*4); bReadyToDraw = true; } } else if(colorType == DeviceOutputType_I420 || colorType == DeviceOutputType_YV12) { if(bUseThreadedConversion) { if(!bFirstFrame) { List<HANDLE> events; for(int i=0; i<numThreads; i++) events << convertData[i].hSignalComplete; WaitForMultipleObjects(numThreads, events.Array(), TRUE, INFINITE); texture->SetImage(lpImageBuffer, GS_IMAGEFORMAT_RGBX, texturePitch); bReadyToDraw = true; } else bFirstFrame = false; for(int i=0; i<numThreads; i++) lastSample->AddRef(); for(int i=0; i<numThreads; i++) { convertData[i].input = lastSample->lpData; convertData[i].sample = lastSample; convertData[i].pitch = texturePitch; convertData[i].output = lpImageBuffer; SetEvent(convertData[i].hSignalConvert); } } else { LPBYTE lpData; UINT pitch; if(texture->Map(lpData, pitch)) { PackPlanar(lpData, lastSample->lpData, renderCX, renderCY, pitch, 0, renderCY); texture->Unmap(); } bReadyToDraw = true; } } else if(colorType == DeviceOutputType_YVYU || colorType == DeviceOutputType_YUY2) { LPBYTE lpData; UINT pitch; if(texture->Map(lpData, pitch)) { Convert422To444(lpData, lastSample->lpData, pitch, true); texture->Unmap(); } bReadyToDraw = true; } else if(colorType == DeviceOutputType_UYVY || colorType == DeviceOutputType_HDYC) { LPBYTE lpData; UINT pitch; if(texture->Map(lpData, pitch)) { Convert422To444(lpData, lastSample->lpData, pitch, false); texture->Unmap(); } bReadyToDraw = true; } lastSample->Release(); } }