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
d9fa61b1
Commit
d9fa61b1
authored
Apr 02, 2004
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* mkv: demux -> demux2.
parent
d90fad27
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
225 additions
and
266 deletions
+225
-266
modules/demux/mkv.cpp
modules/demux/mkv.cpp
+225
-266
No files found.
modules/demux/mkv.cpp
View file @
d9fa61b1
...
...
@@ -93,9 +93,9 @@ static void Close( vlc_object_t * );
vlc_module_begin
();
set_description
(
_
(
"Matroska stream demuxer"
)
);
set_capability
(
"demux"
,
50
);
set_capability
(
"demux
2
"
,
50
);
set_callbacks
(
Open
,
Close
);
add_bool
(
"mkv-seek-percent"
,
1
,
NULL
,
N_
(
"Seek based on percent not time"
),
N_
(
"Seek based on percent not time"
),
VLC_TRUE
);
...
...
@@ -107,9 +107,9 @@ vlc_module_end();
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
Demux
(
input_thread
_t
*
);
static
int
Control
(
input_thread
_t
*
,
int
,
va_list
);
static
void
Seek
(
input_thread
_t
*
,
mtime_t
i_date
,
int
i_percent
);
static
int
Demux
(
demux
_t
*
);
static
int
Control
(
demux
_t
*
,
int
,
va_list
);
static
void
Seek
(
demux
_t
*
,
mtime_t
i_date
,
int
i_percent
);
/*****************************************************************************
...
...
@@ -261,28 +261,28 @@ struct demux_sys_t
#define MKVD_TIMECODESCALE 1000000
static
void
IndexAppendCluster
(
input_thread_t
*
p_input
,
KaxCluster
*
cluster
);
static
void
IndexAppendCluster
(
demux_t
*
p_demux
,
KaxCluster
*
cluster
);
static
char
*
UTF8ToStr
(
const
UTFstring
&
u
);
static
void
LoadCues
(
input_thread_t
*
);
static
void
InformationsCreate
(
input_thread_t
*
p_input
);
static
void
LoadCues
(
demux_t
*
);
static
void
InformationsCreate
(
demux_t
*
);
/*****************************************************************************
* Open: initializes matroska demux structures
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
input_thread_t
*
p_input
=
(
input_thread_t
*
)
p_this
;
demux_sys_t
*
p_sys
;
uint8_t
*
p_peek
;
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
demux_sys_t
*
p_sys
;
uint8_t
*
p_peek
;
int
i_track
;
int
i_track
;
EbmlElement
*
el
=
NULL
,
*
el1
=
NULL
,
*
el2
=
NULL
,
*
el3
=
NULL
,
*
el4
=
NULL
;
EbmlElement
*
el
=
NULL
,
*
el1
=
NULL
,
*
el2
=
NULL
,
*
el3
=
NULL
,
*
el4
=
NULL
;
/* peek the begining */
if
(
input_Peek
(
p_input
,
&
p_peek
,
4
)
<
4
)
if
(
stream_Peek
(
p_demux
->
s
,
&
p_peek
,
4
)
<
4
)
{
msg_Warn
(
p_
input
,
"cannot peek"
);
msg_Warn
(
p_
demux
,
"cannot peek"
);
return
VLC_EGENERIC
;
}
...
...
@@ -290,20 +290,19 @@ static int Open( vlc_object_t * p_this )
if
(
p_peek
[
0
]
!=
0x1a
||
p_peek
[
1
]
!=
0x45
||
p_peek
[
2
]
!=
0xdf
||
p_peek
[
3
]
!=
0xa3
)
{
msg_Warn
(
p_
input
,
"matroska module discarded "
msg_Warn
(
p_
demux
,
"matroska module discarded "
"(invalid header 0x%.2x%.2x%.2x%.2x)"
,
p_peek
[
0
],
p_peek
[
1
],
p_peek
[
2
],
p_peek
[
3
]
);
return
VLC_EGENERIC
;
}
/* Set the demux function */
p_input
->
pf_demux
=
Demux
;
p_input
->
pf_demux_control
=
Control
;
p_demux
->
pf_demux
=
Demux
;
p_demux
->
pf_control
=
Control
;
p_demux
->
p_sys
=
p_sys
=
(
demux_sys_t
*
)
malloc
(
sizeof
(
demux_sys_t
));
p_input
->
p_demux_data
=
p_sys
=
(
demux_sys_t
*
)
malloc
(
sizeof
(
demux_sys_t
));
memset
(
p_sys
,
0
,
sizeof
(
demux_sys_t
)
);
p_sys
->
in
=
new
vlc_stream_io_callback
(
p_input
->
s
);
p_sys
->
in
=
new
vlc_stream_io_callback
(
p_demux
->
s
);
p_sys
->
es
=
new
EbmlStream
(
*
p_sys
->
in
);
p_sys
->
f_duration
=
-
1
;
p_sys
->
i_timescale
=
MKVD_TIMECODESCALE
;
...
...
@@ -329,7 +328,7 @@ static int Open( vlc_object_t * p_this )
if
(
p_sys
->
es
==
NULL
)
{
msg_Err
(
p_
input
,
"failed to create EbmlStream"
);
msg_Err
(
p_
demux
,
"failed to create EbmlStream"
);
delete
p_sys
->
in
;
free
(
p_sys
);
return
VLC_EGENERIC
;
...
...
@@ -338,10 +337,10 @@ static int Open( vlc_object_t * p_this )
el
=
p_sys
->
es
->
FindNextID
(
EbmlHead
::
ClassInfos
,
0xFFFFFFFFL
);
if
(
el
==
NULL
)
{
msg_Err
(
p_
input
,
"cannot find EbmlHead"
);
msg_Err
(
p_
demux
,
"cannot find EbmlHead"
);
goto
error
;
}
msg_Dbg
(
p_
input
,
"EbmlHead"
);
msg_Dbg
(
p_
demux
,
"EbmlHead"
);
/* skip it */
el
->
SkipData
(
*
p_sys
->
es
,
el
->
Generic
().
Context
);
delete
el
;
...
...
@@ -350,10 +349,10 @@ static int Open( vlc_object_t * p_this )
el
=
p_sys
->
es
->
FindNextID
(
KaxSegment
::
ClassInfos
,
0xFFFFFFFFL
);
if
(
el
==
NULL
)
{
msg_Err
(
p_
input
,
"cannot find KaxSegment"
);
msg_Err
(
p_
demux
,
"cannot find KaxSegment"
);
goto
error
;
}
msg_Dbg
(
p_
input
,
"+ Segment"
);
msg_Dbg
(
p_
demux
,
"+ Segment"
);
p_sys
->
segment
=
(
KaxSegment
*
)
el
;
p_sys
->
cluster
=
NULL
;
...
...
@@ -363,7 +362,7 @@ static int Open( vlc_object_t * p_this )
{
if
(
EbmlId
(
*
el1
)
==
KaxInfo
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Informations"
);
msg_Dbg
(
p_
demux
,
"| + Informations"
);
p_sys
->
ep
->
Down
();
while
(
(
el2
=
p_sys
->
ep
->
Get
()
)
!=
NULL
)
...
...
@@ -375,7 +374,7 @@ static int Open( vlc_object_t * p_this )
tcs
.
ReadData
(
p_sys
->
es
->
I_O
()
);
p_sys
->
i_timescale
=
uint64
(
tcs
);
msg_Dbg
(
p_
input
,
"| | + TimecodeScale="
I64Fd
,
msg_Dbg
(
p_
demux
,
"| | + TimecodeScale="
I64Fd
,
p_sys
->
i_timescale
);
}
else
if
(
EbmlId
(
*
el2
)
==
KaxDuration
::
ClassInfos
.
GlobalId
)
...
...
@@ -385,7 +384,7 @@ static int Open( vlc_object_t * p_this )
dur
.
ReadData
(
p_sys
->
es
->
I_O
()
);
p_sys
->
f_duration
=
float
(
dur
);
msg_Dbg
(
p_
input
,
"| | + Duration=%f"
,
msg_Dbg
(
p_
demux
,
"| | + Duration=%f"
,
p_sys
->
f_duration
);
}
else
if
(
EbmlId
(
*
el2
)
==
KaxMuxingApp
::
ClassInfos
.
GlobalId
)
...
...
@@ -396,7 +395,7 @@ static int Open( vlc_object_t * p_this )
p_sys
->
psz_muxing_application
=
UTF8ToStr
(
UTFstring
(
mapp
)
);
msg_Dbg
(
p_
input
,
"| | + Muxing Application=%s"
,
msg_Dbg
(
p_
demux
,
"| | + Muxing Application=%s"
,
p_sys
->
psz_muxing_application
);
}
else
if
(
EbmlId
(
*
el2
)
==
KaxWritingApp
::
ClassInfos
.
GlobalId
)
...
...
@@ -407,7 +406,7 @@ static int Open( vlc_object_t * p_this )
p_sys
->
psz_writing_application
=
UTF8ToStr
(
UTFstring
(
wapp
)
);
msg_Dbg
(
p_
input
,
"| | + Writing Application=%s"
,
msg_Dbg
(
p_
demux
,
"| | + Writing Application=%s"
,
p_sys
->
psz_writing_application
);
}
else
if
(
EbmlId
(
*
el2
)
==
KaxSegmentFilename
::
ClassInfos
.
GlobalId
)
...
...
@@ -418,7 +417,7 @@ static int Open( vlc_object_t * p_this )
p_sys
->
psz_segment_filename
=
UTF8ToStr
(
UTFstring
(
sfn
)
);
msg_Dbg
(
p_
input
,
"| | + Segment Filename=%s"
,
msg_Dbg
(
p_
demux
,
"| | + Segment Filename=%s"
,
p_sys
->
psz_segment_filename
);
}
else
if
(
EbmlId
(
*
el2
)
==
KaxTitle
::
ClassInfos
.
GlobalId
)
...
...
@@ -429,7 +428,7 @@ static int Open( vlc_object_t * p_this )
p_sys
->
psz_title
=
UTF8ToStr
(
UTFstring
(
title
)
);
msg_Dbg
(
p_
input
,
"| | + Title=%s"
,
p_sys
->
psz_title
);
msg_Dbg
(
p_
demux
,
"| | + Title=%s"
,
p_sys
->
psz_title
);
}
#if defined( HAVE_GMTIME_R ) && !defined( SYS_DARWIN )
else
if
(
EbmlId
(
*
el2
)
==
KaxDateUTC
::
ClassInfos
.
GlobalId
)
...
...
@@ -448,27 +447,27 @@ static int Open( vlc_object_t * p_this )
{
buffer
[
strlen
(
buffer
)
-
1
]
=
'\0'
;
p_sys
->
psz_date_utc
=
strdup
(
buffer
);
msg_Dbg
(
p_
input
,
"| | + Date=%s"
,
p_sys
->
psz_date_utc
);
msg_Dbg
(
p_
demux
,
"| | + Date=%s"
,
p_sys
->
psz_date_utc
);
}
}
#endif
else
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
typeid
(
*
el2
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el2
).
name
()
);
}
}
p_sys
->
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el1
)
==
KaxTracks
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Tracks"
);
msg_Dbg
(
p_
demux
,
"| + Tracks"
);
p_sys
->
ep
->
Down
();
while
(
(
el2
=
p_sys
->
ep
->
Get
()
)
!=
NULL
)
{
if
(
EbmlId
(
*
el2
)
==
KaxTrackEntry
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| | + Track Entry"
);
msg_Dbg
(
p_
demux
,
"| | + Track Entry"
);
p_sys
->
i_track
++
;
p_sys
->
track
=
(
mkv_track_t
*
)
realloc
(
p_sys
->
track
,
sizeof
(
mkv_track_t
)
*
(
p_sys
->
i_track
+
1
)
);
...
...
@@ -507,7 +506,7 @@ static int Open( vlc_object_t * p_this )
tnum
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
i_number
=
uint32
(
tnum
);
msg_Dbg
(
p_
input
,
"| | | + Track Number=%u"
,
msg_Dbg
(
p_
demux
,
"| | | + Track Number=%u"
,
uint32
(
tnum
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackUID
::
ClassInfos
.
GlobalId
)
...
...
@@ -515,7 +514,7 @@ static int Open( vlc_object_t * p_this )
KaxTrackUID
&
tuid
=
*
(
KaxTrackUID
*
)
el3
;
tuid
.
ReadData
(
p_sys
->
es
->
I_O
()
);
msg_Dbg
(
p_
input
,
"| | | + Track UID=%u"
,
msg_Dbg
(
p_
demux
,
"| | | + Track UID=%u"
,
uint32
(
tuid
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackType
::
ClassInfos
.
GlobalId
)
...
...
@@ -543,7 +542,7 @@ static int Open( vlc_object_t * p_this )
break
;
}
msg_Dbg
(
p_
input
,
"| | | + Track Type=%s"
,
msg_Dbg
(
p_
demux
,
"| | | + Track Type=%s"
,
psz_type
);
}
// else if( EbmlId( *el3 ) == KaxTrackFlagEnabled::ClassInfos.GlobalId )
...
...
@@ -552,7 +551,7 @@ static int Open( vlc_object_t * p_this )
// fenb.ReadData( p_sys->es->I_O() );
// tk.b_enabled = uint32( fenb );
// msg_Dbg( p_
input
, "| | | + Track Enabled=%u",
// msg_Dbg( p_
demux
, "| | | + Track Enabled=%u",
// uint32( fenb ) );
// }
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackFlagDefault
::
ClassInfos
.
GlobalId
)
...
...
@@ -561,7 +560,7 @@ static int Open( vlc_object_t * p_this )
fdef
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
b_default
=
uint32
(
fdef
);
msg_Dbg
(
p_
input
,
"| | | + Track Default=%u"
,
msg_Dbg
(
p_
demux
,
"| | | + Track Default=%u"
,
uint32
(
fdef
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackFlagLacing
::
ClassInfos
.
GlobalId
)
...
...
@@ -569,7 +568,7 @@ static int Open( vlc_object_t * p_this )
KaxTrackFlagLacing
&
lac
=
*
(
KaxTrackFlagLacing
*
)
el3
;
lac
.
ReadData
(
p_sys
->
es
->
I_O
()
);
msg_Dbg
(
p_
input
,
"| | | + Track Lacing=%d"
,
msg_Dbg
(
p_
demux
,
"| | | + Track Lacing=%d"
,
uint32
(
lac
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackMinCache
::
ClassInfos
.
GlobalId
)
...
...
@@ -577,7 +576,7 @@ static int Open( vlc_object_t * p_this )
KaxTrackMinCache
&
cmin
=
*
(
KaxTrackMinCache
*
)
el3
;
cmin
.
ReadData
(
p_sys
->
es
->
I_O
()
);
msg_Dbg
(
p_
input
,
"| | | + Track MinCache=%d"
,
msg_Dbg
(
p_
demux
,
"| | | + Track MinCache=%d"
,
uint32
(
cmin
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackMaxCache
::
ClassInfos
.
GlobalId
)
...
...
@@ -585,7 +584,7 @@ static int Open( vlc_object_t * p_this )
KaxTrackMaxCache
&
cmax
=
*
(
KaxTrackMaxCache
*
)
el3
;
cmax
.
ReadData
(
p_sys
->
es
->
I_O
()
);
msg_Dbg
(
p_
input
,
"| | | + Track MaxCache=%d"
,
msg_Dbg
(
p_
demux
,
"| | | + Track MaxCache=%d"
,
uint32
(
cmax
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackDefaultDuration
::
ClassInfos
.
GlobalId
)
...
...
@@ -594,7 +593,7 @@ static int Open( vlc_object_t * p_this )
defd
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
i_default_duration
=
uint64
(
defd
);
msg_Dbg
(
p_
input
,
"| | | + Track Default Duration="
I64Fd
,
uint64
(
defd
)
);
msg_Dbg
(
p_
demux
,
"| | | + Track Default Duration="
I64Fd
,
uint64
(
defd
)
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackTimecodeScale
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -602,7 +601,7 @@ static int Open( vlc_object_t * p_this )
ttcs
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
f_timecodescale
=
float
(
ttcs
);
msg_Dbg
(
p_
input
,
"| | | + Track TimeCodeScale=%f"
,
tk
.
f_timecodescale
);
msg_Dbg
(
p_
demux
,
"| | | + Track TimeCodeScale=%f"
,
tk
.
f_timecodescale
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackName
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -610,7 +609,7 @@ static int Open( vlc_object_t * p_this )
tname
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
psz_description
=
UTF8ToStr
(
UTFstring
(
tname
)
);
msg_Dbg
(
p_
input
,
"| | | + Track Name=%s"
,
msg_Dbg
(
p_
demux
,
"| | | + Track Name=%s"
,
tk
.
fmt
.
psz_description
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackLanguage
::
ClassInfos
.
GlobalId
)
...
...
@@ -619,7 +618,7 @@ static int Open( vlc_object_t * p_this )
lang
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
psz_language
=
strdup
(
string
(
lang
).
c_str
()
);
msg_Dbg
(
p_
input
,
msg_Dbg
(
p_
demux
,
"| | | + Track Language=`%s'"
,
tk
.
fmt
.
psz_language
);
}
...
...
@@ -629,7 +628,7 @@ static int Open( vlc_object_t * p_this )
codecid
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
psz_codec
=
strdup
(
string
(
codecid
).
c_str
()
);
msg_Dbg
(
p_
input
,
"| | | + Track CodecId=%s"
,
msg_Dbg
(
p_
demux
,
"| | | + Track CodecId=%s"
,
string
(
codecid
).
c_str
()
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxCodecPrivate
::
ClassInfos
.
GlobalId
)
...
...
@@ -643,7 +642,7 @@ static int Open( vlc_object_t * p_this )
tk
.
p_extra_data
=
(
uint8_t
*
)
malloc
(
tk
.
i_extra_data
);
memcpy
(
tk
.
p_extra_data
,
cpriv
.
GetBuffer
(),
tk
.
i_extra_data
);
}
msg_Dbg
(
p_
input
,
"| | | + Track CodecPrivate size="
I64Fd
,
cpriv
.
GetSize
()
);
msg_Dbg
(
p_
demux
,
"| | | + Track CodecPrivate size="
I64Fd
,
cpriv
.
GetSize
()
);
}
else
if
(
EbmlId
(
*
el3
)
==
KaxCodecName
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -651,7 +650,7 @@ static int Open( vlc_object_t * p_this )
cname
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
psz_codec_name
=
UTF8ToStr
(
UTFstring
(
cname
)
);
msg_Dbg
(
p_
input
,
"| | | + Track Codec Name=%s"
,
tk
.
psz_codec_name
);
msg_Dbg
(
p_
demux
,
"| | | + Track Codec Name=%s"
,
tk
.
psz_codec_name
);
}
// else if( EbmlId( *el3 ) == KaxCodecSettings::ClassInfos.GlobalId )
// {
...
...
@@ -659,7 +658,7 @@ static int Open( vlc_object_t * p_this )
// cset.ReadData( p_sys->es->I_O() );
// tk.psz_codec_settings = UTF8ToStr( UTFstring( cset ) );
// msg_Dbg( p_
input
, "| | | + Track Codec Settings=%s", tk.psz_codec_settings );
// msg_Dbg( p_
demux
, "| | | + Track Codec Settings=%s", tk.psz_codec_settings );
// }
// else if( EbmlId( *el3 ) == KaxCodecInfoURL::ClassInfos.GlobalId )
// {
...
...
@@ -667,7 +666,7 @@ static int Open( vlc_object_t * p_this )
// ciurl.ReadData( p_sys->es->I_O() );
// tk.psz_codec_info_url = strdup( string( ciurl ).c_str() );
// msg_Dbg( p_
input
, "| | | + Track Codec Info URL=%s", tk.psz_codec_info_url );
// msg_Dbg( p_
demux
, "| | | + Track Codec Info URL=%s", tk.psz_codec_info_url );
// }
// else if( EbmlId( *el3 ) == KaxCodecDownloadURL::ClassInfos.GlobalId )
// {
...
...
@@ -675,25 +674,25 @@ static int Open( vlc_object_t * p_this )
// cdurl.ReadData( p_sys->es->I_O() );
// tk.psz_codec_download_url = strdup( string( cdurl ).c_str() );
// msg_Dbg( p_
input
, "| | | + Track Codec Info URL=%s", tk.psz_codec_download_url );
// msg_Dbg( p_
demux
, "| | | + Track Codec Info URL=%s", tk.psz_codec_download_url );
// }
// else if( EbmlId( *el3 ) == KaxCodecDecodeAll::ClassInfos.GlobalId )
// {
// KaxCodecDecodeAll &cdall = *(KaxCodecDecodeAll*)el3;
// cdall.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, "| | | + Track Codec Decode All=%u <== UNUSED", uint8( cdall ) );
// msg_Dbg( p_
demux
, "| | | + Track Codec Decode All=%u <== UNUSED", uint8( cdall ) );
// }
// else if( EbmlId( *el3 ) == KaxTrackOverlay::ClassInfos.GlobalId )
// {
// KaxTrackOverlay &tovr = *(KaxTrackOverlay*)el3;
// tovr.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, "| | | + Track Overlay=%u <== UNUSED", uint32( tovr ) );
// msg_Dbg( p_
demux
, "| | | + Track Overlay=%u <== UNUSED", uint32( tovr ) );
// }
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackVideo
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| | | + Track Video"
);
msg_Dbg
(
p_
demux
,
"| | | + Track Video"
);
tk
.
f_fps
=
0.0
;
p_sys
->
ep
->
Down
();
...
...
@@ -705,14 +704,14 @@ static int Open( vlc_object_t * p_this )
// KaxVideoFlagInterlaced &fint = *(KaxVideoFlagInterlaced*)el4;
// fint.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, "| | | | + Track Video Interlaced=%u", uint8( fint ) );
// msg_Dbg( p_
demux
, "| | | | + Track Video Interlaced=%u", uint8( fint ) );
// }
// else if( EbmlId( *el4 ) == KaxVideoStereoMode::ClassInfos.GlobalId )
// {
// KaxVideoStereoMode &stereo = *(KaxVideoStereoMode*)el4;
// stereo.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, "| | | | + Track Video Stereo Mode=%u", uint8( stereo ) );
// msg_Dbg( p_
demux
, "| | | | + Track Video Stereo Mode=%u", uint8( stereo ) );
// }
// else
if
(
EbmlId
(
*
el4
)
==
KaxVideoPixelWidth
::
ClassInfos
.
GlobalId
)
...
...
@@ -721,7 +720,7 @@ static int Open( vlc_object_t * p_this )
vwidth
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
video
.
i_width
=
uint16
(
vwidth
);
msg_Dbg
(
p_
input
,
"| | | | + width=%d"
,
uint16
(
vwidth
)
);
msg_Dbg
(
p_
demux
,
"| | | | + width=%d"
,
uint16
(
vwidth
)
);
}
else
if
(
EbmlId
(
*
el4
)
==
KaxVideoPixelHeight
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -729,7 +728,7 @@ static int Open( vlc_object_t * p_this )
vheight
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
video
.
i_height
=
uint16
(
vheight
);
msg_Dbg
(
p_
input
,
"| | | | + height=%d"
,
uint16
(
vheight
)
);
msg_Dbg
(
p_
demux
,
"| | | | + height=%d"
,
uint16
(
vheight
)
);
}
else
if
(
EbmlId
(
*
el4
)
==
KaxVideoDisplayWidth
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -737,7 +736,7 @@ static int Open( vlc_object_t * p_this )
vwidth
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
video
.
i_visible_width
=
uint16
(
vwidth
);
msg_Dbg
(
p_
input
,
"| | | | + display width=%d"
,
uint16
(
vwidth
)
);
msg_Dbg
(
p_
demux
,
"| | | | + display width=%d"
,
uint16
(
vwidth
)
);
}
else
if
(
EbmlId
(
*
el4
)
==
KaxVideoDisplayHeight
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -745,7 +744,7 @@ static int Open( vlc_object_t * p_this )
vheight
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
video
.
i_visible_height
=
uint16
(
vheight
);
msg_Dbg
(
p_
input
,
"| | | | + display height=%d"
,
uint16
(
vheight
)
);
msg_Dbg
(
p_
demux
,
"| | | | + display height=%d"
,
uint16
(
vheight
)
);
}
else
if
(
EbmlId
(
*
el4
)
==
KaxVideoFrameRate
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -753,14 +752,14 @@ static int Open( vlc_object_t * p_this )
vfps
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
f_fps
=
float
(
vfps
);
msg_Dbg
(
p_
input
,
" | | | + fps=%f"
,
float
(
vfps
)
);
msg_Dbg
(
p_
demux
,
" | | | + fps=%f"
,
float
(
vfps
)
);
}
// else if( EbmlId( *el4 ) == KaxVideoDisplayUnit::ClassInfos.GlobalId )
// {
// KaxVideoDisplayUnit &vdmode = *(KaxVideoDisplayUnit*)el4;
// vdmode.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, "| | | | + Track Video Display Unit=%s",
// msg_Dbg( p_
demux
, "| | | | + Track Video Display Unit=%s",
// uint8( vdmode ) == 0 ? "pixels" : ( uint8( vdmode ) == 1 ? "centimeters": "inches" ) );
// }
// else if( EbmlId( *el4 ) == KaxVideoAspectRatio::ClassInfos.GlobalId )
...
...
@@ -768,25 +767,25 @@ static int Open( vlc_object_t * p_this )
// KaxVideoAspectRatio &ratio = *(KaxVideoAspectRatio*)el4;
// ratio.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, " | | | + Track Video Aspect Ratio Type=%u", uint8( ratio ) );
// msg_Dbg( p_
demux
, " | | | + Track Video Aspect Ratio Type=%u", uint8( ratio ) );
// }
// else if( EbmlId( *el4 ) == KaxVideoGamma::ClassInfos.GlobalId )
// {
// KaxVideoGamma &gamma = *(KaxVideoGamma*)el4;
// gamma.ReadData( p_sys->es->I_O() );
// msg_Dbg( p_
input
, " | | | + fps=%f", float( gamma ) );
// msg_Dbg( p_
demux
, " | | | + fps=%f", float( gamma ) );
// }
else
{
msg_Dbg
(
p_
input
,
"| | | | + Unknown (%s)"
,
typeid
(
*
el4
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | | | + Unknown (%s)"
,
typeid
(
*
el4
).
name
()
);
}
}
p_sys
->
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el3
)
==
KaxTrackAudio
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| | | + Track Audio"
);
msg_Dbg
(
p_
demux
,
"| | | + Track Audio"
);
p_sys
->
ep
->
Down
();
...
...
@@ -798,7 +797,7 @@ static int Open( vlc_object_t * p_this )
afreq
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
audio
.
i_rate
=
(
int
)
float
(
afreq
);
msg_Dbg
(
p_
input
,
"| | | | + afreq=%d"
,
tk
.
fmt
.
audio
.
i_rate
);
msg_Dbg
(
p_
demux
,
"| | | | + afreq=%d"
,
tk
.
fmt
.
audio
.
i_rate
);
}
else
if
(
EbmlId
(
*
el4
)
==
KaxAudioChannels
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -806,7 +805,7 @@ static int Open( vlc_object_t * p_this )
achan
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
audio
.
i_channels
=
uint8
(
achan
);
msg_Dbg
(
p_
input
,
"| | | | + achan=%u"
,
uint8
(
achan
)
);
msg_Dbg
(
p_
demux
,
"| | | | + achan=%u"
,
uint8
(
achan
)
);
}
else
if
(
EbmlId
(
*
el4
)
==
KaxAudioBitDepth
::
ClassInfos
.
GlobalId
)
{
...
...
@@ -814,18 +813,18 @@ static int Open( vlc_object_t * p_this )
abits
.
ReadData
(
p_sys
->
es
->
I_O
()
);
tk
.
fmt
.
audio
.
i_bitspersample
=
uint8
(
abits
);
msg_Dbg
(
p_
input
,
"| | | | + abits=%u"
,
uint8
(
abits
)
);
msg_Dbg
(
p_
demux
,
"| | | | + abits=%u"
,
uint8
(
abits
)
);
}
else
{
msg_Dbg
(
p_
input
,
"| | | | + Unknown (%s)"
,
typeid
(
*
el4
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | | | + Unknown (%s)"
,
typeid
(
*
el4
).
name
()
);
}
}
p_sys
->
ep
->
Up
();
}
else
{
msg_Dbg
(
p_
input
,
"| | | + Unknown (%s)"
,
msg_Dbg
(
p_
demux
,
"| | | + Unknown (%s)"
,
typeid
(
*
el3
).
name
()
);
}
}
...
...
@@ -833,7 +832,7 @@ static int Open( vlc_object_t * p_this )
}
else
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el2
).
name
()
);
}
#undef tk
...
...
@@ -842,7 +841,7 @@ static int Open( vlc_object_t * p_this )
}
else
if
(
EbmlId
(
*
el1
)
==
KaxSeekHead
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Seek head"
);
msg_Dbg
(
p_
demux
,
"| + Seek head"
);
p_sys
->
ep
->
Down
();
while
(
(
el
=
p_sys
->
ep
->
Get
()
)
!=
NULL
)
{
...
...
@@ -851,7 +850,7 @@ static int Open( vlc_object_t * p_this )
EbmlId
id
=
EbmlVoid
::
ClassInfos
.
GlobalId
;
int64_t
i_pos
=
-
1
;
//msg_Dbg( p_
input
, "| | + Seek" );
//msg_Dbg( p_
demux
, "| | + Seek" );
p_sys
->
ep
->
Down
();
while
(
(
el
=
p_sys
->
ep
->
Get
()
)
!=
NULL
)
{
...
...
@@ -873,7 +872,7 @@ static int Open( vlc_object_t * p_this )
}
else
{
msg_Dbg
(
p_
input
,
"| | | + Unknown (%s)"
,
msg_Dbg
(
p_
demux
,
"| | | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
...
...
@@ -883,19 +882,19 @@ static int Open( vlc_object_t * p_this )
{
if
(
id
==
KaxCues
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| | | = cues at "
I64Fd
,
msg_Dbg
(
p_
demux
,
"| | | = cues at "
I64Fd
,
i_pos
);
p_sys
->
i_cues_position
=
p_sys
->
segment
->
GetGlobalPosition
(
i_pos
);
}
else
if
(
id
==
KaxChapters
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| | | = chapters at "
I64Fd
,
msg_Dbg
(
p_
demux
,
"| | | = chapters at "
I64Fd
,
i_pos
);
p_sys
->
i_chapters_position
=
p_sys
->
segment
->
GetGlobalPosition
(
i_pos
);
}
else
if
(
id
==
KaxTags
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| | | = tags at "
I64Fd
,
msg_Dbg
(
p_
demux
,
"| | | = tags at "
I64Fd
,
i_pos
);
p_sys
->
i_tags_position
=
p_sys
->
segment
->
GetGlobalPosition
(
i_pos
);
}
...
...
@@ -904,7 +903,7 @@ static int Open( vlc_object_t * p_this )
}
else
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
...
...
@@ -912,11 +911,11 @@ static int Open( vlc_object_t * p_this )
}
else
if
(
EbmlId
(
*
el1
)
==
KaxCues
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Cues"
);
msg_Dbg
(
p_
demux
,
"| + Cues"
);
}
else
if
(
EbmlId
(
*
el1
)
==
KaxCluster
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Cluster"
);
msg_Dbg
(
p_
demux
,
"| + Cluster"
);
p_sys
->
cluster
=
(
KaxCluster
*
)
el1
;
...
...
@@ -930,31 +929,31 @@ static int Open( vlc_object_t * p_this )
else
if
(
EbmlId
(
*
el1
)
==
KaxAttachements
::
ClassInfos
.
GlobalId
)
#endif
{
msg_Dbg
(
p_
input
,
"| + Attachments FIXME TODO (but probably never supported)"
);
msg_Dbg
(
p_
demux
,
"| + Attachments FIXME TODO (but probably never supported)"
);
}
else
if
(
EbmlId
(
*
el1
)
==
KaxChapters
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Chapters FIXME TODO"
);
msg_Dbg
(
p_
demux
,
"| + Chapters FIXME TODO"
);
}
else
if
(
EbmlId
(
*
el1
)
==
KaxTag
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Tags FIXME TODO"
);
msg_Dbg
(
p_
demux
,
"| + Tags FIXME TODO"
);
}
else
{
msg_Dbg
(
p_
input
,
"| + Unknown (%s)"
,
typeid
(
*
el1
).
name
()
);
msg_Dbg
(
p_
demux
,
"| + Unknown (%s)"
,
typeid
(
*
el1
).
name
()
);
}
}
if
(
p_sys
->
cluster
==
NULL
)
{
msg_Err
(
p_
input
,
"cannot find any cluster, damaged file ?"
);
msg_Err
(
p_
demux
,
"cannot find any cluster, damaged file ?"
);
goto
error
;
}
if
(
p_sys
->
i_chapters_position
>=
0
)
{
msg_Warn
(
p_
input
,
"chapters unsupported"
);
msg_Warn
(
p_
demux
,
"chapters unsupported"
);
}
/* *** Load the cue if found *** */
...
...
@@ -962,65 +961,39 @@ static int Open( vlc_object_t * p_this )
{
vlc_bool_t
b_seekable
;
stream_Control
(
p_
input
->
s
,
STREAM_CAN_FASTSEEK
,
&
b_seekable
);
stream_Control
(
p_
demux
->
s
,
STREAM_CAN_FASTSEEK
,
&
b_seekable
);
if
(
b_seekable
)
{
LoadCues
(
p_
input
);
LoadCues
(
p_
demux
);
}
}
if
(
!
p_sys
->
b_cues
||
p_sys
->
i_index
<=
0
)
{
msg_Warn
(
p_
input
,
"no cues/empty cues found->seek won't be precise"
);
msg_Warn
(
p_
demux
,
"no cues/empty cues found->seek won't be precise"
);
IndexAppendCluster
(
p_
input
,
p_sys
->
cluster
);
IndexAppendCluster
(
p_
demux
,
p_sys
->
cluster
);
p_sys
->
b_cues
=
VLC_FALSE
;
}
/* Create one program */
vlc_mutex_lock
(
&
p_input
->
stream
.
stream_lock
);
if
(
input_InitStream
(
p_input
,
0
)
==
-
1
)
{
vlc_mutex_unlock
(
&
p_input
->
stream
.
stream_lock
);
msg_Err
(
p_input
,
"cannot init stream"
);
goto
error
;
}
p_input
->
stream
.
i_mux_rate
=
0
;
vlc_mutex_unlock
(
&
p_input
->
stream
.
stream_lock
);
if
(
p_sys
->
f_duration
>
1001.0
)
{
mtime_t
i_duration
=
(
mtime_t
)(
p_sys
->
f_duration
/
1000.0
);
p_input
->
stream
.
i_mux_rate
=
stream_Size
(
p_input
->
s
)
/
50
/
i_duration
;
}
/* add all es */
msg_Dbg
(
p_
input
,
"found %d es"
,
p_sys
->
i_track
);
msg_Dbg
(
p_
demux
,
"found %d es"
,
p_sys
->
i_track
);
for
(
i_track
=
0
;
i_track
<
p_sys
->
i_track
;
i_track
++
)
{
#define tk p_sys->track[i_track]
if
(
tk
.
fmt
.
i_cat
==
UNKNOWN_ES
)
{
msg_Warn
(
p_
input
,
"invalid track[%d, n=%d]"
,
i_track
,
tk
.
i_number
);
msg_Warn
(
p_
demux
,
"invalid track[%d, n=%d]"
,
i_track
,
tk
.
i_number
);
tk
.
p_es
=
NULL
;
continue
;
}
if
(
tk
.
fmt
.
i_cat
==
SPU_ES
)
{
vlc_value_t
val
;
val
.
psz_string
=
"UTF-8"
;
#if defined(HAVE_ICONV)
var_Create
(
p_input
,
"subsdec-encoding"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Set
(
p_input
,
"subsdec-encoding"
,
val
);
#endif
}
if
(
!
strcmp
(
tk
.
psz_codec
,
"V_MS/VFW/FOURCC"
)
)
{
if
(
tk
.
i_extra_data
<
(
int
)
sizeof
(
BITMAPINFOHEADER
)
)
{
msg_Err
(
p_
input
,
"missing/invalid BITMAPINFOHEADER"
);
msg_Err
(
p_
demux
,
"missing/invalid BITMAPINFOHEADER"
);
tk
.
fmt
.
i_codec
=
VLC_FOURCC
(
'u'
,
'n'
,
'd'
,
'f'
);
}
else
...
...
@@ -1059,7 +1032,7 @@ static int Open( vlc_object_t * p_this )
{
if
(
tk
.
i_extra_data
<
(
int
)
sizeof
(
WAVEFORMATEX
)
)
{
msg_Err
(
p_
input
,
"missing/invalid WAVEFORMATEX"
);
msg_Err
(
p_
demux
,
"missing/invalid WAVEFORMATEX"
);
tk
.
fmt
.
i_codec
=
VLC_FOURCC
(
'u'
,
'n'
,
'd'
,
'f'
);
}
else
...
...
@@ -1146,7 +1119,7 @@ static int Open( vlc_object_t * p_this )
break
;
}
}
msg_Dbg
(
p_
input
,
"profile=%d srate=%d"
,
i_profile
,
i_srate
);
msg_Dbg
(
p_
demux
,
"profile=%d srate=%d"
,
i_profile
,
i_srate
);
tk
.
fmt
.
i_extra
=
2
;
tk
.
fmt
.
p_extra
=
malloc
(
tk
.
fmt
.
i_extra
);
...
...
@@ -1170,18 +1143,14 @@ static int Open( vlc_object_t * p_this )
else
if
(
!
strcmp
(
tk
.
psz_codec
,
"S_TEXT/UTF8"
)
)
{
tk
.
fmt
.
i_codec
=
VLC_FOURCC
(
's'
,
'u'
,
'b'
,
't'
);
tk
.
fmt
.
subs
.
psz_encoding
=
strdup
(
"UTF-8"
);
}
else
if
(
!
strcmp
(
tk
.
psz_codec
,
"S_TEXT/SSA"
)
||
!
strcmp
(
tk
.
psz_codec
,
"S_SSA"
)
||
!
strcmp
(
tk
.
psz_codec
,
"S_ASS"
))
{
tk
.
fmt
.
i_codec
=
VLC_FOURCC
(
's'
,
's'
,
'a'
,
' '
);
#if 0
/* FIXME */
tk.fmt.i_extra = sizeof( subtitle_data_t );
tk.fmt.p_extra = malloc( tk.fmt.i_extra );
((es_sys_t*)tk->fmt.p_extra)->psz_header = strdup( (char *)tk.p_extra_data );
#endif
tk
.
fmt
.
subs
.
psz_encoding
=
strdup
(
"UTF-8"
);
}
else
if
(
!
strcmp
(
tk
.
psz_codec
,
"S_VOBSUB"
)
)
{
...
...
@@ -1189,16 +1158,16 @@ static int Open( vlc_object_t * p_this )
}
else
{
msg_Err
(
p_
input
,
"unknow codec id=`%s'"
,
tk
.
psz_codec
);
msg_Err
(
p_
demux
,
"unknow codec id=`%s'"
,
tk
.
psz_codec
);
tk
.
fmt
.
i_codec
=
VLC_FOURCC
(
'u'
,
'n'
,
'd'
,
'f'
);
}
tk
.
p_es
=
es_out_Add
(
p_
input
->
p_es_
out
,
&
tk
.
fmt
);
tk
.
p_es
=
es_out_Add
(
p_
demux
->
out
,
&
tk
.
fmt
);
#undef tk
}
/* add informations */
InformationsCreate
(
p_
input
);
InformationsCreate
(
p_
demux
);
return
VLC_SUCCESS
;
...
...
@@ -1214,10 +1183,9 @@ error:
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
input_thread_t
*
p_input
=
(
input_thread_t
*
)
p_this
;
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
int
i_track
;
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
int
i_track
;
for
(
i_track
=
0
;
i_track
<
p_sys
->
i_track
;
i_track
++
)
{
...
...
@@ -1259,10 +1227,11 @@ static void Close( vlc_object_t *p_this )
/*****************************************************************************
* Control:
*****************************************************************************/
static
int
Control
(
input_thread_t
*
p_input
,
int
i_query
,
va_list
args
)
static
int
Control
(
demux_t
*
p_demux
,
int
i_query
,
va_list
args
)
{
demux_sys_t
*
p_sys
=
p_
input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_
demux
->
p_sys
;
int64_t
*
pi64
;
double
*
pf
,
f
;
vlc_meta_t
**
pp_meta
;
...
...
@@ -1282,14 +1251,41 @@ static int Control( input_thread_t *p_input, int i_query, va_list args )
}
return
VLC_EGENERIC
;
case
DEMUX_GET_POSITION
:
pf
=
(
double
*
)
va_arg
(
args
,
double
*
);
*
pf
=
(
double
)
p_sys
->
in
->
getFilePointer
()
/
(
double
)
stream_Size
(
p_demux
->
s
);
return
VLC_SUCCESS
;
case
DEMUX_SET_POSITION
:
f
=
(
double
)
va_arg
(
args
,
double
);
Seek
(
p_demux
,
-
1
,
(
int
)(
100.0
*
f
)
);
return
VLC_EGENERIC
;
case
DEMUX_GET_TIME
:
pi64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
if
(
p_sys
->
f_duration
>
0.0
)
{
mtime_t
i_duration
=
(
mtime_t
)(
p_sys
->
f_duration
/
1000
);
/* FIXME */
*
pi64
=
(
mtime_t
)
1000000
*
(
mtime_t
)
i_duration
*
(
mtime_t
)
p_sys
->
in
->
getFilePointer
()
/
(
mtime_t
)
stream_Size
(
p_demux
->
s
);
return
VLC_SUCCESS
;
}
return
VLC_EGENERIC
;
case
DEMUX_SET_TIME
:
case
DEMUX_GET_FPS
:
default:
return
demux_vaControlDefault
(
p_input
,
i_query
,
args
)
;
return
VLC_EGENERIC
;
}
}
static
int
BlockGet
(
input_thread_t
*
p_input
,
KaxBlock
**
pp_block
,
int64_t
*
pi_ref1
,
int64_t
*
pi_ref2
,
int64_t
*
pi_duration
)
static
int
BlockGet
(
demux_t
*
p_demux
,
KaxBlock
**
pp_block
,
int64_t
*
pi_ref1
,
int64_t
*
pi_ref2
,
int64_t
*
pi_duration
)
{
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
*
pp_block
=
NULL
;
*
pi_ref1
=
-
1
;
...
...
@@ -1300,7 +1296,7 @@ static int BlockGet( input_thread_t *p_input, KaxBlock **pp_block, int64_t *pi_r
EbmlElement
*
el
;
int
i_level
;
if
(
p_
input
->
b_die
)
if
(
p_
demux
->
b_die
)
{
return
VLC_EGENERIC
;
}
...
...
@@ -1328,7 +1324,7 @@ static int BlockGet( input_thread_t *p_input, KaxBlock **pp_block, int64_t *pi_r
p_sys
->
ep
->
Up
();
continue
;
}
msg_Warn
(
p_
input
,
"EOF"
);
msg_Warn
(
p_
demux
,
"EOF"
);
return
VLC_EGENERIC
;
}
...
...
@@ -1343,19 +1339,19 @@ static int BlockGet( input_thread_t *p_input, KaxBlock **pp_block, int64_t *pi_r
if
(
p_sys
->
i_index
==
0
||
(
p_sys
->
i_index
>
0
&&
p_sys
->
index
[
p_sys
->
i_index
-
1
].
i_position
<
(
int64_t
)
p_sys
->
cluster
->
GetElementPosition
()
)
)
{
IndexAppendCluster
(
p_
input
,
p_sys
->
cluster
);
IndexAppendCluster
(
p_
demux
,
p_sys
->
cluster
);
}
p_sys
->
ep
->
Down
();
}
else
if
(
EbmlId
(
*
el
)
==
KaxCues
::
ClassInfos
.
GlobalId
)
{
msg_Warn
(
p_
input
,
"find KaxCues FIXME"
);
msg_Warn
(
p_
demux
,
"find KaxCues FIXME"
);
return
VLC_EGENERIC
;
}
else
{
msg_Dbg
(
p_
input
,
"unknown (%s)"
,
typeid
(
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"unknown (%s)"
,
typeid
(
el
).
name
()
);
}
}
else
if
(
i_level
==
2
)
...
...
@@ -1407,24 +1403,24 @@ static int BlockGet( input_thread_t *p_input, KaxBlock **pp_block, int64_t *pi_r
}
else
{
msg_Err
(
p_
input
,
"invalid level = %d"
,
i_level
);
msg_Err
(
p_
demux
,
"invalid level = %d"
,
i_level
);
return
VLC_EGENERIC
;
}
}
}
static
block_t
*
MemToBlock
(
input_thread_t
*
p_input
,
uint8_t
*
p_mem
,
int
i_mem
)
static
block_t
*
MemToBlock
(
demux_t
*
p_demux
,
uint8_t
*
p_mem
,
int
i_mem
)
{
block_t
*
p_block
;
if
(
!
(
p_block
=
block_New
(
p_
input
,
i_mem
)
)
)
return
NULL
;
if
(
!
(
p_block
=
block_New
(
p_
demux
,
i_mem
)
)
)
return
NULL
;
memcpy
(
p_block
->
p_buffer
,
p_mem
,
i_mem
);
//p_block->i_rate = p_input->stream.control.i_rate;
return
p_block
;
}
static
void
BlockDecode
(
input_thread_t
*
p_input
,
KaxBlock
*
block
,
mtime_t
i_pts
,
mtime_t
i_duration
)
static
void
BlockDecode
(
demux_t
*
p_demux
,
KaxBlock
*
block
,
mtime_t
i_pts
,
mtime_t
i_duration
)
{
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
int
i_track
;
unsigned
int
i
;
...
...
@@ -1441,28 +1437,23 @@ static void BlockDecode( input_thread_t *p_input, KaxBlock *block, mtime_t i_pts
if
(
i_track
>=
p_sys
->
i_track
)
{
msg_Err
(
p_
input
,
"invalid track number=%d"
,
block
->
TrackNum
()
);
msg_Err
(
p_
demux
,
"invalid track number=%d"
,
block
->
TrackNum
()
);
return
;
}
es_out_Control
(
p_
input
->
p_es_
out
,
ES_OUT_GET_ES_STATE
,
tk
.
p_es
,
&
b
);
es_out_Control
(
p_
demux
->
out
,
ES_OUT_GET_ES_STATE
,
tk
.
p_es
,
&
b
);
if
(
!
b
)
{
tk
.
b_inited
=
VLC_FALSE
;
return
;
}
if
(
tk
.
fmt
.
i_cat
==
AUDIO_ES
&&
p_input
->
stream
.
control
.
b_mute
)
{
return
;
}
/* First send init data */
if
(
!
tk
.
b_inited
&&
tk
.
i_data_init
>
0
)
{
block_t
*
p_init
;
msg_Dbg
(
p_
input
,
"sending header (%d bytes)"
,
tk
.
i_data_init
);
msg_Dbg
(
p_
demux
,
"sending header (%d bytes)"
,
tk
.
i_data_init
);
if
(
tk
.
fmt
.
i_codec
==
VLC_FOURCC
(
'v'
,
'o'
,
'r'
,
'b'
)
)
{
...
...
@@ -1473,7 +1464,7 @@ static void BlockDecode( input_thread_t *p_input, KaxBlock *block, mtime_t i_pts
/* XXX hack split the 3 headers */
if
(
tk
.
p_data_init
[
0
]
!=
0x02
)
{
msg_Err
(
p_
input
,
"invalid vorbis header"
);
msg_Err
(
p_
demux
,
"invalid vorbis header"
);
}
for
(
i
=
0
;
i
<
2
;
i
++
)
...
...
@@ -1492,28 +1483,28 @@ static void BlockDecode( input_thread_t *p_input, KaxBlock *block, mtime_t i_pts
i_size
[
1
]
=
__MIN
(
i_size
[
1
],
tk
.
i_data_init
-
i_offset
-
i_size
[
0
]
);
i_size
[
2
]
=
tk
.
i_data_init
-
i_offset
-
i_size
[
0
]
-
i_size
[
1
];
p_init
=
MemToBlock
(
p_
input
,
&
tk
.
p_data_init
[
i_offset
],
i_size
[
0
]
);
p_init
=
MemToBlock
(
p_
demux
,
&
tk
.
p_data_init
[
i_offset
],
i_size
[
0
]
);
if
(
p_init
)
{
es_out_Send
(
p_
input
->
p_es_
out
,
tk
.
p_es
,
p_init
);
es_out_Send
(
p_
demux
->
out
,
tk
.
p_es
,
p_init
);
}
p_init
=
MemToBlock
(
p_
input
,
&
tk
.
p_data_init
[
i_offset
+
i_size
[
0
]],
i_size
[
1
]
);
p_init
=
MemToBlock
(
p_
demux
,
&
tk
.
p_data_init
[
i_offset
+
i_size
[
0
]],
i_size
[
1
]
);
if
(
p_init
)
{
es_out_Send
(
p_
input
->
p_es_
out
,
tk
.
p_es
,
p_init
);
es_out_Send
(
p_
demux
->
out
,
tk
.
p_es
,
p_init
);
}
p_init
=
MemToBlock
(
p_
input
,
&
tk
.
p_data_init
[
i_offset
+
i_size
[
0
]
+
i_size
[
1
]],
i_size
[
2
]
);
p_init
=
MemToBlock
(
p_
demux
,
&
tk
.
p_data_init
[
i_offset
+
i_size
[
0
]
+
i_size
[
1
]],
i_size
[
2
]
);
if
(
p_init
)
{
es_out_Send
(
p_
input
->
p_es_
out
,
tk
.
p_es
,
p_init
);
es_out_Send
(
p_
demux
->
out
,
tk
.
p_es
,
p_init
);
}
}
else
{
p_init
=
MemToBlock
(
p_
input
,
tk
.
p_data_init
,
tk
.
i_data_init
);
p_init
=
MemToBlock
(
p_
demux
,
tk
.
p_data_init
,
tk
.
i_data_init
);
if
(
p_init
)
{
es_out_Send
(
p_
input
->
p_es_
out
,
tk
.
p_es
,
p_init
);
es_out_Send
(
p_
demux
->
out
,
tk
.
p_es
,
p_init
);
}
}
}
...
...
@@ -1525,7 +1516,7 @@ static void BlockDecode( input_thread_t *p_input, KaxBlock *block, mtime_t i_pts
block_t
*
p_block
;
DataBuffer
&
data
=
block
->
GetBuffer
(
i
);
p_block
=
MemToBlock
(
p_
input
,
data
.
Buffer
(),
data
.
Size
()
);
p_block
=
MemToBlock
(
p_
demux
,
data
.
Buffer
(),
data
.
Size
()
);
if
(
p_block
==
NULL
)
{
break
;
...
...
@@ -1550,7 +1541,7 @@ static void BlockDecode( input_thread_t *p_input, KaxBlock *block, mtime_t i_pts
p_block
->
i_dts
=
0
;
}
}
es_out_Send
(
p_
input
->
p_es_
out
,
tk
.
p_es
,
p_block
);
es_out_Send
(
p_
demux
->
out
,
tk
.
p_es
,
p_block
);
/* use time stamp only for first block */
i_pts
=
0
;
...
...
@@ -1559,9 +1550,9 @@ static void BlockDecode( input_thread_t *p_input, KaxBlock *block, mtime_t i_pts
#undef tk
}
static
void
Seek
(
input_thread_t
*
p_input
,
mtime_t
i_date
,
int
i_percent
)
static
void
Seek
(
demux_t
*
p_demux
,
mtime_t
i_date
,
int
i_percent
)
{
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
KaxBlock
*
block
;
int64_t
i_block_duration
;
...
...
@@ -1572,7 +1563,7 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
int
i_track_skipping
;
int
i_track
;
msg_Dbg
(
p_
input
,
"seek request to "
I64Fd
" (%d%%)"
,
i_date
,
i_percent
);
msg_Dbg
(
p_
demux
,
"seek request to "
I64Fd
" (%d%%)"
,
i_date
,
i_percent
);
if
(
i_date
<
0
&&
i_percent
<
0
)
{
return
;
...
...
@@ -1583,11 +1574,11 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
p_sys
->
cluster
=
NULL
;
/* seek without index or without date */
if
(
config_GetInt
(
p_
input
,
"mkv-seek-percent"
)
||
!
p_sys
->
b_cues
||
i_date
<
0
)
if
(
config_GetInt
(
p_
demux
,
"mkv-seek-percent"
)
||
!
p_sys
->
b_cues
||
i_date
<
0
)
{
int64_t
i_pos
=
i_percent
*
stream_Size
(
p_
input
->
s
)
/
100
;
int64_t
i_pos
=
i_percent
*
stream_Size
(
p_
demux
->
s
)
/
100
;
msg_Dbg
(
p_
input
,
"inacurate way of seeking"
);
msg_Dbg
(
p_
demux
,
"inacurate way of seeking"
);
for
(
i_index
=
0
;
i_index
<
p_sys
->
i_index
;
i_index
++
)
{
if
(
p_sys
->
index
[
i_index
].
i_position
>=
i_pos
)
...
...
@@ -1607,7 +1598,7 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
{
EbmlElement
*
el
;
msg_Warn
(
p_
input
,
"searching for cluster, could take some time"
);
msg_Warn
(
p_
demux
,
"searching for cluster, could take some time"
);
/* search a cluster */
while
(
(
el
=
p_sys
->
ep
->
Get
()
)
!=
NULL
)
...
...
@@ -1617,7 +1608,7 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
KaxCluster
*
cluster
=
(
KaxCluster
*
)
el
;
/* add it to the index */
IndexAppendCluster
(
p_
input
,
cluster
);
IndexAppendCluster
(
p_
demux
,
cluster
);
if
(
(
int64_t
)
cluster
->
GetElementPosition
()
>=
i_pos
)
{
...
...
@@ -1644,10 +1635,10 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
i_index
--
;
}
msg_Dbg
(
p_
input
,
"seek got "
I64Fd
" (%d%%)"
,
msg_Dbg
(
p_
demux
,
"seek got "
I64Fd
" (%d%%)"
,
p_sys
->
index
[
i_index
].
i_time
,
(
int
)(
100
*
p_sys
->
index
[
i_index
].
i_position
/
stream_Size
(
p_
input
->
s
)
)
);
stream_Size
(
p_
demux
->
s
)
)
);
p_sys
->
in
->
setFilePointer
(
p_sys
->
index
[
i_index
].
i_position
,
seek_beginning
);
...
...
@@ -1667,9 +1658,9 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
while
(
i_track_skipping
>
0
)
{
if
(
BlockGet
(
p_
input
,
&
block
,
&
i_block_ref1
,
&
i_block_ref2
,
&
i_block_duration
)
)
if
(
BlockGet
(
p_
demux
,
&
block
,
&
i_block_ref1
,
&
i_block_ref2
,
&
i_block_duration
)
)
{
msg_Warn
(
p_
input
,
"cannot get block EOF?"
);
msg_Warn
(
p_
demux
,
"cannot get block EOF?"
);
return
;
}
...
...
@@ -1693,7 +1684,7 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
}
if
(
tk
.
fmt
.
i_cat
==
VIDEO_ES
&&
!
tk
.
b_search_keyframe
)
{
BlockDecode
(
p_
input
,
block
,
0
,
0
);
BlockDecode
(
p_
demux
,
block
,
0
,
0
);
}
}
...
...
@@ -1707,9 +1698,9 @@ static void Seek( input_thread_t *p_input, mtime_t i_date, int i_percent)
*****************************************************************************
* Returns -1 in case of error, 0 in case of EOF, 1 otherwise
*****************************************************************************/
static
int
Demux
(
input_thread_t
*
p_input
)
static
int
Demux
(
demux_t
*
p_demux
)
{
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
mtime_t
i_start_pts
;
int
i_block_count
=
0
;
...
...
@@ -1718,37 +1709,13 @@ static int Demux( input_thread_t * p_input )
int64_t
i_block_ref1
;
int64_t
i_block_ref2
;
if
(
p_input
->
stream
.
p_selected_program
->
i_synchro_state
==
SYNCHRO_REINIT
)
{
mtime_t
i_duration
=
(
mtime_t
)(
p_sys
->
f_duration
/
1000
);
mtime_t
i_date
=
-
1
;
int
i_percent
=
-
1
;
if
(
i_duration
>
0
)
{
i_date
=
(
mtime_t
)
1000000
*
(
mtime_t
)
i_duration
*
(
mtime_t
)
p_sys
->
in
->
getFilePointer
()
/
(
mtime_t
)
stream_Size
(
p_input
->
s
);
}
if
(
stream_Size
(
p_input
->
s
)
>
0
)
{
i_percent
=
100
*
p_sys
->
in
->
getFilePointer
()
/
stream_Size
(
p_input
->
s
);
}
Seek
(
p_input
,
i_date
,
i_percent
);
}
i_start_pts
=
-
1
;
for
(
;;
)
{
mtime_t
i_pts
;
if
(
BlockGet
(
p_input
,
&
block
,
&
i_block_ref1
,
&
i_block_ref2
,
&
i_block_duration
)
)
if
(
BlockGet
(
p_demux
,
&
block
,
&
i_block_ref1
,
&
i_block_ref2
,
&
i_block_duration
)
)
{
msg_Warn
(
p_
input
,
"cannot get block EOF?"
);
msg_Warn
(
p_
demux
,
"cannot get block EOF?"
);
return
0
;
}
...
...
@@ -1757,18 +1724,10 @@ static int Demux( input_thread_t * p_input )
if
(
p_sys
->
i_pts
>
0
)
{
input_ClockManageRef
(
p_input
,
p_input
->
stream
.
p_selected_program
,
p_sys
->
i_pts
*
9
/
100
);
es_out_Control
(
p_demux
->
out
,
ES_OUT_SET_PCR
,
p_sys
->
i_pts
);
}
i_pts
=
input_ClockGetTS
(
p_input
,
p_input
->
stream
.
p_selected_program
,
p_sys
->
i_pts
*
9
/
100
);
BlockDecode
(
p_input
,
block
,
i_pts
,
i_block_duration
);
BlockDecode
(
p_demux
,
block
,
p_sys
->
i_pts
,
i_block_duration
);
delete
block
;
i_block_count
++
;
...
...
@@ -1972,20 +1931,20 @@ EbmlElement *EbmlParser::Get( void )
* * InformationsCreate : create all informations, load tags if present
*
*****************************************************************************/
static
void
LoadCues
(
input_thread_t
*
p_input
)
static
void
LoadCues
(
demux_t
*
p_demux
)
{
demux_sys_t
*
p_sys
=
p_
input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_
demux
->
p_sys
;
int64_t
i_sav_position
=
p_sys
->
in
->
getFilePointer
();
EbmlParser
*
ep
;
EbmlElement
*
el
,
*
cues
;
msg_Dbg
(
p_
input
,
"loading cues"
);
msg_Dbg
(
p_
demux
,
"loading cues"
);
p_sys
->
in
->
setFilePointer
(
p_sys
->
i_cues_position
,
seek_beginning
);
cues
=
p_sys
->
es
->
FindNextID
(
KaxCues
::
ClassInfos
,
0xFFFFFFFFL
);
if
(
cues
==
NULL
)
{
msg_Err
(
p_
input
,
"cannot load cues (broken seekhead or file)"
);
msg_Err
(
p_
demux
,
"cannot load cues (broken seekhead or file)"
);
p_sys
->
in
->
setFilePointer
(
i_sav_position
,
seek_beginning
);
return
;
}
...
...
@@ -2042,20 +2001,20 @@ static void LoadCues( input_thread_t *p_input )
}
else
{
msg_Dbg
(
p_
input
,
" * Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
" * Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
ep
->
Up
();
}
else
{
msg_Dbg
(
p_
input
,
" * Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
" * Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
ep
->
Up
();
#if 0
msg_Dbg( p_
input
, " * added time="I64Fd" pos="I64Fd
msg_Dbg( p_
demux
, " * added time="I64Fd" pos="I64Fd
" track=%d bnum=%d", idx.i_time, idx.i_position,
idx.i_track, idx.i_block_number );
#endif
...
...
@@ -2070,7 +2029,7 @@ static void LoadCues( input_thread_t *p_input )
}
else
{
msg_Dbg
(
p_
input
,
" * Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
" * Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
delete
ep
;
...
...
@@ -2078,139 +2037,139 @@ static void LoadCues( input_thread_t *p_input )
p_sys
->
b_cues
=
VLC_TRUE
;
msg_Dbg
(
p_
input
,
"loading cues done."
);
msg_Dbg
(
p_
demux
,
"loading cues done."
);
p_sys
->
in
->
setFilePointer
(
i_sav_position
,
seek_beginning
);
}
static
void
LoadTags
(
input_thread_t
*
p_input
)
static
void
LoadTags
(
demux_t
*
p_demux
)
{
demux_sys_t
*
p_sys
=
p_
input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_
demux
->
p_sys
;
int64_t
i_sav_position
=
p_sys
->
in
->
getFilePointer
();
EbmlParser
*
ep
;
EbmlElement
*
el
,
*
tags
;
msg_Dbg
(
p_
input
,
"loading tags"
);
msg_Dbg
(
p_
demux
,
"loading tags"
);
p_sys
->
in
->
setFilePointer
(
p_sys
->
i_tags_position
,
seek_beginning
);
tags
=
p_sys
->
es
->
FindNextID
(
KaxTags
::
ClassInfos
,
0xFFFFFFFFL
);
if
(
tags
==
NULL
)
{
msg_Err
(
p_
input
,
"cannot load tags (broken seekhead or file)"
);
msg_Err
(
p_
demux
,
"cannot load tags (broken seekhead or file)"
);
p_sys
->
in
->
setFilePointer
(
i_sav_position
,
seek_beginning
);
return
;
}
msg_Dbg
(
p_
input
,
"Tags"
);
msg_Dbg
(
p_
demux
,
"Tags"
);
ep
=
new
EbmlParser
(
p_sys
->
es
,
tags
);
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
if
(
EbmlId
(
*
el
)
==
KaxTag
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"+ Tag"
);
msg_Dbg
(
p_
demux
,
"+ Tag"
);
ep
->
Down
();
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
if
(
EbmlId
(
*
el
)
==
KaxTagTargets
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Targets"
);
msg_Dbg
(
p_
demux
,
"| + Targets"
);
ep
->
Down
();
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagGeneral
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + General"
);
msg_Dbg
(
p_
demux
,
"| + General"
);
ep
->
Down
();
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagGenres
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Genres"
);
msg_Dbg
(
p_
demux
,
"| + Genres"
);
ep
->
Down
();
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagAudioSpecific
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Audio Specific"
);
msg_Dbg
(
p_
demux
,
"| + Audio Specific"
);
ep
->
Down
();
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagImageSpecific
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Images Specific"
);
msg_Dbg
(
p_
demux
,
"| + Images Specific"
);
ep
->
Down
();
while
(
(
el
=
ep
->
Get
()
)
!=
NULL
)
{
msg_Dbg
(
p_
input
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"| | + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
ep
->
Up
();
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiComment
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Comment"
);
msg_Dbg
(
p_
demux
,
"| + Multi Comment"
);
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiCommercial
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Commercial"
);
msg_Dbg
(
p_
demux
,
"| + Multi Commercial"
);
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiDate
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Date"
);
msg_Dbg
(
p_
demux
,
"| + Multi Date"
);
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiEntity
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Entity"
);
msg_Dbg
(
p_
demux
,
"| + Multi Entity"
);
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiIdentifier
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Identifier"
);
msg_Dbg
(
p_
demux
,
"| + Multi Identifier"
);
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiLegal
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Legal"
);
msg_Dbg
(
p_
demux
,
"| + Multi Legal"
);
}
else
if
(
EbmlId
(
*
el
)
==
KaxTagMultiTitle
::
ClassInfos
.
GlobalId
)
{
msg_Dbg
(
p_
input
,
"| + Multi Title"
);
msg_Dbg
(
p_
demux
,
"| + Multi Title"
);
}
else
{
msg_Dbg
(
p_
input
,
"| + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"| + Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
ep
->
Up
();
}
else
{
msg_Dbg
(
p_
input
,
"+ Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
msg_Dbg
(
p_
demux
,
"+ Unknown (%s)"
,
typeid
(
*
el
).
name
()
);
}
}
delete
ep
;
delete
tags
;
msg_Dbg
(
p_
input
,
"loading tags done."
);
msg_Dbg
(
p_
demux
,
"loading tags done."
);
p_sys
->
in
->
setFilePointer
(
i_sav_position
,
seek_beginning
);
}
static
void
InformationsCreate
(
input_thread_t
*
p_input
)
static
void
InformationsCreate
(
demux_t
*
p_demux
)
{
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
int
i_track
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
int
i_track
;
p_sys
->
meta
=
vlc_meta_New
();
...
...
@@ -2270,10 +2229,10 @@ static void InformationsCreate( input_thread_t *p_input )
{
vlc_bool_t
b_seekable
;
stream_Control
(
p_
input
->
s
,
STREAM_CAN_FASTSEEK
,
&
b_seekable
);
stream_Control
(
p_
demux
->
s
,
STREAM_CAN_FASTSEEK
,
&
b_seekable
);
if
(
b_seekable
)
{
LoadTags
(
p_
input
);
LoadTags
(
p_
demux
);
}
}
}
...
...
@@ -2283,9 +2242,9 @@ static void InformationsCreate( input_thread_t *p_input )
* Divers
*****************************************************************************/
static
void
IndexAppendCluster
(
input_thread_t
*
p_input
,
KaxCluster
*
cluster
)
static
void
IndexAppendCluster
(
demux_t
*
p_demux
,
KaxCluster
*
cluster
)
{
demux_sys_t
*
p_sys
=
p_input
->
p_demux_data
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
#define idx p_sys->index[p_sys->i_index]
idx
.
i_track
=
-
1
;
...
...
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