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