1 /*************************************************************************
2 *  MPEG SYSTEMS MULTIPLEXER                                              *
3 *  Erzeugen einer MPEG/SYSTEMS                           		 *
4 *  MULTIPLEXED VIDEO/AUDIO DATEI					 *
5 *  aus zwei MPEG Basis Streams						 *
6 *  Christoph Moar							 *
7 *  SIEMENS ZFE ST SN 11 / T SN 6					 *
8 *  (C) 1994 1995    							 *
9 **************************************************************************
10 *  Generating a MPEG/SYSTEMS						 *
11 *  MULTIPLEXED VIDEO/AUDIO STREAM					 *
12 *  from two MPEG source streams						 *
13 *  Christoph Moar							 *
14 *  SIEMENS CORPORATE RESEARCH AND DEVELOPMENT ST SN 11 / T SN 6		 *
15 *  (C) 1994 1995							 *
16 **************************************************************************
17 *  Einschraenkungen vorhanden. Unterstuetzt nicht gesamten MPEG/SYSTEMS  *
18 *  Standard. Haelt sich i.d.R. an den CSPF-Werten, zusaetzlich (noch)    *
19 *  nur fuer ein Audio- und/oder ein Video- Stream. Evtl. erweiterbar.    *
20 **************************************************************************
21 *  Restrictions apply. Will not support the whole MPEG/SYSTEM Standard.  *
22 *  Basically, will generate Constrained System Parameter Files.		 *
23 *  Mixes only one audio and/or one video stream. Might be expanded.	 *
24 *************************************************************************/
25 
26 /*************************************************************************
27 *  mplex - MPEG/SYSTEMS multiplexer					 *
28 *  Copyright (C) 1994 1995 Christoph Moar				 *
29 *  Siemens ZFE ST SN 11 / T SN 6					 *
30 *									 *
31 *  moar@informatik.tu-muenchen.de 					 *
32 *       (Christoph Moar)			 			 *
33 *									 *
34 *  This program is free software; you can redistribute it and/or modify	 *
35 *  it under the terms of the GNU General Public License as published by	 *
36 *  the Free Software Foundation; either version 2 of the License, or	 *
37 *  (at your option) any later version.					 *
38 *									 *
39 *  This program is distributed in the hope that it will be useful,	 *
40 *  but WITHOUT ANY WARRANTY; without even the implied warranty of	 *
41 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	 *
42 *  GNU General Public License for more details.				 *
43 *									 *
44 *  You should have received a copy of the GNU General Public License	 *
45 *  along with this program; if not, write to the Free Software		 *
46 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		 *
47 *************************************************************************/
48 
49 #include <unistd.h>
50 
51 /*************************************************************************
52     Definitionen
53 *************************************************************************/
54 
55 #define USER_DATA_START         0x000001b2
56 #define SEQUENCE_HEADER 	0x000001b3
57 #define SEQUENCE_END		0x000001b7
58 #define PICTURE_START		0x00000100
59 #define GROUP_START		0x000001b8
60 #define SYNCWORD_START		0x000001
61 #define IFRAME                  1
62 #define PFRAME                  2
63 #define BFRAME                  3
64 #define DFRAME                  4
65 
66 #define SEQHDR_FLAG             1
67 #define GOPHDR_FLAG             2
68 
69 #define AUDIO_SYNCWORD		0xfff
70 #define AC3_SYNCWORD            0x0b77
71 
72 #define PACK_START		0x000001ba
73 #define SYS_HEADER_START	0x000001bb
74 #define PROGRAM_END		0x000001b9
75 #define PACKET_START		0x000001
76 
77 #define MAX_FFFFFFFF		4294967295.0 	/* = 0xffffffff in hex.	*/
78 #define MSB_TIMECODE            4294967296.0    /* = 0x100000000 in hex */
79 
80 #define CLOCKS			27000000.0	/* System Clock Hertz	*/
81 
82 #define MPEG2_AFTER_PACKET_LENGTH    16         /* No of non-data-bytes	*/
83 #define MPEG1_AFTER_PACKET_LENGTH    12         /* following the packet	*/
84 						/* length field		*/
85 #define MPEG2_LAST_SCR_BYTE_IN_PACK  10		/* No of bytes in pack	*/
86 #define MPEG1_LAST_SCR_BYTE_IN_PACK   9         /* preceding, and 	*/
87 						/* including, the SCR	*/
88 
89 /* The following values for sys_header_length & size are only valid for */
90 /* System streams consisting of three basic streams. When wrapping around */
91 /* the system layer on a single video or a single audio stream, those   */
92 /* values get decreased by 3 or 6.                                           */
93 
94 #define SYS_HEADER_LENGTH	15		/* length of Sys Header	*/
95 						/* after start code and	*/
96 						/* length field		*/
97 
98 #define SYS_HEADER_SIZE		21		/* incl. start code and	*/
99 						/* length field		*/
100 #define MPEG2_PACK_HEADER_SIZE	14
101 #define MPEG1_PACK_HEADER_SIZE  12
102 
103 #define PACKET_HEADER_SIZE	6
104 
105 #define MPEG2_MIN_PACKET_SIZE   255 + PACKET_HEADER_SIZE + MPEG2_AFTER_PACKET_LENGTH
106 #define MPEG1_MIN_PACKET_SIZE   255 + PACKET_HEADER_SIZE + MPEG1_AFTER_PACKET_LENGTH
107 
108 #define VIDEOCD_SECTOR_SIZE	2324	        /* VideoCD sector size */
109 #define SVCD_SECTOR_SIZE        2324            /* Super VideoCD sector size */
110 #define DVD_SECTOR_SIZE         2048            /* DVD sector size     */
111 #define MAX_SECTOR_SIZE         4096
112 
113 #define MPEG2_MIN_SECTOR_SIZE	MPEG2_MIN_PACKET_SIZE + MPEG2_PACK_HEADER_SIZE + SYS_HEADER_SIZE
114 #define MPEG1_MIN_SECTOR_SIZE	MPEG1_MIN_PACKET_SIZE + MPEG1_PACK_HEADER_SIZE + SYS_HEADER_SIZE
115 
116 #define STREAMS_VIDEO           1
117 #define STREAMS_AUDIO           2
118 #define STREAMS_AUDIO1          4
119 #define STREAMS_AUDIO2          8
120 #define STREAMS_AUDIO3          16
121 #define STREAMS_AUDIO4          32
122 #define STREAMS_AUDIO5          64
123 #define STREAMS_AUDIO6          128
124 #define STREAMS_AUDIO7          256
125 
126 #define AUDIO_STREAMS			0xb8		/* Marker Audio Streams	*/
127 #define VIDEO_STREAMS			0xb9		/* Marker Video Streams	*/
128 #define AUDIO_STR_0				0xc0		/* Marker Audio Stream0	*/
129 #define AUDIO_STR_1             0xc1            /* Marker Audio Stream1 */
130 #define AUDIO_STR_2             0xc2            /* Marker Audio Stream2 */
131 #define AUDIO_STR_3             0xc3            /* Marker Audio Stream3 */
132 #define AUDIO_STR_4             0xc4            /* Marker Audio Stream4 */
133 #define AUDIO_STR_5             0xc5            /* Marker Audio Stream5 */
134 #define AUDIO_STR_6             0xc6            /* Marker Audio Stream6 */
135 #define AUDIO_STR_7             0xc7            /* Marker Audio Stream7 */
136 
137 #define VIDEO_STR_0				0xe0		/* Marker Video Stream0	*/
138 #define PADDING_STR				0xbe		/* Marker Padding Stream*/
139 #define PRIVATE_STREAM1         0xbd            /* private stream 1 */
140 #define PRIVATE_STREAM2         0xbf            /* private stream 2 */
141 #define AC3_STREAM1             0x80            /* AC3 substream id 1 */
142 #define AC3_STREAM2             0x81            /* AC3 substream id 2 */
143 #define AC3_STREAM3             0x82            /* AC3 substream id 3 */
144 #define AC3_STREAM4             0x83            /* AC3 substream id 4 */
145 #define AC3_STREAM5             0x84            /* AC3 substream id 5 */
146 #define AC3_STREAM6             0x85            /* AC3 substream id 6 */
147 #define AC3_STREAM7             0x86            /* AC3 substream id 7 */
148 #define AC3_STREAM8             0x87            /* AC3 substream id 8 */
149 
150 #define ZERO_STUFFING_BYTE		  0
151 #define STUFFING_BYTE	          0xff
152 #define RESERVED_BYTE			  0xff
153 #define TIMESTAMPS_NO			  0		/* Flag NO timestamps	*/
154 #define MPEG2_TIMESTAMPS_PTS	  2		/* MPEG2 Flag PTS timestamp */
155 #define MPEG1_TIMESTAMPS_PTS      1             /* MPEG1 Flag PTS timestamp */
156 #define MPEG2_TIMESTAMPS_PTS_DTS  3		/* MPEG2 Flag BOTH timestamps */
157 #define MPEG1_TIMESTAMPS_PTS_DTS  2             /* MPEG1 Flag BOTH timestamps */
158 
159 #define MPEG2_MARKER_SCR	1		/* MPEG2 Marker SCR	*/
160 #define MPEG1_MARKER_SCR	2		/* MPEG1 Marker SCR	*/
161 #define MARKER_JUST_PTS		2		/* Marker only PTS	*/
162 #define MARKER_PTS		3		/* Marker PTS		*/
163 #define MPEG2_MARKER_DTS	4		/* MPEG2 Marker DTS	*/
164 #define MPEG1_MARKER_DTS	1		/* MPEG1 Marker DTS	*/
165 #define MARKER_NO_TIMESTAMPS	0x0f		/* Marker NO timestamps	*/
166 
167 #define STATUS_AUDIO_END	0		/* Statusmessage A end	*/
168 #define STATUS_VIDEO_END	1		/* Statusmessage V end	*/
169 #define STATUS_AUDIO_TIME_OUT	2		/* Statusmessage A out	*/
170 #define STATUS_VIDEO_TIME_OUT	3		/* Statusmessage V out	*/
171 #define STATUS_AUDIO1_END       4
172 #define STATUS_AUDIO2_END       5
173 #define STATUS_AUDIO3_END       6
174 #define STATUS_AUDIO4_END       7
175 #define STATUS_AUDIO5_END       8
176 #define STATUS_AUDIO6_END       9
177 #define STATUS_AUDIO7_END       10
178 
179 #define STATUS_AUDIO1_TIME_OUT  11
180 #define STATUS_AUDIO2_TIME_OUT  12
181 #define STATUS_AUDIO3_TIME_OUT  13
182 #define STATUS_AUDIO4_TIME_OUT  14
183 #define STATUS_AUDIO5_TIME_OUT  15
184 #define STATUS_AUDIO6_TIME_OUT  16
185 #define STATUS_AUDIO7_TIME_OUT  17
186 
187 /*************************************************************************
188     Typ- und Strukturdefinitionen
189 *************************************************************************/
190 
191 typedef struct timecode_struc	/* Time_code Struktur laut MPEG		*/
192 {   unsigned long msb;		/* fuer SCR, DTS, PTS			*/
193     unsigned long lsb;
194     unsigned long reference_ext;
195     unsigned long negative;     /* for delays when doing multiple files */
196 } Timecode_struc;
197 
198 typedef struct vaunit_struc	/* Informationen ueber Video AU's 	*/
199 {   unsigned int length;
200     unsigned short int type;
201     unsigned short int flags;
202     unsigned short int svcd_offset;
203     unsigned short int pict_hdr_offset;
204     unsigned int first_frame_offset;
205     Timecode_struc DTS;
206     Timecode_struc PTS;
207 } Vaunit_struc;
208 
209 typedef struct aaunit_struc	/* Informationen ueber Audio AU's 	*/
210 {   unsigned long length;
211     Timecode_struc PTS;
212 } Aaunit_struc;
213 
214 typedef struct video_struc	/* Informationen ueber Video Stream	*/
215 {   unsigned int stream_length;
216     unsigned int num_sequence;
217     unsigned int num_seq_end;
218     unsigned int num_pictures;
219     unsigned int num_groups;
220     unsigned int num_frames[4];
221     unsigned int avg_frames[4];
222 
223     unsigned int horizontal_size;
224     unsigned int vertical_size;
225     unsigned int aspect_ratio;
226     unsigned int picture_rate;
227     unsigned int bit_rate;
228     unsigned int comp_avg_bit_rate;
229     unsigned int comp_max_bit_rate;
230     unsigned int vbv_buffer_size;
231     unsigned int CSPF;
232     unsigned int pulldown;
233     unsigned int sh_length;
234     unsigned char seq_hdr[256];
235     struct timecode_struc last_PTS;
236 } Video_struc;
237 
238 typedef struct audio_struc	/* Informationen ueber Audio Stream	*/
239 {   unsigned int stream_length  ;
240     unsigned int num_syncword	;
241     unsigned int num_frames [2]	;
242     unsigned int size_frames[2] ;
243     unsigned int layer		;
244     unsigned int protection	;
245     unsigned int bit_rate	;
246     unsigned int frequency	;
247     unsigned int mode		;
248     unsigned int mode_extension ;
249     unsigned int copyright      ;
250     unsigned int original_copy  ;
251     unsigned int emphasis	;
252 } Audio_struc;
253 
254 typedef struct sector_struc	/* Ein Sektor, kann Pack, Sys Header	*/
255 				/* und Packet enthalten.		*/
256 {   unsigned char  buf [MAX_SECTOR_SIZE] ;
257     unsigned int   length_of_sector  ;
258     unsigned int   length_of_packet_data ;
259     Timecode_struc TS                ;
260 } Sector_struc;
261 
262 typedef struct pack_struc	/* Pack Info				*/
263 {   unsigned char  buf [MPEG2_PACK_HEADER_SIZE];
264     Timecode_struc SCR;
265 } Pack_struc;
266 
267 typedef struct sys_header_struc	/* System Header Info			*/
268 {   unsigned char  buf [SYS_HEADER_SIZE];
269 } Sys_header_struc;
270 
271 typedef struct buffer_queue	/* FIFO-Queue fuer STD Buffer		*/
272 {   unsigned int size	;	/* als verkettete Liste implementiert	*/
273     Timecode_struc DTS	;
274     struct buffer_queue *next	;
275 } Buffer_queue;
276 
277 
278 typedef struct buffer_struc	/* Simuliert STD Decoder Buffer		*/
279 {   unsigned int max_size;	/* enthaelt Anker auf verkettete Liste	*/
280     Buffer_queue *first;
281 } Buffer_struc;
282 
283 
284 /*************************************************************************
285     Funktionsprototypen, keine Argumente, K&R Style
286 *************************************************************************/
287 
288 int domplex(int mplex_video, int mplex_audio);
289 
290 				/* Ueberpruefen der Argumente		*/
291 int check_files          (	/* Kontrolliert ob Files vorhanden und	*/
292    off_t *audio_bytes,
293    off_t *audio1_bytes,
294    off_t *audio2_bytes,
295    off_t *audio3_bytes,
296    off_t *audio4_bytes,
297    off_t *audio5_bytes,
298    off_t *audio6_bytes,
299    off_t *audio7_bytes,
300    off_t *video_bytes,
301    unsigned int which_streams);
302 
303 				/* weist sie Audio/Video Pointern zu	*/
304 int  open_file            (	/* File vorhanden?			*/
305    char *name,
306    off_t *bytes);
307 
308 int get_info_video       (	/* Info Access Units Video Stream	*/
309    char *video_file,
310    char *video_units,
311    Video_struc *video_info,
312    double *startup_delay,
313    off_t *video_total,
314    off_t length);
315 
316 void output_info_video    (	/* Ausgabe Information Access Units	*/
317    Video_struc *video_info);
318 
319 int get_info_audio       (	/* Info Access Units Audio Stream	*/
320    char *audio_file,
321    char *audio_units,
322    Audio_struc *audio_info,
323    double *startup_delay,
324    unsigned int *audio_total,
325    unsigned int length);
326 
327 void output_info_audio    (	/* Ausgabe Information Access Units	*/
328    Audio_struc *audio_info);
329 
330 int marker_bit           (	/* Checks for marker bit		*/
331    bitstream *bs, unsigned int what);
332 
333 void empty_video_struc    (	/* Initialisiert Struktur fuer SUN cc	*/
334    Video_struc *pointer);
335 
336 void empty_audio_struc    (	/* Initialisiert Struktur fuer SUN cc	*/
337    Audio_struc *pointer);
338 
339 void empty_vaunit_struc   (	/* Initialisiert Struktur fuer SUN cc	*/
340    Vaunit_struc *pointer);
341 
342 void empty_aaunit_struc   (	/* Initialisiert Struktur fuer SUN cc	*/
343    Aaunit_struc *pointer);
344 
345 void empty_sector_struc   (	/* Initialisiert Struktur fuer SUN cc	*/
346    Sector_struc *pointer);
347 
348 void empty_timecode_struc (	/* Initialisiert Struktur fuer SUN cc	*/
349    Timecode_struc *timecode);
350 
351 void init_buffer_struc    (	/* Initialisiert Struktur fuer SUN cc	*/
352    Buffer_struc *pointer,
353    unsigned int size);
354 
355 void copy_timecode        (	/* setzt 2tes TimeC. dem 1ten gleich	*/
356    Timecode_struc *time_original, Timecode_struc *time_copy);
357 
358 void make_timecode        (	/* rechnet aus double einen TimeC.	*/
359    double timestamp,
360    Timecode_struc *pointer);
361 
362 double get_timecode        (	/* rechnet aus double einen TimeC.	*/
363    Timecode_struc *pointer);
364 
365 				/* und schreibt ihn in Timecode_struc   */
366 void add_to_timecode      (	/* addiert 1tes TimeC. zum 2ten		*/
367    Timecode_struc *add,
368    Timecode_struc *to);
369 
370 void buffer_timecode      (	/* schreibt Timecode in Bitstreamformat */
371    Timecode_struc *pointer,
372    unsigned char  marker,
373    unsigned char **buffer);
374 
375 int  comp_timecode        (	/* 1tes TimeC. <= 2tes TimeC. ?		*/
376    Timecode_struc *TS1,
377    Timecode_struc *TS2);
378 
379 int create_sector	  (  /* erstellt einen Sector		*/
380   Sector_struc 	 *sector,
381   Pack_struc	 *pack,
382   Sys_header_struc *sys_header,
383   unsigned int 	 packet_size,
384   unsigned int   partial_packet_size, /* used for svcd multiplexing */
385   FILE		 *inputstream,
386   unsigned char 	 type,
387   unsigned char          subtype,
388   unsigned char 	 buffer_scale,
389   unsigned int 	 buffer_size,
390   unsigned char 	 buffers,
391   Timecode_struc   *PTS,
392   Timecode_struc   *DTS,
393   unsigned char 	 timestamps,
394   unsigned int     which_streams,
395   unsigned int     sector_pad,
396   unsigned int     svcd_offset,
397   unsigned int     write_broken_link,
398   unsigned int     write_seq_end,
399   unsigned int     write_seq_hdr,
400   unsigned int     sh_length,
401 //  unsigned char    *seq_hdr); // fix by Andrew Church for original tcmplex, taken over here
402   unsigned char    *seq_hdr,
403   unsigned int     nsyncwords,
404   unsigned int     firstsync);
405 
406 
407 void create_sys_header	  (	/* erstellt einen System Header		*/
408    Sys_header_struc *sys_header,
409    unsigned int	 rate_bound,
410    unsigned char	 audio_bound,
411    unsigned char	 fixed,
412    unsigned char	 CSPS,
413    unsigned char	 audio_lock,
414    unsigned char	 video_lock,
415    unsigned char	 video_bound,
416 
417    unsigned char 	 stream1,
418    unsigned char 	 buffer1_scale,
419    unsigned int 	 buffer1_size,
420 
421    unsigned char 	 stream2,
422    unsigned char 	 buffer2_scale,
423    unsigned int 	 buffer2_size,
424 
425    unsigned char 	 stream3,
426    unsigned char 	 buffer3_scale,
427    unsigned int 	 buffer3_size,
428 
429    unsigned char 	 stream4,
430    unsigned char 	 buffer4_scale,
431    unsigned int 	 buffer4_size,
432 
433    unsigned char 	 stream5,
434    unsigned char 	 buffer5_scale,
435    unsigned int 	 buffer5_size,
436 
437    unsigned char 	 stream6,
438    unsigned char 	 buffer6_scale,
439    unsigned int 	 buffer6_size,
440 
441    unsigned char 	 stream7,
442    unsigned char 	 buffer7_scale,
443    unsigned int 	 buffer7_size,
444 
445    unsigned char 	 stream8,
446    unsigned char 	 buffer8_scale,
447    unsigned int 	 buffer8_size,
448 
449    unsigned char 	 stream9,
450    unsigned char 	 buffer9_scale,
451    unsigned int 	 buffer9_size,
452 
453    unsigned int     which_streams);
454 
455 void create_pack	  (	/* erstellt einen Pack Header		*/
456   Pack_struc	 *pack,
457   Timecode_struc   *SCR,
458   unsigned int 	 mux_rate);
459 
460 
461 int output_video         (	/* erstellt und schreibt Video pack aus	*/
462    Timecode_struc *SCR,
463    Timecode_struc *SCR_delay,
464    FILE *vunits_info,
465    FILE *istream_v,
466    Pack_struc *pack,
467    Sys_header_struc *sys_header,
468    Buffer_struc *buffer,
469    Vaunit_struc *video_au,
470    unsigned char *picture_start,
471    unsigned int mux_rate,
472    unsigned long packet_data_size,
473    unsigned char marker_pack,
474    unsigned int which_streams,
475    unsigned int sh_length,
476    unsigned char *seq_hdr);
477 
478 int output_audio         (   /* erstellt und schreibt Audio pack aus */
479    Timecode_struc *SCR,
480    Timecode_struc *SCR_delay,
481    FILE *aunits_info,
482    FILE *istream_a,
483    Pack_struc *pack,
484    Sys_header_struc *sys_header,
485    Buffer_struc *buffer,
486    Aaunit_struc *audio_au,
487    unsigned char *audio_frame_start,
488    unsigned int *audio_counter,
489    unsigned int *audio_underflows,
490    unsigned char audio_PSTD,
491    unsigned char aid,
492    unsigned char audio_subid,
493    unsigned char abuffer_scale,
494    unsigned int abuffer_size,
495    unsigned int mux_rate,
496    unsigned long packet_data_size,
497    unsigned char marker_pack,
498    unsigned int which_streams,
499    char *audio_start_new_file);
500 
501 int output_padding       (	/* erstellt und schreibt Padding pack	*/
502    Timecode_struc *SCR,
503    Pack_struc *pack,
504    Sys_header_struc *sys_header,
505    unsigned int mux_rate,
506    unsigned long packet_data_size,
507    unsigned char marker_pack,
508    unsigned int which_streams);
509 
510 int output_private2       (	/* erstellt und schreibt Private 2 pack	*/
511    Timecode_struc *SCR,
512    unsigned int mux_rate);
513 
514 int next_audio_access_unit (	/* holt naechste gueltige AU Info her	*/
515    Buffer_struc *buffer,
516    Aaunit_struc *audio_au,
517    unsigned int *bytes_left,
518    FILE *aunits_info,
519    unsigned char *audio_frame_start,
520    unsigned int *audio_counter,
521    Timecode_struc *SCR_delay);
522 
523 void buffer_empty(Buffer_struc *buffer);
524 
525 void buffer_clean	  (	/* saeubert die Bufferschlange 		*/
526    Buffer_struc  *buffer,
527    Timecode_struc *SCR);
528 
529 int  buffer_space         (	/* Anzahl freier Bytes in Buffer	*/
530    Buffer_struc *buffer);
531 
532 int queue_buffer         (	/* An Bufferliste anhaengen		*/
533    Buffer_struc *buffer,
534    unsigned int bytes,
535    Timecode_struc *TS);
536 
537 int outputstream         (	/* Hauptschleife Multiplexroutinen	*/
538    FILE         *outputFile,
539    char 	*video_units,
540    Video_struc 	*video_info,
541    char 	*audio_units,
542    Audio_struc 	*audio_info,
543 
544    char 	*audio1_units,
545    Audio_struc 	*audio1_info,
546    char 	*audio2_units,
547    Audio_struc 	*audio2_info,
548    char 	*audio3_units,
549    Audio_struc 	*audio3_info,
550    char 	*audio4_units,
551    Audio_struc 	*audio4_info,
552    char 	*audio5_units,
553    Audio_struc 	*audio5_info,
554    char 	*audio6_units,
555    Audio_struc 	*audio6_info,
556    char 	*audio7_units,
557    Audio_struc 	*audio7_info,
558 
559 
560    unsigned int video_total,
561    unsigned int audio_total,
562 
563    unsigned int audio1_total,
564    unsigned int audio2_total,
565    unsigned int audio3_total,
566    unsigned int audio4_total,
567    unsigned int audio5_total,
568    unsigned int audio6_total,
569    unsigned int audio7_total,
570 
571    unsigned int which_streams);
572 
573 void status_info          (	/* Statusmitteilung bei Erstellen	*/
574    unsigned int nsectors_a,
575    unsigned int nsectors_a1,
576    unsigned int nsectors_a2,
577    unsigned int nsectors_a3,
578    unsigned int nsectors_a4,
579    unsigned int nsectors_a5,
580    unsigned int nsectors_a6,
581    unsigned int nsectors_a8,
582    unsigned int nsectors_v,
583    unsigned int nsectors_p,
584    double nbytes,
585    unsigned int buf_v,
586    unsigned int buf_a,
587    unsigned int buf_a1,
588    unsigned int buf_a2,
589    unsigned int buf_a3,
590    unsigned int buf_a4,
591    unsigned int buf_a5,
592    unsigned int buf_a6,
593    unsigned int buf_a7);
594 
595 				/* MPEG multiplex stream		*/
596 void status_header	  (char *filename);	/* Titelzeilen Statusblock		*/
597 void status_message	  (unsigned char what);	/* Event (end, time_out) mitteilen	*/
598 void status_footer	  ();	/* Endzeile				*/
599 
600 
601 
602