F5OEO-tstools/ps_defns.h

145 wiersze
5.5 KiB
C
Czysty Zwykły widok Historia

/*
* Datastructures for working with H.222 Program Stream packets - in
* particular, for reading PES packets.
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the MPEG TS, PS and ES tools.
*
* The Initial Developer of the Original Code is Amino Communications Ltd.
* Portions created by the Initial Developer are Copyright (C) 2008
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Amino Communications Ltd, Swavesey, Cambridge UK
*
* ***** END LICENSE BLOCK *****
*/
#ifndef _ps_defns
#define _ps_defns
#include "compat.h"
#include "h222_defns.h"
#include "tswrite_defns.h"
// ------------------------------------------------------------
// A program stream context, used to read PS and manage a read-ahead cache
#define PS_READ_AHEAD_SIZE 5000 // The number of bytes to read ahead
struct ps_reader
{
int input; // where we're reading from
offset_t start; // the offset at which our data starts
byte data[PS_READ_AHEAD_SIZE];
offset_t data_posn; // location of this data in the file
int32_t data_len; // actual number of bytes in the buffer
byte *data_end; // off the end of `data`
byte *data_ptr; // which byte we're interested in (next)
};
typedef struct ps_reader *PS_reader_p;
#define SIZEOF_PS_READER sizeof(struct ps_reader)
// ------------------------------------------------------------
// A program stream pack header (not including the system header packets)
struct PS_pack_header
{
int id; // A number to identify this packet
byte data[10]; // The data excluding the leading 00 00 01 BA
uint64_t scr; // Formed from scr_base and scr_ext
uint64_t scr_base;
uint32_t scr_extn;
uint32_t program_mux_rate;
int pack_stuffing_length;
};
typedef struct PS_pack_header *PS_pack_header_p;
#define SIZEOF_PS_PACK_HEADER sizeof(struct PS_pack_header)
// ------------------------------------------------------------
// A program stream packet (specifically one that starts with six bytes
// organised as 00 00 01 <stream id> <packet length>)
struct PS_packet
{
int id; // A number to identify this packet
byte *data; // The data including the leading 00 00 01
int data_len; // Its length
byte stream_id; // Its stream id (i.e., data[4])
int packet_length; // The packet length (6 less than data_len)
};
typedef struct PS_packet *PS_packet_p;
#define SIZEOF_PS_PACKET sizeof(struct PS_packet)
// ------------------------------------------------------------
// Number of streams of various types
#define NUMBER_VIDEO_STREAMS 0x0F
#define NUMBER_AUDIO_STREAMS 0x1F
#define NUMBER_AC3_SUBSTREAMS 0x08
// DVD private_stream_1 substream identifiers
// (also used for non-DVD data when we have identified the private data
// appropriately)
#define SUBSTREAM_OTHER 0
#define SUBSTREAM_AC3 1 // AC-3 audio (Dolby 5.1)
#define SUBSTREAM_DTS 2 // DTS audio
#define SUBSTREAM_LPCM 3 // LPCM audio (CD audio)
#define SUBSTREAM_SUBPICTURES 4 // Sub-pictures
#define SUBSTREAM_ERROR 5 // Error in deciding
#define NUMBER_SUBSTREAM_TYPES 6 // useful for array sizing
#define SUBSTREAM_STR(what) ((what)==SUBSTREAM_OTHER?"other": \
(what)==SUBSTREAM_AC3 ?"AC3": \
(what)==SUBSTREAM_DTS ?"DTS": \
(what)==SUBSTREAM_LPCM ?"LPCM": \
(what)==SUBSTREAM_SUBPICTURES?"subpictures": \
"???")
#define SUBSTREAM_IS_AUDIO(what) ((what)==SUBSTREAM_AC3|| \
(what)==SUBSTREAM_DTS|| \
(what)==SUBSTREAM_LPCM)
#define BSMOD_STR(bsmod,acmod) \
((bsmod)==0?"main audio service: complete main (CM)": \
(bsmod)==1?"main audio service: music & effects (ME)": \
(bsmod)==2?"associated service: visually impaired (VI)": \
(bsmod)==3?"associated service: hearing impaired (HI)": \
(bsmod)==4?"associated service: dialogue (D)": \
(bsmod)==5?"associated service: commentary (C)": \
(bsmod)==6?"associated service: emergency (E)": \
(bsmod)==7 && (acmod)==1?"associated service: voice over (VO)": \
(bsmod)==7 && (acmod)>=2 && (acmod)<=7?"main audio service: karaoke": \
"???")
#define ACMOD_STR(acmod) ((acmod)==0?"1+1 Ch1,Ch2": \
(acmod)==1?"1/0 C": \
(acmod)==2?"2/0 L,R": \
(acmod)==3?"3/0 L,C,R": \
(acmod)==4?"2/1 L,R,S": \
(acmod)==5?"3/1 L,C,R,S": \
(acmod)==6?"2/2 L,R,SL,SR": \
(acmod)==7?"3/2 L,C,R,SL,SR":"???")
#endif // _ps_defns
// Local Variables:
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 2
// End:
// vim: set tabstop=8 shiftwidth=2 expandtab: