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
d0fe8565
Commit
d0fe8565
authored
Apr 06, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/visualization/goom.c:
+ big rewrite. + frame dropping. + new --goom-speed option.
parent
bb998bd7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
135 additions
and
59 deletions
+135
-59
modules/visualization/goom.c
modules/visualization/goom.c
+135
-59
No files found.
modules/visualization/goom.c
View file @
d0fe8565
...
@@ -4,7 +4,8 @@
...
@@ -4,7 +4,8 @@
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id$
* $Id$
*
*
* Authors: Laurent Aimar
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Gildas Bazin <gbazin@videolan.org>
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* it under the terms of the GNU General Public License as published by
...
@@ -45,15 +46,23 @@ static void Close ( vlc_object_t * );
...
@@ -45,15 +46,23 @@ static void Close ( vlc_object_t * );
#define WIDTH_TEXT N_("Goom display width")
#define WIDTH_TEXT N_("Goom display width")
#define HEIGHT_TEXT N_("Goom display height")
#define HEIGHT_TEXT N_("Goom display height")
#define RES_LONGTEXT N_("Allows you to change the resolution of the " \
#define RES_LONGTEXT N_("Allows you to change the resolution of the " \
"goom display (bigger resolution will be prettier but more CPU intensive)")
"goom display (bigger resolution will be prettier but more CPU intensive).")
#define SPEED_TEXT N_("Goom animation speed")
#define SPEED_LONGTEXT N_("Allows you to reduce the speed of the animation " \
"(default 7, max 10).")
#define MAX_SPEED 10
vlc_module_begin
();
vlc_module_begin
();
set_description
(
_
(
"
g
oom effect"
)
);
set_description
(
_
(
"
G
oom effect"
)
);
set_capability
(
"audio filter"
,
0
);
set_capability
(
"audio filter"
,
0
);
add_integer
(
"goom-width"
,
320
,
NULL
,
add_integer
(
"goom-width"
,
320
,
NULL
,
WIDTH_TEXT
,
RES_LONGTEXT
,
VLC_FALSE
);
WIDTH_TEXT
,
RES_LONGTEXT
,
VLC_FALSE
);
add_integer
(
"goom-height"
,
240
,
NULL
,
add_integer
(
"goom-height"
,
240
,
NULL
,
HEIGHT_TEXT
,
RES_LONGTEXT
,
VLC_FALSE
);
HEIGHT_TEXT
,
RES_LONGTEXT
,
VLC_FALSE
);
add_integer
(
"goom-speed"
,
7
,
NULL
,
SPEED_TEXT
,
SPEED_LONGTEXT
,
VLC_FALSE
);
set_callbacks
(
Open
,
Close
);
set_callbacks
(
Open
,
Close
);
add_shortcut
(
"goom"
);
add_shortcut
(
"goom"
);
vlc_module_end
();
vlc_module_end
();
...
@@ -61,6 +70,8 @@ vlc_module_end();
...
@@ -61,6 +70,8 @@ vlc_module_end();
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
*****************************************************************************/
*****************************************************************************/
#define MAX_BLOCKS 10
#define GOOM_DELAY 400000
typedef
struct
typedef
struct
{
{
...
@@ -72,9 +83,15 @@ typedef struct
...
@@ -72,9 +83,15 @@ typedef struct
vlc_mutex_t
lock
;
vlc_mutex_t
lock
;
vlc_cond_t
wait
;
vlc_cond_t
wait
;
mtime_t
i_pts
;
/* Audio properties */
int
i_samples
;
int
i_channels
;
int16_t
samples
[
2
][
512
];
/* Audio samples queue */
block_t
*
pp_blocks
[
MAX_BLOCKS
];
int
i_blocks
;
audio_date_t
date
;
}
goom_thread_t
;
}
goom_thread_t
;
typedef
struct
aout_filter_sys_t
typedef
struct
aout_filter_sys_t
...
@@ -143,8 +160,11 @@ static int Open( vlc_object_t *p_this )
...
@@ -143,8 +160,11 @@ static int Open( vlc_object_t *p_this )
vlc_mutex_init
(
p_filter
,
&
p_thread
->
lock
);
vlc_mutex_init
(
p_filter
,
&
p_thread
->
lock
);
vlc_cond_init
(
p_filter
,
&
p_thread
->
wait
);
vlc_cond_init
(
p_filter
,
&
p_thread
->
wait
);
p_thread
->
i_samples
=
0
;
p_thread
->
i_blocks
=
0
;
memset
(
&
p_thread
->
samples
,
0
,
512
*
2
*
2
);
aout_DateInit
(
&
p_thread
->
date
,
p_filter
->
output
.
i_rate
);
aout_DateSet
(
&
p_thread
->
date
,
0
);
p_thread
->
i_channels
=
aout_FormatNbChannels
(
&
p_filter
->
input
);
p_thread
->
psz_title
=
TitleGet
(
VLC_OBJECT
(
p_filter
)
);
p_thread
->
psz_title
=
TitleGet
(
VLC_OBJECT
(
p_filter
)
);
if
(
vlc_thread_create
(
p_thread
,
"Goom Update Thread"
,
Thread
,
if
(
vlc_thread_create
(
p_thread
,
"Goom Update Thread"
,
Thread
,
...
@@ -165,9 +185,40 @@ static int Open( vlc_object_t *p_this )
...
@@ -165,9 +185,40 @@ static int Open( vlc_object_t *p_this )
}
}
/*****************************************************************************
/*****************************************************************************
*
Play: play a sound
samples buffer
*
DoWork: process
samples buffer
*****************************************************************************
*****************************************************************************
* This function writes a buffer of i_length bytes in the socket
* This function queues the audio buffer to be processed by the goom thread
*****************************************************************************/
static
void
DoWork
(
aout_instance_t
*
p_aout
,
aout_filter_t
*
p_filter
,
aout_buffer_t
*
p_in_buf
,
aout_buffer_t
*
p_out_buf
)
{
aout_filter_sys_t
*
p_sys
=
p_filter
->
p_sys
;
block_t
*
p_block
;
p_out_buf
->
i_nb_samples
=
p_in_buf
->
i_nb_samples
;
p_out_buf
->
i_nb_bytes
=
p_in_buf
->
i_nb_bytes
;
/* Queue sample */
vlc_mutex_lock
(
&
p_sys
->
p_thread
->
lock
);
if
(
p_sys
->
p_thread
->
i_blocks
==
MAX_BLOCKS
)
{
vlc_mutex_unlock
(
&
p_sys
->
p_thread
->
lock
);
return
;
}
p_block
=
block_New
(
p_sys
->
p_thread
,
p_in_buf
->
i_nb_bytes
);
if
(
!
p_block
)
return
;
memcpy
(
p_block
->
p_buffer
,
p_in_buf
->
p_buffer
,
p_in_buf
->
i_nb_bytes
);
p_block
->
i_pts
=
p_in_buf
->
start_date
;
p_sys
->
p_thread
->
pp_blocks
[
p_sys
->
p_thread
->
i_blocks
++
]
=
p_block
;
vlc_cond_signal
(
&
p_sys
->
p_thread
->
wait
);
vlc_mutex_unlock
(
&
p_sys
->
p_thread
->
lock
);
}
/*****************************************************************************
* float to s16 conversion
*****************************************************************************/
*****************************************************************************/
static
inline
int16_t
FloatToInt16
(
float
f
)
static
inline
int16_t
FloatToInt16
(
float
f
)
{
{
...
@@ -179,108 +230,128 @@ static inline int16_t FloatToInt16( float f )
...
@@ -179,108 +230,128 @@ static inline int16_t FloatToInt16( float f )
return
(
int16_t
)(
f
*
32768
.
0
);
return
(
int16_t
)(
f
*
32768
.
0
);
}
}
static
void
DoWork
(
aout_instance_t
*
p_aout
,
aout_filter_t
*
p_filter
,
/*****************************************************************************
aout_buffer_t
*
p_in_buf
,
aout_buffer_t
*
p_out_buf
)
* Fill buffer
*****************************************************************************/
static
int
FillBuffer
(
int16_t
*
p_data
,
int
*
pi_data
,
audio_date_t
*
pi_date
,
audio_date_t
*
pi_date_end
,
goom_thread_t
*
p_this
)
{
{
aout_filter_sys_t
*
p_sys
=
p_filter
->
p_sys
;
int
i_samples
=
0
;
block_t
*
p_block
;
int16_t
*
p_isample
;
float
*
p_fsample
=
(
float
*
)
p_in_buf
->
p_buffer
;
int
i_samples
=
0
;
int
i_channels
=
aout_FormatNbChannels
(
&
p_filter
->
input
);
p_out_buf
->
i_nb_samples
=
p_in_buf
->
i_nb_samples
;
while
(
*
pi_data
<
512
)
p_out_buf
->
i_nb_bytes
=
p_in_buf
->
i_nb_bytes
;
/* copy samples */
vlc_mutex_lock
(
&
p_sys
->
p_thread
->
lock
);
p_sys
->
p_thread
->
i_pts
=
p_in_buf
->
start_date
;
if
(
p_sys
->
p_thread
->
i_samples
>=
512
)
{
{
p_sys
->
p_thread
->
i_samples
=
0
;
if
(
!
p_this
->
i_blocks
)
return
VLC_EGENERIC
;
}
p_isample
=
&
p_sys
->
p_thread
->
samples
[
0
][
p_sys
->
p_thread
->
i_samples
];
i_samples
=
__MIN
(
512
-
p_sys
->
p_thread
->
i_samples
,
p_block
=
p_this
->
pp_blocks
[
0
];
(
int
)
p_out_buf
->
i_nb_samples
);
i_samples
=
__MIN
(
512
-
*
pi_data
,
p_block
->
i_buffer
/
p_sys
->
p_thread
->
i_samples
+=
i_samples
;
sizeof
(
float
)
/
p_this
->
i_channels
)
;
while
(
i_samples
>
0
)
/* Date management */
{
if
(
p_block
->
i_pts
>
0
&&
p_isample
[
0
]
=
FloatToInt16
(
p_fsample
[
0
]
);
p_block
->
i_pts
!=
aout_DateGet
(
pi_date_end
)
)
if
(
i_channels
>
1
)
{
{
p_isample
[
512
]
=
FloatToInt16
(
p_fsample
[
1
]
);
aout_DateSet
(
pi_date_end
,
p_block
->
i_pts
);
}
}
p_block
->
i_pts
=
0
;
p_isample
++
;
aout_DateIncrement
(
pi_date_end
,
i_samples
);
p_fsample
+=
i_channels
;
i_samples
--
;
while
(
i_samples
>
0
)
}
{
if
(
p_sys
->
p_thread
->
i_samples
==
512
)
float
*
p_float
=
(
float
*
)
p_block
->
p_buffer
;
{
vlc_cond_signal
(
&
p_sys
->
p_thread
->
wait
);
p_data
[
*
pi_data
]
=
FloatToInt16
(
p_float
[
0
]
);
if
(
p_this
->
i_channels
>
1
)
p_data
[
512
+
*
pi_data
]
=
FloatToInt16
(
p_float
[
1
]
);
(
*
pi_data
)
++
;
p_block
->
p_buffer
+=
(
sizeof
(
float
)
*
p_this
->
i_channels
);
p_block
->
i_buffer
-=
(
sizeof
(
float
)
*
p_this
->
i_channels
);
i_samples
--
;
}
if
(
!
p_block
->
i_buffer
)
{
block_Release
(
p_block
);
p_this
->
i_blocks
--
;
if
(
p_this
->
i_blocks
)
memmove
(
p_this
->
pp_blocks
,
p_this
->
pp_blocks
+
1
,
p_this
->
i_blocks
*
sizeof
(
block_t
*
)
);
}
}
}
vlc_mutex_unlock
(
&
p_sys
->
p_thread
->
lock
);
*
pi_date
=
*
pi_date_end
;
*
pi_data
=
0
;
return
VLC_SUCCESS
;
}
}
/*****************************************************************************
/*****************************************************************************
* Thread:
* Thread:
*****************************************************************************/
*****************************************************************************/
static
void
Thread
(
vlc_object_t
*
p_this
)
static
void
Thread
(
vlc_object_t
*
p_this
)
{
{
goom_thread_t
*
p_thread
=
(
goom_thread_t
*
)
p_this
;
goom_thread_t
*
p_thread
=
(
goom_thread_t
*
)
p_this
;
vlc_value_t
width
,
height
;
vlc_value_t
width
,
height
,
speed
;
audio_date_t
i_pts
;
int16_t
p_data
[
2
][
512
];
int
i_data
=
0
,
i_count
=
0
;
var_Get
(
p_this
,
"goom-width"
,
&
width
);
var_Get
(
p_this
,
"goom-width"
,
&
width
);
var_Get
(
p_this
,
"goom-height"
,
&
height
);
var_Get
(
p_this
,
"goom-height"
,
&
height
);
var_Create
(
p_thread
,
"goom-speed"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_thread
,
"goom-speed"
,
&
speed
);
speed
.
i_int
=
MAX_SPEED
-
speed
.
i_int
;
if
(
speed
.
i_int
<
0
)
speed
.
i_int
=
0
;
goom_init
(
width
.
i_int
,
height
.
i_int
,
0
);
goom_init
(
width
.
i_int
,
height
.
i_int
,
0
);
goom_set_font
(
NULL
,
NULL
,
NULL
);
goom_set_font
(
NULL
,
NULL
,
NULL
);
while
(
!
p_thread
->
b_die
)
while
(
!
p_thread
->
b_die
)
{
{
mtime_t
i_pts
;
int16_t
data
[
2
][
512
];
uint32_t
*
plane
;
uint32_t
*
plane
;
picture_t
*
p_pic
;
picture_t
*
p_pic
;
/* goom_update is damn slow, so just copy data and release the lock */
/* goom_update is damn slow, so just copy data and release the lock */
vlc_mutex_lock
(
&
p_thread
->
lock
);
vlc_mutex_lock
(
&
p_thread
->
lock
);
vlc_cond_wait
(
&
p_thread
->
wait
,
&
p_thread
->
lock
);
if
(
FillBuffer
(
(
int16_t
*
)
p_data
,
&
i_data
,
&
i_pts
,
i_pts
=
p_thread
->
i_pts
;
&
p_thread
->
date
,
p_thread
)
!=
VLC_SUCCESS
)
memcpy
(
data
,
p_thread
->
samples
,
512
*
2
*
2
);
vlc_cond_wait
(
&
p_thread
->
wait
,
&
p_thread
->
lock
);
vlc_mutex_unlock
(
&
p_thread
->
lock
);
vlc_mutex_unlock
(
&
p_thread
->
lock
);
plane
=
goom_update
(
data
,
0
,
0
.
0
,
p_thread
->
psz_title
,
NULL
);
/* Speed selection */
if
(
speed
.
i_int
&&
(
++
i_count
%
(
speed
.
i_int
+
1
))
)
continue
;
/* Frame dropping if necessary */
if
(
aout_DateGet
(
&
i_pts
)
+
GOOM_DELAY
<=
mdate
()
)
continue
;
plane
=
goom_update
(
p_data
,
0
,
0
.
0
,
p_thread
->
psz_title
,
NULL
);
if
(
p_thread
->
psz_title
)
if
(
p_thread
->
psz_title
)
{
{
free
(
p_thread
->
psz_title
);
free
(
p_thread
->
psz_title
);
p_thread
->
psz_title
=
NULL
;
p_thread
->
psz_title
=
NULL
;
}
}
while
(
!
(
p_pic
=
vout_CreatePicture
(
p_thread
->
p_vout
,
0
,
0
,
0
)
)
&&
while
(
!
(
p_pic
=
vout_CreatePicture
(
p_thread
->
p_vout
,
0
,
0
,
0
)
)
&&
!
p_thread
->
b_die
)
!
p_thread
->
b_die
)
{
{
msleep
(
VOUT_OUTMEM_SLEEP
);
msleep
(
VOUT_OUTMEM_SLEEP
);
}
}
if
(
p_pic
==
NULL
)
if
(
p_pic
==
NULL
)
break
;
{
break
;
}
memcpy
(
p_pic
->
p
[
0
].
p_pixels
,
plane
,
width
.
i_int
*
height
.
i_int
*
4
);
memcpy
(
p_pic
->
p
[
0
].
p_pixels
,
plane
,
width
.
i_int
*
height
.
i_int
*
4
);
vout_DatePicture
(
p_thread
->
p_vout
,
p_pic
,
i_pts
);
vout_DatePicture
(
p_thread
->
p_vout
,
p_pic
,
aout_DateGet
(
&
i_pts
)
+
GOOM_DELAY
);
vout_DisplayPicture
(
p_thread
->
p_vout
,
p_pic
);
vout_DisplayPicture
(
p_thread
->
p_vout
,
p_pic
);
}
}
goom_close
();
goom_close
();
}
}
/*****************************************************************************
/*****************************************************************************
* Close: close the plugin
* Close: close the plugin
*****************************************************************************/
*****************************************************************************/
...
@@ -303,12 +374,17 @@ static void Close( vlc_object_t *p_this )
...
@@ -303,12 +374,17 @@ static void Close( vlc_object_t *p_this )
vlc_mutex_destroy
(
&
p_sys
->
p_thread
->
lock
);
vlc_mutex_destroy
(
&
p_sys
->
p_thread
->
lock
);
vlc_cond_destroy
(
&
p_sys
->
p_thread
->
wait
);
vlc_cond_destroy
(
&
p_sys
->
p_thread
->
wait
);
vlc_object_detach
(
p_sys
->
p_thread
);
vlc_object_detach
(
p_sys
->
p_thread
);
while
(
p_sys
->
p_thread
->
i_blocks
--
)
{
block_Release
(
p_sys
->
p_thread
->
pp_blocks
[
p_sys
->
p_thread
->
i_blocks
]
);
}
vlc_object_destroy
(
p_sys
->
p_thread
);
vlc_object_destroy
(
p_sys
->
p_thread
);
free
(
p_sys
);
free
(
p_sys
);
}
}
static
char
*
TitleGet
(
vlc_object_t
*
p_this
)
static
char
*
TitleGet
(
vlc_object_t
*
p_this
)
{
{
char
*
psz_title
=
NULL
;
char
*
psz_title
=
NULL
;
...
...
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