Hallo. The following patch prevents some segfaults in the msrle32. It adds also the necessary line to the sample system.ini for using this video codec.
diff -durN wine-20021007/documentation/samples/system.ini wine-20021007.new/documentation/samples/system.ini --- wine-20021007/documentation/samples/system.ini Mon Oct 7 20:21:45 2002+++ wine-20021007.new/documentation/samples/system.ini Tue Oct 8 23:32:14 2002@@ -10,3 +10,4 @@ [drivers32] MSACM.imaadpcm=imaadp32.acm MSACM.msadpcm=msadp32.acm +VIDC.MRLE=msrle32.dll diff -dur wine-20021007/dlls/msvideo/msrle32/msrle32.c wine-20021007.new/dlls/msvideo/msrle32/msrle32.c --- wine-20021007/dlls/msvideo/msrle32/msrle32.c Tue Oct 8 02:40:06 2002 +++ wine-20021007.new/dlls/msvideo/msrle32/msrle32.c Tue Oct 8 21:47:50 2002 @@ -223,15 +223,15 @@ switch (lpbiIn->biBitCount) { case 1: - for (x = 0; x < lpbiIn->biWidth; x += 8) { + for (x = 0; x < lpbiIn->biWidth / 8; x++) { for (i = 0; i < 7; i++) - lpOut[x + i] = wIntensityTbl[(lpIn[x] >> (7 - i)) & 1]; + lpOut[8 * x + i] = wIntensityTbl[(lpIn[x] >> (7 - i)) & 1]; } break; case 4: - for (x = 0; x < lpbiIn->biWidth; x += 2) { - lpOut[x + 0] = wIntensityTbl[(lpIn[x] >> 4)]; - lpOut[x + 1] = wIntensityTbl[(lpIn[x] & 0x0F)]; + for (x = 0; x < lpbiIn->biWidth / 2; x++) { + lpOut[2 * x + 0] = wIntensityTbl[(lpIn[x] >> 4)]; + lpOut[2 * x + 1] = wIntensityTbl[(lpIn[x] & 0x0F)]; } break; case 8: @@ -299,13 +299,13 @@ /* FIXME */ return count; - } else if (lpP && ColorCmp(lpP[pos], lpB[pos]) <= lDist) { + } else if (lpP != NULL && ColorCmp(lpP[pos], lpB[pos]) <= lDist) { /* 'compare' with previous frame for end of diff */ INT count2 = 0; /* FIXME */ - if (count2 >= 4) + if (count2 >= 8) return count; pos -= count2; @@ -388,9 +388,9 @@ while (count > 2) { INT i; INT size = min(count, 254); - BOOL extra_byte = size % 2; + BOOL extra_byte = (size/2) % 2; - *lpSizeImage += 2 + size + extra_byte; + *lpSizeImage += 2 + size/2 + extra_byte; count -= size; *lpOut++ = 0; *lpOut++ = size; @@ -1413,7 +1413,6 @@ * No need to recompute internal framedata, because we only swapped buffers */ LPWORD pTmp = pi->pPrevFrame; - FIXME(": prev=%ld cur=%ld swap\n",pi->nPrevFrame,lpic->lFrameNum); pi->pPrevFrame = pi->pCurFrame; pi->pCurFrame = pTmp; } else if ((lpic->dwFlags & ICCOMPRESS_KEYFRAME) == 0) {
Michael Günnewig