Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
aa311542
Commit
aa311542
authored
May 10, 2014
by
Francois Cartegnie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
demux: asf: fix mmsh es id offset and PCR handling (fix #11470)
might fix 11458
parent
4c5277f9
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
83 additions
and
26 deletions
+83
-26
modules/access/mms/mmsh.c
modules/access/mms/mmsh.c
+30
-12
modules/demux/asf/asf.c
modules/demux/asf/asf.c
+53
-14
No files found.
modules/access/mms/mmsh.c
View file @
aa311542
...
...
@@ -42,6 +42,7 @@
#include "mms.h"
#include "mmsh.h"
#include "assert.h"
/* TODO:
* - authentication
*/
...
...
@@ -262,20 +263,37 @@ static int Control( access_t *p_access, int i_query, va_list args )
break
;
case
ACCESS_SET_PRIVATE_ID_STATE
:
{
i_int
=
(
int
)
va_arg
(
args
,
int
);
b_bool
=
(
bool
)
va_arg
(
args
,
int
);
if
(
(
i_int
<
0
)
||
(
i_int
>
127
)
)
int
i_cat
;
if
(
i_int
>
127
)
return
VLC_EGENERIC
;
else
if
(
i_int
<
0
)
{
/* Deselecting all ES in this category */
assert
(
!
b_bool
);
i_cat
=
-
1
*
i_int
;
if
(
i_cat
>
ES_CATEGORY_COUNT
)
return
VLC_EGENERIC
;
}
else
{
int
i_cat
=
p_sys
->
asfh
.
stream
[
i_int
].
i_cat
;
/* Chose another ES */
assert
(
b_bool
);
i_cat
=
p_sys
->
asfh
.
stream
[
i_int
].
i_cat
;
}
for
(
int
i
=
0
;
i
<
128
;
i
++
)
{
/* First unselect all streams from the same cat */
if
(
i_cat
==
p_sys
->
asfh
.
stream
[
i
].
i_cat
)
p_sys
->
asfh
.
stream
[
i
].
i_selected
=
false
;
}
if
(
i_int
>
0
)
p_sys
->
asfh
.
stream
[
i_int
].
i_selected
=
true
;
Stop
(
p_access
);
Seek
(
p_access
,
p_access
->
info
.
i_pos
);
return
VLC_SUCCESS
;
...
...
modules/demux/asf/asf.c
View file @
aa311542
...
...
@@ -42,6 +42,7 @@
#include <limits.h>
#include "libasf.h"
#include "assert.h"
/* TODO
* - add support for the newly added object: language, bitrate,
...
...
@@ -79,6 +80,7 @@ typedef struct
es_out_id_t
*
p_es
;
es_format_t
*
p_fmt
;
/* format backup for video changes */
bool
b_selected
;
asf_object_stream_properties_t
*
p_sp
;
asf_object_extended_stream_properties_t
*
p_esp
;
...
...
@@ -106,6 +108,7 @@ struct demux_sys_t
bool
b_index
;
bool
b_canfastseek
;
uint8_t
i_seek_track
;
uint8_t
i_access_selected_track
[
ES_CATEGORY_COUNT
];
/* mms, depends on access algorithm */
unsigned
int
i_wait_keyframe
;
vlc_meta_t
*
meta
;
...
...
@@ -153,6 +156,27 @@ static int Demux( demux_t *p_demux )
{
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
for
(
int
i
=
0
;
i
<
ES_CATEGORY_COUNT
;
i
++
)
{
if
(
p_sys
->
i_access_selected_track
[
i
]
>
0
)
{
es_out_Control
(
p_demux
->
out
,
ES_OUT_SET_ES_STATE
,
p_sys
->
track
[
p_sys
->
i_access_selected_track
[
i
]]
->
p_es
,
true
);
p_sys
->
i_access_selected_track
[
i
]
=
0
;
}
}
/* Get selected tracks, especially for computing PCR */
for
(
int
i
=
0
;
i
<
MAX_ASF_TRACKS
;
i
++
)
{
asf_track_t
*
tk
=
p_sys
->
track
[
i
];
if
(
!
tk
)
continue
;
if
(
tk
->
p_es
)
es_out_Control
(
p_demux
->
out
,
ES_OUT_GET_ES_STATE
,
tk
->
p_es
,
&
tk
->
b_selected
);
else
tk
->
b_selected
=
false
;
}
for
(
;;
)
{
const
uint8_t
*
p_peek
;
...
...
@@ -247,19 +271,13 @@ static void WaitKeyframe( demux_t *p_demux )
for
(
int
i
=
0
;
i
<
MAX_ASF_TRACKS
;
i
++
)
{
asf_track_t
*
tk
=
p_sys
->
track
[
i
];
if
(
tk
&&
tk
->
p_sp
&&
tk
->
i_cat
==
VIDEO_ES
)
{
bool
b_selected
=
false
;
es_out_Control
(
p_demux
->
out
,
ES_OUT_GET_ES_STATE
,
tk
->
p_es
,
&
b_selected
);
if
(
b_selected
)
if
(
tk
&&
tk
->
p_sp
&&
tk
->
i_cat
==
VIDEO_ES
&&
tk
->
b_selected
)
{
p_sys
->
i_seek_track
=
tk
->
p_sp
->
i_stream_number
;
break
;
}
}
}
}
if
(
p_sys
->
i_seek_track
)
{
...
...
@@ -401,14 +419,26 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
case
DEMUX_SET_ES
:
{
i
=
(
int
)
va_arg
(
args
,
int
);
int
i_ret
=
stream_Control
(
p_demux
->
s
,
STREAM_SET_PRIVATE_ID_STATE
,
i
,
true
);
int
i_ret
;
if
(
i
>=
0
)
{
i
++
;
/* video/audio-es variable starts 0 */
msg_Dbg
(
p_demux
,
"Requesting access to enable stream %d"
,
i
);
i_ret
=
stream_Control
(
p_demux
->
s
,
STREAM_SET_PRIVATE_ID_STATE
,
i
,
true
);
}
else
{
/* i contains -1 * es_category */
msg_Dbg
(
p_demux
,
"Requesting access to disable stream %d"
,
i
);
i_ret
=
stream_Control
(
p_demux
->
s
,
STREAM_SET_PRIVATE_ID_STATE
,
i
,
false
);
}
if
(
i_ret
==
VLC_SUCCESS
)
{
SeekPrepare
(
p_demux
);
p_sys
->
i_seek_track
=
0
;
WaitKeyframe
(
p_demux
);
}
assert
(
i_ret
==
VLC_SUCCESS
);
return
i_ret
;
}
...
...
@@ -478,12 +508,13 @@ static mtime_t GetMoviePTS( demux_sys_t *p_sys )
{
mtime_t
i_time
=
-
1
;
int
i
;
/* As some tracks might have been deselected by access, the PCR might
* stop updating */
for
(
i
=
0
;
i
<
MAX_ASF_TRACKS
;
i
++
)
{
asf_track_t
*
tk
=
p_sys
->
track
[
i
];
const
asf_track_t
*
tk
=
p_sys
->
track
[
i
];
if
(
tk
&&
tk
->
p_es
&&
tk
->
i_time
>
0
)
if
(
tk
&&
tk
->
p_es
&&
tk
->
i_time
>
0
&&
tk
->
b_selected
)
{
if
(
i_time
<
0
)
i_time
=
tk
->
i_time
;
else
i_time
=
__MIN
(
i_time
,
tk
->
i_time
);
...
...
@@ -1438,6 +1469,14 @@ static int DemuxInit( demux_t *p_demux )
}
tk
->
p_es
=
es_out_Add
(
p_demux
->
out
,
&
fmt
);
if
(
!
stream_Control
(
p_demux
->
s
,
STREAM_GET_PRIVATE_ID_STATE
,
(
int
)
p_sp
->
i_stream_number
,
&
b_access_selected
)
&&
b_access_selected
)
{
p_sys
->
i_access_selected_track
[
fmt
.
i_cat
]
=
p_sp
->
i_stream_number
;
}
}
else
{
...
...
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