From: Michael Müller michael@fds-team.de
From: Michael Müller michael@fds-team.de Signed-off-by: Vijay Kiran Kamuju infyquest@gmail.com --- dlls/avifile.dll16/Makefile.in | 3 + dlls/avifile.dll16/avifile.dll16.spec | 6 +- dlls/avifile.dll16/main.c | 133 ++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 dlls/avifile.dll16/main.c
diff --git a/dlls/avifile.dll16/Makefile.in b/dlls/avifile.dll16/Makefile.in index 6050c6c52dc..4152c2f9f2a 100644 --- a/dlls/avifile.dll16/Makefile.in +++ b/dlls/avifile.dll16/Makefile.in @@ -1,3 +1,6 @@ MODULE = avifile.dll16 IMPORTS = avifil32 EXTRADLLFLAGS = -m16 -Wb,--main-module,avifil32.dll + +C_SRCS = \ + main.c diff --git a/dlls/avifile.dll16/avifile.dll16.spec b/dlls/avifile.dll16/avifile.dll16.spec index 239d3a4a48f..2b5fb910342 100644 --- a/dlls/avifile.dll16/avifile.dll16.spec +++ b/dlls/avifile.dll16/avifile.dll16.spec @@ -20,9 +20,9 @@ 105 stub AVIMAKECOMPRESSEDSTREAM 106 stub AVIMAKEFILEFROMSTREAMS 107 stub AVIMAKESTREAMFROMCLIPBOARD -110 pascal AVIStreamGetFrame(long long) AVIStreamGetFrame -111 pascal AVIStreamGetFrameClose(long) AVIStreamGetFrameClose -112 pascal AVIStreamGetFrameOpen(long ptr) AVIStreamGetFrameOpen +110 pascal AVIStreamGetFrame(long long) AVIStreamGetFrame16 +111 pascal AVIStreamGetFrameClose(long) AVIStreamGetFrameClose16 +112 pascal AVIStreamGetFrameOpen(long ptr) AVIStreamGetFrameOpen16 120 stub _AVISAVE 121 stub AVISAVEV 122 stub AVISAVEOPTIONS diff --git a/dlls/avifile.dll16/main.c b/dlls/avifile.dll16/main.c new file mode 100644 index 00000000000..9e1faac2295 --- /dev/null +++ b/dlls/avifile.dll16/main.c @@ -0,0 +1,133 @@ +/* + * Wrapper for 16 bit avifile functions + * + * Copyright 2016 Michael Müller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/winbase16.h" +#include "winternl.h" +#include "wingdi.h" +#include "vfw.h" + +struct frame_wrapper16 +{ + PGETFRAME pg; + PVOID ptr; + DWORD size; + WORD sel; + WORD count; +}; + +static void free_segptr_frame(struct frame_wrapper16 *wrapper) +{ + int i; + + if (!wrapper->sel) + return; + + for (i = 0; i < wrapper->count; i++) + FreeSelector16(wrapper->sel + (i << __AHSHIFT)); + + wrapper->sel = 0; +} + +static SEGPTR alloc_segptr_frame(struct frame_wrapper16 *wrapper, void *ptr, DWORD size) +{ + int i; + + if (wrapper->sel) + { + if (wrapper->ptr == ptr && wrapper->size == size) + return MAKESEGPTR(wrapper->sel, 0); + free_segptr_frame(wrapper); + } + + wrapper->ptr = ptr; + wrapper->size = size; + wrapper->count = (size + 0xffff) / 0x10000; + wrapper->sel = AllocSelectorArray16(wrapper->count); + if (!wrapper->sel) + return 0; + + for (i = 0; i < wrapper->count; i++) + { + SetSelectorBase(wrapper->sel + (i << __AHSHIFT), (DWORD)ptr + i * 0x10000); + SetSelectorLimit16(wrapper->sel + (i << __AHSHIFT), size - 1); + size -= 0x10000; + } + + return MAKESEGPTR(wrapper->sel, 0); +} + +/*********************************************************************** + * AVIStreamGetFrameOpen (AVIFILE.112) + */ +PGETFRAME WINAPI AVIStreamGetFrameOpen16(PAVISTREAM pstream, LPBITMAPINFOHEADER lpbiWanted) +{ + struct frame_wrapper16 *wrapper; + PGETFRAME pg; + + pg = AVIStreamGetFrameOpen(pstream, lpbiWanted); + if (!pg) return NULL; + + wrapper = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*wrapper)); + if (!wrapper) + { + AVIStreamGetFrameClose(pg); + return NULL; + } + + wrapper->pg = pg; + return (PGETFRAME)wrapper; +} + +/*********************************************************************** + * AVIStreamGetFrame (AVIFILE.110) + */ +SEGPTR WINAPI AVIStreamGetFrame16(PGETFRAME pg, LONG pos) +{ + struct frame_wrapper16 *wrapper = (void *)pg; + BITMAPINFOHEADER *bih; + + if (!pg) return 0; + + bih = AVIStreamGetFrame(wrapper->pg, pos); + if (bih) + { + DWORD size = bih->biSize + bih->biSizeImage; + return alloc_segptr_frame(wrapper, bih, size); + } + + return 0; +} + + +/*********************************************************************** + * AVIStreamGetFrameClose (AVIFILE.111) + */ +HRESULT WINAPI AVIStreamGetFrameClose16(PGETFRAME pg) +{ + struct frame_wrapper16 *wrapper = (void *)pg; + HRESULT hr; + + if (!pg) return S_OK; + + hr = AVIStreamGetFrameClose(wrapper->pg); + free_segptr_frame(wrapper); + HeapFree(GetProcessHeap(), 0, wrapper); + return hr; +}
From: Michael Müller michael@fds-team.de
From: Michael Müller michael@fds-team.de Signed-off-by: Vijay Kiran Kamuju infyquest@gmail.com --- dlls/avifile.dll16/avifile.dll16.spec | 4 +- dlls/avifile.dll16/main.c | 100 ++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-)
diff --git a/dlls/avifile.dll16/avifile.dll16.spec b/dlls/avifile.dll16/avifile.dll16.spec index 2b5fb910342..5dabd7f4b5f 100644 --- a/dlls/avifile.dll16/avifile.dll16.spec +++ b/dlls/avifile.dll16/avifile.dll16.spec @@ -36,13 +36,13 @@ 141 pascal AVIFileRelease(long) AVIFileRelease 142 pascal AVIFileInfo(long ptr long) AVIFileInfoA 143 pascal AVIFileGetStream(long ptr long long) AVIFileGetStream -144 pascal AVIFileCreateStream(long ptr ptr) AVIFileCreateStreamA +144 pascal AVIFileCreateStream(long ptr ptr) AVIFileCreateStream16 146 pascal AVIFileWriteData(long long ptr long) AVIFileWriteData 147 pascal AVIFileReadData(long long ptr ptr) AVIFileReadData 148 pascal AVIFileEndRecord(long) AVIFileEndRecord 160 pascal AVIStreamAddRef(long) AVIStreamAddRef 161 pascal AVIStreamRelease(long) AVIStreamRelease -162 pascal AVIStreamInfo(long ptr long) AVIStreamInfoA +162 pascal AVIStreamInfo(long ptr long) AVIStreamInfo16 163 pascal AVIStreamFindSample(long long long) AVIStreamFindSample 164 pascal AVIStreamReadFormat(long long ptr ptr) AVIStreamReadFormat 165 pascal AVIStreamReadData(long long ptr ptr) AVIStreamReadData diff --git a/dlls/avifile.dll16/main.c b/dlls/avifile.dll16/main.c index 9e1faac2295..8bb1769fdb9 100644 --- a/dlls/avifile.dll16/main.c +++ b/dlls/avifile.dll16/main.c @@ -23,6 +23,27 @@ #include "wingdi.h" #include "vfw.h"
+typedef struct _AVISTREAMINFO16 { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; + DWORD dwStart; + DWORD dwLength; + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT16 rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + CHAR szName[64]; +} AVISTREAMINFO16, *LPAVISTREAMINFO16, *PAVISTREAMINFO16; + struct frame_wrapper16 { PGETFRAME pg; @@ -131,3 +152,82 @@ HRESULT WINAPI AVIStreamGetFrameClose16(PGETFRAME pg) HeapFree(GetProcessHeap(), 0, wrapper); return hr; } + +/*********************************************************************** + * AVIFileCreateStream (AVIFILE.144) + */ +HRESULT WINAPI AVIFileCreateStream16(PAVIFILE pfile, PAVISTREAM *ppavi, LPAVISTREAMINFO16 asi16) +{ + AVISTREAMINFOA asi; + + if (!asi16) + return AVIFileCreateStreamA(pfile, ppavi, NULL); + + asi.fccType = asi16->fccType; + asi.fccHandler = asi16->fccHandler; + asi.dwFlags = asi16->dwFlags; + asi.dwCaps = asi16->dwCaps; + asi.wPriority = asi16->wPriority; + asi.wLanguage = asi16->wLanguage; + asi.dwScale = asi16->dwScale; + asi.dwRate = asi16->dwRate; + asi.dwStart = asi16->dwStart; + asi.dwLength = asi16->dwLength; + asi.dwInitialFrames = asi16->dwInitialFrames; + asi.dwSuggestedBufferSize = asi16->dwSuggestedBufferSize; + asi.dwQuality = asi16->dwQuality; + asi.dwSampleSize = asi16->dwSampleSize; + asi.rcFrame.left = asi16->rcFrame.left; + asi.rcFrame.top = asi16->rcFrame.top; + asi.rcFrame.right = asi16->rcFrame.right; + asi.rcFrame.bottom = asi16->rcFrame.bottom; + asi.dwEditCount = asi16->dwEditCount; + asi.dwFormatChangeCount = asi16->dwFormatChangeCount; + memcpy(&asi.szName, &asi16->szName, sizeof(asi.szName)); + + return AVIFileCreateStreamA(pfile, ppavi, &asi); +} + + +/*********************************************************************** + * AVIStreamInfo (AVIFILE.162) + */ +HRESULT WINAPI AVIStreamInfo16(PAVISTREAM pstream, LPAVISTREAMINFO16 asi16, LONG size) +{ + AVISTREAMINFOA asi; + HRESULT hr; + + if (!asi16) + return AVIStreamInfoA(pstream, NULL, size); + + if (size < sizeof(AVISTREAMINFO16)) + return AVIERR_BADSIZE; + + hr = AVIStreamInfoA(pstream, &asi, sizeof(asi)); + if (SUCCEEDED(hr)) + { + asi16->fccType = asi.fccType; + asi16->fccHandler = asi.fccHandler; + asi16->dwFlags = asi.dwFlags; + asi16->dwCaps = asi.dwCaps; + asi16->wPriority = asi.wPriority; + asi16->wLanguage = asi.wLanguage; + asi16->dwScale = asi.dwScale; + asi16->dwRate = asi.dwRate; + asi16->dwStart = asi.dwStart; + asi16->dwLength = asi.dwLength; + asi16->dwInitialFrames = asi.dwInitialFrames; + asi16->dwSuggestedBufferSize = asi.dwSuggestedBufferSize; + asi16->dwQuality = asi.dwQuality; + asi16->dwSampleSize = asi.dwSampleSize; + asi16->rcFrame.left = asi.rcFrame.left; + asi16->rcFrame.top = asi.rcFrame.top; + asi16->rcFrame.right = asi.rcFrame.right; + asi16->rcFrame.bottom = asi.rcFrame.bottom; + asi16->dwEditCount = asi.dwEditCount; + asi16->dwFormatChangeCount = asi.dwFormatChangeCount; + memcpy(&asi16->szName, &asi.szName, sizeof(asi.szName)); + } + + return hr; +}