LRESULT Frameserver::SessionFormat(LPARAM lParam, WPARAM stream) { FrameserverSession *fs = SessionLookup(lParam); DubSource *ds; long len; if (!fs) return VDSRVERR_BADSESSION; if (stream<0 || stream>2) return VDSRVERR_NOSTREAM; ds = stream ? (DubSource *)aSrc : (DubSource *)vSrc; if (!ds) return VDSRVERR_NOSTREAM; if (stream) { len = aSrc->getFormatLen(); if (len > fs->arena_size) return VDSRVERR_TOOBIG; memcpy(fs->arena, aSrc->getFormat(), len); } else { BITMAPINFOHEADER *bmih; len = sizeof(BITMAPINFOHEADER); if (len > fs->arena_size) return VDSRVERR_TOOBIG; memcpy(fs->arena, vSrc->getDecompressedFormat(), len); bmih = (BITMAPINFOHEADER *)fs->arena; // bmih->biSize = sizeof(BITMAPINFOHEADER); bmih->biWidth = filters.LastBitmap()->w; bmih->biHeight = filters.LastBitmap()->h; bmih->biPlanes = 1; bmih->biCompression = BI_RGB; bmih->biBitCount = 24; bmih->biSizeImage = ((bmih->biWidth*3+3)&-4)*abs(bmih->biHeight); bmih->biClrUsed = 0; bmih->biClrImportant= 0; } return len; }
LRESULT Frameserver::WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: // message: window being destroyed mbExit = true; break; case VDSRVM_BIGGEST: { long size=sizeof(AVISTREAMINFO); if (vSrc) { if (size < sizeof(BITMAPINFOHEADER)) size = sizeof(BITMAPINFOHEADER); if (size < filters.OutputBitmap()->size) size = filters.OutputBitmap()->size; } if (aSrc) { if (size < aSrc->getWaveFormat()->nAvgBytesPerSec) size = aSrc->getWaveFormat()->nAvgBytesPerSec; if (aSrc->getFormatLen()>size) size=aSrc->getFormatLen(); } if (size < 65536) size=65536; VDDEBUG("VDSRVM_BIGGEST: allocate a frame of size %ld bytes\n", size); return size; } case VDSRVM_OPEN: ++lRequestCount; VDDEBUG("VDSRVM_OPEN(arena size %ld, mmap ID %08lx)\n", wParam, lParam); return SessionOpen(lParam, wParam); case VDSRVM_CLOSE: ++lRequestCount; VDDEBUG("[session %08lx] VDSRVM_CLOSE()\n", lParam); return SessionClose(lParam); case VDSRVM_REQ_STREAMINFO: ++lRequestCount; VDDEBUG("[session %08lx] VDSRVM_REQ_STREAMINFO(stream %d)\n", lParam, wParam); return SessionStreamInfo(lParam, wParam); case VDSRVM_REQ_FORMAT: ++lRequestCount; VDDEBUG("[session %08lx] VDSRVM_REQ_FORMAT(stream %d)\n", lParam, wParam); return SessionFormat(lParam, wParam); case VDSRVM_REQ_FRAME: ++lFrameCount; VDDEBUG("[session %08lx] VDSRVM_REQ_FRAME(sample %ld)\n", lParam, wParam); return SessionFrame(lParam, wParam); case VDSRVM_REQ_AUDIO: ++lAudioSegCount; return SessionAudio(lParam, wParam); case VDSRVM_REQ_AUDIOINFO: ++lAudioSegCount; VDDEBUG("[session %08lx] VDSRVM_REQ_AUDIOINFO(sample %ld)\n", lParam, wParam); return SessionAudioInfo(lParam, wParam); default: return mpUIFrame->DefProc(hWnd, message, wParam, lParam); } return (0); }