Bug 1275812 - Experiment with exporting track mime-type. r=kinetik
☠☠ backed out by 856903d82b90 ☠ ☠
authorRalph Giles <giles@mozilla.com>
Mon, 04 Apr 2016 11:28:05 -0700
changeset 340214 aa1d245e0af392ca48e991661c0c38a84ba2e360
parent 340213 49beae1792077eba5b790baa7d3c1a37ca3eb609
child 340215 c08a10627942f3fc0ecd054e0497e36baa9f0637
push id1183
push userraliiev@mozilla.com
push dateMon, 05 Sep 2016 20:01:49 +0000
treeherdermozilla-release@3148731bed45 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskinetik
bugs1275812
milestone49.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1275812 - Experiment with exporting track mime-type. r=kinetik MozReview-Commit-ID: 9CynVkwtUn2
media/libstagefright/binding/include/mp4parse.h
media/libstagefright/binding/mp4parse-codecs.patch
media/libstagefright/binding/mp4parse/capi.rs
media/libstagefright/binding/update-rust.sh
--- a/media/libstagefright/binding/include/mp4parse.h
+++ b/media/libstagefright/binding/include/mp4parse.h
@@ -17,16 +17,22 @@ struct mp4parse_state;
 #define MP4PARSE_ERROR_UNSUPPORTED 3 // Error::Unsupported
 #define MP4PARSE_ERROR_EOF 4         // Error::UnexpectedEOF
 #define MP4PARSE_ASSERT 5            // Error::AssertCaught
 #define MP4PARSE_ERROR_IO 6          // Error::Io(_)
 
 #define MP4PARSE_TRACK_TYPE_H264 0 // "video/avc"
 #define MP4PARSE_TRACK_TYPE_AAC  1 // "audio/mp4a-latm"
 
