//DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) HDRVR DrvOpen(LPARAM lParam2) { NPDRVR hDriver; char unknown[0x124]; const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; #ifdef WIN32_LOADER Setup_LDT_Keeper(); #endif printf("Loading codec DLL: '%s'\n",filename); hDriver = malloc(sizeof(DRVR)); if (!hDriver) return (HDRVR) 0; memset((void*)hDriver, 0, sizeof(DRVR)); #ifdef WIN32_LOADER CodecAlloc(); Setup_FS_Segment(); #endif hDriver->hDriverModule = LoadLibraryA(filename); if (!hDriver->hDriverModule) { printf("Can't open library %s\n", filename); DrvClose((HDRVR)hDriver); return (HDRVR) 0; } hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, "DriverProc"); if (!hDriver->DriverProc) { printf("Library %s is not a valid VfW/ACM codec\n", filename); DrvClose((HDRVR)hDriver); return (HDRVR) 0; } TRACE("DriverProc == %X\n", hDriver->DriverProc); SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); TRACE("DRV_LOAD Ok!\n"); SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); TRACE("DRV_ENABLE Ok!\n"); hDriver->dwDriverID = ++dwDrvID; // generate new id // open driver and remmeber proper DriverID hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule); return (HDRVR)hDriver; }
/*********************************************************************** * acmStreamOpen (MSACM32.40) */ MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc, PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen) { PWINE_ACMSTREAM was; PWINE_ACMDRIVER wad; MMRESULT ret; int wfxSrcSize; int wfxDstSize; TRACE("(%p, 0x%08x, %p, %p, %p, %ld, %ld, %ld)\n", phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen); TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec, pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize); TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec, pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize); #define SIZEOF_WFX(wfx) (sizeof(WAVEFORMATEX) + ((wfx->wFormatTag == WAVE_FORMAT_PCM) ? 0 : wfx->cbSize)) wfxSrcSize = SIZEOF_WFX(pwfxSrc); wfxDstSize = SIZEOF_WFX(pwfxDst); #undef SIZEOF_WFX was = (PWINE_ACMSTREAM) HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize + ((pwfltr) ? sizeof(WAVEFILTER) : 0)); if (was == NULL) return MMSYSERR_NOMEM; was->drvInst.cbStruct = sizeof(was->drvInst); was->drvInst.pwfxSrc = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was)); memcpy(was->drvInst.pwfxSrc, pwfxSrc, wfxSrcSize); // LHACM is checking for 0x1 // but if this will not help // was->drvInst.pwfxSrc->wFormatTag = 1; was->drvInst.pwfxDst = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was) + wfxSrcSize); memcpy(was->drvInst.pwfxDst, pwfxDst, wfxDstSize); if (pwfltr) { was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize); memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER)); } else { was->drvInst.pwfltr = NULL; } was->drvInst.dwCallback = dwCallback; was->drvInst.dwInstance = dwInstance; was->drvInst.fdwOpen = fdwOpen; was->drvInst.fdwDriver = 0L; was->drvInst.dwDriver = 0L; was->drvInst.has = (HACMSTREAM)was; if (had) { if (!(wad = MSACM_GetDriver(had))) { ret = MMSYSERR_INVALPARAM; goto errCleanUp; } was->obj.pACMDriverID = wad->obj.pACMDriverID; was->pDrv = wad; was->hAcmDriver = 0; /* not to close it in acmStreamClose */ ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L); if (ret != MMSYSERR_NOERROR) goto errCleanUp; } else { PWINE_ACMDRIVERID wadi; /* short drv_tag; -- not used */ ret = ACMERR_NOTPOSSIBLE; /* if(pwfxSrc->wFormatTag==1)//compression drv_tag=pwfxDst->wFormatTag; else if(pwfxDst->wFormatTag==1)//decompression drv_tag=pwfxSrc->wFormatTag; else goto errCleanUp; ret=acmDriverOpen2(drv_tag); if (ret == MMSYSERR_NOERROR) { if ((wad = MSACM_GetDriver(had)) != 0) { was->obj.pACMDriverID = wad->obj.pACMDriverID; was->pDrv = wad; was->hAcmDriver = had; ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L); if (ret == MMSYSERR_NOERROR) { if (fdwOpen & ACM_STREAMOPENF_QUERY) { acmDriverClose(had, 0L); } break; } } acmDriverClose(had, 0L);*/ //if(MSACM_pFirstACMDriverID==NULL) // MSACM_RegisterAllDrivers(); for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID) { /* Check Format */ if ((int)wadi->wFormatTag != (int)pwfxSrc->wFormatTag) continue; ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L); if (ret == MMSYSERR_NOERROR) { if ((wad = MSACM_GetDriver(had)) != 0) { was->obj.pACMDriverID = wad->obj.pACMDriverID; was->pDrv = wad; was->hAcmDriver = had; ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L); //lhacm - crash printf("RETOPEN %d\n", ret); //ret = 0; if (ret == MMSYSERR_NOERROR) { if (fdwOpen & ACM_STREAMOPENF_QUERY) { acmDriverClose(had, 0L); } break; } } // no match, close this acm driver and try next one acmDriverClose(had, 0L); } } if (ret != MMSYSERR_NOERROR) { ret = ACMERR_NOTPOSSIBLE; goto errCleanUp; } } ret = MMSYSERR_NOERROR; if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) { if (phas) *phas = (HACMSTREAM)was; TRACE("=> (%d)\n", ret); CodecAlloc(); return ret; } errCleanUp: if (phas) *phas = (HACMSTREAM)0; HeapFree(MSACM_hHeap, 0, was); TRACE("=> (%d)\n", ret); return ret; }
DMO_Filter* DMO_FilterCreate(const char* dllname, const GUID* id, DMO_MEDIA_TYPE* in_fmt, DMO_MEDIA_TYPE* out_fmt) { HRESULT hr = 0; const char* em = NULL; DMO_Filter* This = malloc(sizeof(DMO_Filter)); if (!This) return NULL; memset(This, 0, sizeof(DMO_Filter)); #ifdef WIN32_LOADER CodecAlloc(); #endif //This->Start = DS_Filter_Start; //This->Stop = DS_Filter_Stop; for (;;) { GETCLASS func; struct IClassFactory* factory = NULL; struct IUnknown* object = NULL; unsigned int i; unsigned long inputs, outputs; This->m_iHandle = LoadLibraryA(dllname); if (!This->m_iHandle) { em = "could not open DMO DLL"; break; } func = (GETCLASS)GetProcAddress(This->m_iHandle, "DllGetClassObject"); if (!func) { em = "illegal or corrupt DMO DLL"; break; } //trapbug(); hr = func(id, &IID_IClassFactory, (void*)&factory); if (hr || !factory) { em = "no such class object"; break; } hr = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void*)&object); factory->vt->Release((IUnknown*)factory); if (hr || !object) { em = "class factory failure"; break; } hr = object->vt->QueryInterface(object, &IID_IMediaObject, (void*)&This->m_pMedia); if (hr == 0) { /* query for some extra available interface */ HRESULT r = object->vt->QueryInterface(object, &IID_IMediaObjectInPlace, (void*)&This->m_pInPlace); if (r == 0 && This->m_pInPlace) fprintf(stderr, "DMO dll supports InPlace - PLEASE REPORT to developer\n"); r = object->vt->QueryInterface(object, &IID_IDMOVideoOutputOptimizations, (void*)&This->m_pOptim); if (r == 0 && This->m_pOptim) { unsigned long flags; r = This->m_pOptim->vt->QueryOperationModePreferences(This->m_pOptim, 0, &flags); fprintf(stderr, "DMO dll supports VO Optimizations %ld %lx\n", r, flags); if (flags & DMO_VOSF_NEEDS_PREVIOUS_SAMPLE) fprintf(stderr, "DMO dll might use previous sample when requested\n"); } } object->vt->Release((IUnknown*)object); if (hr || !This->m_pMedia) { em = "object does not provide IMediaObject interface"; break; } hr = This->m_pMedia->vt->SetInputType(This->m_pMedia, 0, in_fmt, 0); if (hr) { em = "input format not accepted"; break; } if (0) { DMO_MEDIA_TYPE dmo; //VIDEOINFOHEADER* vi; memset(&dmo, 0, sizeof(dmo)); i = This->m_pMedia->vt->GetOutputType(This->m_pMedia, 0, 2, &dmo); Debug printf("GetOutputType %x \n", i); Debug printf("DMO 0x%x (%.4s) 0x%x (%.4s)\n" //Debug printf("DMO 0x%x 0x%x\n" ":: fixszsamp:%d tempcomp:%d sampsz:%ld\n" ":: formtype: 0x%x\n" ":: unk %p cbform: %ld pbform:%p\n", dmo.majortype.f1, (const char*)&dmo.majortype.f1, dmo.subtype.f1, (const char*)&dmo.subtype.f1, dmo.bFixedSizeSamples, dmo.bTemporalCompression, dmo.lSampleSize, dmo.formattype.f1, dmo.pUnk, dmo.cbFormat, dmo.pbFormat ); /* vi = (VIDEOINFOHEADER*) dmo.pbFormat; vi = (VIDEOINFOHEADER*) out_fmt->pbFormat; for (i = 0; i < out_fmt->cbFormat; i++) Debug printf("BYTE %d %02x %02x\n", i, ((uint8_t*)dmo.pbFormat)[i], ((uint8_t*)out_fmt->pbFormat)[i]); */ } if (0!=memcmp(&GUID_NULL, &out_fmt->subtype, sizeof(GUID))) { hr = This->m_pMedia->vt->SetOutputType(This->m_pMedia, 0, out_fmt, 0); if (hr) { em = "output format no accepted"; break; } inputs = outputs = 0; hr = This->m_pMedia->vt->GetOutputSizeInfo(This->m_pMedia, 0, &inputs, &outputs); Debug printf("GetOutput r=0x%lx size:%ld align:%ld\n", hr, inputs, outputs); // This->m_pMedia->vt->AllocateStreamingResources(This->m_pMedia); hr = This->m_pMedia->vt->GetStreamCount(This->m_pMedia, &inputs, &outputs); Debug printf("StreamCount r=0x%lx %ld %ld\n", hr, inputs, outputs); } break; } if (em) { DMO_Filter_Destroy(This); fprintf(stderr, "IMediaObject ERROR: %p %s (0x%lx : %ld)\n", em, em ? em : "", hr, hr); This = 0; } return This; }