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