Mercurial > mplayer.hg
annotate demuxer.h @ 1479:fc0fece9e83d
*** empty log message ***
author | gabucino |
---|---|
date | Fri, 10 Aug 2001 16:21:46 +0000 |
parents | a90d889eb649 |
children | b895f95e7657 |
rev | line source |
---|---|
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
979
diff
changeset
|
1 |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
979
diff
changeset
|
2 #include "config.h" |
589 | 3 |
647 | 4 #define MAX_PACKS 4096 |
5 #define MAX_PACK_BYTES 0x800000 | |
589 | 6 |
7 #define DEMUXER_TYPE_UNKNOWN 0 | |
8 #define DEMUXER_TYPE_MPEG_ES 1 | |
9 #define DEMUXER_TYPE_MPEG_PS 2 | |
10 #define DEMUXER_TYPE_AVI 3 | |
11 #define DEMUXER_TYPE_AVI_NI 4 | |
12 #define DEMUXER_TYPE_AVI_NINI 5 | |
13 #define DEMUXER_TYPE_ASF 6 | |
14 | |
15 #define DEMUXER_TIME_NONE 0 | |
16 #define DEMUXER_TIME_PTS 1 | |
17 #define DEMUXER_TIME_FILE 2 | |
18 #define DEMUXER_TIME_BPS 3 | |
19 | |
20 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
21 // Holds one packet/frame/whatever |
589 | 22 typedef struct demux_packet_st { |
23 int len; | |
24 float pts; | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
25 off_t pos; // pozicio indexben (AVI) ill. fileban (MPG) |
589 | 26 unsigned char* buffer; |
979 | 27 int flags; // keyframe, etc |
589 | 28 struct demux_packet_st* next; |
29 } demux_packet_t; | |
30 | |
31 typedef struct { | |
32 int buffer_pos; // current buffer position | |
33 int buffer_size; // current buffer size | |
34 unsigned char* buffer; // current buffer | |
35 float pts; // current buffer's pts | |
746 | 36 int pts_bytes; // number of bytes read after last pts stamp |
589 | 37 int eof; // end of demuxed stream? (true if all buffer empty) |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
38 off_t pos; // position in the input stream (file) |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
39 off_t dpos; // position in the demuxed stream |
889 | 40 int pack_no; // serial number of packet |
979 | 41 int flags; // flags of current packet (keyframe etc) |
589 | 42 //--------------- |
43 int packs; // number of packets in buffer | |
44 int bytes; // total bytes of packets in buffer | |
45 demux_packet_t *first; // read to current buffer from here | |
46 demux_packet_t *last; // append new packets from input stream to here | |
47 int id; // stream ID (for multiple audio/video streams) | |
48 struct demuxer_st *demuxer; // parent demuxer structure (stream handler) | |
49 // ---- asf ----- | |
50 demux_packet_t *asf_packet; // read asf fragments here | |
51 int asf_seq; | |
52 // ---- stream header ---- | |
53 void* sh; | |
54 } demux_stream_t; | |
55 | |
56 typedef struct demuxer_st { | |
57 stream_t *stream; | |
58 int synced; // stream synced (used by mpeg) | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
59 off_t filepos; // input stream current pos. |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
60 int type; // demuxer type: mpeg PS, mpeg ES, avi, avi-ni, avi-nini, asf |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
61 int file_format; // file format: mpeg/avi/asf |
589 | 62 // int time_src;// time source (pts/file/bps) |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
63 off_t movi_start; |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
64 off_t movi_end; |
589 | 65 // |
66 demux_stream_t *audio; | |
67 demux_stream_t *video; | |
68 demux_stream_t *sub; | |
69 | |
70 // index: | |
71 // AVIINDEXENTRY* idx; | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
72 // FIXME: off_t??? |
589 | 73 void* idx; |
74 int idx_size; | |
75 int idx_pos; | |
76 int idx_pos_a; | |
77 int idx_pos_v; | |
78 int idx_offset; // ennyit kell hozzaadni az index offset ertekekhez | |
79 | |
80 // stream headers: | |
81 // sh_audio_t* a_streams[256]; | |
82 // sh_video_t* v_streams[256]; | |
83 void* a_streams[256]; | |
84 void* v_streams[256]; | |
85 char s_streams[32]; // dvd subtitles | |
86 } demuxer_t; | |
87 | |
88 inline static demux_packet_t* new_demux_packet(int len){ | |
89 demux_packet_t* dp=malloc(sizeof(demux_packet_t)); | |
90 dp->len=len; | |
91 dp->buffer=malloc(len); | |
92 dp->next=NULL; | |
93 dp->pts=0; | |
94 dp->pos=0; | |
979 | 95 dp->flags=0; |
589 | 96 return dp; |
97 } | |
98 | |
99 inline static void free_demux_packet(demux_packet_t* dp){ | |
100 free(dp->buffer); | |
101 free(dp); | |
102 } | |
103 | |
104 demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id); | |
105 demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id); | |
106 | |
107 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp); | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
108 void ds_read_packet(demux_stream_t *ds,stream_t *stream,int len,float pts,off_t pos,int flags); |
589 | 109 |
110 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds); | |
111 int ds_fill_buffer(demux_stream_t *ds); | |
112 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1375
diff
changeset
|
113 inline static off_t ds_tell(demux_stream_t *ds){ |
589 | 114 return (ds->dpos-ds->buffer_size)+ds->buffer_pos; |
115 } | |
116 | |
746 | 117 inline static int ds_tell_pts(demux_stream_t *ds){ |
118 return (ds->pts_bytes-ds->buffer_size)+ds->buffer_pos; | |
119 } | |
120 | |
589 | 121 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len); |
746 | 122 int demux_read_data_pack(demux_stream_t *ds,unsigned char* mem,int len); |
589 | 123 |
124 #if 1 | |
125 #define demux_getc(ds) (\ | |
126 (ds->buffer_pos<ds->buffer_size) ? ds->buffer[ds->buffer_pos++] \ | |
127 :((!ds_fill_buffer(ds))? (-1) : ds->buffer[ds->buffer_pos++] ) ) | |
128 #else | |
129 inline static int demux_getc(demux_stream_t *ds){ | |
130 if(ds->buffer_pos>=ds->buffer_size){ | |
131 if(!ds_fill_buffer(ds)){ | |
132 // printf("DEMUX_GETC: EOF reached!\n"); | |
133 return -1; // EOF | |
134 } | |
135 } | |
136 // printf("[%02X]",ds->buffer[ds->buffer_pos]); | |
137 return ds->buffer[ds->buffer_pos++]; | |
138 } | |
139 #endif | |
140 | |
141 void ds_free_packs(demux_stream_t *ds); | |
142 int ds_get_packet(demux_stream_t *ds,unsigned char **start); | |
143 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start); | |
144 | |
145 | |
146 static inline int avi_stream_id(unsigned int id){ | |
147 unsigned char *p=(unsigned char *)&id; | |
148 unsigned char a,b; | |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
979
diff
changeset
|
149 #if WORDS_BIGENDIAN |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
979
diff
changeset
|
150 a=p[3]-'0'; b=p[2]-'0'; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
979
diff
changeset
|
151 #else |
589 | 152 a=p[0]-'0'; b=p[1]-'0'; |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
979
diff
changeset
|
153 #endif |
589 | 154 if(a>9 || b>9) return 100; // invalid ID |
155 return a*10+b; | |
156 } | |
157 | |
158 | |
159 |