aboutsummaryrefslogtreecommitdiff
path: root/libraries/phpvideotoolkit/adapters/ffmpeg-php/php-reader/src/Transform.php
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/phpvideotoolkit/adapters/ffmpeg-php/php-reader/src/Transform.php')
-rw-r--r--libraries/phpvideotoolkit/adapters/ffmpeg-php/php-reader/src/Transform.php745
1 files changed, 745 insertions, 0 deletions
diff --git a/libraries/phpvideotoolkit/adapters/ffmpeg-php/php-reader/src/Transform.php b/libraries/phpvideotoolkit/adapters/ffmpeg-php/php-reader/src/Transform.php
new file mode 100644
index 0000000..b39cd06
--- /dev/null
+++ b/libraries/phpvideotoolkit/adapters/ffmpeg-php/php-reader/src/Transform.php
@@ -0,0 +1,745 @@
+<?php
+/**
+ * PHP Reader Library
+ *
+ * Copyright (c) 2006-2008 The PHP Reader Project Workgroup. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of the project workgroup nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package php-reader
+ * @copyright Copyright (c) 2006-2008 The PHP Reader Project Workgroup
+ * @license http://code.google.com/p/php-reader/wiki/License New BSD License
+ * @version $Id: Transform.php 105 2008-07-30 14:56:47Z svollbehr $
+ */
+
+/**
+ * An utility class to perform simple byte transformations on data.
+ *
+ * @package php-reader
+ * @author Sven Vollbehr <svollbehr@gmail.com>
+ * @author Ryan Butterfield <buttza@gmail.com>
+ * @copyright Copyright (c) 2006-2008 The PHP Reader Project Workgroup
+ * @license http://code.google.com/p/php-reader/wiki/License New BSD License
+ * @version $Rev: 105 $
+ * @static
+ */
+final class Transform
+{
+ const MACHINE_ENDIAN_ORDER = 0;
+ const LITTLE_ENDIAN_ORDER = 1;
+ const BIG_ENDIAN_ORDER = 2;
+
+ /**
+ * Default private constructor for a static class.
+ */
+ private function __construct() {}
+
+ /**
+ * Returns whether the current machine endian order is little endian.
+ *
+ * @return boolean
+ */
+ public static function isLittleEndian()
+ {
+ return self::fromInt32("\x01\x00\x00\x00") == 1;
+ }
+
+ /**
+ * Returns whether the current machine endian order is big endian.
+ *
+ * @return boolean
+ */
+ public static function isBigEndian()
+ {
+ return self::fromInt32("\x00\x00\x00\x01") == 1;
+ }
+
+ /**
+ * Returns 64-bit float as little-endian ordered binary data string.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt64LE($value)
+ {
+ return pack("V*", $value & 0xffffffff, $value / (0xffffffff+1));
+ }
+
+ /**
+ * Returns little-endian ordered binary data as 64-bit float. PHP does not
+ * support 64-bit integers as the long integer is of 32-bits but using
+ * aritmetic operations it is implicitly converted into floating point which
+ * is of 64-bits long.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt64LE($value)
+ {
+ list(, $lolo, $lohi, $hilo, $hihi) = unpack("v*", $value);
+ return ($hihi * (0xffff+1) + $hilo) * (0xffffffff+1) +
+ ($lohi * (0xffff+1) + $lolo);
+ }
+
+ /**
+ * Returns 64-bit float as big-endian ordered binary data string.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt64BE($value)
+ {
+ return pack("N*", $value / (0xffffffff+1), $value & 0xffffffff);
+ }
+
+ /**
+ * Returns big-endian ordered binary data as 64-bit float. PHP does not
+ * support 64-bit integers as the long integer is of 32-bits but using
+ * aritmetic operations it is implicitly converted into floating point which
+ * is of 64-bits long.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt64BE($value)
+ {
+ list(, $hihi, $hilo, $lohi, $lolo) = unpack("n*", $value);
+ return ($hihi * (0xffff+1) + $hilo) * (0xffffffff+1) +
+ ($lohi * (0xffff+1) + $lolo);
+ }
+
+ /**
+ * Returns signed 32-bit integer as machine-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt32($value)
+ {
+ return pack("l*", $value);
+ }
+
+ /**
+ * Returns machine-endian ordered binary data as signed 32-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt32($value)
+ {
+ list(, $int) = unpack("l*", $value);
+ return $int;
+ }
+
+ /**
+ * Returns signed 32-bit integer as little-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt32LE($value)
+ {
+ if (self::isBigEndian())
+ return strrev(self::toInt32($value));
+ else
+ return self::toInt32($value);
+ }
+
+ /**
+ * Returns little-endian ordered binary data as signed 32-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt32LE($value)
+ {
+ if (self::isBigEndian())
+ return self::fromInt32(strrev($value));
+ else
+ return self::fromInt32($value);
+ }
+
+ /**
+ * Returns signed 32-bit integer as big-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt32BE($value)
+ {
+ if (self::isBigEndian())
+ return self::toInt32($value);
+ else
+ return strrev(self::toInt32($value));
+ }
+
+ /**
+ * Returns big-endian ordered binary data as signed 32-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt32BE($value)
+ {
+ if (self::isBigEndian())
+ return self::fromInt32($value);
+ else
+ return self::fromInt32(strrev($value));
+ }
+
+ /**
+ * Returns unsigned 32-bit integer as little-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toUInt32LE($value)
+ {
+ return pack("V*", $value);
+ }
+
+ /**
+ * Returns little-endian ordered binary data as unsigned 32-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromUInt32LE($value)
+ {
+ if (PHP_INT_SIZE < 8) {
+ list(, $lo, $hi) = unpack("v*", $value);
+ return $hi * (0xffff+1) + $lo; // eq $hi << 16 | $lo
+ } else {
+ list(, $int) = unpack("V*", $value);
+ return $int;
+ }
+ }
+
+ /**
+ * Returns unsigned 32-bit integer as big-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toUInt32BE($value)
+ {
+ return pack("N*", $value);
+ }
+
+ /**
+ * Returns big-endian ordered binary data as unsigned 32-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromUInt32BE($value)
+ {
+ if (PHP_INT_SIZE < 8) {
+ list(, $hi, $lo) = unpack("n*", $value);
+ return $hi * (0xffff+1) + $lo; // eq $hi << 16 | $lo
+ } else {
+ list(, $int) = unpack("N*", $value);
+ return $int;
+ }
+ }
+
+ /**
+ * Returns signed 16-bit integer as machine endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt16($value)
+ {
+ return pack("s*", $value);
+ }
+
+ /**
+ * Returns machine endian ordered binary data as signed 16-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt16($value)
+ {
+ list(, $int) = unpack("s*", $value);
+ return $int;
+ }
+
+ /**
+ * Returns signed 16-bit integer as little-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt16LE($value)
+ {
+ if (self::isBigEndian())
+ return strrev(self::toInt16($value));
+ else
+ return self::toInt16($value);
+ }
+
+ /**
+ * Returns little-endian ordered binary data as signed 16-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt16LE($value)
+ {
+ if (self::isBigEndian())
+ return self::fromInt16(strrev($value));
+ else
+ return self::fromInt16($value);
+ }
+
+ /**
+ * Returns signed 16-bit integer as big-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toInt16BE($value)
+ {
+ if (self::isBigEndian())
+ return self::toInt16($value);
+ else
+ return strrev(self::toInt16($value));
+ }
+
+ /**
+ * Returns big-endian ordered binary data as signed 16-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt16BE($value)
+ {
+ if (self::isBigEndian())
+ return self::fromInt16($value);
+ else
+ return self::fromInt16(strrev($value));
+ }
+
+ /**
+ * Returns machine endian ordered binary data as unsigned 16-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @param integer $order The byte order of the binary data string.
+ * @return integer
+ */
+ private static function fromUInt16($value, $order = self::MACHINE_ENDIAN_ORDER)
+ {
+ list(, $int) = unpack
+ (($order == self::BIG_ENDIAN_ORDER ? "n" :
+ ($order == self::LITTLE_ENDIAN_ORDER ? "v" : "S")) . "*", $value);
+ return $int;
+ }
+
+ /**
+ * Returns unsigned 16-bit integer as little-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toUInt16LE($value)
+ {
+ return pack("v*", $value);
+ }
+
+ /**
+ * Returns little-endian ordered binary data as unsigned 16-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromUInt16LE($value)
+ {
+ return self::fromUInt16($value, self::LITTLE_ENDIAN_ORDER);
+ }
+
+ /**
+ * Returns unsigned 16-bit integer as big-endian ordered binary data.
+ *
+ * @param integer $value The input value.
+ * @return string
+ */
+ public static function toUInt16BE($value)
+ {
+ return pack("n*", $value);
+ }
+
+ /**
+ * Returns big-endian ordered binary data as unsigned 16-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromUInt16BE($value)
+ {
+ return self::fromUInt16($value, self::BIG_ENDIAN_ORDER);
+ }
+
+ /**
+ * Returns an 8-bit integer as binary data.
+ *
+ * @param integer $value The input value.
+ * @return integer
+ */
+ public static function toInt8($value)
+ {
+ return pack("c*", $value);
+ }
+
+ /**
+ * Returns binary data as 8-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromInt8($value)
+ {
+ list(, $int) = unpack("c*", $value);
+ return $int;
+ }
+
+ /**
+ * Returns an unsigned 8-bit integer as binary data.
+ *
+ * @param integer $value The input value.
+ * @return integer
+ */
+ public static function toUInt8($value)
+ {
+ return pack("C*", $value);
+ }
+
+ /**
+ * Returns binary data as an unsigned 8-bit integer.
+ *
+ * @param string $value The binary data string.
+ * @return integer
+ */
+ public static function fromUInt8($value)
+ {
+ list(, $int) = unpack("C*", $value);
+ return $int;
+ }
+
+ /**
+ * Returns a floating point number as machine endian ordered binary data.
+ *
+ * @param float $value The input value.
+ * @return string
+ */
+ public static function toFloat($value)
+ {
+ return pack("f*", $value);
+ }
+
+ /**
+ * Returns machine endian ordered binary data as a floating point number.
+ *
+ * @param string $value The binary data string.
+ * @return float
+ */
+ public static function fromFloat($value)
+ {
+ list(, $float) = unpack("f*", $value);
+ return $float;
+ }
+
+ /**
+ * Returns a floating point number as little-endian ordered binary data.
+ *
+ * @param float $value The input value.
+ * @return string
+ */
+ public static function toFloatLE($value)
+ {
+ if (self::isBigEndian())
+ return strrev(self::toFloat($value));
+ else
+ return self::toFloat($value);
+ }
+
+ /**
+ * Returns little-endian ordered binary data as a floating point number.
+ *
+ * @param string $value The binary data string.
+ * @return float
+ */
+ public static function fromFloatLE($value)
+ {
+ if (self::isBigEndian())
+ return self::fromFloat(strrev($value));
+ else
+ return self::fromFloat($value);
+ }
+
+ /**
+ * Returns a floating point number as big-endian ordered binary data.
+ *
+ * @param float $value The input value.
+ * @return string
+ */
+ public static function toFloatBE($value)
+ {
+ if (self::isBigEndian())
+ return self::toFloat($value);
+ else
+ return strrev(self::toFloat($value));
+ }
+
+ /**
+ * Returns big-endian ordered binary data as a float point number.
+ *
+ * @param string $value The binary data string.
+ * @return float
+ */
+ public static function fromFloatBE($value)
+ {
+ if (self::isBigEndian())
+ return self::fromFloat($value);
+ else
+ return self::fromFloat(strrev($value));
+ }
+
+ /**
+ * Returns string as binary data padded to given length with zeros.
+ *
+ * @param string $value The input value.
+ * @return string
+ */
+ public static function toString8($value, $length, $padding = "\0")
+ {
+ return str_pad($value, $length, $padding);
+ }
+
+ /**
+ * Returns binary data as string. Removes terminating zero.
+ *
+ * @param string $value The binary data string.
+ * @return string
+ */
+ public static function fromString8($value)
+ {
+ return rtrim($value, "\0");
+ }
+
+ /**
+ * Returns machine-ordered multibyte string as UTF-16 defined-order binary
+ * data. The byte order is stored using a byte order mask (BOM) in the binary
+ * data string.
+ *
+ * @param string $value The input value.
+ * @param integer $order The byte order of the binary data string.
+ * @return string
+ */
+ public static function toString16($value, $order = self::MACHINE_ENDIAN_ORDER)
+ {
+ $format = $order == self::BIG_ENDIAN_ORDER ? "n" :
+ ($order == self::LITTLE_ENDIAN_ORDER ? "v" : "S");
+ $string = pack($format, 0xfeff);
+ foreach (unpack("S*", $value) as $char)
+ $string .= pack($format, $char);
+ return $string;
+ }
+
+ /**
+ * Returns UTF-16 formatted binary data as machine-ordered multibyte string.
+ * The byte order is determined from the byte order mark included in the
+ * binary data string. The order parameter is updated if a BOM is found.
+ *
+ * @param string $value The binary data string.
+ * @param integer $order The endian to decode using if no BOM was found.
+ * @return string
+ */
+ public static function fromString16
+ ($value, &$order = self::MACHINE_ENDIAN_ORDER)
+ {
+ if (strlen($value) < 2)
+ return "";
+
+ if (ord($value[0]) == 0xfe && ord($value[1]) == 0xff) {
+ $order = self::BIG_ENDIAN_ORDER;
+ return self::fromString16BE(substr($value, 2));
+ }
+ else if (ord($value[0]) == 0xff && ord($value[1]) == 0xfe) {
+ $order = self::LITTLE_ENDIAN_ORDER;
+ return self::fromString16LE(substr($value, 2));
+ }
+ else if ($order == self::BIG_ENDIAN_ORDER ||
+ ($order == self::MACHINE_ENDIAN_ORDER && self::isBigEndian()))
+ return self::fromString16BE($value);
+ else
+ return self::fromString16LE($value);
+ }
+
+ /**
+ * Returns machine-ordered multibyte string as little-endian ordered binary
+ * data.
+ *
+ * @param string $value The input value.
+ * @return string
+ */
+ public static function toString16LE($value)
+ {
+ $string = "";
+ foreach (unpack("S*", $value) as $char)
+ $string .= pack("v", $char);
+ return $string;
+ }
+
+ /**
+ * Returns little-endian ordered binary data as machine ordered multibyte
+ * string. Removes terminating zero.
+ *
+ * @param string $value The binary data string.
+ * @return string
+ */
+ public static function fromString16LE($value)
+ {
+ $string = "";
+ foreach (unpack("v*", substr($value, -2) == "\0\0" ?
+ substr($value, 0, -2) : $value) as $char)
+ $string .= pack("S", $char);
+ return $string;
+ }
+
+ /**
+ * Returns machine ordered multibyte string as big-endian ordered binary data.
+ *
+ * @param string $value The input value.
+ * @return string
+ */
+ public static function toString16BE($value)
+ {
+ $string = "";
+ foreach (unpack("S*", $value) as $char)
+ $string .= pack("n", $char);
+ return $string;
+ }
+
+ /**
+ * Returns big-endian ordered binary data as machine ordered multibyte string.
+ * Removes terminating zero.
+ *
+ * @param string $value The binary data string.
+ * @return string
+ */
+ public static function fromString16BE($value)
+ {
+ $string = "";
+ foreach (unpack("n*", substr($value, -2) == "\0\0" ?
+ substr($value, 0, -2) : $value) as $char)
+ $string .= pack("S", $char);
+ return $string;
+ }
+
+ /**
+ * Returns hexadecimal string having high nibble first as binary data.
+ *
+ * @param string $value The input value.
+ * @return string
+ */
+ public static function toHHex($value)
+ {
+ return pack("H*", $value);
+ }
+
+ /**
+ * Returns binary data as hexadecimal string having high nibble first.
+ *
+ * @param string $value The binary data string.
+ * @return string
+ */
+ public static function fromHHex($value)
+ {
+ list($hex) = unpack("H*0", $value);
+ return $hex;
+ }
+
+ /**
+ * Returns hexadecimal string having low nibble first as binary data.
+ *
+ * @param string $value The input value.
+ * @return string
+ */
+ public static function toLHex($value)
+ {
+ return pack("h*", $value);
+ }
+
+ /**
+ * Returns binary data as hexadecimal string having low nibble first.
+ *
+ * @param string $value The binary data string.
+ * @return string
+ */
+ public static function fromLHex($value)
+ {
+ list($hex) = unpack("h*0", $value);
+ return $hex;
+ }
+
+ /**
+ * Returns big-endian ordered hexadecimal GUID string as little-endian ordered
+ * binary data string.
+ *
+ * @param string $value The input value.
+ * @return string
+ */
+ public static function toGUID($value)
+ {
+ $string = ""; $C = preg_split("/-/", $value);
+ return pack
+ ("V1v2N2", hexdec($C[0]), hexdec($C[1]), hexdec($C[2]),
+ hexdec($C[3] . substr($C[4], 0, 4)), hexdec(substr($C[4], 4)));
+ }
+
+ /**
+ * Returns the little-endian ordered binary data as big-endian ordered
+ * hexadecimal GUID string.
+ *
+ * @param string $value The binary data string.
+ * @return string
+ */
+ public static function fromGUID($value)
+ {
+ $C = @unpack("V1V/v2v/N2N", $value);
+ list($hex) = @unpack("H*0", pack
+ ("NnnNN", $C["V"], $C["v1"], $C["v2"], $C["N1"], $C["N2"]));
+
+ /* Fixes a bug in PHP versions earlier than Jan 25 2006 */
+ if (implode("", unpack("H*", pack("H*", "a"))) == "a00")
+ $hex = substr($hex, 0, -1);
+
+ return preg_replace
+ ("/^(.{8})(.{4})(.{4})(.{4})/", "\\1-\\2-\\3-\\4-", $hex);
+ }
+}