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
bf73ab03
Commit
bf73ab03
authored
Dec 02, 2013
by
Maxim Bublis
Committed by
Jean-Baptiste Kempf
Dec 08, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Removed unused static functions
Signed-off-by:
Jean-Baptiste Kempf
<
jb@videolan.org
>
parent
0f025b2e
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
0 additions
and
312 deletions
+0
-312
modules/demux/oggseek.c
modules/demux/oggseek.c
+0
-312
No files found.
modules/demux/oggseek.c
View file @
bf73ab03
...
...
@@ -324,142 +324,6 @@ static int64_t get_data( demux_t *p_demux, int64_t i_bytes_to_read )
return
i_result
;
}
/* Find the first first ogg page for p_stream between offsets i_pos1 and i_pos2,
return file offset in bytes; -1 is returned on failure */
static
int64_t
find_first_page
(
demux_t
*
p_demux
,
int64_t
i_pos1
,
int64_t
i_pos2
,
logical_stream_t
*
p_stream
,
int64_t
*
pi_kframe
,
int64_t
*
pi_frame
)
{
int64_t
i_result
;
int64_t
i_granulepos
;
int64_t
i_bytes_to_read
=
i_pos2
-
i_pos1
+
1
;
int64_t
i_bytes_read
;
int64_t
i_pages_checked
=
0
;
int64_t
i_packets_checked
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
ogg_packet
op
;
seek_byte
(
p_demux
,
i_pos1
);
if
(
i_pos1
==
p_stream
->
i_data_start
)
{
/* set a dummy granulepos at data_start */
*
pi_kframe
=
p_stream
->
i_keyframe_offset
;
*
pi_frame
=
p_stream
->
i_keyframe_offset
;
p_sys
->
b_page_waiting
=
true
;
return
p_sys
->
i_input_position
;
}
if
(
i_bytes_to_read
>
OGGSEEK_BYTES_TO_READ
)
i_bytes_to_read
=
OGGSEEK_BYTES_TO_READ
;
while
(
1
)
{
if
(
p_sys
->
i_input_position
>=
i_pos2
)
{
/* we reached the end and found no pages */
*
pi_frame
=-
1
;
return
-
1
;
}
/* read next chunk */
if
(
!
(
i_bytes_read
=
get_data
(
p_demux
,
i_bytes_to_read
)
)
)
{
/* EOF */
*
pi_frame
=
-
1
;
return
-
1
;
}
i_bytes_to_read
=
OGGSEEK_BYTES_TO_READ
;
i_result
=
ogg_sync_pageseek
(
&
p_sys
->
oy
,
&
p_sys
->
current_page
);
if
(
i_result
<
0
)
{
/* found a page, sync to page start */
p_sys
->
i_input_position
-=
i_result
;
i_pos1
=
p_sys
->
i_input_position
;
continue
;
}
if
(
i_result
>
0
||
(
i_result
==
0
&&
p_sys
->
oy
.
fill
>
3
&&
!
strncmp
(
(
char
*
)
p_sys
->
oy
.
data
,
"OggS"
,
4
)
)
)
{
i_pos1
=
p_sys
->
i_input_position
;
break
;
}
p_sys
->
i_input_position
+=
i_bytes_read
;
};
seek_byte
(
p_demux
,
p_sys
->
i_input_position
);
ogg_stream_reset
(
&
p_stream
->
os
);
while
(
1
)
{
if
(
p_sys
->
i_input_position
>=
i_pos2
)
{
/* reached the end of the search region and nothing was found */
*
pi_frame
=
-
1
;
return
p_sys
->
i_input_position
;
}
p_sys
->
b_page_waiting
=
false
;
if
(
!
(
i_result
=
oggseek_read_page
(
p_demux
)
)
)
{
/* EOF */
*
pi_frame
=
-
1
;
return
p_sys
->
i_input_position
;
}
// found a page
if
(
p_stream
->
os
.
serialno
!=
ogg_page_serialno
(
&
p_sys
->
current_page
)
)
{
/* page is not for this stream */
p_sys
->
i_input_position
+=
i_result
;
if
(
!
i_pages_checked
)
i_pos1
=
p_sys
->
i_input_position
;
continue
;
}
ogg_stream_pagein
(
&
p_stream
->
os
,
&
p_sys
->
current_page
);
i_pages_checked
++
;
i_packets_checked
=
0
;
if
(
ogg_stream_packetout
(
&
p_stream
->
os
,
&
op
)
>
0
)
{
i_packets_checked
++
;
}
if
(
i_packets_checked
)
{
i_granulepos
=
ogg_page_granulepos
(
&
p_sys
->
current_page
);
oggseek_theora_index_entry_add
(
p_stream
,
i_granulepos
,
i_pos1
);
*
pi_kframe
=
i_granulepos
>>
p_stream
->
i_granule_shift
;
*
pi_frame
=
*
pi_kframe
+
i_granulepos
-
(
*
pi_kframe
<<
p_stream
->
i_granule_shift
);
p_sys
->
b_page_waiting
=
true
;
return
i_pos1
;
}
/* -> start of next page */
p_sys
->
i_input_position
+=
i_result
;
}
}
void
Oggseek_ProbeEnd
(
demux_t
*
p_demux
)
{
...
...
@@ -566,182 +430,6 @@ static inline int64_t frame_to_gpos( logical_stream_t *p_stream, int64_t i_kfram
}
/* seek to a suitable point to begin decoding for i_tframe. We can pre-set bounding positions
i_pos_lower and i_pos_higher to narrow the search domain. */
static
int64_t
ogg_seek
(
demux_t
*
p_demux
,
logical_stream_t
*
p_stream
,
int64_t
i_tframe
,
int64_t
i_pos_lower
,
int64_t
i_pos_upper
,
int64_t
*
pi_pagepos
,
bool
b_exact
)
{
/* For theora:
* We do two passes here, first with b_exact set, then with b_exact unset.
*
* If b_exact is set, we find the highest granulepos <= the target granulepos
* from this we extract an estimate of the keyframe (note that there could be other
* "hidden" keyframes between the found granulepos and the target).
*
* On the second pass we find the highest granulepos < target. This places us just before or
* at the start of the target keyframe.
*
* When we come to decode, we start from this second position, discarding any completed
* packets on that page, and read pages discarding packets until we get to the target frame.
*
* The function returns the granulepos which is found,
* sets the page offset in pi_pagepos. -1 is returned on error.
*
* for dirac:
*
* we find the highest sync frame <= target frame, and return the sync_frame number
* b_exact should be set to true
*
*
* the method used is bi-sections:
* - we check the lower keyframe
* if this is == target we return
* if > target, or we find no keyframes, we go to the lower segment
* if < target we divide the segment in two and check the upper half
*
* This is then repeated until the segment size is too small to hold a packet,
* at which point we return our best match
*
* Two optimisations are made: - anything we discover about keyframes is added to our index
* - before calling this function we get approximate bounds from the index
*
* therefore, subsequent searches become more rapid.
*
*/
int64_t
i_start_pos
;
int64_t
i_end_pos
;
int64_t
i_pagepos
;
int64_t
i_segsize
;
int64_t
i_frame
;
int64_t
i_kframe
;
int64_t
i_best_kframe
=
-
1
;
int64_t
i_best_frame
=
-
1
;
int64_t
i_best_pagepos
=
-
1
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
if
(
i_tframe
<
p_stream
->
i_keyframe_offset
)
{
*
pi_pagepos
=
p_stream
->
i_data_start
;
if
(
!
b_exact
)
{
seek_byte
(
p_demux
,
p_stream
->
i_data_start
);
return
frame_to_gpos
(
p_stream
,
p_stream
->
i_keyframe_offset
,
1
);
}
return
frame_to_gpos
(
p_stream
,
p_stream
->
i_keyframe_offset
,
0
);
}
if
(
i_pos_lower
<
p_stream
->
i_data_start
)
{
i_pos_lower
=
p_stream
->
i_data_start
;
}
if
(
i_pos_upper
<
0
)
{
i_pos_upper
=
p_sys
->
i_total_length
;
}
if
(
i_pos_upper
>
p_sys
->
i_total_length
)
{
i_pos_upper
=
p_sys
->
i_total_length
;
}
i_start_pos
=
i_pos_lower
;
i_end_pos
=
i_pos_upper
;
i_segsize
=
(
i_end_pos
-
i_start_pos
+
1
)
>>
1
;
do
{
/* see if the frame lies in current segment */
if
(
i_start_pos
<
i_pos_lower
)
{
i_start_pos
=
i_pos_lower
;
}
if
(
i_end_pos
>
i_pos_upper
)
{
i_end_pos
=
i_pos_upper
;
}
if
(
i_start_pos
>=
i_end_pos
)
{
if
(
i_start_pos
==
i_pos_lower
)
{
if
(
!
b_exact
)
seek_byte
(
p_demux
,
i_start_pos
);
*
pi_pagepos
=
i_start_pos
;
return
frame_to_gpos
(
p_stream
,
p_stream
->
i_keyframe_offset
,
1
);
}
break
;
}
if
(
p_stream
->
fmt
.
i_codec
==
VLC_CODEC_THEORA
||
p_stream
->
fmt
.
i_codec
==
VLC_CODEC_OPUS
)
{
i_pagepos
=
find_first_page
(
p_demux
,
i_start_pos
,
i_end_pos
,
p_stream
,
&
i_kframe
,
&
i_frame
);
}
else
return
-
1
;
if
(
i_pagepos
!=
-
1
&&
i_kframe
!=
-
1
)
{
/* found a page */
if
(
b_exact
&&
i_frame
>=
i_tframe
&&
i_kframe
<=
i_tframe
)
{
/* got it ! */
*
pi_pagepos
=
i_start_pos
;
return
frame_to_gpos
(
p_stream
,
i_kframe
,
i_frame
);
}
if
(
(
i_kframe
<
i_tframe
||
(
b_exact
&&
i_kframe
==
i_tframe
)
)
&&
i_kframe
>
i_best_kframe
)
{
i_best_kframe
=
i_kframe
;
i_best_frame
=
i_frame
;
i_best_pagepos
=
i_pagepos
;
}
if
(
i_frame
>=
i_tframe
)
{
/* check lower half of segment */
i_start_pos
-=
i_segsize
;
i_end_pos
-=
i_segsize
;
}
else
i_start_pos
=
i_pagepos
;
}
else
{
/* no keyframe found, check lower segment */
i_end_pos
-=
i_segsize
;
i_start_pos
-=
i_segsize
;
}
i_segsize
=
(
i_end_pos
-
i_start_pos
+
1
)
>>
1
;
i_start_pos
+=
i_segsize
;
}
while
(
i_segsize
>
64
);
if
(
i_best_kframe
>-
1
)
{
if
(
!
b_exact
)
{
seek_byte
(
p_demux
,
i_best_pagepos
);
}
*
pi_pagepos
=
i_best_pagepos
;
return
frame_to_gpos
(
p_stream
,
i_best_kframe
,
i_best_frame
);
}
return
-
1
;
}
static
int64_t
find_first_page_granule
(
demux_t
*
p_demux
,
int64_t
i_pos1
,
int64_t
i_pos2
,
logical_stream_t
*
p_stream
,
...
...
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