root/include/gpac/esi.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      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_


/* [<][>][^][v][top][bottom][index][help] */