/*************************************************************************
*  Generating a MPEG/SYSTEMS                                             *
*  MULTIPLEXED VIDEO/AUDIO STREAM                                        *
*  from two MPEG source streams                                          *
*  Christoph Moar                                                        *
*  SIEMENS CORPORATE RESEARCH AND DEVELOPMENT ST SN 11 / T SN 6          *
*  (C) 1994 1995                                                         *
**************************************************************************
*  Restrictions apply. Will not support the whole MPEG/SYSTEM Standard.  *
*  Basically, will generate Constrained System Parameter Files.          *
*  Mixes only one audio and/or one video stream. Might be expanded.      *
*************************************************************************/

/*************************************************************************
*  mplex - MPEG/SYSTEMS multiplexer                                      *
*  Copyright (C) 1994 1995 Christoph Moar                                *
*  Siemens ZFE ST SN 11 / T SN 6                                         *
*                                                                        *
*  moar@informatik.tu-muenchen.de                                        *
*       (Christoph Moar)                                                 *
*                                                                        *
*  This program is free software; you can redistribute it and/or modify  *
*  it under the terms of the GNU General Public License as published by  *
*  the Free Software Foundation; either version 2 of the License, or     *
*  (at your option) any later version.                                   *
*                                                                        *
*  This program 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 General Public License for more details.                          *
*                                                                        *
*  You should have received a copy of the GNU General Public License     *
*  along with this program; if not, write to the Free Software           *
*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.             *
*************************************************************************/


#ifndef __MAIN_H__
#define __MAIN_H__

#include <glib.h>

#define PACK_START              0x000001ba
#define SYS_HEADER_START        0x000001bb
#define ISO11172_END            0x000001b9
#define PACKET_START            0x000001

#define CLOCKS                  90000.0         /* System Clock Hertz   */

#define AFTER_PACKET_LENGTH     15              /* No of non-data-bytes */
                                                /* following the packet */
                                                /* length field         */
#define LAST_SCR_BYTE_IN_PACK   9               /* No of bytes in pack  */
                                                /* preceding, and       */
                                                /* including, the SCR   */

/* The following values for sys_header_length & size are only valid for */
/* System streams consisting of two basic streams. When wrapping around */
/* the system layer on a single video or a single audio stream, those   */
/* values get decreased by 3.                                           */

#define SYS_HEADER_LENGTH       12              /* length of Sys Header */
                                                /* after start code and */
                                                /* length field         */

#define SYS_HEADER_SIZE         18              /* incl. start code and */
                                                /* length field         */
#define PACK_HEADER_SIZE        12

#define PACKET_HEADER_SIZE      6

#define MAX_SECTOR_SIZE         0x20000         /* Max Sektor Groesse   */

#define STREAMS_VIDEO           1
#define STREAMS_AUDIO           2
#define STREAMS_BOTH            3

#define AUDIO_STREAMS           0xb8            /* Marker Audio Streams */
#define VIDEO_STREAMS           0xb9            /* Marker Video Streams */
#define AUDIO_STR_0             0xc0            /* Marker Audio Stream0 */
#define VIDEO_STR_0             0xe0            /* Marker Video Stream0 */
#define PADDING_STR             0xbe            /* Marker Padding Stream*/

#define ZERO_STUFFING_BYTE      0
#define STUFFING_BYTE           0xff
#define RESERVED_BYTE           0xff
#define TIMESTAMPS_NO           0               /* Flag NO timestamps   */
#define TIMESTAMPS_PTS          1               /* Flag PTS timestamp   */
#define TIMESTAMPS_PTS_DTS      2               /* Flag BOTH timestamps */

#define MARKER_SCR              2               /* Marker SCR           */
#define MARKER_JUST_PTS         2               /* Marker only PTS      */
#define MARKER_PTS              3               /* Marker PTS           */
#define MARKER_DTS              1               /* Marker DTS           */
#define MARKER_NO_TIMESTAMPS    0x0f            /* Marker NO timestamps */

#define STATUS_AUDIO_END        0               /* Statusmessage A end  */
#define STATUS_VIDEO_END        1               /* Statusmessage V end  */
#define STATUS_AUDIO_TIME_OUT   2               /* Statusmessage A out  */
#define STATUS_VIDEO_TIME_OUT   3               /* Statusmessage V out  */

/*************************************************************************
    Typ- und Strukturdefinitionen
*************************************************************************/

typedef struct sector_struc     /* A sector, can contain pack, sys header       */
                                /* and packet.          */
{   unsigned char  buf [MAX_SECTOR_SIZE] ;
    unsigned int   length_of_sector  ;
    unsigned int   length_of_packet_data ;
    guint64 TS                ;
} Sector_struc;

typedef struct pack_struc       /* Pack Info                            */
{   unsigned char  buf [PACK_HEADER_SIZE];
    guint64 SCR;
} Pack_struc;

typedef struct sys_header_struc /* System Header Info                   */
{   unsigned char  buf [SYS_HEADER_SIZE];
} Sys_header_struc;

/*************************************************************************
    Funktionsprototypen, keine Argumente, K&R Style
*************************************************************************/

/* systems.c */
void create_sector (Sector_struc     *sector, Pack_struc       *pack, Sys_header_struc *sys_header,
        unsigned int packet_size, unsigned char *inputbuffer, unsigned char type, unsigned char buffer_scale,
        unsigned int buffer_size, unsigned char buffers, guint64 PTS, guint64 DTS,
        unsigned char timestamps, unsigned int  which_streams);

void create_pack (Pack_struc *pack, guint64 SCR, unsigned int mux_rate);

void create_sys_header (Sys_header_struc *sys_header, unsigned int rate_bound, unsigned char audio_bound,
        unsigned char fixed, unsigned char CSPS, unsigned char audio_lock, unsigned char video_lock,
        unsigned char video_bound, unsigned char stream1, unsigned char buffer1_scale, unsigned int buffer1_size,
        unsigned char stream2, unsigned char buffer2_scale, unsigned int buffer2_size, unsigned int which_streams);

#endif