Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
099bbe04
authored
Dec 12, 2014
by
Oliver Woodman
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Correctly handle audio and video only DASH streams.
parent
3e33fddb
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
8 deletions
demo/src/main/java/com/google/android/exoplayer/demo/full/player/DashRendererBuilder.java
demo/src/main/java/com/google/android/exoplayer/demo/full/player/DashRendererBuilder.java
View file @
099bbe04
...
...
@@ -119,11 +119,27 @@ public class DashRendererBuilder implements RendererBuilder,
LoadControl
loadControl
=
new
DefaultLoadControl
(
new
BufferPool
(
BUFFER_SEGMENT_SIZE
));
DefaultBandwidthMeter
bandwidthMeter
=
new
DefaultBandwidthMeter
(
mainHandler
,
player
);
boolean
hasContentProtection
=
false
;
int
videoAdaptationSetIndex
=
period
.
getAdaptationSetIndex
(
AdaptationSet
.
TYPE_VIDEO
);
AdaptationSet
videoAdaptationSet
=
period
.
adaptationSets
.
get
(
videoAdaptationSetIndex
);
int
audioAdaptationSetIndex
=
period
.
getAdaptationSetIndex
(
AdaptationSet
.
TYPE_AUDIO
);
AdaptationSet
videoAdaptationSet
=
null
;
AdaptationSet
audioAdaptationSet
=
null
;
if
(
videoAdaptationSetIndex
!=
-
1
)
{
videoAdaptationSet
=
period
.
adaptationSets
.
get
(
videoAdaptationSetIndex
);
hasContentProtection
|=
videoAdaptationSet
.
hasContentProtection
();
}
if
(
audioAdaptationSetIndex
!=
-
1
)
{
audioAdaptationSet
=
period
.
adaptationSets
.
get
(
audioAdaptationSetIndex
);
hasContentProtection
|=
audioAdaptationSet
.
hasContentProtection
();
}
// Fail if we have neither video or audio.
if
(
videoAdaptationSet
==
null
&&
audioAdaptationSet
==
null
)
{
callback
.
onRenderersError
(
new
IllegalStateException
(
"No video or audio adaptation sets"
));
return
;
}
// Check drm support if necessary.
boolean
hasContentProtection
=
videoAdaptationSet
.
hasContentProtection
();
boolean
filterHdContent
=
false
;
DrmSessionManager
drmSessionManager
=
null
;
if
(
hasContentProtection
)
{
...
...
@@ -137,7 +153,8 @@ public class DashRendererBuilder implements RendererBuilder,
V18Compat
.
getDrmSessionManagerData
(
player
,
drmCallback
);
drmSessionManager
=
drmSessionManagerData
.
first
;
// HD streams require L1 security.
filterHdContent
=
!
drmSessionManagerData
.
second
;
filterHdContent
=
videoAdaptationSet
!=
null
&&
videoAdaptationSet
.
hasContentProtection
()
&&
!
drmSessionManagerData
.
second
;
}
catch
(
Exception
e
)
{
callback
.
onRenderersError
(
e
);
return
;
...
...
@@ -145,9 +162,10 @@ public class DashRendererBuilder implements RendererBuilder,
}
// Determine which video representations we should use for playback.
ArrayList
<
Integer
>
videoRepresentationIndexList
=
new
ArrayList
<
Integer
>();
if
(
videoAdaptationSet
!=
null
)
{
int
maxDecodableFrameSize
=
MediaCodecUtil
.
maxH264DecodableFrameSize
();
List
<
Representation
>
videoRepresentations
=
videoAdaptationSet
.
representations
;
ArrayList
<
Integer
>
videoRepresentationIndexList
=
new
ArrayList
<
Integer
>();
for
(
int
i
=
0
;
i
<
videoRepresentations
.
size
();
i
++)
{
Format
format
=
videoRepresentations
.
get
(
i
).
format
;
if
(
filterHdContent
&&
(
format
.
width
>=
1280
||
format
.
height
>=
720
))
{
...
...
@@ -161,6 +179,7 @@ public class DashRendererBuilder implements RendererBuilder,
videoRepresentationIndexList
.
add
(
i
);
}
}
}
// Build the video renderer.
final
MediaCodecVideoTrackRenderer
videoRenderer
;
...
...
@@ -184,12 +203,11 @@ public class DashRendererBuilder implements RendererBuilder,
}
// Build the audio chunk sources.
int
audioAdaptationSetIndex
=
period
.
getAdaptationSetIndex
(
AdaptationSet
.
TYPE_AUDIO
);
AdaptationSet
audioAdaptationSet
=
period
.
adaptationSets
.
get
(
audioAdaptationSetIndex
);
DataSource
audioDataSource
=
new
UriDataSource
(
userAgent
,
bandwidthMeter
);
FormatEvaluator
audioEvaluator
=
new
FormatEvaluator
.
FixedEvaluator
();
List
<
ChunkSource
>
audioChunkSourceList
=
new
ArrayList
<
ChunkSource
>();
List
<
String
>
audioTrackNameList
=
new
ArrayList
<
String
>();
if
(
audioAdaptationSet
!=
null
)
{
DataSource
audioDataSource
=
new
UriDataSource
(
userAgent
,
bandwidthMeter
);
FormatEvaluator
audioEvaluator
=
new
FormatEvaluator
.
FixedEvaluator
();
List
<
Representation
>
audioRepresentations
=
audioAdaptationSet
.
representations
;
for
(
int
i
=
0
;
i
<
audioRepresentations
.
size
();
i
++)
{
Format
format
=
audioRepresentations
.
get
(
i
).
format
;
...
...
@@ -198,6 +216,7 @@ public class DashRendererBuilder implements RendererBuilder,
audioChunkSourceList
.
add
(
new
DashChunkSource
(
manifestFetcher
,
audioAdaptationSetIndex
,
new
int
[]
{
i
},
audioDataSource
,
audioEvaluator
,
LIVE_EDGE_LATENCY_MS
));
}
}
// Build the audio renderer.
final
String
[]
audioTrackNames
;
...
...
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