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
d745384d
authored
Apr 10, 2015
by
Oliver Woodman
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Change decodeOnly to be a sample flag.
parent
70b0e55a
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
47 additions
and
26 deletions
library/src/main/java/com/google/android/exoplayer/C.java
library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java
library/src/main/java/com/google/android/exoplayer/SampleHolder.java
library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java
library/src/main/java/com/google/android/exoplayer/chunk/parser/webm/WebmExtractor.java
library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java
library/src/main/java/com/google/android/exoplayer/hls/parser/RollingSampleBuffer.java
library/src/main/java/com/google/android/exoplayer/hls/parser/SampleQueue.java
library/src/main/java/com/google/android/exoplayer/source/FrameworkSampleExtractor.java
library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java
library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608Parser.java
library/src/test/java/com/google/android/exoplayer/chunk/parser/webm/WebmExtractorTest.java
library/src/main/java/com/google/android/exoplayer/C.java
View file @
d745384d
...
...
@@ -56,6 +56,11 @@ public final class C {
public
static
final
int
SAMPLE_FLAG_ENCRYPTED
=
MediaExtractor
.
SAMPLE_FLAG_ENCRYPTED
;
/**
* Indicates that a sample should be decoded but not rendered.
*/
public
static
final
int
SAMPLE_FLAG_DECODE_ONLY
=
0x8000000
;
/**
* @see MediaCodec#CRYPTO_MODE_AES_CTR
*/
@SuppressWarnings
(
"InlinedApi"
)
...
...
library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java
View file @
d745384d
...
...
@@ -604,7 +604,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer {
if
(
waitingForFirstSyncFrame
)
{
// TODO: Find out if it's possible to supply samples prior to the first sync
// frame for HE-AAC.
if
(
(
sampleHolder
.
flags
&
C
.
SAMPLE_FLAG_SYNC
)
==
0
)
{
if
(
!
sampleHolder
.
isSyncFrame
()
)
{
sampleHolder
.
data
.
clear
();
if
(
codecReconfigurationState
==
RECONFIGURATION_STATE_QUEUE_PENDING
)
{
// The buffer we just cleared contained reconfiguration data. We need to re-write this
...
...
@@ -615,7 +615,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer {
}
waitingForFirstSyncFrame
=
false
;
}
boolean
sampleEncrypted
=
(
sampleHolder
.
flags
&
C
.
SAMPLE_FLAG_ENCRYPTED
)
!=
0
;
boolean
sampleEncrypted
=
sampleHolder
.
isEncrypted
()
;
waitingForKeys
=
shouldWaitForKeys
(
sampleEncrypted
);
if
(
waitingForKeys
)
{
return
false
;
...
...
@@ -624,7 +624,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer {
int
bufferSize
=
sampleHolder
.
data
.
position
();
int
adaptiveReconfigurationBytes
=
bufferSize
-
sampleHolder
.
size
;
long
presentationTimeUs
=
sampleHolder
.
timeUs
;
if
(
sampleHolder
.
decodeOnly
)
{
if
(
sampleHolder
.
isDecodeOnly
()
)
{
decodeOnlyPresentationTimestamps
.
add
(
presentationTimeUs
);
}
if
(
sampleEncrypted
)
{
...
...
library/src/main/java/com/google/android/exoplayer/SampleHolder.java
View file @
d745384d
...
...
@@ -50,8 +50,8 @@ public final class SampleHolder {
public
int
size
;
/**
* Flags that accompany the sample. A combination of {@link C#SAMPLE_FLAG_SYNC}
and
* {@link C#SAMPLE_FLAG_ENCRYPTED}
* Flags that accompany the sample. A combination of {@link C#SAMPLE_FLAG_SYNC}
,
* {@link C#SAMPLE_FLAG_ENCRYPTED}
and {@link C#SAMPLE_FLAG_DECODE_ONLY}.
*/
public
int
flags
;
...
...
@@ -60,11 +60,6 @@ public final class SampleHolder {
*/
public
long
timeUs
;
/**
* If true then the sample should be decoded, but should not be presented.
*/
public
boolean
decodeOnly
;
private
final
int
bufferReplacementMode
;
/**
...
...
@@ -96,6 +91,27 @@ public final class SampleHolder {
}
/**
* Returns whether {@link #flags} has {@link C#SAMPLE_FLAG_ENCRYPTED} set.
*/
public
boolean
isEncrypted
()
{
return
(
flags
&
C
.
SAMPLE_FLAG_ENCRYPTED
)
!=
0
;
}
/**
* Returns whether {@link #flags} has {@link C#SAMPLE_FLAG_DECODE_ONLY} set.
*/
public
boolean
isDecodeOnly
()
{
return
(
flags
&
C
.
SAMPLE_FLAG_DECODE_ONLY
)
!=
0
;
}
/**
* Returns whether {@link #flags} has {@link C#SAMPLE_FLAG_SYNC} set.
*/
public
boolean
isSyncFrame
()
{
return
(
flags
&
C
.
SAMPLE_FLAG_SYNC
)
!=
0
;
}
/**
* Clears {@link #data}. Does nothing if {@link #data} is null.
*/
public
void
clearData
()
{
...
...
library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java
View file @
d745384d
...
...
@@ -358,7 +358,8 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback {
}
if
(
mediaChunk
.
read
(
sampleHolder
))
{
sampleHolder
.
decodeOnly
=
frameAccurateSeeking
&&
sampleHolder
.
timeUs
<
lastSeekPositionUs
;
boolean
decodeOnly
=
frameAccurateSeeking
&&
sampleHolder
.
timeUs
<
lastSeekPositionUs
;
sampleHolder
.
flags
|=
decodeOnly
?
C
.
SAMPLE_FLAG_DECODE_ONLY
:
0
;
onSampleRead
(
mediaChunk
,
sampleHolder
);
return
SAMPLE_READ
;
}
else
{
...
...
library/src/main/java/com/google/android/exoplayer/chunk/parser/webm/WebmExtractor.java
View file @
d745384d
...
...
@@ -467,8 +467,8 @@ public final class WebmExtractor implements Extractor {
}
long
elementEndOffsetBytes
=
elementOffsetBytes
+
headerSizeBytes
+
contentsSizeBytes
;
simpleBlockTimecodeUs
=
clusterTimecodeUs
+
timecodeUs
;
sampleHolder
.
flags
=
keyframe
?
C
.
SAMPLE_FLAG_SYNC
:
0
;
sampleHolder
.
decodeOnly
=
invisible
;
sampleHolder
.
flags
=
(
keyframe
?
C
.
SAMPLE_FLAG_SYNC
:
0
)
|
(
invisible
?
C
.
SAMPLE_FLAG_DECODE_ONLY
:
0
)
;
sampleHolder
.
timeUs
=
clusterTimecodeUs
+
timecodeUs
;
sampleHolder
.
size
=
(
int
)
(
elementEndOffsetBytes
-
reader
.
getBytesRead
());
...
...
library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java
View file @
d745384d
...
...
@@ -15,6 +15,7 @@
*/
package
com
.
google
.
android
.
exoplayer
.
hls
;
import
com.google.android.exoplayer.C
;
import
com.google.android.exoplayer.MediaFormat
;
import
com.google.android.exoplayer.MediaFormatHolder
;
import
com.google.android.exoplayer.SampleHolder
;
...
...
@@ -223,7 +224,8 @@ public class HlsSampleSource implements SampleSource, Loader.Callback {
}
if
(
extractor
.
getSample
(
track
,
sampleHolder
))
{
sampleHolder
.
decodeOnly
=
frameAccurateSeeking
&&
sampleHolder
.
timeUs
<
lastSeekPositionUs
;
boolean
decodeOnly
=
frameAccurateSeeking
&&
sampleHolder
.
timeUs
<
lastSeekPositionUs
;
sampleHolder
.
flags
|=
decodeOnly
?
C
.
SAMPLE_FLAG_DECODE_ONLY
:
0
;
return
SAMPLE_READ
;
}
...
...
library/src/main/java/com/google/android/exoplayer/hls/parser/RollingSampleBuffer.java
View file @
d745384d
...
...
@@ -97,7 +97,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
// Write the sample information into the holder and extrasHolder.
infoQueue
.
peekSample
(
sampleHolder
,
extrasHolder
);
// Read encryption data if the sample is encrypted.
if
(
(
sampleHolder
.
flags
&
C
.
SAMPLE_FLAG_ENCRYPTED
)
!=
0
)
{
if
(
sampleHolder
.
isEncrypted
()
)
{
readEncryptionData
(
sampleHolder
,
extrasHolder
);
}
// Write the sample data into the holder.
...
...
library/src/main/java/com/google/android/exoplayer/hls/parser/SampleQueue.java
View file @
d745384d
...
...
@@ -15,7 +15,6 @@
*/
package
com
.
google
.
android
.
exoplayer
.
hls
.
parser
;
import
com.google.android.exoplayer.C
;
import
com.google.android.exoplayer.MediaFormat
;
import
com.google.android.exoplayer.SampleHolder
;
import
com.google.android.exoplayer.hls.parser.HlsExtractor.TrackOutput
;
...
...
@@ -128,8 +127,7 @@ public final class SampleQueue implements TrackOutput {
}
RollingSampleBuffer
nextRollingBuffer
=
nextQueue
.
rollingBuffer
;
while
(
nextRollingBuffer
.
peekSample
(
sampleInfoHolder
)
&&
(
sampleInfoHolder
.
timeUs
<
firstPossibleSpliceTime
||
(
sampleInfoHolder
.
flags
&
C
.
SAMPLE_FLAG_SYNC
)
==
0
))
{
&&
(
sampleInfoHolder
.
timeUs
<
firstPossibleSpliceTime
||
!
sampleInfoHolder
.
isSyncFrame
()))
{
// Discard samples from the next queue for as long as they are before the earliest possible
// splice time, or not keyframes.
nextRollingBuffer
.
skipSample
();
...
...
@@ -152,7 +150,7 @@ public final class SampleQueue implements TrackOutput {
private
boolean
advanceToEligibleSample
()
{
boolean
haveNext
=
rollingBuffer
.
peekSample
(
sampleInfoHolder
);
if
(
needKeyframe
)
{
while
(
haveNext
&&
(
sampleInfoHolder
.
flags
&
C
.
SAMPLE_FLAG_SYNC
)
==
0
)
{
while
(
haveNext
&&
!
sampleInfoHolder
.
isSyncFrame
()
)
{
rollingBuffer
.
skipSample
();
haveNext
=
rollingBuffer
.
peekSample
(
sampleInfoHolder
);
}
...
...
library/src/main/java/com/google/android/exoplayer/source/FrameworkSampleExtractor.java
View file @
d745384d
...
...
@@ -15,7 +15,6 @@
*/
package
com
.
google
.
android
.
exoplayer
.
source
;
import
com.google.android.exoplayer.C
;
import
com.google.android.exoplayer.MediaFormat
;
import
com.google.android.exoplayer.SampleHolder
;
import
com.google.android.exoplayer.SampleSource
;
...
...
@@ -164,7 +163,7 @@ public final class FrameworkSampleExtractor implements SampleExtractor {
}
sampleHolder
.
timeUs
=
mediaExtractor
.
getSampleTime
();
sampleHolder
.
flags
=
mediaExtractor
.
getSampleFlags
();
if
(
(
sampleHolder
.
flags
&
C
.
SAMPLE_FLAG_ENCRYPTED
)
!=
0
)
{
if
(
sampleHolder
.
isEncrypted
()
)
{
sampleHolder
.
cryptoInfo
.
setFromExtractorV16
(
mediaExtractor
);
}
...
...
library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java
View file @
d745384d
...
...
@@ -179,7 +179,7 @@ public class TextTrackRenderer extends TrackRenderer implements Callback {
SampleHolder
sampleHolder
=
parserHelper
.
getSampleHolder
();
sampleHolder
.
clearData
();
int
result
=
source
.
readData
(
trackIndex
,
positionUs
,
formatHolder
,
sampleHolder
,
false
);
if
(
result
==
SampleSource
.
SAMPLE_READ
&&
!
sampleHolder
.
decodeOnly
)
{
if
(
result
==
SampleSource
.
SAMPLE_READ
&&
!
sampleHolder
.
isDecodeOnly
()
)
{
parserHelper
.
startParseOperation
();
textRendererNeedsUpdate
=
false
;
}
else
if
(
result
==
SampleSource
.
END_OF_STREAM
)
{
...
...
library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608Parser.java
View file @
d745384d
...
...
@@ -200,7 +200,7 @@ public class Eia608Parser {
ClosedCaption
[]
captionArray
=
new
ClosedCaption
[
captions
.
size
()];
captions
.
toArray
(
captionArray
);
return
new
ClosedCaptionList
(
sampleHolder
.
timeUs
,
sampleHolder
.
decodeOnly
,
captionArray
);
return
new
ClosedCaptionList
(
sampleHolder
.
timeUs
,
sampleHolder
.
isDecodeOnly
()
,
captionArray
);
}
private
static
char
getChar
(
byte
ccData
)
{
...
...
library/src/test/java/com/google/android/exoplayer/chunk/parser/webm/WebmExtractorTest.java
View file @
d745384d
...
...
@@ -358,9 +358,9 @@ public class WebmExtractorTest extends InstrumentationTestCase {
assertTrue
(
Arrays
.
equals
(
mediaSegment
.
videoBytes
,
Arrays
.
copyOf
(
sampleHolder
.
data
.
array
(),
sampleHolder
.
size
)));
assertEquals
(
timeUs
,
sampleHolder
.
timeUs
);
assertEquals
(
keyframe
,
(
sampleHolder
.
flags
&
C
.
SAMPLE_FLAG_SYNC
)
!=
0
);
assertEquals
(
invisible
,
sampleHolder
.
decodeOnly
);
assertEquals
(
encrypted
,
(
sampleHolder
.
flags
&
C
.
SAMPLE_FLAG_ENCRYPTED
)
!=
0
);
assertEquals
(
keyframe
,
sampleHolder
.
isSyncFrame
()
);
assertEquals
(
invisible
,
sampleHolder
.
isDecodeOnly
()
);
assertEquals
(
encrypted
,
sampleHolder
.
isEncrypted
()
);
if
(
encrypted
)
{
android
.
test
.
MoreAsserts
.
assertEquals
(
TEST_INITIALIZATION_VECTOR
,
sampleHolder
.
cryptoInfo
.
iv
);
assertEquals
(
C
.
CRYPTO_MODE_AES_CTR
,
sampleHolder
.
cryptoInfo
.
mode
);
...
...
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