From 9609302b3d4e7272fe48752db5a79c5a06ef2354 Mon Sep 17 00:00:00 2001 From: vigneshv Date: Tue, 24 May 2016 16:42:48 -0700 Subject: [PATCH] Support VPx in ISO-BMFF (MP4) Container Netflix created a spec to encapsulate VPx codecs in ISO-BMFF (MP4) Container [1]. This CL adds support for VP8 and VP9 video codecs in the MP4 container. [1] https://github.com/Netflix/vp9-dash/blob/master/Downloads/VPCodecISOMediaFileFormatBinding.pdf ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=123160650 --- .../google/android/exoplayer/demo/Samples.java | 2 ++ .../android/exoplayer/extractor/mp4/Atom.java | 3 +++ .../exoplayer/extractor/mp4/AtomParsers.java | 15 ++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java b/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java index 93ac31ddf1..de21755770 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java @@ -271,6 +271,8 @@ import java.util.UUID; "https://storage.googleapis.com/exoplayer-test-media-1/ogg/play.ogg", Util.TYPE_OTHER), Sample.newSample("Google Glass (WebM Video with Vorbis Audio)", "http://demos.webmproject.org/exoplayer/glass_vp9_vorbis.webm", Util.TYPE_OTHER), + Sample.newSample("Google Glass (VP9 in MP4/ISO-BMFF)", + "http://demos.webmproject.org/exoplayer/glass.mp4", Util.TYPE_OTHER), Sample.newSample("Google Glass DASH - VP9 and Opus", "http://demos.webmproject.org/dash/201410/vp9_glass/manifest_vp9_opus.mpd", Util.TYPE_DASH), diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Atom.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Atom.java index 5556e27e25..7a0bd4a63f 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Atom.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Atom.java @@ -123,6 +123,9 @@ import java.util.List; public static final int TYPE_mean = Util.getIntegerCodeForString("mean"); public static final int TYPE_name = Util.getIntegerCodeForString("name"); public static final int TYPE_data = Util.getIntegerCodeForString("data"); + public static final int TYPE_vp08 = Util.getIntegerCodeForString("vp08"); + public static final int TYPE_vp09 = Util.getIntegerCodeForString("vp09"); + public static final int TYPE_vpcC = Util.getIntegerCodeForString("vpcC"); public static final int TYPE_DASHES = Util.getIntegerCodeForString("----"); public final int type; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java index 3edf95115d..f4472214b1 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java @@ -589,9 +589,10 @@ import java.util.List; if (childAtomType == Atom.TYPE_avc1 || childAtomType == Atom.TYPE_avc3 || childAtomType == Atom.TYPE_encv || childAtomType == Atom.TYPE_mp4v || childAtomType == Atom.TYPE_hvc1 || childAtomType == Atom.TYPE_hev1 - || childAtomType == Atom.TYPE_s263) { - parseVideoSampleEntry(stsd, childStartPosition, childAtomSize, trackId, rotationDegrees, - drmInitData, out, i); + || childAtomType == Atom.TYPE_s263 || childAtomType == Atom.TYPE_vp08 + || childAtomType == Atom.TYPE_vp09) { + parseVideoSampleEntry(stsd, childAtomType, childStartPosition, childAtomSize, trackId, + rotationDegrees, drmInitData, out, i); } else if (childAtomType == Atom.TYPE_mp4a || childAtomType == Atom.TYPE_enca || childAtomType == Atom.TYPE_ac_3 || childAtomType == Atom.TYPE_ec_3 || childAtomType == Atom.TYPE_dtsc || childAtomType == Atom.TYPE_dtse @@ -619,8 +620,9 @@ import java.util.List; return out; } - private static void parseVideoSampleEntry(ParsableByteArray parent, int position, int size, - int trackId, int rotationDegrees, DrmInitData drmInitData, StsdData out, int entryIndex) { + private static void parseVideoSampleEntry(ParsableByteArray parent, int atomType, int position, + int size, int trackId, int rotationDegrees, DrmInitData drmInitData, StsdData out, + int entryIndex) { parent.setPosition(position + Atom.HEADER_SIZE); parent.skipBytes(24); @@ -673,6 +675,9 @@ import java.util.List; } else if (childAtomType == Atom.TYPE_pasp) { pixelWidthHeightRatio = parsePaspFromParent(parent, childStartPosition); pixelWidthHeightRatioFromPasp = true; + } else if (childAtomType == Atom.TYPE_vpcC) { + Assertions.checkState(mimeType == null); + mimeType = (atomType == Atom.TYPE_vp08) ? MimeTypes.VIDEO_VP8 : MimeTypes.VIDEO_VP9; } childPosition += childAtomSize; }