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
0785e30c
Commit
0785e30c
authored
Jan 06, 2015
by
Francois Cartegnie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
demux: dash: split templates
parent
feb92cce
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
112 additions
and
113 deletions
+112
-113
modules/demux/dash/mpd/IsoffMainParser.cpp
modules/demux/dash/mpd/IsoffMainParser.cpp
+6
-6
modules/demux/dash/mpd/IsoffMainParser.h
modules/demux/dash/mpd/IsoffMainParser.h
+1
-1
modules/demux/dash/mpd/SegmentBase.h
modules/demux/dash/mpd/SegmentBase.h
+1
-1
modules/demux/dash/mpd/SegmentInfoCommon.cpp
modules/demux/dash/mpd/SegmentInfoCommon.cpp
+0
-10
modules/demux/dash/mpd/SegmentInfoCommon.h
modules/demux/dash/mpd/SegmentInfoCommon.h
+11
-5
modules/demux/dash/mpd/SegmentInformation.cpp
modules/demux/dash/mpd/SegmentInformation.cpp
+19
-22
modules/demux/dash/mpd/SegmentInformation.hpp
modules/demux/dash/mpd/SegmentInformation.hpp
+3
-3
modules/demux/dash/mpd/SegmentTemplate.cpp
modules/demux/dash/mpd/SegmentTemplate.cpp
+15
-17
modules/demux/dash/mpd/SegmentTemplate.h
modules/demux/dash/mpd/SegmentTemplate.h
+13
-9
modules/demux/dash/mpd/Url.cpp
modules/demux/dash/mpd/Url.cpp
+40
-36
modules/demux/dash/mpd/Url.hpp
modules/demux/dash/mpd/Url.hpp
+3
-3
No files found.
modules/demux/dash/mpd/IsoffMainParser.cpp
View file @
0785e30c
...
...
@@ -110,13 +110,13 @@ size_t IsoffMainParser::parseSegmentTemplate(Node *templateNode, SegmentInformat
return
total
;
std
::
string
mediaurl
=
templateNode
->
getAttributeValue
(
"media"
);
SegmentTemplate
*
mediaTemplate
=
NULL
;
if
(
mediaurl
.
empty
()
||
!
(
mediaTemplate
=
new
(
std
::
nothrow
)
SegmentTemplate
(
info
))
)
Media
SegmentTemplate
*
mediaTemplate
=
NULL
;
if
(
mediaurl
.
empty
()
||
!
(
mediaTemplate
=
new
(
std
::
nothrow
)
Media
SegmentTemplate
(
info
))
)
return
total
;
mediaTemplate
->
setSourceUrl
(
mediaurl
);
if
(
templateNode
->
hasAttribute
(
"startNumber"
))
mediaTemplate
->
s
etStartIndex
(
Integer
<
uint64_t
>
(
templateNode
->
getAttributeValue
(
"startNumber"
)));
mediaTemplate
->
s
tartIndex
.
Set
(
Integer
<
uint64_t
>
(
templateNode
->
getAttributeValue
(
"startNumber"
)));
if
(
templateNode
->
hasAttribute
(
"duration"
))
mediaTemplate
->
duration
.
Set
(
Integer
<
mtime_t
>
(
templateNode
->
getAttributeValue
(
"duration"
)));
...
...
@@ -133,8 +133,8 @@ size_t IsoffMainParser::parseSegmentTemplate(Node *templateNode, SegmentInformat
initTemplate
->
setSourceUrl
(
initurl
);
}
info
->
setSegmentTemplate
(
mediaTemplate
,
SegmentInformation
::
INFOTYPE_MEDIA
);
info
->
setSegmentTemplate
(
initTemplate
,
SegmentInformation
::
INFOTYPE_INIT
);
mediaTemplate
->
initialisationSegment
.
Set
(
initTemplate
);
info
->
setSegmentTemplate
(
mediaTemplate
);
total
+=
(
mediaTemplate
!=
NULL
);
...
...
@@ -322,7 +322,7 @@ size_t IsoffMainParser::parseSegmentList(Node * segListNode, SegmentInformation
return
total
;
}
void
IsoffMainParser
::
parseInitSegment
(
Node
*
initNode
,
Initializable
*
init
)
void
IsoffMainParser
::
parseInitSegment
(
Node
*
initNode
,
Initializable
<
Segment
>
*
init
)
{
if
(
!
initNode
)
return
;
...
...
modules/demux/dash/mpd/IsoffMainParser.h
View file @
0785e30c
...
...
@@ -53,7 +53,7 @@ namespace dash
void
setMPDAttributes
();
void
setAdaptationSets
(
dash
::
xml
::
Node
*
periodNode
,
Period
*
period
);
void
setRepresentations
(
dash
::
xml
::
Node
*
adaptationSetNode
,
AdaptationSet
*
adaptationSet
);
void
parseInitSegment
(
dash
::
xml
::
Node
*
,
Initializable
*
);
void
parseInitSegment
(
dash
::
xml
::
Node
*
,
Initializable
<
Segment
>
*
);
void
parsePeriods
(
dash
::
xml
::
Node
*
);
size_t
parseSegmentInformation
(
dash
::
xml
::
Node
*
,
SegmentInformation
*
);
void
parseSegmentBase
(
dash
::
xml
::
Node
*
,
SegmentInformation
*
);
...
...
modules/demux/dash/mpd/SegmentBase.h
View file @
0785e30c
...
...
@@ -32,7 +32,7 @@ namespace dash
{
namespace
mpd
{
class
SegmentBase
:
public
Initializable
class
SegmentBase
:
public
Initializable
<
Segment
>
{
public:
SegmentBase
();
...
...
modules/demux/dash/mpd/SegmentInfoCommon.cpp
View file @
0785e30c
...
...
@@ -33,16 +33,6 @@
using
namespace
dash
::
mpd
;
Initializable
::
Initializable
()
{
initialisationSegment
.
Set
(
NULL
);
}
Initializable
::~
Initializable
()
{
delete
initialisationSegment
.
Get
();
}
SegmentInfoCommon
::
SegmentInfoCommon
(
ICanonicalUrl
*
parent
)
:
ICanonicalUrl
(
parent
),
Initializable
(),
duration
(
-
1
),
...
...
modules/demux/dash/mpd/SegmentInfoCommon.h
View file @
0785e30c
...
...
@@ -38,16 +38,22 @@ namespace dash
class
Segment
;
class
SegmentTimeline
;
class
Initializable
template
<
class
T
>
class
Initializable
{
public:
Initializable
();
~
Initializable
();
Property
<
Segment
*>
initialisationSegment
;
Initializable
()
{
initialisationSegment
.
Set
(
NULL
);
}
~
Initializable
()
{
delete
initialisationSegment
.
Get
();
}
Property
<
T
*>
initialisationSegment
;
};
class
SegmentInfoCommon
:
public
ICanonicalUrl
,
public
Initializable
public
Initializable
<
Segment
>
{
public:
SegmentInfoCommon
(
ICanonicalUrl
*
parent
=
NULL
);
...
...
modules/demux/dash/mpd/SegmentInformation.cpp
View file @
0785e30c
...
...
@@ -33,8 +33,7 @@ SegmentInformation::SegmentInformation(SegmentInformation *parent_) :
parent
=
parent_
;
segmentBase
=
NULL
;
segmentList
=
NULL
;
for
(
int
i
=
0
;
i
<
InfoTypeCount
;
i
++
)
segmentTemplate
[
i
]
=
NULL
;
mediaSegmentTemplate
=
NULL
;
bitswitch_policy
=
BITSWITCH_INHERIT
;
timescale
.
Set
(
0
);
}
...
...
@@ -45,8 +44,7 @@ SegmentInformation::SegmentInformation(ICanonicalUrl * parent_) :
parent
=
NULL
;
segmentBase
=
NULL
;
segmentList
=
NULL
;
for
(
int
i
=
0
;
i
<
InfoTypeCount
;
i
++
)
segmentTemplate
[
i
]
=
NULL
;
mediaSegmentTemplate
=
NULL
;
bitswitch_policy
=
BITSWITCH_INHERIT
;
timescale
.
Set
(
0
);
}
...
...
@@ -55,8 +53,7 @@ SegmentInformation::~SegmentInformation()
{
delete
segmentBase
;
delete
segmentList
;
for
(
int
i
=
0
;
i
<
InfoTypeCount
;
i
++
)
delete
segmentTemplate
[
i
];
delete
mediaSegmentTemplate
;
}
vector
<
ISegment
*>
SegmentInformation
::
getSegments
(
SegmentInfoType
type
)
const
...
...
@@ -77,9 +74,9 @@ vector<ISegment *> SegmentInformation::getSegments(SegmentInfoType type) const
case
INFOTYPE_MEDIA
:
{
SegmentList
*
segList
=
inheritSegmentList
();
if
(
inheritSegmentTemplate
(
INFOTYPE_MEDIA
)
)
if
(
inheritSegmentTemplate
()
)
{
retSegments
.
push_back
(
inheritSegmentTemplate
(
INFOTYPE_MEDIA
)
);
retSegments
.
push_back
(
inheritSegmentTemplate
()
);
}
else
if
(
segList
&&
!
segList
->
getSegments
().
empty
()
)
{
...
...
@@ -129,16 +126,16 @@ ISegment * SegmentInformation::getSegment(SegmentInfoType type, uint64_t pos) co
{
segment
=
segList
->
initialisationSegment
.
Get
();
}
else
if
(
inheritSegmentTemplate
(
INFOTYPE_INIT
)
)
else
if
(
inheritSegmentTemplate
()
)
{
segment
=
inheritSegmentTemplate
(
INFOTYPE_INIT
);
segment
=
inheritSegmentTemplate
(
)
->
initialisationSegment
.
Get
(
);
}
break
;
case
INFOTYPE_MEDIA
:
if
(
inheritSegmentTemplate
(
INFOTYPE_MEDIA
)
)
if
(
inheritSegmentTemplate
()
)
{
segment
=
inheritSegmentTemplate
(
INFOTYPE_MEDIA
);
segment
=
inheritSegmentTemplate
();
}
else
if
(
segList
&&
!
segList
->
getSegments
().
empty
()
)
{
...
...
@@ -160,7 +157,7 @@ ISegment * SegmentInformation::getSegment(SegmentInfoType type, uint64_t pos) co
bool
SegmentInformation
::
getSegmentNumberByTime
(
mtime_t
time
,
uint64_t
*
ret
)
const
{
SegmentList
*
segList
;
SegmentTemplate
*
seg
Template
;
MediaSegmentTemplate
*
media
Template
;
uint64_t
timescale
;
mtime_t
duration
=
0
;
if
(
(
segList
=
inheritSegmentList
())
)
...
...
@@ -168,10 +165,10 @@ bool SegmentInformation::getSegmentNumberByTime(mtime_t time, uint64_t *ret) con
timescale
=
segList
->
timescale
.
Get
();
duration
=
segList
->
getDuration
();
}
else
if
(
(
segTemplate
=
inheritSegmentTemplate
(
INFOTYPE_MEDIA
))
)
else
if
(
(
mediaTemplate
=
inheritSegmentTemplate
(
))
)
{
timescale
=
seg
Template
->
timescale
.
Get
();
duration
=
seg
Template
->
duration
.
Get
();
timescale
=
media
Template
->
timescale
.
Get
();
duration
=
media
Template
->
duration
.
Get
();
}
if
(
duration
)
...
...
@@ -221,9 +218,9 @@ void SegmentInformation::setSegmentBase(SegmentBase *base)
segmentBase
=
base
;
}
void
SegmentInformation
::
setSegmentTemplate
(
SegmentTemplate
*
templ
,
SegmentInfoType
type
)
void
SegmentInformation
::
setSegmentTemplate
(
MediaSegmentTemplate
*
templ
)
{
segmentTemplate
[
type
]
=
templ
;
mediaSegmentTemplate
=
templ
;
}
static
void
insertIntoSegment
(
std
::
vector
<
Segment
*>
&
seglist
,
size_t
start
,
...
...
@@ -298,12 +295,12 @@ SegmentList * SegmentInformation::inheritSegmentList() const
return
NULL
;
}
SegmentTemplate
*
SegmentInformation
::
inheritSegmentTemplate
(
SegmentInfoType
type
)
const
MediaSegmentTemplate
*
SegmentInformation
::
inheritSegmentTemplate
(
)
const
{
if
(
segmentTemplate
[
type
]
)
return
segmentTemplate
[
type
]
;
if
(
mediaSegmentTemplate
)
return
mediaSegmentTemplate
;
else
if
(
parent
)
return
parent
->
inheritSegmentTemplate
(
type
);
return
parent
->
inheritSegmentTemplate
();
else
return
NULL
;
}
modules/demux/dash/mpd/SegmentInformation.hpp
View file @
0785e30c
...
...
@@ -80,17 +80,17 @@ namespace dash
private:
void
setSegmentList
(
SegmentList
*
);
void
setSegmentBase
(
SegmentBase
*
);
void
setSegmentTemplate
(
SegmentTemplate
*
,
SegmentInfoType
);
void
setSegmentTemplate
(
MediaSegmentTemplate
*
);
void
setBitstreamSwitching
(
bool
);
SegmentBase
*
inheritSegmentBase
()
const
;
SegmentList
*
inheritSegmentList
()
const
;
SegmentTemplate
*
inheritSegmentTemplate
(
SegmentInfoType
)
const
;
MediaSegmentTemplate
*
inheritSegmentTemplate
(
)
const
;
SegmentInformation
*
parent
;
SegmentBase
*
segmentBase
;
SegmentList
*
segmentList
;
SegmentTemplate
*
segmentTemplate
[
InfoTypeCount
]
;
MediaSegmentTemplate
*
mediaSegmentTemplate
;
enum
BitswitchPolicy
{
...
...
modules/demux/dash/mpd/SegmentTemplate.cpp
View file @
0785e30c
...
...
@@ -31,38 +31,36 @@
using
namespace
dash
::
mpd
;
SegmentTemplate
::
SegmentTemplate
(
ICanonicalUrl
*
parent
)
:
Segment
(
parent
),
startIndex
(
0
)
BaseSegmentTemplate
::
BaseSegmentTemplate
(
ICanonicalUrl
*
parent
)
:
Segment
(
parent
)
{
debugName
=
"SegmentTemplate"
;
classId
=
Segment
::
CLASSID_SEGMENT
;
duration
.
Set
(
0
);
timescale
.
Set
(
0
);
}
Url
SegmentTemplate
::
getUrlSegment
()
const
Url
Base
SegmentTemplate
::
getUrlSegment
()
const
{
Url
ret
=
getParentUrlSegment
();
if
(
!
sourceUrl
.
empty
())
{
ret
.
append
(
Url
::
Component
(
sourceUrl
,
this
));
ret
.
append
(
Url
::
Component
(
sourceUrl
,
dynamic_cast
<
const
MediaSegmentTemplate
*>
(
this
))
/* casts to NULL if != */
);
}
return
ret
;
}
size_t
SegmentTemplate
::
getStartIndex
()
const
MediaSegmentTemplate
::
MediaSegmentTemplate
(
ICanonicalUrl
*
parent
)
:
BaseSegmentTemplate
(
parent
)
{
return
startIndex
;
}
void
SegmentTemplate
::
setStartIndex
(
size_t
i
)
{
startIndex
=
i
;
debugName
=
"SegmentTemplate"
;
classId
=
Segment
::
CLASSID_SEGMENT
;
timescale
.
Set
(
0
);
startIndex
.
Set
(
0
);
initialisationSegment
.
Set
(
NULL
);
}
InitSegmentTemplate
::
InitSegmentTemplate
(
ICanonicalUrl
*
parent
)
:
SegmentTemplate
(
parent
)
Base
SegmentTemplate
(
parent
)
{
debugName
=
"InitSegmentTemplate"
;
classId
=
InitSegment
::
CLASSID_INITSEGMENT
;
...
...
modules/demux/dash/mpd/SegmentTemplate.h
View file @
0785e30c
...
...
@@ -26,28 +26,32 @@
#include "mpd/Segment.h"
#include "Properties.hpp"
#include "SegmentInfoCommon.h"
namespace
dash
{
namespace
mpd
{
class
ICanonicalUrl
;
class
InitSegmentTemplate
;
class
SegmentTemplate
:
public
Segment
class
Base
SegmentTemplate
:
public
Segment
{
public:
SegmentTemplate
(
ICanonicalUrl
*
=
NULL
);
Base
SegmentTemplate
(
ICanonicalUrl
*
=
NULL
);
virtual
Url
getUrlSegment
()
const
;
/* reimpl */
size_t
getStartIndex
()
const
;
void
setStartIndex
(
size_t
);
Property
<
mtime_t
>
duration
;
Property
<
uint64_t
>
timescale
;
};
private:
size_t
startIndex
;
class
MediaSegmentTemplate
:
public
BaseSegmentTemplate
,
public
Initializable
<
InitSegmentTemplate
>
{
public:
MediaSegmentTemplate
(
ICanonicalUrl
*
=
NULL
);
Property
<
size_t
>
startIndex
;
Property
<
uint64_t
>
timescale
;
};
class
InitSegmentTemplate
:
public
SegmentTemplate
class
InitSegmentTemplate
:
public
Base
SegmentTemplate
{
public:
InitSegmentTemplate
(
ICanonicalUrl
*
=
NULL
);
...
...
modules/demux/dash/mpd/Url.cpp
View file @
0785e30c
...
...
@@ -79,7 +79,7 @@ std::string Url::toString(size_t index, const Representation *rep) const
return
ret
;
}
Url
::
Component
::
Component
(
const
std
::
string
&
str
,
const
SegmentTemplate
*
templ_
)
Url
::
Component
::
Component
(
const
std
::
string
&
str
,
const
Media
SegmentTemplate
*
templ_
)
{
component
=
str
;
templ
=
templ_
;
...
...
@@ -87,7 +87,7 @@ Url::Component::Component(const std::string & str, const SegmentTemplate *templ_
size_t
Url
::
Component
::
getSegmentNumber
(
size_t
index
,
const
Representation
*
rep
)
const
{
index
+=
templ
->
getStartIndex
();
index
+=
templ
->
startIndex
.
Get
();
/* live streams / templated */
if
(
rep
->
getMPD
()
->
isLive
()
&&
templ
->
duration
.
Get
())
{
...
...
@@ -107,48 +107,52 @@ size_t Url::Component::getSegmentNumber(size_t index, const Representation *rep)
std
::
string
Url
::
Component
::
contextualize
(
size_t
index
,
const
Representation
*
rep
)
const
{
std
::
string
ret
(
component
);
size_t
pos
;
if
(
!
rep
||
!
templ
)
if
(
!
rep
)
return
ret
;
size_t
pos
=
ret
.
find
(
"$Time$"
);
if
(
pos
!=
std
::
string
::
npos
)
if
(
templ
)
{
std
::
stringstream
ss
;
ss
<<
(
templ
->
duration
.
Get
()
*
index
);
ret
.
replace
(
pos
,
std
::
string
(
"$Time$"
).
length
(),
ss
.
str
());
}
pos
=
ret
.
find
(
"$Time$"
);
if
(
pos
!=
std
::
string
::
npos
)
{
std
::
stringstream
ss
;
ss
<<
(
templ
->
duration
.
Get
()
*
index
);
ret
.
replace
(
pos
,
std
::
string
(
"$Time$"
).
length
(),
ss
.
str
());
}
pos
=
ret
.
find
(
"$Number$"
);
if
(
pos
!=
std
::
string
::
npos
)
{
std
::
stringstream
ss
;
ss
<<
getSegmentNumber
(
index
,
rep
);
ret
.
replace
(
pos
,
std
::
string
(
"$Number$"
).
length
(),
ss
.
str
());
}
else
{
pos
=
ret
.
find
(
"$Number%"
);
size_t
tokenlength
=
std
::
string
(
"$Number%"
).
length
();
size_t
fmtstart
=
pos
+
tokenlength
;
if
(
pos
!=
std
::
string
::
npos
&&
fmtstart
<
ret
.
length
())
pos
=
ret
.
find
(
"$Number$"
);
if
(
pos
!=
std
::
string
::
npos
)
{
std
::
stringstream
ss
;
ss
<<
getSegmentNumber
(
index
,
rep
);
ret
.
replace
(
pos
,
std
::
string
(
"$Number$"
).
length
(),
ss
.
str
());
}
else
{
size_t
fmtend
=
ret
.
find
(
'$'
,
fmtstart
);
if
(
fmtend
!=
std
::
string
::
npos
)
pos
=
ret
.
find
(
"$Number%"
);
size_t
tokenlength
=
std
::
string
(
"$Number%"
).
length
();
size_t
fmtstart
=
pos
+
tokenlength
;
if
(
pos
!=
std
::
string
::
npos
&&
fmtstart
<
ret
.
length
())
{
s
td
::
istringstream
iss
(
ret
.
substr
(
fmtstart
,
fmtend
-
fmtstart
+
1
)
);
try
s
ize_t
fmtend
=
ret
.
find
(
'$'
,
fmtstart
);
if
(
fmtend
!=
std
::
string
::
npos
)
{
size_t
width
;
iss
>>
width
;
if
(
iss
.
peek
()
!=
'$'
)
throw
VLC_EGENERIC
;
std
::
stringstream
oss
;
oss
.
width
(
width
);
/* set format string length */
oss
.
fill
(
'0'
);
oss
<<
getSegmentNumber
(
index
,
rep
);
ret
.
replace
(
pos
,
fmtend
-
pos
+
1
,
oss
.
str
());
}
catch
(
int
)
{}
std
::
istringstream
iss
(
ret
.
substr
(
fmtstart
,
fmtend
-
fmtstart
+
1
));
try
{
size_t
width
;
iss
>>
width
;
if
(
iss
.
peek
()
!=
'$'
)
throw
VLC_EGENERIC
;
std
::
stringstream
oss
;
oss
.
width
(
width
);
/* set format string length */
oss
.
fill
(
'0'
);
oss
<<
getSegmentNumber
(
index
,
rep
);
ret
.
replace
(
pos
,
fmtend
-
pos
+
1
,
oss
.
str
());
}
catch
(
int
)
{}
}
}
}
}
...
...
modules/demux/dash/mpd/Url.hpp
View file @
0785e30c
...
...
@@ -28,7 +28,7 @@ namespace dash
namespace
mpd
{
class
Representation
;
class
SegmentTemplate
;
class
Media
SegmentTemplate
;
class
Url
{
...
...
@@ -37,13 +37,13 @@ namespace dash
{
friend
class
Url
;
public:
Component
(
const
std
::
string
&
,
const
SegmentTemplate
*
=
NULL
);
Component
(
const
std
::
string
&
,
const
Media
SegmentTemplate
*
=
NULL
);
protected:
std
::
string
contextualize
(
size_t
,
const
Representation
*
)
const
;
size_t
getSegmentNumber
(
size_t
,
const
Representation
*
)
const
;
std
::
string
component
;
const
SegmentTemplate
*
templ
;
const
Media
SegmentTemplate
*
templ
;
};
Url
();
...
...
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