1 #ifndef MPEG3DEMUX_H 2 #define MPEG3DEMUX_H 3 4 #include "mpeg3title.h" 5 #include <stdio.h> 6 7 typedef struct 8 { 9 void* file; 10 /* Data consisting of the multiplexed packet */ 11 unsigned char *raw_data; 12 long raw_offset; 13 int raw_size; 14 long packet_size; 15 /* Only one is on depending on which track owns the demultiplexer. */ 16 int do_audio; 17 int do_video; 18 /* Data consisting of the elementary stream */ 19 unsigned char *data_buffer; 20 long data_size; 21 long data_position; 22 long data_allocated; 23 /* Remember when the file descriptor is at the beginning of the packet just read. */ 24 int reverse; 25 /* Set to 1 when eof or attempt to read before beginning */ 26 int error_flag; 27 /* Temp variables for returning */ 28 unsigned char next_char; 29 /* Correction factor for time discontinuity */ 30 double time_offset; 31 int generating_timecode; 32 33 /* Titles */ 34 mpeg3_title_t *titles[MPEG3_MAX_STREAMS]; 35 int total_titles; 36 int current_title; 37 38 /* Tables of every stream ID encountered */ 39 int astream_table[MPEG3_MAX_STREAMS]; /* macro of audio format if audio */ 40 int vstream_table[MPEG3_MAX_STREAMS]; /* 1 if video */ 41 42 /* Programs */ 43 int total_programs; 44 int current_program; 45 46 /* Timecode in the current title */ 47 int current_timecode; 48 49 /* Byte position in the current title */ 50 long current_byte; 51 52 int transport_error_indicator; 53 int payload_unit_start_indicator; 54 int pid; 55 int transport_scrambling_control; 56 int adaptation_field_control; 57 int continuity_counter; 58 int is_padding; 59 int pid_table[MPEG3_PIDMAX]; 60 int continuity_counters[MPEG3_PIDMAX]; 61 int total_pids; 62 int adaptation_fields; 63 double time; /* Time in seconds */ 64 int audio_pid; 65 int video_pid; 66 int astream; /* Video stream ID being decoded. -1 = select first ID in stream */ 67 int vstream; /* Audio stream ID being decoded. -1 = select first ID in stream */ 68 int aformat; /* format of the audio derived from multiplexing codes */ 69 long program_association_tables; 70 int table_id; 71 int section_length; 72 int transport_stream_id; 73 long pes_packets; 74 double pes_audio_time; /* Presentation Time stamps */ 75 double pes_video_time; /* Presentation Time stamps */ 76 } mpeg3_demuxer_t; 77 78 /* ========================================================================= */ 79 /* Entry points */ 80 /* ========================================================================= */ 81 82 #define mpeg3demux_error(demuxer) (((mpeg3_demuxer_t *)(demuxer))->error_flag) 83 84 #define mpeg3demux_time_offset(demuxer) (((mpeg3_demuxer_t *)(demuxer))->time_offset) 85 86 #define mpeg3demux_current_time(demuxer) (((mpeg3_demuxer_t *)(demuxer))->time + ((mpeg3_demuxer_t *)(demuxer))->time_offset) 87 88 #define mpeg3demux_read_char(demuxer) \ 89 ((((mpeg3_demuxer_t *)(demuxer))->data_position < ((mpeg3_demuxer_t *)(demuxer))->data_size) ? \ 90 ((mpeg3_demuxer_t *)(demuxer))->data_buffer[((mpeg3_demuxer_t *)(demuxer))->data_position++] : \ 91 mpeg3demux_read_char_packet(demuxer)) 92 93 #define mpeg3demux_read_prev_char(demuxer) \ 94 ((((mpeg3_demuxer_t *)(demuxer))->data_position != 0) ? \ 95 ((mpeg3_demuxer_t *)(demuxer))->data_buffer[((mpeg3_demuxer_t *)(demuxer))->data_position--] : \ 96 mpeg3demux_read_prev_char_packet(demuxer)) 97 98 99 #endif 100