descriptors.h

来自「Sun公司Dream项目」· C头文件 代码 · 共 179 行

H
179
字号
/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License").  You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * http://www.opensource.org/licenses/cddl1.php
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * http://www.opensource.org/licenses/cddl1.php.  If 
 * applicable, add the following below this CDDL HEADER, 
 * with the fields enclosed by brackets "[]" replaced 
 * with your own identifying information: 
 * Portions Copyright [yyyy]
 * [name of copyright owner]
 */ 

/*
 * $(@)Descriptors.h $Revision: 1.3 $ $Date: 2007/03/06 02:31:30 $
 * 
 * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
 */

#ifndef MPEG2TS_DESCRIPTORS_H
#define MPEG2TS_DESCRIPTORS_H

#include <bitset>
#include <vector>
#include <boost/shared_ptr.hpp>

namespace mpeg2ts {

class Descriptor;
typedef boost::shared_ptr<Descriptor> DescriptorPtr;
typedef std::vector<Descriptor> DescriptorList;

class InputBitBuffer;
class OutputBitBuffer;
class AudioStreamDescriptor;
class VideoStreamDescriptor;
class LanguageDescriptor;
class UnknownDescriptor;
class CaDescriptor;
OutputBitBuffer& operator<<( OutputBitBuffer& dest, Descriptor& descriptor );
OutputBitBuffer& operator<<( OutputBitBuffer& dest, AudioStreamDescriptor& adesc );
OutputBitBuffer& operator<<( OutputBitBuffer& dest, VideoStreamDescriptor& vdesc );
OutputBitBuffer& operator<<( OutputBitBuffer& dest, LanguageDescriptor& vdesc );
OutputBitBuffer& operator<<( OutputBitBuffer& dest, UnknownDescriptor& vdesc );    
OutputBitBuffer& operator<<( OutputBitBuffer& dest, CaDescriptor& cadesc );    
std::ostream& operator<<(std::ostream& cout, const CaDescriptor& caDesc);

struct Descriptor
{
    enum { VideoStreamTag=2,
       AudioStreamTag=3,
       HierarchyTag=4,
       RegistrationTag=5,
       DataStreamAlignmentTag=6,
       TargetBackgroundTag=7,
       VideoWindowTag=8,
       CaTag=9,
       LanguageTag=10,
       SystemClockTag=11,
       MultiplexBufferUtilization=12,
       Copyright=13,
       MaximumBitrate=14,
       PrivateDataIndicator=15,
       SmoothingBuffer=16,
       STD=17,
       IBP=18,
       UserPrivateBegin=64,
       UserPrivateEnd=255
    };
    static DescriptorPtr createDescriptor(InputBitBuffer& indata);
    Descriptor( uint8_t tag, uint8_t length ): descriptorTag(tag), descriptorLength(length){}
    virtual ~Descriptor(){}
    std::bitset<8> descriptorTag;
    std::bitset<8> descriptorLength;
    static int nbytes(){ return 2; }
    virtual int sizeInBytes() { return nbytes(); }
    virtual OutputBitBuffer& write( OutputBitBuffer& outb )=0;
};

struct UnknownDescriptor: public Descriptor
{
    UnknownDescriptor(uint8_t tag, std::string descData)
    : Descriptor(tag, descData.length()), data(descData) 
    {}
    UnknownDescriptor(uint8_t tag ):Descriptor(tag, 0){}

    std::string data;
    virtual int sizeInBytes() { 
	return data.length() + Descriptor::sizeInBytes(); }
    virtual OutputBitBuffer& write( OutputBitBuffer& outb ){
	outb << *this;
	return outb;
    }
};

struct VideoStreamDescriptor: public Descriptor
{
    VideoStreamDescriptor( ): Descriptor( VideoStreamTag, 0 )
    {}
    
    std::bitset<1> multipleFrameRateFlag;
    std::bitset<4> frameRateCode;
    std::bitset<1> mpeg1OnlyFlag;
    std::bitset<1> constrainedParameterFlag;
    std::bitset<1> stillPictureFlag;
    
    // The following fields are valid if mpeg1OnlyFlag is set to '0'
    std::bitset<8> profileAndLevelIndication;
    std::bitset<2> chromaFormat;
    std::bitset<1> frameRateExtensionFlag;
    std::bitset<5> reserved;
    
    virtual int sizeInBytes(){ return mpeg1OnlyFlag == 0 ? 3+Descriptor::nbytes() 
                         : 1+Descriptor::nbytes(); }
    virtual OutputBitBuffer& write( OutputBitBuffer& outb ){ outb << *this; return outb; }
};
    
struct AudioStreamDescriptor: public Descriptor
{
    AudioStreamDescriptor(): Descriptor(AudioStreamTag, 0){}
    std::bitset<1> freeFormatFlag;
    std::bitset<1> ID;
    std::bitset<2> layer;
    std::bitset<1> variableRateAudioIndicator;
    std::bitset<3> reserved;
    virtual int sizeInBytes(){ return nbytes(); }
    static int nbytes(){ return 1+Descriptor::nbytes(); }
    virtual OutputBitBuffer& write( OutputBitBuffer& outb ){ outb << *this; return outb; }
};

struct LanguageDescriptorEntry: public Descriptor
{
    LanguageDescriptorEntry(): Descriptor(LanguageTag, 0){}
    std::bitset<24> iso639LanguageCode;
    std::bitset<8>  audioType;
    virtual int sizeInBytes(){ return nbytes(); }
    static int nbytes() { return 4; }
    virtual OutputBitBuffer& write( OutputBitBuffer& outb ){ outb << *this; return outb;}
};

typedef std::vector<LanguageDescriptorEntry> LanguageDescriptorEntryList;

struct LanguageDescriptor: public Descriptor
{
    LanguageDescriptor(): Descriptor(LanguageTag, 0){}
    LanguageDescriptorEntryList entries;
    virtual int sizeInBytes(){ return Descriptor::nbytes()
        + LanguageDescriptorEntry::nbytes()*entries.size();
    }
};

struct CaDescriptor: public Descriptor
{
    CaDescriptor(): Descriptor(CaTag, 0), reserved(0x7)
    {}
    
    std::bitset<16> caSystemId;
    std::bitset<3>  reserved;
    std::bitset<13> caPid;
    std::string     privateData;
    
    virtual int sizeInBytes(){ return 4 + privateData.size() + Descriptor::nbytes(); }
    
    virtual OutputBitBuffer& write( OutputBitBuffer& outb ){ outb << *this; return outb; }
};


}

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?