Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
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
Commits
2faf5103
Commit
2faf5103
authored
Jan 17, 2000
by
Vincent Seguin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Nettoyage, ajout du gamma, pr�paration de la yuv walken.
parent
a6bc5de8
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1043 additions
and
198 deletions
+1043
-198
Makefile
Makefile
+3
-2
include/config.h
include/config.h
+8
-0
include/video.h
include/video.h
+1
-1
include/video_output.h
include/video_output.h
+14
-11
include/video_sys.h
include/video_sys.h
+1
-1
src/video_output/video_ggi.c
src/video_output/video_ggi.c
+1
-1
src/video_output/video_output.c
src/video_output/video_output.c
+176
-176
src/video_output/video_x11.c
src/video_output/video_x11.c
+1
-5
src/video_output/video_yuv_c.c
src/video_output/video_yuv_c.c
+837
-0
src/video_output/video_yuv_mmx.S
src/video_output/video_yuv_mmx.S
+1
-1
No files found.
Makefile
View file @
2faf5103
...
@@ -22,7 +22,7 @@ VIDEO=X11
...
@@ -22,7 +22,7 @@ VIDEO=X11
# Target architecture and optimization
# Target architecture and optimization
#ARCH=
#ARCH=
ARCH
=
MMX
#
ARCH=MMX
#ARCH=PPC
#ARCH=PPC
# Decoder choice - ?? old decoder will be removed soon
# Decoder choice - ?? old decoder will be removed soon
...
@@ -64,6 +64,7 @@ endif
...
@@ -64,6 +64,7 @@ endif
# Libraries
# Libraries
#
#
LIB
+=
-lpthread
LIB
+=
-lpthread
LIB
+=
-lm
ifeq
($(VIDEO),X11)
ifeq
($(VIDEO),X11)
LIB
+=
-L
/usr/X11R6/lib
LIB
+=
-L
/usr/X11R6/lib
...
@@ -211,7 +212,7 @@ misc_obj = misc/mtime.o \
...
@@ -211,7 +212,7 @@ misc_obj = misc/mtime.o \
ifeq
($(ARCH),MMX)
ifeq
($(ARCH),MMX)
ASM_OBJ
=
video_decoder_ref/idctmmx.o
\
ASM_OBJ
=
video_decoder_ref/idctmmx.o
\
video_output/yuv_mmx.o
video_output/
video_
yuv_mmx.o
endif
endif
C_OBJ
=
$(interface_obj)
\
C_OBJ
=
$(interface_obj)
\
...
...
include/config.h
View file @
2faf5103
...
@@ -119,6 +119,11 @@
...
@@ -119,6 +119,11 @@
/* Base delay in micro second for interface sleeps */
/* Base delay in micro second for interface sleeps */
#define INTF_IDLE_SLEEP 100000
#define INTF_IDLE_SLEEP 100000
/* Factor for changing gamma, and minimum and maximum values */
#define INTF_GAMMA_FACTOR 1.1
#define INTF_GAMMA_MIN 0.1
#define INTF_GAMMA_MAX 10
/*
/*
* X11 settings
* X11 settings
*/
*/
...
@@ -241,6 +246,9 @@
...
@@ -241,6 +246,9 @@
#define VOUT_GRAYSCALE_VAR "vlc_grayscale"
#define VOUT_GRAYSCALE_VAR "vlc_grayscale"
#define VOUT_GRAYSCALE_DEFAULT 0
#define VOUT_GRAYSCALE_DEFAULT 0
/* Default gamma */
#define VOUT_GAMMA 1.
/*
/*
* Time settings
* Time settings
*/
*/
...
...
include/video.h
View file @
2faf5103
...
@@ -57,7 +57,7 @@ typedef struct
...
@@ -57,7 +57,7 @@ typedef struct
* (the pointer) should NEVER be modified. In YUV format, the p_y, p_u and
* (the pointer) should NEVER be modified. In YUV format, the p_y, p_u and
* p_v data pointers refers to different areas of p_data, and should not
* p_v data pointers refers to different areas of p_data, and should not
* be freed */
* be freed */
byte_t
*
p_data
;
/* picture data */
void
*
p_data
;
/* picture data */
yuv_data_t
*
p_y
;
/* pointer to beginning of Y image in p_data */
yuv_data_t
*
p_y
;
/* pointer to beginning of Y image in p_data */
yuv_data_t
*
p_u
;
/* pointer to beginning of U image in p_data */
yuv_data_t
*
p_u
;
/* pointer to beginning of U image in p_data */
yuv_data_t
*
p_v
;
/* pointer to beginning of V image in p_data */
yuv_data_t
*
p_v
;
/* pointer to beginning of V image in p_data */
...
...
include/video_output.h
View file @
2faf5103
...
@@ -34,9 +34,11 @@ typedef struct vout_thread_s
...
@@ -34,9 +34,11 @@ typedef struct vout_thread_s
int
i_bytes_per_pixel
;
/* real screen depth */
int
i_bytes_per_pixel
;
/* real screen depth */
float
f_x_ratio
;
/* horizontal display ratio */
float
f_x_ratio
;
/* horizontal display ratio */
float
f_y_ratio
;
/* vertical display ratio */
float
f_y_ratio
;
/* vertical display ratio */
float
f_gamma
;
/* gamma */
/* New size for resizeable windows - they may be ignored or handled by
/* Changed properties values - some of them are treated directly by the
* vout_SysManage */
* thread, the over may be ignored or handled by vout_SysManage */
boolean_t
b_gamma_change
;
/* gamma change indicator */
int
i_new_width
;
/* new width */
int
i_new_width
;
/* new width */
int
i_new_height
;
/* new height */
int
i_new_height
;
/* new height */
...
@@ -59,15 +61,16 @@ typedef struct vout_thread_s
...
@@ -59,15 +61,16 @@ typedef struct vout_thread_s
/* Video heap */
/* Video heap */
picture_t
p_picture
[
VOUT_MAX_PICTURES
];
/* pictures */
picture_t
p_picture
[
VOUT_MAX_PICTURES
];
/* pictures */
/* YUV translation tables, for 15,16 and 24/32 bpp displays. 16 bits and 32
/* YUV translation tables - they have to be casted to the appropriate width
* bits pointers points on the same data.
* on use. All tables are allocated in the same memory block, based at
* CAUTION: these tables are translated: their origin is -384 */
* p_trans_base, and shifted depending of the output thread configuration */
u16
*
pi_trans16_red
;
byte_t
*
p_trans_base
;
/* base for all translation tables */
u16
*
pi_trans16_green
;
void
*
p_trans_red
;
u16
*
pi_trans16_blue
;
void
*
p_trans_green
;
u32
*
pi_trans32_red
;
void
*
p_trans_blue
;
u32
*
pi_trans32_green
;
void
*
p_trans_gray
;
u32
*
pi_trans32_blue
;
/* YUV translation tables, for optimized C YUV transform ?? */
}
vout_thread_t
;
}
vout_thread_t
;
/*******************************************************************************
/*******************************************************************************
...
...
include/video_sys.h
View file @
2faf5103
...
@@ -16,7 +16,7 @@ void vout_SysEnd ( p_vout_thread_t p_vout );
...
@@ -16,7 +16,7 @@ void vout_SysEnd ( p_vout_thread_t p_vout );
void
vout_SysDestroy
(
p_vout_thread_t
p_vout
);
void
vout_SysDestroy
(
p_vout_thread_t
p_vout
);
int
vout_SysManage
(
p_vout_thread_t
p_vout
);
int
vout_SysManage
(
p_vout_thread_t
p_vout
);
void
vout_SysDisplay
(
p_vout_thread_t
p_vout
);
void
vout_SysDisplay
(
p_vout_thread_t
p_vout
);
byte_t
*
vout_SysGetPicture
(
p_vout_thread_t
p_vout
);
void
*
vout_SysGetPicture
(
p_vout_thread_t
p_vout
);
void
vout_SysPrint
(
p_vout_thread_t
p_vout
,
int
i_x
,
int
i_y
,
void
vout_SysPrint
(
p_vout_thread_t
p_vout
,
int
i_x
,
int
i_y
,
int
i_halign
,
int
i_valign
,
int
i_halign
,
int
i_valign
,
unsigned
char
*
psz_text
);
unsigned
char
*
psz_text
);
...
...
src/video_output/video_ggi.c
View file @
2faf5103
...
@@ -166,7 +166,7 @@ void vout_SysDisplay( vout_thread_t *p_vout )
...
@@ -166,7 +166,7 @@ void vout_SysDisplay( vout_thread_t *p_vout )
*******************************************************************************
*******************************************************************************
* This function returns the address of the current display buffer.
* This function returns the address of the current display buffer.
*******************************************************************************/
*******************************************************************************/
byte_t
*
vout_SysGetPicture
(
vout_thread_t
*
p_vout
)
void
*
vout_SysGetPicture
(
vout_thread_t
*
p_vout
)
{
{
return
(
p_vout
->
p_sys
->
p_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
write
);
return
(
p_vout
->
p_sys
->
p_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
write
);
}
}
...
...
src/video_output/video_output.c
View file @
2faf5103
...
@@ -11,6 +11,7 @@
...
@@ -11,6 +11,7 @@
* Preamble
* Preamble
*******************************************************************************/
*******************************************************************************/
#include <errno.h>
#include <errno.h>
#include <math.h>
#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
...
@@ -43,14 +44,29 @@
...
@@ -43,14 +44,29 @@
* not change much for two different loops. This macro allows to change slightly
* not change much for two different loops. This macro allows to change slightly
* the content of the loop without having to copy and paste code. It is used in
* the content of the loop without having to copy and paste code. It is used in
* RenderYUVPicture function. */
* RenderYUVPicture function. */
#define YUV_GRAYSCALE( TRANS_
RED, TRANS_GREEN, TRANS_BLUE, P_PIC )
\
#define YUV_GRAYSCALE( TRANS_
GRAY, P_PIC )
\
/* Main loop */
\
/* Main loop */
\
for (i_pic_y=0; i_pic_y < p_pic->i_height ; i_pic_y++) \
for (i_pic_y=0; i_pic_y < p_pic->i_height ; i_pic_y++) \
{ \
{ \
for (i_pic_x=0; i_pic_x< p_pic->i_width; i_pic_x+
+)
\
for (i_pic_x=0; i_pic_x< p_pic->i_width; i_pic_x+
=16)
\
{ \
{ \
i_y = *p_y++; \
/* Convert 16 pixels (width is always multiple of 16 */
\
*P_PIC++ = TRANS_RED[i_y] | TRANS_GREEN[i_y] | TRANS_BLUE[i_y]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
*P_PIC++ = TRANS_GRAY[ *p_y++ ]; \
} \
} \
/* Skip until beginning of next line */
\
/* Skip until beginning of next line */
\
P_PIC += i_eol_offset; \
P_PIC += i_eol_offset; \
...
@@ -66,7 +82,7 @@ for (i_pic_y=0; i_pic_y < p_pic->i_height ; i_pic_y++) \
...
@@ -66,7 +82,7 @@ for (i_pic_y=0; i_pic_y < p_pic->i_height ; i_pic_y++) \
/* Main loop */
\
/* Main loop */
\
for (i_pic_y=0; i_pic_y < p_pic->i_height ; i_pic_y++) \
for (i_pic_y=0; i_pic_y < p_pic->i_height ; i_pic_y++) \
{ \
{ \
for (i_pic_x=0; i_pic_x< p_pic->i_width; i_pic_x+=2
)
\
for (i_pic_x=0; i_pic_x< p_pic->i_width; i_pic_x+=2
)
\
{ \
{ \
/* First sample (complete) */
\
/* First sample (complete) */
\
i_y = 76309 * *p_y++ - 1188177; \
i_y = 76309 * *p_y++ - 1188177; \
...
@@ -123,7 +139,7 @@ const int MATRIX_COEFFICIENTS_TABLE[8][4] =
...
@@ -123,7 +139,7 @@ const int MATRIX_COEFFICIENTS_TABLE[8][4] =
* i_width, i_height: frames dimensions (pixels)
* i_width, i_height: frames dimensions (pixels)
* i_ypitch, i_vpitch: Y and V lines sizes (bytes)
* i_ypitch, i_vpitch: Y and V lines sizes (bytes)
* i_aspect: vertical aspect factor
* i_aspect: vertical aspect factor
* p
i_pic:
RGB frame
* p
_pic:
RGB frame
* i_dci_offset: ?? x offset for left image border
* i_dci_offset: ?? x offset for left image border
* i_offset_to_line_0: ?? x offset for left image border
* i_offset_to_line_0: ?? x offset for left image border
* i_pitch: RGB line size (bytes)
* i_pitch: RGB line size (bytes)
...
@@ -131,7 +147,7 @@ const int MATRIX_COEFFICIENTS_TABLE[8][4] =
...
@@ -131,7 +147,7 @@ const int MATRIX_COEFFICIENTS_TABLE[8][4] =
void
vout_YUV420_16_MMX
(
u8
*
p_y
,
u8
*
p_u
,
u8
*
p_v
,
void
vout_YUV420_16_MMX
(
u8
*
p_y
,
u8
*
p_u
,
u8
*
p_v
,
unsigned
int
i_width
,
unsigned
int
i_height
,
unsigned
int
i_width
,
unsigned
int
i_height
,
unsigned
int
i_ypitch
,
unsigned
int
i_vpitch
,
unsigned
int
i_ypitch
,
unsigned
int
i_vpitch
,
unsigned
int
i_aspect
,
u8
*
p
i
_pic
,
unsigned
int
i_aspect
,
u8
*
p_pic
,
u32
i_dci_offset
,
u32
i_offset_to_line_0
,
u32
i_dci_offset
,
u32
i_offset_to_line_0
,
int
CCOPitch
,
int
i_colortype
);
int
CCOPitch
,
int
i_colortype
);
#endif
#endif
...
@@ -143,6 +159,7 @@ static int InitThread ( vout_thread_t *p_vout );
...
@@ -143,6 +159,7 @@ static int InitThread ( vout_thread_t *p_vout );
static
void
RunThread
(
vout_thread_t
*
p_vout
);
static
void
RunThread
(
vout_thread_t
*
p_vout
);
static
void
ErrorThread
(
vout_thread_t
*
p_vout
);
static
void
ErrorThread
(
vout_thread_t
*
p_vout
);
static
void
EndThread
(
vout_thread_t
*
p_vout
);
static
void
EndThread
(
vout_thread_t
*
p_vout
);
static
void
BuildTables
(
vout_thread_t
*
p_vout
);
static
void
RenderPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
static
void
RenderPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
static
void
RenderYUVGrayPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
static
void
RenderYUVGrayPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
static
void
RenderYUV16Picture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
static
void
RenderYUV16Picture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
...
@@ -192,6 +209,7 @@ vout_thread_t * vout_CreateThread (
...
@@ -192,6 +209,7 @@ vout_thread_t * vout_CreateThread (
p_vout
->
i_bytes_per_pixel
=
2
;
p_vout
->
i_bytes_per_pixel
=
2
;
p_vout
->
f_x_ratio
=
1
;
p_vout
->
f_x_ratio
=
1
;
p_vout
->
f_y_ratio
=
1
;
p_vout
->
f_y_ratio
=
1
;
p_vout
->
f_gamma
=
VOUT_GAMMA
;
intf_DbgMsg
(
"wished configuration: %dx%d,%d (%d bytes/pixel, %d bytes/line), ratio %.2f:%.2f, gray=%d
\n
"
,
intf_DbgMsg
(
"wished configuration: %dx%d,%d (%d bytes/pixel, %d bytes/line), ratio %.2f:%.2f, gray=%d
\n
"
,
p_vout
->
i_width
,
p_vout
->
i_height
,
p_vout
->
i_screen_depth
,
p_vout
->
i_width
,
p_vout
->
i_height
,
p_vout
->
i_screen_depth
,
p_vout
->
i_bytes_per_pixel
,
p_vout
->
i_bytes_per_line
,
p_vout
->
i_bytes_per_pixel
,
p_vout
->
i_bytes_per_line
,
...
@@ -224,6 +242,9 @@ vout_thread_t * vout_CreateThread (
...
@@ -224,6 +242,9 @@ vout_thread_t * vout_CreateThread (
p_vout
->
c_idle_loops
=
0
;
p_vout
->
c_idle_loops
=
0
;
p_vout
->
c_fps_samples
=
0
;
p_vout
->
c_fps_samples
=
0
;
#endif
#endif
p_vout
->
b_gamma_change
=
0
;
p_vout
->
i_new_width
=
p_vout
->
i_width
;
p_vout
->
i_new_height
=
p_vout
->
i_height
;
/* Create thread and set locks */
/* Create thread and set locks */
vlc_mutex_init
(
&
p_vout
->
lock
);
vlc_mutex_init
(
&
p_vout
->
lock
);
...
@@ -516,7 +537,6 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -516,7 +537,6 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
static
int
InitThread
(
vout_thread_t
*
p_vout
)
static
int
InitThread
(
vout_thread_t
*
p_vout
)
{
{
int
i_index
;
/* generic index */
int
i_index
;
/* generic index */
int
i_pixel_size
;
/* pixel size, in bytes, for translations tables */
/* Update status */
/* Update status */
*
p_vout
->
pi_status
=
THREAD_START
;
*
p_vout
->
pi_status
=
THREAD_START
;
...
@@ -536,94 +556,19 @@ static int InitThread( vout_thread_t *p_vout )
...
@@ -536,94 +556,19 @@ static int InitThread( vout_thread_t *p_vout )
}
}
/* Allocate translation tables */
/* Allocate translation tables */
switch
(
p_vout
->
i_bytes_per_pixel
)
p_vout
->
p_trans_base
=
malloc
(
4
*
1024
*
p_vout
->
i_bytes_per_pixel
);
if
(
p_vout
->
p_trans_base
==
NULL
)
{
{
case
2
:
/* 15 or 16 bpp, use 16 bits translations tables */
intf_ErrMsg
(
"error: %s
\n
"
,
strerror
(
ENOMEM
));
i_pixel_size
=
sizeof
(
u16
);
break
;
case
3
:
/* 24 or 32 bpp, use 32 bits translations tables */
case
4
:
#ifndef DEBUG
default:
#endif
i_pixel_size
=
sizeof
(
u32
);
break
;
#ifdef DEBUG
default:
intf_DbgMsg
(
"error: invalid bytes_per_pixel %d
\n
"
,
p_vout
->
i_bytes_per_pixel
);
i_pixel_size
=
sizeof
(
u32
);
break
;
#endif
}
p_vout
->
pi_trans32_red
=
(
u32
*
)
p_vout
->
pi_trans16_red
=
(
u16
*
)
malloc
(
1024
*
i_pixel_size
);
p_vout
->
pi_trans32_green
=
(
u32
*
)
p_vout
->
pi_trans16_green
=
(
u16
*
)
malloc
(
1024
*
i_pixel_size
);
p_vout
->
pi_trans32_blue
=
(
u32
*
)
p_vout
->
pi_trans16_blue
=
(
u16
*
)
malloc
(
1024
*
i_pixel_size
);
if
(
(
p_vout
->
pi_trans16_red
==
NULL
)
||
(
p_vout
->
pi_trans16_green
==
NULL
)
||
(
p_vout
->
pi_trans16_blue
==
NULL
)
)
{
intf_ErrMsg
(
"error: %s
\n
"
,
strerror
(
ENOMEM
)
);
*
p_vout
->
pi_status
=
THREAD_ERROR
;
if
(
p_vout
->
pi_trans16_red
!=
NULL
)
{
free
(
p_vout
->
pi_trans16_red
);
}
if
(
p_vout
->
pi_trans16_green
!=
NULL
)
{
free
(
p_vout
->
pi_trans16_green
);
}
if
(
p_vout
->
pi_trans16_blue
!=
NULL
)
{
free
(
p_vout
->
pi_trans16_blue
);
}
return
(
1
);
return
(
1
);
}
}
p_vout
->
p_trans_red
=
p_vout
->
p_trans_base
+
384
*
p_vout
->
i_bytes_per_pixel
;
/* Translate translation tables */
p_vout
->
p_trans_green
=
p_vout
->
p_trans_base
+
(
1024
+
384
)
*
p_vout
->
i_bytes_per_pixel
;
p_vout
->
pi_trans16_red
+=
384
;
p_vout
->
p_trans_blue
=
p_vout
->
p_trans_base
+
(
2
*
1024
+
384
)
*
p_vout
->
i_bytes_per_pixel
;
p_vout
->
pi_trans16_green
+=
384
;
p_vout
->
p_trans_gray
=
p_vout
->
p_trans_base
+
(
3
*
1024
+
384
)
*
p_vout
->
i_bytes_per_pixel
;
p_vout
->
pi_trans16_blue
+=
384
;
p_vout
->
pi_trans32_red
+=
384
;
p_vout
->
pi_trans32_green
+=
384
;
p_vout
->
pi_trans32_blue
+=
384
;
/* Build translation tables */
/* Build translation tables */
switch
(
p_vout
->
i_screen_depth
)
BuildTables
(
p_vout
);
{
case
15
:
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
p_vout
->
pi_trans16_red
[
i_index
]
=
(
CLIP_BYTE
(
i_index
)
&
0xf8
)
<<
7
;
p_vout
->
pi_trans16_green
[
i_index
]
=
(
CLIP_BYTE
(
i_index
)
&
0xf8
)
<<
2
;
p_vout
->
pi_trans16_blue
[
i_index
]
=
CLIP_BYTE
(
i_index
)
>>
3
;
}
break
;
case
16
:
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
p_vout
->
pi_trans16_red
[
i_index
]
=
(
CLIP_BYTE
(
i_index
)
&
0xf8
)
<<
8
;
p_vout
->
pi_trans16_green
[
i_index
]
=
(
CLIP_BYTE
(
i_index
)
&
0xfc
)
<<
3
;
p_vout
->
pi_trans16_blue
[
i_index
]
=
CLIP_BYTE
(
i_index
)
>>
3
;
}
break
;
case
24
:
case
32
:
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
p_vout
->
pi_trans32_red
[
i_index
]
=
CLIP_BYTE
(
i_index
)
<<
16
;
p_vout
->
pi_trans32_green
[
i_index
]
=
CLIP_BYTE
(
i_index
)
<<
8
;
p_vout
->
pi_trans32_blue
[
i_index
]
=
CLIP_BYTE
(
i_index
)
;
}
break
;
#ifdef DEBUG
default:
intf_DbgMsg
(
"error: invalid screen depth %d
\n
"
,
p_vout
->
i_screen_depth
);
break
;
#endif
}
/* Mark thread as running and return */
/* Mark thread as running and return */
p_vout
->
b_active
=
1
;
p_vout
->
b_active
=
1
;
...
@@ -725,6 +670,15 @@ static void RunThread( vout_thread_t *p_vout)
...
@@ -725,6 +670,15 @@ static void RunThread( vout_thread_t *p_vout)
}
}
}
}
/*
* Rebuild tables if gamma has changed
*/
if
(
p_vout
->
b_gamma_change
)
{
p_vout
->
b_gamma_change
=
0
;
BuildTables
(
p_vout
);
}
/*
/*
* Check events, sleep and display picture
* Check events, sleep and display picture
*/
*/
...
@@ -844,10 +798,8 @@ static void EndThread( vout_thread_t *p_vout )
...
@@ -844,10 +798,8 @@ static void EndThread( vout_thread_t *p_vout )
}
}
}
}
/* Destroy translation tables - remeber these tables are translated */
/* Destroy translation tables */
free
(
p_vout
->
pi_trans16_red
-
384
);
free
(
p_vout
->
p_trans_base
);
free
(
p_vout
->
pi_trans16_green
-
384
);
free
(
p_vout
->
pi_trans16_blue
-
384
);
/* Destroy thread structures allocated by InitThread */
/* Destroy thread structures allocated by InitThread */
vout_SysEnd
(
p_vout
);
vout_SysEnd
(
p_vout
);
...
@@ -858,6 +810,72 @@ static void EndThread( vout_thread_t *p_vout )
...
@@ -858,6 +810,72 @@ static void EndThread( vout_thread_t *p_vout )
*
pi_status
=
THREAD_OVER
;
*
pi_status
=
THREAD_OVER
;
}
}
/*******************************************************************************
* BuildTables: build YUV translation tables
*******************************************************************************
* This function will build translations tables according to pixel width and
* gamma.
*******************************************************************************/
static
void
BuildTables
(
vout_thread_t
*
p_vout
)
{
u16
*
p_trans16_red
=
(
u16
*
)
p_vout
->
p_trans_red
;
u16
*
p_trans16_green
=
(
u16
*
)
p_vout
->
p_trans_green
;
u16
*
p_trans16_blue
=
(
u16
*
)
p_vout
->
p_trans_blue
;
u16
*
p_trans16_gray
=
(
u16
*
)
p_vout
->
p_trans_gray
;
u32
*
p_trans32_red
=
(
u32
*
)
p_vout
->
p_trans_red
;
u32
*
p_trans32_green
=
(
u32
*
)
p_vout
->
p_trans_green
;
u32
*
p_trans32_blue
=
(
u32
*
)
p_vout
->
p_trans_blue
;
u32
*
p_trans32_gray
=
(
u32
*
)
p_vout
->
p_trans_gray
;
u8
i_gamma
[
256
];
/* gamma table */
int
i_index
;
/* index in tables */
/* Build gamma table */
for
(
i_index
=
0
;
i_index
<
256
;
i_index
++
)
{
i_gamma
[
i_index
]
=
255
.
*
pow
(
(
double
)
i_index
/
255
.,
p_vout
->
f_gamma
);
}
/* Build red, green, blue and gray tables */
switch
(
p_vout
->
i_screen_depth
)
{
case
15
:
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
p_trans16_red
[
i_index
]
=
(
i_gamma
[
CLIP_BYTE
(
i_index
)]
&
0xf8
)
<<
7
;
p_trans16_green
[
i_index
]
=
(
i_gamma
[
CLIP_BYTE
(
i_index
)]
&
0xf8
)
<<
2
;
p_trans16_blue
[
i_index
]
=
i_gamma
[
CLIP_BYTE
(
i_index
)]
>>
3
;
p_trans16_gray
[
i_index
]
=
p_trans16_red
[
i_index
]
|
p_trans16_green
[
i_index
]
|
p_trans16_blue
[
i_index
];
}
break
;
case
16
:
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
p_trans16_red
[
i_index
]
=
(
i_gamma
[
CLIP_BYTE
(
i_index
)]
&
0xf8
)
<<
8
;
p_trans16_green
[
i_index
]
=
(
i_gamma
[
CLIP_BYTE
(
i_index
)]
&
0xfc
)
<<
3
;
p_trans16_blue
[
i_index
]
=
i_gamma
[
CLIP_BYTE
(
i_index
)]
>>
3
;
p_trans16_gray
[
i_index
]
=
p_trans16_red
[
i_index
]
|
p_trans16_green
[
i_index
]
|
p_trans16_blue
[
i_index
];
}
break
;
case
32
:
for
(
i_index
=
-
384
;
i_index
<
640
;
i_index
++
)
{
p_trans32_red
[
i_index
]
=
i_gamma
[
CLIP_BYTE
(
i_index
)]
<<
16
;
p_trans32_green
[
i_index
]
=
i_gamma
[
CLIP_BYTE
(
i_index
)]
<<
8
;
p_trans32_blue
[
i_index
]
=
i_gamma
[
CLIP_BYTE
(
i_index
)]
;
p_trans32_gray
[
i_index
]
=
p_trans32_red
[
i_index
]
|
p_trans32_green
[
i_index
]
|
p_trans32_blue
[
i_index
];
}
break
;
#ifdef DEBUG
default:
intf_DbgMsg
(
"error: invalid screen depth %d
\n
"
,
p_vout
->
i_screen_depth
);
break
;
#endif
}
}
/*******************************************************************************
/*******************************************************************************
* RenderPicture: render a picture
* RenderPicture: render a picture
*******************************************************************************
*******************************************************************************
...
@@ -890,7 +908,7 @@ static void RenderPicture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -890,7 +908,7 @@ static void RenderPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
{
RenderYUV16Picture
(
p_vout
,
p_pic
);
RenderYUV16Picture
(
p_vout
,
p_pic
);
}
}
else
/* color 24
or 32 bpp */
else
if
(
p_vout
->
i_bytes_per_pixel
==
4
)
/* col
or 32 bpp */
{
{
RenderYUV32Picture
(
p_vout
,
p_pic
);
RenderYUV32Picture
(
p_vout
,
p_pic
);
}
}
...
@@ -909,7 +927,7 @@ static void RenderPicture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -909,7 +927,7 @@ static void RenderPicture( vout_thread_t *p_vout, picture_t *p_pic )
}
}
/*******************************************************************************
/*******************************************************************************
* RenderYUVGrayPicture: render
a 15, 16, 24 or 32 bpp
YUV picture in grayscale
* RenderYUVGrayPicture: render YUV picture in grayscale
*******************************************************************************
*******************************************************************************
* Performs the YUV convertion. The picture sent to this function should only
* Performs the YUV convertion. The picture sent to this function should only
* have YUV_420, YUV_422 or YUV_444 types.
* have YUV_420, YUV_422 or YUV_444 types.
...
@@ -920,15 +938,10 @@ static void RenderYUVGrayPicture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -920,15 +938,10 @@ static void RenderYUVGrayPicture( vout_thread_t *p_vout, picture_t *p_pic )
int
i_width
,
i_height
;
/* picture size */
int
i_width
,
i_height
;
/* picture size */
int
i_eol_offset
;
/* pixels from end of line to next line */
int
i_eol_offset
;
/* pixels from end of line to next line */
yuv_data_t
*
p_y
;
/* Y data base adress */
yuv_data_t
*
p_y
;
/* Y data base adress */
yuv_data_t
i_y
;
/* Y sample */
u16
*
p_pic16
;
/* destination picture, 15 or 16 bpp */
u16
*
pi_pic16
;
/* destination picture, 15 or 16 bpp */
u32
*
p_pic32
;
/* destination picture, 32 bpp */
u32
*
pi_pic32
;
/* destination picture, 24 or 32 bpp */
u16
*
p_trans16_gray
;
/* transformation table, 15 or 16 bpp */
u16
*
pi_trans16_red
;
/* red transformation table */
u32
*
p_trans32_gray
;
/* transformation table, 32 bpp */
u16
*
pi_trans16_green
;
/* green transformation table */
u16
*
pi_trans16_blue
;
/* blue transformation table */
u32
*
pi_trans32_red
;
/* red transformation table */
u32
*
pi_trans32_green
;
/* green transformation table */
u32
*
pi_trans32_blue
;
/* blue transformation table */
/* Set the base pointers and transformation parameters */
/* Set the base pointers and transformation parameters */
p_y
=
p_pic
->
p_y
;
p_y
=
p_pic
->
p_y
;
...
@@ -942,23 +955,14 @@ static void RenderYUVGrayPicture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -942,23 +955,14 @@ static void RenderYUVGrayPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
{
case
15
:
case
15
:
case
16
:
case
16
:
pi_trans16_red
=
p_vout
->
pi_trans16_red
;
p_trans16_gray
=
(
u16
*
)
p_vout
->
p_trans_gray
;
pi_trans16_green
=
p_vout
->
pi_trans16_green
;
p_pic16
=
(
u16
*
)
vout_SysGetPicture
(
p_vout
);
pi_trans16_blue
=
p_vout
->
pi_trans16_blue
;
YUV_GRAYSCALE
(
p_trans16_gray
,
p_pic16
);
pi_pic16
=
(
u16
*
)
vout_SysGetPicture
(
p_vout
);
YUV_GRAYSCALE
(
pi_trans16_red
,
pi_trans16_green
,
pi_trans16_blue
,
pi_pic16
);
break
;
break
;
case
24
:
case
32
:
case
32
:
pi_trans32_red
=
p_vout
->
pi_trans32_red
;
p_trans32_gray
=
(
u32
*
)
p_vout
->
p_trans_gray
;
pi_trans32_green
=
p_vout
->
pi_trans32_green
;
p_pic32
=
(
u32
*
)
vout_SysGetPicture
(
p_vout
);
pi_trans32_blue
=
p_vout
->
pi_trans32_blue
;
YUV_GRAYSCALE
(
p_trans32_gray
,
p_pic32
);
pi_pic32
=
(
u32
*
)
vout_SysGetPicture
(
p_vout
);
YUV_GRAYSCALE
(
pi_trans32_red
,
pi_trans32_green
,
pi_trans32_blue
,
pi_pic32
);
break
;
break
;
#ifdef DEBUG
#ifdef DEBUG
default:
default:
...
@@ -986,10 +990,10 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -986,10 +990,10 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
yuv_data_t
*
p_y
;
/* Y data base adress */
yuv_data_t
*
p_y
;
/* Y data base adress */
yuv_data_t
*
p_u
;
/* U data base adress */
yuv_data_t
*
p_u
;
/* U data base adress */
yuv_data_t
*
p_v
;
/* V data base adress */
yuv_data_t
*
p_v
;
/* V data base adress */
u16
*
p
i_pic
;
/* base adress for destination picture */
u16
*
p
_data
;
/* base adress for destination picture */
u16
*
p
i_trans_red
;
/* red transformation table */
u16
*
p
_trans_red
;
/* red transformation table */
u16
*
p
i_trans_green
;
/* green transformation table */
u16
*
p
_trans_green
;
/* green transformation table */
u16
*
p
i_trans_blue
;
/* blue transformation table */
u16
*
p
_trans_blue
;
/* blue transformation table */
/* Choose transformation matrix coefficients */
/* Choose transformation matrix coefficients */
i_crv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
0
];
i_crv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
0
];
...
@@ -997,10 +1001,11 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -997,10 +1001,11 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
i_cgu
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
2
];
i_cgu
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
2
];
i_cgv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
3
];
i_cgv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
3
];
/* Choose the conversions tables */
/* Choose the conversions tables and picture address */
pi_trans_red
=
p_vout
->
pi_trans16_red
;
p_trans_red
=
(
u16
*
)
p_vout
->
p_trans_red
;
pi_trans_green
=
p_vout
->
pi_trans16_green
;
p_trans_green
=
(
u16
*
)
p_vout
->
p_trans_green
;
pi_trans_blue
=
p_vout
->
pi_trans16_blue
;
p_trans_blue
=
(
u16
*
)
p_vout
->
p_trans_blue
;
p_data
=
(
u16
*
)
vout_SysGetPicture
(
p_vout
);
/* Set the base pointers and transformation parameters */
/* Set the base pointers and transformation parameters */
p_y
=
p_pic
->
p_y
;
p_y
=
p_pic
->
p_y
;
...
@@ -1011,9 +1016,6 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -1011,9 +1016,6 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
i_chroma_width
=
i_width
/
2
;
i_chroma_width
=
i_width
/
2
;
i_eol_offset
=
p_vout
->
i_bytes_per_line
/
2
-
i_width
;
i_eol_offset
=
p_vout
->
i_bytes_per_line
/
2
-
i_width
;
/* Get base adress for destination image */
pi_pic
=
(
u16
*
)
vout_SysGetPicture
(
p_vout
);
/* Do YUV transformation - the loops are repeated for optimization */
/* Do YUV transformation - the loops are repeated for optimization */
switch
(
p_pic
->
i_type
)
switch
(
p_pic
->
i_type
)
{
{
...
@@ -1022,36 +1024,36 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -1022,36 +1024,36 @@ static void RenderYUV16Picture( vout_thread_t *p_vout, picture_t *p_pic )
vout_YUV420_16_MMX
(
p_y
,
p_u
,
p_v
,
vout_YUV420_16_MMX
(
p_y
,
p_u
,
p_v
,
i_width
,
i_height
,
i_width
,
i_height
,
i_width
,
i_chroma_width
,
i_width
,
i_chroma_width
,
0
,
(
u8
*
)
pi_pic
,
0
,
p_data
,
0
,
0
,
p_vout
->
i_bytes_per_line
,
0
,
0
,
p_vout
->
i_bytes_per_line
,
p_vout
->
i_screen_depth
==
15
);
p_vout
->
i_screen_depth
==
15
);
#else
#else
YUV_TRANSFORM
(
420
,
YUV_TRANSFORM
(
420
,
p
i
_trans_red
,
p_trans_red
,
p
i
_trans_green
,
p_trans_green
,
p
i
_trans_blue
,
p_trans_blue
,
p
i_pic
);
p
_data
);
#endif
#endif
break
;
break
;
case
YUV_422_PICTURE
:
/* 15 or 16 bpp 422 transformation */
case
YUV_422_PICTURE
:
/* 15 or 16 bpp 422 transformation */
YUV_TRANSFORM
(
422
,
YUV_TRANSFORM
(
422
,
p
i
_trans_red
,
p_trans_red
,
p
i
_trans_green
,
p_trans_green
,
p
i
_trans_blue
,
p_trans_blue
,
p
i_pic
);
p
_data
);
break
;
break
;
case
YUV_444_PICTURE
:
/* 15 or 16 bpp 444 transformation */
case
YUV_444_PICTURE
:
/* 15 or 16 bpp 444 transformation */
YUV_TRANSFORM
(
444
,
YUV_TRANSFORM
(
444
,
p
i
_trans_red
,
p_trans_red
,
p
i
_trans_green
,
p_trans_green
,
p
i
_trans_blue
,
p_trans_blue
,
p
i_pic
);
p
_data
);
break
;
break
;
}
}
}
}
/*******************************************************************************
/*******************************************************************************
* RenderYUV32Picture: render a
24 or
32 bpp YUV picture
* RenderYUV32Picture: render a 32 bpp YUV picture
*******************************************************************************
*******************************************************************************
* Performs the YUV convertion. The picture sent to this function should only
* Performs the YUV convertion. The picture sent to this function should only
* have YUV_420, YUV_422 or YUV_444 types.
* have YUV_420, YUV_422 or YUV_444 types.
...
@@ -1067,10 +1069,10 @@ static void RenderYUV32Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -1067,10 +1069,10 @@ static void RenderYUV32Picture( vout_thread_t *p_vout, picture_t *p_pic )
yuv_data_t
*
p_y
;
/* Y data base adress */
yuv_data_t
*
p_y
;
/* Y data base adress */
yuv_data_t
*
p_u
;
/* U data base adress */
yuv_data_t
*
p_u
;
/* U data base adress */
yuv_data_t
*
p_v
;
/* V data base adress */
yuv_data_t
*
p_v
;
/* V data base adress */
u32
*
p
i_pic
;
/* base adress for destination picture */
u32
*
p
_data
;
/* base adress for destination picture */
u32
*
p
i_trans_red
;
/* red transformation table */
u32
*
p
_trans_red
;
/* red transformation table */
u32
*
p
i_trans_green
;
/* green transformation table */
u32
*
p
_trans_green
;
/* green transformation table */
u32
*
p
i_trans_blue
;
/* blue transformation table */
u32
*
p
_trans_blue
;
/* blue transformation table */
/* Choose transformation matrix coefficients */
/* Choose transformation matrix coefficients */
i_crv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
0
];
i_crv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
0
];
...
@@ -1078,10 +1080,11 @@ static void RenderYUV32Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -1078,10 +1080,11 @@ static void RenderYUV32Picture( vout_thread_t *p_vout, picture_t *p_pic )
i_cgu
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
2
];
i_cgu
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
2
];
i_cgv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
3
];
i_cgv
=
MATRIX_COEFFICIENTS_TABLE
[
p_pic
->
i_matrix_coefficients
][
3
];
/* Choose the conversions tables */
/* Choose the conversions tables and picture address */
pi_trans_red
=
p_vout
->
pi_trans32_red
;
p_trans_red
=
(
u32
*
)
p_vout
->
p_trans_red
;
pi_trans_green
=
p_vout
->
pi_trans32_green
;
p_trans_green
=
(
u32
*
)
p_vout
->
p_trans_green
;
pi_trans_blue
=
p_vout
->
pi_trans32_blue
;
p_trans_blue
=
(
u32
*
)
p_vout
->
p_trans_blue
;
p_data
=
(
u32
*
)
vout_SysGetPicture
(
p_vout
);
/* Set the base pointers and transformation parameters */
/* Set the base pointers and transformation parameters */
p_y
=
p_pic
->
p_y
;
p_y
=
p_pic
->
p_y
;
...
@@ -1092,32 +1095,29 @@ static void RenderYUV32Picture( vout_thread_t *p_vout, picture_t *p_pic )
...
@@ -1092,32 +1095,29 @@ static void RenderYUV32Picture( vout_thread_t *p_vout, picture_t *p_pic )
i_chroma_width
=
i_width
/
2
;
i_chroma_width
=
i_width
/
2
;
i_eol_offset
=
p_vout
->
i_bytes_per_line
/
p_vout
->
i_bytes_per_pixel
-
i_width
;
i_eol_offset
=
p_vout
->
i_bytes_per_line
/
p_vout
->
i_bytes_per_pixel
-
i_width
;
/* Get base adress for destination image */
pi_pic
=
(
u32
*
)
vout_SysGetPicture
(
p_vout
);
/* Do YUV transformation - the loops are repeated for optimization */
/* Do YUV transformation - the loops are repeated for optimization */
switch
(
p_pic
->
i_type
)
switch
(
p_pic
->
i_type
)
{
{
case
YUV_420_PICTURE
:
/* 24 or
32 bpp 420 transformation */
case
YUV_420_PICTURE
:
/*
32 bpp 420 transformation */
YUV_TRANSFORM
(
420
,
YUV_TRANSFORM
(
420
,
p
i
_trans_red
,
p_trans_red
,
p
i
_trans_green
,
p_trans_green
,
p
i
_trans_blue
,
p_trans_blue
,
p
i_pic
);
p
_data
);
break
;
break
;
case
YUV_422_PICTURE
:
/* 24 or
32 bpp 422 transformation */
case
YUV_422_PICTURE
:
/*
32 bpp 422 transformation */
YUV_TRANSFORM
(
422
,
YUV_TRANSFORM
(
422
,
p
i
_trans_red
,
p_trans_red
,
p
i
_trans_green
,
p_trans_green
,
p
i
_trans_blue
,
p_trans_blue
,
p
i_pic
);
p
_data
);
break
;
break
;
case
YUV_444_PICTURE
:
/* 24 or
32 bpp 444 transformation */
case
YUV_444_PICTURE
:
/*
32 bpp 444 transformation */
YUV_TRANSFORM
(
444
,
YUV_TRANSFORM
(
444
,
p
i
_trans_red
,
p_trans_red
,
p
i
_trans_green
,
p_trans_green
,
p
i
_trans_blue
,
p_trans_blue
,
p
i_pic
);
p
_data
);
break
;
break
;
}
}
}
}
...
@@ -1147,8 +1147,8 @@ static void RenderInfo( vout_thread_t *p_vout )
...
@@ -1147,8 +1147,8 @@ static void RenderInfo( vout_thread_t *p_vout )
}
}
/* Print statistics in upper left corner */
/* Print statistics in upper left corner */
sprintf
(
psz_buffer
,
"
%ld frames (%.1f %% idle)"
,
p_vout
->
c_fps_samples
,
sprintf
(
psz_buffer
,
"
gamma=%.2f %ld frames (%.1f %% idle)"
,
p_vout
->
c_loops
?
p_vout
->
f_gamma
,
p_vout
->
c_fps_samples
,
p_vout
->
c_loops
?
(
double
)
p_vout
->
c_idle_loops
*
100
/
p_vout
->
c_loops
:
100
.
);
(
double
)
p_vout
->
c_idle_loops
*
100
/
p_vout
->
c_loops
:
100
.
);
vout_SysPrint
(
p_vout
,
0
,
0
,
-
1
,
-
1
,
psz_buffer
);
vout_SysPrint
(
p_vout
,
0
,
0
,
-
1
,
-
1
,
psz_buffer
);
#endif
#endif
...
...
src/video_output/video_x11.c
View file @
2faf5103
...
@@ -275,7 +275,7 @@ void vout_SysDisplay( vout_thread_t *p_vout )
...
@@ -275,7 +275,7 @@ void vout_SysDisplay( vout_thread_t *p_vout )
*******************************************************************************
*******************************************************************************
* This function returns the address of the current display buffer.
* This function returns the address of the current display buffer.
*******************************************************************************/
*******************************************************************************/
byte_t
*
vout_SysGetPicture
(
vout_thread_t
*
p_vout
)
void
*
vout_SysGetPicture
(
vout_thread_t
*
p_vout
)
{
{
return
(
p_vout
->
p_sys
->
p_ximage
[
p_vout
->
p_sys
->
i_buffer_index
]
->
data
);
return
(
p_vout
->
p_sys
->
p_ximage
[
p_vout
->
p_sys
->
i_buffer_index
]
->
data
);
}
}
...
@@ -407,10 +407,6 @@ static int X11OpenDisplay( vout_thread_t *p_vout, char *psz_display, Window root
...
@@ -407,10 +407,6 @@ static int X11OpenDisplay( vout_thread_t *p_vout, char *psz_display, Window root
return
(
1
);
return
(
1
);
}
}
/* Store additionnal vout informations */
p_vout
->
i_new_width
=
p_vout
->
i_width
;
p_vout
->
i_new_height
=
p_vout
->
i_height
;
/* Get font information */
/* Get font information */
if
(
X11GetFont
(
p_vout
)
)
if
(
X11GetFont
(
p_vout
)
)
{
{
...
...
src/video_output/video_yuv_c.c
0 → 100644
View file @
2faf5103
/*******************************************************************************
* video_yuv_c.c: YUV transformation, optimized
* (c)1999 VideoLAN
*******************************************************************************
* Provides optimized functions to perform the YUV conversion.
*******************************************************************************/
#include <stdlib.h>
/* malloc */
#include "convert.h"
static
int
binaryLog
(
int
i
)
{
int
log
;
log
=
0
;
if
(
i
&
0xffff0000
)
log
=
16
;
if
(
i
&
0xff00ff00
)
log
+=
8
;
if
(
i
&
0xf0f0f0f0
)
log
+=
4
;
if
(
i
&
0xcccccccc
)
log
+=
2
;
if
(
i
&
0xaaaaaaaa
)
log
++
;
if
(
i
!=
(
1
<<
log
))
return
-
1
;
return
log
;
}
static
int
colorMaskToShift
(
int
*
right
,
int
*
left
,
int
mask
)
{
int
low
;
int
high
;
low
=
mask
&
(
-
mask
);
/* lower bit of the mask */
high
=
mask
+
low
;
/* higher bit of the mask */
low
=
binaryLog
(
low
);
high
=
binaryLog
(
high
);
if
((
low
==
-
1
)
||
(
high
==
-
1
))
return
1
;
*
left
=
low
;
*
right
=
(
8
-
high
+
low
);
return
0
;
}
/*
* YUV to RGB routines.
*
* these routines calculate r, g and b values from each pixel's y, u and v.
* these r, g an b values are then passed thru a table lookup to take the
* gamma curve into account and find the corresponding pixel value.
*
* the table must store more than 3*256 values because of the possibility
* of overflow in the yuv->rgb calculation. actually the calculated r,g,b
* values are in the following intervals :
* -176 to 255+176 for red
* -133 to 255+133 for green
* -222 to 255+222 for blue
*
* If the input y,u,v values are right, the r,g,b results are not expected
* to move out of the 0 to 255 interval but who knows what will happen in
* real use...
*
* the red, green and blue conversion tables are stored in a single 1935-entry
* array. The respective positions of each component in the array have been
* calculated to minimize the cache interactions of the 3 tables.
*/
static
int
rgbTable16
(
short
table
[
1935
],
int
redMask
,
int
greenMask
,
int
blueMask
,
unsigned
char
gamma
[
256
])
{
int
redRight
;
int
redLeft
;
int
greenRight
;
int
greenLeft
;
int
blueRight
;
int
blueLeft
;
short
*
redTable
;
short
*
greenTable
;
short
*
blueTable
;
int
i
;
int
y
;
if
(
colorMaskToShift
(
&
redRight
,
&
redLeft
,
redMask
)
||
colorMaskToShift
(
&
greenRight
,
&
greenLeft
,
greenMask
)
||
colorMaskToShift
(
&
blueRight
,
&
blueLeft
,
blueMask
))
return
1
;
/*
* green blue red +- 2 just to be sure
* green = 0-525 [151-370]
* blue = 594-1297 [834-1053] <834-29>
* red = 1323-1934 [1517-1736] <493-712>
*/
redTable
=
table
+
1501
;
greenTable
=
table
+
135
;
blueTable
=
table
+
818
;
for
(
i
=
0
;
i
<
178
;
i
++
)
{
redTable
[
i
-
178
]
=
0
;
redTable
[
i
+
256
]
=
redMask
;
}
for
(
i
=
0
;
i
<
135
;
i
++
)
{
greenTable
[
i
-
135
]
=
0
;
greenTable
[
i
+
256
]
=
greenMask
;
}
for
(
i
=
0
;
i
<
224
;
i
++
)
{
blueTable
[
i
-
224
]
=
0
;
blueTable
[
i
+
256
]
=
blueMask
;
}
for
(
i
=
0
;
i
<
256
;
i
++
)
{
y
=
gamma
[
i
];
redTable
[
i
]
=
((
y
>>
redRight
)
<<
redLeft
);
greenTable
[
i
]
=
((
y
>>
greenRight
)
<<
greenLeft
);
blueTable
[
i
]
=
((
y
>>
blueRight
)
<<
blueLeft
);
}
return
0
;
}
static
int
rgbTable32
(
int
table
[
1935
],
int
redMask
,
int
greenMask
,
int
blueMask
,
unsigned
char
gamma
[
256
])
{
int
redRight
;
int
redLeft
;
int
greenRight
;
int
greenLeft
;
int
blueRight
;
int
blueLeft
;
int
*
redTable
;
int
*
greenTable
;
int
*
blueTable
;
int
i
;
int
y
;
if
(
colorMaskToShift
(
&
redRight
,
&
redLeft
,
redMask
)
||
colorMaskToShift
(
&
greenRight
,
&
greenLeft
,
greenMask
)
||
colorMaskToShift
(
&
blueRight
,
&
blueLeft
,
blueMask
))
return
1
;
/*
* green blue red +- 2 just to be sure
* green = 0-525 [151-370]
* blue = 594-1297 [834-1053] <834-29>
* red = 1323-1934 [1517-1736] <493-712>
*/
redTable
=
table
+
1501
;
greenTable
=
table
+
135
;
blueTable
=
table
+
818
;
for
(
i
=
0
;
i
<
178
;
i
++
)
{
redTable
[
i
-
178
]
=
0
;
redTable
[
i
+
256
]
=
redMask
;
}
for
(
i
=
0
;
i
<
135
;
i
++
)
{
greenTable
[
i
-
135
]
=
0
;
greenTable
[
i
+
256
]
=
greenMask
;
}
for
(
i
=
0
;
i
<
224
;
i
++
)
{
blueTable
[
i
-
224
]
=
0
;
blueTable
[
i
+
256
]
=
blueMask
;
}
for
(
i
=
0
;
i
<
256
;
i
++
)
{
y
=
gamma
[
i
];
redTable
[
i
]
=
((
y
>>
redRight
)
<<
redLeft
);
greenTable
[
i
]
=
((
y
>>
greenRight
)
<<
greenLeft
);
blueTable
[
i
]
=
((
y
>>
blueRight
)
<<
blueLeft
);
}
return
0
;
}
#define SHIFT 20
#define U_GREEN_COEF ((int)(-0.391 * (1<<SHIFT) / 1.164))
#define U_BLUE_COEF ((int)(2.018 * (1<<SHIFT) / 1.164))
#define V_RED_COEF ((int)(1.596 * (1<<SHIFT) / 1.164))
#define V_GREEN_COEF ((int)(-0.813 * (1<<SHIFT) / 1.164))
static
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
,
unsigned
char
*
U
,
unsigned
char
*
V
,
char
*
dest
,
int
table
[
1935
],
int
width
)
{
int
i
;
int
u
;
int
v
;
int
uvRed
;
int
uvGreen
;
int
uvBlue
;
int
*
tableY
;
int
tmp24
;
i
=
width
>>
3
;
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
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
tableY
=
table
+
*
(
Y
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
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
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
tableY
=
table
+
*
(
Y
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
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
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
tableY
=
table
+
*
(
Y
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
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
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
tableY
=
table
+
*
(
Y
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
}
i
=
(
width
&
7
)
>>
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
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
tableY
=
table
+
*
(
Y
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
}
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
++
);
tmp24
=
(
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
]);
*
(
dest
++
)
=
tmp24
;
*
(
dest
++
)
=
tmp24
>>
8
;
*
(
dest
++
)
=
tmp24
>>
16
;
}
}
static
void
yuvToRgb32
(
unsigned
char
*
Y
,
unsigned
char
*
U
,
unsigned
char
*
V
,
int
*
dest
,
int
table
[
1935
],
int
width
)
{
int
i
;
int
u
;
int
v
;
int
uvRed
;
int
uvGreen
;
int
uvBlue
;
int
*
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
]);
}
}
/* API routines */
int
convertGrey
(
CONVERTER
*
convert
,
DISPLAY
*
disp
)
{
if
((
convert
==
NULL
)
||
(
disp
==
NULL
))
return
1
;
if
(
greyRgbTable
(
disp
))
return
1
;
switch
(
disp
->
bytesPerPixel
)
{
case
2
:
convert
->
convert
=
&
greyToRgb16
;
break
;
case
3
:
convert
->
convert
=
&
greyToRgb24
;
break
;
case
4
:
convert
->
convert
=
&
greyToRgb32
;
break
;
default:
return
1
;
}
convert
->
table
=
disp
->
greyRgbTable
;
return
0
;
}
static
void
*
greyRgbTable
(
DISP_COLORS
*
colors
,
unsigned
char
gamma
[
256
])
{
/* FIXME could avoid recalculating the same table */
void
*
table
;
for
(
i
=
0
;
i
<
16
;
i
++
)
gamma
[
i
]
=
0
;
#define Y_COEF ((int)(1.164 * 65536))
for
(;
i
<=
235
;
i
++
)
gamma
[
i
]
=
(
Y_COEF
*
i
-
Y_COEF
*
16
)
>>
16
;
#undef Y_COEF
for
(;
i
<
256
;
i
++
)
gamma
[
i
]
=
255
;
}
switch
(
colors
->
bytesPerPixel
)
{
case
2
:
table
=
malloc
(
256
*
sizeof
(
short
));
if
(
table
==
NULL
)
break
;
if
(
greyRgb16Table
(
table
,
colors
->
redMask
,
colors
->
greenMask
,
colors
->
blueMask
,
gamma
))
goto
error
;
return
table
;
case
3
:
case
4
:
table
=
malloc
(
256
*
sizeof
(
int
));
if
(
table
==
NULL
)
break
;
if
(
greyRgb32Table
(
table
,
colors
->
redMask
,
colors
->
greenMask
,
colors
->
blueMask
,
gamma
))
goto
error
;
return
table
;
error:
free
(
table
);
}
return
NULL
;
}
static
void
*
rgbTable
(
DISP_COLORS
*
colors
,
unsigned
char
gamma
[
256
])
{
/* FIXME could avoid recalculating the same table */
void
*
table
;
switch
(
colors
->
bytesPerPixel
)
{
case
2
:
table
=
malloc
(
1935
*
sizeof
(
short
));
if
(
table
==
NULL
)
break
;
if
(
rgbTable16
(
table
,
colors
->
redMask
,
colors
->
greenMask
,
colors
->
blueMask
,
gamma
))
goto
error
;
return
table
;
case
3
:
case
4
:
table
=
malloc
(
1935
*
sizeof
(
int
));
if
(
table
==
NULL
)
break
;
if
(
rgbTable32
(
table
,
colors
->
redMask
,
colors
->
greenMask
,
colors
->
blueMask
,
gamma
))
goto
error
;
return
table
;
error:
free
(
table
);
}
return
NULL
;
}
src/video_output/yuv_mmx.S
→
src/video_output/
video_
yuv_mmx.S
View file @
2faf5103
/*******************************************************************************
/*******************************************************************************
*
yuv_mmx
.
S
:
YUV
transformation
,
optimized
for
MMX
processors
*
video_
yuv_mmx
.
S
:
YUV
transformation
,
optimized
for
MMX
processors
*
(
c
)
1999
VideoLAN
*
(
c
)
1999
VideoLAN
******************************************************************************
*
******************************************************************************
*
*
Following
functions
are
defined
:
*
Following
functions
are
defined
:
...
...
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