Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
GSoC
GSoC2018
macOS
vlc
Commits
9160790e
Commit
9160790e
authored
Jun 01, 2005
by
Clément Stenac
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merge mediacontrol to trunk
parent
c0156dd0
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1435 additions
and
3 deletions
+1435
-3
Makefile.am
Makefile.am
+4
-0
include/vlc/control.h
include/vlc/control.h
+211
-0
src/control/audio_video.c
src/control/audio_video.c
+422
-0
src/control/core.c
src/control/core.c
+389
-0
src/control/init.c
src/control/init.c
+86
-0
src/control/plugin.c
src/control/plugin.c
+26
-0
src/control/util.c
src/control/util.c
+292
-0
src/libvlc.h
src/libvlc.h
+3
-3
vlc-config.in.in
vlc-config.in.in
+2
-0
No files found.
Makefile.am
View file @
9160790e
...
...
@@ -60,6 +60,7 @@ dist_pkginclude_HEADERS = \
include/vlc/decoder.h
\
include/vlc/input.h
\
include/vlc/intf.h
\
include/vlc/control.h
\
$(NULL)
noinst_HEADERS
=
$(HEADERS_include)
$(HEADERS_include_built)
...
...
@@ -412,6 +413,9 @@ SOURCES_libvlc_common = \
src/misc/vlm.c
\
src/misc/xml.c
\
src/extras/libc.c
\
src/control/core.c
\
src/control/util.c
\
src/control/audio_video.c
\
$(NULL)
SOURCES_libvlc
=
\
...
...
include/vlc/control.h
0 → 100644
View file @
9160790e
/*****************************************************************************
* control.h: global header for mediacontrol
*****************************************************************************
* Copyright (C) 2005 VideoLAN
* $Id: vlc.h 10101 2005-03-02 16:47:31Z robux4 $
*
* Authors: Olivier Aubert <olivier.aubert@liris.univ-lyon1.fr>
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#ifndef _VLC_CONTROL_H
#define _VLC_CONTROL_H 1
# ifdef __cplusplus
extern
"C"
{
# endif
#include <vlc/vlc.h>
#if defined( WIN32 )
#define WINDOWHANDLE HWND
#else
#define WINDOWHANDLE int
#endif
typedef
int
bool
;
/************************************************************************
* Position Object Manipulation
*************************************************************************/
typedef
enum
{
mediacontrol_AbsolutePosition
,
mediacontrol_RelativePosition
,
mediacontrol_ModuloPosition
}
mediacontrol_PositionOrigin
;
typedef
enum
{
mediacontrol_ByteCount
,
mediacontrol_SampleCount
,
mediacontrol_MediaTime
}
mediacontrol_PositionKey
;
typedef
struct
{
mediacontrol_PositionOrigin
origin
;
mediacontrol_PositionKey
key
;
long
value
;
}
mediacontrol_Position
;
typedef
struct
{
int
width
;
int
height
;
long
type
;
long
long
date
;
int
size
;
char
*
data
;
}
mediacontrol_RGBPicture
;
typedef
struct
{
int
size
;
char
**
data
;
}
mediacontrol_PlaylistSeq
;
typedef
struct
{
int
code
;
char
*
message
;
}
mediacontrol_Exception
;
/* Exception codes */
#define mediacontrol_PositionKeyNotSupported 1
#define mediacontrol_PositionOriginNotSupported 2
#define mediacontrol_InvalidPosition 3
#define mediacontrol_PlaylistException 4
#define mediacontrol_InternalException 5
typedef
struct
{
vlc_object_t
*
p_vlc
;
playlist_t
*
p_playlist
;
intf_thread_t
*
p_intf
;
int
vlc_object_id
;
}
mediacontrol_Instance
;
/* Cf stream_control.h */
enum
mediacontrol_PlayerStatusList
{
mediacontrol_PlayingStatus
,
mediacontrol_PauseStatus
,
mediacontrol_ForwardStatus
,
mediacontrol_BackwardStatus
,
mediacontrol_InitStatus
,
mediacontrol_EndStatus
,
mediacontrol_UndefinedStatus
};
typedef
enum
mediacontrol_PlayerStatusList
mediacontrol_PlayerStatus
;
typedef
struct
{
mediacontrol_PlayerStatus
streamstatus
;
char
*
url
;
/* The URL of the current media stream */
long
long
position
;
/* actual location in the stream (in ms) */
long
long
length
;
/* total length of the stream (in ms) */
}
mediacontrol_StreamInformation
;
/**************************************************************************
* Helper functions
***************************************************************************/
long
long
mediacontrol_unit_convert
(
input_thread_t
*
p_input
,
mediacontrol_PositionKey
from
,
mediacontrol_PositionKey
to
,
long
long
value
);
long
long
mediacontrol_position2microsecond
(
input_thread_t
*
p_input
,
const
mediacontrol_Position
*
pos
);
mediacontrol_RGBPicture
*
mediacontrol_RGBPicture__alloc
(
int
datasize
);
void
mediacontrol_RGBPicture__free
(
mediacontrol_RGBPicture
*
pic
);
mediacontrol_PlaylistSeq
*
mediacontrol_PlaylistSeq__alloc
(
int
size
);
void
mediacontrol_PlaylistSeq__free
(
mediacontrol_PlaylistSeq
*
ps
);
mediacontrol_Exception
*
mediacontrol_exception_init
(
mediacontrol_Exception
*
exception
);
void
mediacontrol_exception_free
(
mediacontrol_Exception
*
exception
);
/*****************************************************************************
* Core functions
*****************************************************************************/
mediacontrol_Instance
*
mediacontrol_new
(
char
**
args
,
mediacontrol_Exception
*
exception
);
mediacontrol_Instance
*
mediacontrol_new_from_object
(
vlc_object_t
*
p_object
,
mediacontrol_Exception
*
exception
);
mediacontrol_Position
*
mediacontrol_get_media_position
(
mediacontrol_Instance
*
self
,
mediacontrol_PositionOrigin
an_origin
,
mediacontrol_PositionKey
a_key
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_set_media_position
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_start
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_pause
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_resume
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_stop
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_exit
(
mediacontrol_Instance
*
self
);
void
mediacontrol_playlist_add_item
(
mediacontrol_Instance
*
self
,
const
char
*
psz_file
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_playlist_clear
(
mediacontrol_Instance
*
self
,
mediacontrol_Exception
*
exception
);
mediacontrol_PlaylistSeq
*
mediacontrol_playlist_get_list
(
mediacontrol_Instance
*
self
,
mediacontrol_Exception
*
exception
);
/*****************************************************************************
* A/V functions
*****************************************************************************/
mediacontrol_RGBPicture
*
mediacontrol_snapshot
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
);
/* Return a NULL terminated list */
mediacontrol_RGBPicture
**
mediacontrol_all_snapshots
(
mediacontrol_Instance
*
self
,
mediacontrol_Exception
*
exception
);
// Displays the message string, between "begin" and "end" positions
void
mediacontrol_display_text
(
mediacontrol_Instance
*
self
,
const
char
*
message
,
const
mediacontrol_Position
*
begin
,
const
mediacontrol_Position
*
end
,
mediacontrol_Exception
*
exception
);
mediacontrol_StreamInformation
*
mediacontrol_get_stream_information
(
mediacontrol_Instance
*
self
,
mediacontrol_PositionKey
a_key
,
mediacontrol_Exception
*
exception
);
unsigned
short
mediacontrol_sound_get_volume
(
mediacontrol_Instance
*
self
,
mediacontrol_Exception
*
exception
);
void
mediacontrol_sound_set_volume
(
mediacontrol_Instance
*
self
,
const
unsigned
short
volume
,
mediacontrol_Exception
*
exception
);
bool
mediacontrol_set_visual
(
mediacontrol_Instance
*
self
,
WINDOWHANDLE
visual_id
,
mediacontrol_Exception
*
exception
);
# ifdef __cplusplus
}
# endif
#endif
src/control/audio_video.c
0 → 100644
View file @
9160790e
/*****************************************************************************
* audio_video.c: Audio/Video management : volume, snapshot, OSD
*****************************************************************************
* Copyright (C) 2005 VideoLAN
* $Id: vlc.c 10786 2005-04-23 23:19:17Z zorglub $
*
* Authors: Olivier Aubert <olivier.aubert@liris.univ-lyon1.fr>
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include <vlc/control.h>
#include <vlc/intf.h>
#include <vlc/vout.h>
#include <vlc/aout.h>
#include <vlc_demux.h>
#include <osd.h>
#define HAS_SNAPSHOT 1
#ifdef HAS_SNAPSHOT
#include <snapshot.h>
#endif
#include <stdlib.h>
/* malloc(), free() */
#include <string.h>
#include <errno.h>
/* ENOMEM */
#include <stdio.h>
#include <ctype.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#include <sys/types.h>
#define RAISE( c, m ) exception->code = c; \
exception->message = strdup(m);
mediacontrol_RGBPicture
*
mediacontrol_snapshot
(
mediacontrol_Instance
*
self
,
const
mediacontrol_Position
*
a_position
,
mediacontrol_Exception
*
exception
)
{
mediacontrol_RGBPicture
*
retval
=
NULL
;
input_thread_t
*
p_input
=
self
->
p_playlist
->
p_input
;
vout_thread_t
*
p_vout
=
NULL
;
int
i_datasize
;
snapshot_t
**
pointer
;
vlc_value_t
val
;
int
i_index
;
snapshot_t
*
p_best_snapshot
;
long
searched_date
;
#ifdef HAS_SNAPSHOT
int
i_cachesize
;
#endif
exception
=
mediacontrol_exception_init
(
exception
);
/*
if( var_Get( self->p_vlc, "snapshot-id", &val ) == VLC_SUCCESS )
p_vout = vlc_object_get( self->p_vlc, val.i_int );
*/
/* FIXME: if in p_libvlc, we cannot have multiple video outputs */
/* Once corrected, search for snapshot-id to modify all instances */
if
(
var_Get
(
p_input
,
"snapshot-id"
,
&
val
)
!=
VLC_SUCCESS
)
{
RAISE
(
mediacontrol_InternalException
,
"No snapshot-id in p_input"
);
return
NULL
;
}
p_vout
=
vlc_object_get
(
self
->
p_vlc
,
val
.
i_int
);
if
(
!
p_vout
)
{
RAISE
(
mediacontrol_InternalException
,
"No snapshot module"
);
return
NULL
;
}
#ifdef HAS_SNAPSHOT
/* We test if the vout is a snapshot module. We cannot test
pvout_psz_object_name( which is NULL ). But we can check if
there are snapshot-specific variables */
if
(
var_Get
(
p_vout
,
"snapshot-datasize"
,
&
val
)
!=
VLC_SUCCESS
)
{
RAISE
(
mediacontrol_InternalException
,
"No snapshot module"
);
vlc_object_release
(
p_vout
);
return
NULL
;
}
i_datasize
=
val
.
i_int
;
/* Handle the a_position parameter */
if
(
!
(
a_position
->
origin
==
mediacontrol_RelativePosition
&&
a_position
->
value
==
0
)
)
{
/* The position is not the current one. Go to it. */
mediacontrol_set_media_position
(
self
,
(
mediacontrol_Position
*
)
a_position
,
exception
);
if
(
exception
->
code
)
{
vlc_object_release
(
p_vout
);
return
NULL
;
}
}
/* FIXME: We should not go further until we got past the position
( which means that we had the possibility to capture the right
picture ). */
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
searched_date
=
mediacontrol_position2microsecond
(
p_input
,
(
mediacontrol_Position
*
)
a_position
);
var_Get
(
p_vout
,
"snapshot-cache-size"
,
&
val
);
i_cachesize
=
val
.
i_int
;
var_Get
(
p_vout
,
"snapshot-list-pointer"
,
&
val
);
pointer
=
(
snapshot_t
**
)
val
.
p_address
;
if
(
!
pointer
)
{
RAISE
(
mediacontrol_InternalException
,
"No available snapshot"
);
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
vlc_object_release
(
p_vout
);
return
NULL
;
}
/* Find the more appropriate picture, based on date */
p_best_snapshot
=
pointer
[
0
];
for
(
i_index
=
1
;
i_index
<
i_cachesize
;
i_index
++
)
{
long
l_diff
=
pointer
[
i_index
]
->
date
-
searched_date
;
if
(
l_diff
>
0
&&
l_diff
<
abs
(
p_best_snapshot
->
date
-
searched_date
))
{
/* This one is closer, and _after_ the requested position */
p_best_snapshot
=
pointer
[
i_index
];
}
}
/* FIXME: add a test for the case that no picture matched the test
( we have p_best_snapshot == pointer[0] */
retval
=
_mediacontrol_createRGBPicture
(
p_best_snapshot
->
i_width
,
p_best_snapshot
->
i_height
,
p_vout
->
output
.
i_chroma
,
p_best_snapshot
->
date
,
p_best_snapshot
->
p_data
,
i_datasize
);
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
vlc_object_release
(
p_vout
);
#endif
return
retval
;
}
mediacontrol_RGBPicture
**
mediacontrol_all_snapshots
(
mediacontrol_Instance
*
self
,
mediacontrol_Exception
*
exception
)
{
mediacontrol_RGBPicture
**
retval
=
NULL
;
vout_thread_t
*
p_vout
=
NULL
;
int
i_datasize
;
int
i_cachesize
;
vlc_value_t
val
;
int
i_index
;
#ifdef HAS_SNAPSHOT
snapshot_t
**
pointer
;
#endif
exception
=
mediacontrol_exception_init
(
exception
);
if
(
var_Get
(
self
->
p_playlist
->
p_input
,
"snapshot-id"
,
&
val
)
==
VLC_SUCCESS
)
p_vout
=
vlc_object_get
(
self
->
p_vlc
,
val
.
i_int
);
if
(
!
p_vout
)
{
RAISE
(
mediacontrol_InternalException
,
"No snapshot module"
);
return
NULL
;
}
#ifdef HAS_SNAPSHOT
/* We test if the vout is a snapshot module. We cannot test
pvout_psz_object_name( which is NULL ). But we can check if
there are snapshot-specific variables */
if
(
var_Get
(
p_vout
,
"snapshot-datasize"
,
&
val
)
!=
VLC_SUCCESS
)
{
RAISE
(
mediacontrol_InternalException
,
"No snapshot module"
);
vlc_object_release
(
p_vout
);
return
NULL
;
}
i_datasize
=
val
.
i_int
;
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
var_Get
(
p_vout
,
"snapshot-cache-size"
,
&
val
);
i_cachesize
=
val
.
i_int
;
var_Get
(
p_vout
,
"snapshot-list-pointer"
,
&
val
);
pointer
=
(
snapshot_t
**
)
val
.
p_address
;
if
(
!
pointer
)
{
RAISE
(
mediacontrol_InternalException
,
"No available picture"
);
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
vlc_object_release
(
p_vout
);
return
NULL
;
}
retval
=
(
mediacontrol_RGBPicture
**
)
malloc
(
(
i_cachesize
+
1
)
*
sizeof
(
char
*
));
for
(
i_index
=
0
;
i_index
<
i_cachesize
;
i_index
++
)
{
snapshot_t
*
p_s
=
pointer
[
i_index
];
mediacontrol_RGBPicture
*
p_rgb
;
p_rgb
=
_mediacontrol_createRGBPicture
(
p_s
->
i_width
,
p_s
->
i_height
,
p_vout
->
output
.
i_chroma
,
p_s
->
date
,
p_s
->
p_data
,
i_datasize
);
retval
[
i_index
]
=
p_rgb
;
}
retval
[
i_cachesize
]
=
NULL
;
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
vlc_object_release
(
p_vout
);
#endif
return
retval
;
}
int
mediacontrol_showtext
(
vout_thread_t
*
p_vout
,
int
i_channel
,
char
*
psz_string
,
text_style_t
*
p_style
,
int
i_flags
,
int
i_hmargin
,
int
i_vmargin
,
mtime_t
i_start
,
mtime_t
i_stop
)
{
subpicture_t
*
p_spu
;
video_format_t
fmt
;
if
(
!
psz_string
)
return
VLC_EGENERIC
;
p_spu
=
spu_CreateSubpicture
(
p_vout
->
p_spu
);
if
(
!
p_spu
)
return
VLC_EGENERIC
;
/* Create a new subpicture region */
memset
(
&
fmt
,
0
,
sizeof
(
video_format_t
)
);
fmt
.
i_chroma
=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
);
fmt
.
i_aspect
=
0
;
fmt
.
i_width
=
fmt
.
i_height
=
0
;
fmt
.
i_x_offset
=
fmt
.
i_y_offset
=
0
;
p_spu
->
p_region
=
p_spu
->
pf_create_region
(
VLC_OBJECT
(
p_vout
),
&
fmt
);
if
(
!
p_spu
->
p_region
)
{
msg_Err
(
p_vout
,
"cannot allocate SPU region"
);
spu_DestroySubpicture
(
p_vout
->
p_spu
,
p_spu
);
return
VLC_EGENERIC
;
}
p_spu
->
p_region
->
psz_text
=
strdup
(
psz_string
);
p_spu
->
i_start
=
i_start
;
p_spu
->
i_stop
=
i_stop
;
p_spu
->
b_ephemer
=
VLC_FALSE
;
p_spu
->
b_absolute
=
VLC_FALSE
;
p_spu
->
i_x
=
i_hmargin
;
p_spu
->
i_y
=
i_vmargin
;
p_spu
->
i_flags
=
i_flags
;
p_spu
->
i_channel
=
i_channel
;
spu_DisplaySubpicture
(
p_vout
->
p_spu
,
p_spu
);
return
VLC_SUCCESS
;
}
void
mediacontrol_display_text
(
mediacontrol_Instance
*
self
,
const
char
*
message
,
const
mediacontrol_Position
*
begin
,
const
mediacontrol_Position
*
end
,
mediacontrol_Exception
*
exception
)
{
input_thread_t
*
p_input
=
NULL
;
vout_thread_t
*
p_vout
=
NULL
;
char
*
psz_message
;
psz_message
=
strdup
(
message
);
if
(
!
psz_message
)
{
RAISE
(
mediacontrol_InternalException
,
"No more memory"
);
return
;
}
p_vout
=
vlc_object_find
(
self
->
p_playlist
,
VLC_OBJECT_VOUT
,
FIND_CHILD
);
if
(
!
p_vout
)
{
RAISE
(
mediacontrol_InternalException
,
"No video output"
);
return
;
}
if
(
begin
->
origin
==
mediacontrol_RelativePosition
&&
begin
->
value
==
0
&&
end
->
origin
==
mediacontrol_RelativePosition
)
{
mtime_t
i_duration
=
0
;
mtime_t
i_now
=
mdate
();
i_duration
=
1000
*
mediacontrol_unit_convert
(
self
->
p_playlist
->
p_input
,
end
->
key
,
mediacontrol_MediaTime
,
end
->
value
);
mediacontrol_showtext
(
p_vout
,
DEFAULT_CHAN
,
psz_message
,
NULL
,
OSD_ALIGN_BOTTOM
|
OSD_ALIGN_LEFT
,
0
,
0
,
i_now
,
i_now
+
i_duration
);
}
else
{
mtime_t
i_debut
,
i_fin
,
i_now
;
p_input
=
self
->
p_playlist
->
p_input
;
if
(
!
p_input
)
{
RAISE
(
mediacontrol_InternalException
,
"No input"
);
vlc_object_release
(
p_vout
);
return
;
}
/* FIXME */
/* i_now = input_ClockGetTS( p_input, NULL, 0 ); */
i_now
=
mdate
();
i_debut
=
mediacontrol_position2microsecond
(
p_input
,
(
mediacontrol_Position
*
)
begin
);
i_debut
+=
i_now
;
i_fin
=
mediacontrol_position2microsecond
(
p_input
,
(
mediacontrol_Position
*
)
end
);
i_fin
+=
i_now
;
vout_ShowTextAbsolute
(
p_vout
,
DEFAULT_CHAN
,
psz_message
,
NULL
,
OSD_ALIGN_BOTTOM
|
OSD_ALIGN_LEFT
,
0
,
0
,
i_debut
,
i_fin
);
}
vlc_object_release
(
p_vout
);
}
unsigned
short
mediacontrol_sound_get_volume
(
mediacontrol_Instance
*
self
,
mediacontrol_Exception
*
exception
)
{
short
retval
;
audio_volume_t
i_volume
;
if
(
!
self
->
p_intf
)
{
RAISE
(
mediacontrol_InternalException
,
"No interface module"
);
return
0
;
}
aout_VolumeGet
(
self
->
p_intf
,
&
i_volume
);
retval
=
i_volume
;
return
retval
;
}
void
mediacontrol_sound_set_volume
(
mediacontrol_Instance
*
self
,
const
unsigned
short
volume
,
mediacontrol_Exception
*
exception
)
{
if
(
!
self
->
p_intf
)