/*
* GPAC - Multimedia Framework C SDK
*
* Authors: Jean Le Feuvre
* Copyright (c) Telecom ParisTech 2006-2012
* All rights reserved
*
* This file is part of GPAC / Elementary Stream Interface sub-project
*
* 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_ESI_H_
#define _GF_ESI_H_
#ifdef __cplusplus
extern "C" {
#endif
/*!
* \file <gpac/esi.h>
* \brief Draft elementary stream interface API used by MP42TS.
*/
/*!
* \addtogroup esi_grp ES Interface
* \ingroup media_grp
* \brief Draft elementary stream interface API used by MP42TS.
*
*This section documents the draft ES interface used by MP42TS to abstract input sources.
* @{
*/
#include <gpac/tools.h>
/* ESI input control commands*/
enum
{
/*forces a data flush from interface to dest (caller) - used for non-threaded interfaces
corresponding parameter: unused
*/
GF_ESI_INPUT_DATA_FLUSH,
/*pulls a COMPLETE AU from the stream
corresponding parameter: pointer to a GF_ESIPacket to fill. The indut data_len in the packet is used to indicate any padding in bytes
*/
GF_ESI_INPUT_DATA_PULL,
/*releases the currently pulled AU from the stream - AU cannot be pulled after that, unless seek happens
corresponding parameter: unused
*/
GF_ESI_INPUT_DATA_RELEASE,
/*destroys any allocated resource by the stream interface*/
GF_ESI_INPUT_DESTROY,
};
/* ESI output control commands*/
enum
{
/*forces a data flush from interface to dest (caller) - used for non-threaded interfaces
corresponding parameter: GF_ESIPacket
*/
GF_ESI_OUTPUT_DATA_DISPATCH
};
/*
data packet flags
*/
enum
{
GF_ESI_DATA_AU_START = 1,
GF_ESI_DATA_AU_END = 1<<1,
GF_ESI_DATA_AU_RAP = 1<<2,
GF_ESI_DATA_HAS_CTS = 1<<3,
GF_ESI_DATA_HAS_DTS = 1<<4,
GF_ESI_DATA_REPEAT = 1<<5,
GF_ESI_DATA_CRITICAL = 1<<6,
GF_ESI_DATA_ENCRYPTED = 1<<7,
};
typedef struct __data_packet_ifce
{
u32 flags;
char *data;
u32 data_len;
/*DTS, CTS/PTS and duration expressed in media timescale*/
u64 dts, cts;
u32 duration;
u32 pck_sn;
/*MPEG-4 stuff*/
u32 au_sn;
/*for packets using ISMACrypt/OMA/3GPP based crypto*/
u32 isma_bso;
char *mpeg2_af_descriptors;
u32 mpeg2_af_descriptors_size;
} GF_ESIPacket;
struct __esi_video_info
{
u32 width, height, par;
Double FPS;
};
struct __esi_audio_info
{
u32 sample_rate, nb_channels;
};
enum
{
/*data can be pulled from this stream*/
GF_ESI_AU_PULL_CAP = 1,
/*DTS is signaled for this stream*/
GF_ESI_SIGNAL_DTS = 1<<1,
/*no more data to expect from this stream*/
GF_ESI_STREAM_IS_OVER = 1<<2,
/*stream is not signaled through MPEG-4 Systems (OD stream) */
GF_ESI_STREAM_WITHOUT_MPEG4_SYSTEMS = 1<<3,
};
typedef struct __elementary_stream_ifce
{
/*misc caps of the stream*/
u32 caps;
/*matches PID for MPEG2, ES_ID for MPEG-4*/
u32 stream_id;
/*MPEG-TS program number if any*/
u16 program_number;
/*MPEG-4 ST/OTIs*/
u8 stream_type;
u8 object_type_indication;
/*stream 4CC for non-mpeg codecs, 0 otherwise (stream is identified through StreamType/ObjectType)*/
u32 fourcc;
/*packed 3-char language code (4CC with last byte ' ')*/
u32 lang;
/*media timescale*/
u32 timescale;
/*duration in ms - 0 if unknown*/
Double duration;
/*average bit rate in bit/sec - 0 if unknown*/
u32 bit_rate;
/*repeat rate in ms for carrouseling - 0 if no repeat*/
u32 repeat_rate;
char *decoder_config;
u32 decoder_config_size;
/* MPEG-4 SL Config if any*/
GF_SLConfig *sl_config;
struct __esi_video_info info_video;
struct __esi_audio_info info_audio;
/*input ES control from caller*/
GF_Err (*input_ctrl)(struct __elementary_stream_ifce *_self, u32 ctrl_type, void *param);
/*input user data of interface - usually set by interface owner*/
void *input_udta;
/*output ES control of destination*/
GF_Err (*output_ctrl)(struct __elementary_stream_ifce *_self, u32 ctrl_type, void *param);
/*output user data of interface - usually set during interface setup*/
void *output_udta;
u32 depends_on_stream;
} GF_ESInterface;
typedef struct __service_ifce
{
u32 type;
/*input service control from caller*/
GF_Err (*input_ctrl)(struct __service_ifce *_self, u32 ctrl_type, void *param);
/*input user data of interface - usually set by interface owner*/
void *input_udta;
/*output service control of destination*/
GF_Err (*output_ctrl)(struct __service_ifce *_self, u32 ctrl_type, void *param);
/*output user data of interface - usually set during interface setup*/
void *output_udta;
GF_ESInterface **streams;
u32 nb_streams;
} GF_ServiceInterface;
typedef struct __data_io
{
u32 (*read)(struct __data_io *_self, char *buffer, u32 nb_bytes);
u32 (*write)(struct __data_io *_self, char *buffer, u32 nb_bytes);
void *udta;
} GF_DataIO;
/*! @} */
#ifdef __cplusplus
}
#endif
#endif //_GF_ESI_H_