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
3bd43453
Commit
3bd43453
authored
Oct 23, 2013
by
Francois Cartegnie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
demux: ogg: eos workaround for seeking (fix #9601)
parent
af1a7a95
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
36 additions
and
24 deletions
+36
-24
modules/demux/ogg.c
modules/demux/ogg.c
+34
-20
modules/demux/ogg.h
modules/demux/ogg.h
+2
-4
No files found.
modules/demux/ogg.c
View file @
3bd43453
...
...
@@ -242,10 +242,16 @@ static int Demux( demux_t * p_demux )
bool
b_skipping
=
false
;
bool
b_canseek
;
int
i_active_streams
=
p_sys
->
i_streams
;
for
(
int
i
;
i
<
p_sys
->
i_streams
;
i
++
)
{
if
(
p_sys
->
pp_stream
[
i
]
->
b_finished
)
i_active_streams
--
;
}
if
(
p_sys
->
i_eos
==
p_sys
->
i_streams
)
if
(
i_active_streams
==
0
)
{
if
(
p_sys
->
i_eos
)
if
(
p_sys
->
i_streams
)
/* All finished */
{
msg_Dbg
(
p_demux
,
"end of a group of logical streams"
);
/* We keep the ES to try reusing it in Ogg_BeginningOfStream
...
...
@@ -258,7 +264,6 @@ static int Demux( demux_t * p_demux )
Ogg_EndOfStream
(
p_demux
);
}
p_sys
->
i_eos
=
0
;
if
(
Ogg_BeginningOfStream
(
p_demux
)
!=
VLC_SUCCESS
)
return
0
;
...
...
@@ -314,9 +319,14 @@ static int Demux( demux_t * p_demux )
}
}
/* FIXME that eos handling is innapropriate with seeking and concatenated streams */
if
(
ogg_page_granulepos
(
&
p_sys
->
current_page
)
!=
0
)
/* skel workaround */
p_sys
->
i_eos
++
;
for
(
i_stream
=
0
;
i_stream
<
p_sys
->
i_streams
;
i_stream
++
)
{
if
(
p_sys
->
pp_stream
[
i_stream
]
->
i_serial_no
==
ogg_page_serialno
(
&
p_sys
->
current_page
)
)
{
p_sys
->
pp_stream
[
i_stream
]
->
b_finished
=
true
;
break
;
}
}
}
}
...
...
@@ -346,6 +356,7 @@ static int Demux( demux_t * p_demux )
es_out_Control
(
p_demux
->
out
,
ES_OUT_SET_PCR
,
VLC_TS_0
);
}
/* Does fail if serialno differs */
if
(
ogg_stream_pagein
(
&
p_stream
->
os
,
&
p_sys
->
current_page
)
!=
0
)
{
continue
;
...
...
@@ -353,6 +364,9 @@ static int Demux( demux_t * p_demux )
}
/* clear the finished flag if pages after eos (ex: after a seek) */
if
(
!
ogg_page_eos
(
&
p_sys
->
current_page
)
)
p_stream
->
b_finished
=
false
;
DemuxDebug
(
if
(
p_stream
->
fmt
.
i_cat
==
VIDEO_ES
)
msg_Dbg
(
p_demux
,
"DEMUX READ pageno %ld g%"
PRId64
" (%d packets) cont %d %ld bytes eos %d "
,
...
...
@@ -645,9 +659,10 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
/* forbid seeking if we haven't initialized all logical bitstreams yet;
if we allowed, some headers would not get backed up and decoder init
would fail, making that logical stream unusable */
if
(
p_sys
->
i_bos
>
0
)
for
(
int
i
=
0
;
i
<
p_sys
->
i_streams
;
i
++
)
{
return
VLC_EGENERIC
;
if
(
p_sys
->
pp_stream
[
i
]
->
b_initializing
)
return
VLC_EGENERIC
;
}
p_stream
=
Ogg_GetSelectedStream
(
p_demux
);
...
...
@@ -718,9 +733,15 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
case
DEMUX_SET_SEEKPOINT
:
{
const
int
i_seekpoint
=
(
int
)
va_arg
(
args
,
int
);
if
(
i_seekpoint
>
p_sys
->
i_seekpoints
||
p_sys
->
i_bos
>
0
)
if
(
i_seekpoint
>
p_sys
->
i_seekpoints
)
return
VLC_EGENERIC
;
for
(
int
i
=
0
;
i
<
p_sys
->
i_streams
;
i
++
)
{
if
(
p_sys
->
pp_stream
[
i
]
->
b_initializing
)
return
VLC_EGENERIC
;
}
i64
=
p_sys
->
pp_seekpoints
[
i_seekpoint
]
->
i_time_offset
;
p_stream
=
Ogg_GetSelectedStream
(
p_demux
);
...
...
@@ -1023,7 +1044,7 @@ static void Ogg_DecodePacket( demux_t *p_demux,
p_stream
->
p_headers
,
p_stream
->
i_headers
);
/* we're not at BOS anymore for this logical stream */
p_
ogg
->
i_bos
--
;
p_
stream
->
b_initializing
=
false
;
}
}
...
...
@@ -1734,20 +1755,13 @@ static int Ogg_FindLogicalStreams( demux_t *p_demux )
p_ogg
->
i_streams
--
;
}
/* we'll need to get all headers */
p_ogg
->
pp_stream
[
i_stream
]
->
b_initializing
|=
p_ogg
->
pp_stream
[
i_stream
]
->
b_force_backup
;
if
(
Ogg_ReadPage
(
p_demux
,
&
p_ogg
->
current_page
)
!=
VLC_SUCCESS
)
return
VLC_EGENERIC
;
}
/* we'll need to get all headers for all of those streams
that we have to backup headers for */
p_ogg
->
i_bos
=
0
;
for
(
i_stream
=
0
;
i_stream
<
p_ogg
->
i_streams
;
i_stream
++
)
{
if
(
p_ogg
->
pp_stream
[
i_stream
]
->
b_force_backup
)
p_ogg
->
i_bos
++
;
}
/* This is the first data page, which means we are now finished
* with the initial pages. We just need to store it in the relevant
* bitstream. */
...
...
modules/demux/ogg.h
View file @
3bd43453
...
...
@@ -72,6 +72,8 @@ typedef struct logical_stream_s
mtime_t
i_previous_pcr
;
/* Misc */
bool
b_initializing
;
bool
b_finished
;
bool
b_reinit
;
bool
b_oggds
;
int
i_granule_shift
;
...
...
@@ -130,10 +132,6 @@ struct demux_sys_t
* the sub-streams */
mtime_t
i_pcr
;
/* stream state */
int
i_bos
;
/* Begnning of stream, tell the demux to look for elementary streams. */
int
i_eos
;
/* bitrate */
int
i_bitrate
;
bool
b_partial_bitrate
;
...
...
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