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
adb694f5
Commit
adb694f5
authored
Mar 05, 2012
by
Rafaël Carré
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EsOutControlLocked: align case on same level than switch
parent
05a4b8a6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
458 additions
and
458 deletions
+458
-458
src/input/es_out.c
src/input/es_out.c
+458
-458
No files found.
src/input/es_out.c
View file @
adb694f5
...
...
@@ -2127,582 +2127,582 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
switch
(
i_query
)
{
case
ES_OUT_SET_ES_STATE
:
case
ES_OUT_SET_ES_STATE
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
bool
b
=
va_arg
(
args
,
int
);
if
(
b
&&
!
EsIsSelected
(
es
)
)
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
bool
b
=
va_arg
(
args
,
int
);
if
(
b
&&
!
EsIsSelected
(
es
)
)
{
EsSelect
(
out
,
es
);
return
EsIsSelected
(
es
)
?
VLC_SUCCESS
:
VLC_EGENERIC
;
}
else
if
(
!
b
&&
EsIsSelected
(
es
)
)
{
EsUnselect
(
out
,
es
,
es
->
p_pgrm
==
p_sys
->
p_pgrm
);
return
VLC_SUCCESS
;
}
return
VLC_SUCCESS
;
EsSelect
(
out
,
es
);
return
EsIsSelected
(
es
)
?
VLC_SUCCESS
:
VLC_EGENERIC
;
}
case
ES_OUT_GET_ES_STATE
:
else
if
(
!
b
&&
EsIsSelected
(
es
)
)
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
bool
*
pb
=
va_arg
(
args
,
bool
*
);
*
pb
=
EsIsSelected
(
es
);
EsUnselect
(
out
,
es
,
es
->
p_pgrm
==
p_sys
->
p_pgrm
);
return
VLC_SUCCESS
;
}
return
VLC_SUCCESS
;
}
case
ES_OUT_GET_GROUP_FORCED
:
{
int
*
pi_group
=
va_arg
(
args
,
int
*
);
*
pi_group
=
p_sys
->
i_group_id
;
return
VLC_SUCCESS
;
}
case
ES_OUT_GET_ES_STATE
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
bool
*
pb
=
va_arg
(
args
,
bool
*
);
case
ES_OUT_SET_MODE
:
{
const
int
i_mode
=
va_arg
(
args
,
int
);
assert
(
i_mode
==
ES_OUT_MODE_NONE
||
i_mode
==
ES_OUT_MODE_ALL
||
i_mode
==
ES_OUT_MODE_AUTO
||
i_mode
==
ES_OUT_MODE_PARTIAL
||
i_mode
==
ES_OUT_MODE_END
);
*
pb
=
EsIsSelected
(
es
);
return
VLC_SUCCESS
;
}
if
(
i_mode
!=
ES_OUT_MODE_NONE
&&
!
p_sys
->
b_active
&&
p_sys
->
i_es
>
0
)
{
/* XXX Terminate vout if there are tracks but no video one.
* This one is not mandatory but is he earliest place where it
* can be done */
int
i
;
for
(
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
{
es_out_id_t
*
p_es
=
p_sys
->
es
[
i
];
if
(
p_es
->
fmt
.
i_cat
==
VIDEO_ES
)
break
;
}
if
(
i
>=
p_sys
->
i_es
)
input_resource_TerminateVout
(
p_sys
->
p_input
->
p
->
p_resource
);
}
p_sys
->
b_active
=
i_mode
!=
ES_OUT_MODE_NONE
;
p_sys
->
i_mode
=
i_mode
;
case
ES_OUT_GET_GROUP_FORCED
:
{
int
*
pi_group
=
va_arg
(
args
,
int
*
);
*
pi_group
=
p_sys
->
i_group_id
;
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_MODE
:
{
const
int
i_mode
=
va_arg
(
args
,
int
);
assert
(
i_mode
==
ES_OUT_MODE_NONE
||
i_mode
==
ES_OUT_MODE_ALL
||
i_mode
==
ES_OUT_MODE_AUTO
||
i_mode
==
ES_OUT_MODE_PARTIAL
||
i_mode
==
ES_OUT_MODE_END
);
/* Reapply policy mode */
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
if
(
i_mode
!=
ES_OUT_MODE_NONE
&&
!
p_sys
->
b_active
&&
p_sys
->
i_es
>
0
)
{
/* XXX Terminate vout if there are tracks but no video one.
* This one is not mandatory but is he earliest place where it
* can be done */
int
i
;
for
(
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
{
if
(
EsIsSelected
(
p_sys
->
es
[
i
]
)
)
EsUnselect
(
out
,
p_sys
->
es
[
i
],
p_sys
->
es
[
i
]
->
p_pgrm
==
p_sys
->
p_pgrm
)
;
es_out_id_t
*
p_es
=
p_sys
->
es
[
i
];
if
(
p_es
->
fmt
.
i_cat
==
VIDEO_ES
)
break
;
}
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
EsOutSelect
(
out
,
p_sys
->
es
[
i
],
false
);
if
(
i_mode
==
ES_OUT_MODE_END
)
EsOutTerminate
(
out
);
return
VLC_SUCCESS
;
if
(
i
>=
p_sys
->
i_es
)
input_resource_TerminateVout
(
p_sys
->
p_input
->
p
->
p_resource
);
}
p_sys
->
b_active
=
i_mode
!=
ES_OUT_MODE_NONE
;
p_sys
->
i_mode
=
i_mode
;
case
ES_OUT_SET_ES
:
case
ES_OUT_RESTART_ES
:
/* Reapply policy mode */
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
if
(
EsIsSelected
(
p_sys
->
es
[
i
]
)
)
EsUnselect
(
out
,
p_sys
->
es
[
i
],
p_sys
->
es
[
i
]
->
p_pgrm
==
p_sys
->
p_pgrm
);
}
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
EsOutSelect
(
out
,
p_sys
->
es
[
i
],
false
);
if
(
i_mode
==
ES_OUT_MODE_END
)
EsOutTerminate
(
out
);
return
VLC_SUCCESS
;
}
int
i_cat
;
if
(
es
==
NULL
)
i_cat
=
UNKNOWN_ES
;
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
AUDIO_ES
)
)
i_cat
=
AUDIO_ES
;
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
VIDEO_ES
)
)
i_cat
=
VIDEO_ES
;
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
SPU_ES
)
)
i_cat
=
SPU_ES
;
else
i_cat
=
-
1
;
case
ES_OUT_SET_ES
:
case
ES_OUT_RESTART_ES
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
int
i_cat
;
if
(
es
==
NULL
)
i_cat
=
UNKNOWN_ES
;
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
AUDIO_ES
)
)
i_cat
=
AUDIO_ES
;
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
VIDEO_ES
)
)
i_cat
=
VIDEO_ES
;
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
SPU_ES
)
)
i_cat
=
SPU_ES
;
else
i_cat
=
-
1
;
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
{
if
(
i_cat
==
-
1
)
{
if
(
i_cat
==
-
1
)
if
(
es
==
p_sys
->
es
[
i
]
)
{
if
(
es
==
p_sys
->
es
[
i
]
)
{
EsOutSelect
(
out
,
es
,
true
);
break
;
}
EsOutSelect
(
out
,
es
,
true
);
break
;
}
else
}
else
{
if
(
i_cat
==
UNKNOWN_ES
||
p_sys
->
es
[
i
]
->
fmt
.
i_cat
==
i_cat
)
{
if
(
i_cat
==
UNKNOWN_ES
||
p_sys
->
es
[
i
]
->
fmt
.
i_cat
==
i_cat
)
if
(
EsIsSelected
(
p_sys
->
es
[
i
]
)
)
{
if
(
EsIsSelected
(
p_sys
->
es
[
i
]
)
)
if
(
i_query
==
ES_OUT_RESTART_ES
)
{
if
(
i_query
==
ES_OUT_RESTART_ES
)
if
(
p_sys
->
es
[
i
]
->
p_dec
)
{
if
(
p_sys
->
es
[
i
]
->
p_dec
)
{
EsDestroyDecoder
(
out
,
p_sys
->
es
[
i
]
);
EsCreateDecoder
(
out
,
p_sys
->
es
[
i
]
);
}
}
else
{
EsUnselect
(
out
,
p_sys
->
es
[
i
],
p_sys
->
es
[
i
]
->
p_pgrm
==
p_sys
->
p_pgrm
);
EsDestroyDecoder
(
out
,
p_sys
->
es
[
i
]
);
EsCreateDecoder
(
out
,
p_sys
->
es
[
i
]
);
}
}
else
{
EsUnselect
(
out
,
p_sys
->
es
[
i
],
p_sys
->
es
[
i
]
->
p_pgrm
==
p_sys
->
p_pgrm
);
}
}
}
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_ES_DEFAULT
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
return
VLC_SUCCESS
;
}
if
(
es
==
NULL
)
{
/*p_sys->i_default_video_id = -1;*/
/*p_sys->i_default_audio_id = -1;*/
p_sys
->
i_default_sub_id
=
-
1
;
}
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
AUDIO_ES
)
)
{
/*p_sys->i_default_video_id = -1;*/
}
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
VIDEO_ES
)
)
{
/*p_sys->i_default_audio_id = -1;*/
}
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
SPU_ES
)
)
{
p_sys
->
i_default_sub_id
=
-
1
;
}
case
ES_OUT_SET_ES_DEFAULT
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
if
(
es
==
NULL
)
{
/*p_sys->i_default_video_id = -1;*/
/*p_sys->i_default_audio_id = -1;*/
p_sys
->
i_default_sub_id
=
-
1
;
}
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
AUDIO_ES
)
)
{
/*p_sys->i_default_video_id = -1;*/
}
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
VIDEO_ES
)
)
{
/*p_sys->i_default_audio_id = -1;*/
}
else
if
(
es
==
(
es_out_id_t
*
)((
uint8_t
*
)
NULL
+
SPU_ES
)
)
{
p_sys
->
i_default_sub_id
=
-
1
;
}
else
{
/*if( es->fmt.i_cat == VIDEO_ES )
p_sys->i_default_video_id = es->i_id;
else
{
/*if( es->fmt.i_cat == VIDEO_ES )
p_sys->i_default_video_id = es->i_id;
else
if( es->fmt.i_cat == AUDIO_ES )
p_sys->i_default_audio_id = es->i_id;
else*/
if
(
es
->
fmt
.
i_cat
==
SPU_ES
)
p_sys
->
i_default_sub_id
=
es
->
i_id
;
}
return
VLC_SUCCESS
;
if( es->fmt.i_cat == AUDIO_ES )
p_sys->i_default_audio_id = es->i_id;
else*/
if
(
es
->
fmt
.
i_cat
==
SPU_ES
)
p_sys
->
i_default_sub_id
=
es
->
i_id
;
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_PCR
:
case
ES_OUT_SET_GROUP_PCR
:
{
es_out_pgrm_t
*
p_pgrm
=
NULL
;
int
i_group
=
0
;
int64_t
i_pcr
;
case
ES_OUT_SET_PCR
:
case
ES_OUT_SET_GROUP_PCR
:
{
es_out_pgrm_t
*
p_pgrm
=
NULL
;
int
i_group
=
0
;
int64_t
i_pcr
;
/* Search program */
if
(
i_query
==
ES_OUT_SET_PCR
)
{
p_pgrm
=
p_sys
->
p_pgrm
;
if
(
!
p_pgrm
)
p_pgrm
=
EsOutProgramAdd
(
out
,
i_group
);
/* Create it */
}
else
{
i_group
=
(
int
)
va_arg
(
args
,
int
);
p_pgrm
=
EsOutProgramFind
(
out
,
i_group
);
}
/* Search program */
if
(
i_query
==
ES_OUT_SET_PCR
)
{
p_pgrm
=
p_sys
->
p_pgrm
;
if
(
!
p_pgrm
)
return
VLC_EGENERIC
;
p_pgrm
=
EsOutProgramAdd
(
out
,
i_group
);
/* Create it */
}
else
{
i_group
=
(
int
)
va_arg
(
args
,
int
);
p_pgrm
=
EsOutProgramFind
(
out
,
i_group
);
}
if
(
!
p_pgrm
)
return
VLC_EGENERIC
;
i_pcr
=
(
int64_t
)
va_arg
(
args
,
int64_t
);
if
(
i_pcr
<=
VLC_TS_INVALID
)
{
msg_Err
(
p_sys
->
p_input
,
"Invalid PCR value in ES_OUT_SET_(GROUP_)PCR !"
);
return
VLC_EGENERIC
;
}
i_pcr
=
(
int64_t
)
va_arg
(
args
,
int64_t
);
if
(
i_pcr
<=
VLC_TS_INVALID
)
{
msg_Err
(
p_sys
->
p_input
,
"Invalid PCR value in ES_OUT_SET_(GROUP_)PCR !"
);
return
VLC_EGENERIC
;
}
/* TODO do not use mdate() but proper stream acquisition date */
bool
b_late
;
input_clock_Update
(
p_pgrm
->
p_clock
,
VLC_OBJECT
(
p_sys
->
p_input
),
&
b_late
,
p_sys
->
p_input
->
p
->
b_can_pace_control
||
p_sys
->
b_buffering
,
EsOutIsExtraBufferingAllowed
(
out
),
i_pcr
,
mdate
()
);
/* TODO do not use mdate() but proper stream acquisition date */
bool
b_late
;
input_clock_Update
(
p_pgrm
->
p_clock
,
VLC_OBJECT
(
p_sys
->
p_input
),
&
b_late
,
p_sys
->
p_input
->
p
->
b_can_pace_control
||
p_sys
->
b_buffering
,
EsOutIsExtraBufferingAllowed
(
out
),
i_pcr
,
mdate
()
);
if
(
p_pgrm
==
p_sys
->
p_pgrm
)
if
(
p_pgrm
==
p_sys
->
p_pgrm
)
{
if
(
p_sys
->
b_buffering
)
{
/* Check buffering state on master clock update */
EsOutDecodersStopBuffering
(
out
,
false
);
}
else
if
(
b_late
&&
(
!
p_sys
->
p_input
->
p
->
p_sout
||
!
p_sys
->
p_input
->
p
->
b_out_pace_control
)
)
{
if
(
p_sys
->
b_buffering
)
const
mtime_t
i_pts_delay_base
=
p_sys
->
i_pts_delay
-
p_sys
->
i_pts_jitter
;
mtime_t
i_pts_delay
=
input_clock_GetJitter
(
p_pgrm
->
p_clock
);
/* Avoid dangerously high value */
const
mtime_t
i_jitter_max
=
INT64_C
(
1000
)
*
var_InheritInteger
(
p_sys
->
p_input
,
"clock-jitter"
);
if
(
i_pts_delay
>
__MIN
(
i_pts_delay_base
+
i_jitter_max
,
INPUT_PTS_DELAY_MAX
)
)
{
/* Check buffering state on master clock update */
EsOutDecodersStopBuffering
(
out
,
false
);
msg_Err
(
p_sys
->
p_input
,
"ES_OUT_SET_(GROUP_)PCR is called too late (jitter of %d ms ignored)"
,
(
int
)(
i_pts_delay
-
i_pts_delay_base
)
/
1000
);
i_pts_delay
=
p_sys
->
i_pts_delay
;
}
else
if
(
b_late
&&
(
!
p_sys
->
p_input
->
p
->
p_sout
||
!
p_sys
->
p_input
->
p
->
b_out_pace_control
)
)
else
{
const
mtime_t
i_pts_delay_base
=
p_sys
->
i_pts_delay
-
p_sys
->
i_pts_jitter
;
mtime_t
i_pts_delay
=
input_clock_GetJitter
(
p_pgrm
->
p_clock
);
/* Avoid dangerously high value */
const
mtime_t
i_jitter_max
=
INT64_C
(
1000
)
*
var_InheritInteger
(
p_sys
->
p_input
,
"clock-jitter"
);
if
(
i_pts_delay
>
__MIN
(
i_pts_delay_base
+
i_jitter_max
,
INPUT_PTS_DELAY_MAX
)
)
{
msg_Err
(
p_sys
->
p_input
,
"ES_OUT_SET_(GROUP_)PCR is called too late (jitter of %d ms ignored)"
,
(
int
)(
i_pts_delay
-
i_pts_delay_base
)
/
1000
);
i_pts_delay
=
p_sys
->
i_pts_delay
;
}
else
{
msg_Err
(
p_sys
->
p_input
,
"ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to %d ms)"
,
(
int
)(
i_pts_delay
/
1000
)
);
}
msg_Err
(
p_sys
->
p_input
,
"ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to %d ms)"
,
(
int
)(
i_pts_delay
/
1000
)
);
}
/* Force a rebufferization when we are too late */
/* Force a rebufferization when we are too late */
/* It is not really good, as we throw away already buffered data
* TODO have a mean to correctly reenter bufferization */
es_out_Control
(
out
,
ES_OUT_RESET_PCR
);
/* It is not really good, as we throw away already buffered data
* TODO have a mean to correctly reenter bufferization */
es_out_Control
(
out
,
ES_OUT_RESET_PCR
);
es_out_SetJitter
(
out
,
i_pts_delay_base
,
i_pts_delay
-
i_pts_delay_base
,
p_sys
->
i_cr_average
);
}
es_out_SetJitter
(
out
,
i_pts_delay_base
,
i_pts_delay
-
i_pts_delay_base
,
p_sys
->
i_cr_average
);
}
return
VLC_SUCCESS
;
}
return
VLC_SUCCESS
;
}
case
ES_OUT_RESET_PCR
:
msg_Err
(
p_sys
->
p_input
,
"ES_OUT_RESET_PCR called"
);
EsOutChangePosition
(
out
);
return
VLC_SUCCESS
;
case
ES_OUT_RESET_PCR
:
msg_Err
(
p_sys
->
p_input
,
"ES_OUT_RESET_PCR called"
);
EsOutChangePosition
(
out
);
return
VLC_SUCCESS
;
case
ES_OUT_SET_GROUP
:
case
ES_OUT_SET_GROUP
:
{
int
i
=
va_arg
(
args
,
int
);
for
(
int
j
=
0
;
j
<
p_sys
->
i_pgrm
;
j
++
)
{
int
i
=
va_arg
(
args
,
int
)
;
for
(
int
j
=
0
;
j
<
p_sys
->
i_pgrm
;
j
++
)
es_out_pgrm_t
*
p_pgrm
=
p_sys
->
pgrm
[
j
]
;
if
(
p_pgrm
->
i_id
==
i
)
{
es_out_pgrm_t
*
p_pgrm
=
p_sys
->
pgrm
[
j
];
if
(
p_pgrm
->
i_id
==
i
)
{
EsOutProgramSelect
(
out
,
p_pgrm
);
return
VLC_SUCCESS
;
}
EsOutProgramSelect
(
out
,
p_pgrm
);
return
VLC_SUCCESS
;
}
return
VLC_EGENERIC
;
}
return
VLC_EGENERIC
;
}
case
ES_OUT_SET_ES_FMT
:
{
/* This ain't pretty but is need by some demuxers (eg. Ogg )
* to update the p_extra data */
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
es_format_t
*
p_fmt
=
va_arg
(
args
,
es_format_t
*
);
if
(
es
==
NULL
)
return
VLC_EGENERIC
;
case
ES_OUT_SET_ES_FMT
:
{
/* This ain't pretty but is need by some demuxers (eg. Ogg )
* to update the p_extra data */
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
es_format_t
*
p_fmt
=
va_arg
(
args
,
es_format_t
*
);
if
(
es
==
NULL
)
return
VLC_EGENERIC
;
if
(
p_fmt
->
i_extra
)
{
es
->
fmt
.
i_extra
=
p_fmt
->
i_extra
;
es
->
fmt
.
p_extra
=
xrealloc
(
es
->
fmt
.
p_extra
,
p_fmt
->
i_extra
);
memcpy
(
es
->
fmt
.
p_extra
,
p_fmt
->
p_extra
,
p_fmt
->
i_extra
);
if
(
p_fmt
->
i_extra
)
{
es
->
fmt
.
i_extra
=
p_fmt
->
i_extra
;
es
->
fmt
.
p_extra
=
xrealloc
(
es
->
fmt
.
p_extra
,
p_fmt
->
i_extra
);
memcpy
(
es
->
fmt
.
p_extra
,
p_fmt
->
p_extra
,
p_fmt
->
i_extra
);
if
(
!
es
->
p_dec
)
return
VLC_SUCCESS
;
if
(
!
es
->
p_dec
)
return
VLC_SUCCESS
;
#if 1
EsDestroyDecoder
(
out
,
es
);
EsDestroyDecoder
(
out
,
es
);
EsCreateDecoder
(
out
,
es
);
EsCreateDecoder
(
out
,
es
);
#else
es
->
p_dec
->
fmt_in
.
i_extra
=
p_fmt
->
i_extra
;
es
->
p_dec
->
fmt_in
.
p_extra
=
xrealloc
(
es
->
p_dec
->
fmt_in
.
p_extra
,
p_fmt
->
i_extra
);
memcpy
(
es
->
p_dec
->
fmt_in
.
p_extra
,
p_fmt
->
p_extra
,
p_fmt
->
i_extra
);
es
->
p_dec
->
fmt_in
.
i_extra
=
p_fmt
->
i_extra
;
es
->
p_dec
->
fmt_in
.
p_extra
=
xrealloc
(
es
->
p_dec
->
fmt_in
.
p_extra
,
p_fmt
->
i_extra
);
memcpy
(
es
->
p_dec
->
fmt_in
.
p_extra
,
p_fmt
->
p_extra
,
p_fmt
->
i_extra
);
#endif
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_ES_SCRAMBLED_STATE
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
bool
b_scrambled
=
(
bool
)
va_arg
(
args
,
int
);
return
VLC_SUCCESS
;
}
if
(
!
es
->
b_scrambled
!=
!
b_scrambled
)
{
es
->
b_scrambled
=
b_scrambled
;
EsOutProgramUpdateScrambled
(
out
,
es
->
p_pgrm
);
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_ES_SCRAMBLED_STATE
:
{
es_out_id_t
*
es
=
va_arg
(
args
,
es_out_id_t
*
);
bool
b_scrambled
=
(
bool
)
va_arg
(
args
,
int
);
case
ES_OUT_SET_NEXT_DISPLAY_TIME
:
if
(
!
es
->
b_scrambled
!=
!
b_scrambled
)
{
const
int64_t
i_date
=
(
int64_t
)
va_arg
(
args
,
int64_t
);
if
(
i_date
<
0
)
return
VLC_EGENERIC
;
p_sys
->
i_preroll_end
=
i_date
;
return
VLC_SUCCESS
;
es
->
b_scrambled
=
b_scrambled
;
EsOutProgramUpdateScrambled
(
out
,
es
->
p_pgrm
);
}
case
ES_OUT_SET_GROUP_META
:
{
int
i_group
=
(
int
)
va_arg
(
args
,
int
);
const
vlc_meta_t
*
p_meta
=
va_arg
(
args
,
const
vlc_meta_t
*
);
return
VLC_SUCCESS
;
}
EsOutProgramMeta
(
out
,
i_group
,
p_meta
);
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_GROUP_EPG
:
{
int
i_group
=
(
int
)
va_arg
(
args
,
int
);
const
vlc_epg_t
*
p_epg
=
va_arg
(
args
,
const
vlc_epg_t
*
);
case
ES_OUT_SET_NEXT_DISPLAY_TIME
:
{
const
int64_t
i_date
=
(
int64_t
)
va_arg
(
args
,
int64_t
);
EsOutProgramEpg
(
out
,
i_group
,
p_epg
);
return
VLC_SUCCESS
;
}
if
(
i_date
<
0
)
return
VLC_EGENERIC
;
case
ES_OUT_DEL_GROUP
:
{
int
i_group
=
(
int
)
va_arg
(
args
,
int
);
p_sys
->
i_preroll_end
=
i_date
;
return
EsOutProgramDel
(
out
,
i_group
);
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_GROUP_META
:
{
int
i_group
=
(
int
)
va_arg
(
args
,
int
);
const
vlc_meta_t
*
p_meta
=
va_arg
(
args
,
const
vlc_meta_t
*
);
case
ES_OUT_SET_META
:
{
const
vlc_meta_t
*
p_meta
=
va_arg
(
args
,
const
vlc_meta_t
*
);
EsOutProgramMeta
(
out
,
i_group
,
p_meta
);
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_GROUP_EPG
:
{
int
i_group
=
(
int
)
va_arg
(
args
,
int
);
const
vlc_epg_t
*
p_epg
=
va_arg
(
args
,
const
vlc_epg_t
*
);
EsOutMeta
(
out
,
p_meta
);
return
VLC_SUCCESS
;
}
EsOutProgramEpg
(
out
,
i_group
,
p_epg
);
return
VLC_SUCCESS
;
}
case
ES_OUT_GET_WAKE_UP
:
{
mtime_t
*
pi_wakeup
=
(
mtime_t
*
)
va_arg
(
args
,
mtime_t
*
);
*
pi_wakeup
=
EsOutGetWakeup
(
out
);
return
VLC_SUCCESS
;
}
case
ES_OUT_DEL_GROUP
:
{
int
i_group
=
(
int
)
va_arg
(
args
,
int
);
case
ES_OUT_SET_ES_BY_ID
:
case
ES_OUT_RESTART_ES_BY_ID
:
case
ES_OUT_SET_ES_DEFAULT_BY_ID
:
{
const
int
i_id
=
(
int
)
va_arg
(
args
,
int
);
es_out_id_t
*
p_es
=
EsOutGetFromID
(
out
,
i_id
);
int
i_new_query
;
return
EsOutProgramDel
(
out
,
i_group
);
}
switch
(
i_query
)
{
case
ES_OUT_SET_ES_BY_ID
:
i_new_query
=
ES_OUT_SET_ES
;
break
;
case
ES_OUT_RESTART_ES_BY_ID
:
i_new_query
=
ES_OUT_RESTART_ES
;
break
;
case
ES_OUT_SET_ES_DEFAULT_BY_ID
:
i_new_query
=
ES_OUT_SET_ES_DEFAULT
;
break
;
default:
assert
(
0
);
}
/* TODO if the lock is made non recursive it should be changed */
int
i_ret
=
es_out_Control
(
out
,
i_new_query
,
p_es
);
case
ES_OUT_SET_META
:
{
const
vlc_meta_t
*
p_meta
=
va_arg
(
args
,
const
vlc_meta_t
*
);
/* Clean up vout after user action (in active mode only).
* FIXME it does not work well with multiple video windows */
if
(
p_sys
->
b_active
)
input_resource_TerminateVout
(
p_sys
->
p_input
->
p
->
p_resource
);
return
i_ret
;
}
EsOutMeta
(
out
,
p_meta
);
return
VLC_SUCCESS
;
}
case
ES_OUT_GET_ES_OBJECTS_BY_ID
:
{
const
int
i_id
=
va_arg
(
args
,
int
);
es_out_id_t
*
p_es
=
EsOutGetFromID
(
out
,
i_id
);
if
(
!
p_es
)
return
VLC_EGENERIC
;
case
ES_OUT_GET_WAKE_UP
:
{
mtime_t
*
pi_wakeup
=
(
mtime_t
*
)
va_arg
(
args
,
mtime_t
*
);
*
pi_wakeup
=
EsOutGetWakeup
(
out
);
return
VLC_SUCCESS
;
}
vlc_object_t
**
pp_decoder
=
va_arg
(
args
,
vlc_object_t
**
);
vout_thread_t
**
pp_vout
=
va_arg
(
args
,
vout_thread_t
**
);
audio_output_t
**
pp_aout
=
va_arg
(
args
,
audio_output_t
**
);
if
(
p_es
->
p_dec
)
{
if
(
pp_decoder
)
*
pp_decoder
=
vlc_object_hold
(
p_es
->
p_dec
);
input_DecoderGetObjects
(
p_es
->
p_dec
,
pp_vout
,
pp_aout
);
}
else
{
if
(
pp_decoder
)
*
pp_decoder
=
NULL
;
if
(
pp_vout
)
*
pp_vout
=
NULL
;
if
(
pp_aout
)
*
pp_aout
=
NULL
;
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_ES_BY_ID
:
case
ES_OUT_RESTART_ES_BY_ID
:
case
ES_OUT_SET_ES_DEFAULT_BY_ID
:
{
const
int
i_id
=
(
int
)
va_arg
(
args
,
int
);
es_out_id_t
*
p_es
=
EsOutGetFromID
(
out
,
i_id
);
int
i_new_query
;
case
ES_OUT_GET_BUFFERING
:
switch
(
i_query
)
{
bool
*
pb
=
va_arg
(
args
,
bool
*
);
*
pb
=
p_sys
->
b_buffering
;
return
VLC_SUCCESS
;
case
ES_OUT_SET_ES_BY_ID
:
i_new_query
=
ES_OUT_SET_ES
;
break
;
case
ES_OUT_RESTART_ES_BY_ID
:
i_new_query
=
ES_OUT_RESTART_ES
;
break
;
case
ES_OUT_SET_ES_DEFAULT_BY_ID
:
i_new_query
=
ES_OUT_SET_ES_DEFAULT
;
break
;
default:
assert
(
0
);
}
/* TODO if the lock is made non recursive it should be changed */
int
i_ret
=
es_out_Control
(
out
,
i_new_query
,
p_es
);
case
ES_OUT_GET_EMPTY
:
{
bool
*
pb
=
va_arg
(
args
,
bool
*
);
*
pb
=
EsOutDecodersIsEmpty
(
out
);
return
VLC_SUCCESS
;
}
/* Clean up vout after user action (in active mode only).
* FIXME it does not work well with multiple video windows */
if
(
p_sys
->
b_active
)
input_resource_TerminateVout
(
p_sys
->
p_input
->
p
->
p_resource
);
return
i_ret
;
}
case
ES_OUT_SET_DELAY
:
case
ES_OUT_GET_ES_OBJECTS_BY_ID
:
{
const
int
i_id
=
va_arg
(
args
,
int
);
es_out_id_t
*
p_es
=
EsOutGetFromID
(
out
,
i_id
);
if
(
!
p_es
)
return
VLC_EGENERIC
;
vlc_object_t
**
pp_decoder
=
va_arg
(
args
,
vlc_object_t
**
);
vout_thread_t
**
pp_vout
=
va_arg
(
args
,
vout_thread_t
**
);
audio_output_t
**
pp_aout
=
va_arg
(
args
,
audio_output_t
**
);
if
(
p_es
->
p_dec
)
{
const
int
i_cat
=
(
int
)
va_arg
(
args
,
int
);
const
mtime_t
i_delay
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
EsOutSetDelay
(
out
,
i_cat
,
i_delay
);
return
VLC_SUCCESS
;
if
(
pp_decoder
)
*
pp_decoder
=
vlc_object_hold
(
p_es
->
p_dec
);
input_DecoderGetObjects
(
p_es
->
p_dec
,
pp_vout
,
pp_aout
);
}
case
ES_OUT_SET_RECORD_STATE
:
else
{
bool
b
=
va_arg
(
args
,
int
);
return
EsOutSetRecord
(
out
,
b
);
if
(
pp_decoder
)
*
pp_decoder
=
NULL
;
if
(
pp_vout
)
*
pp_vout
=
NULL
;
if
(
pp_aout
)
*
pp_aout
=
NULL
;
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_PAUSE_STATE
:
{
const
bool
b_source_paused
=
(
bool
)
va_arg
(
args
,
int
);
const
bool
b_paused
=
(
bool
)
va_arg
(
args
,
int
);
const
mtime_t
i_date
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
case
ES_OUT_GET_BUFFERING
:
{
bool
*
pb
=
va_arg
(
args
,
bool
*
);
*
pb
=
p_sys
->
b_buffering
;
return
VLC_SUCCESS
;
}
assert
(
!
b_source_paused
==
!
b_paused
);
EsOutChangePause
(
out
,
b_paused
,
i_date
);
case
ES_OUT_GET_EMPTY
:
{
bool
*
pb
=
va_arg
(
args
,
bool
*
);
*
pb
=
EsOutDecodersIsEmpty
(
out
);
return
VLC_SUCCESS
;
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_DELAY
:
{
const
int
i_cat
=
(
int
)
va_arg
(
args
,
int
);
const
mtime_t
i_delay
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
EsOutSetDelay
(
out
,
i_cat
,
i_delay
);
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_RATE
:
{
const
int
i_src_rate
=
(
int
)
va_arg
(
args
,
int
);
const
int
i_rate
=
(
int
)
va_arg
(
args
,
int
);
case
ES_OUT_SET_RECORD_STATE
:
{
bool
b
=
va_arg
(
args
,
int
);
return
EsOutSetRecord
(
out
,
b
);
}
assert
(
i_src_rate
==
i_rate
);
EsOutChangeRate
(
out
,
i_rate
);
case
ES_OUT_SET_PAUSE_STATE
:
{
const
bool
b_source_paused
=
(
bool
)
va_arg
(
args
,
int
);
const
bool
b_paused
=
(
bool
)
va_arg
(
args
,
int
);
const
mtime_t
i_date
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
return
VLC_SUCCESS
;
}
assert
(
!
b_source_paused
==
!
b_paused
)
;
EsOutChangePause
(
out
,
b_paused
,
i_date
);
case
ES_OUT_SET_TIME
:
{
const
mtime_t
i_date
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
return
VLC_SUCCESS
;
}
assert
(
i_date
==
-
1
);
EsOutChangePosition
(
out
);
case
ES_OUT_SET_RATE
:
{
const
int
i_src_rate
=
(
int
)
va_arg
(
args
,
int
);
const
int
i_rate
=
(
int
)
va_arg
(
args
,
int
);
return
VLC_SUCCESS
;
}
assert
(
i_src_rate
==
i_rate
)
;
EsOutChangeRate
(
out
,
i_rate
);
case
ES_OUT_SET_FRAME_NEXT
:
EsOutFrameNext
(
out
);
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_TIMES
:
{
double
f_position
=
(
double
)
va_arg
(
args
,
double
);
mtime_t
i_time
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
mtime_t
i_length
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
case
ES_OUT_SET_TIME
:
{
const
mtime_t
i_date
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
input_SendEventLength
(
p_sys
->
p_input
,
i_length
);
assert
(
i_date
==
-
1
);
EsOutChangePosition
(
out
);
if
(
!
p_sys
->
b_buffering
)
{
mtime_t
i_delay
;
return
VLC_SUCCESS
;
}
/* Fix for buffering delay */
if
(
!
p_sys
->
p_input
->
p
->
p_sout
||
!
p_sys
->
p_input
->
p
->
b_out_pace_control
)
i_delay
=
EsOutGetBuffering
(
out
);
else
i_delay
=
0
;
case
ES_OUT_SET_FRAME_NEXT
:
EsOutFrameNext
(
out
);
return
VLC_SUCCESS
;
i_time
-=
i_delay
;
if
(
i_time
<
0
)
i_time
=
0
;
case
ES_OUT_SET_TIMES
:
{
double
f_position
=
(
double
)
va_arg
(
args
,
double
);
mtime_t
i_time
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
mtime_t
i_length
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
if
(
i_length
>
0
)
f_position
-=
(
double
)
i_delay
/
i_length
;
if
(
f_position
<
0
)
f_position
=
0
;
input_SendEventLength
(
p_sys
->
p_input
,
i_length
);
input_SendEventPosition
(
p_sys
->
p_input
,
f_position
,
i_time
);
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_JITTER
:
if
(
!
p_sys
->
b_buffering
)
{
mtime_t
i_pts_delay
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
mtime_t
i_pts_jitter
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
int
i_cr_average
=
(
int
)
va_arg
(
args
,
int
);
mtime_t
i_delay
;
bool
b_change_clock
=
i_pts_delay
+
i_pts_jitter
!=
p_sys
->
i_pts_delay
||
i_cr_average
!=
p_sys
->
i_cr_average
;
/* Fix for buffering delay */
if
(
!
p_sys
->
p_input
->
p
->
p_sout
||
!
p_sys
->
p_input
->
p
->
b_out_pace_control
)
i_delay
=
EsOutGetBuffering
(
out
);
else
i_delay
=
0
;
assert
(
i_pts_jitter
>=
0
);
p_sys
->
i_pts_delay
=
i_pts_delay
+
i_pts_jitter
;
p_sys
->
i_pts_jitter
=
i_pts_jitter
;
p_sys
->
i_cr_average
=
i_cr_average
;
i_time
-=
i_delay
;
if
(
i_time
<
0
)
i_time
=
0
;
for
(
int
i
=
0
;
i
<
p_sys
->
i_pgrm
&&
b_change_clock
;
i
++
)
input_clock_SetJitter
(
p_sys
->
pgrm
[
i
]
->
p_clock
,
i_pts_delay
+
i_pts_jitter
,
i_cr_average
);
return
VLC_SUCCESS
;
if
(
i_length
>
0
)
f_position
-=
(
double
)
i_delay
/
i_length
;
if
(
f_position
<
0
)
f_position
=
0
;
input_SendEventPosition
(
p_sys
->
p_input
,
f_position
,
i_time
);
}
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_JITTER
:
{
mtime_t
i_pts_delay
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
mtime_t
i_pts_jitter
=
(
mtime_t
)
va_arg
(
args
,
mtime_t
);
int
i_cr_average
=
(
int
)
va_arg
(
args
,
int
);
case
ES_OUT_GET_PCR_SYSTEM
:
{
if
(
p_sys
->
b_buffering
)
return
VLC_EGENERIC
;
bool
b_change_clock
=
i_pts_delay
+
i_pts_jitter
!=
p_sys
->
i_pts_delay
||
i_cr_average
!=
p_sys
->
i_cr_average
;
es_out_pgrm_t
*
p_pgrm
=
p_sys
->
p_pgrm
;
if
(
!
p_pgrm
)
return
VLC_EGENERIC
;
assert
(
i_pts_jitter
>=
0
);
p_sys
->
i_pts_delay
=
i_pts_delay
+
i_pts_jitter
;
p_sys
->
i_pts_jitter
=
i_pts_jitter
;
p_sys
->
i_cr_average
=
i_cr_average
;
mtime_t
*
pi_system
=
va_arg
(
args
,
mtime_t
*
);
mtime_t
*
pi_delay
=
va_arg
(
args
,
mtime_t
*
);
input_clock_GetSystemOrigin
(
p_pgrm
->
p_clock
,
pi_system
,
pi_delay
);
return
VLC_SUCCESS
;
}
for
(
int
i
=
0
;
i
<
p_sys
->
i_pgrm
&&
b_change_clock
;
i
++
)
input_clock_SetJitter
(
p_sys
->
pgrm
[
i
]
->
p_clock
,
i_pts_delay
+
i_pts_jitter
,
i_cr_average
);
return
VLC_SUCCESS
;
}
case
ES_OUT_MODIFY
_PCR_SYSTEM
:
{
if
(
p_sys
->
b_buffering
)
return
VLC_EGENERIC
;
case
ES_OUT_GET
_PCR_SYSTEM
:
{
if
(
p_sys
->
b_buffering
)
return
VLC_EGENERIC
;
es_out_pgrm_t
*
p_pgrm
=
p_sys
->
p_pgrm
;
if
(
!
p_pgrm
)
return
VLC_EGENERIC
;
es_out_pgrm_t
*
p_pgrm
=
p_sys
->
p_pgrm
;
if
(
!
p_pgrm
)
return
VLC_EGENERIC
;
const
bool
b_absolute
=
va_arg
(
args
,
int
);
const
mtime_t
i_system
=
va_arg
(
args
,
mtime_t
);
input_clock_ChangeSystemOrigin
(
p_pgrm
->
p_clock
,
b_absolute
,
i_system
);
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_EOS
:
{
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
{
es_out_id_t
*
id
=
p_sys
->
es
[
i
];
decoder_t
*
p_dec
=
id
->
p_dec
;
if
(
!
p_dec
)
continue
;
block_t
*
p_block
=
block_Alloc
(
0
);
if
(
!
p_block
)
break
;
mtime_t
*
pi_system
=
va_arg
(
args
,
mtime_t
*
);
mtime_t
*
pi_delay
=
va_arg
(
args
,
mtime_t
*
);
input_clock_GetSystemOrigin
(
p_pgrm
->
p_clock
,
pi_system
,
pi_delay
);
return
VLC_SUCCESS
;
}
p_block
->
i_flags
|=
BLOCK_FLAG_CORE_EOS
;
input_DecoderDecode
(
p_dec
,
p_block
,
false
);
}
return
VLC_SUCCESS
;
}
case
ES_OUT_MODIFY_PCR_SYSTEM
:
{
if
(
p_sys
->
b_buffering
)
return
VLC_EGENERIC
;
default:
msg_Err
(
p_sys
->
p_input
,
"unknown query in es_out_Control"
);
es_out_pgrm_t
*
p_pgrm
=
p_sys
->
p_pgrm
;
if
(
!
p_pgrm
)
return
VLC_EGENERIC
;
const
bool
b_absolute
=
va_arg
(
args
,
int
);
const
mtime_t
i_system
=
va_arg
(
args
,
mtime_t
);
input_clock_ChangeSystemOrigin
(
p_pgrm
->
p_clock
,
b_absolute
,
i_system
);
return
VLC_SUCCESS
;
}
case
ES_OUT_SET_EOS
:
{
for
(
int
i
=
0
;
i
<
p_sys
->
i_es
;
i
++
)
{
es_out_id_t
*
id
=
p_sys
->
es
[
i
];
decoder_t
*
p_dec
=
id
->
p_dec
;
if
(
!
p_dec
)
continue
;
block_t
*
p_block
=
block_Alloc
(
0
);
if
(
!
p_block
)
break
;
p_block
->
i_flags
|=
BLOCK_FLAG_CORE_EOS
;
input_DecoderDecode
(
p_dec
,
p_block
,
false
);
}
return
VLC_SUCCESS
;
}
default:
msg_Err
(
p_sys
->
p_input
,
"unknown query in es_out_Control"
);
return
VLC_EGENERIC
;
}
}
static
int
EsOutControl
(
es_out_t
*
out
,
int
i_query
,
va_list
args
)
...
...
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