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
d81e21d5
Commit
d81e21d5
authored
Jan 16, 2000
by
Vincent Seguin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Mise au point du driver GGI.
parent
57429088
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
156 additions
and
21 deletions
+156
-21
Makefile
Makefile
+1
-1
src/interface/main.c
src/interface/main.c
+3
-3
src/video_output/video_ggi.c
src/video_output/video_ggi.c
+137
-9
src/video_output/video_output.c
src/video_output/video_output.c
+4
-0
src/video_output/yuv_mmx.S
src/video_output/yuv_mmx.S
+11
-8
No files found.
Makefile
View file @
d81e21d5
...
...
@@ -215,7 +215,7 @@ endif
ifeq
($(ARCH),MMX)
ASM_OBJ
=
video_decoder_ref/idctmmx.o
\
video_output/yuv
-
mmx.o
video_output/yuv
_
mmx.o
endif
C_OBJ
=
$(interface_obj)
\
...
...
src/interface/main.c
View file @
d81e21d5
...
...
@@ -388,7 +388,7 @@ static void Usage( void )
);
/* Options */
intf_Msg
(
"Options:"
\
intf_Msg
(
"Options:
\n
"
\
" -h, --help print usage
\n
"
\
" -g, --grayscale grayscale video
\n
"
\
" --noaudio disable audio
\n
"
\
...
...
@@ -396,7 +396,7 @@ static void Usage( void )
" --mono disable stereo
\n
"
" --novideo disable video
\n
"
\
" --color color video
\n
"
\
" --novlans
disable vlans
\n
"
\
" --novlans
disable vlans
\n
"
\
);
/* Interface parameters */
...
...
@@ -408,7 +408,7 @@ static void Usage( void )
intf_Msg
(
"Audio parameters:
\n
"
\
" "
AOUT_DSP_VAR
"=<filename> dsp device path
\n
"
\
" "
AOUT_STEREO_VAR
"={1|0} stereo or mono output
\n
"
\
" "
AOUT_RATE_VAR
"=<rate>
output rate
\n
"
\
" "
AOUT_RATE_VAR
"=<rate> output rate
\n
"
\
);
/* Video parameters */
...
...
src/video_output/video_ggi.c
View file @
d81e21d5
...
...
@@ -32,8 +32,14 @@ typedef struct vout_sys_s
/* GGI system informations */
ggi_visual_t
p_display
;
/* display device */
/* Buffer index */
int
i_buffer_index
;
/* Buffers informations */
int
i_buffer_index
;
/* buffer index */
ggi_directbuffer
*
pp_buffer
[
2
];
/* buffers */
boolean_t
b_must_acquire
;
/* must be acquired before writing */
/* Characters size */
int
i_char_width
;
int
i_char_height
;
}
vout_sys_t
;
/*******************************************************************************
...
...
@@ -77,7 +83,13 @@ int vout_SysCreate( vout_thread_t *p_vout )
*******************************************************************************/
int
vout_SysInit
(
vout_thread_t
*
p_vout
)
{
/* Acquire first buffer */
p_vout
->
p_sys
->
i_buffer_index
=
0
;
if
(
p_vout
->
p_sys
->
b_must_acquire
)
{
ggiResourceAcquire
(
p_vout
->
p_sys
->
pp_buffer
[
0
]
->
resource
,
GGI_ACTYPE_WRITE
);
}
return
(
0
);
}
...
...
@@ -88,7 +100,11 @@ int vout_SysInit( vout_thread_t *p_vout )
*******************************************************************************/
void
vout_SysEnd
(
vout_thread_t
*
p_vout
)
{
;
/* Release buffer */
if
(
p_vout
->
p_sys
->
b_must_acquire
)
{
ggiResourceRelease
(
p_vout
->
p_sys
->
pp_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
resource
);
}
}
/*******************************************************************************
...
...
@@ -126,13 +142,24 @@ int vout_SysManage( vout_thread_t *p_vout )
void
vout_SysDisplay
(
vout_thread_t
*
p_vout
)
{
/* Change display frame */
if
(
p_vout
->
p_sys
->
b_must_acquire
)
{
ggiResourceRelease
(
p_vout
->
p_sys
->
pp_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
resource
);
}
ggiFlush
(
p_vout
->
p_sys
->
p_display
);
// ??
ggiSetDisplayFrame
(
p_vout
->
p_sys
->
p_display
,
p_vout
->
p_sys
->
i_buffer_index
);
ggiSetDisplayFrame
(
p_vout
->
p_sys
->
p_display
,
p_vout
->
p_sys
->
pp_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
frame
);
/* Swap buffers and change write frame */
p_vout
->
p_sys
->
i_buffer_index
=
++
p_vout
->
p_sys
->
i_buffer_index
&
1
;
ggiSetWriteFrame
(
p_vout
->
p_sys
->
p_display
,
p_vout
->
p_sys
->
i_buffer_index
);
}
if
(
p_vout
->
p_sys
->
b_must_acquire
)
{
ggiResourceAcquire
(
p_vout
->
p_sys
->
pp_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
resource
,
GGI_ACTYPE_WRITE
);
}
ggiSetWriteFrame
(
p_vout
->
p_sys
->
p_display
,
p_vout
->
p_sys
->
pp_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
frame
);
}
/*******************************************************************************
* vout_SysGetPicture: get current display buffer informations
...
...
@@ -140,9 +167,41 @@ void vout_SysDisplay( vout_thread_t *p_vout )
* This function returns the address of the current display buffer.
*******************************************************************************/
byte_t
*
vout_SysGetPicture
(
vout_thread_t
*
p_vout
)
{
return
(
p_vout
->
p_sys
->
pp_buffer
[
p_vout
->
p_sys
->
i_buffer_index
]
->
write
);
}
/*******************************************************************************
* vout_SysPrint: print simple text on a picture
*******************************************************************************
* This function will print a simple text on the picture. It is designed to
* print debugging or general informations, not to render subtitles.
*******************************************************************************/
void
vout_SysPrint
(
vout_thread_t
*
p_vout
,
int
i_x
,
int
i_y
,
int
i_halign
,
int
i_valign
,
unsigned
char
*
psz_text
)
{
//????
// return( p_vout->p_sys->p_ximage[ p_vout->p_sys->i_buffer_index ].data );
/* Update upper left coordinates according to alignment */
switch
(
i_halign
)
{
case
0
:
/* centered */
i_x
-=
p_vout
->
p_sys
->
i_char_width
*
strlen
(
psz_text
)
/
2
;
break
;
case
1
:
/* right aligned */
i_x
-=
p_vout
->
p_sys
->
i_char_width
*
strlen
(
psz_text
);
break
;
}
switch
(
i_valign
)
{
case
0
:
/* centered */
i_y
-=
p_vout
->
p_sys
->
i_char_height
/
2
;
break
;
case
1
:
/* bottom aligned */
i_y
-=
p_vout
->
p_sys
->
i_char_height
;
break
;
}
/* Print text */
ggiPuts
(
p_vout
->
p_sys
->
p_display
,
i_x
,
i_y
,
psz_text
);
}
/* following functions are local */
...
...
@@ -156,6 +215,9 @@ byte_t * vout_SysGetPicture( vout_thread_t *p_vout )
static
int
GGIOpenDisplay
(
vout_thread_t
*
p_vout
)
{
ggi_mode
mode
;
/* mode descriptor */
ggi_color
col_fg
;
/* foreground color */
ggi_color
col_bg
;
/* background color */
int
i_index
;
/* all purposes index */
/* Initialize library */
if
(
ggiInit
()
)
...
...
@@ -176,7 +238,7 @@ static int GGIOpenDisplay( vout_thread_t *p_vout )
/* Find most appropriate mode */
mode
.
frames
=
2
;
/* 2 buffers */
mode
.
visible
.
x
=
p_vout
->
i_width
;
/* minimum width */
mode
.
visible
.
y
=
p_vout
->
i_
width
;
/* maximum width
*/
mode
.
visible
.
y
=
p_vout
->
i_
height
;
/* minimum height
*/
mode
.
virt
.
x
=
GGI_AUTO
;
mode
.
virt
.
y
=
GGI_AUTO
;
mode
.
size
.
x
=
GGI_AUTO
;
...
...
@@ -198,9 +260,75 @@ static int GGIOpenDisplay( vout_thread_t *p_vout )
return
(
1
);
}
/* Check buffers properties */
p_vout
->
p_sys
->
b_must_acquire
=
0
;
for
(
i_index
=
0
;
i_index
<
2
;
i_index
++
)
{
/* Get buffer address */
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
=
ggiDBGetBuffer
(
p_vout
->
p_sys
->
p_display
,
i_index
);
if
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
==
NULL
)
{
intf_ErrMsg
(
"error: double buffering is not possible
\n
"
);
ggiClose
(
p_vout
->
p_sys
->
p_display
);
ggiExit
();
return
(
1
);
}
/* Check buffer properties */
if
(
!
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
->
type
&
GGI_DB_SIMPLE_PLB
)
||
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
->
page_size
!=
0
)
||
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
->
write
==
NULL
)
||
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
->
noaccess
!=
0
)
||
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
->
align
!=
0
)
)
{
intf_ErrMsg
(
"error: incorrect video memory type
\n
"
);
ggiClose
(
p_vout
->
p_sys
->
p_display
);
ggiExit
();
return
(
1
);
}
/* Check if buffer needs to be acquired before write */
if
(
ggiResourceMustAcquire
(
p_vout
->
p_sys
->
pp_buffer
[
i_index
]
->
resource
)
)
{
p_vout
->
p_sys
->
b_must_acquire
=
1
;
}
}
#ifdef DEBUG
if
(
p_vout
->
p_sys
->
b_must_acquire
)
{
intf_DbgMsg
(
"buffers must be acquired
\n
"
);
}
#endif
/* Get font size */
if
(
ggiGetCharSize
(
p_vout
->
p_sys
->
p_display
,
&
p_vout
->
p_sys
->
i_char_width
,
&
p_vout
->
p_sys
->
i_char_height
)
)
{
intf_ErrMsg
(
"error: can't get font size
\n
"
);
ggiClose
(
p_vout
->
p_sys
->
p_display
);
ggiExit
();
return
(
1
);
}
/* Set graphic context colors */
col_fg
.
r
=
col_fg
.
g
=
col_fg
.
b
=
-
1
;
col_bg
.
r
=
col_bg
.
g
=
col_bg
.
b
=
0
;
if
(
ggiSetGCForeground
(
p_vout
->
p_sys
->
p_display
,
ggiMapColor
(
p_vout
->
p_sys
->
p_display
,
&
col_fg
))
||
ggiSetGCBackground
(
p_vout
->
p_sys
->
p_display
,
ggiMapColor
(
p_vout
->
p_sys
->
p_display
,
&
col_bg
))
)
{
intf_ErrMsg
(
"error: can't set colors
\n
"
);
ggiClose
(
p_vout
->
p_sys
->
p_display
);
ggiExit
();
return
(
1
);
}
/* Set thread information */
p_vout
->
i_width
=
mode
.
visible
.
x
;
p_vout
->
i_height
=
mode
.
visible
.
y
;
p_vout
->
i_bytes_per_line
=
p_vout
->
p_sys
->
pp_buffer
[
0
]
->
buffer
.
plb
.
stride
;
switch
(
mode
.
graphtype
)
{
case
GT_15BIT
:
...
...
src/video_output/video_output.c
View file @
d81e21d5
...
...
@@ -177,7 +177,11 @@ vout_thread_t * vout_CreateThread (
/* Initialize some fields used by the system-dependant method - these fields will
* probably be modified by the method */
#ifdef DEBUG
p_vout
->
b_info
=
1
;
#else
p_vout
->
b_info
=
0
;
#endif
p_vout
->
b_grayscale
=
main_GetIntVariable
(
VOUT_GRAYSCALE_VAR
,
VOUT_GRAYSCALE_DEFAULT
);
p_vout
->
i_width
=
i_width
;
...
...
src/video_output/yuv_mmx.S
View file @
d81e21d5
/*
*-------------------------------------------------------------------------
*
cxm12161
--
This
function
performs
YUV12
-
to
-
RGB16
color
conversion
for
H26x
.
/*******************************************************************************
*
yuv_mmx
.
S
:
YUV
transformation
,
optimized
for
MMX
processors
*
(
c
)
1999
VideoLAN
******************************************************************************
*
*
Following
functions
are
defined
:
*
vout_YUV420_16_MMX
*
This
function
performs
YUV12
-
to
-
RGB16
color
conversion
for
H26x
.
*
It
handles
any
format
in
which
there
are
three
fields
,
the
low
*
order
field
being
B
and
fully
contained
in
the
low
order
byte
,
the
*
second
field
being
G
and
being
somewhere
in
bits
4
through
11
,
...
...
@@ -15,7 +19,7 @@
*
Height
may
be
any
amount
,
but
must
be
a
multiple
of
two
.
The
U
*
and
V
planes
may
have
a
different
pitch
than
the
Y
plane
,
subject
*
to
the
same
limitations
.
*/
*
******************************************************************************
/
//.
include
iammx.inc
//.
include
locals.inc
...
...
@@ -85,9 +89,8 @@ sixbitu: .quad 0xc0c0c0c0c0c0c0c0
#define GUpperLimit 140
#define BUpperLimit 148
/*
*
extern
void
C
MMX_YUV12ToRGB16
(
*
extern
void
C
vout_YUV420_16_MMX
(
*
U8
*
YPlane
,
*
U8
*
UPlane
,
*
U8
*
VPlane
,
...
...
@@ -113,8 +116,8 @@ sixbitu: .quad 0xc0c0c0c0c0c0c0c0
*
RGB655
=
3
*/
.
globl
yuv_2_rgb
yuv_2_rgb
:
.
globl
vout_YUV420_16_MMX
vout_YUV420_16_MMX
:
pushl
%
esi
pushl
%
edi
...
...
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