[MSRLE32]

* Sync with Wine 1.7.17.
CORE-8080

svn path=/trunk/; revision=63001
This commit is contained in:
Amine Khaldi 2014-04-26 18:13:05 +00:00
parent 9fbe0e17f1
commit 283f51f64b
3 changed files with 29 additions and 55 deletions

View file

@ -39,7 +39,6 @@ static HINSTANCE MSRLE32_hModule = 0;
#define ABS(a) ((a) < 0 ? -(a) : (a))
#define SQR(a) ((a) * (a))
#define QUALITY_to_DIST(q) (ICQUALITY_HIGH - q)
static inline WORD ColorCmp(WORD clr1, WORD clr2)
{
UINT a = clr1 - clr2;
@ -257,7 +256,7 @@ static LONG MSRLE32_GetMaxCompressedSize(LPCBITMAPINFOHEADER lpbi)
}
size = (2 + a * (2 + ((a + 2) & ~2)) + b * (2 + ((b + 2) & ~2)));
return size * lpbi->biHeight;
return size * lpbi->biHeight + 2;
}
/* lpP => current pos in previous frame
@ -457,8 +456,7 @@ static INT MSRLE32_CompressRLE4Line(const CodecInfo *pi, const WORD *lpP,
static INT MSRLE32_CompressRLE8Line(const CodecInfo *pi, const WORD *lpP,
const WORD *lpC, LPCBITMAPINFOHEADER lpbi,
const BYTE *lpIn, LONG lDist,
INT x, LPBYTE *ppOut,
const BYTE *lpIn, INT x, LPBYTE *ppOut,
DWORD *lpSizeImage)
{
LPBYTE lpOut = *ppOut;
@ -472,13 +470,13 @@ static INT MSRLE32_CompressRLE8Line(const CodecInfo *pi, const WORD *lpP,
pos = x;
clr = lpC[pos++];
for (count = 1; pos < lpbi->biWidth; count++) {
if (ColorCmp(clr, lpC[pos++]) > lDist)
if (ColorCmp(clr, lpC[pos++]) > 0)
break;
}
if (count < 2) {
/* add some more pixels for absoluting if possible */
count += countDiffRLE8(lpP, lpC - 1, lpC, pos-1, lDist, lpbi->biWidth);
count += countDiffRLE8(lpP, lpC - 1, lpC, pos-1, 0, lpbi->biWidth);
assert(count > 0);
@ -547,7 +545,7 @@ LRESULT MSRLE32_CompressRLE4(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
LPBYTE lpOut, BOOL isKey)
{
LPWORD lpC;
LONG lLine, lInLine, lDist;
LONG lLine, lInLine;
LPBYTE lpOutStart = lpOut;
/* pre-conditions */
@ -556,7 +554,6 @@ LRESULT MSRLE32_CompressRLE4(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
assert(pi->pCurFrame != NULL);
lpC = pi->pCurFrame;
lDist = QUALITY_to_DIST(pi->dwQuality);
lInLine = DIBWIDTHBYTES(*lpbiIn);
lLine = WIDTHBYTES(lpbiOut->biWidth * 16) / 2;
@ -569,7 +566,7 @@ LRESULT MSRLE32_CompressRLE4(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
x = 0;
do {
x = MSRLE32_CompressRLE4Line(pi, NULL, lpC, lpbiIn, lpIn, lDist, x,
x = MSRLE32_CompressRLE4Line(pi, NULL, lpC, lpbiIn, lpIn, 0, x,
&lpOut, &lpbiOut->biSizeImage);
} while (x < lpbiOut->biWidth);
@ -603,7 +600,7 @@ LRESULT MSRLE32_CompressRLE4(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
if (jumpx == -1)
jumpx = x;
for (count = 0, pos = x; pos < lpbiOut->biWidth; pos++, count++) {
if (ColorCmp(lpP[pos], lpC[pos]) > lDist)
if (ColorCmp(lpP[pos], lpC[pos]) > 0)
break;
}
@ -663,7 +660,7 @@ LRESULT MSRLE32_CompressRLE4(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
if (x < lpbiOut->biWidth) {
/* skipped the 'same' things corresponding to previous frame */
x = MSRLE32_CompressRLE4Line(pi, lpP, lpC, lpbiIn, lpIn, lDist, x,
x = MSRLE32_CompressRLE4Line(pi, lpP, lpC, lpbiIn, lpIn, 0, x,
&lpOut, &lpbiOut->biSizeImage);
}
} while (x < lpbiOut->biWidth);
@ -701,7 +698,7 @@ LRESULT MSRLE32_CompressRLE8(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
LPBYTE lpOut, BOOL isKey)
{
LPWORD lpC;
LONG lDist, lInLine, lLine;
LONG lInLine, lLine;
LPBYTE lpOutStart = lpOut;
assert(pi != NULL && lpbiOut != NULL);
@ -709,7 +706,6 @@ LRESULT MSRLE32_CompressRLE8(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
assert(pi->pCurFrame != NULL);
lpC = pi->pCurFrame;
lDist = QUALITY_to_DIST(pi->dwQuality);
lInLine = DIBWIDTHBYTES(*lpbiIn);
lLine = WIDTHBYTES(lpbiOut->biWidth * 16) / 2;
@ -722,7 +718,7 @@ LRESULT MSRLE32_CompressRLE8(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
x = 0;
do {
x = MSRLE32_CompressRLE8Line(pi, NULL, lpC, lpbiIn, lpIn, lDist, x,
x = MSRLE32_CompressRLE8Line(pi, NULL, lpC, lpbiIn, lpIn, x,
&lpOut, &lpbiOut->biSizeImage);
assert(lpOut == (lpOutStart + lpbiOut->biSizeImage));
} while (x < lpbiOut->biWidth);
@ -757,7 +753,7 @@ LRESULT MSRLE32_CompressRLE8(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
if (jumpx == -1)
jumpx = x;
for (count = 0, pos = x; pos < lpbiOut->biWidth; pos++, count++) {
if (ColorCmp(lpP[pos], lpC[pos]) > lDist)
if (ColorCmp(lpP[pos], lpC[pos]) > 0)
break;
}
@ -804,7 +800,7 @@ LRESULT MSRLE32_CompressRLE8(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
if (x < lpbiOut->biWidth) {
/* skip the 'same' things corresponding to previous frame */
x = MSRLE32_CompressRLE8Line(pi, lpP, lpC, lpbiIn, lpIn, lDist, x,
x = MSRLE32_CompressRLE8Line(pi, lpP, lpC, lpbiIn, lpIn, x,
&lpOut, &lpbiOut->biSizeImage);
assert(lpOut == (lpOutStart + lpbiOut->biSizeImage));
}
@ -823,14 +819,16 @@ LRESULT MSRLE32_CompressRLE8(const CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
}
}
/* add EOL -- will be changed to EOI */
/* add EOL */
lpbiOut->biSizeImage += 2;
*((LPWORD)lpOut) = 0;
lpOut += sizeof(WORD);
}
/* change EOL to EOI -- end of image */
lpOut[-1] = 1;
/* add EOI -- end of image */
lpbiOut->biSizeImage += 2;
*lpOut++ = 0;
*lpOut++ = 1;
assert(lpOut == (lpOutStart + lpbiOut->biSizeImage));
return ICERR_OK;
@ -1144,7 +1142,6 @@ static CodecInfo* Open(LPICOPEN icinfo)
pi->fccHandler = icinfo->fccHandler;
pi->bCompress = FALSE;
pi->dwQuality = MSRLE32_DEFAULTQUALITY;
pi->nPrevFrame = -1;
pi->pPrevFrame = pi->pCurFrame = NULL;
@ -1195,21 +1192,6 @@ static LRESULT GetInfo(const CodecInfo *pi, ICINFO *icinfo, DWORD dwSize)
return sizeof(ICINFO);
}
static LRESULT SetQuality(CodecInfo *pi, LONG lQuality)
{
/* pre-condition */
assert(pi != NULL);
if (lQuality == -1)
lQuality = MSRLE32_DEFAULTQUALITY;
else if (ICQUALITY_LOW > lQuality || lQuality > ICQUALITY_HIGH)
return ICERR_BADPARAM;
pi->dwQuality = (DWORD)lQuality;
return ICERR_OK;
}
static LRESULT Configure(const CodecInfo *pi, HWND hWnd)
{
/* pre-condition */
@ -1438,6 +1420,7 @@ static LRESULT CompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
static LRESULT Compress(CodecInfo *pi, ICCOMPRESS* lpic, DWORD dwSize)
{
BOOL is_key;
int i;
TRACE("(%p,%p,%u)\n",pi,lpic,dwSize);
@ -1486,24 +1469,22 @@ static LRESULT Compress(CodecInfo *pi, ICCOMPRESS* lpic, DWORD dwSize)
computeInternalFrame(pi, lpic->lpbiPrev, lpic->lpPrev);
/* swap buffers for current and previous frame */
/* Don't free and alloc new -- costs to much time and they are of equal size ! */
/* Don't free and alloc new -- costs too much time and they are of equal size ! */
pTmp = pi->pPrevFrame;
pi->pPrevFrame = pi->pCurFrame;
pi->pCurFrame = pTmp;
pi->nPrevFrame = lpic->lFrameNum;
}
for (i = 0; i < 3; i++) {
SetQuality(pi, lpic->dwQuality);
is_key = (lpic->dwFlags & ICCOMPRESS_KEYFRAME) != 0;
for (i = 0; i < 3; i++) {
lpic->lpbiOutput->biSizeImage = 0;
if (lpic->lpbiOutput->biBitCount == 4)
MSRLE32_CompressRLE4(pi, lpic->lpbiInput, lpic->lpInput,
lpic->lpbiOutput, lpic->lpOutput, (lpic->dwFlags & ICCOMPRESS_KEYFRAME) != 0);
MSRLE32_CompressRLE4(pi, lpic->lpbiInput, lpic->lpInput, lpic->lpbiOutput, lpic->lpOutput, is_key);
else
MSRLE32_CompressRLE8(pi, lpic->lpbiInput, lpic->lpInput,
lpic->lpbiOutput, lpic->lpOutput, (lpic->dwFlags & ICCOMPRESS_KEYFRAME) != 0);
MSRLE32_CompressRLE8(pi, lpic->lpbiInput, lpic->lpInput, lpic->lpbiOutput, lpic->lpOutput, is_key);
if (lpic->dwFrameSize == 0 ||
lpic->lpbiOutput->biSizeImage < lpic->dwFrameSize)
@ -1520,7 +1501,7 @@ static LRESULT Compress(CodecInfo *pi, ICCOMPRESS* lpic, DWORD dwSize)
if (lpic->dwFrameSize == 0 ||
lpic->lpbiOutput->biSizeImage < lpic->dwFrameSize) {
WARN("switched to keyframe, was small enough!\n");
*lpic->lpdwFlags |= ICCOMPRESS_KEYFRAME;
is_key = TRUE;
*lpic->lpckid = MAKEAVICKID(cktypeDIBbits,
StreamFromFOURCC(*lpic->lpckid));
break;
@ -1534,7 +1515,7 @@ static LRESULT Compress(CodecInfo *pi, ICCOMPRESS* lpic, DWORD dwSize)
}
{ /* swap buffer for current and previous frame */
/* Don't free and alloc new -- costs to much time and they are of equal size ! */
/* Don't free and alloc new -- costs too much time and they are of equal size ! */
LPWORD pTmp = pi->pPrevFrame;
pi->pPrevFrame = pi->pCurFrame;
@ -1542,6 +1523,8 @@ static LRESULT Compress(CodecInfo *pi, ICCOMPRESS* lpic, DWORD dwSize)
pi->nPrevFrame = lpic->lFrameNum;
}
/* FIXME: What is AVIIF_TWOCC? */
*lpic->lpdwFlags |= AVIIF_TWOCC | (is_key ? AVIIF_KEYFRAME : 0);
return ICERR_OK;
}
@ -1850,14 +1833,6 @@ LRESULT CALLBACK MSRLE32_DriverProc(DWORD_PTR dwDrvID, HDRVR hDrv, UINT uMsg,
return ICERR_OK;
}
break;
case ICM_GETQUALITY:
if ((LPVOID)lParam1 != NULL) {
*((LPDWORD)lParam1) = pi->dwQuality;
return ICERR_OK;
}
break;
case ICM_SETQUALITY:
return SetQuality(pi, *(LPLONG)lParam1);
case ICM_COMPRESS_GET_FORMAT:
return CompressGetFormat(pi, (LPCBITMAPINFOHEADER)lParam1,
(LPBITMAPINFOHEADER)lParam2);

View file

@ -38,7 +38,7 @@
#define IDS_DESCRIPTION 101
#define IDS_ABOUT 102
#define MSRLE32_DEFAULTQUALITY (75 * ICQUALITY_HIGH) / 100
#define MSRLE32_DEFAULTQUALITY (85 * ICQUALITY_HIGH) / 100
#define FOURCC_RLE mmioFOURCC('R','L','E',' ')
#define FOURCC_RLE4 mmioFOURCC('R','L','E','4')
@ -50,7 +50,6 @@
typedef struct _CodecInfo {
FOURCC fccHandler;
DWORD dwQuality;
BOOL bCompress;
LONG nPrevFrame;

View file

@ -125,7 +125,7 @@ reactos/dll/win32/msimtf # Synced to Wine-1.7.1
reactos/dll/win32/msisip # Synced to Wine-1.7.1
reactos/dll/win32/msisys.ocx # Synced to Wine-1.7.1
reactos/dll/win32/msnet32 # Synced to Wine-1.7.1
reactos/dll/win32/msrle32 # Synced to Wine-1.7.1
reactos/dll/win32/msrle32 # Synced to Wine-1.7.17
reactos/dll/win32/mssign32 # Synced to Wine-1.7.1
reactos/dll/win32/mssip32 # Synced to Wine-1.7.1
reactos/dll/win32/mstask # Synced to Wine-1.7.1