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
51405c99
authored
Feb 27, 2018
by
ojw28
Committed by
GitHub
Feb 27, 2018
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge pull request #3863 from drhill/dev-v2_mkvDIVX
add h263 format support in fourcc codecID
parents
dc34ff2e
eae1606b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
29 additions
and
28 deletions
library/core/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java
library/core/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java
View file @
51405c99
...
...
@@ -18,6 +18,7 @@ package com.google.android.exoplayer2.extractor.mkv;
import
android.support.annotation.IntDef
;
import
android.support.annotation.Nullable
;
import
android.util.Log
;
import
android.util.Pair
;
import
android.util.SparseArray
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.Format
;
...
...
@@ -219,6 +220,7 @@ public final class MatroskaExtractor implements Extractor {
private
static
final
int
LACING_EBML
=
3
;
private
static
final
int
FOURCC_COMPRESSION_VC1
=
0x31435657
;
private
static
final
int
FOURCC_COMPRESSION_DIVX
=
0x58564944
;
/**
* A template for the prefix that must be added to each subrip sample. The 12 byte end timecode
...
...
@@ -1711,13 +1713,9 @@ public final class MatroskaExtractor implements Extractor {
nalUnitLengthFieldLength
=
hevcConfig
.
nalUnitLengthFieldLength
;
break
;
case
CODEC_ID_FOURCC:
initializationData
=
parseFourCcVc1Private
(
new
ParsableByteArray
(
codecPrivate
));
if
(
initializationData
!=
null
)
{
mimeType
=
MimeTypes
.
VIDEO_VC1
;
}
else
{
Log
.
w
(
TAG
,
"Unsupported FourCC. Setting mimeType to "
+
MimeTypes
.
VIDEO_UNKNOWN
);
mimeType
=
MimeTypes
.
VIDEO_UNKNOWN
;
}
Pair
<
String
,
List
<
byte
[]>>
pair
=
parseFourCcPrivate
(
new
ParsableByteArray
(
codecPrivate
));
mimeType
=
pair
.
first
;
initializationData
=
pair
.
second
;
break
;
case
CODEC_ID_THEORA:
// TODO: This can be set to the real mimeType if/when we work out what initializationData
...
...
@@ -1932,38 +1930,41 @@ public final class MatroskaExtractor implements Extractor {
/**
* Builds initialization data for a {@link Format} from FourCC codec private data.
* <p>
* VC1
is the only supported compression type
.
* VC1
and H263 are the only supported compression types
.
*
* @return The initialization data for the {@link Format}, or null if the compression type is
* not VC1.
* @return A pair object with the first object being the codec mime type
* and the second object the initialization data for the {@link Format},
* or null if the compression type is not a currently supported type (VC1 or H263).
* @throws ParserException If the initialization data could not be built.
*/
private
static
List
<
byte
[]>
parseFourCcVc1
Private
(
ParsableByteArray
buffer
)
private
static
Pair
<
String
,
List
<
byte
[]>>
parseFourCc
Private
(
ParsableByteArray
buffer
)
throws
ParserException
{
try
{
buffer
.
skipBytes
(
16
);
// size(4), width(4), height(4), planes(2), bitcount(2).
long
compression
=
buffer
.
readLittleEndianUnsignedInt
();
if
(
compression
!=
FOURCC_COMPRESSION_VC1
)
{
return
n
ull
;
}
// Search for the initialization data from the end of the BITMAPINFOHEADER. The last 20
// bytes of which are: sizeImage(4), xPel/m (4), yPel/m (4), clrUsed(4), clrImportant(4).
int
startOffset
=
buffer
.
getPosition
()
+
20
;
byte
[]
bufferData
=
buffer
.
data
;
for
(
int
offset
=
startOffset
;
offset
<
bufferData
.
length
-
4
;
offset
++)
{
if
(
bufferData
[
offset
]
==
0x00
&&
bufferData
[
offset
+
1
]
==
0x00
&&
bufferData
[
offset
+
2
]
==
0x01
&&
bufferData
[
offset
+
3
]
==
0x0F
)
{
// We've found the initialization data.
byte
[]
initializationData
=
Arrays
.
copyOfRange
(
bufferData
,
offset
,
bufferData
.
length
);
return
Collections
.
singletonList
(
initializationData
);
if
(
compression
==
FOURCC_COMPRESSION_DIVX
)
{
return
n
ew
Pair
<>(
MimeTypes
.
VIDEO_H263
,
null
)
;
}
else
if
(
compression
==
FOURCC_COMPRESSION_VC1
)
{
// Search for the initialization data from the end of the BITMAPINFOHEADER. The last 20
// bytes of which are: sizeImage(4), xPel/m (4), yPel/m (4), clrUsed(4), clrImportant(4).
int
startOffset
=
buffer
.
getPosition
()
+
20
;
byte
[]
bufferData
=
buffer
.
data
;
for
(
int
offset
=
startOffset
;
offset
<
bufferData
.
length
-
4
;
offset
++)
{
if
(
bufferData
[
offset
]
==
0x00
&&
bufferData
[
offset
+
1
]
==
0x00
&&
bufferData
[
offset
+
2
]
==
0x01
&&
bufferData
[
offset
+
3
]
==
0x0F
)
{
// We've found the initialization data.
byte
[]
initializationData
=
Arrays
.
copyOfRange
(
bufferData
,
offset
,
bufferData
.
length
);
return
new
Pair
<>(
MimeTypes
.
VIDEO_VC1
,
Collections
.
singletonList
(
initializationData
)
);
}
}
throw
new
ParserException
(
"Failed to find FourCC VC1 initialization data"
);
}
throw
new
ParserException
(
"Failed to find FourCC VC1 initialization data"
);
}
catch
(
ArrayIndexOutOfBoundsException
e
)
{
throw
new
ParserException
(
"Error parsing FourCC
VC1 codec private
"
);
throw
new
ParserException
(
"Error parsing FourCC
private data
"
);
}
Log
.
w
(
TAG
,
"Unknown FourCC. Setting mimeType to "
+
MimeTypes
.
VIDEO_UNKNOWN
);
return
new
Pair
<>(
MimeTypes
.
VIDEO_UNKNOWN
,
null
);
}
/**
...
...
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