http://www.mediawiki.org/wiki/Special:Code/MediaWiki/56380
Revision: 56380
Author: dale
Date: 2009-09-15 18:12:33 +0000 (Tue, 15 Sep 2009)
Log Message:
-----------
some strict php fixes and error fixes
Modified Paths:
--------------
trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/FLV/Util/AMFSerialize.php
trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/MvFlv.php
trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/mvFlvServer.php
Modified:
trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/FLV/Util/AMFSerialize.php
===================================================================
---
trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/FLV/Util/AMFSerialize.php
2009-09-15 18:09:52 UTC (rev 56379)
+++
trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/FLV/Util/AMFSerialize.php
2009-09-15 18:12:33 UTC (rev 56380)
@@ -46,7 +46,7 @@
*/
function serialize( $var, $skipMark = false )
{
- $number='';
+ $number = '';
// process objects as hashed arrays
if ( is_object( $var ) )
$var = (array)$var;
@@ -94,7 +94,6 @@
return ( $skipMark ? '':"\x01" ) . ( $var ? "\x01" : "\x00" );
} else if ( is_numeric( $var ) ) {
-
$number .= pack( 'd', $var );
// reverse bytes if we are in little-endian hardware
@@ -121,7 +120,8 @@
if ( $this->isLittleEndian )
$tz = strrev( $tz );
}
-
+ if(!isset($tz))
+ $tz='';
return ( $skipMark ? '':"\x0B" ) . $this->serialize(
(float)$ms, true ) . pack( 'n', $tz );
}
Modified: trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/MvFlv.php
===================================================================
--- trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/MvFlv.php
2009-09-15 18:09:52 UTC (rev 56379)
+++ trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/MvFlv.php
2009-09-15 18:12:33 UTC (rev 56380)
@@ -3,88 +3,91 @@
include_once 'FLV/FLV.php';
define('MAX_FLV_TS', 16777.216);//it appears tag times restart after 16777.216
seconds;
-define('KEY_FRAME_DISTANCE', 2); //max keyframe distance
+define('KEY_FRAME_DISTANCE', 2); //max keyframe distance
-//define('META_KFDATA_EXT', '.KfMeta'); //file extension for cached keframe
metadata
+//define('META_KFDATA_EXT', '.KfMeta'); //file extension for cached keframe
metadata
define('META_DATA_EXT', '.meta'); //basic cached meta
class MyFLV extends FLV {
-
+
/**
- * On audio-only files the frame index will use this as minimum gap
+ * On audio-only files the frame index will use this as minimum gap
*/
private $audioFrameGap = 3;
-
+
private $origMetaOfs = 0;
private $origMetaSize = 0;
private $origMetaData;
private $compMetaData;
-
+
//added segment vars:
private $fullMeta=null;
private $mDuration=null;
var $wrapTimeCount=0;
-
+
function getKeyFrameByteTimes( $start_time_sec, $end_time_sec=null ){
- //print "play $start_time_sec to $end_time_sec";
+ //print "play $start_time_sec to $end_time_sec";
//@@todo cache byte offsets in memcache if available
if( $end_time_sec)
$this->mDuration = $end_time_sec - $start_time_sec;
- //print "SET metaDuration to: " . $this->metaDuration . "\n";
+ //print "SET metaDuration to: " . $this->metaDuration . "\n";
//print_r($fullMeta);
- $meta =& $this->getKeyFrameMetaData();
+ $meta = $this->getKeyFrameMetaData();
//die;
- $start_byte=$end_byte=null;
- if($start_time_sec==0 && $end_time_sec==null)$this->play();
+ $start_byte=$end_byte=null;
+
+ if($start_time_sec==0 && $end_time_sec==null)
+ $this->play();
+
$start_time_ms = $start_time_sec*1000;
- $end_time_ms = ($end_time_sec==null)?null:$end_time_sec*1000;
-
- for($i=0; $i < count($meta['times']); $i++){
+ $end_time_ms = ($end_time_sec==null)?null:$end_time_sec*1000;
+
+ for($i=0; $i < count($meta['times']); $i++){
//set to the keyframe right before a keyframe of the
requested start time
if($meta['times'][$i] >= $start_time_ms &&
$start_byte==null){
$start_byte=(isset($meta['times'][$i-1]))?$meta['filepositions'][$i-1]:$meta['filepositions'][$i];
- if($end_time_ms==null)break;
+ if($end_time_ms==null)break;
}
- //set to the keyframe right after the keyframe of the
end time:
+ //set to the keyframe right after the keyframe of the
end time:
if($end_time_ms!=null){
if($meta['times'][$i] >= $end_time_ms){
$end_byte= $meta['filepositions'][$i];
break;
- }
- }
- }
+ }
+ }
+ }
return array($start_byte, $end_byte);
}
- function playTimeReq( $start_time_sec, $end_time_sec=null ){
- //print "play $start_time_sec to $end_time_sec";
+ function playTimeReq( $start_time_sec, $end_time_sec=null ){
+ //print "play $start_time_sec to $end_time_sec";
//@@todo cache byte offsets in memcache if available
if( $end_time_sec)
$this->mDuration = $end_time_sec - $start_time_sec;
- //print "SET metaDuration to: " . $this->metaDuration . "\n";
+ //print "SET metaDuration to: " . $this->metaDuration . "\n";
//print_r($fullMeta);
- $meta =& $this->getKeyFrameMetaData();
+ $meta =& $this->getKeyFrameMetaData();
//die;
- $start_byte=$end_byte=null;
+ $start_byte=$end_byte=null;
if($start_time_sec==0 && $end_time_sec==null)$this->play();
$start_time_ms = $start_time_sec*1000;
- $end_time_ms = ($end_time_sec==null)?null:$end_time_sec*1000;
-
- for($i=0; $i < count($meta['times']); $i++){
+ $end_time_ms = ($end_time_sec==null)?null:$end_time_sec*1000;
+
+ for($i=0; $i < count($meta['times']); $i++){
//set to the keyframe right before a keyframe of the
requested start time
if($meta['times'][$i]>=$start_time_ms &&
$start_byte==null){
$start_byte=(isset($meta['times'][$i-1]))?$meta['filepositions'][$i-1]:$meta['filepositions'][$i];
- if($end_time_ms==null)break;
+ if($end_time_ms==null)break;
}
- //set to the keyframe right after the keyframe of the
end time:
+ //set to the keyframe right after the keyframe of the
end time:
if($end_time_ms!=null){
if($meta['times'][$i]>=$end_time_ms){
$end_byte= $meta['filepositions'][$i];
break;
- }
- }
- }
- $this->play($start_byte, $end_byte);
- }
+ }
+ }
+ }
+ $this->play($start_byte, $end_byte);
+ }
function computeMetaData()
{
ini_set("max_execution_time","0");//computeMetaData can take
some time
@@ -95,69 +98,69 @@
$this->compMetaData['keyframes']['filepositions'] = array();
$this->compMetaData['keyframes']['times'] = array();
$this->compMetaData['lasttimestamp'] = -1;
-
+
$this->origMetaOfs = 0;
$this->origMetaSize = 0;
$this->origMetaData = null;
-
+
$skipTagTypes = array();
while ($tag = $this->getTag( $skipTagTypes ))
{
// pre-calculate the timestamp as seconds
- $ts = $tag->timestamp/1000;
- if ($tag->timestamp > 0 && $tag->type==FLV_Tag::TYPE_VIDEO ){
+ $ts = $tag->timestamp/1000;
+ if ($tag->timestamp > 0 && $tag->type==FLV_Tag::TYPE_VIDEO ){
$ts = (MAX_FLV_TS*$this->wrapTimeCount) + $ts;
if($ts < $this->compMetaData['lasttimestamp']){
$this->wrapTimeCount++;
$ts = MAX_FLV_TS + $ts;
- }
+ }
//print "set end time to $ts \n";
- $this->compMetaData['lasttimestamp'] = $ts;
- }
-
+ $this->compMetaData['lasttimestamp'] = $ts;
+ }
+
switch ($tag->type)
{
- case FLV_Tag::TYPE_VIDEO :
+ case FLV_Tag::TYPE_VIDEO :
//Optimization, extract the frametype without
analyzing the tag body
if ((ord($tag->body[0]) >> 4) ==
FLV_Tag_Video::FRAME_KEYFRAME)
{
$this->compMetaData['keyframes']['filepositions'][] = $this->getTagOffset();
$this->compMetaData['keyframes']['times'][] = $ts;
}
-
+
if ( !in_array(FLV_TAG::TYPE_VIDEO, $skipTagTypes) )
{
$this->compMetaData['width'] = $tag->width;
$this->compMetaData['height'] = $tag->height;
$this->compMetaData['videocodecid'] =
$tag->codec;
- //Processing one video tag is
enough
+ //Processing one video tag is
enough
array_push( $skipTagTypes, FLV_Tag::TYPE_VIDEO
);
- }
+ }
break;
-
+
case FLV_Tag::TYPE_AUDIO :
-
- //Save audio frame positions when there
is no video
+
+ //Save audio frame positions when there
is no video
/*if (!$flv->hasVideo && $ts - $oldTs >
$this->audioFrameGap)
{
$this->compMetaData['keyframes']['filepositions'][] = $this->getTagOffset();
$this->compMetaData['keyframes']['times'][] = $ts;
$oldTs = $ts;
}
-
- if ( !in_array( FLV_Tag::TYPE_AUDIO, $skipTagTypes) )
+
+ if ( !in_array( FLV_Tag::TYPE_AUDIO, $skipTagTypes) )
{
$this->compMetaData['audiocodecid'] =
$tag->codec;
$this->compMetaData['audiofreqid'] =
$tag->frequency;
$this->compMetaData['audiodepthid'] =
$tag->depth;
$this->compMetaData['audiomodeid'] = $tag->mode;
-
+
//Processing one audio tag is
enough
array_push( $skipTagTypes, FLV_Tag::TYPE_AUDIO
);
} */
-
+
break;
-
+
case FLV_Tag::TYPE_DATA :
if ($tag->name == 'onMetaData')
{
@@ -167,19 +170,19 @@
}
break;
}
-
+
//Does this actually help with memory allocation?
unset($tag);
}
-
+
if (! empty($this->compMetaData['keyframes']['times']))
$this->compMetaData['lastkeyframetimestamp'] =
$this->compMetaData['keyframes']['times'][
count($this->compMetaData['keyframes']['times'])-1 ];
-
+
$this->compMetaData['duration'] =
$this->compMetaData['lasttimestamp'];
-
+
return $this->compMetaData;
}
-
+
function setMetaData( $metadata, $origMetaOfs = 0, $origMetaSize = 0 )
{
$this->compMetaData = $metadata;
@@ -191,50 +194,50 @@
{
if($this->fullMeta)return $this->fullMeta;
if(is_file($this->fname . META_DATA_EXT)){
- $this->fullMeta = unserialize(file_get_contents
($this->fname . META_DATA_EXT));
+ $this->fullMeta = unserialize(file_get_contents
($this->fname . META_DATA_EXT));
}else{
$this->computeMetaData();
if (! is_array($this->origMetaData)){
$this->fullMeta = $this->compMetaData;
}else{
$this->fullMeta = array_merge(
$this->origMetaData, $this->compMetaData );
- }
- //free non-merged arrays:
+ }
+ //free non-merged arrays:
unset($this->origMetaData);
- unset($this->compMetaData);
+ unset($this->compMetaData);
//convert floats to int
foreach($this->fullMeta['keyframes']['times'] as
$inx=>& $ts){
$ts = (int)($ts*1000);
- }
+ }
if(!file_put_contents($this->fname . META_DATA_EXT,
serialize($this->fullMeta))){
throw( new FLV_FileException('Unable to write
out cached keyframe output to '.$this->fname) );
- }
- }
+ }
+ }
return $this->fullMeta;
}
function getKeyFrameMetaData(){
- $meta = & $this->getMetaData();
+ $meta = $this->getMetaData();
return $meta['keyframes'];
}
function getSegmentMetaData(){
//pull base cached metadata
//update duration & return new array
- $meta = & $this->getMetaData();
- $meta['keyframes'] = array();
- //@@todo update all the other metadata to match segment outupt
+ $meta = $this->getMetaData();
+ $meta['keyframes'] = array();
+ //@@todo update all the other metadata to match segment outupt
return $meta;
- }
+ }
function play( $from = 0, $play_to=null )
{
fseek($this->fp, 0);
-
+
// get original file header just in case it has any special flag
echo fread($this->fp, $this->bodyOfs + 4);
-
+
// output the metadata if available
- $meta = $this->getSegmentMetaData();
+ $meta = $this->getSegmentMetaData();
//$meta = $this->getMetaData();
-
+
if (! empty($meta))
{
//serialize the metadata as an AMF stream
@@ -252,25 +255,25 @@
$out.= pack('N', 0);
//StreamID
$out.= pack('Cn', 0, 0);
-
+
echo $out;
echo $serMeta;
-
+
// PrevTagSize for the metadata
echo pack('N', strlen($serMeta) + strlen($out) );
}
-
+
$chunkSize = 4096;
$skippedOrigMeta = empty($this->origMetaSize);
- //seek to offset point:
+ //seek to offset point:
fseek($this->fp, $from);
while (! feof($this->fp))
{
// if the original metadata is present and not yet
skipped...
if (! $skippedOrigMeta)
- {
+ {
$pos = ftell($this->fp);
-
+
// check if we are going to output it in this
loop step
if ( $pos <= $this->origMetaOfs &&
$pos + $chunkSize > $this->origMetaOfs
)
@@ -278,10 +281,10 @@
// output the bytes just before the
original metadata tag
if ($this->origMetaOfs - $pos > 0)
echo fread($this->fp,
$this->origMetaOfs - $pos);
-
+
// position the file pointer just after
the metadata tag
fseek($this->fp, $this->origMetaOfs +
$this->origMetaSize);
-
+
$skippedOrigMeta = true;
continue;
}
Modified: trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/mvFlvServer.php
===================================================================
--- trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/mvFlvServer.php
2009-09-15 18:09:52 UTC (rev 56379)
+++ trunk/extensions/MetavidWiki/skins/mv_embed/flvServer/mvFlvServer.php
2009-09-15 18:12:33 UTC (rev 56380)
@@ -1,15 +1,15 @@
<?php
/*
- * mv_flvServer.php
+ * mv_flvServer.php
*
* @date Jul 25, 2008
- *
+ *
* this should enable serving segments of flv files
- *
+ *
* called with: mv_flvServer.php?file=myClip.flv&t=0:01:00/0:02:00
- *
+ *
* flash does not like get arguments in media files? so best to use mod-rewrite
- * something like:
+ * something like:
* /flvserver/my_file/start_time/end_time
*/
define('BASE_LOCAL_CLIP_PATH', '/metavid/video_archive');
@@ -24,12 +24,11 @@
if(!function_exists('filter_input')){
die('you version of php lacks <b>filter_input()</b> function</br>');
}
-
do_request();
function do_request(){
$file_req = filter_input(INPUT_GET, 'file', FILTER_SANITIZE_STRING);
$time_req = filter_input(INPUT_GET, 't', FILTER_SANITIZE_STRING);
-
+
//try to grab the file from /filename format
if($file_req==''){
if(isset($_SERVER['PHP_SELF'])){
@@ -43,12 +42,15 @@
$file_req = str_replace(array('../','./'), '', $file_req);
if($file_req=='')die('error: missing file name');
$file_loc =BASE_LOCAL_CLIP_PATH.'/'.$file_req;
- if(!is_file($file_loc))die('error: requested file not found');
-
- //if 't' is empty no seeking necessary:
- if($time_req==''){
+ if(!is_file($file_loc))
+ die('error: requested file not found:'. $file_loc);
+
+ //if 't' is empty no seeking necessary:
+ if( $time_req == '' ){
+ header('Content-type: '.FLASH_VIDEO_CONTENT_TYPE);
+ header('Content-Length: ' . filesize($file_loc) );
output_full_file($file_loc);
- }else{
+ }else{
//@@todo support more time request formats
if(strpos( $time_req,'/')!==false){
list($start_time_ntp,
$end_time_ntp)=explode('/',$time_req);
@@ -57,12 +59,13 @@
}else{
$start_sec = npt2seconds($time_req);
$end_sec = null;
- if($start_sec==0)output_full_file($file_loc);
+ if( $start_sec==0 )
+ output_full_file($file_loc);
}
if($start_sec > $end_sec)die('error: requested invalid time
range');
//print "DO: $start_sec $end_sec \n";
require_once('MvFlv.php');
- //open up the metavid Flv object:
+ //open up the metavid Flv object:
$flv = new MyFLV();
try {
$flv->open( $file_loc );
@@ -71,15 +74,15 @@
}
header('Content-type: '.FLASH_VIDEO_CONTENT_TYPE);
$one_year = 60*60*24*365;
- header("Expires: " . gmdate( "D, d M Y H:i:s", time() +
$one_year ) . " GM");
+ header("Expires: " . gmdate( "D, d M Y H:i:s", time() +
$one_year ) . " GM");
//small meta file to parse no big deal:
list($start_byte, $end_byte) =
$flv->getKeyFrameByteTimes($start_sec, $end_sec);
- //send out content length:
+ //send out content length:
header('Content-Length: ' . ($end_byte - $start_byte) );
- $flv->play($start_byte, $end_byte);
+ $flv->play($start_byte, $end_byte);
//$end = microtime(true);
- //file_put_contents('/tmp/time.log', "<hr/>EXTRACT METADATA
PROCESS TOOK " . number_format(($end-$start), 2) . " seconds<br/>");
- $flv->close();
+ //file_put_contents('/tmp/time.log', "<hr/>EXTRACT METADATA
PROCESS TOOK " . number_format(($end-$start), 2) . " seconds<br/>");
+ $flv->close();
}
}
@@ -88,13 +91,13 @@
header('Content-Type: '.FLASH_VIDEO_CONTENT_TYPE);
while (ob_get_level() > 0) {
ob_end_flush();
- } //turn off output buffering
+ } //turn off output buffering
@readfile($file_loc);
die();
}
function npt2seconds($str_time){
- $time_ary = explode(':', $str_time);
+ $time_ary = explode(':', $str_time);
$hours=$min=$sec=0;
if(count($time_ary)==3){
$hours=$time_ary[0];
@@ -105,7 +108,7 @@
$sec=$time_ary[1];
}else if(count($time_ary)==1){
$sec=$time_ary[0];
- }
+ }
return ($hours*3600) + ($min*60) + $sec;
}
?>
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs