function getid3_flv(&$fd, &$ThisFileInfo, $ReturnAllTagData = false)
 {
     fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET);
     $FLVdataLength = $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'];
     $FLVheader = fread($fd, 5);
     $ThisFileInfo['fileformat'] = 'flv';
     $ThisFileInfo['flv']['header']['signature'] = substr($FLVheader, 0, 3);
     $ThisFileInfo['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1));
     $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1));
     if ($ThisFileInfo['flv']['header']['signature'] != 'FLV') {
         $ThisFileInfo['error'][] = 'Expecting "FLV" at offset ' . $ThisFileInfo['avdataoffset'] . ', found "' . $ThisFileInfo['flv']['header']['signature'] . '"';
         unset($ThisFileInfo['flv']);
         unset($ThisFileInfo['fileformat']);
         return false;
     }
     $ThisFileInfo['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x4);
     $ThisFileInfo['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x1);
     $FrameSizeDataLength = getid3_lib::BigEndian2Int(fread($fd, 4));
     $FLVheaderFrameLength = 9;
     if ($FrameSizeDataLength > $FLVheaderFrameLength) {
         fseek($fd, $FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
     }
     $Duration = 0;
     while (ftell($fd) + 1 < $ThisFileInfo['avdataend']) {
         //if (!$ThisFileInfo['flv']['header']['hasAudio'] || isset($ThisFileInfo['flv']['audio']['audioFormat'])) {
         //	if (!$ThisFileInfo['flv']['header']['hasVideo'] || isset($ThisFileInfo['flv']['video']['videoCodec'])) {
         //		break;
         //	}
         //}
         $ThisTagHeader = fread($fd, 16);
         $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4));
         $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1));
         $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3));
         $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3));
         $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1));
         $NextOffset = ftell($fd) - 1 + $DataLength;
         switch ($TagType) {
             case GETID3_FLV_TAG_AUDIO:
                 if (!isset($ThisFileInfo['flv']['audio']['audioFormat'])) {
                     $ThisFileInfo['flv']['audio']['audioFormat'] = $LastHeaderByte & 0x7;
                     $ThisFileInfo['flv']['audio']['audioRate'] = ($LastHeaderByte & 0x30) / 0x10;
                     $ThisFileInfo['flv']['audio']['audioSampleSize'] = ($LastHeaderByte & 0x40) / 0x40;
                     $ThisFileInfo['flv']['audio']['audioType'] = ($LastHeaderByte & 0x80) / 0x80;
                 }
                 break;
             case GETID3_FLV_TAG_VIDEO:
                 if (!isset($ThisFileInfo['flv']['video']['videoCodec'])) {
                     $ThisFileInfo['flv']['video']['videoCodec'] = $LastHeaderByte & 0x7;
                     switch ($ThisFileInfo['flv']['video']['videoCodec']) {
                         case GETID3_FLV_VIDEO_H263:
                             $FLVvideoHeader = fread($fd, 11);
                             $PictureSizeType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2)) >> 7;
                             $PictureSizeType = $PictureSizeType & 0x7;
                             $ThisFileInfo['flv']['header']['videoSizeType'] = $PictureSizeType;
                             switch ($PictureSizeType) {
                                 case 0:
                                     $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2));
                                     $PictureSizeEnc <<= 1;
                                     $ThisFileInfo['video']['resolution_x'] = ($PictureSizeEnc & 0xff00) >> 8;
                                     $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
                                     $PictureSizeEnc <<= 1;
                                     $ThisFileInfo['video']['resolution_y'] = ($PictureSizeEnc & 0xff00) >> 8;
                                     break;
                                 case 1:
                                     $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 4));
                                     $PictureSizeEnc <<= 1;
                                     $ThisFileInfo['video']['resolution_x'] = ($PictureSizeEnc & 0xffff0000) >> 16;
                                     $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 4));
                                     $PictureSizeEnc <<= 1;
                                     $ThisFileInfo['video']['resolution_y'] = ($PictureSizeEnc & 0xffff0000) >> 16;
                                     break;
                                 case 2:
                                     $ThisFileInfo['video']['resolution_x'] = 352;
                                     $ThisFileInfo['video']['resolution_y'] = 288;
                                     break;
                                 case 3:
                                     $ThisFileInfo['video']['resolution_x'] = 176;
                                     $ThisFileInfo['video']['resolution_y'] = 144;
                                     break;
                                 case 4:
                                     $ThisFileInfo['video']['resolution_x'] = 128;
                                     $ThisFileInfo['video']['resolution_y'] = 96;
                                     break;
                                 case 5:
                                     $ThisFileInfo['video']['resolution_x'] = 320;
                                     $ThisFileInfo['video']['resolution_y'] = 240;
                                     break;
                                 case 6:
                                     $ThisFileInfo['video']['resolution_x'] = 160;
                                     $ThisFileInfo['video']['resolution_y'] = 120;
                                     break;
                                 default:
                                     $ThisFileInfo['video']['resolution_x'] = 0;
                                     $ThisFileInfo['video']['resolution_y'] = 0;
                                     break;
                             }
                             break;
                         case GETID3_FLV_VIDEO_SCREEN:
                             $bits = new BitStreamReader(fread($fd, $DataLength));
                             $bits->seek(4, SEEK_CUR);
                             $ThisFileInfo['video']['resolution_x'] = $bits->getInt(12);
                             $bits->seek(4, SEEK_CUR);
                             $ThisFileInfo['video']['resolution_y'] = $bits->getInt(12);
                             break;
                         case GETID3_FLV_VIDEO_VP6:
                             $bits = new BitStreamReader(fread($fd, $DataLength));
                             $adjW = $bits->getInt(4);
                             $adjH = $bits->getInt(4);
                             $mode = $bits->getInt(1);
                             if ($mode === 0) {
                                 $bits->seek(15, SEEK_CUR);
                                 $ThisFileInfo['video']['resolution_y'] = $bits->getInt(8) * 16 - $adjH;
                                 $ThisFileInfo['video']['resolution_x'] = $bits->getInt(8) * 16 - $adjW;
                             }
                             break;
                         case GETID3_FLV_VIDEO_VP6ALPHA:
                             $bits = new BitStreamReader(fread($fd, $DataLength));
                             $adjW = $bits->getInt(4);
                             $adjH = $bits->getInt(4);
                             $mode = $bits->getInt(1);
                             // mode is for ? unknown ?
                             if ($mode === 0) {
                                 $bits->seek(39, SEEK_CUR);
                                 $ThisFileInfo['video']['resolution_y'] = $bits->getInt(8) * 16 - $adjH;
                                 $ThisFileInfo['video']['resolution_x'] = $bits->getInt(8) * 16 - $adjW;
                             }
                             break;
                         case GETID3_FLV_VIDEO_SCREENVIDEO_2:
                             $ThisFileInfo['video']['resolution_x'] = $bits->getInt(12);
                             $ThisFileInfo['video']['resolution_y'] = $bits->getInt(12);
                             break;
                     }
                 }
                 break;
                 // Meta tag
             // Meta tag
             case GETID3_FLV_TAG_META:
                 fseek($fd, -1, SEEK_CUR);
                 $reader = new AMFReader(fread($fd, $DataLength));
                 $eventName = $reader->getItem();
                 if ($eventName == 'onMetaData') {
                     $ThisFileInfo['meta']['onMetaData'] = $reader->getItem();
                 }
                 unset($reader);
                 $ThisFileInfo['video']['frame_rate'] = @$ThisFileInfo['meta']['onMetaData']['framerate'];
                 $ThisFileInfo['video']['resolution_x'] = @$ThisFileInfo['meta']['onMetaData']['width'];
                 $ThisFileInfo['video']['resolution_y'] = @$ThisFileInfo['meta']['onMetaData']['height'];
                 break;
             default:
                 // noop
                 break;
         }
         if ($Timestamp > $Duration) {
             $Duration = $Timestamp;
         }
         fseek($fd, $NextOffset, SEEK_SET);
     }
     if ($ThisFileInfo['playtime_seconds'] = $Duration / 1000) {
         $ThisFileInfo['bitrate'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) / $ThisFileInfo['playtime_seconds'];
     }
     if ($ThisFileInfo['flv']['header']['hasAudio']) {
         $ThisFileInfo['audio']['codec'] = $this->FLVaudioFormat($ThisFileInfo['flv']['audio']['audioFormat']);
         $ThisFileInfo['audio']['sample_rate'] = $this->FLVaudioRate($ThisFileInfo['flv']['audio']['audioRate']);
         $ThisFileInfo['audio']['bits_per_sample'] = $this->FLVaudioBitDepth($ThisFileInfo['flv']['audio']['audioSampleSize']);
         $ThisFileInfo['audio']['channels'] = $ThisFileInfo['flv']['audio']['audioType'] + 1;
         // 0=mono,1=stereo
         $ThisFileInfo['audio']['lossless'] = $ThisFileInfo['flv']['audio']['audioFormat'] ? false : true;
         // 0=uncompressed
         $ThisFileInfo['audio']['dataformat'] = 'flv';
     }
     if (@$ThisFileInfo['flv']['header']['hasVideo']) {
         $ThisFileInfo['video']['codec'] = $this->FLVvideoCodec($ThisFileInfo['flv']['video']['videoCodec']);
         $ThisFileInfo['video']['dataformat'] = 'flv';
         $ThisFileInfo['video']['lossless'] = false;
     }
     return true;
 }