static int v4w_open_videodevice(V4wState *s) { // Initialize COM CoInitialize(NULL); // get a Graph HRESULT hr= CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, //IID_IBaseFilter, (void **)&s->m_pGraph); if(FAILED(hr)) { return -1; } // get a CaptureGraphBuilder2 hr= CoCreateInstance (CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, //IID_IBaseFilter, (void **)&s->m_pBuilder); if(FAILED(hr)) { return -2; } // connect capture graph builder with the graph s->m_pBuilder->SetFiltergraph(s->m_pGraph); // get mediacontrol so we can start and stop the filter graph hr=s->m_pGraph->QueryInterface (IID_IMediaControl, (void **)&s->m_pControl); if(FAILED(hr)) { return -3; } ICreateDevEnum *pCreateDevEnum = NULL; IEnumMoniker *pEnumMoniker = NULL; IMoniker *pMoniker = NULL; ULONG nFetched = 0; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum); if(FAILED(hr)) { return -4; } hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0); if (FAILED(hr) || pEnumMoniker == NULL) { //printf("no device\n"); return -5; } pEnumMoniker->Reset(); int pos=0; while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) { IPropertyBag *pBag; hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag ); if( hr != S_OK ) continue; if (s->dev[0]=='\0') break; VARIANT var; VariantInit(&var); hr = pBag->Read( L"FriendlyName", &var, NULL ); if( hr != S_OK ) { pMoniker->Release(); continue; } //USES_CONVERSION; char szName[256]; WideCharToMultiByte(CP_UTF8,0,var.bstrVal,-1,szName,256,0,0); VariantClear(&var); if (strcmp(szName, s->dev)==0) break; pMoniker->Release(); pBag->Release(); pMoniker=NULL; pBag=NULL; } if(pMoniker==NULL) { return -6; } hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&s->m_pDeviceFilter ); if(FAILED(hr)) { return -7; } s->m_pGraph->AddFilter(s->m_pDeviceFilter, L"Device Filter"); pMoniker->Release(); pEnumMoniker->Release(); pCreateDevEnum->Release(); GUID pPinCategory; if (try_format(s->m_pDeviceFilter, s->pix_fmt, &pPinCategory)==0) s->pix_fmt = s->pix_fmt; else if (try_format(s->m_pDeviceFilter,MS_YUV420P, &pPinCategory)==0) s->pix_fmt = MS_YUV420P; else if (try_format(s->m_pDeviceFilter,MS_YUY2, &pPinCategory)==0) s->pix_fmt = MS_YUY2; else if (try_format(s->m_pDeviceFilter,MS_YUYV, &pPinCategory)==0) s->pix_fmt = MS_YUYV; else if (try_format(s->m_pDeviceFilter,MS_UYVY, &pPinCategory)==0) s->pix_fmt = MS_UYVY; else if (try_format(s->m_pDeviceFilter,MS_RGB24, &pPinCategory)==0) s->pix_fmt = MS_RGB24; else { ms_error("Unsupported video pixel format."); return -8; } if (s->pix_fmt == MS_YUV420P) ms_message("Driver supports YUV420P, using that format."); else if (s->pix_fmt == MS_YUY2) ms_message("Driver supports YUY2 (YUYV), using that format."); else if (s->pix_fmt == MS_YUYV) ms_message("Driver supports YUV422, using that format."); else if (s->pix_fmt == MS_UYVY) ms_message("Driver supports UYVY, using that format."); else if (s->pix_fmt == MS_RGB24) ms_message("Driver supports RGB24, using that format."); if (try_format_size(s, s->pix_fmt, s->vsize.width, s->vsize.height, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", s->vsize.width, s->vsize.height); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_QCIF_W, MS_VIDEO_SIZE_QCIF_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_QCIF_W, MS_VIDEO_SIZE_QCIF_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_CIF_W, MS_VIDEO_SIZE_CIF_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_CIF_W, MS_VIDEO_SIZE_CIF_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_4CIF_W, MS_VIDEO_SIZE_4CIF_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_4CIF_W, MS_VIDEO_SIZE_4CIF_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_QVGA_W, MS_VIDEO_SIZE_QVGA_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_QVGA_W, MS_VIDEO_SIZE_QVGA_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_QQVGA_W, MS_VIDEO_SIZE_QQVGA_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_QQVGA_W, MS_VIDEO_SIZE_QQVGA_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_NS1_W, MS_VIDEO_SIZE_NS1_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_NS1_W, MS_VIDEO_SIZE_NS1_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_QSIF_W, MS_VIDEO_SIZE_QSIF_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_QSIF_W, MS_VIDEO_SIZE_QSIF_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_SIF_W, MS_VIDEO_SIZE_SIF_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_SIF_W, MS_VIDEO_SIZE_SIF_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_SDTV_W, MS_VIDEO_SIZE_SDTV_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_SDTV_W, MS_VIDEO_SIZE_SDTV_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_288P_W, MS_VIDEO_SIZE_288P_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_288P_W, MS_VIDEO_SIZE_288P_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_448P_W, MS_VIDEO_SIZE_448P_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_448P_W, MS_VIDEO_SIZE_448P_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_576P_W, MS_VIDEO_SIZE_576P_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_576P_W, MS_VIDEO_SIZE_576P_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_720P_W, MS_VIDEO_SIZE_720P_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_720P_W, MS_VIDEO_SIZE_720P_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_1080P_W, MS_VIDEO_SIZE_1080P_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_1080P_W, MS_VIDEO_SIZE_1080P_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_4SIF_W, MS_VIDEO_SIZE_4SIF_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_4SIF_W, MS_VIDEO_SIZE_4SIF_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_SVGA_W, MS_VIDEO_SIZE_SVGA_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_SVGA_W, MS_VIDEO_SIZE_SVGA_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_XGA_W, MS_VIDEO_SIZE_XGA_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_XGA_W, MS_VIDEO_SIZE_XGA_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_WXGA_W, MS_VIDEO_SIZE_WXGA_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_WXGA_W, MS_VIDEO_SIZE_WXGA_H); else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_HDTVP_W, MS_VIDEO_SIZE_HDTVP_H, &pPinCategory)==0) ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_HDTVP_W, MS_VIDEO_SIZE_HDTVP_H); else { ms_error("No supported size found for format."); /* size not supported? */ return -9; } // get DXFilter s->m_pDXFilter = new CDXFilter(NULL, &hr, FALSE); if(s->m_pDXFilter==NULL) { return -10; } s->m_pDXFilter->AddRef(); CMediaType mt; mt.SetType(&MEDIATYPE_Video); GUID m = MEDIASUBTYPE_RGB24; if (s->pix_fmt == MS_YUV420P) m = (GUID)FOURCCMap(MAKEFOURCC('I','4','2','0')); else if (s->pix_fmt == MS_YUY2) m = MEDIASUBTYPE_YUY2; else if (s->pix_fmt == MS_YUYV) m = MEDIASUBTYPE_YUYV; else if (s->pix_fmt == MS_UYVY) m = MEDIASUBTYPE_UYVY; else if (s->pix_fmt == MS_RGB24) m = MEDIASUBTYPE_RGB24; mt.SetSubtype(&m); mt.formattype = FORMAT_VideoInfo; mt.SetTemporalCompression(FALSE); VIDEOINFO *pvi = (VIDEOINFO *) mt.AllocFormatBuffer(sizeof(VIDEOINFO)); if (NULL == pvi) return -11; ZeroMemory(pvi, sizeof(VIDEOINFO)); if (s->pix_fmt == MS_YUV420P) pvi->bmiHeader.biCompression = MAKEFOURCC('I','4','2','0'); else if (s->pix_fmt == MS_YUY2) pvi->bmiHeader.biCompression = MAKEFOURCC('Y','U','Y','2'); else if (s->pix_fmt == MS_YUYV) pvi->bmiHeader.biCompression = MAKEFOURCC('Y','U','Y','V'); else if (s->pix_fmt == MS_UYVY) pvi->bmiHeader.biCompression = MAKEFOURCC('U','Y','V','Y'); else if (s->pix_fmt == MS_RGB24) pvi->bmiHeader.biCompression = BI_RGB; if (s->pix_fmt == MS_YUV420P) pvi->bmiHeader.biBitCount = 12; else if (s->pix_fmt == MS_YUY2) pvi->bmiHeader.biBitCount = 16; else if (s->pix_fmt == MS_YUYV) pvi->bmiHeader.biBitCount = 16; else if (s->pix_fmt == MS_UYVY) pvi->bmiHeader.biBitCount = 16; else if (s->pix_fmt == MS_RGB24) pvi->bmiHeader.biBitCount = 24; pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pvi->bmiHeader.biWidth = s->vsize.width; pvi->bmiHeader.biHeight = s->vsize.height; pvi->bmiHeader.biPlanes = 1; pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader); pvi->bmiHeader.biClrImportant = 0; mt.SetSampleSize(pvi->bmiHeader.biSizeImage); mt.SetFormat((BYTE*)pvi, sizeof(VIDEOINFO)); hr = s->m_pDXFilter->SetAcceptedMediaType(&mt); if(FAILED(hr)) { return -12; } hr = s->m_pDXFilter->SetCallback(Callback); if(FAILED(hr)) { return -13; } hr = s->m_pDXFilter->QueryInterface(IID_IBaseFilter, (LPVOID *)&s->m_pIDXFilter); if(FAILED(hr)) { return -14; } hr = s->m_pGraph->AddFilter(s->m_pIDXFilter, L"DXFilter Filter"); if(FAILED(hr)) { return -15; } // get null renderer hr=CoCreateInstance (CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&s->m_pNullRenderer); if(FAILED(hr)) { return -16; } if (s->m_pNullRenderer!=NULL) { s->m_pGraph->AddFilter(s->m_pNullRenderer, L"Null Renderer"); } hr = s->m_pBuilder->RenderStream(&pPinCategory, &MEDIATYPE_Video, s->m_pDeviceFilter, s->m_pIDXFilter, s->m_pNullRenderer); if (FAILED(hr)) { return -17; } IAMStreamConfig *pConfig = NULL; hr = s->m_pBuilder->FindInterface( &pPinCategory, // Preview pin. &MEDIATYPE_Video, // Any media type. s->m_pDeviceFilter, // Pointer to the capture filter. IID_IAMStreamConfig, (void**)&pConfig); if (pConfig!=NULL) { AM_MEDIA_TYPE *pType = NULL; int iCount, iSize; pConfig->GetNumberOfCapabilities(&iCount, &iSize); for (int i = 0; i < iCount; i++) { VIDEO_STREAM_CONFIG_CAPS scc; pType = NULL; pConfig->GetStreamCaps(i, &pType, (BYTE *)&scc); if (!((pType->formattype == FORMAT_VideoInfo) && (pType->cbFormat >= sizeof(VIDEOINFOHEADER)) && (pType->pbFormat != NULL))) continue; VIDEOINFOHEADER & videoInfo = *(VIDEOINFOHEADER *)pType->pbFormat; if (m != pType->subtype) continue; if (videoInfo.bmiHeader.biWidth != s->vsize.width) continue; if (videoInfo.bmiHeader.biHeight != s->vsize.height) continue; if (videoInfo.bmiHeader.biBitCount != pvi->bmiHeader.biBitCount) continue; if (videoInfo.bmiHeader.biCompression != pvi->bmiHeader.biCompression) continue; videoInfo.AvgTimePerFrame = UNITS / (LONGLONG)s->fps; pConfig->SetFormat(pType); } pConfig->GetFormat(&pType); if (pType!=NULL) { VIDEOINFO *pvi; pvi = (VIDEOINFO *)pType->pbFormat; ms_message("v4w: camera asked fps=%.2f // real fps=%.2f", s->fps, ((float)UNITS / (float)pvi->AvgTimePerFrame)); } pConfig->Release(); } //m_pDXFilter->SetBufferSamples(TRUE); s_callback = s; hr = s->m_pControl->Run(); if(FAILED(hr)) { return -18; } s->rotregvalue=1; return 0; }
int osd_width; /**< current width of the OSD */ int osd_height; /**< current height of the OSD */ int osd_texture_width; /**< current width of the OSD texture */ int osd_texture_height; /**< current height of the OSD texture */ } *priv; typedef struct { const unsigned int mplayer_fmt; /**< Given by MPlayer */ const D3DFORMAT fourcc; /**< Required by D3D's test function */ } struct_fmt_table; /* Map table from reported MPlayer format to the required fourcc. This is needed to perform the format query. */ static const struct_fmt_table fmt_table[] = { {IMGFMT_YV12, MAKEFOURCC('Y','V','1','2')}, {IMGFMT_I420, MAKEFOURCC('I','4','2','0')}, {IMGFMT_IYUV, MAKEFOURCC('I','Y','U','V')}, {IMGFMT_YVU9, MAKEFOURCC('Y','V','U','9')}, {IMGFMT_YUY2, D3DFMT_YUY2}, {IMGFMT_UYVY, D3DFMT_UYVY}, {IMGFMT_BGR32, D3DFMT_X8R8G8B8}, {IMGFMT_RGB32, D3DFMT_X8B8G8R8}, {IMGFMT_BGR24, D3DFMT_R8G8B8}, //untested {IMGFMT_BGR16, D3DFMT_R5G6B5}, {IMGFMT_BGR15, D3DFMT_X1R5G5B5}, {IMGFMT_BGR8 , D3DFMT_R3G3B2}, //untested }; #define DISPLAY_FORMAT_TABLE_ENTRIES (sizeof(fmt_table) / sizeof(fmt_table[0]))
HRESULT WINAPI NineQuery9_GetData( struct NineQuery9 *This, void *pData, DWORD dwSize, DWORD dwGetDataFlags ) { struct pipe_context *pipe = This->base.device->pipe; boolean ok = !This->pq; unsigned i; union pipe_query_result presult; union nine_query_result nresult; user_assert(This->state != NINE_QUERY_STATE_RUNNING, D3DERR_INVALIDCALL); user_assert(dwSize == 0 || pData, D3DERR_INVALIDCALL); user_assert(dwGetDataFlags == 0 || dwGetDataFlags == D3DGETDATA_FLUSH, D3DERR_INVALIDCALL); if (!This->pq) { DBG("No pipe query available.\n"); if (!dwSize) return S_OK; } if (This->state == NINE_QUERY_STATE_FRESH) return S_OK; if (!ok) { ok = pipe->get_query_result(pipe, This->pq, FALSE, &presult); if (!ok) { if (dwGetDataFlags) { if (This->state != NINE_QUERY_STATE_FLUSHED) pipe->flush(pipe, NULL, 0); This->state = NINE_QUERY_STATE_FLUSHED; } return S_FALSE; } } if (!dwSize) return S_OK; switch (This->type) { case D3DQUERYTYPE_EVENT: nresult.b = presult.b; break; case D3DQUERYTYPE_OCCLUSION: nresult.dw = presult.u64; break; case D3DQUERYTYPE_TIMESTAMP: nresult.u64 = presult.u64; break; case D3DQUERYTYPE_TIMESTAMPDISJOINT: nresult.b = presult.timestamp_disjoint.disjoint; break; case D3DQUERYTYPE_TIMESTAMPFREQ: nresult.u64 = presult.timestamp_disjoint.frequency; break; case D3DQUERYTYPE_VERTEXSTATS: nresult.vertexstats.NumRenderedTriangles = presult.pipeline_statistics.c_invocations; nresult.vertexstats.NumExtraClippingTriangles = presult.pipeline_statistics.c_primitives; break; /* Thse might be doable with driver-specific queries; dummy for now. */ case D3DQUERYTYPE_BANDWIDTHTIMINGS: nresult.bandwidth.MaxBandwidthUtilized = 1.0f; nresult.bandwidth.FrontEndUploadMemoryUtilizedPercent = 0.5f; nresult.bandwidth.VertexRateUtilizedPercent = 0.75f; nresult.bandwidth.TriangleSetupRateUtilizedPercent = 0.75f; nresult.bandwidth.FillRateUtilizedPercent = 1.0f; break; case D3DQUERYTYPE_VERTEXTIMINGS: case D3DQUERYTYPE_PIXELTIMINGS: nresult.stage.MemoryProcessingPercent = 0.5f; nresult.stage.ComputationProcessingPercent = 0.5f; break; case D3DQUERYTYPE_VCACHE: /* Are we supposed to fill this in ? */ nresult.vcache.Pattern = MAKEFOURCC('C', 'A', 'C', 'H'); nresult.vcache.OptMethod = 1; nresult.vcache.CacheSize = 32 << 10; nresult.vcache.MagicNumber = 0xdeadcafe; break; case D3DQUERYTYPE_RESOURCEMANAGER: /* We could record some of these in the device ... */ for (i = 0; i < D3DRTYPECOUNT; ++i) { nresult.rm.stats[i].bThrashing = FALSE; nresult.rm.stats[i].ApproxBytesDownloaded = 0; nresult.rm.stats[i].NumEvicts = 0; nresult.rm.stats[i].NumVidCreates = 0; nresult.rm.stats[i].LastPri = 0; nresult.rm.stats[i].NumUsed = 1; nresult.rm.stats[i].NumUsedInVidMem = 1; nresult.rm.stats[i].WorkingSet = 1; nresult.rm.stats[i].WorkingSetBytes = 1 << 20; nresult.rm.stats[i].TotalManaged = 1; nresult.rm.stats[i].TotalBytes = 1 << 20; } break; case D3DQUERYTYPE_PIPELINETIMINGS: nresult.pipe.VertexProcessingTimePercent = 0.4f; nresult.pipe.PixelProcessingTimePercent = 0.4f; nresult.pipe.OtherGPUProcessingTimePercent = 0.15f; nresult.pipe.GPUIdleTimePercent = 0.05f; break; case D3DQUERYTYPE_INTERFACETIMINGS: nresult.iface.WaitingForGPUToUseApplicationResourceTimePercent = 0.0f; nresult.iface.WaitingForGPUToAcceptMoreCommandsTimePercent = 0.0f; nresult.iface.WaitingForGPUToStayWithinLatencyTimePercent = 0.0f; nresult.iface.WaitingForGPUExclusiveResourceTimePercent = 0.0f; nresult.iface.WaitingForGPUOtherTimePercent = 0.0f; break; case D3DQUERYTYPE_CACHEUTILIZATION: nresult.cacheu.TextureCacheHitRate = 0.9f; nresult.cacheu.PostTransformVertexCacheHitRate = 0.3f; break; default: assert(0); break; } memcpy(pData, &nresult, MIN2(sizeof(nresult), dwSize)); return S_OK; }
DWORD dwSize; DWORD dwFlags; DWORD dwFourCC; DWORD dwRGBBitCount; DWORD dwRBitMask; DWORD dwGBitMask; DWORD dwBBitMask; DWORD dwABitMask; }; #define DDS_FOURCC 0x00000004 // DDPF_FOURCC #define DDS_RGB 0x00000040 // DDPF_RGB #define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS const DDS_PIXELFORMAT DDSPF_DXT1 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 }; const DDS_PIXELFORMAT DDSPF_DXT2 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','2'), 0, 0, 0, 0, 0 }; const DDS_PIXELFORMAT DDSPF_DXT3 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 }; const DDS_PIXELFORMAT DDSPF_DXT4 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','4'), 0, 0, 0, 0, 0 }; const DDS_PIXELFORMAT DDSPF_DXT5 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 }; const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 };
/** \fn changeZoom */ bool dxvaRender::init( GUI_WindowInfo * window, uint32_t w, uint32_t h,renderZoom zoom) { ADM_info("Initializing dxva2/D3D render\n"); info=*window; baseInit(w,h,zoom); windowId=(HWND)window->systemWindowId; if(!d3dHandle) { ADM_warning("No D3DHandle\n"); return false; } if (ADM_FAILED(IDirect3D9_GetAdapterDisplayMode(d3dHandle, D3DADAPTER_DEFAULT, &displayMode))) { ADM_warning("Dxv2/D3D Render: Cannot get display mode\n"); return 0; } D3DCAPS9 deviceCapabilities; ADM_info("D3D Checking device capabilities\n"); if (ADM_FAILED(IDirect3D9_GetDeviceCaps(d3dHandle, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &deviceCapabilities))) { ADM_warning("Cannot get device capabilities"); return false; } int texture = deviceCapabilities.TextureCaps; ADM_info("Power of 2 : %d\n", (texture & D3DPTEXTURECAPS_POW2) && !(texture & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)); ADM_info("Square only: %d\n", (texture & D3DPTEXTURECAPS_SQUAREONLY)); // Check if we support YV12 D3DFORMAT fmt=displayMode.Format; D3DFORMAT yv12=(D3DFORMAT)MAKEFOURCC('Y','V','1','2'); if (ADM_FAILED(IDirect3D9_CheckDeviceFormatConversion( d3dHandle, // adapter D3DADAPTER_DEFAULT, // device type D3DDEVTYPE_HAL, // adapter format yv12, // render target format fmt))) // depth stencil format { useYV12=false; ADM_info("D3D YV12 not supported\n"); } else { useYV12=true; ADM_info("D3D YV12 is supported\n"); } if(!setup()) { ADM_warning("Dxva/D3D setup failed\n"); return false; } videoWidget=(ADM_Qvideo *)info.widget; videoWidget->useExternalRedraw(true); // deactivate Qt Double buffering videoWidget->setDrawer(this); ADM_info("Dxva (D3D) init successful, dxva render. w=%d, h=%d,zoom=%d, displayWidth=%d, displayHeight=%d\n",(int)w,(int)h,(int)zoom,(int)displayWidth,(int)displayHeight); return true; }
//-------------------------------------------------------------------------------------------------------------- SPS* CResourceManager::_CreatePS (LPCSTR name) { LPSTR N = LPSTR(name); map_PS::iterator I = m_ps.find (N); if (I!=m_ps.end()) return I->second; else { SPS* _ps = xr_new<SPS> (); _ps->dwFlags |= xr_resource_flagged::RF_REGISTERED; m_ps.insert (mk_pair(_ps->set_name(name),_ps)); if (0==stricmp(name,"null")) { _ps->ps = NULL; return _ps; } // Open file includer Includer; string_path cname; strconcat (sizeof(cname), cname,::Render->getShaderPath(),name,".ps"); FS.update_path (cname, "$game_shaders$", cname); // duplicate and zero-terminate IReader* R = FS.r_open(cname); R_ASSERT2 (R,cname); u32 size = R->length(); char* data = xr_alloc<char>(size + 1); CopyMemory (data,R->pointer(),size); data[size] = 0; FS.r_close (R); // Select target LPCSTR c_target = "ps_2_0"; LPCSTR c_entry = "main"; if (strstr(data,"main_ps_1_1")) { c_target = "ps_1_1"; c_entry = "main_ps_1_1"; } if (strstr(data,"main_ps_1_2")) { c_target = "ps_1_2"; c_entry = "main_ps_1_2"; } if (strstr(data,"main_ps_1_3")) { c_target = "ps_1_3"; c_entry = "main_ps_1_3"; } if (strstr(data,"main_ps_1_4")) { c_target = "ps_1_4"; c_entry = "main_ps_1_4"; } if (strstr(data,"main_ps_2_0")) { c_target = "ps_2_0"; c_entry = "main_ps_2_0"; } // Compile LPD3DXBUFFER pShaderBuf = NULL; LPD3DXBUFFER pErrorBuf = NULL; LPD3DXSHADER_CONSTANTTABLE pConstants = NULL; HRESULT _hr = S_OK; _hr = ::Render->shader_compile (name,data,size, NULL, &Includer, c_entry, c_target, D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR /*| D3DXSHADER_PREFER_FLOW_CONTROL*/, &pShaderBuf, &pErrorBuf, NULL); //_hr = D3DXCompileShader (text,text_size, NULL, &Includer, c_entry, c_target, D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR, &pShaderBuf, &pErrorBuf, NULL); xr_free (data); LPCSTR last_error = ""; if (SUCCEEDED(_hr)) { if (pShaderBuf) { _hr = HW.pDevice->CreatePixelShader ((DWORD*)pShaderBuf->GetBufferPointer(), &_ps->ps); if (SUCCEEDED(_hr)) { LPCVOID data = NULL; _hr = D3DXFindShaderComment ((DWORD*)pShaderBuf->GetBufferPointer(),MAKEFOURCC('C','T','A','B'),&data,NULL); if (SUCCEEDED(_hr) && data) { pConstants = LPD3DXSHADER_CONSTANTTABLE(data); _ps->constants.parse (pConstants,0x1); } else _hr = E_FAIL; } } else _hr = E_FAIL; }else { if (pErrorBuf) last_error = (LPCSTR)pErrorBuf->GetBufferPointer(); } // Real Wolf.10.12.2014 string1024 buff; if (FAILED(_hr)) { if (xr_strlen(last_error)) sprintf_s(buff, 1023, "ќшибка компил¤ции шейдера %s: %s ", name, last_error); else sprintf_s(buff, 1023, "ќшибка компил¤ции шейдера %s. ¬озможна ошибка в скрипте, или\n видеокарта не поддерживает пиксельные шейдеры 1.1", name); Msg(buff); } pConstants = NULL; _RELEASE(pShaderBuf); _RELEASE(pErrorBuf); CHECK_OR_EXIT ( !FAILED(_hr), make_string(buff) ); return _ps; } }
void CREvent::Display() { if(m_pPlayer){ m_SelectSence->RenderLayerBack(); render::Interface *pInterface = render::Interface::GetInstance(); render::Interface::Layer3D *pLayer3D = pInterface->GetLayer3D(); DWORD dwCurrentTime = timeGetTime(); // 显示角色 if (m_pPlayer && m_pPlayer->GetDisplayModel() && m_pPlayer->GetDisplayModel()->GetLoadState() == Load_Did) { static WORD dwState[] = { CShape::STATE_PEACE, // 取武器 CShape::STATE_FIGHT, // 挥舞 CShape::STATE_FIGHT, // 站定 }; static WORD dwAct[] = { CShape::ACT_SEL_X0, // 取武器 CShape::ACT_SEL_X1, // 挥舞 CShape::ACT_SEL_X2, // 站定 }; // 判断角色模型旋转 if (m_bRoleLeftRotate) s_RolePos[3] += 0.1f; if (m_bRoleRightRotate) s_RolePos[3] -= 0.1f; //判断播放结束 CDisplayModel *pDisplayModel = m_pPlayer->GetDisplayModel(); AnimInfo *pAnimInfo = m_pPlayer->GetAnimInfo(); pAnimInfo->GetActionInfo()->bStayToLastFrame = false; pAnimInfo->GetActionInfo()->bCurActionLooped = TRUE; pAnimInfo->SetCurrentTime(dwCurrentTime); if (pAnimInfo->GetActionInfo()->dwCurActionLoopCount > 10 && pAnimInfo->GetActionInfo()->dwCurAction == MAKEFOURCC('E','I','0','0')) { pAnimInfo->GetActionInfo()->bInterpolation = TRUE; pAnimInfo->GetActionInfo()->dwOldAction = pAnimInfo->GetActionInfo()->dwCurAction; pAnimInfo->GetActionInfo()->dwOldActionTimeElapse = pAnimInfo->GetActionInfo()->dwCurActionElapseTime; pAnimInfo->GetActionInfo()->fOldActionSpeedRate = pAnimInfo->GetActionInfo()->fCurActionSpeedRate; pAnimInfo->GetActionInfo()->dwInterpolationElapseTime = 0; pAnimInfo->GetActionInfo()->dwInterpolationStartTime = dwCurrentTime; pAnimInfo->GetActionInfo()->dwInterpolationTimeLength = 240; pAnimInfo->GetActionInfo()->dwCurAction = MAKEFOURCC('E','I','0','0'); pAnimInfo->GetActionInfo()->dwCurActionLoopCount = 0; } /* else if (pAnimInfo->GetActionInfo()->dwCurActionLoopCount > 0 && pAnimInfo->GetActionInfo()->dwCurAction == MAKEFOURCC('E','I','0','0')) { pAnimInfo->GetActionInfo()->bInterpolation = TRUE; pAnimInfo->GetActionInfo()->dwOldAction = pAnimInfo->GetActionInfo()->dwCurAction; pAnimInfo->GetActionInfo()->dwOldActionTimeElapse = pAnimInfo->GetActionInfo()->dwCurActionElapseTime; pAnimInfo->GetActionInfo()->fOldActionSpeedRate = pAnimInfo->GetActionInfo()->fCurActionSpeedRate; pAnimInfo->GetActionInfo()->dwInterpolationElapseTime = 0; pAnimInfo->GetActionInfo()->dwInterpolationStartTime = dwCurrentTime; pAnimInfo->GetActionInfo()->dwInterpolationTimeLength = 240; pAnimInfo->GetActionInfo()->dwCurAction = MAKEFOURCC('E','I','0','0'); pAnimInfo->GetActionInfo()->dwCurActionLoopCount = 0; }*/ else { if (pAnimInfo->GetActionInfo()->dwCurAction != MAKEFOURCC('E','I','0','0')&&pAnimInfo->GetActionInfo()->dwCurAction != MAKEFOURCC('E','B','0','0')) { pAnimInfo->GetActionInfo()->dwCurAction = MAKEFOURCC('E','I','0','0'); pAnimInfo->GetActionInfo()->dwCurActionLoopCount = 0; } } //this->RoleLeftRotate(); //bool bDisplayFinish = (pAnimInfo->GetActionInfo()->dwCurActionLoopCount > 0); //if (bDisplayFinish) //{ // // 出招 // if (m_iCurrentAction < 2) // { // m_iCurrentAction++; // g_bForceUpdate = true; // pSelectedPlayer->SetAction(dwAct[m_iCurrentAction]); // } // else // { // pSelectedPlayer->SetAction(dwAct[m_iCurrentAction]); // g_bForceUpdate = true; // } //} // 显示坐标 if (g_bDebug) { char str[256]; sprintf(str, "%f, %f, %f (%f)", s_RolePos[0], s_RolePos[1], s_RolePos[2], m_pPlayer->GetNowDir()); GetGame()->OutPutText(0, 0, str, lstrlen(str), D3DCOLOR_ARGB(255,0,255,0)); } // 渲染简单阴影 render::Camera *pCamera = m_SelectSence->GetCamera(); pDisplayModel->SetDirLightEnable(false); pAnimInfo->SetupAnimInfo(s_RolePos[2], s_RolePos[0], s_RolePos[1],s_RolePos[3],pCamera); //pAnimInfo->SetViewMatrix(m_pCamera->GetViewMatrix()); //pAnimInfo->SetProjectedMatrix(m_pCamera->GetProjectionMatrix()); pDisplayModel->ProcessAnimJoint(pAnimInfo); pDisplayModel->ProcessAnimTexture(pAnimInfo); pDisplayModel->ProcessAnimUV(pAnimInfo); pDisplayModel->ProcessEnvironmentMaps(pCamera->GetViewMatrix()); pDisplayModel->ProcessParticleEmitter(pAnimInfo); pDisplayModel->ProcessTextureProjective(pAnimInfo); pDisplayModel->ProcessTrailEmitter(pAnimInfo); pDisplayModel->ProcessLocator(pAnimInfo); pDisplayModel->ProcessAnimColor(pAnimInfo); pDisplayModel->ProcessVisibility(pAnimInfo); pDisplayModel->RenderModel(); m_pPlayer->GetLeftHandWeapon()->Display(dynamic_cast<CShape *>(m_pPlayer)); m_pPlayer->GetRightHandWeapon()->Display(dynamic_cast<CShape *>(m_pPlayer)); m_pPlayer->GetWing()->Display(dynamic_cast<CShape *>(m_pPlayer)); m_pPlayer->GetHeadWear()->Display(dynamic_cast<CShape *>(m_pPlayer)); //CTextureProjective::BeginRendShadow(D3DXVECTOR3(s_RolePos[0],s_RolePos[1],s_RolePos[2]), 3); //CTextureProjective::AddRendShadow(pDisplayModel,pAnimInfo); //CTextureProjective::AddRendShadow(m_pPlayer->GetLeftHandWeapon()->GetDisplayModel(),m_pPlayer->GetLeftHandWeapon()->GetAnimInfo()); //CTextureProjective::AddRendShadow(m_pPlayer->GetRightHandWeapon()->GetDisplayModel(),m_pPlayer->GetRightHandWeapon()->GetAnimInfo()); //CTextureProjective::AddRendShadow(m_pPlayer->GetWing()->GetDisplayModel(),m_pPlayer->GetWing()->GetAnimInfo()); //CTextureProjective::EndRendShadow(); } particle::Manager::GetInstance()->Render(); //pLayer2D->Update(); //pLayer3D->SetMaterial(&pScene->pGameMap->m_material); pLayer3D->SetFogEnable(m_SelectSence->GetGameMap()->GetFogEnable()); pLayer3D->SetMipMap(FALSE); pLayer3D->RenderTest(); pLayer3D->RenderBlendLow(); pLayer3D->EndEffectsState(); //DisplayTextureProjective(); pLayer3D->RenderBlend(); pLayer3D->Clear(); } }
STDMETHODIMP CGfxSAMSUNG::Open(DWORD dwWidth, DWORD dwHeight, DWORD dwBuffers, const DWORD *pdwFourCC, IMcPreInit* pPrepareData, RECT* pDst) { UINT32 CamIFState = 0; if(dwWidth==0 || dwHeight==0) return E_FAIL; if(m_bOpen) { DP("[GFXSAMSUNG]Invalid call \n"); return E_FAIL; } m_dwWidth = dwWidth; m_dwHeight = dwHeight; ZeroMemory(&m_rectSrc,sizeof(m_rectSrc)); ZeroMemory(&m_rectDst,sizeof(m_rectDst)); if(pdwFourCC) m_pdwFourCCList = pdwFourCC; else m_pdwFourCCList = const_dwFourCC; DP("[GFXSAMSUNG]Open w:%d h:%d \n",m_dwWidth, m_dwHeight); SetRect(&m_rectScn,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); if(pDst == NULL) { m_rectDst.right = 8; m_rectDst.bottom = 8; } else { m_rectDst.left = pDst->left; m_rectDst.top = pDst->top; m_rectDst.right = pDst->right; m_rectDst.bottom = pDst->bottom; } //Create SAMSUNG Surface Start------------------------------------------------------------- ZeroMemory(&m_open_para, sizeof(m_open_para)); m_open_para.nOrgSrcWidth = m_dwWidth; m_open_para.nOrgSrcHeight = m_dwHeight; m_open_para.nSrcWidth = m_dwWidth; m_open_para.nSrcHeight = m_dwHeight; m_open_para.nDestWidth = m_rectDst.right - m_rectDst.left; m_open_para.nDestHeight = m_rectDst.bottom - m_rectDst.top; m_open_para.nSrcStartX = 0; m_open_para.nSrcStartY = 0; m_open_para.nInputFormat =0; //YUV:420 #ifndef SAMSUNG_2416 m_open_para.nPositionX = m_rectDst.left; m_open_para.nPositionY =m_rectDst.top; #else m_sWin1Size.StartPointX = m_rectDst.left; m_sWin1Size.StartPointY = m_rectDst.top; m_sWin1Size.Width = m_open_para.nDestWidth; m_sWin1Size.Height = m_open_para.nDestHeight; #endif m_open_para.nControlstyle = PST_DSP_MODE; m_cam_hnd = CreateFile(TEXT("PST1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); if(m_cam_hnd ==INVALID_HANDLE_VALUE) { DP("[GFXSAMSUNG]Open PST1 Fail\n"); return E_FAIL; } #ifdef SAMSUNG_2416 if( !ExtEscape( ::GetDC( NULL ), IOCTL_WIN1_CLOSE, 0, NULL, 0, NULL) ) { RETAILMSG(1,(L"$$$$$$ close win1 Failed ! $$$$$$$$$$$$$$$$$$\n")); } #endif if(!DeviceIoControl(m_cam_hnd, (DWORD)IOCTL_POST_STOP, //ֹͣת NULL, 0, NULL, 0, NULL, NULL)) { DP("PST CamIF stop failed\n"); } if(!DeviceIoControl(m_cam_hnd, (DWORD)IOCTL_POST_GETHWSTATE, NULL, 0, &CamIFState, sizeof(DWORD), NULL, NULL)) { DP("PST Get CamIF State false!\r\n"); // return E_FAIL; } if(CamIFState == CAMIF_IDLE_STATE) { #ifdef SAMSUNG_2416 m_uAlpha = 0xf; if(!ExtEscape( ::GetDC( NULL ), IOCTL_WIN1_SETALPHA, sizeof(m_uAlpha),(LPCSTR)&m_uAlpha,0,NULL)) { RETAILMSG(1,(L"$$$$$$ SetAlpha Failed ! $$$$$$$$$$$$$$$$$$\n")); } if(!ExtEscape( ::GetDC( NULL ), IOCTL_WIN1_SETSIZE, sizeof(m_sWin1Size),(LPCSTR)&m_sWin1Size,0,NULL)) { RETAILMSG(1,(L"$$$$$$ SetWin1Size Failed ! $$$$$$$$$$$$$$$$$$\n")); } #endif if(!DeviceIoControl(m_cam_hnd, (DWORD)IOCTL_POST_INIT, &m_open_para, sizeof(m_open_para), NULL, 0, NULL, NULL)) { DP("PST IOCTROL FAIL!\r\n"); return E_FAIL; } } else { DP("PST CamIF is not idle!\r\n"); return E_FAIL; } #ifdef SAMSUNG_2416 m_pInputBuff = (BYTE*)malloc(m_dwWidth* m_dwHeight *4 ); m_pOutputBuff = (BYTE*)malloc(m_open_para.nDestWidth* m_open_para.nDestHeight*4); if((m_pInputBuff == NULL) || (m_pOutputBuff == NULL)) return E_FAIL; if( !ExtEscape( ::GetDC( NULL ), IOCTL_WIN1_OPEN, 0, NULL, 0, NULL) ) { RETAILMSG(1,(L"$$$$$$ open win1 Failed ! $$$$$$$$$$$$$$$$$$\n")); } #else #ifdef SAMSUNG_2450_LEADER_INTL m_pInputBuff = (BYTE*)malloc(m_dwWidth* m_dwHeight *4 ); m_pOutputBuff = (BYTE*)malloc(480*272*4); if((m_pInputBuff == NULL) || (m_pOutputBuff == NULL)) return E_FAIL; if( !ExtEscape( ::GetDC( NULL ), IOCTL_WIN1_OPEN, 0, NULL, 0, NULL) ) { RETAILMSG(1,(L"$$$$$$ open win1 Failed ! $$$$$$$$$$$$$$$$$$\n")); } #else if(!DeviceIoControl(m_cam_hnd, (DWORD)IOCTL_POST_GETINPUTBUFFER, //get input buffer NULL, 0, &m_pInputBuff,sizeof(m_pInputBuff), NULL, NULL)) { DP("get input buffer FAIL!"); return E_FAIL; } if(!DeviceIoControl(m_cam_hnd, (DWORD)IOCTL_POST_GETOUTPUTBUFFER, //get OUTput buffer NULL, 0, &m_pOutputBuff,sizeof(m_pOutputBuff), NULL, NULL)) { DP("get output buffer FAIL!"); return E_FAIL; } #endif #endif SetRect(&m_rectScn,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); m_dwFourCC = MAKEFOURCC('Y','V','1','2'); m_bOpen = TRUE; return S_OK; }
static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff) { vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external); LPDIRECT3DSURFACE9 d3d = (LPDIRECT3DSURFACE9)(uintptr_t)ff->data[3]; if (!va->surface_cache.buffer) return VLC_EGENERIC; /* */ assert(va->output == MAKEFOURCC('Y','V','1','2')); /* */ D3DLOCKED_RECT lock; if (FAILED(IDirect3DSurface9_LockRect(d3d, &lock, NULL, D3DLOCK_READONLY))) { msg_Err(va->log, "Failed to lock surface"); return VLC_EGENERIC; } if (va->render == MAKEFOURCC('Y','V','1','2') || va->render == MAKEFOURCC('I','M','C','3')) { bool imc3 = va->render == MAKEFOURCC('I','M','C','3'); size_t chroma_pitch = imc3 ? lock.Pitch : (lock.Pitch / 2); size_t pitch[3] = { lock.Pitch, chroma_pitch, chroma_pitch, }; uint8_t *plane[3] = { (uint8_t*)lock.pBits, (uint8_t*)lock.pBits + pitch[0] * va->surface_height, (uint8_t*)lock.pBits + pitch[0] * va->surface_height + pitch[1] * va->surface_height / 2, }; if (imc3) { uint8_t *V = plane[1]; plane[1] = plane[2]; plane[2] = V; } CopyFromYv12(picture, plane, pitch, va->width, va->height, &va->surface_cache); } else { assert(va->render == MAKEFOURCC('N','V','1','2')); uint8_t *plane[2] = { lock.pBits, (uint8_t*)lock.pBits + lock.Pitch * va->surface_height }; size_t pitch[2] = { lock.Pitch, lock.Pitch, }; CopyFromNv12(picture, plane, pitch, va->width, va->height, &va->surface_cache); } /* */ IDirect3DSurface9_UnlockRect(d3d); return VLC_SUCCESS; }
void ReadCollisionData(const char * c_pszFileName, int iBaseX, int iBaseY) { FILE * fp = fopen(c_pszFileName, "rb"); printf("Reading collision data file: %s\n", c_pszFileName); if (!fp) { printf("No collision data file: %s\n", c_pszFileName); return; } DWORD dwFourCC; fread(&dwFourCC, sizeof(DWORD), 1, fp); if (dwFourCC != MAKEFOURCC('M', '2', 'C', 'D')) { printf("Not a collision data file: %s", c_pszFileName); fclose(fp); return; } WORD wxSize, wySize; fread(&wxSize, sizeof(WORD), 1, fp); fread(&wySize, sizeof(WORD), 1, fp); printf("collision area size: %d %d", wxSize, wySize); for (DWORD x = 0; x < wxSize; ++x) { for (DWORD y = 0; y < wySize; ++y) { DWORD dwCount; fread(&dwCount, sizeof(DWORD), 1, fp); printf("\n%ux%u %u ", x, y, dwCount); for (DWORD j = 0; j < dwCount; ++j) { BYTE bType; fread(&bType, sizeof(BYTE), 1, fp); switch (bType) { case COLLISION_TYPE_PLANE: printf("P"); { TPlaneData PlaneData; fread(&PlaneData, sizeof(TPlaneData), 1, fp); int pairs[6][2] = { { 0, 3 }, { 0, 1 }, { 0, 2 }, { 1, 2 }, { 1, 3 }, { 2, 3 }, }; for (int iPairIndex = 0; iPairIndex < 6; iPairIndex++) { int iFrom = pairs[iPairIndex][0]; int iTo = pairs[iPairIndex][1]; if (fabs(PlaneData.v3QuadPosition[iFrom].x - PlaneData.v3QuadPosition[iTo].x) > 100000.0f || fabs(PlaneData.v3QuadPosition[iFrom].y - PlaneData.v3QuadPosition[iTo].y) > 100000.0f) { sys_log(0, "Blcok too big: %d %d %d %d", iBaseX + (int) PlaneData.v3QuadPosition[iFrom].x, iBaseY + (int) -PlaneData.v3QuadPosition[iFrom].y, iBaseX + (int) PlaneData.v3QuadPosition[iTo].x, iBaseY + (int) -PlaneData.v3QuadPosition[iTo].y); } else { printf("Block %d %d %d %d\n", iBaseX + (int) PlaneData.v3QuadPosition[iFrom].x, iBaseY + (int) -PlaneData.v3QuadPosition[iFrom].y, iBaseX + (int) PlaneData.v3QuadPosition[iTo].x, iBaseY + (int) -PlaneData.v3QuadPosition[iTo].y); ProcessLine( iBaseX + (int) PlaneData.v3QuadPosition[iFrom].x, iBaseY + (int) -PlaneData.v3QuadPosition[iFrom].y, iBaseX + (int) PlaneData.v3QuadPosition[iTo].x, iBaseY + (int) -PlaneData.v3QuadPosition[iTo].y, BlockAttribute); } } // 사각형 채우기도 합시다 // 0 1 2 3 순서대로 // -- +- -+ ++ // 근데 y 는 마이너스 취하는거 확인하시길 // TODO } break; case COLLISION_TYPE_SPHERE: printf("S"); { TSphereData SphereData; fread(&SphereData, sizeof(TSphereData), 1, fp); ProcessSphere( iBaseX + SphereData.v3Position.x, iBaseY - SphereData.v3Position.y, SphereData.fRadius, BlockAttribute); } break; case COLLISION_TYPE_CYLINDER: printf("C"); { TCylinderData CylinderData; fread(&CylinderData, sizeof(TCylinderData), 1, fp); ProcessSphere( iBaseX + CylinderData.v3Position.x, iBaseY - CylinderData.v3Position.y, CylinderData.fRadius, BlockAttribute); } break; default: printf("invalid type!"); break; } } } } printf("%d %d\n", iBaseX, iBaseY); fclose(fp); }
const DWORD *m_pdwFourCCList; DWORD m_dwBackBuffers; BOOL m_bShow, m_bLastShow; HWND m_hwnd; BOOL m_bOpen; HANDLE m_cam_hnd; BYTE *m_pInputBuff,*m_pOutputBuff; POSTINFO m_open_para; unsigned char m_uAlpha; //0-0xf WIN1SIZE m_sWin1Size; }; static const DWORD const_dwFourCC[] = { MAKEFOURCC('Y','V','1','2'), 0 }; CGfxSAMSUNG::CGfxSAMSUNG() : CMcUnknown(0,0) { m_dwWidth = m_dwHeight = 0; m_dwBackBuffers = 0; m_bShow = m_bLastShow = TRUE; ZeroMemory(&m_rectSrc,sizeof(m_rectSrc)); ZeroMemory(&m_rectDst,sizeof(m_rectDst)); ZeroMemory(&m_rectScn,sizeof(m_rectScn)); ZeroMemory(&m_open_para, sizeof(m_open_para)); ZeroMemory(&m_sWin1Size, sizeof(m_sWin1Size)); m_hwnd = 0;
CRenderTarget::CRenderTarget () { param_blur = 0.f; param_gray = 0.f; param_noise = 0.f; param_duality_h = 0.f; param_duality_v = 0.f; param_noise_fps = 25.f; param_noise_scale = 1.f; im_noise_time = 1/100; im_noise_shift_w = 0; im_noise_shift_h = 0; param_color_base = color_rgba(127,127,127, 0); param_color_gray = color_rgba(85,85,85, 0); param_color_add = color_rgba(0,0,0, 0); dwAccumulatorClearMark = 0; Device.Resources->Evict (); // Blenders b_occq = xr_new<CBlender_light_occq> (); b_accum_mask = xr_new<CBlender_accum_direct_mask> (); b_accum_direct = xr_new<CBlender_accum_direct> (); b_accum_point = xr_new<CBlender_accum_point> (); b_accum_spot = xr_new<CBlender_accum_spot> (); b_accum_reflected = xr_new<CBlender_accum_reflected> (); b_bloom = xr_new<CBlender_bloom_build> (); b_luminance = xr_new<CBlender_luminance> (); b_combine = xr_new<CBlender_combine> (); // NORMAL { u32 w=Device.dwWidth, h=Device.dwHeight; rt_Position.create (r2_RT_P, w,h,D3DFMT_A16B16G16R16F); rt_Normal.create (r2_RT_N, w,h,D3DFMT_A16B16G16R16F); // select albedo & accum if (RImplementation.o.mrtmixdepth) { // NV50 rt_Color.create (r2_RT_albedo, w,h,D3DFMT_A8R8G8B8 ); rt_Accumulator.create (r2_RT_accum, w,h,D3DFMT_A16B16G16R16F); } else { // can't - mix-depth if (RImplementation.o.fp16_blend) { // NV40 rt_Color.create (r2_RT_albedo, w,h,D3DFMT_A16B16G16R16F); // expand to full rt_Accumulator.create (r2_RT_accum, w,h,D3DFMT_A16B16G16R16F); } else { // R4xx, no-fp-blend,-> albedo_wo VERIFY (RImplementation.o.albedo_wo); rt_Color.create (r2_RT_albedo, w,h,D3DFMT_A8R8G8B8 ); // normal rt_Accumulator.create (r2_RT_accum, w,h,D3DFMT_A16B16G16R16F); rt_Accumulator_temp.create (r2_RT_accum_temp, w,h,D3DFMT_A16B16G16R16F); } } // generic(LDR) RTs rt_Generic_0.create (r2_RT_generic0,w,h,D3DFMT_A8R8G8B8 ); rt_Generic_1.create (r2_RT_generic1,w,h,D3DFMT_A8R8G8B8 ); } // OCCLUSION s_occq.create (b_occq, "r2\\occq"); // DIRECT (spot) D3DFORMAT depth_format = (D3DFORMAT)RImplementation.o.HW_smap_FORMAT; if (RImplementation.o.HW_smap) { D3DFORMAT nullrt = D3DFMT_R5G6B5; if (RImplementation.o.nullrt) nullrt = (D3DFORMAT)MAKEFOURCC('N','U','L','L'); u32 size =RImplementation.o.smapsize ; rt_smap_depth.create (r2_RT_smap_depth, size,size,depth_format ); rt_smap_surf.create (r2_RT_smap_surf, size,size,nullrt ); rt_smap_ZB = NULL; s_accum_mask.create (b_accum_mask, "r2\\accum_mask"); s_accum_direct.create (b_accum_direct, "r2\\accum_direct"); } else { u32 size =RImplementation.o.smapsize ; rt_smap_surf.create (r2_RT_smap_surf, size,size,D3DFMT_R32F); rt_smap_depth = NULL; R_CHK (HW.pDevice->CreateDepthStencilSurface (size,size,D3DFMT_D24X8,D3DMULTISAMPLE_NONE,0,TRUE,&rt_smap_ZB,NULL)); s_accum_mask.create (b_accum_mask, "r2\\accum_mask"); s_accum_direct.create (b_accum_direct, "r2\\accum_direct"); } // POINT { s_accum_point.create (b_accum_point, "r2\\accum_point_s"); accum_point_geom_create (); g_accum_point.create (D3DFVF_XYZ, g_accum_point_vb, g_accum_point_ib); accum_omnip_geom_create (); g_accum_omnipart.create (D3DFVF_XYZ, g_accum_omnip_vb, g_accum_omnip_ib); } // SPOT { s_accum_spot.create (b_accum_spot, "r2\\accum_spot_s", "lights\\lights_spot01"); accum_spot_geom_create (); g_accum_spot.create (D3DFVF_XYZ, g_accum_spot_vb, g_accum_spot_ib); } // REFLECTED { s_accum_reflected.create (b_accum_reflected, "r2\\accum_refl"); } // BLOOM { D3DFORMAT fmt = D3DFMT_A8R8G8B8; //; // D3DFMT_X8R8G8B8 u32 w=BLOOM_size_X, h=BLOOM_size_Y; u32 fvf_build = D3DFVF_XYZRHW|D3DFVF_TEX4|D3DFVF_TEXCOORDSIZE2(0)|D3DFVF_TEXCOORDSIZE2(1)|D3DFVF_TEXCOORDSIZE2(2)|D3DFVF_TEXCOORDSIZE2(3); u32 fvf_filter = (u32)D3DFVF_XYZRHW|D3DFVF_TEX8|D3DFVF_TEXCOORDSIZE4(0)|D3DFVF_TEXCOORDSIZE4(1)|D3DFVF_TEXCOORDSIZE4(2)|D3DFVF_TEXCOORDSIZE4(3)|D3DFVF_TEXCOORDSIZE4(4)|D3DFVF_TEXCOORDSIZE4(5)|D3DFVF_TEXCOORDSIZE4(6)|D3DFVF_TEXCOORDSIZE4(7); rt_Bloom_1.create (r2_RT_bloom1, w,h, fmt); rt_Bloom_2.create (r2_RT_bloom2, w,h, fmt); g_bloom_build.create (fvf_build, RCache.Vertex.Buffer(), RCache.QuadIB); g_bloom_filter.create (fvf_filter, RCache.Vertex.Buffer(), RCache.QuadIB); s_bloom_dbg_1.create ("effects\\screen_set", r2_RT_bloom1); s_bloom_dbg_2.create ("effects\\screen_set", r2_RT_bloom2); s_bloom.create (b_bloom, "r2\\bloom"); f_bloom_factor = 0.5f; } // TONEMAP { rt_LUM_64.create (r2_RT_luminance_t64, 64, 64, D3DFMT_A16B16G16R16F ); rt_LUM_8.create (r2_RT_luminance_t8, 8, 8, D3DFMT_A16B16G16R16F ); s_luminance.create (b_luminance, "r2\\luminance"); f_luminance_adapt = 0.5f; t_LUM_src.create (r2_RT_luminance_src); t_LUM_dest.create (r2_RT_luminance_cur); // create pool for (u32 it=0; it<4; it++) { string256 name; sprintf (name,"%s_%d", r2_RT_luminance_pool,it ); rt_LUM_pool[it].create (name, 1, 1, D3DFMT_R32F ); u_setrt (rt_LUM_pool[it], 0, 0, 0 ); CHK_DX (HW.pDevice->Clear( 0L, NULL, D3DCLEAR_TARGET, 0x7f7f7f7f, 1.0f, 0L)); } u_setrt ( Device.dwWidth,Device.dwHeight,HW.pBaseRT,NULL,NULL,HW.pBaseZB); } // COMBINE { static D3DVERTEXELEMENT9 dwDecl[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, // pos+uv D3DDECL_END() }; s_combine.create (b_combine, "r2\\combine"); s_combine_dbg_0.create ("effects\\screen_set", r2_RT_smap_surf ); s_combine_dbg_1.create ("effects\\screen_set", r2_RT_luminance_t8 ); s_combine_dbg_Accumulator.create ("effects\\screen_set", r2_RT_accum ); g_combine_VP.create (dwDecl, RCache.Vertex.Buffer(), RCache.QuadIB); g_combine.create (FVF::F_TL, RCache.Vertex.Buffer(), RCache.QuadIB); g_combine_2UV.create (FVF::F_TL2uv, RCache.Vertex.Buffer(), RCache.QuadIB); u32 fvf_aa_blur = D3DFVF_XYZRHW|D3DFVF_TEX4|D3DFVF_TEXCOORDSIZE2(0)|D3DFVF_TEXCOORDSIZE2(1)|D3DFVF_TEXCOORDSIZE2(2)|D3DFVF_TEXCOORDSIZE2(3); g_aa_blur.create (fvf_aa_blur, RCache.Vertex.Buffer(), RCache.QuadIB); u32 fvf_aa_AA = D3DFVF_XYZRHW|D3DFVF_TEX7|D3DFVF_TEXCOORDSIZE2(0)|D3DFVF_TEXCOORDSIZE2(1)|D3DFVF_TEXCOORDSIZE2(2)|D3DFVF_TEXCOORDSIZE2(3)|D3DFVF_TEXCOORDSIZE2(4)|D3DFVF_TEXCOORDSIZE4(5)|D3DFVF_TEXCOORDSIZE4(6); g_aa_AA.create (fvf_aa_AA, RCache.Vertex.Buffer(), RCache.QuadIB); t_envmap_0.create (r2_T_envs0); t_envmap_1.create (r2_T_envs1); } // Build textures { // Build material(s) { // Surface R_CHK (D3DXCreateVolumeTexture(HW.pDevice,TEX_material_LdotN,TEX_material_LdotH,4,1,0,D3DFMT_A8L8,D3DPOOL_MANAGED,&t_material_surf)); t_material = Device.Resources->_CreateTexture(r2_material); t_material->surface_set (t_material_surf); // Fill it (addr: x=dot(L,N),y=dot(L,H)) D3DLOCKED_BOX R; R_CHK (t_material_surf->LockBox (0,&R,0,0)); for (u32 slice=0; slice<4; slice++) { for (u32 y=0; y<TEX_material_LdotH; y++) { for (u32 x=0; x<TEX_material_LdotN; x++) { u16* p = (u16*) (LPBYTE (R.pBits) + slice*R.SlicePitch + y*R.RowPitch + x*2); float ld = float(x) / float (TEX_material_LdotN-1); float ls = float(y) / float (TEX_material_LdotH-1) + EPS_S; ls *= powf(ld,1/32.f); float fd,fs; switch (slice) { case 0: { // looks like OrenNayar fd = powf(ld,0.75f); // 0.75 fs = powf(ls,16.f)*.5f; } break; case 1: {// looks like Blinn fd = powf(ld,0.90f); // 0.90 fs = powf(ls,24.f); } break; case 2: { // looks like Phong fd = ld; // 1.0 fs = powf(ls*1.01f,128.f ); } break; case 3: { // looks like Metal float s0 = _abs (1-_abs (0.05f*_sin(33.f*ld)+ld-ls)); float s1 = _abs (1-_abs (0.05f*_cos(33.f*ld*ls)+ld-ls)); float s2 = _abs (1-_abs (ld-ls)); fd = ld; // 1.0 fs = powf (_max(_max(s0,s1),s2), 24.f); fs *= powf (ld,1/7.f); } break; default: fd = fs = 0; } s32 _d = clampr (iFloor (fd*255.5f), 0,255); s32 _s = clampr (iFloor (fs*255.5f), 0,255); if ((y==(TEX_material_LdotH-1)) && (x==(TEX_material_LdotN-1))) { _d = 255; _s=255; } *p = u16 (_s*256 + _d); } } } R_CHK (t_material_surf->UnlockBox (0)); // #ifdef DEBUG // R_CHK (D3DXSaveTextureToFile ("x:\\r2_material.dds",D3DXIFF_DDS,t_material_surf,0)); // #endif } // Build noise table if (1) { // Surfaces D3DLOCKED_RECT R[TEX_jitter_count]; for (int it=0; it<TEX_jitter_count; it++) { string_path name; sprintf (name,"%s%d",r2_jitter,it); R_CHK (D3DXCreateTexture (HW.pDevice,TEX_jitter,TEX_jitter,1,0,D3DFMT_Q8W8V8U8,D3DPOOL_MANAGED,&t_noise_surf[it])); t_noise[it] = Device.Resources->_CreateTexture (name); t_noise[it]->surface_set (t_noise_surf[it]); R_CHK (t_noise_surf[it]->LockRect (0,&R[it],0,0)); } // Fill it, for (u32 y=0; y<TEX_jitter; y++) { for (u32 x=0; x<TEX_jitter; x++) { DWORD data [TEX_jitter_count]; generate_jitter (data,TEX_jitter_count); for (u32 it=0; it<TEX_jitter_count; it++) { u32* p = (u32*) (LPBYTE (R[it].pBits) + y*R[it].Pitch + x*4); *p = data [it]; } } } for (int it=0; it<TEX_jitter_count; it++) { R_CHK (t_noise_surf[it]->UnlockRect(0)); } } } // PP s_postprocess.create ("postprocess"); g_postprocess.create (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_SPECULAR|D3DFVF_TEX3,RCache.Vertex.Buffer(),RCache.QuadIB); // Menu s_menu.create ("distort"); g_menu.create (FVF::F_TL,RCache.Vertex.Buffer(),RCache.QuadIB); // dwWidth = Device.dwWidth; dwHeight = Device.dwHeight; }
IplImage* CvCaptureCAM_VFW::retrieveFrame(int) { BITMAPINFO vfmt; memset( &vfmt, 0, sizeof(vfmt)); BITMAPINFOHEADER& vfmt0 = vfmt.bmiHeader; if( !capWnd ) return 0; const DWORD sz = capGetVideoFormat( capWnd, &vfmt, sizeof(vfmt)); const int prevWidth = frame ? frame->width : 0; const int prevHeight = frame ? frame->height : 0; if( !hdr || hdr->lpData == 0 || sz == 0 ) return 0; if( !frame || frame->width != vfmt0.biWidth || frame->height != vfmt0.biHeight ) { cvReleaseImage( &frame ); frame = cvCreateImage( cvSize( vfmt0.biWidth, vfmt0.biHeight ), 8, 3 ); } if( vfmt0.biCompression != BI_RGB || vfmt0.biBitCount != 24 ) { BITMAPINFOHEADER vfmt1 = icvBitmapHeader( vfmt0.biWidth, vfmt0.biHeight, 24 ); if( hic == 0 || fourcc != vfmt0.biCompression || prevWidth != vfmt0.biWidth || prevHeight != vfmt0.biHeight ) { closeHIC(); hic = ICOpen( MAKEFOURCC('V','I','D','C'), vfmt0.biCompression, ICMODE_DECOMPRESS ); if( hic ) { if( ICDecompressBegin( hic, &vfmt0, &vfmt1 ) != ICERR_OK ) { closeHIC(); return 0; } } } if( !hic || ICDecompress( hic, 0, &vfmt0, hdr->lpData, &vfmt1, frame->imageData ) != ICERR_OK ) { closeHIC(); return 0; } cvFlip( frame, frame, 0 ); } else { IplImage src; cvInitImageHeader( &src, cvSize(vfmt0.biWidth, vfmt0.biHeight), IPL_DEPTH_8U, 3, IPL_ORIGIN_BL, 4 ); cvSetData( &src, hdr->lpData, src.widthStep ); cvFlip( &src, frame, 0 ); } return frame; }
void CRT::create (LPCSTR Name, u32 w, u32 h, D3DFORMAT f) { if (pSurface) return; R_ASSERT (HW.pDevice && Name && Name[0] && w && h); _order = CPU::GetCLK() ; //Device.GetTimerGlobal()->GetElapsed_clk(); HRESULT _hr; dwWidth = w; dwHeight = h; fmt = f; // Get caps D3DCAPS9 caps; R_CHK (HW.pDevice->GetDeviceCaps(&caps)); // Pow2 if (!btwIsPow2(w) || !btwIsPow2(h)) { if (!HW.Caps.raster.bNonPow2) return; } // Check width-and-height of render target surface if (w>caps.MaxTextureWidth) return; if (h>caps.MaxTextureHeight) return; // Select usage u32 usage = 0; if (D3DFMT_D24X8==fmt) usage = D3DUSAGE_DEPTHSTENCIL; else if (D3DFMT_D24S8 ==fmt) usage = D3DUSAGE_DEPTHSTENCIL; else if (D3DFMT_D15S1 ==fmt) usage = D3DUSAGE_DEPTHSTENCIL; else if (D3DFMT_D16 ==fmt) usage = D3DUSAGE_DEPTHSTENCIL; else if (D3DFMT_D16_LOCKABLE==fmt) usage = D3DUSAGE_DEPTHSTENCIL; else if ((D3DFORMAT)MAKEFOURCC('D','F','2','4') == fmt) usage = D3DUSAGE_DEPTHSTENCIL; else usage = D3DUSAGE_RENDERTARGET; // Validate render-target usage _hr = HW.pD3D->CheckDeviceFormat( HW.DevAdapter, HW.DevT, HW.Caps.fTarget, usage, D3DRTYPE_TEXTURE, f ); if (FAILED(_hr)) return; // Try to create texture/surface Device.Resources->Evict (); _hr = HW.pDevice->CreateTexture (w, h, 1, usage, f, D3DPOOL_DEFAULT, &pSurface,NULL); if (FAILED(_hr) || (0==pSurface)) return; // OK #ifdef DEBUG Msg ("* created RT(%s), %dx%d",Name,w,h); #endif // DEBUG R_CHK (pSurface->GetSurfaceLevel (0,&pRT)); pTexture = Device.Resources->_CreateTexture (Name); pTexture->surface_set (pSurface); }
static int v4w_open_videodevice(V4wState *s, int format, MSVideoSize *vsize) { // Initialize COM CoInitialize(NULL); // get a Graph HRESULT hr=s->m_pGraph.CoCreateInstance(CLSID_FilterGraph); if(FAILED(hr)) { return -1; } // get a CaptureGraphBuilder2 #if !defined(_WIN32_WCE) hr=s->m_pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2); #else hr=s->m_pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder); #endif if(FAILED(hr)) { return -2; } // connect capture graph builder with the graph s->m_pBuilder->SetFiltergraph(s->m_pGraph); // get mediacontrol so we can start and stop the filter graph hr=s->m_pGraph.QueryInterface(&(s->m_pControl)); if(FAILED(hr)) { return -3; } // get DXFilter s->m_pDXFilter = new CDXFilter(NULL, &hr, FALSE); if(s->m_pDXFilter==NULL) { return -4; } s->m_pDXFilter->AddRef(); if(FAILED(hr)) { return -4; } CMediaType mt; mt.SetType(&MEDIATYPE_Video); if (format==MS_YUV420P) { GUID m = (GUID)FOURCCMap(MAKEFOURCC('I','4','2','0')); mt.SetSubtype(&m); mt.SetSubtype(&MEDIASUBTYPE_YV12); } else //if (format==MS_RGB24) { mt.SetSubtype(&MEDIASUBTYPE_RGB24); } //mt.SetSubtype(&MEDIASUBTYPE_IYUV); //mt.SetSubtype(&MEDIASUBTYPE_YUYV); //mt.SetSubtype(&MEDIASUBTYPE_RGB24); //mt.SetSampleSize(); mt.formattype = FORMAT_VideoInfo; mt.SetTemporalCompression(FALSE); VIDEOINFO *pvi = (VIDEOINFO *) mt.AllocFormatBuffer(sizeof(VIDEOINFO)); if (NULL == pvi) return E_OUTOFMEMORY; ZeroMemory(pvi, sizeof(VIDEOINFO)); if (format==MS_YUV420P) { pvi->bmiHeader.biCompression = MAKEFOURCC('I','4','2','0'); pvi->bmiHeader.biCompression = MAKEFOURCC('Y','V','1','2'); pvi->bmiHeader.biBitCount = 12; } else { pvi->bmiHeader.biCompression = BI_RGB; pvi->bmiHeader.biBitCount = 24; } pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pvi->bmiHeader.biWidth = vsize->width; pvi->bmiHeader.biHeight = vsize->height; pvi->bmiHeader.biPlanes = 1; pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader); pvi->bmiHeader.biClrImportant = 0; mt.SetSampleSize(pvi->bmiHeader.biSizeImage); mt.SetFormat((BYTE*)pvi, sizeof(VIDEOINFO)); hr = s->m_pDXFilter->SetAcceptedMediaType(&mt); if(FAILED(hr)) { return -5; } hr = s->m_pDXFilter->SetCallback(Callback); if(FAILED(hr)) { return -6; } hr = s->m_pDXFilter->QueryInterface(IID_IBaseFilter, (LPVOID *)&s->m_pIDXFilter); if(FAILED(hr)) { return -7; } hr = s->m_pGraph->AddFilter(s->m_pIDXFilter, L"DXFilter Filter"); if(FAILED(hr)) { return -8; } #ifdef WM6 ICreateDevEnum *pCreateDevEnum = NULL; IEnumMoniker *pEnumMoniker = NULL; IMoniker *pMoniker = NULL; ULONG nFetched = 0; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum); if(FAILED(hr)) { return -9; } hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0); if (FAILED(hr) || pEnumMoniker == NULL) { //printf("no device\n"); return -10; } pEnumMoniker->Reset(); hr = pEnumMoniker->Next(1, &pMoniker, &nFetched); if(FAILED(hr) || pMoniker==NULL) { return -11; } hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&s->m_pDeviceFilter ); if(FAILED(hr)) { return -12; } s->m_pGraph->AddFilter(s->m_pDeviceFilter, L"Device Filter"); pMoniker->Release(); pEnumMoniker->Release(); pCreateDevEnum->Release(); #else WCHAR wzDeviceName[ MAX_PATH + 1 ]; CComVariant varCamName; CPropertyBag PropBag; CComPtr<IPersistPropertyBag> pPropertyBag; GetFirstCameraDriver(wzDeviceName); hr = s->m_pDeviceFilter.CoCreateInstance( CLSID_VideoCapture ); if (FAILED(hr)) { return -8; } s->m_pDeviceFilter.QueryInterface( &pPropertyBag ); varCamName = wzDeviceName; if(( varCamName.vt == VT_BSTR ) == NULL ) { return E_OUTOFMEMORY; } PropBag.Write( L"VCapName", &varCamName ); pPropertyBag->Load( &PropBag, NULL ); pPropertyBag.Release(); hr = s->m_pGraph->AddFilter( s->m_pDeviceFilter, L"Video capture source" ); #endif if (FAILED(hr)) { return -8; } // get null renderer s->m_pNullRenderer = NULL; #if 0 hr=s->m_pNullRenderer.CoCreateInstance(CLSID_NullRenderer); if(FAILED(hr)) { return -13; } #endif if (s->m_pNullRenderer!=NULL) { s->m_pGraph->AddFilter(s->m_pNullRenderer, L"Null Renderer"); } hr = s->m_pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, s->m_pDeviceFilter, s->m_pIDXFilter, s->m_pNullRenderer); if (FAILED(hr)) { //hr = s->m_pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, // &MEDIATYPE_Video, s->m_pDeviceFilter, s->m_pIDXFilter, s->m_pNullRenderer); if (FAILED(hr)) { return -14; } } //m_pDXFilter->SetBufferSamples(TRUE); // Create the System Device Enumerator. IFilterMapper *pMapper = NULL; //IEnumMoniker *pEnum = NULL; IEnumRegFilters *pEnum = NULL; hr = CoCreateInstance(CLSID_FilterMapper, NULL, CLSCTX_INPROC, IID_IFilterMapper, (void **) &pMapper); if (FAILED(hr)) { // Error handling omitted for clarity. } GUID arrayInTypes[2]; arrayInTypes[0] = MEDIATYPE_Video; arrayInTypes[1] = MEDIASUBTYPE_dvsd; hr = pMapper->EnumMatchingFilters( &pEnum, MERIT_HW_COMPRESSOR, // Minimum merit. FALSE, // At least one input pin? MEDIATYPE_NULL, MEDIASUBTYPE_NULL, FALSE, // Must be a renderer? FALSE, // At least one output pin? MEDIATYPE_NULL, MEDIASUBTYPE_NULL); // Enumerate the monikers. //IMoniker *pMoniker; REGFILTER *pMoniker; ULONG cFetched; while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pPropBag = NULL; #if 0 hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); if (SUCCEEDED(hr)) { // To retrieve the friendly name of the filter, do the following: VARIANT varName; VariantInit(&varName); hr = pPropBag->Read(L"FriendlyName", &varName, 0); if (SUCCEEDED(hr)) { // Display the name in your UI somehow. } VariantClear(&varName); // To create an instance of the filter, do the following: IBaseFilter *pFilter; hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter); // Now add the filter to the graph. Remember to release pFilter later. // Clean up. pPropBag->Release(); } pMoniker->Release(); #endif } // Clean up. pMapper->Release(); pEnum->Release(); s_callback = s; hr = s->m_pControl->Run(); if(FAILED(hr)) { return -15; } s->rotregvalue=1; s->pix_fmt = format; s->vsize.height = vsize->height; s->vsize.width = vsize->width; return 0; }
#include <stdio.h> // printf #include <math.h> // sqrt #include <sys/types.h> /*** declarations ***/ #if !defined(MAKEFOURCC) # define MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((uint)((unsigned char)(ch0)) | \ ((uint)((unsigned char)(ch1)) << 8) | \ ((uint)((unsigned char)(ch2)) << 16) | \ ((uint)((unsigned char)(ch3)) << 24 )) #endif static const uint FOURCC_DDS = MAKEFOURCC('D', 'D', 'S', ' '); static const uint FOURCC_DXT1 = MAKEFOURCC('D', 'X', 'T', '1'); static const uint FOURCC_DXT2 = MAKEFOURCC('D', 'X', 'T', '2'); static const uint FOURCC_DXT3 = MAKEFOURCC('D', 'X', 'T', '3'); static const uint FOURCC_DXT4 = MAKEFOURCC('D', 'X', 'T', '4'); static const uint FOURCC_DXT5 = MAKEFOURCC('D', 'X', 'T', '5'); static const uint FOURCC_RXGB = MAKEFOURCC('R', 'X', 'G', 'B'); static const uint FOURCC_ATI1 = MAKEFOURCC('A', 'T', 'I', '1'); static const uint FOURCC_ATI2 = MAKEFOURCC('A', 'T', 'I', '2'); static const uint FOURCC_A2XY = MAKEFOURCC('A', '2', 'X', 'Y'); static const uint FOURCC_DX10 = MAKEFOURCC('D', 'X', '1', '0'); // 32 bit RGB formats. static const uint D3DFMT_R8G8B8 = 20;
//-------------------------------------------------------------------------------------------------------------- SVS* CResourceManager::_CreateVS (LPCSTR _name) { string_path name; strcpy_s (name,_name); if (0 == ::Render->m_skinning) strcat(name,"_0"); if (1 == ::Render->m_skinning) strcat(name,"_1"); if (2 == ::Render->m_skinning) strcat(name,"_2"); LPSTR N = LPSTR (name); map_VS::iterator I = m_vs.find (N); if (I!=m_vs.end()) return I->second; else { SVS* _vs = xr_new<SVS> (); _vs->dwFlags |= xr_resource_flagged::RF_REGISTERED; m_vs.insert (mk_pair(_vs->set_name(name),_vs)); if (0==stricmp(_name,"null")) { _vs->vs = NULL; return _vs; } includer Includer; LPD3DXBUFFER pShaderBuf = NULL; LPD3DXBUFFER pErrorBuf = NULL; LPD3DXSHADER_CONSTANTTABLE pConstants = NULL; HRESULT _hr = S_OK; string_path cname; strconcat (sizeof(cname),cname,::Render->getShaderPath(),_name,".vs"); FS.update_path (cname, "$game_shaders$", cname); // LPCSTR target = NULL; IReader* fs = FS.r_open(cname); R_ASSERT3 (fs, "shader file doesnt exist", cname); // Select target LPCSTR c_target = "vs_2_0"; LPCSTR c_entry = "main"; /*if (HW.Caps.geometry.dwVersion>=CAP_VERSION(3,0)) target="vs_3_0"; else*/ if (HW.Caps.geometry_major>=2) c_target="vs_2_0"; else c_target="vs_1_1"; LPSTR pfs = xr_alloc<char>(fs->length() + 1); strncpy (pfs, (LPCSTR)fs->pointer(), fs->length()); pfs [fs->length()] = 0; if (strstr(pfs, "main_vs_1_1")) { c_target = "vs_1_1"; c_entry = "main_vs_1_1"; } if (strstr(pfs, "main_vs_2_0")) { c_target = "vs_2_0"; c_entry = "main_vs_2_0"; } xr_free(pfs); // vertex R_ASSERT2 (fs,cname); _hr = ::Render->shader_compile(name,LPCSTR(fs->pointer()),fs->length(), NULL, &Includer, c_entry, c_target, D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR /*| D3DXSHADER_PREFER_FLOW_CONTROL*/, &pShaderBuf, &pErrorBuf, NULL); // _hr = D3DXCompileShader (LPCSTR(fs->pointer()),fs->length(), NULL, &Includer, "main", target, D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR, &pShaderBuf, &pErrorBuf, NULL); FS.r_close (fs); if (SUCCEEDED(_hr)) { if (pShaderBuf) { _hr = HW.pDevice->CreateVertexShader ((DWORD*)pShaderBuf->GetBufferPointer(), &_vs->vs); if (SUCCEEDED(_hr)) { LPCVOID data = NULL; _hr = D3DXFindShaderComment ((DWORD*)pShaderBuf->GetBufferPointer(),MAKEFOURCC('C','T','A','B'),&data,NULL); if (SUCCEEDED(_hr) && data) { pConstants = LPD3DXSHADER_CONSTANTTABLE(data); _vs->constants.parse (pConstants,0x2); } else _hr = E_FAIL; } } else _hr = E_FAIL; } else { VERIFY (pErrorBuf); Log ("! error: ",(LPCSTR)pErrorBuf->GetBufferPointer()); } _RELEASE (pShaderBuf); _RELEASE (pErrorBuf); pConstants = NULL; R_CHK (_hr); return _vs; } }
MS_GUID(IID_IDirectXVideoAccelerationService, 0xfc51a550, 0xd5e7, 0x11d9, 0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02); MS_GUID (DXVA_NoEncrypt, 0x1b81bed0, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); DEFINE_GUID(DXVA_Intel_H264_NoFGT_ClearVideo, 0x604F8E68, 0x4951, 0x4c54, 0x88, 0xFE, 0xAB, 0xD2, 0x5C, 0x15, 0xB3, 0xD6); /* */ typedef struct { const char *name; D3DFORMAT format; vlc_fourcc_t codec; } d3d_format_t; /* XXX Prefered format must come first */ static const d3d_format_t d3d_formats[] = { { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_YV12 }, { "NV12", MAKEFOURCC('N','V','1','2'), VLC_CODEC_NV12 }, { "IMC3", MAKEFOURCC('I','M','C','3'), VLC_CODEC_YV12 }, { NULL, 0, 0 } }; static const d3d_format_t *D3dFindFormat(D3DFORMAT format) { for (unsigned i = 0; d3d_formats[i].name; i++) { if (d3d_formats[i].format == format) return &d3d_formats[i]; } return NULL; }
#include "movie.h" #include <mmsystem.h> #include <Aviriff.h> #include <io.h> #include "graphic.h" #include "soundDS.h" #include "keyInput.h" CMovie *lpMovie = NULL; #define INIT_DIRECTDRAW_STRUCT(x) (ZeroMemory(&x, sizeof(x)), x.dwSize=sizeof(x)) DWORD DDColorMatch(IDirectDrawSurface7 * pdds, COLORREF rgb); DWORD WINAPI movieThread(LPVOID param); DDPIXELFORMAT g_ddpfOverlayFormats[] = { {sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','1','2'),0,0,0,0,0}, {sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','U','Y','2'),0,0,0,0,0}, {sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0}, {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0xff0000, 0x0ff00, 0x00ff, 0}, {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0xff0000, 0x0ff00, 0x00ff, 0}, {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x7C00, 0x03e0, 0x001F, 0}, {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0xF800, 0x07e0, 0x001F, 0}, }; int overlay_forcc[] = { XVID_CSP_YV12,XVID_CSP_YUY2,XVID_CSP_UYVY, XVID_CSP_BGRA,XVID_CSP_BGR,XVID_CSP_RGB555,XVID_CSP_RGB565, XVID_CSP_BGR}; CMovie::CMovie() { ZeroMemory(this,sizeof(CMovie));
bool CPythonNonPlayer::LoadNonPlayerData(const char * c_szFileName) { static DWORD s_adwMobProtoKey[4] = { 4813894, 18955, 552631, 6822045 }; CMappedFile file; LPCVOID pvData; Tracef("CPythonNonPlayer::LoadNonPlayerData: %s, sizeof(TMobTable)=%u\n", c_szFileName, sizeof(TMobTable)); if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData)) return false; DWORD dwFourCC, dwElements, dwDataSize; file.Read(&dwFourCC, sizeof(DWORD)); if (dwFourCC != MAKEFOURCC('M', 'M', 'P', 'T')) { TraceError("CPythonNonPlayer::LoadNonPlayerData: invalid Mob proto type %s", c_szFileName); return false; } file.Read(&dwElements, sizeof(DWORD)); file.Read(&dwDataSize, sizeof(DWORD)); BYTE * pbData = new BYTE[dwDataSize]; file.Read(pbData, dwDataSize); ///// CLZObject zObj; if (!CLZO::Instance().Decompress(zObj, pbData, s_adwMobProtoKey)) { delete [] pbData; return false; } if ((zObj.GetSize() % sizeof(TMobTable)) != 0) { TraceError("CPythonNonPlayer::LoadNonPlayerData: invalid size %u check data format.", zObj.GetSize()); return false; } TMobTable * pTable = (TMobTable *) zObj.GetBuffer(); for (DWORD i = 0; i < dwElements; ++i, ++pTable) { TMobTable * pNonPlayerData = new TMobTable; memcpy(pNonPlayerData, pTable, sizeof(TMobTable)); //TraceError("%d : %s type[%d] color[%d]", pNonPlayerData->dwVnum, pNonPlayerData->szLocaleName, pNonPlayerData->bType, pNonPlayerData->dwMonsterColor); m_NonPlayerDataMap.insert(TNonPlayerDataMap::value_type(pNonPlayerData->dwVnum, pNonPlayerData)); } delete [] pbData; return true; }
int CAreManager::LoadEffectGroups( string LoadName ) { CEffectReadFile File( LoadName.data(), true ); if( File.fail() ) { ostringstream strm; strm<<"无法打开文件:"<<LoadName<<endl; GenErr(strm.str()); return GERROR; } DWORD Res; DWORD Version; File.read( (char*)&Res, sizeof(DWORD) ); File.read( (char*)&Version, sizeof(DWORD) ); if( Res != MAKEFOURCC( 'E', 'F', 'X', 0 ) || Version < ARE_VERSION - 3 || Version > ARE_VERSION ) { ostringstream strm; strm<<"版本不正确,当前程序版本:"<<ARE_VERSION/10000.0f<<"\t"<<LoadName<<"文件版本:"<<Version/10000.0f<<endl; GenErr(strm.str()); return GERROR; } vector<char> Temp; int Size; int GroupSize; File.read( (char*)&GroupSize, sizeof(int) ); for( int i = 0; i < GroupSize; i++ ) { File.read( (char*)&Size, sizeof(int) ); Temp.resize( Size + 1 ); memset( &Temp[0], 0, Size + 1 ); File.read( &Temp[0], Size ); string str = &Temp[0]; if( m_pEffects.find( str ) != m_pEffects.end() ) return GERROR; m_pEffects[str] = map< string, CPakEffect* >(); map< string, map< string, CPakEffect* > >::iterator itGroup = m_pEffects.find( str ); int EffectSize; File.read( (char*)&EffectSize, sizeof(int) ); for( int j = 0; j < EffectSize; j++ ) { string str; LoadStringT( File, str ); if( itGroup->second.find( str ) != itGroup->second.end() ) return GERROR; itGroup->second[str] = new CPakEffect(this); map< string, CPakEffect* >::iterator itEffect = itGroup->second.find( str ); if( FAILED( itEffect->second->LoadBin( File, Version, itGroup->first + "\\" + str ) ) ) return GERROR; } } return 0; }
//------------------------------------------------------------------------- // 解析一个文件 bool FKRenderObjModel::LoadFromFKOFile( const string& strFKOFilePathName ) { string szFKOFilePathName = strFKOFilePathName; if( szFKOFilePathName.empty() ) { szFKOFilePathName = m_strObjName; } if( szFKOFilePathName.empty() ) return false; szFKOFilePathName = CCFileUtils::sharedFileUtils()->fullPathForFilename( szFKOFilePathName.c_str() ); const string strTemp = szFKOFilePathName; FKCW_IO_AssetInputStream* pStream = FKCW_IO_AssetInputStream::Create( strTemp ); if( pStream == NULL ) return false; if( !pStream->Open() ) return false; int nHeadFlag = 0; pStream->ReadInt( &nHeadFlag ); if( nHeadFlag != MAKEFOURCC( 'F', 'K', 'O', 0 ) ) return false; pStream->ReadInt( &m_nVersion ); char szTmp[MAX_PATH]; memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); m_pOffset.x = (float)FKCW_Base_Utils::AtoF( szTmp ); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); m_pOffset.y = (float)FKCW_Base_Utils::AtoF( szTmp ); int nStrLen = 0; { int nSize = 0; pStream->ReadInt( &nSize ); m_mapObjParts.clear(); for( int i = 0; i < nSize; ++i ) { SObjPart tagPart; memset( szTmp, 0, MAX_PATH ); nStrLen = 0; pStream->ReadInt( &nStrLen ); pStream->Read( szTmp, nStrLen ); tagPart.m_strName = string(szTmp); memset( szTmp, 0, MAX_PATH ); nStrLen = 0; pStream->ReadInt( &nStrLen ); pStream->Read( szTmp, nStrLen ); tagPart.m_strFile = string(szTmp); pStream->ReadInt( &tagPart.m_nDepth ); m_mapObjParts[tagPart.m_strName] = tagPart; } } { int nSize = 0; pStream->ReadInt( &nSize ); m_mapObjLocators.clear(); for( int i = 0; i < nSize; ++i ) { SObjLocator tagLocator; memset( szTmp, 0, MAX_PATH ); nStrLen = 0; pStream->ReadInt( &nStrLen ); pStream->Read( szTmp, nStrLen ); tagLocator.m_strName = string(szTmp); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); tagLocator.m_tagOffset.x = (float)FKCW_Base_Utils::AtoF( szTmp ); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); tagLocator.m_tagOffset.y = (float)FKCW_Base_Utils::AtoF( szTmp ); m_mapObjLocators[tagLocator.m_strName] = tagLocator; } } { int nSize = 0; pStream->ReadInt( &nSize ); m_mapObjEffects.clear(); for( int i = 0; i < nSize; ++i ) { SObjEffect tagEffect; memset( szTmp, 0, MAX_PATH ); nStrLen = 0; pStream->ReadInt( &nStrLen ); pStream->Read( szTmp, nStrLen ); tagEffect.m_strName = string(szTmp); memset( szTmp, 0, MAX_PATH ); nStrLen = 0; pStream->ReadInt( &nStrLen ); pStream->Read( szTmp, nStrLen ); tagEffect.m_strFileName = string(szTmp); memset( szTmp, 0, MAX_PATH ); nStrLen = 0; pStream->ReadInt( &nStrLen ); pStream->Read( szTmp, nStrLen ); tagEffect.m_strLocator = string(szTmp); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); tagEffect.m_tagOffset.x = (float)FKCW_Base_Utils::AtoF( szTmp ); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); tagEffect.m_tagOffset.y = (float)FKCW_Base_Utils::AtoF( szTmp ); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); tagEffect.m_tagScale.x = (float)FKCW_Base_Utils::AtoF( szTmp ); memset( szTmp, 0, MAX_PATH ); pStream->Read( szTmp, sizeof(float) ); tagEffect.m_tagScale.y = (float)FKCW_Base_Utils::AtoF( szTmp ); pStream->ReadInt( &tagEffect.m_nDepth ); pStream->ReadByte( (char*)&tagEffect.m_tagColor.r ); pStream->ReadByte( (char*)&tagEffect.m_tagColor.g ); pStream->ReadByte( (char*)&tagEffect.m_tagColor.b ); pStream->ReadByte( (char*)&tagEffect.m_tagColor.a ); m_mapObjEffects[tagEffect.m_strName] = tagEffect; } } pStream->Close(); return true; }
void MediaStreamer::Initialize(_In_ const WCHAR* url) { BasicReaderWriter^ reader = ref new BasicReaderWriter(); Platform::Array<byte>^ data = reader->ReadData(ref new Platform::String(url)); UINT32 length = data->Length; const byte* dataPtr = data->Data; UINT32 offset = 0; DWORD riffDataSize = 0; auto ReadChunk = [&](DWORD fourcc, DWORD& outChunkSize, DWORD& outChunkPos) -> HRESULT { while (true) { if (offset + sizeof(DWORD) * 2 >= length) { return E_FAIL; } // Read two DWORDs. DWORD chunkType = *reinterpret_cast<const DWORD*>(&dataPtr[offset]); DWORD chunkSize = *reinterpret_cast<const DWORD*>(&dataPtr[offset + sizeof(DWORD)]); offset += sizeof(DWORD) * 2; if (chunkType == MAKEFOURCC('R', 'I', 'F', 'F')) { riffDataSize = chunkSize; chunkSize = sizeof(DWORD); outChunkSize = sizeof(DWORD); outChunkPos = offset; } else { outChunkSize = chunkSize; outChunkPos = offset; } offset += chunkSize; if (chunkType == fourcc) { return S_OK; } } }; // Locate riff chunk, check the file type. DWORD chunkSize = 0; DWORD chunkPos = 0; DX::ThrowIfFailed(ReadChunk(MAKEFOURCC('R', 'I', 'F', 'F'), chunkSize, chunkPos)); if (*reinterpret_cast<const DWORD *>(&dataPtr[chunkPos]) != MAKEFOURCC('W', 'A', 'V', 'E')) DX::ThrowIfFailed(E_FAIL); // Locate 'fmt ' chunk, copy to WAVEFORMATEXTENSIBLE. DX::ThrowIfFailed(ReadChunk(MAKEFOURCC('f', 'm', 't', ' '), chunkSize, chunkPos)); DX::ThrowIfFailed((chunkSize <= sizeof(m_waveFormat)) ? S_OK : E_FAIL); CopyMemory(&m_waveFormat, &dataPtr[chunkPos], chunkSize); // Locate the 'data' chunk and copy its contents to a buffer. DX::ThrowIfFailed(ReadChunk(MAKEFOURCC('d', 'a', 't', 'a'), chunkSize, chunkPos)); m_data.resize(chunkSize); CopyMemory(m_data.data(), &dataPtr[chunkPos], chunkSize); m_offset = 0; }
//------------------------------------------------------------------------- // 保存10001版本的文件 bool FKRenderObjModel::__SaveToFKOFile_10001( const string& strFKOFilePathName ) { int nVersion = CUR_FILE_VERSION; string szFKOFilePathName = strFKOFilePathName; if( szFKOFilePathName.empty() ) { szFKOFilePathName = m_strObjName; } if( szFKOFilePathName.empty() ) return false; szFKOFilePathName = CCFileUtils::sharedFileUtils()->fullPathForFilename( szFKOFilePathName.c_str() ); FKCW_IO_AssetOutputStream* pWriter = FKCW_IO_AssetOutputStream::Create( szFKOFilePathName, false ); if( pWriter == NULL ) return false; if( !pWriter->Open() ) return false; { // 开始实际写入 int nHeadFlag = MAKEFOURCC( 'F', 'K', 'O', 0 ); pWriter->Write( (const char*)((void*)&nHeadFlag), sizeof( int ) ); pWriter->Write( (const char*)((void*)&nVersion), sizeof( int ) ); pWriter->Write( (const char*)((void*)&m_pOffset.x), sizeof( float ) ); pWriter->Write( (const char*)((void*)&m_pOffset.y), sizeof( float ) ); { unsigned int unSize = m_mapObjParts.size(); pWriter->Write( (const char*)((void*)&unSize), sizeof( unsigned int ) ); ObjPartMap::iterator Ite = m_mapObjParts.begin(); for( ; Ite != m_mapObjParts.end(); ++Ite ) { int nLen = 0; nLen = Ite->second.m_strName.length(); pWriter->Write( (const char*)((void*)&nLen), sizeof( unsigned int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_strName)), nLen ); nLen = Ite->second.m_strFile.length(); pWriter->Write( (const char*)((void*)&nLen), sizeof( unsigned int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_strFile)), nLen ); pWriter->Write( (const char*)((void*)&(Ite->second.m_nDepth)), sizeof( int ) ); } } { unsigned int unSize = m_mapObjLocators.size(); pWriter->Write( (const char*)((void*)&unSize), sizeof( unsigned int ) ); ObjLocatorMap::iterator Ite = m_mapObjLocators.begin(); for( ; Ite != m_mapObjLocators.end(); ++Ite ) { int nLen = 0; nLen = Ite->second.m_strName.length(); pWriter->Write( (const char*)((void*)&nLen), sizeof( unsigned int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_strName)), nLen ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagOffset.x)), sizeof( float ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagOffset.y)), sizeof( float ) ); } } { unsigned int unSize = m_mapObjEffects.size(); pWriter->Write( (const char*)((void*)&unSize), sizeof( unsigned int ) ); ObjEffectMap::iterator Ite = m_mapObjEffects.begin(); for( ; Ite != m_mapObjEffects.end(); ++Ite ) { int nLen = 0; nLen = Ite->second.m_strName.length(); pWriter->Write( (const char*)((void*)&nLen), sizeof( unsigned int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_strName)), nLen ); nLen = Ite->second.m_strFileName.length(); pWriter->Write( (const char*)((void*)&nLen), sizeof( unsigned int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_strFileName)), nLen ); nLen = Ite->second.m_strLocator.length(); pWriter->Write( (const char*)((void*)&nLen), sizeof( unsigned int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_strLocator)), nLen ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagOffset.x)), sizeof( float ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagOffset.y)), sizeof( float ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagScale.x)), sizeof( float ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagScale.y)), sizeof( float ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_nDepth)), sizeof( int ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagColor.r)), sizeof( unsigned char ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagColor.g)), sizeof( unsigned char ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagColor.b)), sizeof( unsigned char ) ); pWriter->Write( (const char*)((void*)&(Ite->second.m_tagColor.a)), sizeof( unsigned char ) ); } } } pWriter->Close(); return true; }
/** \fn setup \brief Allocate stuff for a given display with/height. It is called again each time the zoom is changed */ bool dxvaRender::setup() { D3DVIEWPORT9 viewPort = {0, 0, displayWidth, displayHeight, 0, 1}; ADM_info("D3D (re)Setting up \n"); D3DPRESENT_PARAMETERS presentationParameters; memset(&presentationParameters, 0, sizeof(presentationParameters)); presentationParameters.Windowed = TRUE; presentationParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; // We could use copy, but discard seems faster according to ms presentationParameters.Flags = D3DPRESENTFLAG_VIDEO; presentationParameters.hDeviceWindow = windowId; presentationParameters.BackBufferWidth = displayWidth; presentationParameters.BackBufferHeight = displayHeight; presentationParameters.MultiSampleType = D3DMULTISAMPLE_NONE; presentationParameters.PresentationInterval = D3DPRESENT_INTERVAL_ONE; presentationParameters.BackBufferFormat = displayMode.Format; presentationParameters.BackBufferCount = 1; presentationParameters.EnableAutoDepthStencil = FALSE; #ifndef REUSE_DEVICE if(ADM_FAILED(IDirect3D9_CreateDevice( d3dHandle, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, presentationParameters.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &presentationParameters, &d3dDevice))) { ADM_warning("Failed to create D3D device\n"); return false; } #else d3dDevice=admD3D::getDevice(); #endif // D3DFORMAT yv12=(D3DFORMAT)MAKEFOURCC('Y','V','1','2'); // if( ADM_FAILED(IDirect3DDevice9_CreateOffscreenPlainSurface( d3dDevice, displayWidth,displayHeight, displayMode.Format, D3DPOOL_DEFAULT, &mySurface, NULL))) { ADM_warning("D3D Cannot create surface\n"); return false; } if( ADM_FAILED(IDirect3DDevice9_CreateOffscreenPlainSurface( d3dDevice, imageWidth,imageHeight, yv12, D3DPOOL_DEFAULT, &myYV12Surface, NULL))) { ADM_warning("D3D Cannot create surface\n"); return false; } // put some defaults IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_SRCBLEND, D3DBLEND_ONE); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_ALPHAFUNC, D3DCMP_GREATER); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_ALPHAREF, (DWORD)0x0); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_LIGHTING, FALSE); IDirect3DDevice9_SetSamplerState(d3dDevice, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); IDirect3DDevice9_SetSamplerState(d3dDevice, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); // if(ADM_FAILED(IDirect3DDevice9_SetViewport(d3dDevice, &viewPort))) { ADM_warning("D3D Cannot set D3D viewport\n"); return false; } scaler=new ADMColorScalerFull(ADM_CS_BICUBIC,imageWidth,imageHeight,displayWidth,displayHeight, ADM_COLOR_YV12, ADM_COLOR_RGB32A ); videoBuffer=new uint8_t[displayWidth*displayHeight*4]; panScan.left =0; panScan.right =imageWidth-1; panScan.top =0; panScan.bottom=imageHeight-1; targetRect.left =0; targetRect.right =displayWidth-1; targetRect.top =0; targetRect.bottom=displayHeight-1; ADM_info("Setup done\n"); return true; }
uint32_t reserved2; } DDS_HEADER; typedef struct { DXGI_FORMAT dxgiFormat; uint32_t resourceDimension; uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG uint32_t arraySize; uint32_t reserved; } DDS_HEADER_DXT10; #pragma pack(pop) static const DDS_PIXELFORMAT DDSPF_DXT1 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 }; static const DDS_PIXELFORMAT DDSPF_DXT3 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 }; static const DDS_PIXELFORMAT DDSPF_DXT5 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 }; static const DDS_PIXELFORMAT DDSPF_BC4_UNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','U'), 0, 0, 0, 0, 0 }; static const DDS_PIXELFORMAT DDSPF_BC4_SNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','S'), 0, 0, 0, 0, 0 }; static const DDS_PIXELFORMAT DDSPF_BC5_UNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','U'), 0, 0, 0, 0, 0 };
bool Image_DXTC::LoadFromFile(LPCSTR filename ) { if( m_pCompBytes != NULL ) { free( m_pCompBytes ); m_pCompBytes = NULL; } // only understands .dds files for now // return true if success char * exts[] = { ".DDS" }; int next = 1; char fileupper[256]; strcpy( fileupper, filename); strupr( fileupper ); //TRACE( "\n" ); //TRACE( "\n" ); int i; bool knownformat = false; for( i=0; i < next; i++ ) { char * found = strstr( fileupper, exts[0] ); if( found != NULL ) { knownformat = true; break; } } if( knownformat == false ) { //TRACE("Unknown file format encountered! [%s]\n", filename ); return( false ); } //TRACE("\n\nLoading file [%s]\n", filename ); FILE * file = fopen( filename, "rb" ); if( file == NULL ) { //TRACE("Can't open file for reading! [%s]\n", filename ); return( false ); } ////////////////////////////////////// // start reading the file // from Microsoft's mssdk D3DIM example "Compress" DDSURFACEDESC2 ddsd; DWORD dwMagic; // Read magic number fread( &dwMagic, sizeof(DWORD), 1, file ); if( dwMagic != MAKEFOURCC('D','D','S',' ') ) { fclose( file ); return( false); } // Read the surface description fread( &ddsd, sizeof(DDSURFACEDESC2), 1, file ); // Does texture have mipmaps? m_bMipTexture = ( ddsd.dwMipMapCount > 0 ) ? TRUE : FALSE; // Clear unwanted flags // Can't do this!!! surface not re-created here // ddsd.dwFlags &= (~DDSD_PITCH); // ddsd.dwFlags &= (~DDSD_LINEARSIZE); // Is it DXTC ? // I sure hope pixelformat is valid! DecodePixelFormat( m_strFormat, &( ddsd.ddpfPixelFormat ) ); if( m_CompFormat == PF_DXT1 || m_CompFormat == PF_DXT2 || m_CompFormat == PF_DXT3 || m_CompFormat == PF_DXT4 || m_CompFormat == PF_DXT5 ) { //TRACE("Yay, a recognized format!\n\n"); } else { //TRACE("Format is %s. Not loading!\n", m_strFormat ); return( false ); } //TRACE("ddsd.dwLinearSize: %d\n", ddsd.dwLinearSize ); //TRACE("ddsd.dwHeight: %d\n", ddsd.dwHeight ); //TRACE("ddsd.dwWidth: %d\n", ddsd.dwWidth ); //TRACE("w * h %d\n", ddsd.dwWidth * ddsd.dwHeight ); // Store the return copy of this surfacedesc m_DDSD = ddsd; m_nHeight = ddsd.dwHeight; m_nWidth = ddsd.dwWidth; // Read only first mip level for now: if( ddsd.dwFlags & DDSD_LINEARSIZE ) { //TRACE("dwFlags has DDSD_LINEARSIZE\n"); m_pCompBytes = (BYTE*)calloc( ddsd.dwLinearSize, sizeof(BYTE) ); if( m_pCompBytes == NULL ) { //TRACE("Can't allocate m_pCompBytes on file read!\n"); return( false ); } fread( m_pCompBytes, ddsd.dwLinearSize, 1, file ); } else { //TRACE("dwFlags file doesn't have linearsize set\n"); DWORD dwBytesPerRow = ddsd.dwWidth * ddsd.ddpfPixelFormat.dwRGBBitCount / 8; m_pCompBytes = (BYTE*) calloc( ddsd.lPitch * ddsd.dwHeight, sizeof(BYTE) ); m_nCompSize = ddsd.lPitch * ddsd.dwHeight; m_nCompLineSz = dwBytesPerRow; if( m_pCompBytes == NULL ) { //TRACE("Can't allocate m_pCompBytes on file read!\n"); return( false ); } BYTE* pDest = m_pCompBytes; for( DWORD yp = 0; yp < ddsd.dwHeight; yp++ ) { fread( pDest, dwBytesPerRow, 1, file ); pDest += ddsd.lPitch; } } // done reading file fclose( file ); file = NULL; return( true ); }
return VLC_SUCCESS; } typedef struct { const char *name; D3DFORMAT format; /* D3D format */ vlc_fourcc_t fourcc; /* VLC fourcc */ uint32_t rmask; uint32_t gmask; uint32_t bmask; } d3d_format_t; static const d3d_format_t d3d_formats[] = { /* YV12 is always used for planar 420, the planes are then swapped in Lock() */ { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_YV12, 0,0,0 }, { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_I420, 0,0,0 }, { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_J420, 0,0,0 }, { "UYVY", D3DFMT_UYVY, VLC_CODEC_UYVY, 0,0,0 }, { "YUY2", D3DFMT_YUY2, VLC_CODEC_YUYV, 0,0,0 }, { "X8R8G8B8", D3DFMT_X8R8G8B8,VLC_CODEC_RGB32, 0xff0000, 0x00ff00, 0x0000ff }, { "A8R8G8B8", D3DFMT_A8R8G8B8,VLC_CODEC_RGB32, 0xff0000, 0x00ff00, 0x0000ff }, { "8G8B8", D3DFMT_R8G8B8, VLC_CODEC_RGB24, 0xff0000, 0x00ff00, 0x0000ff }, { "R5G6B5", D3DFMT_R5G6B5, VLC_CODEC_RGB16, 0x1f<<11, 0x3f<<5, 0x1f<<0 }, { "X1R5G5B5", D3DFMT_X1R5G5B5,VLC_CODEC_RGB15, 0x1f<<10, 0x1f<<5, 0x1f<<0 }, { NULL, 0, 0, 0,0,0} }; /** * It returns the format (closest to chroma) that can be converted to target */
IplImage* CvCaptureCAM_VFW::retrieveFrame(int) { BITMAPINFO vfmt; memset( &vfmt, 0, sizeof(vfmt)); BITMAPINFOHEADER& vfmt0 = vfmt.bmiHeader; if( !capWnd ) return 0; const DWORD sz = capGetVideoFormat( capWnd, &vfmt, sizeof(vfmt)); const int prevWidth = frame ? frame->width : 0; const int prevHeight = frame ? frame->height : 0; if( !hdr || hdr->lpData == 0 || sz == 0 ) return 0; if( !frame || frame->width != vfmt0.biWidth || frame->height != vfmt0.biHeight ) { cvReleaseImage( &frame ); frame = cvCreateImage( cvSize( vfmt0.biWidth, vfmt0.biHeight ), 8, 3 ); } if ( vfmt0.biCompression == MAKEFOURCC('N','V','1','2') ) { // Frame is in YUV 4:2:0 NV12 format, convert to BGR color space // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx#nv12) IplImage src; cvInitImageHeader( &src, cvSize( vfmt0.biWidth, vfmt0.biHeight * 3 / 2 ), IPL_DEPTH_8U, 1, IPL_ORIGIN_BL, 4 ); cvSetData( &src, hdr->lpData, src.widthStep ); cvCvtColor( &src, frame, CV_YUV2BGR_NV12 ); } else if( vfmt0.biCompression != BI_RGB || vfmt0.biBitCount != 24 ) { BITMAPINFOHEADER vfmt1 = icvBitmapHeader( vfmt0.biWidth, vfmt0.biHeight, 24 ); if( hic == 0 || fourcc != vfmt0.biCompression || prevWidth != vfmt0.biWidth || prevHeight != vfmt0.biHeight ) { closeHIC(); hic = ICOpen( MAKEFOURCC('V','I','D','C'), vfmt0.biCompression, ICMODE_DECOMPRESS ); if( hic ) { if( ICDecompressBegin( hic, &vfmt0, &vfmt1 ) != ICERR_OK ) { closeHIC(); return 0; } } } if( !hic || ICDecompress( hic, 0, &vfmt0, hdr->lpData, &vfmt1, frame->imageData ) != ICERR_OK ) { closeHIC(); return 0; } cvFlip( frame, frame, 0 ); } else { IplImage src; cvInitImageHeader( &src, cvSize(vfmt0.biWidth, vfmt0.biHeight), IPL_DEPTH_8U, 3, IPL_ORIGIN_BL, 4 ); cvSetData( &src, hdr->lpData, src.widthStep ); cvFlip( &src, frame, 0 ); } return frame; }
int try_format_size(V4wState *s, int format, int width, int height, GUID *pPinCategory) { HRESULT hr=S_OK; IEnumPins *pEnum=0; ULONG ulFound; IPin *pPin; GUID guid_format; DWORD biCompression; DWORD biBitCount; // Verify input if (!s->m_pDeviceFilter) return -1; if (format == MS_YUV420P) guid_format = (GUID)FOURCCMap(MAKEFOURCC('I','4','2','0')); else if (format == MS_YUYV) guid_format = MEDIASUBTYPE_YUYV; else if (format == MS_UYVY) guid_format = MEDIASUBTYPE_UYVY; else if (format == MS_RGB24) guid_format = MEDIASUBTYPE_RGB24; else if (format == MS_YUY2) guid_format = MEDIASUBTYPE_YUY2; if (format == MS_YUV420P) biCompression = MAKEFOURCC('I','4','2','0'); else if (format == MS_YUYV) biCompression = MAKEFOURCC('Y','U','Y','V'); else if (format == MS_UYVY) biCompression = MAKEFOURCC('U','Y','V','Y'); else if (format == MS_RGB24) biCompression = BI_RGB; else if (format == MS_YUY2) biCompression = MAKEFOURCC('Y','U','Y','2'); if (format == MS_YUV420P) biBitCount = 12; else if (format == MS_YUYV) biBitCount = 16; else if (format == MS_UYVY) biBitCount = 16; else if (format == MS_RGB24) biBitCount = 24; else if (format == MS_YUY2) biBitCount = 16; // Get pin enumerator hr = s->m_pDeviceFilter->EnumPins(&pEnum); if(FAILED(hr)) return -1; pEnum->Reset(); // Count every pin on the filter while(S_OK == pEnum->Next(1, &pPin, &ulFound)) { PIN_DIRECTION pindir = (PIN_DIRECTION) 3; hr = pPin->QueryDirection(&pindir); if(pindir != PINDIR_INPUT) { IEnumMediaTypes *ppEnum; ULONG ulFound2; hr = pPin->EnumMediaTypes(&ppEnum); if(FAILED(hr)) continue; GUID pCurrentPinCategory; GetPinCategory(pPin, &pCurrentPinCategory); if (*pPinCategory!=pCurrentPinCategory) continue; AM_MEDIA_TYPE *ppMediaTypes; while(S_OK == ppEnum->Next(1, &ppMediaTypes, &ulFound2)) { if (ppMediaTypes->formattype != FORMAT_VideoInfo) continue; if (ppMediaTypes->majortype != MEDIATYPE_Video) continue; if (ppMediaTypes->subtype != guid_format) continue; VIDEOINFO *pvi = (VIDEOINFO *)ppMediaTypes->pbFormat; if (pvi->bmiHeader.biCompression!=biCompression) continue; if (pvi->bmiHeader.biBitCount!=biBitCount) continue; if (pvi->bmiHeader.biHeight!=height) continue; if (pvi->bmiHeader.biWidth!=width) continue; s->vsize.width = width; s->vsize.height = height; pPin->Release(); pEnum->Release(); return 0; } } pPin->Release(); } pEnum->Release(); return -1; }