Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
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-gpu
Commits
c6990674
Commit
c6990674
authored
Apr 20, 2005
by
Steve Lhomme
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mkv.cpp: the JumpTT command now works !!!!!!
parent
7160cbf7
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
92 additions
and
22 deletions
+92
-22
modules/demux/mkv.cpp
modules/demux/mkv.cpp
+92
-22
No files found.
modules/demux/mkv.cpp
View file @
c6990674
...
@@ -675,10 +675,6 @@ public:
...
@@ -675,10 +675,6 @@ public:
int
BlockGet
(
KaxBlock
**
pp_block
,
int64_t
*
pi_ref1
,
int64_t
*
pi_ref2
,
int64_t
*
pi_duration
);
int
BlockGet
(
KaxBlock
**
pp_block
,
int64_t
*
pi_ref1
,
int64_t
*
pi_ref2
,
int64_t
*
pi_duration
);
bool
Select
(
mtime_t
i_start_time
);
bool
Select
(
mtime_t
i_start_time
);
void
UnSelect
(
);
void
UnSelect
(
);
chapter_item_c
*
BrowseCodecPrivate
(
unsigned
int
codec_id
,
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
const
void
*
p_cookie
,
size_t
i_cookie_size
);
static
bool
CompareSegmentUIDs
(
const
matroska_segment_c
*
item_a
,
const
matroska_segment_c
*
item_b
);
static
bool
CompareSegmentUIDs
(
const
matroska_segment_c
*
item_a
,
const
matroska_segment_c
*
item_b
);
};
};
...
@@ -740,9 +736,24 @@ public:
...
@@ -740,9 +736,24 @@ public:
return
false
;
return
false
;
}
}
bool
FindUID
(
KaxSegmentUID
&
uid
)
const
{
for
(
size_t
i
=
0
;
i
<
linked_uids
.
size
();
i
++
)
{
if
(
linked_uids
[
i
]
==
uid
)
return
true
;
}
return
false
;
}
void
UpdateCurrentToChapter
(
demux_t
&
demux
);
void
UpdateCurrentToChapter
(
demux_t
&
demux
);
void
PrepareChapters
(
);
bool
Select
(
input_title_t
&
title
);
bool
Select
(
input_title_t
&
title
);
chapter_item_c
*
BrowseCodecPrivate
(
unsigned
int
codec_id
,
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
const
void
*
p_cookie
,
size_t
i_cookie_size
);
protected:
protected:
std
::
vector
<
matroska_segment_c
*>
linked_segments
;
std
::
vector
<
matroska_segment_c
*>
linked_segments
;
std
::
vector
<
KaxSegmentUID
>
linked_uids
;
std
::
vector
<
KaxSegmentUID
>
linked_uids
;
...
@@ -794,10 +805,13 @@ public:
...
@@ -794,10 +805,13 @@ public:
virtual
~
demux_sys_t
()
virtual
~
demux_sys_t
()
{
{
for
(
size_t
i
=
0
;
i
<
streams
.
size
();
i
++
)
size_t
i
;
for
(
i
=
0
;
i
<
streams
.
size
();
i
++
)
delete
streams
[
i
];
delete
streams
[
i
];
for
(
size_t
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
for
(
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
delete
opened_segments
[
i
];
delete
opened_segments
[
i
];
for
(
i
=
0
;
i
<
used_segments
.
size
();
i
++
)
delete
used_segments
[
i
];
}
}
/* current data */
/* current data */
...
@@ -813,6 +827,7 @@ public:
...
@@ -813,6 +827,7 @@ public:
std
::
vector
<
matroska_stream_c
*>
streams
;
std
::
vector
<
matroska_stream_c
*>
streams
;
std
::
vector
<
matroska_segment_c
*>
opened_segments
;
std
::
vector
<
matroska_segment_c
*>
opened_segments
;
std
::
vector
<
virtual_segment_c
*>
used_segments
;
virtual_segment_c
*
p_current_segment
;
virtual_segment_c
*
p_current_segment
;
/* duration of the stream */
/* duration of the stream */
...
@@ -823,12 +838,16 @@ public:
...
@@ -823,12 +838,16 @@ public:
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
const
void
*
p_cookie
,
const
void
*
p_cookie
,
size_t
i_cookie_size
,
size_t
i_cookie_size
,
matroska
_segment_c
*
&
p_segment_found
);
virtual
_segment_c
*
&
p_segment_found
);
void
PreloadFamily
(
const
matroska_segment_c
&
of_segment
);
void
PreloadFamily
(
const
matroska_segment_c
&
of_segment
);
void
PreloadLinked
(
matroska_segment_c
*
p_segment
);
void
PreloadLinked
(
matroska_segment_c
*
p_segment
);
bool
PreparePlayback
(
);
bool
PreparePlayback
(
);
matroska_stream_c
*
AnalyseAllSegmentsFound
(
EbmlStream
*
p_estream
);
matroska_stream_c
*
AnalyseAllSegmentsFound
(
EbmlStream
*
p_estream
);
protected:
virtual_segment_c
*
VirtualFromSegments
(
matroska_segment_c
*
p_segment
)
const
;
bool
IsUsedSegment
(
matroska_segment_c
&
p_segment
)
const
;
};
};
static
int
Demux
(
demux_t
*
);
static
int
Demux
(
demux_t
*
);
...
@@ -1756,10 +1775,10 @@ void matroska_segment_c::UnSelect( )
...
@@ -1756,10 +1775,10 @@ void matroska_segment_c::UnSelect( )
ep
=
NULL
;
ep
=
NULL
;
}
}
bool
virtual_segment_c
::
Select
(
input_title_t
&
title
)
void
virtual_segment_c
::
PrepareChapters
(
)
{
{
if
(
linked_segments
.
size
()
==
0
)
if
(
linked_segments
.
size
()
==
0
)
return
false
;
return
;
// !!! should be called only once !!!
// !!! should be called only once !!!
matroska_segment_c
*
p_segment
;
matroska_segment_c
*
p_segment
;
...
@@ -1776,7 +1795,10 @@ bool virtual_segment_c::Select( input_title_t & title )
...
@@ -1776,7 +1795,10 @@ bool virtual_segment_c::Select( input_title_t & title )
for
(
j
=
0
;
j
<
p_segment
->
stored_editions
.
size
();
j
++
)
for
(
j
=
0
;
j
<
p_segment
->
stored_editions
.
size
();
j
++
)
(
*
p_editions
)[
j
]
->
Append
(
*
p_segment
->
stored_editions
[
j
]
);
(
*
p_editions
)[
j
]
->
Append
(
*
p_segment
->
stored_editions
[
j
]
);
}
}
}
bool
virtual_segment_c
::
Select
(
input_title_t
&
title
)
{
if
(
Edition
()
!=
NULL
)
if
(
Edition
()
!=
NULL
)
Edition
()
->
PublishChapters
(
title
);
Edition
()
->
PublishChapters
(
title
);
...
@@ -1785,9 +1807,12 @@ bool virtual_segment_c::Select( input_title_t & title )
...
@@ -1785,9 +1807,12 @@ bool virtual_segment_c::Select( input_title_t & title )
void
chapter_edition_c
::
PublishChapters
(
input_title_t
&
title
)
void
chapter_edition_c
::
PublishChapters
(
input_title_t
&
title
)
{
{
title
.
i_seekpoint
=
0
;
if
(
title
.
seekpoint
!=
NULL
)
if
(
title
.
seekpoint
!=
NULL
)
free
(
title
.
seekpoint
);
free
(
title
.
seekpoint
);
title
.
i_seekpoint
=
0
;
title
.
seekpoint
=
NULL
;
chapter_item_c
::
PublishChapters
(
title
,
0
);
chapter_item_c
::
PublishChapters
(
title
,
0
);
}
}
...
@@ -1851,14 +1876,14 @@ void virtual_segment_c::UpdateCurrentToChapter( demux_t & demux )
...
@@ -1851,14 +1876,14 @@ void virtual_segment_c::UpdateCurrentToChapter( demux_t & demux )
}
}
}
}
chapter_item_c
*
matroska
_segment_c
::
BrowseCodecPrivate
(
unsigned
int
codec_id
,
chapter_item_c
*
virtual
_segment_c
::
BrowseCodecPrivate
(
unsigned
int
codec_id
,
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
const
void
*
p_cookie
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
size_t
i_cookie_size
)
{
{
// FIXME don't assume it is the first edition
// FIXME don't assume it is the first edition
std
::
vector
<
chapter_edition_c
*>::
iterator
index
=
stored_editions
.
begin
();
std
::
vector
<
chapter_edition_c
*>::
iterator
index
=
p_editions
->
begin
();
if
(
index
!=
stored_editions
.
end
()
)
if
(
index
!=
p_editions
->
end
()
)
{
{
chapter_item_c
*
p_result
=
(
*
index
)
->
BrowseCodecPrivate
(
codec_id
,
match
,
p_cookie
,
i_cookie_size
);
chapter_item_c
*
p_result
=
(
*
index
)
->
BrowseCodecPrivate
(
codec_id
,
match
,
p_cookie
,
i_cookie_size
);
if
(
p_result
!=
NULL
)
if
(
p_result
!=
NULL
)
...
@@ -3704,22 +3729,59 @@ bool matroska_segment_c::PreloadFamily( const matroska_segment_c & of_segment )
...
@@ -3704,22 +3729,59 @@ bool matroska_segment_c::PreloadFamily( const matroska_segment_c & of_segment )
void
demux_sys_t
::
PreloadLinked
(
matroska_segment_c
*
p_segment
)
void
demux_sys_t
::
PreloadLinked
(
matroska_segment_c
*
p_segment
)
{
{
size_t
i_preloaded
,
i
;
size_t
i_preloaded
,
i
;
virtual_segment_c
*
p_seg
;
delete
p_current_segment
;
p_current_segment
=
VirtualFromSegments
(
p_segment
);
p_current_segment
=
new
virtual_segment_c
(
p_segment
);
used_segments
.
push_back
(
p_current_segment
);
// create all the other virtual segments of the family
do
{
i_preloaded
=
0
;
for
(
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
{
if
(
opened_segments
[
i
]
->
b_preloaded
&&
!
IsUsedSegment
(
*
opened_segments
[
i
]
)
)
{
p_seg
=
VirtualFromSegments
(
opened_segments
[
i
]
);
used_segments
.
push_back
(
p_seg
);
i_preloaded
++
;
}
}
}
while
(
i_preloaded
);
// worst case: will stop when all segments are found as family related
}
bool
demux_sys_t
::
IsUsedSegment
(
matroska_segment_c
&
segment
)
const
{
for
(
size_t
i
=
0
;
i
<
used_segments
.
size
();
i
++
)
{
if
(
used_segments
[
i
]
->
FindUID
(
segment
.
segment_uid
)
)
return
true
;
}
return
false
;
}
virtual_segment_c
*
demux_sys_t
::
VirtualFromSegments
(
matroska_segment_c
*
p_segment
)
const
{
size_t
i_preloaded
,
i
;
virtual_segment_c
*
p_result
=
new
virtual_segment_c
(
p_segment
);
// fill our current virtual segment with all hard linked segments
// fill our current virtual segment with all hard linked segments
do
{
do
{
i_preloaded
=
0
;
i_preloaded
=
0
;
for
(
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
for
(
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
{
{
i_preloaded
+=
p_
current_segmen
t
->
AddSegment
(
opened_segments
[
i
]
);
i_preloaded
+=
p_
resul
t
->
AddSegment
(
opened_segments
[
i
]
);
}
}
}
while
(
i_preloaded
);
// worst case: will stop when all segments are found as linked
}
while
(
i_preloaded
);
// worst case: will stop when all segments are found as linked
p_current_segment
->
Sort
(
);
p_result
->
Sort
(
);
p_result
->
PreloadLinked
(
);
p_current_segment
->
PreloadLinked
(
);
p_result
->
PrepareChapters
(
);
return
p_result
;
}
}
bool
demux_sys_t
::
PreparePlayback
(
)
bool
demux_sys_t
::
PreparePlayback
(
)
...
@@ -3829,15 +3891,15 @@ chapter_item_c *demux_sys_t::BrowseCodecPrivate( unsigned int codec_id,
...
@@ -3829,15 +3891,15 @@ chapter_item_c *demux_sys_t::BrowseCodecPrivate( unsigned int codec_id,
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
bool
(
*
match
)(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
),
const
void
*
p_cookie
,
const
void
*
p_cookie
,
size_t
i_cookie_size
,
size_t
i_cookie_size
,
matroska
_segment_c
*
&
p_segment_found
)
virtual
_segment_c
*
&
p_segment_found
)
{
{
chapter_item_c
*
p_result
=
NULL
;
chapter_item_c
*
p_result
=
NULL
;
for
(
size_t
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
{
{
p_result
=
open
ed_segments
[
i
]
->
BrowseCodecPrivate
(
codec_id
,
match
,
p_cookie
,
i_cookie_size
);
p_result
=
us
ed_segments
[
i
]
->
BrowseCodecPrivate
(
codec_id
,
match
,
p_cookie
,
i_cookie_size
);
if
(
p_result
!=
NULL
)
if
(
p_result
!=
NULL
)
{
{
p_segment_found
=
open
ed_segments
[
i
];
p_segment_found
=
us
ed_segments
[
i
];
break
;
break
;
}
}
}
}
...
@@ -4193,11 +4255,19 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
...
@@ -4193,11 +4255,19 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
{
{
uint8
i_title
=
p_command
[
5
];
uint8
i_title
=
p_command
[
5
];
// find in the ChapProcessPrivate matching this Title level
// find in the ChapProcessPrivate matching this Title level
matroska
_segment_c
*
p_segment
;
virtual
_segment_c
*
p_segment
;
chapter_item_c
*
p_chapter
;
chapter_item_c
*
p_chapter
;
p_chapter
=
sys
.
BrowseCodecPrivate
(
1
,
MatchTitleNumber
,
&
i_title
,
sizeof
(
i_title
),
p_segment
);
p_chapter
=
sys
.
BrowseCodecPrivate
(
1
,
MatchTitleNumber
,
&
i_title
,
sizeof
(
i_title
),
p_segment
);
// TODO if the segment is not part of the current segment, select the new one
// TODO if the segment is not part of the current segment, select the new one
if
(
p_segment
!=
sys
.
p_current_segment
)
{
sys
.
p_current_segment
=
p_segment
;
sys
.
PreparePlayback
();
}
// TODO jump to the location in the found segment
// TODO jump to the location in the found segment
p_segment
->
Seek
(
sys
.
demuxer
,
p_chapter
->
i_user_start_time
,
-
1
,
NULL
);
break
;
break
;
}
}
}
}
...
...
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