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
435e7d5a
authored
Jan 09, 2022
by
OxygenCobalt
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add opus metadata parsing
Add metadata parsing for the Opus format.
parent
60df845d
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
12 deletions
library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OpusReader.java
library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/VorbisReader.java
library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OpusReader.java
View file @
435e7d5a
...
@@ -17,10 +17,16 @@ package com.google.android.exoplayer2.extractor.ogg;
...
@@ -17,10 +17,16 @@ package com.google.android.exoplayer2.extractor.ogg;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Assertions
.
checkNotNull
;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Assertions
.
checkNotNull
;
import
androidx.annotation.Nullable
;
import
com.google.android.exoplayer2.Format
;
import
com.google.android.exoplayer2.Format
;
import
com.google.android.exoplayer2.audio.OpusUtil
;
import
com.google.android.exoplayer2.audio.OpusUtil
;
import
com.google.android.exoplayer2.extractor.VorbisUtil
;
import
com.google.android.exoplayer2.metadata.Metadata
;
import
com.google.android.exoplayer2.util.MimeTypes
;
import
com.google.android.exoplayer2.util.MimeTypes
;
import
com.google.android.exoplayer2.util.ParsableByteArray
;
import
com.google.android.exoplayer2.util.ParsableByteArray
;
import
java.io.IOException
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.List
;
import
org.checkerframework.checker.nullness.qual.EnsuresNonNullIf
;
import
org.checkerframework.checker.nullness.qual.EnsuresNonNullIf
;
...
@@ -28,18 +34,18 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
...
@@ -28,18 +34,18 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
/** {@link StreamReader} to extract Opus data out of Ogg byte stream. */
/** {@link StreamReader} to extract Opus data out of Ogg byte stream. */
/* package */
final
class
OpusReader
extends
StreamReader
{
/* package */
final
class
OpusReader
extends
StreamReader
{
private
static
final
int
OPUS_CODE
=
0x4f707573
;
private
static
final
byte
[]
OPUS_ID_SIGNATURE
=
{
'O'
,
'p'
,
'u'
,
's'
,
'H'
,
'e'
,
'a'
,
'd'
}
;
private
static
final
byte
[]
OPUS_
SIGNATURE
=
{
'O'
,
'p'
,
'u'
,
's'
,
'H'
,
'e'
,
'a'
,
'd
'
};
private
static
final
byte
[]
OPUS_
TAG_SIGNATURE
=
{
'O'
,
'p'
,
'u'
,
's'
,
'T'
,
'a'
,
'g'
,
's
'
};
private
boolean
headerRead
;
private
boolean
headerRead
;
public
static
boolean
verifyBitstreamType
(
ParsableByteArray
data
)
{
public
static
boolean
verifyBitstreamType
(
ParsableByteArray
data
)
{
if
(
data
.
bytesLeft
()
<
OPUS_SIGNATURE
.
length
)
{
if
(
data
.
bytesLeft
()
<
OPUS_
ID_
SIGNATURE
.
length
)
{
return
false
;
return
false
;
}
}
byte
[]
header
=
new
byte
[
OPUS_SIGNATURE
.
length
];
byte
[]
header
=
new
byte
[
OPUS_
ID_
SIGNATURE
.
length
];
data
.
readBytes
(
header
,
0
,
OPUS_SIGNATURE
.
length
);
data
.
readBytes
(
header
,
0
,
OPUS_
ID_
SIGNATURE
.
length
);
return
Arrays
.
equals
(
header
,
OPUS_SIGNATURE
);
return
Arrays
.
equals
(
header
,
OPUS_
ID_
SIGNATURE
);
}
}
@Override
@Override
...
@@ -57,7 +63,8 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
...
@@ -57,7 +63,8 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
@Override
@Override
@EnsuresNonNullIf
(
expression
=
"#3.format"
,
result
=
false
)
@EnsuresNonNullIf
(
expression
=
"#3.format"
,
result
=
false
)
protected
boolean
readHeaders
(
ParsableByteArray
packet
,
long
position
,
SetupData
setupData
)
{
protected
boolean
readHeaders
(
ParsableByteArray
packet
,
long
position
,
SetupData
setupData
)
throws
IOException
{
if
(!
headerRead
)
{
if
(!
headerRead
)
{
byte
[]
headerBytes
=
Arrays
.
copyOf
(
packet
.
getData
(),
packet
.
limit
());
byte
[]
headerBytes
=
Arrays
.
copyOf
(
packet
.
getData
(),
packet
.
limit
());
int
channelCount
=
OpusUtil
.
getChannelCount
(
headerBytes
);
int
channelCount
=
OpusUtil
.
getChannelCount
(
headerBytes
);
...
@@ -69,13 +76,41 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
...
@@ -69,13 +76,41 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
.
setSampleRate
(
OpusUtil
.
SAMPLE_RATE
)
.
setSampleRate
(
OpusUtil
.
SAMPLE_RATE
)
.
setInitializationData
(
initializationData
)
.
setInitializationData
(
initializationData
)
.
build
();
.
build
();
headerRead
=
true
;
headerRead
=
true
;
return
true
;
return
true
;
}
else
{
}
else
{
checkNotNull
(
setupData
.
format
);
// Has been set when the header was read.
checkNotNull
(
setupData
.
format
);
// Has been set when the header was read.
boolean
headerPacket
=
packet
.
readInt
()
==
OPUS_CODE
;
packet
.
setPosition
(
0
);
// Handle the comments frame if we are working with one.
return
headerPacket
;
boolean
isComment
;
if
(
packet
.
bytesLeft
()
<
OPUS_TAG_SIGNATURE
.
length
)
{
isComment
=
false
;
}
else
{
byte
[]
header
=
new
byte
[
OPUS_TAG_SIGNATURE
.
length
];
packet
.
readBytes
(
header
,
0
,
OPUS_TAG_SIGNATURE
.
length
);
isComment
=
Arrays
.
equals
(
header
,
OPUS_TAG_SIGNATURE
);
}
if
(
isComment
)
{
VorbisUtil
.
CommentHeader
commentHeader
=
VorbisUtil
.
readVorbisCommentHeader
(
packet
,
false
,
false
);
@Nullable
Metadata
vorbisMetadata
=
VorbisUtil
.
buildMetadata
(
Arrays
.
asList
(
commentHeader
.
comments
)
);
setupData
.
format
=
setupData
.
format
.
buildUpon
()
.
setMetadata
(
vorbisMetadata
)
.
build
();
return
true
;
}
else
{
packet
.
setPosition
(
0
);
return
false
;
}
}
}
}
}
...
...
library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/VorbisReader.java
View file @
435e7d5a
...
@@ -114,8 +114,7 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
...
@@ -114,8 +114,7 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
codecInitializationData
.
add
(
vorbisSetup
.
setupHeaderData
);
codecInitializationData
.
add
(
vorbisSetup
.
setupHeaderData
);
@Nullable
Metadata
vorbisMetadata
=
VorbisUtil
.
buildMetadata
(
@Nullable
Metadata
vorbisMetadata
=
VorbisUtil
.
buildMetadata
(
Arrays
.
asList
(
vorbisSetup
.
commentHeader
.
comments
)
Arrays
.
asList
(
vorbisSetup
.
commentHeader
.
comments
));
);
setupData
.
format
=
setupData
.
format
=
new
Format
.
Builder
()
new
Format
.
Builder
()
...
...
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