summaryrefslogtreecommitdiff
path: root/extensions/TimedMediaHandler/handlers/Mp4Handler
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/TimedMediaHandler/handlers/Mp4Handler')
-rw-r--r--extensions/TimedMediaHandler/handlers/Mp4Handler/Mp4Handler.php139
1 files changed, 139 insertions, 0 deletions
diff --git a/extensions/TimedMediaHandler/handlers/Mp4Handler/Mp4Handler.php b/extensions/TimedMediaHandler/handlers/Mp4Handler/Mp4Handler.php
new file mode 100644
index 00000000..897e1017
--- /dev/null
+++ b/extensions/TimedMediaHandler/handlers/Mp4Handler/Mp4Handler.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * MP4 handler
+ */
+class Mp4Handler extends ID3Handler {
+
+ /**
+ * @param $path string
+ * @return array
+ */
+ protected function getID3( $path ) {
+ $id3 = parent::getID3( $path );
+ // Unset some parts of id3 that are too detailed and matroska specific:
+ unset( $id3['quicktime'] );
+ return $id3;
+ }
+
+ /**
+ * Get the "media size"
+ * @param $file File
+ * @param $path string
+ * @param $metadata bool
+ * @return array|bool
+ */
+ function getImageSize( $file, $path, $metadata = false ) {
+ // Just return the size of the first video stream
+ if ( $metadata === false ) {
+ $metadata = $file->getMetadata();
+ }
+ $metadata = $this->unpackMetadata( $metadata );
+ if ( isset( $metadata['error'] ) ) {
+ return false;
+ }
+ if( isset( $metadata['video']['resolution_x'])
+ &&
+ isset( $metadata['video']['resolution_y'])
+ ){
+ return array (
+ $metadata['video']['resolution_x'],
+ $metadata['video']['resolution_y']
+ );
+ }
+ return array( false, false );
+ }
+
+ /**
+ * @param $image
+ * @return string
+ */
+ function getMetadataType( $image ) {
+ return 'mp4';
+ }
+ /**
+ * @param $file File
+ */
+ function getWebType( $file ) {
+ /**
+ * h.264 profile types:
+ H.264 Simple baseline profile video (main and extended video compatible) level 3 and Low-Complexity AAC audio in MP4 container:
+ type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'
+
+ H.264 Extended profile video (baseline-compatible) level 3 and Low-Complexity AAC audio in MP4 container:
+ type='video/mp4; codecs="avc1.58A01E, mp4a.40.2"'
+
+ H.264 Main profile video level 3 and Low-Complexity AAC audio in MP4 container
+ type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"'
+
+ H.264 ‘High’ profile video (incompatible with main, baseline, or extended profiles) level 3 and Low-Complexity AAC audio in MP4 container
+ type='video/mp4; codecs="avc1.64001E, mp4a.40.2"'
+ */
+ // all h.264 encodes are currently simple profile
+ return 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
+ }
+ /**
+ * @param $file File
+ * @return array|bool
+ */
+ function getStreamTypes( $file ) {
+ $streamTypes = array();
+ $metadata = self::unpackMetadata( $file->getMetadata() );
+ if ( !$metadata || isset( $metadata['error'] ) ) {
+ return false;
+ }
+ if( isset( $metadata['audio'] ) && $metadata['audio']['dataformat'] == 'mp4' ){
+ if( isset( $metadata['audio']['codec'] )
+ &&
+ strpos( $metadata['audio']['codec'] , 'AAC' ) !== false
+ ){
+ $streamTypes[] = 'AAC';
+ } else {
+ $streamTypes[] = $metadata['audio']['codec'];
+ }
+ }
+ // id3 gives 'V_VP8' for what we call VP8
+ if( $metadata['video']['dataformat'] == 'quicktime' ){
+ $streamTypes[] = 'h.264';
+ }
+
+ return $streamTypes;
+ }
+
+ /**
+ * @param $file File
+ * @return String
+ */
+ function getShortDesc( $file ) {
+ $streamTypes = $this->getStreamTypes( $file );
+ if ( !$streamTypes ) {
+ return parent::getShortDesc( $file );
+ }
+ return wfMessage( 'timedmedia-mp4-short-video', implode( '/', $streamTypes )
+ )->timeperiodParams(
+ $this->getLength( $file )
+ )->text();
+ }
+
+ /**
+ * @param $file File
+ * @return String
+ */
+ function getLongDesc( $file ) {
+ $streamTypes = $this->getStreamTypes( $file );
+ if ( !$streamTypes ) {
+ return parent::getLongDesc( $file );
+ }
+ return wfMessage('timedmedia-mp4-long-video',
+ implode( '/', $streamTypes )
+ )->timeperiodParams(
+ $this->getLength( $file )
+ )->bitrateParams(
+ $this->getBitRate( $file )
+ )->numParams(
+ $file->getWidth(),
+ $file->getHeight()
+ )->text();
+
+ }
+
+}