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
7b8099d5
Commit
7b8099d5
authored
May 15, 2005
by
Steve Lhomme
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mkv.cpp: fix most memory leaks
parent
937f7056
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
163 additions
and
127 deletions
+163
-127
modules/demux/mkv.cpp
modules/demux/mkv.cpp
+163
-127
No files found.
modules/demux/mkv.cpp
View file @
7b8099d5
...
...
@@ -610,15 +610,37 @@ class chapter_codec_cmds_c
{
public:
chapter_codec_cmds_c
(
demux_sys_t
&
demuxer
,
int
codec_id
=
-
1
)
:
i_codec_id
(
codec_id
)
:
p_private_data
(
NULL
)
,
i_codec_id
(
codec_id
)
,
sys
(
demuxer
)
{}
virtual
~
chapter_codec_cmds_c
()
{}
virtual
~
chapter_codec_cmds_c
()
{
delete
p_private_data
;
std
::
vector
<
KaxChapterProcessData
*>::
iterator
indexe
=
enter_cmds
.
begin
();
while
(
indexe
!=
enter_cmds
.
end
()
)
{
delete
(
*
indexe
);
indexe
++
;
}
std
::
vector
<
KaxChapterProcessData
*>::
iterator
indexl
=
leave_cmds
.
begin
();
while
(
indexl
!=
leave_cmds
.
end
()
)
{
delete
(
*
indexl
);
indexl
++
;
}
std
::
vector
<
KaxChapterProcessData
*>::
iterator
indexd
=
during_cmds
.
begin
();
while
(
indexd
!=
during_cmds
.
end
()
)
{
delete
(
*
indexd
);
indexd
++
;
}
}
void
SetPrivate
(
const
KaxChapterProcessPrivate
&
private_data
)
{
m_private_data
=
*
(
new
KaxChapterProcessPrivate
(
private_data
)
);
p_private_data
=
new
KaxChapterProcessPrivate
(
private_data
);
}
void
AddCommand
(
const
KaxChapterProcessCommand
&
command
);
...
...
@@ -629,12 +651,12 @@ public:
virtual
std
::
string
GetCodecName
(
bool
f_for_title
=
false
)
const
{
return
""
;
}
virtual
int16
GetTitleNumber
()
{
return
-
1
;
}
KaxChapterProcessPrivate
m
_private_data
;
KaxChapterProcessPrivate
*
p
_private_data
;
protected:
std
::
vector
<
KaxChapterProcessData
>
enter_cmds
;
std
::
vector
<
KaxChapterProcessData
>
during_cmds
;
std
::
vector
<
KaxChapterProcessData
>
leave_cmds
;
std
::
vector
<
KaxChapterProcessData
*
>
enter_cmds
;
std
::
vector
<
KaxChapterProcessData
*
>
during_cmds
;
std
::
vector
<
KaxChapterProcessData
*
>
leave_cmds
;
int
i_codec_id
;
demux_sys_t
&
sys
;
...
...
@@ -849,7 +871,16 @@ protected:
class
chapter_translation_c
{
public:
KaxChapterTranslateID
translated
;
chapter_translation_c
()
:
p_translated
(
NULL
)
{}
~
chapter_translation_c
()
{
delete
p_translated
;
}
KaxChapterTranslateID
*
p_translated
;
unsigned
int
codec_id
;
std
::
vector
<
uint64_t
>
editions
;
};
...
...
@@ -949,6 +980,9 @@ public:
,
i_tags_position
(
-
1
)
,
cluster
(
NULL
)
,
i_start_pos
(
0
)
,
p_segment_uid
(
NULL
)
,
p_prev_segment_uid
(
NULL
)
,
p_next_segment_uid
(
NULL
)
,
b_cues
(
VLC_FALSE
)
,
i_index
(
0
)
,
i_index_max
(
1024
)
...
...
@@ -962,7 +996,7 @@ public:
,
ep
(
NULL
)
,
b_preloaded
(
false
)
{
index
=
(
mkv_index_t
*
)
malloc
(
sizeof
(
mkv_index_t
)
*
i_index_max
);
p_indexes
=
(
mkv_index_t
*
)
malloc
(
sizeof
(
mkv_index_t
)
*
i_index_max
);
}
virtual
~
matroska_segment_c
()
...
...
@@ -973,14 +1007,14 @@ public:
{
free
(
tracks
[
i_track
]
->
fmt
.
psz_description
);
}
if
(
tracks
[
i_track
]
->
psz_codec
)
/*
if( tracks[i_track]->psz_codec )
{
free( tracks[i_track]->psz_codec );
}
if( tracks[i_track]->fmt.psz_language )
{
free( tracks[i_track]->fmt.psz_language );
}
}
*/
delete
tracks
[
i_track
];
}
...
...
@@ -1004,10 +1038,13 @@ public:
{
free
(
psz_date_utc
);
}
if
(
index
)
free
(
index
);
if
(
p_indexes
)
free
(
p_indexes
);
delete
ep
;
delete
p_segment_uid
;
delete
p_prev_segment_uid
;
delete
p_next_segment_uid
;
std
::
vector
<
chapter_edition_c
*>::
iterator
index
=
stored_editions
.
begin
();
while
(
index
!=
stored_editions
.
end
()
)
...
...
@@ -1015,6 +1052,12 @@ public:
delete
(
*
index
);
index
++
;
}
std
::
vector
<
chapter_translation_c
*>::
iterator
indext
=
translations
.
begin
();
while
(
indext
!=
translations
.
end
()
)
{
delete
(
*
indext
);
indext
++
;
}
}
KaxSegment
*
segment
;
...
...
@@ -1037,14 +1080,14 @@ public:
KaxCluster
*
cluster
;
int64_t
i_start_pos
;
KaxSegmentUID
segment_uid
;
KaxPrevUID
prev_segment_uid
;
KaxNextUID
next_segment_uid
;
KaxSegmentUID
*
p_
segment_uid
;
KaxPrevUID
*
p_
prev_segment_uid
;
KaxNextUID
*
p_
next_segment_uid
;
vlc_bool_t
b_cues
;
int
i_index
;
int
i_index_max
;
mkv_index_t
*
index
;
mkv_index_t
*
p_indexes
;
/* info */
char
*
psz_muxing_application
;
...
...
@@ -1059,7 +1102,7 @@ public:
std
::
vector
<
chapter_edition_c
*>
stored_editions
;
int
i_default_edition
;
std
::
vector
<
chapter_translation_c
>
translations
;
std
::
vector
<
chapter_translation_c
*
>
translations
;
std
::
vector
<
KaxSegmentFamily
>
families
;
demux_sys_t
&
sys
;
...
...
@@ -1100,9 +1143,9 @@ public:
{
linked_segments
.
push_back
(
p_segment
);
AppendUID
(
p_segment
->
segment_uid
);
AppendUID
(
p_segment
->
prev_segment_uid
);
AppendUID
(
p_segment
->
next_segment_uid
);
AppendUID
(
p_segment
->
p_
segment_uid
);
AppendUID
(
p_segment
->
p
_p
rev_segment_uid
);
AppendUID
(
p_segment
->
p_
next_segment_uid
);
}
void
Sort
();
...
...
@@ -1170,7 +1213,7 @@ protected:
int
i_current_edition
;
chapter_item_c
*
psz_current_chapter
;
void
AppendUID
(
const
EbmlBinary
&
UID
);
void
AppendUID
(
const
EbmlBinary
*
UID
);
};
class
matroska_stream_c
...
...
@@ -1252,7 +1295,7 @@ public:
vlc_meta_t
*
meta
;
std
::
vector
<
input_title_t
>
titles
;
// matroska editions
std
::
vector
<
input_title_t
*>
titles
;
// matroska editions
size_t
i_current_title
;
std
::
vector
<
matroska_stream_c
*>
streams
;
...
...
@@ -1523,7 +1566,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
for
(
size_t
i
=
0
;
i
<
p_sys
->
titles
.
size
();
i
++
)
{
(
*
ppp_title
)[
i
]
=
vlc_input_title_Duplicate
(
&
p_sys
->
titles
[
i
]
);
(
*
ppp_title
)[
i
]
=
vlc_input_title_Duplicate
(
p_sys
->
titles
[
i
]
);
}
return
VLC_SUCCESS
;
...
...
@@ -1544,9 +1587,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
i_skp
=
(
int
)
va_arg
(
args
,
int
);
// TODO change the way it works with the << & >> buttons on the UI (+1/-1 instead of a number)
if
(
p_sys
->
titles
.
size
()
&&
i_skp
<
p_sys
->
titles
[
p_sys
->
i_current_title
]
.
i_seekpoint
)
if
(
p_sys
->
titles
.
size
()
&&
i_skp
<
p_sys
->
titles
[
p_sys
->
i_current_title
]
->
i_seekpoint
)
{
Seek
(
p_demux
,
(
int64_t
)
p_sys
->
titles
[
p_sys
->
i_current_title
]
.
seekpoint
[
i_skp
]
->
i_time_offset
,
-
1
,
NULL
);
Seek
(
p_demux
,
(
int64_t
)
p_sys
->
titles
[
p_sys
->
i_current_title
]
->
seekpoint
[
i_skp
]
->
i_time_offset
,
-
1
,
NULL
);
p_demux
->
info
.
i_seekpoint
|=
INPUT_UPDATE_SEEKPOINT
;
p_demux
->
info
.
i_seekpoint
=
i_skp
;
return
VLC_SUCCESS
;
...
...
@@ -1580,7 +1623,7 @@ int matroska_segment_c::BlockGet( KaxBlock **pp_block, int64_t *pi_ref1, int64_t
if
(
el
==
NULL
&&
*
pp_block
!=
NULL
)
{
/* update the index */
#define idx
index
[i_index - 1]
#define idx
p_indexes
[i_index - 1]
if
(
i_index
>
0
&&
idx
.
i_time
==
-
1
)
{
idx
.
i_time
=
(
*
pp_block
)
->
GlobalTimecode
()
/
(
mtime_t
)
1000
;
...
...
@@ -1611,7 +1654,7 @@ int matroska_segment_c::BlockGet( KaxBlock **pp_block, int64_t *pi_ref1, int64_t
/* add it to the index */
if
(
i_index
==
0
||
(
i_index
>
0
&&
index
[
i_index
-
1
].
i_position
<
(
int64_t
)
cluster
->
GetElementPosition
()
)
)
(
i_index
>
0
&&
p_indexes
[
i_index
-
1
].
i_position
<
(
int64_t
)
cluster
->
GetElementPosition
()
)
)
{
IndexAppendCluster
(
cluster
);
}
...
...
@@ -1889,15 +1932,16 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( EbmlStream *p_estream )
if
(
!
b_keep_segment
)
break
;
// this segment is already known
opened_segments
.
push_back
(
p_segment1
);
p_segment1
->
segment_uid
=
*
(
new
KaxSegmentUID
(
*
p_uid
)
);
delete
p_segment1
->
p_segment_uid
;
p_segment1
->
p_segment_uid
=
new
KaxSegmentUID
(
*
p_uid
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxPrevUID
)
)
{
p_segment1
->
p
rev_segment_uid
=
*
(
new
KaxPrevUID
(
*
static_cast
<
KaxPrevUID
*>
(
l
)
)
);
p_segment1
->
p
_prev_segment_uid
=
new
KaxPrevUID
(
*
static_cast
<
KaxPrevUID
*>
(
l
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxNextUID
)
)
{
p_segment1
->
next_segment_uid
=
*
(
new
KaxNextUID
(
*
static_cast
<
KaxNextUID
*>
(
l
)
)
);
p_segment1
->
p_next_segment_uid
=
new
KaxNextUID
(
*
static_cast
<
KaxNextUID
*>
(
l
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxSegmentFamily
)
)
{
...
...
@@ -1997,16 +2041,10 @@ bool matroska_segment_c::Select( mtime_t i_start_time )
else
if
(
!
strcmp
(
tracks
[
i_track
]
->
psz_codec
,
"V_QUICKTIME"
)
)
{
MP4_Box_t
*
p_box
=
(
MP4_Box_t
*
)
malloc
(
sizeof
(
MP4_Box_t
)
);
#ifdef VSLHC
stream_t
*
p_mp4_stream
=
stream_MemoryNew
(
VLC_OBJECT
(
&
sys
.
demuxer
),
tracks
[
i_track
]
->
p_extra_data
,
tracks
[
i_track
]
->
i_extra_data
);
#else
stream_t
*
p_mp4_stream
=
stream_MemoryNew
(
VLC_OBJECT
(
&
sys
.
demuxer
),
tracks
[
i_track
]
->
p_extra_data
,
tracks
[
i_track
]
->
i_extra_data
,
VLC_FALSE
);
#endif
MP4_ReadBoxCommon
(
p_mp4_stream
,
p_box
);
MP4_ReadBox_sample_vide
(
p_mp4_stream
,
p_box
);
tracks
[
i_track
]
->
fmt
.
i_codec
=
p_box
->
i_type
;
...
...
@@ -2016,11 +2054,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time )
tracks
[
i_track
]
->
fmt
.
p_extra
=
malloc
(
tracks
[
i_track
]
->
fmt
.
i_extra
);
memcpy
(
tracks
[
i_track
]
->
fmt
.
p_extra
,
p_box
->
data
.
p_sample_vide
->
p_qt_image_description
,
tracks
[
i_track
]
->
fmt
.
i_extra
);
MP4_FreeBox_sample_vide
(
p_box
);
#ifdef VSLHC
stream_MemoryDelete
(
p_mp4_stream
,
VLC_TRUE
);
#else
stream_Delete
(
p_mp4_stream
);
#endif
}
else
if
(
!
strcmp
(
tracks
[
i_track
]
->
psz_codec
,
"A_MS/ACM"
)
)
{
...
...
@@ -2882,9 +2916,9 @@ std::string chapter_item_c::GetCodecName( bool f_for_title ) const
std
::
string
dvd_chapter_codec_c
::
GetCodecName
(
bool
f_for_title
)
const
{
std
::
string
result
;
if
(
m_private_data
.
GetSize
()
>=
3
)
if
(
p_private_data
->
GetSize
()
>=
3
)
{
const
binary
*
p_data
=
m_private_data
.
GetBuffer
();
const
binary
*
p_data
=
p_private_data
->
GetBuffer
();
/* if ( p_data[0] == MATROSKA_DVD_LEVEL_TT )
{
uint16_t i_title = (p_data[1] << 8) + p_data[2];
...
...
@@ -2938,9 +2972,9 @@ int16 chapter_item_c::GetTitleNumber( ) const
int16
dvd_chapter_codec_c
::
GetTitleNumber
()
{
if
(
m_private_data
.
GetSize
()
>=
3
)
if
(
p_private_data
->
GetSize
()
>=
3
)
{
const
binary
*
p_data
=
m_private_data
.
GetBuffer
();
const
binary
*
p_data
=
p_private_data
->
GetBuffer
();
if
(
p_data
[
0
]
==
MATROSKA_DVD_LEVEL_SS
)
{
return
int16
(
(
p_data
[
2
]
<<
8
)
+
p_data
[
3
]
);
...
...
@@ -2984,7 +3018,7 @@ static void Seek( demux_t *p_demux, mtime_t i_date, double f_percent, chapter_it
msg_Dbg
(
p_demux
,
"inacurate way of seeking"
);
for
(
i_index
=
0
;
i_index
<
p_segment
->
i_index
;
i_index
++
)
{
if
(
p_segment
->
index
[
i_index
].
i_position
>=
i_pos
)
if
(
p_segment
->
p_indexes
[
i_index
].
i_position
>=
i_pos
)
{
break
;
}
...
...
@@ -2994,10 +3028,10 @@ static void Seek( demux_t *p_demux, mtime_t i_date, double f_percent, chapter_it
i_index
--
;
}
i_date
=
p_segment
->
index
[
i_index
].
i_time
;
i_date
=
p_segment
->
p_indexes
[
i_index
].
i_time
;
#if 0
if( p_segment->
index
[i_index].i_position < i_pos )
if( p_segment->
p_indexes
[i_index].i_position < i_pos )
{
EbmlElement *el;
...
...
@@ -3046,11 +3080,6 @@ static int Demux( demux_t *p_demux)
int
i_block_count
=
0
;
int
i_return
=
0
;
KaxBlock
*
block
;
int64_t
i_block_duration
;
int64_t
i_block_ref1
;
int64_t
i_block_ref2
;
for
(
;;
)
{
if
(
p_sys
->
demuxer
.
b_die
)
...
...
@@ -3082,6 +3111,10 @@ static int Demux( demux_t *p_demux)
continue
;
}
KaxBlock
*
block
;
int64_t
i_block_duration
=
0
;
int64_t
i_block_ref1
;
int64_t
i_block_ref2
;
if
(
p_segment
->
BlockGet
(
&
block
,
&
i_block_ref1
,
&
i_block_ref2
,
&
i_block_duration
)
)
{
...
...
@@ -3317,7 +3350,7 @@ EbmlElement *EbmlParser::Get( void )
mb_keep
=
VLC_FALSE
;
}
m_el
[
mi_level
]
=
m_es
->
FindNextElement
(
m_el
[
mi_level
-
1
]
->
Generic
().
Context
,
i_ulev
,
0xFFFFFFFFL
,
mb_dummy
,
1
);
m_el
[
mi_level
]
=
m_es
->
FindNextElement
(
m_el
[
mi_level
-
1
]
->
Generic
().
Context
,
i_ulev
,
0xFFFFFFFFL
,
mb_dummy
!=
0
,
1
);
// mi_remain_size[mi_level] = m_el[mi_level]->GetSize();
if
(
i_ulev
>
0
)
{
...
...
@@ -3392,7 +3425,7 @@ void matroska_segment_c::LoadCues( )
{
if
(
MKV_IS_ID
(
el
,
KaxCuePoint
)
)
{
#define idx
index
[i_index]
#define idx
p_indexes
[i_index]
idx
.
i_track
=
-
1
;
idx
.
i_block_number
=
-
1
;
...
...
@@ -3461,7 +3494,7 @@ void matroska_segment_c::LoadCues( )
if
(
i_index
>=
i_index_max
)
{
i_index_max
+=
1024
;
index
=
(
mkv_index_t
*
)
realloc
(
index
,
sizeof
(
mkv_index_t
)
*
i_index_max
);
p_indexes
=
(
mkv_index_t
*
)
realloc
(
p_indexes
,
sizeof
(
mkv_index_t
)
*
i_index_max
);
}
#undef idx
}
...
...
@@ -4133,21 +4166,21 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
if
(
MKV_IS_ID
(
l
,
KaxSegmentUID
)
)
{
segment_uid
=
*
(
new
KaxSegmentUID
(
*
static_cast
<
KaxSegmentUID
*>
(
l
)
));
p_segment_uid
=
new
KaxSegmentUID
(
*
static_cast
<
KaxSegmentUID
*>
(
l
));
msg_Dbg
(
&
sys
.
demuxer
,
"| | + UID=%d"
,
*
(
uint32
*
)
segment_uid
.
GetBuffer
()
);
msg_Dbg
(
&
sys
.
demuxer
,
"| | + UID=%d"
,
*
(
uint32
*
)
p_segment_uid
->
GetBuffer
()
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxPrevUID
)
)
{
p
rev_segment_uid
=
*
(
new
KaxPrevUID
(
*
static_cast
<
KaxPrevUID
*>
(
l
)
));
p
_prev_segment_uid
=
new
KaxPrevUID
(
*
static_cast
<
KaxPrevUID
*>
(
l
));
msg_Dbg
(
&
sys
.
demuxer
,
"| | + PrevUID=%d"
,
*
(
uint32
*
)
p
rev_segment_uid
.
GetBuffer
()
);
msg_Dbg
(
&
sys
.
demuxer
,
"| | + PrevUID=%d"
,
*
(
uint32
*
)
p
_prev_segment_uid
->
GetBuffer
()
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxNextUID
)
)
{
next_segment_uid
=
*
(
new
KaxNextUID
(
*
static_cast
<
KaxNextUID
*>
(
l
)
));
p_next_segment_uid
=
new
KaxNextUID
(
*
static_cast
<
KaxNextUID
*>
(
l
));
msg_Dbg
(
&
sys
.
demuxer
,
"| | + NextUID=%d"
,
*
(
uint32
*
)
next_segment_uid
.
GetBuffer
()
);
msg_Dbg
(
&
sys
.
demuxer
,
"| | + NextUID=%d"
,
*
(
uint32
*
)
p_next_segment_uid
->
GetBuffer
()
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxTimecodeScale
)
)
{
...
...
@@ -4233,7 +4266,7 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslate
)
)
{
KaxChapterTranslate
*
p_trans
=
static_cast
<
KaxChapterTranslate
*>
(
l
);
chapter_translation_c
translated
;
chapter_translation_c
*
p_translate
=
new
chapter_translation_c
()
;
p_trans
->
Read
(
es
,
p_trans
->
Generic
().
Context
,
i_upper_level
,
el
,
true
);
for
(
j
=
0
;
j
<
p_trans
->
ListSize
();
j
++
)
...
...
@@ -4242,19 +4275,19 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateEditionUID
)
)
{
translated
.
editions
.
push_back
(
uint64
(
*
static_cast
<
KaxChapterTranslateEditionUID
*>
(
l
)
)
);
p_translate
->
editions
.
push_back
(
uint64
(
*
static_cast
<
KaxChapterTranslateEditionUID
*>
(
l
)
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateCodec
)
)
{
translated
.
codec_id
=
uint32
(
*
static_cast
<
KaxChapterTranslateCodec
*>
(
l
)
);
p_translate
->
codec_id
=
uint32
(
*
static_cast
<
KaxChapterTranslateCodec
*>
(
l
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateID
)
)
{
translated
.
translated
=
*
(
new
KaxChapterTranslateID
(
*
static_cast
<
KaxChapterTranslateID
*>
(
l
)
)
);
p_translate
->
p_translated
=
new
KaxChapterTranslateID
(
*
static_cast
<
KaxChapterTranslateID
*>
(
l
)
);
}
}
translations
.
push_back
(
translated
);
translations
.
push_back
(
p_translate
);
}
#endif
else
...
...
@@ -4503,6 +4536,7 @@ void matroska_segment_c::InformationCreate( )
{
size_t
i_track
;
if
(
sys
.
meta
==
NULL
)
sys
.
meta
=
vlc_meta_New
();
if
(
psz_title
)
...
...
@@ -4576,7 +4610,7 @@ void matroska_segment_c::InformationCreate( )
void
matroska_segment_c
::
IndexAppendCluster
(
KaxCluster
*
cluster
)
{
#define idx
index
[i_index]
#define idx
p_indexes
[i_index]
idx
.
i_track
=
-
1
;
idx
.
i_block_number
=
-
1
;
idx
.
i_position
=
cluster
->
GetElementPosition
();
...
...
@@ -4587,7 +4621,7 @@ void matroska_segment_c::IndexAppendCluster( KaxCluster *cluster )
if
(
i_index
>=
i_index_max
)
{
i_index_max
+=
1024
;
index
=
(
mkv_index_t
*
)
realloc
(
index
,
sizeof
(
mkv_index_t
)
*
i_index_max
);
p_indexes
=
(
mkv_index_t
*
)
realloc
(
p_indexes
,
sizeof
(
mkv_index_t
)
*
i_index_max
);
}
#undef idx
}
...
...
@@ -4810,7 +4844,7 @@ void demux_sys_t::PreloadLinked( matroska_segment_c *p_segment )
p_title
->
psz_name
=
strdup
(
sz_name
.
c_str
()
);
}
titles
.
push_back
(
*
p_title
);
titles
.
push_back
(
p_title
);
}
}
...
...
@@ -4821,7 +4855,7 @@ 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
)
)
if
(
used_segments
[
i
]
->
FindUID
(
*
segment
.
p_
segment_uid
)
)
return
true
;
}
return
false
;
...
...
@@ -4875,15 +4909,15 @@ bool demux_sys_t::PreparePlayback( virtual_segment_c *p_new_segment )
bool
matroska_segment_c
::
CompareSegmentUIDs
(
const
matroska_segment_c
*
p_item_a
,
const
matroska_segment_c
*
p_item_b
)
{
EbmlBinary
*
p_itema
=
(
EbmlBinary
*
)(
&
p_item_a
->
segment_uid
);
if
(
*
p_itema
==
p_item_b
->
prev_segment_uid
)
EbmlBinary
*
p_itema
=
(
EbmlBinary
*
)(
p_item_a
->
p_
segment_uid
);
if
(
*
p_itema
==
*
p_item_b
->
p_
prev_segment_uid
)
return
true
;
p_itema
=
(
EbmlBinary
*
)(
&
p_item_a
->
next_segment_uid
);
if
(
*
p_itema
==
p_item_b
->
segment_uid
)
p_itema
=
(
EbmlBinary
*
)(
&
p_item_a
->
p_
next_segment_uid
);
if
(
*
p_itema
==
*
p_item_b
->
p_
segment_uid
)
return
true
;
if
(
*
p_itema
==
p_item_b
->
prev_segment_uid
)
if
(
*
p_itema
==
*
p_item_b
->
p_
prev_segment_uid
)
return
true
;
return
false
;
...
...
@@ -4957,7 +4991,7 @@ matroska_segment_c *demux_sys_t::FindSegment( const EbmlBinary & uid ) const
{
for
(
size_t
i
=
0
;
i
<
opened_segments
.
size
();
i
++
)
{
if
(
opened_segments
[
i
]
->
segment_uid
==
uid
)
if
(
*
opened_segments
[
i
]
->
p_
segment_uid
==
uid
)
return
opened_segments
[
i
];
}
return
NULL
;
...
...
@@ -5015,21 +5049,21 @@ size_t virtual_segment_c::AddSegment( matroska_segment_c *p_segment )
// check if it's not already in here
for
(
i
=
0
;
i
<
linked_segments
.
size
();
i
++
)
{
if
(
p_segment
->
segment_uid
==
linked_segments
[
i
]
->
segment_uid
)
if
(
*
p_segment
->
p_segment_uid
==
*
linked_segments
[
i
]
->
p_
segment_uid
)
return
0
;
}
// find possible mates
for
(
i
=
0
;
i
<
linked_uids
.
size
();
i
++
)
{
if
(
p_segment
->
segment_uid
==
linked_uids
[
i
]
||
p_segment
->
prev_segment_uid
==
linked_uids
[
i
]
||
p_segment
->
next_segment_uid
==
linked_uids
[
i
]
)
if
(
(
p_segment
->
p_segment_uid
!=
NULL
&&
*
p_segment
->
p_segment_uid
==
linked_uids
[
i
])
||
(
p_segment
->
p_prev_segment_uid
!=
NULL
&&
*
p_segment
->
p_prev_segment_uid
==
linked_uids
[
i
])
||
(
p_segment
->
p_next_segment_uid
!=
NULL
&&
*
p_segment
->
p_next_segment_uid
==
linked_uids
[
i
])
)
{
linked_segments
.
push_back
(
p_segment
);
AppendUID
(
p_segment
->
prev_segment_uid
);
AppendUID
(
p_segment
->
next_segment_uid
);
AppendUID
(
p_segment
->
p
_p
rev_segment_uid
);
AppendUID
(
p_segment
->
p_
next_segment_uid
);
return
1
;
}
...
...
@@ -5068,17 +5102,19 @@ void virtual_segment_c::LoadCues( )
}
}
void
virtual_segment_c
::
AppendUID
(
const
EbmlBinary
&
UID
)
void
virtual_segment_c
::
AppendUID
(
const
EbmlBinary
*
p_
UID
)
{
if
(
UID
.
GetBuffer
()
==
NULL
)
if
(
p_UID
==
NULL
)
return
;
if
(
p_UID
->
GetBuffer
()
==
NULL
)
return
;
for
(
size_t
i
=
0
;
i
<
linked_uids
.
size
();
i
++
)
{
if
(
UID
==
linked_uids
[
i
]
)
if
(
*
p_
UID
==
linked_uids
[
i
]
)
return
;
}
linked_uids
.
push_back
(
*
(
KaxSegmentUID
*
)(
&
UID
)
);
linked_uids
.
push_back
(
*
(
KaxSegmentUID
*
)(
p_
UID
)
);
}
void
matroska_segment_c
::
Seek
(
mtime_t
i_date
,
mtime_t
i_time_offset
)
...
...
@@ -5098,7 +5134,7 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset )
for
(
;
i_idx
<
i_index
;
i_idx
++
)
{
if
(
index
[
i_idx
].
i_time
+
i_time_offset
>
i_date
)
if
(
p_indexes
[
i_idx
].
i_time
+
i_time_offset
>
i_date
)
{
break
;
}
...
...
@@ -5109,8 +5145,8 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset )
i_idx
--
;
}
i_seek_position
=
index
[
i_idx
].
i_position
;
i_seek_time
=
index
[
i_idx
].
i_time
;
i_seek_position
=
p_indexes
[
i_idx
].
i_position
;
i_seek_time
=
p_indexes
[
i_idx
].
i_time
;
}
msg_Dbg
(
&
sys
.
demuxer
,
"seek got "
I64Fd
" (%d%%)"
,
...
...
@@ -5256,13 +5292,13 @@ void chapter_codec_cmds_c::AddCommand( const KaxChapterProcessCommand & command
switch
(
codec_time
)
{
case
0
:
during_cmds
.
push_back
(
*
p_data
);
during_cmds
.
push_back
(
p_data
);
break
;
case
1
:
enter_cmds
.
push_back
(
*
p_data
);
enter_cmds
.
push_back
(
p_data
);
break
;
case
2
:
leave_cmds
.
push_back
(
*
p_data
);
leave_cmds
.
push_back
(
p_data
);
break
;
default:
delete
p_data
;
...
...
@@ -5360,15 +5396,15 @@ bool chapter_item_c::EnterAndLeave( chapter_item_c *p_item )
bool
dvd_chapter_codec_c
::
Enter
()
{
bool
f_result
=
false
;
std
::
vector
<
KaxChapterProcessData
>::
iterator
index
=
enter_cmds
.
begin
();
std
::
vector
<
KaxChapterProcessData
*
>::
iterator
index
=
enter_cmds
.
begin
();
while
(
index
!=
enter_cmds
.
end
()
)
{
if
(
(
*
index
)
.
GetSize
()
)
if
(
(
*
index
)
->
GetSize
()
)
{
binary
*
p_data
=
(
*
index
)
.
GetBuffer
();
binary
*
p_data
=
(
*
index
)
->
GetBuffer
();
size_t
i_size
=
*
p_data
++
;
// avoid reading too much from the buffer
i_size
=
min
(
i_size
,
((
*
index
)
.
GetSize
()
-
1
)
>>
3
);
i_size
=
min
(
i_size
,
((
*
index
)
->
GetSize
()
-
1
)
>>
3
);
for
(
;
i_size
>
0
;
i_size
--
,
p_data
+=
8
)
{
msg_Dbg
(
&
sys
.
demuxer
,
"Matroska DVD enter command"
);
...
...
@@ -5383,15 +5419,15 @@ bool dvd_chapter_codec_c::Enter()
bool
dvd_chapter_codec_c
::
Leave
()
{
bool
f_result
=
false
;
std
::
vector
<
KaxChapterProcessData
>::
iterator
index
=
leave_cmds
.
begin
();
std
::
vector
<
KaxChapterProcessData
*
>::
iterator
index
=
leave_cmds
.
begin
();
while
(
index
!=
leave_cmds
.
end
()
)
{
if
(
(
*
index
)
.
GetSize
()
)
if
(
(
*
index
)
->
GetSize
()
)
{
binary
*
p_data
=
(
*
index
)
.
GetBuffer
();
binary
*
p_data
=
(
*
index
)
->
GetBuffer
();
size_t
i_size
=
*
p_data
++
;
// avoid reading too much from the buffer
i_size
=
min
(
i_size
,
((
*
index
)
.
GetSize
()
-
1
)
>>
3
);
i_size
=
min
(
i_size
,
((
*
index
)
->
GetSize
()
-
1
)
>>
3
);
for
(
;
i_size
>
0
;
i_size
--
,
p_data
+=
8
)
{
msg_Dbg
(
&
sys
.
demuxer
,
"Matroska DVD leave command"
);
...
...
@@ -5688,18 +5724,18 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
bool
dvd_command_interpretor_c
::
MatchIsDomain
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
return
(
data
.
m_private_data
.
GetBuffer
()[
0
]
==
MATROSKA_DVD_LEVEL_SS
);
return
(
data
.
p_private_data
->
GetBuffer
()[
0
]
==
MATROSKA_DVD_LEVEL_SS
);
}
bool
dvd_command_interpretor_c
::
MatchVTSNumber
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
if
(
i_cookie_size
!=
2
||
data
.
m_private_data
.
GetSize
()
<
4
)
if
(
i_cookie_size
!=
2
||
data
.
p_private_data
==
NULL
||
data
.
p_private_data
->
GetSize
()
<
4
)
return
false
;
if
(
data
.
m_private_data
.
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_SS
||
data
.
m_private_data
.
GetBuffer
()[
1
]
!=
0x80
)
if
(
data
.
p_private_data
->
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_SS
||
data
.
p_private_data
->
GetBuffer
()[
1
]
!=
0x80
)
return
false
;
uint16
i_gtitle
=
(
data
.
m_private_data
.
GetBuffer
()[
2
]
<<
8
)
+
data
.
m_private_data
.
GetBuffer
()[
3
];
uint16
i_gtitle
=
(
data
.
p_private_data
->
GetBuffer
()[
2
]
<<
8
)
+
data
.
p_private_data
->
GetBuffer
()[
3
];
uint16
i_title
=
*
(
uint16
*
)
p_cookie
;
return
(
i_gtitle
==
i_title
);
...
...
@@ -5707,13 +5743,13 @@ bool dvd_command_interpretor_c::MatchVTSNumber( const chapter_codec_cmds_c &data
bool
dvd_command_interpretor_c
::
MatchTitleNumber
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
if
(
i_cookie_size
!=
1
||
data
.
m_private_data
.
GetSize
()
<
4
)
if
(
i_cookie_size
!=
1
||
data
.
p_private_data
==
NULL
||
data
.
p_private_data
->
GetSize
()
<
4
)
return
false
;
if
(
data
.
m_private_data
.
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_TT
)
if
(
data
.
p_private_data
->
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_TT
)
return
false
;
uint16
i_gtitle
=
(
data
.
m_private_data
.
GetBuffer
()[
1
]
<<
8
)
+
data
.
m_private_data
.
GetBuffer
()[
2
];
uint16
i_gtitle
=
(
data
.
p_private_data
->
GetBuffer
()[
1
]
<<
8
)
+
data
.
p_private_data
->
GetBuffer
()[
2
];
uint8
i_title
=
*
(
uint8
*
)
p_cookie
;
return
(
i_gtitle
==
i_title
);
...
...
@@ -5721,13 +5757,13 @@ bool dvd_command_interpretor_c::MatchTitleNumber( const chapter_codec_cmds_c &da
bool
dvd_command_interpretor_c
::
MatchPgcType
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
if
(
i_cookie_size
!=
1
||
data
.
m_private_data
.
GetSize
()
<
8
)
if
(
i_cookie_size
!=
1
||
data
.
p_private_data
==
NULL
||
data
.
p_private_data
->
GetSize
()
<
8
)
return
false
;
if
(
data
.
m_private_data
.
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_PGC
)
if
(
data
.
p_private_data
->
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_PGC
)
return
false
;
uint8
i_pgc_type
=
data
.
m_private_data
.
GetBuffer
()[
3
];
uint8
i_pgc_type
=
data
.
p_private_data
->
GetBuffer
()[
3
];
uint8
i_pgc
=
*
(
uint8
*
)
p_cookie
;
return
(
i_pgc_type
==
i_pgc
);
...
...
@@ -5735,27 +5771,27 @@ bool dvd_command_interpretor_c::MatchPgcType( const chapter_codec_cmds_c &data,
bool
dvd_command_interpretor_c
::
MatchPgcNumber
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
if
(
i_cookie_size
!=
2
||
data
.
m_private_data
.
GetSize
()
<
8
)
if
(
i_cookie_size
!=
2
||
data
.
p_private_data
==
NULL
||
data
.
p_private_data
->
GetSize
()
<
8
)
return
false
;
if
(
data
.
m_private_data
.
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_PGC
)
if
(
data
.
p_private_data
->
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_PGC
)
return
false
;
uint16
*
i_pgc_n
=
(
uint16
*
)
p_cookie
;
uint16
i_pgc_num
=
(
data
.
m_private_data
.
GetBuffer
()[
1
]
<<
8
)
+
data
.
m_private_data
.
GetBuffer
()[
2
];
uint16
i_pgc_num
=
(
data
.
p_private_data
->
GetBuffer
()[
1
]
<<
8
)
+
data
.
p_private_data
->
GetBuffer
()[
2
];
return
(
i_pgc_num
==
*
i_pgc_n
);
}
bool
dvd_command_interpretor_c
::
MatchChapterNumber
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
if
(
i_cookie_size
!=
1
||
data
.
m_private_data
.
GetSize
()
<
2
)
if
(
i_cookie_size
!=
1
||
data
.
p_private_data
==
NULL
||
data
.
p_private_data
->
GetSize
()
<
2
)
return
false
;
if
(
data
.
m_private_data
.
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_PTT
)
if
(
data
.
p_private_data
->
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_PTT
)
return
false
;
uint8
i_chapter
=
data
.
m_private_data
.
GetBuffer
()[
1
];
uint8
i_chapter
=
data
.
p_private_data
->
GetBuffer
()[
1
];
uint8
i_ptt
=
*
(
uint8
*
)
p_cookie
;
return
(
i_chapter
==
i_ptt
);
...
...
@@ -5763,14 +5799,14 @@ bool dvd_command_interpretor_c::MatchChapterNumber( const chapter_codec_cmds_c &
bool
dvd_command_interpretor_c
::
MatchCellNumber
(
const
chapter_codec_cmds_c
&
data
,
const
void
*
p_cookie
,
size_t
i_cookie_size
)
{
if
(
i_cookie_size
!=
1
||
data
.
m_private_data
.
GetSize
()
<
5
)
if
(
i_cookie_size
!=
1
||
data
.
p_private_data
==
NULL
||
data
.
p_private_data
->
GetSize
()
<
5
)
return
false
;
if
(
data
.
m_private_data
.
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_CN
)
if
(
data
.
p_private_data
->
GetBuffer
()[
0
]
!=
MATROSKA_DVD_LEVEL_CN
)
return
false
;
uint8
*
i_cell_n
=
(
uint8
*
)
p_cookie
;
uint8
i_cell_num
=
data
.
m_private_data
.
GetBuffer
()[
3
];
uint8
i_cell_num
=
data
.
p_private_data
->
GetBuffer
()[
3
];
return
(
i_cell_num
==
*
i_cell_n
);
}
...
...
@@ -5778,13 +5814,13 @@ bool dvd_command_interpretor_c::MatchCellNumber( const chapter_codec_cmds_c &dat
bool
matroska_script_codec_c
::
Enter
()
{
bool
f_result
=
false
;
std
::
vector
<
KaxChapterProcessData
>::
iterator
index
=
enter_cmds
.
begin
();
std
::
vector
<
KaxChapterProcessData
*
>::
iterator
index
=
enter_cmds
.
begin
();
while
(
index
!=
enter_cmds
.
end
()
)
{
if
(
(
*
index
)
.
GetSize
()
)
if
(
(
*
index
)
->
GetSize
()
)
{
msg_Dbg
(
&
sys
.
demuxer
,
"Matroska Script enter command"
);
f_result
|=
interpretor
.
Interpret
(
(
*
index
)
.
GetBuffer
(),
(
*
index
).
GetSize
()
);
f_result
|=
interpretor
.
Interpret
(
(
*
index
)
->
GetBuffer
(),
(
*
index
)
->
GetSize
()
);
}
index
++
;
}
...
...
@@ -5794,13 +5830,13 @@ bool matroska_script_codec_c::Enter()
bool
matroska_script_codec_c
::
Leave
()
{
bool
f_result
=
false
;
std
::
vector
<
KaxChapterProcessData
>::
iterator
index
=
leave_cmds
.
begin
();
std
::
vector
<
KaxChapterProcessData
*
>::
iterator
index
=
leave_cmds
.
begin
();
while
(
index
!=
leave_cmds
.
end
()
)
{
if
(
(
*
index
)
.
GetSize
()
)
if
(
(
*
index
)
->
GetSize
()
)
{
msg_Dbg
(
&
sys
.
demuxer
,
"Matroska Script leave command"
);
f_result
|=
interpretor
.
Interpret
(
(
*
index
)
.
GetBuffer
(),
(
*
index
).
GetSize
()
);
f_result
|=
interpretor
.
Interpret
(
(
*
index
)
->
GetBuffer
(),
(
*
index
)
->
GetSize
()
);
}
index
++
;
}
...
...
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