www.pudn.com > avi 到 mpeg 的转换程序及源代码.zip > MPLEX.H
/********************************** * MPEG SYSTEMS MULTIPLEXER * * Erzeugen einer MPEG/SYSTEMS * * MULTIPLEXED VIDEO/AUDIO DATEI * * aus zwei MPEG Basis Streams * * Christoph Moar * * SIEMENS ZFE ST SN 11 / T SN 6 * * (C) 1994 1995 * ****************************************************************** * 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 * ************************************************************************** * Einschraenkungen vorhanden. Unterstuetzt nicht gesamten MPEG/SYSTEMS * * Standard. Haelt sich i.d.R. an den CSPF-Werten, zusaetzlich (noch) * * nur fuer ein Audio- und/oder ein Video- Stream. Evtl. erweiterbar. * ************************************************************************** * 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. * *************************************************************************/ /* * 4/4/97 - John Schlichther * * extensively altered to create avi2mpg1 - avi to mpeg-1 encoder * * Since avi file, and the avi subsystem are platform dependant, cross * platform compatibility removed, many optional features disabled or * removed, code generally trimmed to a minimum. * */ #include#include "bitstrm.h" #ifdef TIMER #include #endif /************************************************************************* Definitionen *************************************************************************/ #define MPLEX_VER " 1.1 " #define MPLEX_DATE "06.06.95" #define SEQUENCE_HEADER 0x000001b3 #define SEQUENCE_END 0x000001b7 #define PICTURE_START 0x00000100 #define GROUP_START 0x000001b8 #define SYNCWORD_START 0x000001 #define IFRAME 1 #define PFRAME 2 #define BFRAME 3 #define DFRAME 4 #define AUDIO_SYNCWORD 0xfff #define PACK_START 0x000001ba #define SYS_HEADER_START 0x000001bb #define ISO11172_END 0x000001b9 #define PACKET_START 0x000001 #define MAX_FFFFFFFF 4294967295.0 /* = 0xffffffff in dec. */ #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 4096 /* Max Sektor Groesse */ /* #define SECTOR_SIZE 2324 */ /* CDROM Sektor Groesse */ /* #define MIN_PACKET_DATA 2273 */ /* SECTOR_SIZE - */ /* PACK_HEADER_SIZE - */ /* SYS_HEADER_SIZE - */ /* PACKET_HEADER_SIZE - */ /* AFTER_PACKET_LENGTH */ /* #define MAX_PACKET_DATA 2303 */ /* SECTOR_SIZE - */ /* PACKET_HEADER_SIZE - */ /* AFTER_PACKET_LENGTH */ /* #define PACKETS_PER_PACK 1 */ /* #define AUDIO_BUFFER 4*1024 */ /* Groesse Audio Buffer */ /* #define VIDEO_BUFFER 40*1024 */ /* Groesse Video Buffer */ #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 timecode_struc /* Time_code Struktur laut MPEG */ { unsigned long msb; /* fuer SCR, DTS, PTS */ unsigned long lsb; } Timecode_struc; typedef struct vaunit_struc /* Informationen ueber Video AU's */ { unsigned int length ; unsigned int type ; Timecode_struc DTS ; Timecode_struc PTS ; } Vaunit_struc; typedef struct aaunit_struc /* Informationen ueber Audio AU's */ { unsigned long length ; Timecode_struc PTS ; } Aaunit_struc; typedef struct video_struc /* Informationen ueber Video Stream */ { unsigned int stream_length ; unsigned int num_sequence ; unsigned int num_seq_end ; unsigned int num_pictures ; unsigned int num_groups ; unsigned int num_frames[4] ; unsigned int avg_frames[4] ; unsigned int horizontal_size; unsigned int vertical_size ; unsigned int aspect_ratio ; unsigned int picture_rate ; unsigned int bit_rate ; unsigned int comp_bit_rate ; unsigned int vbv_buffer_size; unsigned int CSPF ; } Video_struc; typedef struct audio_struc /* Informationen ueber Audio Stream */ { unsigned int stream_length ; unsigned int num_syncword ; unsigned int num_frames [2] ; unsigned int size_frames[2] ; unsigned int layer ; unsigned int protection ; unsigned int bit_rate ; unsigned int frequency ; unsigned int mode ; unsigned int mode_extension ; unsigned int copyright ; unsigned int original_copy ; unsigned int emphasis ; } Audio_struc; typedef struct sector_struc /* Ein Sektor, kann Pack, Sys Header */ /* und Packet enthalten. */ { unsigned char buf [MAX_SECTOR_SIZE] ; unsigned int length_of_sector ; unsigned int length_of_packet_data ; Timecode_struc TS ; } Sector_struc; typedef struct pack_struc /* Pack Info */ { unsigned char buf [PACK_HEADER_SIZE]; Timecode_struc SCR; } Pack_struc; typedef struct sys_header_struc /* System Header Info */ { unsigned char buf [SYS_HEADER_SIZE]; } Sys_header_struc; typedef struct buffer_queue /* FIFO-Queue fuer STD Buffer */ { unsigned int size ; /* als verkettete Liste implementiert */ Timecode_struc DTS ; struct buffer_queue *next ; } Buffer_queue; typedef struct buffer_struc /* Simuliert STD Decoder Buffer */ { unsigned int max_size; /* enthaelt Anker auf verkettete Liste */ Buffer_queue *first; } Buffer_struc; /************************************************************************* Funktionsprototypen, keine Argumente, K&R Style *************************************************************************/ void check_files (); /* Kontrolliert ob Files vorhanden und */ /* weist sie Audio/Video Pointern zu */ int open_file (); /* File vorhanden? */ void get_info_video (); /* Info Access Units Video Stream */ void output_info_video (); /* Ausgabe Information Access Units */ void get_info_audio (); /* Info Access Units Audio Stream */ void output_info_audio (); /* Ausgabe Information Access Units */ void marker_bit (); /* Checks for marker bit */ void empty_video_struc (); /* Initialisiert Struktur fuer SUN cc */ void empty_audio_struc (); /* Initialisiert Struktur fuer SUN cc */ void empty_vaunit_struc (); /* Initialisiert Struktur fuer SUN cc */ void empty_aaunit_struc (); /* Initialisiert Struktur fuer SUN cc */ void empty_sector_struc (); /* Initialisiert Struktur fuer SUN cc */ void empty_timecode_struc (); /* Initialisiert Struktur fuer SUN cc */ void init_buffer_struc (); /* Initialisiert Struktur fuer SUN cc */ void offset_timecode (); /* Rechnet Offset zwischen zwei TimeC. */ void copy_timecode (); /* setzt 2tes TimeC. dem 1ten gleich */ void make_timecode (); /* rechnet aus double einen TimeC. */ /* und schreibt ihn in Timecode_struc */ void add_to_timecode (); /* addiert 1tes TimeC. zum 2ten */ void buffer_timecode (); /* schreibt Timecode in Bitstreamformat */ int comp_timecode (); /* 1tes TimeC. <= 2tes TimeC. ? */ void create_sector (); /* erstellt einen Sector */ void create_sys_header (); /* erstellt einen System Header */ void create_pack (); /* erstellt einen Pack Header */ void output_video (); /* erstellt und schreibt Video pack aus */ void output_audio (); /* erstellt und schreibt Audio pack aus */ void output_padding (); /* erstellt und schreibt Padding pack */ void next_video_access_unit (); /* holt naechste gueltige AU Info her */ void next_audio_access_unit (); /* holt naechste gueltige AU Info her */ void buffer_clean (); /* saeubert die Bufferschlange */ unsigned int buffer_space (); /* Anzahl freier Bytes in Buffer */ void queue_buffer (); /* An Bufferliste anhaengen */ void outputstream (); /* Hauptschleife Multiplexroutinen */ void status_info (); /* Statusmitteilung bei Erstellen */ /* MPEG multiplex stream */ void status_header (); /* Titelzeilen Statusblock */ void status_message (); /* Event (end, time_out) mitteilen */ void status_footer (); /* Endzeile */ void ask_continue (); /* Soll weiter gearbeitet werden ? */ unsigned char ask_verbose (); /* Soll verbose gearbeitet werden ? */ /************************************************************************* Statische Arrays *************************************************************************/ static double picture_rates [9] = { 0., 24000./1001., 24., 25., 30000./1001., 30., 50., 60000./1001., 60. }; static double ratio [16] = { 0., 1., 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, 0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, 1.2015, 0.}; static unsigned int bitrate_index [3][16] = {{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0}, {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0}, {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}}; static double frequency [4] = {44.1, 48, 32, 0}; static unsigned int slots [4] = {12, 144, 0, 0}; static unsigned int samples [4] = {384, 1152, 0, 0}; static char mode [4][15] = { "stereo", "joint stereo", "dual channel", "single channel" }; static char copyright [2][20] = { "no copyright","copyright protected" }; static char original [2][10] = { "copy","original" }; static char emphasis [4][20] = { "none", "50/15 microseconds", "reserved", "CCITT J.17" };