Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
7d01a7e7
Commit
7d01a7e7
authored
Jun 22, 2004
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* all: rework of the input.
parent
53b4094f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
602 additions
and
0 deletions
+602
-0
include/vlc_access.h
include/vlc_access.h
+123
-0
include/vlc_demux.h
include/vlc_demux.h
+133
-0
include/vlc_input.h
include/vlc_input.h
+346
-0
No files found.
include/vlc_access.h
0 → 100644
View file @
7d01a7e7
/*****************************************************************************
* vlc_access.h
*****************************************************************************
* Copyright (C) 1999-2004 VideoLAN
* $Id: ninput.h 7930 2004-06-07 18:23:15Z fenrir $
*
* Authors: Laurent Aimar <fenrir@via.ecp.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_ACCESS_H
#define _VLC_ACCESS_H 1
/**
* \defgroup access Access
* @{
*/
enum
access_query_e
{
/* capabilities */
ACCESS_CAN_SEEK
,
/* arg1= vlc_bool_t* cannot fail */
ACCESS_CAN_FASTSEEK
,
/* arg1= vlc_bool_t* cannot fail */
ACCESS_CAN_PAUSE
,
/* arg1= vlc_bool_t* cannot fail */
ACCESS_CAN_CONTROL_PACE
,
/* arg1= vlc_bool_t* cannot fail */
/* */
ACCESS_GET_MTU
,
/* arg1= int* cannot fail(0 if no sense)*/
ACCESS_GET_PTS_DELAY
,
/* arg1= int64_t* cannot fail */
/* */
ACCESS_GET_TITLE_INFO
,
/* arg1=input_title_t*** arg2=int* can fail */
/* */
ACCESS_SET_PAUSE_STATE
,
/* arg1= vlc_bool_t can fail */
/* */
ACCESS_SET_TITLE
,
/* arg1= int can fail */
ACCESS_SET_SEEKPOINT
,
/* arg1= int can fail */
/* Special mode for access/demux communication
* XXX: avoid to use it unless you can't */
ACCESS_SET_PRIVATE_ID_STATE
,
/* arg1= vlc_bool_t b_selected, int i_private_data can fail */
};
struct
access_t
{
VLC_COMMON_MEMBERS
/* Module properties */
module_t
*
p_module
;
/* Access name (empty if non forced) */
char
*
psz_access
;
/* Access path/url/filename/.... */
char
*
psz_path
;
/* Access can fill this entry to force a demuxer
* XXX: fill it once you know for sure you will succed
* (if you fail, this value won't be reseted */
char
*
psz_demux
;
/* pf_read/pf_block is used to read data.
* XXX A access should set one and only one of them */
int
(
*
pf_read
)
(
access_t
*
,
uint8_t
*
,
int
);
/* Return -1 if no data yet, 0 if no more data, else real data read */
block_t
*
(
*
pf_block
)(
access_t
*
);
/* return a block of data in his 'natural' size, NULL if not yet data or eof */
/* Called for each seek.
* XXX can be null */
int
(
*
pf_seek
)
(
access_t
*
,
int64_t
);
/* can be null if can't seek */
/* Used to retreive and configure the access
* XXX mandatory. look at access_query_e to know what query you *have to* support */
int
(
*
pf_control
)(
access_t
*
,
int
i_query
,
va_list
args
);
/* Access has to maintain them uptodate */
struct
{
unsigned
int
i_update
;
/* Access sets them on change,
Input removes them once take into account*/
int64_t
i_size
;
/* Write only for access, read only for input */
int64_t
i_pos
;
/* idem */
vlc_bool_t
b_eof
;
/* idem */
int
i_title
;
/* idem, start from 0 (could be menu) */
int
i_seekpoint
;
/* idem, start from 0 */
}
info
;
access_sys_t
*
p_sys
;
};
#define access2_New( a, b, c, d ) __access2_New(VLC_OBJECT(a), b, c, d )
VLC_EXPORT
(
access_t
*
,
__access2_New
,
(
vlc_object_t
*
p_obj
,
char
*
psz_access
,
char
*
psz_demux
,
char
*
psz_path
)
);
VLC_EXPORT
(
void
,
access2_Delete
,
(
access_t
*
)
);
static
inline
int
access2_vaControl
(
access_t
*
p_access
,
int
i_query
,
va_list
args
)
{
return
p_access
->
pf_control
(
p_access
,
i_query
,
args
);
}
static
inline
int
access2_Control
(
access_t
*
p_access
,
int
i_query
,
...
)
{
va_list
args
;
int
i_result
;
va_start
(
args
,
i_query
);
i_result
=
access2_vaControl
(
p_access
,
i_query
,
args
);
va_end
(
args
);
return
i_result
;
}
#endif
include/vlc_demux.h
0 → 100644
View file @
7d01a7e7
/*****************************************************************************
* vlc_demux.h
*****************************************************************************
* Copyright (C) 1999-2004 VideoLAN
* $Id: ninput.h 7930 2004-06-07 18:23:15Z fenrir $
*
* Authors: Laurent Aimar <fenrir@via.ecp.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_DEMUX_H
#define _VLC_DEMUX_H 1
/**
* \defgroup demux Demux
* @{
*/
struct
demux_t
{
VLC_COMMON_MEMBERS
/* Module properties */
module_t
*
p_module
;
/* eg informative but needed (we can have access+demux) */
char
*
psz_access
;
char
*
psz_demux
;
char
*
psz_path
;
/* input stream */
stream_t
*
s
;
/* NULL in case of a access+demux in one */
/* es output */
es_out_t
*
out
;
/* ou p_es_out */
/* set by demuxer */
int
(
*
pf_demux
)
(
demux_t
*
);
/* demux one frame only */
int
(
*
pf_control
)(
demux_t
*
,
int
i_query
,
va_list
args
);
/* Demux has to maintain them uptodate
* when it is responsible of seekpoint/title */
struct
{
unsigned
int
i_update
;
/* Demux sets them on change,
Input removes them once take into account*/
/* Seekpoint/Title at demux level */
int
i_title
;
/* idem, start from 0 (could be menu) */
int
i_seekpoint
;
/* idem, start from 0 */
}
info
;
demux_sys_t
*
p_sys
;
};
enum
demux_query_e
{
/* I. Common queries to access_demux and demux */
/* POSITION double between 0.0 and 1.0 */
DEMUX_GET_POSITION
,
/* arg1= double * res= */
DEMUX_SET_POSITION
,
/* arg1= double res=can fail */
/* LENGTH/TIME in microsecond, 0 if unknown */
DEMUX_GET_LENGTH
,
/* arg1= int64_t * res= */
DEMUX_GET_TIME
,
/* arg1= int64_t * res= */
DEMUX_SET_TIME
,
/* arg1= int64_t res=can fail */
/* TITLE_INFO only if more than 1 title or 1 chapter */
DEMUX_GET_TITLE_INFO
,
/* arg1=input_title_t*** arg2=int* can fail */
/* TITLE/SEEKPOINT, only when TITLE_INFO succeed */
DEMUX_SET_TITLE
,
/* arg1= int can fail */
DEMUX_SET_SEEKPOINT
,
/* arg1= int can fail */
/* Ask the demux to demux until the given date at the next pf_demux call
* but not more (and not less, at the precision avaiable of course).
* XXX: not mandatory (except for subtitle demux) but I will help a lot
* for multi-input
*/
DEMUX_SET_NEXT_DEMUX_TIME
,
/* arg1= int64_t * can fail */
/* FPS for correct subtitles handling */
DEMUX_GET_FPS
,
/* arg1= float * res=can fail */
/* Meta data */
DEMUX_GET_META
,
/* arg1= vlc_meta_t ** res=can fail */
/* II. Specific access_demux queries */
DEMUX_CAN_PAUSE
,
/* arg1= vlc_bool_t* cannot fail */
DEMUX_CAN_CONTROL_PACE
,
/* arg1= vlc_bool_t* cannot fail */
DEMUX_GET_PTS_DELAY
,
/* arg1= int64_t* cannot fail */
DEMUX_SET_PAUSE_STATE
,
/* arg1= vlc_bool_t can fail */
};
/* stream_t *s could be null and then it mean a access+demux in one */
#define demux2_New( a, b, c, d, e, f ) __demux2_New(VLC_OBJECT(a),b,c,d,e,f)
VLC_EXPORT
(
demux_t
*
,
__demux2_New
,
(
vlc_object_t
*
p_obj
,
char
*
psz_access
,
char
*
psz_demux
,
char
*
psz_path
,
stream_t
*
s
,
es_out_t
*
out
)
);
VLC_EXPORT
(
void
,
demux2_Delete
,
(
demux_t
*
)
);
VLC_EXPORT
(
int
,
demux2_vaControlHelper
,
(
stream_t
*
,
int64_t
i_start
,
int64_t
i_end
,
int
i_bitrate
,
int
i_align
,
int
i_query
,
va_list
args
)
);
static
inline
int
demux2_Demux
(
demux_t
*
p_demux
)
{
return
p_demux
->
pf_demux
(
p_demux
);
}
static
inline
int
demux2_vaControl
(
demux_t
*
p_demux
,
int
i_query
,
va_list
args
)
{
return
p_demux
->
pf_control
(
p_demux
,
i_query
,
args
);
}
static
inline
int
demux2_Control
(
demux_t
*
p_demux
,
int
i_query
,
...
)
{
va_list
args
;
int
i_result
;
va_start
(
args
,
i_query
);
i_result
=
demux2_vaControl
(
p_demux
,
i_query
,
args
);
va_end
(
args
);
return
i_result
;
}
/**
* @}
*/
#endif
include/vlc_input.h
0 → 100644
View file @
7d01a7e7
/*****************************************************************************
* vlc_input.h:
*****************************************************************************
* Copyright (C) 1999-2004 VideoLAN
* $Id: input_ext-intf.h 7954 2004-06-07 22:19:12Z fenrir $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.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.
*****************************************************************************/
/* __ is need because conflict with <vlc/input.h> */
#ifndef _VLC__INPUT_H
#define _VLC__INPUT_H 1
/*****************************************************************************
* input_item_t: Describes an input and is used to spawn input_thread_t objects.
*****************************************************************************/
struct
info_t
{
char
*
psz_name
;
/**< Name of this info */
char
*
psz_value
;
/**< Value of the info */
};
struct
info_category_t
{
char
*
psz_name
;
/**< Name of this category */
int
i_infos
;
/**< Number of infos in the category */
struct
info_t
**
pp_infos
;
/**< Pointer to an array of infos */
};
struct
input_item_t
{
char
*
psz_name
;
/**< text describing this item */
char
*
psz_uri
;
/**< mrl of this item */
int
i_options
;
/**< Number of input options */
char
**
ppsz_options
;
/**< Array of input options */
mtime_t
i_duration
;
/**< A hint about the duration of this
* item, in milliseconds*/
int
i_categories
;
/**< Number of info categories */
info_category_t
**
pp_categories
;
/**< Pointer to the first info category */
vlc_mutex_t
lock
;
/**< Item cannot be changed without this lock */
};
/*****************************************************************************
* Seek point: (generalisation of chapters)
*****************************************************************************/
struct
seekpoint_t
{
int64_t
i_byte_offset
;
int64_t
i_time_offset
;
char
*
psz_name
;
};
static
inline
seekpoint_t
*
vlc_seekpoint_New
(
void
)
{
seekpoint_t
*
point
=
(
seekpoint_t
*
)
malloc
(
sizeof
(
seekpoint_t
)
);
point
->
i_byte_offset
=
point
->
i_time_offset
=
0
;
point
->
psz_name
=
NULL
;
return
point
;
}
static
inline
void
vlc_seekpoint_Delete
(
seekpoint_t
*
point
)
{
if
(
!
point
)
return
;
if
(
point
->
psz_name
)
free
(
point
->
psz_name
);
free
(
point
);
}
static
inline
seekpoint_t
*
vlc_seekpoint_Duplicate
(
seekpoint_t
*
src
)
{
seekpoint_t
*
point
=
vlc_seekpoint_New
();
if
(
src
->
psz_name
)
point
->
psz_name
=
strdup
(
src
->
psz_name
);
point
->
i_time_offset
=
src
->
i_time_offset
;
point
->
i_byte_offset
=
src
->
i_byte_offset
;
return
point
;
}
/*****************************************************************************
* Title:
*****************************************************************************/
typedef
struct
{
char
*
psz_name
;
vlc_bool_t
b_menu
;
/* Is it a menu or a normal entry */
int64_t
i_length
;
/* Length(microsecond) if known, else 0 */
int64_t
i_size
;
/* Size (bytes) if known, else 0 */
/* Title seekpoint */
int
i_seekpoint
;
seekpoint_t
**
seekpoint
;
}
input_title_t
;
static
inline
input_title_t
*
vlc_input_title_New
(
)
{
input_title_t
*
t
=
(
input_title_t
*
)
malloc
(
sizeof
(
input_title_t
)
);
t
->
psz_name
=
NULL
;
t
->
b_menu
=
VLC_FALSE
;
t
->
i_length
=
0
;
t
->
i_size
=
0
;
t
->
i_seekpoint
=
0
;
t
->
seekpoint
=
NULL
;
return
t
;
}
static
inline
void
vlc_input_title_Delete
(
input_title_t
*
t
)
{
int
i
;
if
(
t
==
NULL
)
return
;
if
(
t
->
psz_name
)
free
(
t
->
psz_name
);
for
(
i
=
0
;
i
<
t
->
i_seekpoint
;
i
++
)
{
if
(
t
->
seekpoint
[
i
]
->
psz_name
)
free
(
t
->
seekpoint
[
i
]
->
psz_name
);
free
(
t
->
seekpoint
[
i
]
);
}
if
(
t
->
seekpoint
)
free
(
t
->
seekpoint
);
free
(
t
);
}
static
inline
input_title_t
*
vlc_input_title_Duplicate
(
input_title_t
*
t
)
{
input_title_t
*
dup
=
vlc_input_title_New
(
);
int
i
;
if
(
t
->
psz_name
)
dup
->
psz_name
=
strdup
(
t
->
psz_name
);
dup
->
b_menu
=
t
->
b_menu
;
dup
->
i_length
=
t
->
i_length
;
dup
->
i_size
=
t
->
i_size
;
dup
->
i_seekpoint
=
t
->
i_seekpoint
;
if
(
t
->
i_seekpoint
>
0
)
{
dup
->
seekpoint
=
(
seekpoint_t
**
)
calloc
(
t
->
i_seekpoint
,
sizeof
(
seekpoint_t
*
)
);
for
(
i
=
0
;
i
<
t
->
i_seekpoint
;
i
++
)
{
dup
->
seekpoint
[
i
]
=
vlc_seekpoint_Duplicate
(
t
->
seekpoint
[
i
]
);
}
}
return
dup
;
}
/*****************************************************************************
* input defines/constants.
*****************************************************************************/
/* "state" value */
enum
input_state_e
{
INIT_S
,
PLAYING_S
,
PAUSE_S
,
END_S
,
};
/* "rate" default, min/max */
#define INPUT_RATE_DEFAULT 1000
#define INPUT_RATE_MIN 125
/* Up to 8/1 */
#define INPUT_RATE_MAX 8000
/* Up to 1/8 */
/* input_source_t: gathers all informations per input source */
typedef
struct
{
/* Input item description */
input_item_t
*
p_item
;
/* Access/Stream/Demux plugins */
access_t
*
p_access
;
stream_t
*
p_stream
;
demux_t
*
p_demux
;
/* Title infos for that input */
vlc_bool_t
b_title_demux
;
/* Titles/Seekpoints provided by demux */
int
i_title
;
input_title_t
**
title
;
/* Properties */
vlc_bool_t
b_can_pace_control
;
vlc_bool_t
b_can_pause
;
vlc_bool_t
b_eof
;
/* eof of demuxer */
/* Clock average variation */
int
i_cr_average
;
}
input_source_t
;
/* i_update field of access_t/demux_t */
#define INPUT_UPDATE_NONE 0x0000
#define INPUT_UPDATE_SIZE 0x0001
#define INPUT_UPDATE_TITLE 0x0010
#define INPUT_UPDATE_SEEKPOINT 0x0020
/* Input control XXX: internal */
#define INPUT_CONTROL_FIFO_SIZE 100
/*****************************************************************************
* input_thread_t
*****************************************************************************
* XXX: this strucrures is *PRIVATE* so nobody can touch it out of src/input.
* I plan to move it to src/input/input_internal.h anyway
*
* XXX: look at src/input/input.c:input_CreateThread for accessible variables
* YOU CANNOT HAVE ACCESS TO THE CONTENT OF input_thread_t except
* p_input->input.p_item (and it's only temporary).
* XXX: move the docs somewhere (better than src/input )
*****************************************************************************/
struct
input_thread_t
{
VLC_COMMON_MEMBERS
/* Global properties */
vlc_bool_t
b_eof
;
vlc_bool_t
b_can_pace_control
;
vlc_bool_t
b_can_pause
;
/* Global state */
int
i_state
;
int
i_rate
;
/* */
int64_t
i_start
;
/* :start-time,0 by default */
int64_t
i_time
;
/* Current time */
int64_t
i_stop
;
/* :stop-time, 0 if none */
/* Title infos FIXME multi-input (not easy) ? */
int
i_title
;
input_title_t
**
title
;
/* User bookmarks FIXME won't be easy with multiples input */
int
i_bookmark
;
seekpoint_t
**
bookmark
;
/* Output */
es_out_t
*
p_es_out
;
sout_instance_t
*
p_sout
;
/* XXX Move it to es_out ? */
vlc_bool_t
b_out_pace_control
;
/* idem ? */
/* Internal caching common for all inputs */
int64_t
i_pts_delay
;
/* By input properties (will become an array with multi-input) */
input_source_t
input
;
/* Buffer of pending actions */
vlc_mutex_t
lock_control
;
int
i_control
;
struct
{
/* XXX: val isn't duplicated so it won't works with string */
int
i_type
;
vlc_value_t
val
;
}
control
[
INPUT_CONTROL_FIFO_SIZE
];
/* Will be removed quickly (once input_thread_t is opaque)*/
input_thread_sys_t
*
p_sys
;
};
/*****************************************************************************
* Prototypes
*****************************************************************************/
#define input_CreateThread(a,b) __input_CreateThread(VLC_OBJECT(a),b)
VLC_EXPORT
(
input_thread_t
*
,
__input_CreateThread
,
(
vlc_object_t
*
,
input_item_t
*
)
);
VLC_EXPORT
(
void
,
input_StopThread
,
(
input_thread_t
*
)
);
VLC_EXPORT
(
void
,
input_DestroyThread
,
(
input_thread_t
*
)
);
enum
input_query_e
{
/* input variable "position" */
INPUT_GET_POSITION
,
/* arg1= double * res= */
INPUT_SET_POSITION
,
/* arg1= double res=can fail */
/* input variable "length" */
INPUT_GET_LENGTH
,
/* arg1= int64_t * res=can fail */
/* input variable "time" */
INPUT_GET_TIME
,
/* arg1= int64_t * res= */
INPUT_SET_TIME
,
/* arg1= int64_t res=can fail */
/* input variable "rate" (1 is DEFAULT_RATE) */
INPUT_GET_RATE
,
/* arg1= int * res= */
INPUT_SET_RATE
,
/* arg1= int res=can fail */
/* input variable "state" */
INPUT_GET_STATE
,
/* arg1= int * res= */
INPUT_SET_STATE
,
/* arg1= int res=can fail */
/* XXX: all next query aren't working for now */
/* bookmarks */
INPUT_GET_BOOKMARKS
,
/* arg1= seekpoint_t *** arg2= int * res=can fail */
INPUT_CLEAR_BOOKMARKS
,
/* res=can fail */
INPUT_ADD_BOOKMARK
,
/* arg1= seekpoint_t * res=can fail */
INPUT_CHANGE_BOOKMARK
,
/* arg1= seekpoint_t * arg2= int * res=can fail */
INPUT_DEL_BOOKMARK
,
/* arg1= seekpoint_t * res=can fail */
INPUT_SET_BOOKMARK
,
/* arg1= int res=can fail */
INPUT_ADD_OPTION
,
/* arg1= char * arg2= char * res=can fail */
/* */
INPUT_ADD_INFO
,
/* arg1= char * arg2= char * arg3=... res=can fail */
INPUT_GET_INFO
,
/* arg1= char * arg2= char * arg3= char ** res=can fail*/
INPUT_SET_NAME
,
/* arg1= char * res=can fail */
/* */
INPUT_GET_SUBDELAY
,
/* arg1 = int* res=can fail */
INPUT_SET_SUBDELAY
,
/* arg1 = int res=can fail */
};
VLC_EXPORT
(
int
,
input_vaControl
,(
input_thread_t
*
,
int
i_query
,
va_list
)
);
VLC_EXPORT
(
int
,
input_Control
,
(
input_thread_t
*
,
int
i_query
,
...
)
);
VLC_EXPORT
(
decoder_t
*
,
input_DecoderNew
,
(
input_thread_t
*
,
es_format_t
*
,
vlc_bool_t
b_force_decoder
)
);
VLC_EXPORT
(
void
,
input_DecoderDelete
,
(
decoder_t
*
)
);
VLC_EXPORT
(
void
,
input_DecoderDecode
,(
decoder_t
*
,
block_t
*
)
);
#endif
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