55define(
'GETID3_FLV_TAG_AUDIO',          8);
 
   56define(
'GETID3_FLV_TAG_VIDEO',          9);
 
   57define(
'GETID3_FLV_TAG_META',          18);
 
   59define(
'GETID3_FLV_VIDEO_H263',         2);
 
   60define(
'GETID3_FLV_VIDEO_SCREEN',       3);
 
   61define(
'GETID3_FLV_VIDEO_VP6FLV',       4);
 
   62define(
'GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5);
 
   63define(
'GETID3_FLV_VIDEO_SCREENV2',     6);
 
   64define(
'GETID3_FLV_VIDEO_H264',         7);
 
   66define(
'H264_AVC_SEQUENCE_HEADER',          0);
 
   67define(
'H264_PROFILE_BASELINE',            66);
 
   68define(
'H264_PROFILE_MAIN',                77);
 
   69define(
'H264_PROFILE_EXTENDED',            88);
 
   70define(
'H264_PROFILE_HIGH',               100);
 
   71define(
'H264_PROFILE_HIGH10',             110);
 
   72define(
'H264_PROFILE_HIGH422',            122);
 
   73define(
'H264_PROFILE_HIGH444',            144);
 
   74define(
'H264_PROFILE_HIGH444_PREDICTIVE', 244);
 
   83                $info = &$this->getid3->info;
 
   87                $FLVdataLength = 
$info[
'avdataend'] - 
$info[
'avdataoffset'];
 
   88                $FLVheader = $this->
fread(5);
 
   90                $info[
'fileformat'] = 
'flv';
 
   91                $info[
'flv'][
'header'][
'signature'] =                           substr($FLVheader, 0, 3);
 
   95                if (
$info[
'flv'][
'header'][
'signature'] != self::magic) {
 
  101                $info[
'flv'][
'header'][
'hasAudio'] = (bool) ($TypeFlags & 0x04);
 
  102                $info[
'flv'][
'header'][
'hasVideo'] = (bool) ($TypeFlags & 0x01);
 
  105                $FLVheaderFrameLength = 9;
 
  106                if ($FrameSizeDataLength > $FLVheaderFrameLength) {
 
  107                        $this->
fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
 
  110                $found_video = 
false;
 
  111                $found_audio = 
false;
 
  113                $found_valid_meta_playtime = 
false;
 
  115                $info[
'flv'][
'framecount'] = array(
'total'=>0, 
'audio'=>0, 
'video'=>0);
 
  116                $flv_framecount = &
$info[
'flv'][
'framecount'];
 
  117                while ((($this->
ftell() + 16) < $info[
'avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime))  {
 
  118                        $ThisTagHeader = $this->
fread(16);
 
  125                        $NextOffset = $this->
ftell() - 1 + $DataLength;
 
  126                        if ($Timestamp > $Duration) {
 
  127                                $Duration = $Timestamp;
 
  130                        $flv_framecount[
'total']++;
 
  133                                        $flv_framecount[
'audio']++;
 
  136                                                $info[
'flv'][
'audio'][
'audioFormat']     = ($LastHeaderByte >> 4) & 0x0F;
 
  137                                                $info[
'flv'][
'audio'][
'audioRate']       = ($LastHeaderByte >> 2) & 0x03;
 
  138                                                $info[
'flv'][
'audio'][
'audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01;
 
  139                                                $info[
'flv'][
'audio'][
'audioType']       =  $LastHeaderByte       & 0x01;
 
  144                                        $flv_framecount[
'video']++;
 
  147                                                $info[
'flv'][
'video'][
'videoCodec'] = $LastHeaderByte & 0x07;
 
  149                                                $FLVvideoHeader = $this->
fread(11);
 
  163                                                                if (($numOfSequenceParameterSets & 0x1F) != 0) {
 
  169                                                                        $sps = $this->
fread($spsSize);
 
  170                                                                        if (strlen($sps) == $spsSize) { 
 
  172                                                                                $spsReader->readData();
 
  173                                                                                $info[
'video'][
'resolution_x'] = $spsReader->getWidth();
 
  174                                                                                $info[
'video'][
'resolution_y'] = $spsReader->getHeight();
 
  183                                                        $PictureSizeType = $PictureSizeType & 0x0007;
 
  184                                                        $info[
'flv'][
'header'][
'videoSizeType'] = $PictureSizeType;
 
  185                                                        switch ($PictureSizeType) {
 
  196                                                                        $info[
'video'][
'resolution_x'] = $PictureSizeEnc[
'x'] & 0xFF;
 
  197                                                                        $info[
'video'][
'resolution_y'] = $PictureSizeEnc[
'y'] & 0xFF;
 
  203                                                                        $info[
'video'][
'resolution_x'] = $PictureSizeEnc[
'x'] & 0xFFFF;
 
  204                                                                        $info[
'video'][
'resolution_y'] = $PictureSizeEnc[
'y'] & 0xFFFF;
 
  208                                                                        $info[
'video'][
'resolution_x'] = 352;
 
  209                                                                        $info[
'video'][
'resolution_y'] = 288;
 
  213                                                                        $info[
'video'][
'resolution_x'] = 176;
 
  214                                                                        $info[
'video'][
'resolution_y'] = 144;
 
  218                                                                        $info[
'video'][
'resolution_x'] = 128;
 
  219                                                                        $info[
'video'][
'resolution_y'] = 96;
 
  223                                                                        $info[
'video'][
'resolution_x'] = 320;
 
  224                                                                        $info[
'video'][
'resolution_y'] = 240;
 
  228                                                                        $info[
'video'][
'resolution_x'] = 160;
 
  229                                                                        $info[
'video'][
'resolution_y'] = 120;
 
  233                                                                        $info[
'video'][
'resolution_x'] = 0;
 
  234                                                                        $info[
'video'][
'resolution_y'] = 0;
 
  242                                                        if (!isset(
$info[
'video'][
'resolution_x'])) { 
 
  245                                                                $info[
'video'][
'resolution_x'] = ($PictureSizeEnc[
'x'] & 0xFF) << 3;
 
  246                                                                $info[
'video'][
'resolution_y'] = ($PictureSizeEnc[
'y'] & 0xFF) << 3;
 
  251                                                if (!empty(
$info[
'video'][
'resolution_x']) && !empty(
$info[
'video'][
'resolution_y'])) {
 
  252                                                        $info[
'video'][
'pixel_aspect_ratio'] = 
$info[
'video'][
'resolution_x'] / 
$info[
'video'][
'resolution_y'];
 
  261                                                $this->
fseek(-1, SEEK_CUR);
 
  262                                                $datachunk = $this->
fread($DataLength);
 
  265                                                $eventName = 
$reader->readData();
 
  269                                                $copykeys = array(
'framerate'=>
'frame_rate', 
'width'=>
'resolution_x', 
'height'=>
'resolution_y', 
'audiodatarate'=>
'bitrate', 
'videodatarate'=>
'bitrate');
 
  270                                                foreach ($copykeys as $sourcekey => $destkey) {
 
  271                                                        if (isset(
$info[
'flv'][
'meta'][
'onMetaData'][$sourcekey])) {
 
  272                                                                switch ($sourcekey) {
 
  275                                                                                $info[
'video'][$destkey] = intval(round(
$info[
'flv'][
'meta'][
'onMetaData'][$sourcekey]));
 
  277                                                                        case 'audiodatarate':
 
  280                                                                        case 'videodatarate':
 
  283                                                                                $info[
'video'][$destkey] = 
$info[
'flv'][
'meta'][
'onMetaData'][$sourcekey];
 
  288                                                if (!empty(
$info[
'flv'][
'meta'][
'onMetaData'][
'duration'])) {
 
  289                                                        $found_valid_meta_playtime = 
true;
 
  298                        $this->
fseek($NextOffset);
 
  301                $info[
'playtime_seconds'] = $Duration / 1000;
 
  302                if (
$info[
'playtime_seconds'] > 0) {
 
  303                        $info[
'bitrate'] = ((
$info[
'avdataend'] - 
$info[
'avdataoffset']) * 8) / 
$info[
'playtime_seconds'];
 
  306                if (
$info[
'flv'][
'header'][
'hasAudio']) {
 
  311                        $info[
'audio'][
'channels']   =  
$info[
'flv'][
'audio'][
'audioType'] + 1; 
 
  312                        $info[
'audio'][
'lossless']   = (
$info[
'flv'][
'audio'][
'audioFormat'] ? false : 
true); 
 
  313                        $info[
'audio'][
'dataformat'] = 
'flv';
 
  315                if (!empty(
$info[
'flv'][
'header'][
'hasVideo'])) {
 
  317                        $info[
'video'][
'dataformat'] = 
'flv';
 
  318                        $info[
'video'][
'lossless']   = 
false;
 
  322                if (!empty(
$info[
'flv'][
'meta'][
'onMetaData'][
'duration'])) {
 
  323                        $info[
'playtime_seconds'] = 
$info[
'flv'][
'meta'][
'onMetaData'][
'duration'];
 
  324                        $info[
'bitrate'] = ((
$info[
'avdataend'] - 
$info[
'avdataoffset']) * 8) / 
$info[
'playtime_seconds'];
 
  326                if (isset(
$info[
'flv'][
'meta'][
'onMetaData'][
'audiocodecid'])) {
 
  329                if (isset(
$info[
'flv'][
'meta'][
'onMetaData'][
'videocodecid'])) {
 
  337                static $lookup = array(
 
  338                        0  => 
'Linear PCM, platform endian',
 
  341                        3  => 
'Linear PCM, little endian',
 
  342                        4  => 
'Nellymoser 16kHz mono',
 
  343                        5  => 
'Nellymoser 8kHz mono',
 
  345                        7  => 
'G.711A-law logarithmic PCM',
 
  346                        8  => 
'G.711 mu-law logarithmic PCM',
 
  353                        15 => 
'Device-specific sound',
 
  355                return (isset($lookup[
$id]) ? $lookup[
$id] : 
false);
 
  359                static $lookup = array(
 
  365                return (isset($lookup[
$id]) ? $lookup[
$id] : 
false);
 
  369                static $lookup = array(
 
  373                return (isset($lookup[
$id]) ? $lookup[
$id] : 
false);
 
  377                static $lookup = array(
 
  385                return (isset($lookup[
$id]) ? $lookup[
$id] : 
false);
 
  416                return $this->
read($length);
 
  421                return $this->
read($length);
 
  424        public function read($length) {
 
  425                $val = substr($this->bytes, $this->pos, $length);
 
  426                $this->pos += $length;
 
  483                $type = $this->stream->readByte();
 
  543                                $value = 
'(unknown or unsupported data type)';
 
  551                return $this->stream->readDouble();
 
  555                return $this->stream->readByte() == 1;
 
  559                return $this->stream->readUTF();
 
  568                while (
$key = $this->stream->readUTF()) {
 
  572                if ((
$key == 
'') && ($this->stream->peekByte() == 0x09)) {
 
  574                        $this->stream->readByte();
 
  581                $highestIndex = $this->stream->readLong();
 
  585                while (
$key = $this->stream->readUTF()) {
 
  586                        if (is_numeric(
$key)) {
 
  592                if ((
$key == 
'') && ($this->stream->peekByte() == 0x09)) {
 
  594                        $this->stream->readByte();
 
  601                $length = $this->stream->readLong();
 
  604                for (
$i = 0; 
$i < $length; 
$i++) {
 
  612                $timezone = $this->stream->readInt();
 
  617                return $this->stream->readLongUTF();
 
  621                return $this->stream->readLongUTF();
 
  625                $className = $this->stream->readUTF();
 
  648                        $level_idc = $this->
getBits(8);                         
 
  652                        if ($picOrderType == 0) {
 
  654                        } elseif ($picOrderType == 1) {
 
  658                                $num_ref_frames_in_pic_order_cnt_cycle = $this->
expGolombUe(); 
 
  659                                for (
$i = 0; 
$i < $num_ref_frames_in_pic_order_cnt_cycle; 
$i++) {
 
  666                        $pic_height_in_map_units_minus1 = $this->
expGolombUe(); 
 
  668                        $frame_mbs_only_flag = $this->
getBits(1);               
 
  669                        if ($frame_mbs_only_flag == 0) {
 
  673                        $frame_cropping_flag = $this->
getBits(1);               
 
  675                        $frame_crop_left_offset   = 0;
 
  676                        $frame_crop_right_offset  = 0;
 
  677                        $frame_crop_top_offset    = 0;
 
  678                        $frame_crop_bottom_offset = 0;
 
  680                        if ($frame_cropping_flag) {
 
  689                        $this->width  = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2);
 
  690                        $this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2);
 
  695                $newBits = $this->currentBits + $bits;
 
  696                $this->currentBytes += (int)floor($newBits / 8);
 
  697                $this->currentBits = $newBits % 8;
 
  708                for (
$i = 0; 
$i < $bits; 
$i++) {
 
  715                $significantBits = 0;
 
  721                        if ($significantBits > 31) {
 
  726                return (1 << $significantBits) + $this->
getBits($significantBits) - 1;
 
foreach($mandatory_scripts as $file) $timestamp
An exception for terminatinating execution or to throw for unit testing.
static audioBitDepthLookup($id)
static audioFormatLookup($id)
static videoCodecLookup($id)
static audioRateLookup($id)
fseek($bytes, $whence=SEEK_SET)
static PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8')
static LittleEndian2Int($byteword, $signed=false)
static BigEndian2Float($byteword)
static CastAsInt($floatnum)
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
if(!array_key_exists('StateId', $_REQUEST)) $id
const GETID3_FLV_VIDEO_VP6FLV
const H264_AVC_SEQUENCE_HEADER
const GETID3_FLV_TAG_AUDIO
getID3() by James Heinrich info@getid3.org //
const GETID3_FLV_VIDEO_VP6FLV_ALPHA
const GETID3_FLV_TAG_VIDEO
const GETID3_FLV_VIDEO_H263
const GETID3_FLV_VIDEO_SCREEN
const GETID3_FLV_TAG_META
const GETID3_FLV_VIDEO_H264
const GETID3_FLV_VIDEO_SCREENV2