/*
* GPAC - Multimedia Framework C SDK
*
* Authors: Jean Le Feuvre
* Copyright (c) Telecom ParisTech 2000-2012
* All rights reserved
*
* This file is part of GPAC / SL header file
*
* GPAC 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, or (at your option)
* any later version.
*
* GPAC 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; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifndef _GF_SYNC_LAYER_H_
#define _GF_SYNC_LAYER_H_
#ifdef __cplusplus
extern "C" {
#endif
/*!
* \file <gpac/sync_layer.h>
* \brief MPEG-4 Object Descriptor Framework Sync Layer.
*/
/*!
* \ingroup odf_grp
* \brief MPEG-4 Object Descriptor Framework Sync Layer
*
*This section documents the MPEG-4 OD Sync Layer used in GPAC.
* @{
*/
/*the Sync Layer config descriptor*/
typedef struct
{
/*base descriptor*/
u8 tag;
u8 predefined;
u8 useAccessUnitStartFlag;
u8 useAccessUnitEndFlag;
u8 useRandomAccessPointFlag;
u8 hasRandomAccessUnitsOnlyFlag;
u8 usePaddingFlag;
u8 useTimestampsFlag;
u8 useIdleFlag;
u8 durationFlag;
u32 timestampResolution;
u32 OCRResolution;
u8 timestampLength;
u8 OCRLength;
u8 AULength;
u8 instantBitrateLength;
u8 degradationPriorityLength;
u8 AUSeqNumLength;
u8 packetSeqNumLength;
u32 timeScale;
u16 AUDuration;
u16 CUDuration;
u64 startDTS;
u64 startCTS;
Bool no_dts_signaling;
} GF_SLConfig;
/***************************************
SLConfig Tag
***************************************/
enum
{
SLPredef_Null = 0x01,
SLPredef_MP4 = 0x02,
/*intern to GPAC, means NO SL at all (for streams unable to handle AU reconstruction a timing)*/
SLPredef_SkipSL = 0xF0
};
/*set SL predefined (assign all fields according to sl->predefined value)*/
GF_Err gf_odf_slc_set_pref(GF_SLConfig *sl);
typedef struct
{
u8 accessUnitStartFlag;
u8 accessUnitEndFlag;
u8 paddingFlag;
u8 randomAccessPointFlag;
u8 OCRflag;
u8 idleFlag;
u8 decodingTimeStampFlag;
u8 compositionTimeStampFlag;
u8 instantBitrateFlag;
u8 degradationPriorityFlag;
u8 paddingBits;
u16 packetSequenceNumber;
u64 objectClockReference;
u16 AU_sequenceNumber;
u64 decodingTimeStamp;
u64 compositionTimeStamp;
u16 accessUnitLength;
u32 instantBitrate;
u16 degradationPriority;
/*Everything below this comment is internal to GPAC*/
/*this is NOT part of standard SL, only used internally: signals duration of access unit if known
this is useful for streams with very random updates, to prevent buffering for instance a subtitle stream
which is likely to have no updates during the first minutes... expressed in media timescale*/
u32 au_duration;
/*ISMACryp extensions*/
u8 isma_encrypted;
u64 isma_BSO;
/*CENC extensions*/
u8 cenc_encrypted;
char *sai;
u8 IV_size;
u32 saiz;
//for CENC pattern encryption mode
u8 crypt_byte_block, skip_byte_block;
u8 constant_IV_size;
bin128 constant_IV;
/*version_number are pushed from m2ts sections to the mpeg4sl layer so as to handle mpeg4 stream dependencies*/
u8 m2ts_version_number_plus_one;
//0: not mpeg-2 TS PCR, 1: MEPG-2 TS PCR, 2: MPEG-2 TS PCR with discontinuity
u8 m2ts_pcr;
/* HTML5 MSE Packet info */
s64 timeStampOffset;
//ntp at sender/producer side for this packet, 0 otherwise
u64 sender_ntp;
//set for AUs which should be decodedd but not presented during seek
u8 seekFlag;
} GF_SLHeader;
/*packetize SL-PDU. If PDU is NULL or size 0, only writes the SL header*/
void gf_sl_packetize(GF_SLConfig* slConfig, GF_SLHeader *Header, char *PDU, u32 size, char **outPacket, u32 *OutSize);
/*gets SL header size in bytes*/
u32 gf_sl_get_header_size(GF_SLConfig* slConfig, GF_SLHeader *Header);
/*depacketize SL-PDU*/
void gf_sl_depacketize(GF_SLConfig *slConfig, GF_SLHeader *Header, const char *PDU, u32 PDULength, u32 *HeaderLen);
/*! @} */
#ifdef __cplusplus
}
#endif
#endif /*_GF_SYNC_LAYER_H_*/