/** * Test time string to np2 */ function testSeconds2NptFormat() { // Some time conversions: $this->assertEquals( TimedMediaHandler::seconds2npt( 100 ), '0:1:40' ); $this->assertEquals( TimedMediaHandler::seconds2npt( 0 ), '0:0:0' ); $this->assertEquals( TimedMediaHandler::seconds2npt( 3601 ), '1:0:1' ); // Test failures: $this->assertEquals( TimedMediaHandler::seconds2npt( 'foo' ), false ); $this->assertEquals( TimedMediaHandler::seconds2npt( -1 ), false ); }
public function monitorTranscode( $pid, &$retval, $encodingLog, $retvalLog ){ global $wgTranscodeBackgroundTimeLimit, $wgLang; $errorMsg = ''; $loopCount = 0; $oldFileSize = 0; $startTime = time(); $fileIsNotGrowing = false; $this->output( "Encoding with pid: $pid \npcntl_waitpid: " . pcntl_waitpid( $pid, $status, WNOHANG OR WUNTRACED) . "\nisProcessRunning: " . self::isProcessRunningKillZombie( $pid ) . "\n" ); // Check that the child process is still running ( note this does not work well with pcntl_waitpid // for some reason :( while( self::isProcessRunningKillZombie( $pid ) ) { //$this->output( "$pid is running" ); // Check that the target file is growing ( every 5 seconds ) if( $loopCount == 5 ){ // only run check if we are outputing to target file // ( two pass encoding does not output to target on first pass ) clearstatcache(); $newFileSize = is_file( $this->getTargetEncodePath() ) ? filesize( $this->getTargetEncodePath() ) : 0; // Don't start checking for file growth until we have an initial positive file size: if( $newFileSize > 0 ){ $this->output( $wgLang->formatSize( $newFileSize ). ' Total size, encoding ' . $wgLang->formatSize( ( $newFileSize - $oldFileSize ) / 5 ) . ' per second' ); if( $newFileSize == $oldFileSize ){ if( $fileIsNotGrowing ){ $errorMsg = "Target File is not increasing in size, kill process."; $this->output( $errorMsg ); // file is not growing in size, kill proccess $retval = 1; //posix_kill( $pid, 9); self::killProcess( $pid ); break; } // Wait an additional 5 seconds of the file not growing to confirm // the transcode is frozen. $fileIsNotGrowing = true; } else { $fileIsNotGrowing = false; } $oldFileSize = $newFileSize; } // reset the loop counter $loopCount = 0; } // Check if we have global job run-time has been exceeded: if ( $wgTranscodeBackgroundTimeLimit && time() - $startTime > $wgTranscodeBackgroundTimeLimit ){ $errorMsg = "Encoding exceeded max job run time ( " . TimedMediaHandler::seconds2npt( $maxTime ) . " ), kill process."; $this->output( $errorMsg ); // File is not growing in size, kill proccess $retval = 1; //posix_kill( $pid, 9); self::killProcess( $pid ); break; } // Sleep for one second before repeating loop $loopCount++; sleep( 1 ); } $returnPcntl = pcntl_wexitstatus( $status ); // check status wfSuppressWarnings(); $returnCodeFile = file_get_contents( $retvalLog ); wfRestoreWarnings(); //$this->output( "TranscodeJob:: Child pcntl return:". $returnPcntl . ' Log file exit code:' . $returnCodeFile . "\n" ); // File based exit code seems more reliable than pcntl_wexitstatus $retval = $returnCodeFile; // return the encoding log contents ( will be inserted into error table if an error ) // ( will be ignored and removed if success ) if( $errorMsg!= '' ){ $errorMsg.="\n\n"; } return $errorMsg . file_get_contents( $encodingLog ); }
function getTemporalUrlHash(){ if( $this->hashTime ){ return $this->hashTime; } $hash =''; if( $this->start ){ $startSec = TimedMediaHandler::parseTimeString( $this->start ); if( $startSec !== false ){ $hash.= '#t=' . TimedMediaHandler::seconds2npt( $startSec ); } } if( $this->end ){ if( $hash == '' ){ $hash .= '#t=0'; } $endSec = TimedMediaHandler::parseTimeString( $this->end ); if( $endSec !== false ){ $hash.= ',' . TimedMediaHandler::seconds2npt( $endSec ); } } $this->hashTime = $hash; return $this->hashTime; }