mirror of
https://github.com/reactos/reactos.git
synced 2025-01-02 20:43:18 +00:00
[ICCVID] Sync with Wine Staging 1.7.55. CORE-10536
svn path=/trunk/; revision=69956
This commit is contained in:
parent
f9c3a4da2d
commit
cf938d6d21
2 changed files with 150 additions and 120 deletions
|
@ -145,6 +145,15 @@ int uvr, uvg, uvb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline long get_addr(BOOL inverted, unsigned long x, unsigned long y,
|
||||||
|
int frm_stride, int bpp, unsigned int out_height)
|
||||||
|
{
|
||||||
|
/* Returns the starting position of a line from top-down or bottom-up */
|
||||||
|
if (inverted)
|
||||||
|
return y * frm_stride + x * bpp;
|
||||||
|
else
|
||||||
|
return (out_height - 1 - y) * frm_stride + x * bpp;
|
||||||
|
}
|
||||||
|
|
||||||
#define MAKECOLOUR32(r,g,b) (((r) << 16) | ((g) << 8) | (b))
|
#define MAKECOLOUR32(r,g,b) (((r) << 16) | ((g) << 8) | (b))
|
||||||
/*#define MAKECOLOUR24(r,g,b) (((r) << 16) | ((g) << 8) | (b))*/
|
/*#define MAKECOLOUR24(r,g,b) (((r) << 16) | ((g) << 8) | (b))*/
|
||||||
|
@ -152,16 +161,18 @@ int uvr, uvg, uvb;
|
||||||
#define MAKECOLOUR15(r,g,b) (((r) >> 3) << 10)| (((g) >> 3) << 5)| (((b) >> 3) << 0)
|
#define MAKECOLOUR15(r,g,b) (((r) >> 3) << 10)| (((g) >> 3) << 5)| (((b) >> 3) << 0)
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v1_32(unsigned char *frm, unsigned char *limit, int stride, cvid_codebook *cb)
|
static void cvid_v1_32(unsigned char *frm, unsigned char *limit, int stride, BOOL inverted,
|
||||||
|
cvid_codebook *cb)
|
||||||
{
|
{
|
||||||
unsigned long *vptr = (unsigned long *)frm;
|
unsigned long *vptr = (unsigned long *)frm;
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride/4;
|
|
||||||
#else
|
|
||||||
int row_inc = stride/4;
|
|
||||||
#endif
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride/4;
|
||||||
|
else
|
||||||
|
row_inc = stride/4;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebook */
|
/* fill 4x4 block of pixels with colour values from codebook */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -173,18 +184,19 @@ int x, y;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v4_32(unsigned char *frm, unsigned char *limit, int stride, cvid_codebook *cb0,
|
static void cvid_v4_32(unsigned char *frm, unsigned char *limit, int stride, BOOL inverted,
|
||||||
cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
cvid_codebook *cb0, cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
||||||
{
|
{
|
||||||
unsigned long *vptr = (unsigned long *)frm;
|
unsigned long *vptr = (unsigned long *)frm;
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride/4;
|
|
||||||
#else
|
|
||||||
int row_inc = stride/4;
|
|
||||||
#endif
|
|
||||||
int x, y;
|
int x, y;
|
||||||
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride/4;
|
||||||
|
else
|
||||||
|
row_inc = stride/4;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebooks */
|
/* fill 4x4 block of pixels with colour values from codebooks */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -196,15 +208,17 @@ cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v1_24(unsigned char *vptr, unsigned char *limit, int stride, cvid_codebook *cb)
|
static void cvid_v1_24(unsigned char *vptr, unsigned char *limit, int stride, BOOL inverted,
|
||||||
|
cvid_codebook *cb)
|
||||||
{
|
{
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride;
|
|
||||||
#else
|
|
||||||
int row_inc = stride;
|
|
||||||
#endif
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride;
|
||||||
|
else
|
||||||
|
row_inc = stride;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebook */
|
/* fill 4x4 block of pixels with colour values from codebook */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -220,17 +234,18 @@ int x, y;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v4_24(unsigned char *vptr, unsigned char *limit, int stride, cvid_codebook *cb0,
|
static void cvid_v4_24(unsigned char *vptr, unsigned char *limit, int stride, BOOL inverted,
|
||||||
cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
cvid_codebook *cb0, cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
||||||
{
|
{
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride;
|
|
||||||
#else
|
|
||||||
int row_inc = stride;
|
|
||||||
#endif
|
|
||||||
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride;
|
||||||
|
else
|
||||||
|
row_inc = stride;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebooks */
|
/* fill 4x4 block of pixels with colour values from codebooks */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -246,16 +261,18 @@ int x, y;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v1_16(unsigned char *frm, unsigned char *limit, int stride, cvid_codebook *cb)
|
static void cvid_v1_16(unsigned char *frm, unsigned char *limit, int stride, BOOL inverted,
|
||||||
|
cvid_codebook *cb)
|
||||||
{
|
{
|
||||||
unsigned short *vptr = (unsigned short *)frm;
|
unsigned short *vptr = (unsigned short *)frm;
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride/2;
|
|
||||||
#else
|
|
||||||
int row_inc = stride/2;
|
|
||||||
#endif
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride/2;
|
||||||
|
else
|
||||||
|
row_inc = stride/2;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebook */
|
/* fill 4x4 block of pixels with colour values from codebook */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -267,18 +284,19 @@ int x, y;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v4_16(unsigned char *frm, unsigned char *limit, int stride, cvid_codebook *cb0,
|
static void cvid_v4_16(unsigned char *frm, unsigned char *limit, int stride, BOOL inverted,
|
||||||
cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
cvid_codebook *cb0, cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
||||||
{
|
{
|
||||||
unsigned short *vptr = (unsigned short *)frm;
|
unsigned short *vptr = (unsigned short *)frm;
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride/2;
|
|
||||||
#else
|
|
||||||
int row_inc = stride/2;
|
|
||||||
#endif
|
|
||||||
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride/2;
|
||||||
|
else
|
||||||
|
row_inc = stride/2;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebooks */
|
/* fill 4x4 block of pixels with colour values from codebooks */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -289,16 +307,18 @@ int x, y;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v1_15(unsigned char *frm, unsigned char *limit, int stride, cvid_codebook *cb)
|
static void cvid_v1_15(unsigned char *frm, unsigned char *limit, int stride, BOOL inverted,
|
||||||
|
cvid_codebook *cb)
|
||||||
{
|
{
|
||||||
unsigned short *vptr = (unsigned short *)frm;
|
unsigned short *vptr = (unsigned short *)frm;
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride/2;
|
|
||||||
#else
|
|
||||||
int row_inc = stride/2;
|
|
||||||
#endif
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride/2;
|
||||||
|
else
|
||||||
|
row_inc = stride/2;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebook */
|
/* fill 4x4 block of pixels with colour values from codebook */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -310,18 +330,19 @@ int x, y;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
static void cvid_v4_15(unsigned char *frm, unsigned char *limit, int stride, cvid_codebook *cb0,
|
static void cvid_v4_15(unsigned char *frm, unsigned char *limit, int stride, BOOL inverted,
|
||||||
cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
cvid_codebook *cb0, cvid_codebook *cb1, cvid_codebook *cb2, cvid_codebook *cb3)
|
||||||
{
|
{
|
||||||
unsigned short *vptr = (unsigned short *)frm;
|
unsigned short *vptr = (unsigned short *)frm;
|
||||||
#ifndef ORIGINAL
|
int row_inc;
|
||||||
int row_inc = -stride/2;
|
|
||||||
#else
|
|
||||||
int row_inc = stride/2;
|
|
||||||
#endif
|
|
||||||
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
cvid_codebook * cb[] = {cb0,cb1,cb2,cb3};
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
|
if (!inverted)
|
||||||
|
row_inc = -stride/2;
|
||||||
|
else
|
||||||
|
row_inc = stride/2;
|
||||||
|
|
||||||
/* fill 4x4 block of pixels with colour values from codebooks */
|
/* fill 4x4 block of pixels with colour values from codebooks */
|
||||||
for (y = 0; y < 4; y++)
|
for (y = 0; y < 4; y++)
|
||||||
{
|
{
|
||||||
|
@ -369,8 +390,9 @@ static void free_cvinfo( cinepak_info *cvinfo )
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*fn_cvid_v1)(unsigned char *frm, unsigned char *limit,
|
typedef void (*fn_cvid_v1)(unsigned char *frm, unsigned char *limit,
|
||||||
int stride, cvid_codebook *cb);
|
int stride, BOOL inverted, cvid_codebook *cb);
|
||||||
typedef void (*fn_cvid_v4)(unsigned char *frm, unsigned char *limit, int stride,
|
typedef void (*fn_cvid_v4)(unsigned char *frm, unsigned char *limit,
|
||||||
|
int stride, BOOL inverted,
|
||||||
cvid_codebook *cb0, cvid_codebook *cb1,
|
cvid_codebook *cb0, cvid_codebook *cb1,
|
||||||
cvid_codebook *cb2, cvid_codebook *cb3);
|
cvid_codebook *cb2, cvid_codebook *cb3);
|
||||||
|
|
||||||
|
@ -380,33 +402,42 @@ typedef void (*fn_cvid_v4)(unsigned char *frm, unsigned char *limit, int stride,
|
||||||
* context - the context created by decode_cinepak_init().
|
* context - the context created by decode_cinepak_init().
|
||||||
* buf - the input buffer to be decoded
|
* buf - the input buffer to be decoded
|
||||||
* size - the size of the input buffer
|
* size - the size of the input buffer
|
||||||
* frame - the output frame buffer (24 or 32 bit per pixel)
|
* output - the output frame buffer (24 or 32 bit per pixel)
|
||||||
* width - the width of the output frame
|
* out_width - the width of the output frame
|
||||||
* height - the height of the output frame
|
* out_height - the height of the output frame
|
||||||
* bit_per_pixel - the number of bits per pixel allocated to the output
|
* bit_per_pixel - the number of bits per pixel allocated to the output
|
||||||
* frame (only 24 or 32 bpp are supported)
|
* frame (only 24 or 32 bpp are supported)
|
||||||
|
* inverted - if true the output frame is written top-down
|
||||||
*/
|
*/
|
||||||
static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
unsigned char *frame, unsigned int width, unsigned int height, int bit_per_pixel)
|
unsigned char *output, unsigned int out_width, unsigned int out_height, int bit_per_pixel, BOOL inverted)
|
||||||
{
|
{
|
||||||
cvid_codebook *v4_codebook, *v1_codebook, *codebook = NULL;
|
cvid_codebook *v4_codebook, *v1_codebook, *codebook = NULL;
|
||||||
unsigned long x, y, y_bottom, frame_flags, strips, cv_width, cv_height,
|
unsigned long x, y, y_bottom, cnum, strip_id, chunk_id,
|
||||||
cnum, strip_id, chunk_id, x0, y0, x1, y1, ci, flag, mask;
|
x0, y0, x1, y1, ci, flag, mask;
|
||||||
long len, top_size, chunk_size;
|
long top_size, chunk_size;
|
||||||
unsigned char *frm_ptr;
|
unsigned char *frm_ptr;
|
||||||
unsigned int i, cur_strip;
|
unsigned int i, cur_strip, addr;
|
||||||
int d0, d1, d2, d3, frm_stride, bpp = 3;
|
int d0, d1, d2, d3, frm_stride, bpp = 3;
|
||||||
fn_cvid_v1 cvid_v1 = cvid_v1_24;
|
fn_cvid_v1 cvid_v1 = cvid_v1_24;
|
||||||
fn_cvid_v4 cvid_v4 = cvid_v4_24;
|
fn_cvid_v4 cvid_v4 = cvid_v4_24;
|
||||||
|
struct frame_header
|
||||||
|
{
|
||||||
|
unsigned char flags;
|
||||||
|
unsigned long length;
|
||||||
|
unsigned short width;
|
||||||
|
unsigned short height;
|
||||||
|
unsigned short strips;
|
||||||
|
} frame;
|
||||||
|
|
||||||
y = 0;
|
y = 0;
|
||||||
y_bottom = 0;
|
y_bottom = 0;
|
||||||
in_buffer = buf;
|
in_buffer = buf;
|
||||||
|
|
||||||
frame_flags = get_byte();
|
frame.flags = get_byte();
|
||||||
len = get_byte() << 16;
|
frame.length = get_byte() << 16;
|
||||||
len |= get_byte() << 8;
|
frame.length |= get_byte() << 8;
|
||||||
len |= get_byte();
|
frame.length |= get_byte();
|
||||||
|
|
||||||
switch(bit_per_pixel)
|
switch(bit_per_pixel)
|
||||||
{
|
{
|
||||||
|
@ -432,32 +463,32 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
frm_stride = width * bpp;
|
frm_stride = out_width * bpp;
|
||||||
frm_ptr = frame;
|
frm_ptr = output;
|
||||||
|
|
||||||
if(len != size)
|
if(frame.length != size)
|
||||||
{
|
{
|
||||||
if(len & 0x01) len++; /* AVIs tend to have a size mismatch */
|
if(frame.length & 0x01) frame.length++; /* AVIs tend to have a size mismatch */
|
||||||
if(len != size)
|
if(frame.length != size)
|
||||||
{
|
{
|
||||||
ERR("CVID: corruption %d (QT/AVI) != %ld (CV)\n", size, len);
|
ERR("CVID: corruption %d (QT/AVI) != %ld (CV)\n", size, frame.length);
|
||||||
/* return; */
|
/* return; */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cv_width = get_word();
|
frame.width = get_word();
|
||||||
cv_height = get_word();
|
frame.height = get_word();
|
||||||
strips = get_word();
|
frame.strips = get_word();
|
||||||
|
|
||||||
if(strips > cvinfo->strip_num)
|
if(frame.strips > cvinfo->strip_num)
|
||||||
{
|
{
|
||||||
if(strips >= MAX_STRIPS)
|
if(frame.strips >= MAX_STRIPS)
|
||||||
{
|
{
|
||||||
ERR("CVID: strip overflow (more than %d)\n", MAX_STRIPS);
|
ERR("CVID: strip overflow (more than %d)\n", MAX_STRIPS);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = cvinfo->strip_num; i < strips; i++)
|
for(i = cvinfo->strip_num; i < frame.strips; i++)
|
||||||
{
|
{
|
||||||
if((cvinfo->v4_codebook[i] = heap_alloc(sizeof(cvid_codebook) * 260)) == NULL)
|
if((cvinfo->v4_codebook[i] = heap_alloc(sizeof(cvid_codebook) * 260)) == NULL)
|
||||||
{
|
{
|
||||||
|
@ -472,16 +503,17 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cvinfo->strip_num = strips;
|
cvinfo->strip_num = frame.strips;
|
||||||
|
|
||||||
TRACE("CVID: <%ld,%ld> strips %ld\n", cv_width, cv_height, strips);
|
TRACE("CVID: %ux%u, strips %u, length %lu\n",
|
||||||
|
frame.width, frame.height, frame.strips, frame.length);
|
||||||
|
|
||||||
for(cur_strip = 0; cur_strip < strips; cur_strip++)
|
for(cur_strip = 0; cur_strip < frame.strips; cur_strip++)
|
||||||
{
|
{
|
||||||
v4_codebook = cvinfo->v4_codebook[cur_strip];
|
v4_codebook = cvinfo->v4_codebook[cur_strip];
|
||||||
v1_codebook = cvinfo->v1_codebook[cur_strip];
|
v1_codebook = cvinfo->v1_codebook[cur_strip];
|
||||||
|
|
||||||
if((cur_strip > 0) && (!(frame_flags & 0x01)))
|
if((cur_strip > 0) && (!(frame.flags & 0x01)))
|
||||||
{
|
{
|
||||||
memcpy(cvinfo->v4_codebook[cur_strip], cvinfo->v4_codebook[cur_strip-1], 260 * sizeof(cvid_codebook));
|
memcpy(cvinfo->v4_codebook[cur_strip], cvinfo->v4_codebook[cur_strip-1], 260 * sizeof(cvid_codebook));
|
||||||
memcpy(cvinfo->v1_codebook[cur_strip], cvinfo->v1_codebook[cur_strip-1], 260 * sizeof(cvid_codebook));
|
memcpy(cvinfo->v1_codebook[cur_strip], cvinfo->v1_codebook[cur_strip-1], 260 * sizeof(cvid_codebook));
|
||||||
|
@ -497,8 +529,8 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
y_bottom += y1;
|
y_bottom += y1;
|
||||||
top_size -= 12;
|
top_size -= 12;
|
||||||
x = 0;
|
x = 0;
|
||||||
if(x1 != width)
|
if(x1 != out_width)
|
||||||
WARN("CVID: Warning x1 (%ld) != width (%d)\n", x1, width);
|
WARN("CVID: Warning x1 (%ld) != width (%d)\n", x1, out_width);
|
||||||
|
|
||||||
TRACE(" %d) %04lx %04ld <%ld,%ld> <%ld,%ld> yt %ld\n",
|
TRACE(" %d) %04lx %04ld <%ld,%ld> <%ld,%ld> yt %ld\n",
|
||||||
cur_strip, strip_id, top_size, x0, y0, x1, y1, y_bottom);
|
cur_strip, strip_id, top_size, x0, y0, x1, y1, y_bottom);
|
||||||
|
@ -596,24 +628,20 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
d2 = get_byte();
|
d2 = get_byte();
|
||||||
d3 = get_byte();
|
d3 = get_byte();
|
||||||
chunk_size -= 4;
|
chunk_size -= 4;
|
||||||
#ifdef ORIGINAL
|
|
||||||
cvid_v4(frm_ptr + (y * frm_stride + x * bpp), frm_end, frm_stride, v4_codebook+d0, v4_codebook+d1, v4_codebook+d2, v4_codebook+d3);
|
addr = get_addr(inverted, x, y, frm_stride, bpp, out_height);
|
||||||
#else
|
cvid_v4(frm_ptr + addr, output, frm_stride, inverted, v4_codebook+d0, v4_codebook+d1, v4_codebook+d2, v4_codebook+d3);
|
||||||
cvid_v4(frm_ptr + ((height - 1 - y) * frm_stride + x * bpp), frame, frm_stride, v4_codebook+d0, v4_codebook+d1, v4_codebook+d2, v4_codebook+d3);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else /* 1 byte per block */
|
else /* 1 byte per block */
|
||||||
{
|
{
|
||||||
#ifdef ORIGINAL
|
addr = get_addr(inverted, x, y, frm_stride, bpp, out_height);
|
||||||
cvid_v1(frm_ptr + (y * frm_stride + x * bpp), frm_end, frm_stride, v1_codebook + get_byte());
|
cvid_v1(frm_ptr + addr, output, frm_stride, inverted, v1_codebook + get_byte());
|
||||||
#else
|
|
||||||
cvid_v1(frm_ptr + ((height - 1 - y) * frm_stride + x * bpp), frame, frm_stride, v1_codebook + get_byte());
|
|
||||||
#endif
|
|
||||||
chunk_size--;
|
chunk_size--;
|
||||||
}
|
}
|
||||||
|
|
||||||
x += 4;
|
x += 4;
|
||||||
if(x >= width)
|
if(x >= out_width)
|
||||||
{
|
{
|
||||||
x = 0;
|
x = 0;
|
||||||
y += 4;
|
y += 4;
|
||||||
|
@ -652,26 +680,22 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
d2 = get_byte();
|
d2 = get_byte();
|
||||||
d3 = get_byte();
|
d3 = get_byte();
|
||||||
chunk_size -= 4;
|
chunk_size -= 4;
|
||||||
#ifdef ORIGINAL
|
|
||||||
cvid_v4(frm_ptr + (y * frm_stride + x * bpp), frm_end, frm_stride, v4_codebook+d0, v4_codebook+d1, v4_codebook+d2, v4_codebook+d3);
|
addr = get_addr(inverted, x, y, frm_stride, bpp, out_height);
|
||||||
#else
|
cvid_v4(frm_ptr + addr, output, frm_stride, inverted, v4_codebook+d0, v4_codebook+d1, v4_codebook+d2, v4_codebook+d3);
|
||||||
cvid_v4(frm_ptr + ((height - 1 - y) * frm_stride + x * bpp), frame, frm_stride, v4_codebook+d0, v4_codebook+d1, v4_codebook+d2, v4_codebook+d3);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else /* V1 */
|
else /* V1 */
|
||||||
{
|
{
|
||||||
chunk_size--;
|
chunk_size--;
|
||||||
#ifdef ORIGINAL
|
|
||||||
cvid_v1(frm_ptr + (y * frm_stride + x * bpp), frm_end, frm_stride, v1_codebook + get_byte());
|
addr = get_addr(inverted, x, y, frm_stride, bpp, out_height);
|
||||||
#else
|
cvid_v1(frm_ptr + addr, output, frm_stride, inverted, v1_codebook + get_byte());
|
||||||
cvid_v1(frm_ptr + ((height - 1 - y) * frm_stride + x * bpp), frame, frm_stride, v1_codebook + get_byte());
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} /* else SKIP */
|
} /* else SKIP */
|
||||||
|
|
||||||
mask >>= 1;
|
mask >>= 1;
|
||||||
x += 4;
|
x += 4;
|
||||||
if(x >= width)
|
if(x >= out_width)
|
||||||
{
|
{
|
||||||
x = 0;
|
x = 0;
|
||||||
y += 4;
|
y += 4;
|
||||||
|
@ -685,14 +709,12 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
case 0x3200: /* each byte is a V1 codebook */
|
case 0x3200: /* each byte is a V1 codebook */
|
||||||
while((chunk_size > 0) && (y < y_bottom))
|
while((chunk_size > 0) && (y < y_bottom))
|
||||||
{
|
{
|
||||||
#ifdef ORIGINAL
|
addr = get_addr(inverted, x, y, frm_stride, bpp, out_height);
|
||||||
cvid_v1(frm_ptr + (y * frm_stride + x * bpp), frm_end, frm_stride, v1_codebook + get_byte());
|
cvid_v1(frm_ptr + addr, output, frm_stride, inverted, v1_codebook + get_byte());
|
||||||
#else
|
|
||||||
cvid_v1(frm_ptr + ((height - 1 - y) * frm_stride + x * bpp), frame, frm_stride, v1_codebook + get_byte());
|
|
||||||
#endif
|
|
||||||
chunk_size--;
|
chunk_size--;
|
||||||
x += 4;
|
x += 4;
|
||||||
if(x >= width)
|
if(x >= out_width)
|
||||||
{
|
{
|
||||||
x = 0;
|
x = 0;
|
||||||
y += 4;
|
y += 4;
|
||||||
|
@ -709,10 +731,10 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(len != size)
|
if(frame.length != size)
|
||||||
{
|
{
|
||||||
if(len & 0x01) len++; /* AVIs tend to have a size mismatch */
|
if(frame.length & 0x01) frame.length++; /* AVIs tend to have a size mismatch */
|
||||||
if(len != size)
|
if(frame.length != size)
|
||||||
{
|
{
|
||||||
long xlen;
|
long xlen;
|
||||||
skip_byte();
|
skip_byte();
|
||||||
|
@ -720,7 +742,7 @@ static void decode_cinepak(cinepak_info *cvinfo, unsigned char *buf, int size,
|
||||||
xlen |= get_byte() << 8;
|
xlen |= get_byte() << 8;
|
||||||
xlen |= get_byte(); /* Read Len */
|
xlen |= get_byte(); /* Read Len */
|
||||||
WARN("CVID: END INFO chunk size %d cvid size1 %ld cvid size2 %ld\n",
|
WARN("CVID: END INFO chunk size %d cvid size1 %ld cvid size2 %ld\n",
|
||||||
size, len, xlen);
|
size, frame.length, xlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -777,7 +799,11 @@ static LRESULT ICCVID_DecompressQuery( ICCVID_Info *info, LPBITMAPINFO in, LPBIT
|
||||||
if( in->bmiHeader.biPlanes != out->bmiHeader.biPlanes )
|
if( in->bmiHeader.biPlanes != out->bmiHeader.biPlanes )
|
||||||
return ICERR_BADFORMAT;
|
return ICERR_BADFORMAT;
|
||||||
if( in->bmiHeader.biHeight != out->bmiHeader.biHeight )
|
if( in->bmiHeader.biHeight != out->bmiHeader.biHeight )
|
||||||
return ICERR_BADFORMAT;
|
{
|
||||||
|
if( in->bmiHeader.biHeight != -out->bmiHeader.biHeight )
|
||||||
|
return ICERR_BADFORMAT;
|
||||||
|
TRACE("Detected inverted height for video output\n");
|
||||||
|
}
|
||||||
if( in->bmiHeader.biWidth != out->bmiHeader.biWidth )
|
if( in->bmiHeader.biWidth != out->bmiHeader.biWidth )
|
||||||
return ICERR_BADFORMAT;
|
return ICERR_BADFORMAT;
|
||||||
|
|
||||||
|
@ -869,6 +895,7 @@ static LRESULT ICCVID_DecompressBegin( ICCVID_Info *info, LPBITMAPINFO in, LPBIT
|
||||||
static LRESULT ICCVID_Decompress( ICCVID_Info *info, ICDECOMPRESS *icd, DWORD size )
|
static LRESULT ICCVID_Decompress( ICCVID_Info *info, ICDECOMPRESS *icd, DWORD size )
|
||||||
{
|
{
|
||||||
LONG width, height;
|
LONG width, height;
|
||||||
|
BOOL inverted;
|
||||||
|
|
||||||
TRACE("ICM_DECOMPRESS %p %p %d\n", info, icd, size);
|
TRACE("ICM_DECOMPRESS %p %p %d\n", info, icd, size);
|
||||||
|
|
||||||
|
@ -882,9 +909,10 @@ static LRESULT ICCVID_Decompress( ICCVID_Info *info, ICDECOMPRESS *icd, DWORD si
|
||||||
|
|
||||||
width = icd->lpbiInput->biWidth;
|
width = icd->lpbiInput->biWidth;
|
||||||
height = icd->lpbiInput->biHeight;
|
height = icd->lpbiInput->biHeight;
|
||||||
|
inverted = -icd->lpbiOutput->biHeight == height;
|
||||||
|
|
||||||
decode_cinepak(info->cvinfo, icd->lpInput, icd->lpbiInput->biSizeImage,
|
decode_cinepak(info->cvinfo, icd->lpInput, icd->lpbiInput->biSizeImage,
|
||||||
icd->lpOutput, width, height, info->bits_per_pixel);
|
icd->lpOutput, width, height, info->bits_per_pixel, inverted);
|
||||||
|
|
||||||
return ICERR_OK;
|
return ICERR_OK;
|
||||||
}
|
}
|
||||||
|
@ -892,6 +920,7 @@ static LRESULT ICCVID_Decompress( ICCVID_Info *info, ICDECOMPRESS *icd, DWORD si
|
||||||
static LRESULT ICCVID_DecompressEx( ICCVID_Info *info, ICDECOMPRESSEX *icd, DWORD size )
|
static LRESULT ICCVID_DecompressEx( ICCVID_Info *info, ICDECOMPRESSEX *icd, DWORD size )
|
||||||
{
|
{
|
||||||
LONG width, height;
|
LONG width, height;
|
||||||
|
BOOL inverted;
|
||||||
|
|
||||||
TRACE("ICM_DECOMPRESSEX %p %p %d\n", info, icd, size);
|
TRACE("ICM_DECOMPRESSEX %p %p %d\n", info, icd, size);
|
||||||
|
|
||||||
|
@ -907,9 +936,10 @@ static LRESULT ICCVID_DecompressEx( ICCVID_Info *info, ICDECOMPRESSEX *icd, DWOR
|
||||||
|
|
||||||
width = icd->lpbiSrc->biWidth;
|
width = icd->lpbiSrc->biWidth;
|
||||||
height = icd->lpbiSrc->biHeight;
|
height = icd->lpbiSrc->biHeight;
|
||||||
|
inverted = -icd->lpbiDst->biHeight == height;
|
||||||
|
|
||||||
decode_cinepak(info->cvinfo, icd->lpSrc, icd->lpbiSrc->biSizeImage,
|
decode_cinepak(info->cvinfo, icd->lpSrc, icd->lpbiSrc->biSizeImage,
|
||||||
icd->lpDst, width, height, info->bits_per_pixel);
|
icd->lpDst, width, height, info->bits_per_pixel, inverted);
|
||||||
|
|
||||||
return ICERR_OK;
|
return ICERR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ reactos/dll/win32/hhctrl.ocx # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/hlink # Synced to WineStaging-1.7.47
|
reactos/dll/win32/hlink # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/hnetcfg # Synced to WineStaging-1.7.55
|
reactos/dll/win32/hnetcfg # Synced to WineStaging-1.7.55
|
||||||
reactos/dll/win32/httpapi # Synced to WineStaging-1.7.47
|
reactos/dll/win32/httpapi # Synced to WineStaging-1.7.47
|
||||||
reactos/dll/win32/iccvid # Synced to WineStaging-1.7.47
|
reactos/dll/win32/iccvid # Synced to WineStaging-1.7.55
|
||||||
reactos/dll/win32/icmp # Out of sync
|
reactos/dll/win32/icmp # Out of sync
|
||||||
reactos/dll/win32/ieframe # Synced to WineStaging-1.7.55
|
reactos/dll/win32/ieframe # Synced to WineStaging-1.7.55
|
||||||
reactos/dll/win32/imaadp32.acm # Synced to WineStaging-1.7.47
|
reactos/dll/win32/imaadp32.acm # Synced to WineStaging-1.7.47
|
||||||
|
|
Loading…
Reference in a new issue