Вход Регистрация
Файл: moduls/PEAR/Ogg/Media.php
Строк: 331
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------------+
// | File_Ogg PEAR Package for Accessing Ogg Bitstreams                         |
// | Copyright (c) 2005-2007                                                    |
// | David Grant <david@grant.org.uk>                                           |
// | Tim Starling <tstarling@wikimedia.org>                                     |
// +----------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or              |
// | modify it under the terms of the GNU Lesser General Public                 |
// | License as published by the Free Software Foundation; either               |
// | version 2.1 of the License, or (at your option) any later version.         |
// |                                                                            |
// | This library is distributed in the hope that it will be useful,            |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of             |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          |
// | Lesser General Public License for more details.                            |
// |                                                                            |
// | You should have received a copy of the GNU Lesser General Public           |
// | License along with this library; if not, write to the Free Software        |
// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA |
// +----------------------------------------------------------------------------+

require_once('Bitstream.php');

/**
 * Parent class for media bitstreams
 * Contains some functions common to various media formats
 */
abstract class File_Ogg_Media extends File_Ogg_Bitstream
{
    
/**
     * Array to hold each of the comments.
     *
     * @access  private
     * @var     array
     */
    
var $_comments = array();
    
/**
     * Vendor string for the stream.
     *
     * @access  private
     * @var     string
     */
    
var $_vendor;

    
/**
     * Length of the stream in seconds
     */
    
var $_streamLength;

    
/*function File_Ogg_Media($streamSerial, $streamData, $filePointer)
    {
        File_Ogg_Bitstream::File_Ogg_Bitstream($streamSerial, $streamData, $filePointer);
    }*/

    /**
     * Get a short string describing the type of the stream
     * @return string
     */
    
abstract function getType();

    
/**
     * Get the 6-byte identification string expected in the common header
     * @return string
     */
    
function getIdentificationString()
    {
        return 
'';
    }

    
/**
     * @access  private
     * @param   int     $packetType
     * @param   int     $pageOffset
     */
    
function _decodeCommonHeader($packetType$pageOffset)
    {
        
fseek($this->_filePointer$this->_streamList[$pageOffset]['body_offset'], SEEK_SET);
        if (
$packetType !== false) {
            
// Check if this is the correct header.
            
$packet unpack("Cdata"fread($this->_filePointer1));
            if (
$packet['data'] != $packetType)
                throw new 
PEAR_Exception("Stream Undecodable"OGG_ERROR_UNDECODABLE);
        
            
// The following six characters should be equal to getIdentificationString()
            
$id $this->getIdentificationString();
            if (
$id !== '' && fread($this->_filePointerstrlen($id)) !== $id)
                throw new 
PEAR_Exception("Stream is undecodable due to a malformed header."OGG_ERROR_UNDECODABLE);
        } 
// else seek only, no common header
    
}

    
/**
     * Parse a Vorbis-style comments header.
     *
     * This function parses the comments header.  The comments header contains a series of
     * UTF-8 comments related to the audio encoded in the stream.  This header also contains
     * a string to identify the encoding software.  More details on the comments header can
     * be found at the following location: http://xiph.org/vorbis/doc/v-comment.html
     *
     * @access  private
     */
    
function _decodeBareCommentsHeader()
    {
        
// Decode the vendor string length as a 32-bit unsigned integer.
        
$vendor_len unpack("Vdata"fread($this->_filePointer4));
        if ( 
$vendor_len['data'] > ) {
            
// Retrieve the vendor string from the stream.
            
$this->_vendor  fread($this->_filePointer$vendor_len['data']);
        } else {
            
$this->_vendor '';
        }
        
// Decode the size of the comments list as a 32-bit unsigned integer.
        
$comment_list_length unpack("Vdata"fread($this->_filePointer4));
        
// Iterate through the comments list.
        
for ($i 0$i $comment_list_length['data']; ++$i) {
            
// Unpack the length of this comment.
            
$comment_length unpack("Vdata"fread($this->_filePointer4));
            
// Comments are in the format 'ARTIST=Super Furry Animals', so split it on the equals character.
            // NOTE: Equals characters are strictly prohibited in either the COMMENT or DATA parts.
            
$comment        explode("="fread($this->_filePointer$comment_length['data']));
            
$comment_title  = (string) $comment[0];
            
$comment_value  = (string) utf8_decode($comment[1]);
    
            
// Check if the comment type (e.g. ARTIST) already exists.  If it does,
            // take the new value, and the existing value (or array) and insert it
            // into a new array.  This is important, since each comment type may have
            // multiple instances (e.g. ARTIST for a collaboration) and we should not
            // overwrite the previous value.
            
if (isset($this->_comments[$comment_title])) {
                if (
is_array($this->_comments[$comment_title]))
                    
$this->_comments[$comment_title][] = $comment_value;
                else
                    
$this->_comments[$comment_title] = array($this->_comments[$comment_title], $comment_value);
            } else
                
$this->_comments[$comment_title] = $comment_value;
        }
    }
    
    
/**
     * Provides a list of the comments extracted from the Vorbis stream.
     *
     * It is recommended that the user fully inspect the array returned by this function
     * rather than blindly requesting a comment in false belief that it will always
     * be present.  Whilst the Vorbis specification dictates a number of popular
     * comments (e.g. TITLE, ARTIST, etc.) for use in Vorbis streams, they are not
     * guaranteed to appear.
     *
     * @access  public
     * @return  array
     */
    
function getCommentList()
    {
        return (
array_keys($this->_comments));
    }

    
/**
     * Provides an interface to the numerous comments located with a Vorbis stream.
     *
     * A Vorbis stream may contain one or more instances of each comment, so the user
     * should check the variable type before printing out the result of this method.
     * The situation in which multiple instances of a comment occurring are not as
     * rare as one might think, since they are conceivable at least for ARTIST comments
     * in the situation where a track is a duet.
     *
     * @access  public
     * @param   string  $commentTitle   Comment title to search for, e.g. TITLE.
     * @param   string  $separator      String to separate multiple values.
     * @return  string
     */
    
function getField($commentTitle$separator ", ")
    {
    if (isset(
$this->_comments[$commentTitle])) {
        if (
is_array($this->_comments[$commentTitle]))
            return (
implode($separator$this->_comments[$commentTitle]));
        else
            return (
$this->_comments[$commentTitle]);
    } else
        
// The comment doesn't exist in this file.  The user should've called getCommentList first.
        
return ("");
    }
    
    
/**
     * Get the entire comments array.
     * May return an empty array if the bitstream does not support comments.
     *
     * @access  public
     * @return  array
     */
    
function getComments() {
        return 
$this->_comments;
    }

    
/**
     * Vendor of software used to encode this stream.
     *
     * Gives the vendor string for the software used to encode this stream.
     * It is common to find libVorbis here.  The majority of encoders appear
     * to use libvorbis from Xiph.org.
     *
     * @access  public
     * @return  string
     */
    
function getVendor()
    {
        return (
$this->_vendor);
    }

    
/**
     * Get an associative array containing header information about the stream
     * @access  public
     * @return  array
     */
    
function getHeader() 
    {
        return array();
    }

    
/**
     * Get the length of the stream in seconds
     * @return float
     */
    
function getLength()
    {
        return 
$this->_streamLength;
    }
}
Онлайн: 4
Реклама