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
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