+#define MP4PARSE_TRACK_CODEC_UNKNOWN 0
+#define MP4PARSE_TRACK_CODEC_AAC 1
+#define MP4PARSE_TRACK_CODEC_OPUS 2
+#define MP4PARSE_TRACK_CODEC_H264 3
+#define MP4PARSE_TRACK_CODEC_VP9 4
+
 struct mp4parse_track_audio_info {
   uint16_t channels;
   uint16_t bit_depth;
   uint32_t sample_rate;
 };
 
 struct mp4parse_track_video_info {
   uint32_t display_width;
new file mode 100644
--- /dev/null
+++ b/media/libstagefright/binding/mp4parse-codecs.patch
@@ -0,0 +1,42 @@
+diff --git a/media/libstagefright/binding/mp4parse/capi.rs b/media/libstagefright/binding/mp4parse/capi.rs
+index ed7e566..2441d2a 100644
+--- a/media/libstagefright/binding/mp4parse/capi.rs
++++ b/media/libstagefright/binding/mp4parse/capi.rs
+@@ -49,12 +49,20 @@ const MP4PARSE_ERROR_IO: i32 = 6;
+ const TRACK_TYPE_H264: u32 = 0;
+ const TRACK_TYPE_AAC: u32 = 1;
+ 
++/// Map Track mime_type to uint32 constants.
++const TRACK_CODEC_UNKNOWN: u32 = 0;
++const TRACK_CODEC_AAC: u32 = 1;
++const TRACK_CODEC_OPUS: u32 = 2;
++const TRACK_CODEC_H264: u32 = 3;
++const TRACK_CODEC_VP9: u32 = 4;
++
+ // These structs *must* match those declared in include/mp4parse.h.
+ 
+ #[repr(C)]
+ pub struct TrackInfo {
+     track_type: u32,
+     track_id: u32,
++    codec: u32,
+     duration: u64,
+     media_time: i64, // wants to be u64? understand how elst adjustment works
+     // TODO(kinetik): include crypto guff
+@@ -166,6 +174,16 @@ pub unsafe extern "C" fn mp4parse_get_track_info(context: *mut MediaContext, tra
+         TrackType::Unknown => return MP4PARSE_ERROR_UNSUPPORTED,
+     };
+ 
++    info.codec = match &*context.tracks[track_index].mime_type {
++        "audio/opus" => TRACK_CODEC_OPUS,
++        "audio/aac" |
++        "audio/mp4a-latm" => TRACK_CODEC_AAC,
++        "video/vp9" => TRACK_CODEC_VP9,
++        "video/h264" |
++        "video/avc" => TRACK_CODEC_H264,
++        _ => TRACK_CODEC_UNKNOWN,
++    };
++
+     // Maybe context & track should just have a single simple is_valid() instead?
+     if context.timescale.is_none() ||
+        context.tracks[track_index].timescale.is_none() ||
--- a/media/libstagefright/binding/mp4parse/capi.rs
+++ b/media/libstagefright/binding/mp4parse/capi.rs
@@ -44,22 +44,30 @@ const MP4PARSE_ERROR_UNSUPPORTED: i32 = 
 const MP4PARSE_ERROR_EOF: i32 = 4;
 const MP4PARSE_ASSERT: i32 = 5;
 const MP4PARSE_ERROR_IO: i32 = 6;
 
 /// Map TrackType to uint32 constants.
 const TRACK_TYPE_H264: u32 = 0;
 const TRACK_TYPE_AAC: u32 = 1;
 
+/// Map Track mime_type to uint32 constants.
+const TRACK_CODEC_UNKNOWN: u32 = 0;
+const TRACK_CODEC_AAC: u32 = 1;
+const TRACK_CODEC_OPUS: u32 = 2;
+const TRACK_CODEC_H264: u32 = 3;
+const TRACK_CODEC_VP9: u32 = 4;
+
 // These structs *must* match those declared in include/mp4parse.h.
 
 #[repr(C)]
 pub struct TrackInfo {
     track_type: u32,
     track_id: u32,
+    codec: u32,
     duration: u64,
     media_time: i64, // wants to be u64? understand how elst adjustment works
     // TODO(kinetik): include crypto guff
 }
 
 #[repr(C)]
 pub struct TrackAudioInfo {
     channels: u16,
@@ -168,16 +176,24 @@ pub unsafe extern "C" fn mp4parse_get_tr
     }
 
     info.track_type = match context.tracks[track_index].track_type {
         TrackType::Video => TRACK_TYPE_H264,
         TrackType::Audio => TRACK_TYPE_AAC,
         TrackType::Unknown => return MP4PARSE_ERROR_UNSUPPORTED,
     };
 
+    info.codec = match &*context.tracks[track_index].mime_type {
+        "audio/opus" => TRACK_CODEC_OPUS,
+        "video/vp9" => TRACK_CODEC_VP9,
+        "video/h264" => TRACK_CODEC_H264,
+        "audio/aac" => TRACK_CODEC_AAC,
+        _ => TRACK_CODEC_UNKNOWN,
+    };
+
     // Maybe context & track should just have a single simple is_valid() instead?
     if context.timescale.is_none() ||
        context.tracks[track_index].timescale.is_none() ||
        context.tracks[track_index].duration.is_none() ||
        context.tracks[track_index].track_id.is_none() {
         return MP4PARSE_ERROR_INVALID;
     }
 
--- a/media/libstagefright/binding/update-rust.sh
+++ b/media/libstagefright/binding/update-rust.sh
@@ -30,13 +30,14 @@ rm -rf mp4parse/byteorder
 mkdir mp4parse/byteorder
 cp _upstream/byteorder/src/lib.rs mp4parse/byteorder/mod.rs
 cp _upstream/byteorder/src/new.rs mp4parse/byteorder/new.rs
 
 echo "Applying patches..."
 patch -p4 < byteorder-mod.patch
 patch -p4 < mp4parse-mod.patch
 patch -p4 < mp4parse-thread.patch
+patch -p4 < mp4parse-codecs.patch
 
 echo "Cleaning up..."
 rm -rf _upstream
 
 echo "Updated to ${VER}."