Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
6961ec33
Commit
6961ec33
authored
Feb 03, 2000
by
Vincent Seguin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Synchro am�lior�e X et Y, dans les 2 sens
parent
d1cd2a9c
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
139 additions
and
1024 deletions
+139
-1024
include/config.h
include/config.h
+4
-0
include/video_output.h
include/video_output.h
+3
-3
src/video_output/video_fb.c
src/video_output/video_fb.c
+1
-3
src/video_output/video_yuv.c
src/video_output/video_yuv.c
+131
-1018
No files found.
include/config.h
View file @
6961ec33
...
@@ -236,6 +236,10 @@
...
@@ -236,6 +236,10 @@
#define VOUT_WIDTH_DEFAULT 640
#define VOUT_WIDTH_DEFAULT 640
#define VOUT_HEIGHT_DEFAULT 480
#define VOUT_HEIGHT_DEFAULT 480
/* Maximum width of a scaled source picture - this should be relatively high,
* since higher stream values will result in no display at all. */
#define VOUT_MAX_WIDTH 4096
/* Video heap size - remember that a decompressed picture is big
/* Video heap size - remember that a decompressed picture is big
* (~1 Mbyte) before using huge values */
* (~1 Mbyte) before using huge values */
#define VOUT_MAX_PICTURES 10
#define VOUT_MAX_PICTURES 10
...
...
include/video_output.h
View file @
6961ec33
...
@@ -41,7 +41,7 @@ typedef struct vout_yuv_s
...
@@ -41,7 +41,7 @@ typedef struct vout_yuv_s
vout_yuv_convert_t
*
p_Convert444
;
/* YUV 4:4:4 converter */
vout_yuv_convert_t
*
p_Convert444
;
/* YUV 4:4:4 converter */
/* Pre-calculated convertion tables */
/* Pre-calculated convertion tables */
void
*
p_base
;
/* base for all transla
tion tables */
void
*
p_base
;
/* base for all conver
tion tables */
union
union
{
{
struct
{
u16
*
p_red
,
*
p_green
,
*
p_blue
;
}
rgb16
;
/* color 15, 16 bpp */
struct
{
u16
*
p_red
,
*
p_green
,
*
p_blue
;
}
rgb16
;
/* color 15, 16 bpp */
...
@@ -55,9 +55,9 @@ typedef struct vout_yuv_s
...
@@ -55,9 +55,9 @@ typedef struct vout_yuv_s
u32
*
p_rgb32
;
u32
*
p_rgb32
;
}
yuv2
;
//??
}
yuv2
;
//??
/* Temporary convertion buffer - this buffer may be used by convertion
/* Temporary convertion buffer and offset array */
* functions and should be 2 screen lines width */
void
*
p_buffer
;
/* convertion buffer */
void
*
p_buffer
;
/* convertion buffer */
int
*
p_offset
;
/* offset array */
}
vout_yuv_t
;
}
vout_yuv_t
;
/*******************************************************************************
/*******************************************************************************
...
...
src/video_output/video_fb.c
View file @
6961ec33
...
@@ -128,9 +128,7 @@ void vout_SysDisplay( vout_thread_t *p_vout )
...
@@ -128,9 +128,7 @@ void vout_SysDisplay( vout_thread_t *p_vout )
{
{
/* tout est bien affich, on peut changer les 2 crans */
/* tout est bien affich, on peut changer les 2 crans */
p_vout
->
p_sys
->
var_info
.
xoffset
=
0
;
p_vout
->
p_sys
->
var_info
.
xoffset
=
0
;
p_vout
->
p_sys
->
var_info
.
yoffset
=
p_vout
->
p_sys
->
var_info
.
yoffset
=
p_vout
->
i_buffer_index
?
p_vout
->
p_sys
->
var_info
.
yres
:
0
;
0
;
//p_vout->p_sys->i_buffer_index ? 0 : p_vout->p_sys->var_info.yres;
//ioctl( p_vout->p_sys->i_fb_dev, FBIOPUT_VSCREENINFO, &p_vout->p_sys->var_info );
//ioctl( p_vout->p_sys->i_fb_dev, FBIOPUT_VSCREENINFO, &p_vout->p_sys->var_info );
ioctl
(
p_vout
->
p_sys
->
i_fb_dev
,
FBIOPAN_DISPLAY
,
&
p_vout
->
p_sys
->
var_info
);
ioctl
(
p_vout
->
p_sys
->
i_fb_dev
,
FBIOPAN_DISPLAY
,
&
p_vout
->
p_sys
->
var_info
);
...
...
src/video_output/video_yuv.c
View file @
6961ec33
...
@@ -140,66 +140,17 @@ for (i_y = 0; i_y < i_height ; i_y++) \
...
@@ -140,66 +140,17 @@ for (i_y = 0; i_y < i_height ; i_y++) \
p_pic += i_pic_line_width; \
p_pic += i_pic_line_width; \
}
}
/*******************************************************************************
* CONVERT_YUV_RGB: color YUV convertion
*******************************************************************************
* This macro does not perform any scaling, but crops the picture. It is
* provided as a temporary way of implementing an YUV convertion function.
*******************************************************************************/
#define CONVERT_YUV_RGB( CHROMA, CRV, CGV, CBU, CGU ) \
/* Change boundaries according to picture size */
\
i_width = MIN( i_width, i_pic_width ); \
i_height = MIN( i_height, i_pic_height ); \
i_chroma_width = (CHROMA == 444) ? i_width : i_width / 2; \
i_pic_line_width -= i_width; \
\
/* Loop */
\
for (i_y = 0; i_y < i_height ; i_y++) \
{ \
for (i_x = 0; i_x < i_width; ) \
{ \
/* First sample (complete) */
\
i_yval = 76309 * p_y[i_x] - 1188177; \
i_uval = *p_u++ - 128; \
i_vval = *p_v++ - 128; \
p_pic[i_x++] = \
p_red [(i_yval+CRV*i_vval) >>16] | \
p_green[(i_yval-CGU*i_uval-CGV*i_vval) >>16] | \
p_blue [(i_yval+CBU*i_uval) >>16]; \
i_yval = 76309 * p_y[i_x] - 1188177; \
/* Second sample (partial) */
\
if( CHROMA == 444 ) \
{ \
i_uval = *p_u++ - 128; \
i_vval = *p_v++ - 128; \
} \
p_pic[i_x++] = \
p_red [(i_yval+CRV*i_vval) >>16] | \
p_green[(i_yval-CGU*i_uval-CGV*i_vval) >>16] | \
p_blue [(i_yval+CBU*i_uval) >>16]; \
} \
\
/* Rewind in 4:2:0 */
\
if( (CHROMA == 420) && !(i_y & 0x1) ) \
{ \
p_u -= i_chroma_width; \
p_v -= i_chroma_width; \
} \
\
/* Skip until beginning of next line */
\
p_pic += i_pic_line_width; \
}
/*******************************************************************************
/*******************************************************************************
* CONVERT_YUV_PIXEL, CONVERT_Y_PIXEL: pixel convertion blocks
* CONVERT_YUV_PIXEL, CONVERT_Y_PIXEL: pixel convertion blocks
*******************************************************************************
*******************************************************************************
* These convertion routines are used by YUV convertion functions.
* These convertion routines are used by YUV convertion functions.
* Convertion are made from p_y, p_u, p_v, which are modified, to i_dst. ??
* Convertion are made from p_y, p_u, p_v, which are modified, to p_buffer,
* which is also modified.
*******************************************************************************/
*******************************************************************************/
#define CONVERT_Y_PIXEL \
#define CONVERT_Y_PIXEL \
/* Only Y sample is present */
\
/* Only Y sample is present */
\
p_ybase = p_yuv + *(p_y++); \
p_ybase = p_yuv + *(p_y++); \
*p_
pic++ = p_ybase[1501 - ((V_RED_COEF*128)>>SHIFT) + i_red] |
\
*p_
buffer++ = p_ybase[1501 - ((V_RED_COEF*128)>>SHIFT) + i_red] |
\
p_ybase[135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) + i_green ] | \
p_ybase[135 - (((U_GREEN_COEF+V_GREEN_COEF)*128)>>SHIFT) + i_green ] | \
p_ybase[818 - ((U_BLUE_COEF*128)>>SHIFT) + i_blue]; \
p_ybase[818 - ((U_BLUE_COEF*128)>>SHIFT) + i_blue]; \
...
@@ -212,14 +163,6 @@ for (i_y = 0; i_y < i_height ; i_y++) \
...
@@ -212,14 +163,6 @@ for (i_y = 0; i_y < i_height ; i_y++) \
i_blue = (U_BLUE_COEF * i_uval) >> SHIFT; \
i_blue = (U_BLUE_COEF * i_uval) >> SHIFT; \
CONVERT_Y_PIXEL \
CONVERT_Y_PIXEL \
#define COPY_PIXEL \
/* Pixel may be copied, but only once */
\
while( (i_width_count -= i_width) > 0 ) \
{ \
*p_pic++ = *(p_pic - 1); \
} \
i_width_count += i_pic_width; \
/*******************************************************************************
/*******************************************************************************
* vout_InitYUV: allocate and initialize translations tables
* vout_InitYUV: allocate and initialize translations tables
*******************************************************************************
*******************************************************************************
...
@@ -251,10 +194,6 @@ int vout_InitYUV( vout_thread_t *p_vout )
...
@@ -251,10 +194,6 @@ int vout_InitYUV( vout_thread_t *p_vout )
break
;
break
;
#endif
#endif
}
}
/* Add conversion buffer size. The conversions functions need one comple line
* plus one pixel, so we give them two. */
tables_size
+=
p_vout
->
i_bytes_per_line
*
2
;
/* Allocate memory */
/* Allocate memory */
p_vout
->
yuv
.
p_base
=
malloc
(
tables_size
);
p_vout
->
yuv
.
p_base
=
malloc
(
tables_size
);
...
@@ -264,8 +203,25 @@ int vout_InitYUV( vout_thread_t *p_vout )
...
@@ -264,8 +203,25 @@ int vout_InitYUV( vout_thread_t *p_vout )
return
(
1
);
return
(
1
);
}
}
/* Allocate memory for convertion buffer and offset array */
p_vout
->
yuv
.
p_buffer
=
malloc
(
VOUT_MAX_WIDTH
*
p_vout
->
i_bytes_per_pixel
);
if
(
p_vout
->
yuv
.
p_buffer
==
NULL
)
{
intf_ErrMsg
(
"error: %s
\n
"
,
strerror
(
ENOMEM
));
free
(
p_vout
->
yuv
.
p_base
);
return
(
1
);
}
p_vout
->
yuv
.
p_offset
=
malloc
(
p_vout
->
i_width
*
sizeof
(
int
)
);
if
(
p_vout
->
yuv
.
p_offset
==
NULL
)
{
intf_ErrMsg
(
"error: %s
\n
"
,
strerror
(
ENOMEM
));
free
(
p_vout
->
yuv
.
p_base
);
free
(
p_vout
->
yuv
.
p_buffer
);
return
(
1
);
}
/* Initialize tables */
/* Initialize tables */
SetYUV
(
p_vout
);
SetYUV
(
p_vout
);
return
(
0
);
return
(
0
);
}
}
...
@@ -289,6 +245,8 @@ int vout_ResetYUV( vout_thread_t *p_vout )
...
@@ -289,6 +245,8 @@ int vout_ResetYUV( vout_thread_t *p_vout )
void
vout_EndYUV
(
vout_thread_t
*
p_vout
)
void
vout_EndYUV
(
vout_thread_t
*
p_vout
)
{
{
free
(
p_vout
->
yuv
.
p_base
);
free
(
p_vout
->
yuv
.
p_base
);
free
(
p_vout
->
yuv
.
p_buffer
);
free
(
p_vout
->
yuv
.
p_offset
);
}
}
/* following functions are local */
/* following functions are local */
...
@@ -458,7 +416,6 @@ static void SetYUV( vout_thread_t *p_vout )
...
@@ -458,7 +416,6 @@ static void SetYUV( vout_thread_t *p_vout )
p_vout
->
yuv
.
yuv
.
rgb16
.
p_green
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
1024
+
384
;
p_vout
->
yuv
.
yuv
.
rgb16
.
p_green
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
1024
+
384
;
p_vout
->
yuv
.
yuv
.
rgb16
.
p_blue
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
2
*
1024
+
384
;
p_vout
->
yuv
.
yuv
.
rgb16
.
p_blue
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
2
*
1024
+
384
;
p_vout
->
yuv
.
yuv2
.
p_rgb16
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
3
*
1024
;
p_vout
->
yuv
.
yuv2
.
p_rgb16
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
3
*
1024
;
p_vout
->
yuv
.
p_buffer
=
(
u16
*
)
p_vout
->
yuv
.
p_base
+
3
*
1024
+
1935
;
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
{
p_vout
->
yuv
.
yuv
.
rgb16
.
p_red
[
i_index
]
=
(
pi_gamma
[
CLIP_BYTE
(
i_index
)]
>>
i_red_right
)
<<
i_red_left
;
p_vout
->
yuv
.
yuv
.
rgb16
.
p_red
[
i_index
]
=
(
pi_gamma
[
CLIP_BYTE
(
i_index
)]
>>
i_red_right
)
<<
i_red_left
;
...
@@ -493,7 +450,6 @@ static void SetYUV( vout_thread_t *p_vout )
...
@@ -493,7 +450,6 @@ static void SetYUV( vout_thread_t *p_vout )
p_vout
->
yuv
.
yuv
.
rgb32
.
p_green
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
1024
+
384
;
p_vout
->
yuv
.
yuv
.
rgb32
.
p_green
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
1024
+
384
;
p_vout
->
yuv
.
yuv
.
rgb32
.
p_blue
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
2
*
1024
+
384
;
p_vout
->
yuv
.
yuv
.
rgb32
.
p_blue
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
2
*
1024
+
384
;
p_vout
->
yuv
.
yuv2
.
p_rgb32
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
3
*
1024
;
p_vout
->
yuv
.
yuv2
.
p_rgb32
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
3
*
1024
;
p_vout
->
yuv
.
p_buffer
=
(
u32
*
)
p_vout
->
yuv
.
p_base
+
3
*
1024
+
1935
;
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
{
p_vout
->
yuv
.
yuv
.
rgb32
.
p_red
[
i_index
]
=
(
pi_gamma
[
CLIP_BYTE
(
i_index
)]
>>
i_red_right
)
<<
i_red_left
;
p_vout
->
yuv
.
yuv
.
rgb32
.
p_red
[
i_index
]
=
(
pi_gamma
[
CLIP_BYTE
(
i_index
)]
>>
i_red_right
)
<<
i_red_left
;
...
@@ -612,55 +568,74 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
...
@@ -612,55 +568,74 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
i_scale, (u8 *)p_pic, 0, 0, (i_width + i_pic_eol) * sizeof( u16 ),
i_scale, (u8 *)p_pic, 0, 0, (i_width + i_pic_eol) * sizeof( u16 ),
p_vout->i_screen_depth == 15 );
p_vout->i_screen_depth == 15 );
*/
*/
boolean_t
b_horizontal_scaling
;
/* horizontal scaling type */
#if 0
u16 * p_red; /* red table */
u16 * p_green; /* green table */
u16 * p_blue; /* blue table */
int i_uval, i_yval, i_vval; /* samples */
int i_x, i_y; /* picture coordinates */
int i_chroma_width, i_chroma_skip; /* width and eol for chroma */
int i_crv, i_cbu, i_cgu, i_cgv; /* transformation coefficients */
p_red = p_vout->yuv.yuv.rgb16.p_red;
p_green = p_vout->yuv.yuv.rgb16.p_green;
p_blue = p_vout->yuv.yuv.rgb16.p_blue;
i_crv = MATRIX_COEFFICIENTS_TABLE[i_matrix_coefficients][0];
i_cbu = MATRIX_COEFFICIENTS_TABLE[i_matrix_coefficients][1];
i_cgu = MATRIX_COEFFICIENTS_TABLE[i_matrix_coefficients][2];
i_cgv = MATRIX_COEFFICIENTS_TABLE[i_matrix_coefficients][3];
CONVERT_YUV_RGB( 420, i_crv, i_cgv, i_cbu, i_cgu );
#else
int
i_horizontal_scaling
;
/* horizontal scaling type */
int
i_vertical_scaling
;
/* vertical scaling type */
int
i_vertical_scaling
;
/* vertical scaling type */
int
i_x
,
i_y
;
/* horizontal and vertical indexes */
int
i_x
,
i_y
;
/* horizontal and vertical indexes */
int
i_scale_count
;
/* scale modulo counter */
int
i_uval
,
i_vval
;
/* U and V samples */
int
i_uval
,
i_vval
;
/* U and V samples */
int
i_red
,
i_green
,
i_blue
;
/* U and V modified samples */
int
i_red
,
i_green
,
i_blue
;
/* U and V modified samples */
int
i_chroma_width
;
/* chroma width */
int
i_chroma_width
;
/* chroma width */
int
i_width_count
;
/* width modulo counter */
int
i_height_count
;
/* height modulo counter */
u16
*
p_yuv
;
/* base convertion table */
u16
*
p_yuv
;
/* base convertion table */
u16
*
p_ybase
;
/* Y dependant convertion table */
u16
*
p_ybase
;
/* Y dependant convertion table */
u16
*
p_pic_start
;
/* beginning of the current line */
u16
*
p_pic_start
;
/* beginning of the current line for copy */
u16
*
p_buffer_start
;
/* convertion buffer start */
u16
*
p_buffer
;
/* convertion buffer pointer */
int
*
p_offset_start
;
/* offset array start */
int
*
p_offset
;
/* offset array pointer */
/* Initialize values */
/*
i_height_count
=
i_pic_height
;
* Initialize some values - i_pic_line_width will store the line skip
*/
i_pic_line_width
-=
i_pic_width
;
i_chroma_width
=
i_width
/
2
;
i_chroma_width
=
i_width
/
2
;
p_yuv
=
p_vout
->
yuv
.
yuv2
.
p_rgb16
;
p_yuv
=
p_vout
->
yuv
.
yuv2
.
p_rgb16
;
/* Set scalings */
/*
* Set scalings
*/
if
(
i_pic_width
-
i_width
>
0
)
if
(
i_pic_width
-
i_width
>
0
)
{
{
i_horizontal_scaling
=
1
;
/* Prepare scaling array for horizontal extension */
b_horizontal_scaling
=
1
;
p_buffer_start
=
p_vout
->
yuv
.
p_buffer
;
p_offset_start
=
p_vout
->
yuv
.
p_offset
;
p_offset
=
p_offset_start
;
i_scale_count
=
i_pic_width
;
for
(
i_x
=
i_width
;
i_x
--
;
)
{
while
(
(
i_scale_count
-=
i_width
)
>
0
)
{
*
p_offset
++
=
0
;
}
*
p_offset
++
=
1
;
i_scale_count
+=
i_pic_width
;
}
}
}
else
if
(
i_pic_width
-
i_width
<
0
)
else
if
(
i_pic_width
-
i_width
<
0
)
{
{
i_horizontal_scaling
=
-
1
;
/* Prepare scaling array for horizontal reduction */
b_horizontal_scaling
=
1
;
p_buffer_start
=
p_vout
->
yuv
.
p_buffer
;
p_offset_start
=
p_vout
->
yuv
.
p_offset
;
p_offset
=
p_offset_start
;
i_scale_count
=
i_pic_width
;
for
(
i_x
=
i_pic_width
;
i_x
--
;
)
{
*
p_offset
=
1
;
while
(
(
i_scale_count
-=
i_pic_width
)
>=
0
)
{
*
p_offset
+=
1
;
}
p_offset
++
;
i_scale_count
+=
i_width
;
}
}
}
else
else
{
{
i_horizontal_scaling
=
0
;
/* No horizontal scaling: YUV convertion is done directly to picture */
b_horizontal_scaling
=
0
;
p_buffer_start
=
p_pic
;
p_offset_start
=
NULL
;
/* to avoid warning */
}
}
if
(
i_pic_height
-
i_height
>
0
)
if
(
i_pic_height
-
i_height
>
0
)
{
{
...
@@ -678,95 +653,59 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
...
@@ -678,95 +653,59 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
/*
/*
* Perform convertion
* Perform convertion
*/
*/
i_
height
_count
=
i_pic_height
;
i_
scale
_count
=
i_pic_height
;
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
)
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
)
{
{
/* Mark beginnning of line */
/* Mark beginnning of line for possible later line copy, and initialize
p_pic_start
=
p_pic
;
* buffer */
p_pic_start
=
p_pic
;
/* Convert line using 16 pixels blocks, since picture come from 16 pixels
p_buffer
=
b_horizontal_scaling
?
p_buffer_start
:
p_pic
;
* width macroblocks - several loops will be used, depending of the
* scaling type */
/* Do YUV convertion to buffer - YUV picture is always formed of 16
switch
(
i_horizontal_scaling
)
* pixels wide blocks */
for
(
i_x
=
i_width
/
16
;
i_x
--
;
)
{
{
case
1
:
/* horizontal scaling is > 1 */
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
i_width_count
=
i_pic_width
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
for
(
i_x
=
i_width
/
16
;
i_x
--
;
)
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
}
if
(
b_horizontal_scaling
)
{
/* Horizontal scaling, convertion has been done to buffer.
* Rewind buffer and offset, then copy and scale line */
p_buffer
=
p_buffer_start
;
p_offset
=
p_offset_start
;
for
(
i_x
=
i_pic_width
/
16
;
i_x
--
;
)
{
{
CONVERT_YUV_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_Y_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_YUV_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_Y_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_YUV_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_Y_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_YUV_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_Y_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
COPY_PIXEL
;
*
p_pic
++
=
*
p_buffer
;
p_buffer
+=
*
p_offset
++
;
CONVERT_YUV_PIXEL
;
COPY_PIXEL
;
CONVERT_Y_PIXEL
;
COPY_PIXEL
;
CONVERT_YUV_PIXEL
;
COPY_PIXEL
;
CONVERT_Y_PIXEL
;
COPY_PIXEL
;
CONVERT_YUV_PIXEL
;
COPY_PIXEL
;
CONVERT_Y_PIXEL
;
COPY_PIXEL
;
CONVERT_YUV_PIXEL
;
COPY_PIXEL
;
CONVERT_Y_PIXEL
;
COPY_PIXEL
;
}
}
break
;
}
case
0
:
else
for
(
i_x
=
i_width
/
16
;
i_x
--
;
)
{
{
/* No scaling, convertion has been done directly in picture memory.
CONVERT_YUV_PIXEL
;
* Increment of picture pointer to end of line is still needed */
CONVERT_Y_PIXEL
;
p_pic
+=
i_pic_width
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
CONVERT_YUV_PIXEL
;
CONVERT_Y_PIXEL
;
}
break
;
case
-
1
:
i_width_count
=
i_width
;
/* {
while( (i_width_count -= i_pic_width) > 0)
{
p_y++;
p_u++;
}
i_width_count += i_width;
}
CONVERT_Y_PIXEL;
while( (i_width_count -= i_width) > 0)
{
*p_pic++ = *(p_pic - 1);
}
i_width_count += i_pic_width;
break;
*/
break
;
}
}
/* If line is odd, rewind U and V samples */
/* If line is odd, rewind U and V samples */
...
@@ -777,16 +716,16 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
...
@@ -777,16 +716,16 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
}
}
/* End of line: skip picture to reach beginning of next line */
/* End of line: skip picture to reach beginning of next line */
p_pic
+=
i_pic_line_width
-
i_pic_width
;
p_pic
+=
i_pic_line_width
;
/*
/*
* Handle vertical scaling. The current line
is
copied or next one
* Handle vertical scaling. The current line
can be
copied or next one
*
is
ignored.
*
can be
ignored.
*/
*/
switch
(
i_vertical_scaling
)
switch
(
i_vertical_scaling
)
{
{
case
-
1
:
/* vertical scaling factor is < 1 */
case
-
1
:
/* vertical scaling factor is < 1 */
while
(
(
i_
height
_count
-=
i_pic_height
)
>=
0
)
while
(
(
i_
scale
_count
-=
i_pic_height
)
>=
0
)
{
{
/* Height reduction: skip next source line */
/* Height reduction: skip next source line */
p_y
+=
i_width
;
p_y
+=
i_width
;
...
@@ -796,10 +735,10 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
...
@@ -796,10 +735,10 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
p_v
+=
i_chroma_width
;
p_v
+=
i_chroma_width
;
}
}
}
}
i_
height
_count
+=
i_height
;
i_
scale
_count
+=
i_height
;
break
;
break
;
case
1
:
/* vertical scaling factor is > 1 */
case
1
:
/* vertical scaling factor is > 1 */
while
(
(
i_
height
_count
-=
i_height
)
>
0
)
while
(
(
i_
scale
_count
-=
i_height
)
>
0
)
{
{
/* Height increment: copy previous picture line */
/* Height increment: copy previous picture line */
for
(
i_x
=
i_pic_width
/
16
;
i_x
--
;
)
for
(
i_x
=
i_pic_width
/
16
;
i_x
--
;
)
...
@@ -809,14 +748,13 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
...
@@ -809,14 +748,13 @@ static void ConvertYUV420RGB16( p_vout_thread_t p_vout, u16 *p_pic, yuv_data_t *
*
(((
u64
*
)
p_pic
)
++
)
=
*
(((
u64
*
)
p_pic_start
)
++
);
*
(((
u64
*
)
p_pic
)
++
)
=
*
(((
u64
*
)
p_pic_start
)
++
);
*
(((
u64
*
)
p_pic
)
++
)
=
*
(((
u64
*
)
p_pic_start
)
++
);
*
(((
u64
*
)
p_pic
)
++
)
=
*
(((
u64
*
)
p_pic_start
)
++
);
}
}
p_pic
+=
i_pic_line_width
-
i_pic_width
;
p_pic
+=
i_pic_line_width
;
p_pic_start
+=
i_pic_line_width
-
i_pic_width
;
p_pic_start
+=
i_pic_line_width
;
}
}
i_
height
_count
+=
i_pic_height
;
i_
scale
_count
+=
i_pic_height
;
break
;
break
;
}
}
}
}
#endif
}
}
/*******************************************************************************
/*******************************************************************************
...
@@ -980,201 +918,6 @@ static int rgbTable32 (int table [1935],
...
@@ -980,201 +918,6 @@ static int rgbTable32 (int table [1935],
}
}
void
yuvToRgb16
(
unsigned
char
*
Y
,
unsigned
char
*
U
,
unsigned
char
*
V
,
short
*
dest
,
short
table
[
1935
],
int
width
)
{
int
i
;
int
u
;
int
v
;
int
uvRed
;
int
uvGreen
;
int
uvBlue
;
short
*
tableY
;
i
=
width
>>
4
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
}
i
=
(
width
&
15
)
>>
1
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
}
if
(
width
&
1
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
*
(
dest
++
)
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
}
}
static
void
yuvToRgb24
(
unsigned
char
*
Y
,
static
void
yuvToRgb24
(
unsigned
char
*
Y
,
unsigned
char
*
U
,
unsigned
char
*
V
,
unsigned
char
*
U
,
unsigned
char
*
V
,
char
*
dest
,
int
table
[
1935
],
int
width
)
char
*
dest
,
int
table
[
1935
],
int
width
)
...
@@ -1526,633 +1269,3 @@ static void yuvToRgb32 (unsigned char * Y,
...
@@ -1526,633 +1269,3 @@ static void yuvToRgb32 (unsigned char * Y,
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
}
}
}
}
/* yuv routines with scaling */
/* 4:2:2 i, 16 bpp*/
void
yuv422ToRgb16_scaled
(
unsigned
char
*
Y
,
unsigned
char
*
U
,
unsigned
char
*
V
,
short
*
dest
,
short
table
[
1935
],
int
width
,
int
dest_width
,
int
height
,
int
dest_height
,
int
skip
,
int
dest_skip
,
short
*
buffer
)
{
int
i
,
i_hcount
,
i_vcount
,
j
,
k
;
int
u
;
int
v
;
int
uvRed
;
int
uvGreen
;
int
uvBlue
;
short
*
tableY
;
short
pix
;
if
(
(
width
<
dest_width
)
&&
(
height
<
dest_height
)
)
{
i_vcount
=
dest_height
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i
=
width
>>
1
;
i_hcount
=
dest_width
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
buffer
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
buffer
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
for
(
j
=
0
;
j
<
dest_width
;
j
+=
16
)
{
dest
[
j
]
=
buffer
[
j
];
dest
[
j
+
1
]
=
buffer
[
j
+
1
];
dest
[
j
+
2
]
=
buffer
[
j
+
2
];
dest
[
j
+
3
]
=
buffer
[
j
+
3
];
dest
[
j
+
4
]
=
buffer
[
j
+
4
];
dest
[
j
+
6
]
=
buffer
[
j
+
7
];
dest
[
j
+
8
]
=
buffer
[
j
+
9
];
dest
[
j
+
10
]
=
buffer
[
j
+
10
];
dest
[
j
+
11
]
=
buffer
[
j
+
11
];
dest
[
j
+
12
]
=
buffer
[
j
+
12
];
dest
[
j
+
13
]
=
buffer
[
j
+
13
];
dest
[
j
+
14
]
=
buffer
[
j
+
14
];
dest
[
j
+
15
]
=
buffer
[
j
+
15
];
}
dest
+=
dest_skip
;
}
i_vcount
+=
dest_height
;
}
}
else
if
(
(
width
>
dest_width
)
&&
(
height
<
dest_height
)
)
{
i_vcount
=
dest_height
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i_hcount
=
0
;
i
=
width
>>
1
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
buffer
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
buffer
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
for
(
j
=
0
;
j
<
dest_width
;
j
+=
16
)
{
dest
[
j
]
=
buffer
[
j
];
dest
[
j
+
1
]
=
buffer
[
j
+
1
];
dest
[
j
+
2
]
=
buffer
[
j
+
2
];
dest
[
j
+
3
]
=
buffer
[
j
+
3
];
dest
[
j
+
4
]
=
buffer
[
j
+
4
];
dest
[
j
+
6
]
=
buffer
[
j
+
7
];
dest
[
j
+
8
]
=
buffer
[
j
+
9
];
dest
[
j
+
10
]
=
buffer
[
j
+
10
];
dest
[
j
+
11
]
=
buffer
[
j
+
11
];
dest
[
j
+
12
]
=
buffer
[
j
+
12
];
dest
[
j
+
13
]
=
buffer
[
j
+
13
];
dest
[
j
+
14
]
=
buffer
[
j
+
14
];
dest
[
j
+
15
]
=
buffer
[
j
+
15
];
}
dest
+=
dest_skip
;
}
i_vcount
+=
dest_height
;
}
}
else
if
(
(
width
<
dest_width
)
&&
(
height
>
dest_height
)
)
{
i_vcount
=
0
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i
=
width
>>
1
;
i_hcount
=
dest_width
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
dest
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
dest
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
Y
+=
skip
;
U
+=
skip
>>
1
;
V
+=
skip
>>
1
;
}
i_vcount
+=
dest_height
;
}
}
else
if
(
(
width
>
dest_width
)
&&
(
height
>
dest_height
)
)
{
i_vcount
=
dest_height
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i_hcount
=
0
;
i
=
width
>>
1
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
dest
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
dest
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
Y
+=
skip
;
U
+=
skip
>>
1
;
V
+=
skip
>>
1
;
}
i_vcount
+=
dest_height
;
}
}
}
/* yuv routines with scaling */
/* 4:2:0 i, 16 bpp*/
void
yuv420ToRgb16_scaled
(
unsigned
char
*
Y
,
unsigned
char
*
U
,
unsigned
char
*
V
,
short
*
dest
,
short
table
[
1935
],
int
width
,
int
dest_width
,
int
height
,
int
dest_height
,
int
skip
,
int
dest_skip
,
short
*
buffer
)
{
int
i
,
i_hcount
,
i_vcount
,
j
,
k
;
int
u
;
int
v
;
int
uvRed
;
int
uvGreen
;
int
uvBlue
;
short
*
tableY
;
short
pix
;
if
(
(
width
<
dest_width
)
&&
(
height
<
dest_height
)
)
{
i_vcount
=
dest_height
;
k
=
height
>>
1
;
while
(
k
--
)
{
j
=
0
;
i
=
width
>>
1
;
i_hcount
=
dest_width
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
buffer
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
buffer
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
for
(
j
=
0
;
j
<
dest_width
;
j
+=
16
)
{
dest
[
j
]
=
buffer
[
j
];
dest
[
j
+
1
]
=
buffer
[
j
+
1
];
dest
[
j
+
2
]
=
buffer
[
j
+
2
];
dest
[
j
+
3
]
=
buffer
[
j
+
3
];
dest
[
j
+
4
]
=
buffer
[
j
+
4
];
dest
[
j
+
6
]
=
buffer
[
j
+
7
];
dest
[
j
+
8
]
=
buffer
[
j
+
9
];
dest
[
j
+
10
]
=
buffer
[
j
+
10
];
dest
[
j
+
11
]
=
buffer
[
j
+
11
];
dest
[
j
+
12
]
=
buffer
[
j
+
12
];
dest
[
j
+
13
]
=
buffer
[
j
+
13
];
dest
[
j
+
14
]
=
buffer
[
j
+
14
];
dest
[
j
+
15
]
=
buffer
[
j
+
15
];
}
dest
+=
dest_skip
;
}
i_vcount
+=
dest_height
;
U
-=
skip
>>
1
;
V
-=
skip
>>
1
;
j
=
0
;
i
=
width
>>
1
;
i_hcount
=
dest_width
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
buffer
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
buffer
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
for
(
j
=
0
;
j
<
dest_width
;
j
+=
16
)
{
dest
[
j
]
=
buffer
[
j
];
dest
[
j
+
1
]
=
buffer
[
j
+
1
];
dest
[
j
+
2
]
=
buffer
[
j
+
2
];
dest
[
j
+
3
]
=
buffer
[
j
+
3
];
dest
[
j
+
4
]
=
buffer
[
j
+
4
];
dest
[
j
+
6
]
=
buffer
[
j
+
7
];
dest
[
j
+
8
]
=
buffer
[
j
+
9
];
dest
[
j
+
10
]
=
buffer
[
j
+
10
];
dest
[
j
+
11
]
=
buffer
[
j
+
11
];
dest
[
j
+
12
]
=
buffer
[
j
+
12
];
dest
[
j
+
13
]
=
buffer
[
j
+
13
];
dest
[
j
+
14
]
=
buffer
[
j
+
14
];
dest
[
j
+
15
]
=
buffer
[
j
+
15
];
}
dest
+=
dest_skip
;
}
i_vcount
+=
dest_height
;
}
}
else
if
(
(
width
>
dest_width
)
&&
(
height
<
dest_height
)
)
{
i_vcount
=
dest_height
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i_hcount
=
0
;
i
=
width
>>
1
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
buffer
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
buffer
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
for
(
j
=
0
;
j
<
dest_width
;
j
+=
16
)
{
dest
[
j
]
=
buffer
[
j
];
dest
[
j
+
1
]
=
buffer
[
j
+
1
];
dest
[
j
+
2
]
=
buffer
[
j
+
2
];
dest
[
j
+
3
]
=
buffer
[
j
+
3
];
dest
[
j
+
4
]
=
buffer
[
j
+
4
];
dest
[
j
+
6
]
=
buffer
[
j
+
7
];
dest
[
j
+
8
]
=
buffer
[
j
+
9
];
dest
[
j
+
10
]
=
buffer
[
j
+
10
];
dest
[
j
+
11
]
=
buffer
[
j
+
11
];
dest
[
j
+
12
]
=
buffer
[
j
+
12
];
dest
[
j
+
13
]
=
buffer
[
j
+
13
];
dest
[
j
+
14
]
=
buffer
[
j
+
14
];
dest
[
j
+
15
]
=
buffer
[
j
+
15
];
}
dest
+=
dest_skip
;
}
i_vcount
+=
dest_height
;
U
-=
skip
>>
1
;
V
-=
skip
>>
1
;
j
=
0
;
i_hcount
=
0
;
i
=
width
>>
1
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
buffer
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
buffer
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
}
while
(
(
i_vcount
-=
height
)
>=
0
)
{
for
(
j
=
0
;
j
<
dest_width
;
j
+=
16
)
{
dest
[
j
]
=
buffer
[
j
];
dest
[
j
+
1
]
=
buffer
[
j
+
1
];
dest
[
j
+
2
]
=
buffer
[
j
+
2
];
dest
[
j
+
3
]
=
buffer
[
j
+
3
];
dest
[
j
+
4
]
=
buffer
[
j
+
4
];
dest
[
j
+
6
]
=
buffer
[
j
+
7
];
dest
[
j
+
8
]
=
buffer
[
j
+
9
];
dest
[
j
+
10
]
=
buffer
[
j
+
10
];
dest
[
j
+
11
]
=
buffer
[
j
+
11
];
dest
[
j
+
12
]
=
buffer
[
j
+
12
];
dest
[
j
+
13
]
=
buffer
[
j
+
13
];
dest
[
j
+
14
]
=
buffer
[
j
+
14
];
dest
[
j
+
15
]
=
buffer
[
j
+
15
];
}
dest
+=
dest_skip
;
}
i_vcount
+=
dest_height
;
}
}
else
if
(
(
width
<
dest_width
)
&&
(
height
>
dest_height
)
)
{
i_vcount
=
0
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i
=
width
>>
1
;
i_hcount
=
dest_width
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
dest
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
tableY
=
table
+
*
(
Y
++
);
pix
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
while
(
(
i_hcount
-=
width
)
>=
0
)
{
dest
[
j
++
]
=
pix
;
}
i_hcount
+=
dest_width
;
}
j
=
0
;
while
(
(
i_vcount
-=
height
)
>=
0
)
{
Y
+=
skip
;
j
++
;
}
U
+=
skip
*
(
j
>>
1
);
V
+=
skip
*
(
j
>>
1
);
i_vcount
+=
dest_height
;
}
}
else
if
(
(
width
>
dest_width
)
&&
(
height
>
dest_height
)
)
{
i_vcount
=
dest_height
;
k
=
height
;
while
(
k
--
)
{
j
=
0
;
i_hcount
=
0
;
i
=
width
>>
1
;
while
(
i
--
)
{
u
=
*
(
U
++
);
v
=
*
(
V
++
);
uvRed
=
(
V_RED_COEF
*
v
)
>>
SHIFT
;
uvGreen
=
(
U_GREEN_COEF
*
u
+
V_GREEN_COEF
*
v
)
>>
SHIFT
;
uvBlue
=
(
U_BLUE_COEF
*
u
)
>>
SHIFT
;
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
dest
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
if
(
(
i_hcount
-=
dest_width
)
>=
0
)
Y
++
;
else
{
tableY
=
table
+
*
(
Y
++
);
dest
[
j
++
]
=
(
tableY
[
1501
-
((
V_RED_COEF
*
128
)
>>
SHIFT
)
+
uvRed
]
|
tableY
[
135
-
(((
U_GREEN_COEF
+
V_GREEN_COEF
)
*
128
)
>>
SHIFT
)
+
uvGreen
]
|
tableY
[
818
-
((
U_BLUE_COEF
*
128
)
>>
SHIFT
)
+
uvBlue
]);
i_hcount
+=
width
;
}
}
j
=
0
;
while
(
(
i_vcount
-=
height
)
>=
0
)
{
Y
+=
skip
;
j
++
;
}
U
+=
skip
*
(
j
>>
1
);
V
+=
skip
*
(
j
>>
1
);
i_vcount
+=
dest_height
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment