Mercurial > mplayer.hg
annotate libmpdemux/demux_asf.c @ 16429:84174804804b
Updates to NUT spec:
1. remove average_bitrate
2. add other_stream_header, for subtitles and metadata
3. add max_pts to index
4. index_ptr - a 64 bit integer to say the total length of all index packets
5. specify how to write "multiple" indexes
6. change forward_ptr behavior, starts right after forward_ptr, ends after
checksum
7. remove stream_id <-> stream_class limitation.
8. time_base_nom must also be non zero.
9. rename time_base_nom and time_base_denom, now timebase means the length
of a tick, not amounts of ticks
10. remove (old?) sample_rate_mul stuff.
11. specify what exactly the checksum covers.
12. specify that stream classes which have multiple streams must have an
info packet.. (in new Semantic requirements section)
13. Rename 'timestamp' to pts.
14. Change date of draft...
15. Add myself to authors...
author | ods15 |
---|---|
date | Fri, 09 Sep 2005 10:26:21 +0000 |
parents | 6ff303d2876b |
children | 9081ae3a702c |
rev | line source |
---|---|
1 | 1 // ASF file parser for DEMUXER v0.3 by A'rpi/ESP-team |
2 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
3 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
4 #include <stdlib.h> |
1430 | 5 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
6 |
1567 | 7 #include "config.h" |
8 #include "mp_msg.h" | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1628
diff
changeset
|
9 #include "help_mp.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
10 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
11 #include "stream.h" |
1342 | 12 #include "asf.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
13 #include "demuxer.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
14 |
15553
43af13780751
Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents:
14502
diff
changeset
|
15 #include "../libvo/fastmemcpy.h" |
833 | 16 |
1342 | 17 /* |
18 * Load 16/32-bit values in little endian byte order | |
19 * from an unaligned address | |
20 */ | |
21 #ifdef ARCH_X86 | |
22 #define LOAD_LE32(p) (*(unsigned int*)(p)) | |
23 #define LOAD_LE16(p) (*(unsigned short*)(p)) | |
24 #else | |
25 #define LOAD_LE32(p) (((unsigned char*)(p))[0] | \ | |
26 ((unsigned char*)(p))[1]<< 8 | \ | |
27 ((unsigned char*)(p))[2]<<16 | \ | |
28 ((unsigned char*)(p))[3]<<24 ) | |
29 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \ | |
30 ((unsigned char*)(p))[1]<<8) | |
31 #endif | |
32 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
33 // defined at asfheader.c: |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
34 extern unsigned char* asf_packet; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
35 extern int asf_scrambling_h; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
36 extern int asf_scrambling_w; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
37 extern int asf_scrambling_b; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
38 extern int asf_packetsize; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
39 extern double asf_packetrate; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
40 extern int asf_movielength; |
16175 | 41 extern int asf_check_header(demuxer_t *demuxer); |
42 extern int read_asf_header(demuxer_t *demuxer); | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
43 |
1 | 44 // based on asf file-format doc by Eugene [http://divx.euro.ru] |
45 | |
15553
43af13780751
Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents:
14502
diff
changeset
|
46 static void asf_descrambling(unsigned char **src,int len){ |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
47 unsigned char *dst=malloc(len); |
15553
43af13780751
Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents:
14502
diff
changeset
|
48 unsigned char *s2=*src; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
49 int i=0,x,y; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
50 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){ |
1567 | 51 // mp_msg(MSGT_DEMUX,MSGL_DBG4,"descrambling! (w=%d b=%d)\n",w,asf_scrambling_b); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
52 //i+=asf_scrambling_h*asf_scrambling_w; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
53 for(x=0;x<asf_scrambling_w;x++) |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
54 for(y=0;y<asf_scrambling_h;y++){ |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
55 memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
56 i+=asf_scrambling_b; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
57 } |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
58 s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
59 } |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
60 //if(i<len) memcpy(dst+i,src+i,len-i); |
15553
43af13780751
Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents:
14502
diff
changeset
|
61 free(*src); |
43af13780751
Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents:
14502
diff
changeset
|
62 *src = dst; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
63 } |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
64 |
1 | 65 |
979 | 66 static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs,int keyframe){ |
1 | 67 demux_stream_t *ds=NULL; |
68 | |
1567 | 69 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len); |
1 | 70 |
426 | 71 if(demux->video->id==-1) |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
72 if(demux->v_streams[id]) |
426 | 73 demux->video->id=id; |
74 | |
1 | 75 if(demux->audio->id==-1) |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
76 if(demux->a_streams[id]) |
426 | 77 demux->audio->id=id; |
1 | 78 |
79 if(id==demux->audio->id){ | |
80 // audio | |
81 ds=demux->audio; | |
426 | 82 if(!ds->sh){ |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
83 ds->sh=demux->a_streams[id]; |
1567 | 84 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF audio ID = %d\n",ds->id); |
426 | 85 } |
1 | 86 } else |
87 if(id==demux->video->id){ | |
88 // video | |
89 ds=demux->video; | |
426 | 90 if(!ds->sh){ |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
91 ds->sh=demux->v_streams[id]; |
1567 | 92 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF video ID = %d\n",ds->id); |
426 | 93 } |
1 | 94 } |
95 | |
96 if(ds){ | |
97 if(ds->asf_packet){ | |
98 if(ds->asf_seq!=seq){ | |
99 // closed segment, finalize packet: | |
100 if(ds==demux->audio) | |
101 if(asf_scrambling_h>1 && asf_scrambling_w>1) | |
15553
43af13780751
Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents:
14502
diff
changeset
|
102 asf_descrambling(&ds->asf_packet->buffer,ds->asf_packet->len); |
1 | 103 ds_add_packet(ds,ds->asf_packet); |
104 ds->asf_packet=NULL; | |
105 } else { | |
106 // append data to it! | |
107 demux_packet_t* dp=ds->asf_packet; | |
1567 | 108 if(dp->len!=offs && offs!=-1) mp_msg(MSGT_DEMUX,MSGL_V,"warning! fragment.len=%d BUT next fragment offset=%d \n",dp->len,offs); |
1 | 109 dp->buffer=realloc(dp->buffer,dp->len+len); |
110 memcpy(dp->buffer+dp->len,data,len); | |
1567 | 111 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"data appended! %d+%d\n",dp->len,len); |
1 | 112 dp->len+=len; |
113 // we are ready now. | |
114 return 1; | |
115 } | |
116 } | |
117 // create new packet: | |
118 { demux_packet_t* dp; | |
119 if(offs>0){ | |
1567 | 120 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs); |
1 | 121 return 0; |
122 } | |
123 dp=new_demux_packet(len); | |
124 memcpy(dp->buffer,data,len); | |
125 dp->pts=time*0.001f; | |
979 | 126 dp->flags=keyframe; |
1 | 127 // if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur); |
128 dp->pos=demux->filepos; | |
129 ds->asf_packet=dp; | |
130 ds->asf_seq=seq; | |
131 // we are ready now. | |
132 return 1; | |
133 } | |
134 } | |
135 | |
136 return 0; | |
137 } | |
138 | |
139 //static int num_elementary_packets100=0; | |
140 //static int num_elementary_packets101=0; | |
141 | |
142 // return value: | |
143 // 0 = EOF or no stream found | |
144 // 1 = successfully read a packet | |
16175 | 145 static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){ |
1 | 146 |
147 demux->filepos=stream_tell(demux->stream); | |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
2338
diff
changeset
|
148 // Brodcast stream have movi_start==movi_end |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
2338
diff
changeset
|
149 // Better test ? |
10622 | 150 if((demux->movi_start < demux->movi_end) && (demux->filepos>=demux->movi_end)){ |
1 | 151 demux->stream->eof=1; |
152 return 0; | |
153 } | |
154 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
155 stream_read(demux->stream,asf_packet,asf_packetsize); |
1 | 156 if(demux->stream->eof) return 0; // EOF |
157 | |
12877
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
158 { |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
159 unsigned char* p=asf_packet; |
4197 | 160 unsigned char* p_end=asf_packet+asf_packetsize; |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
161 unsigned char flags=p[0]; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
162 unsigned char segtype=p[1]; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
163 int padding; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
164 int plen; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
165 int sequence; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
166 unsigned long time=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
167 unsigned short duration=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
168 |
1 | 169 int segs=1; |
170 unsigned char segsizetype=0x80; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
171 int seg=-1; |
1 | 172 |
173 if(verbose>1){ | |
174 int i; | |
175 for(i=0;i<16;i++) printf(" %02X",asf_packet[i]); | |
176 printf("\n"); | |
177 } | |
178 | |
12877
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
179 // skip ECC data if present by testing bit 7 of flags |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
180 // 1xxxbbbb -> ecc data present, skip bbbb byte(s) |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
181 // 0xxxxxxx -> payload parsing info starts |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
182 if (flags & 0x80) |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
183 { |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
184 p += (flags & 0x0f)+1; |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
185 flags = p[0]; |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
186 segtype = p[1]; |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
187 } |
e427e3cc26c1
skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents:
10832
diff
changeset
|
188 |
1 | 189 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n"); |
190 | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
191 p+=2; // skip flags & segtype |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
192 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
193 // Read packet size (plen): |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
194 switch((flags>>5)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
195 case 3: plen=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
196 case 2: plen=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
197 case 1: plen=p[0];p++;break; // byte |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
6668
diff
changeset
|
198 default: plen=0; |
10832 | 199 //plen==0 is handled later |
200 //mp_msg(MSGT_DEMUX,MSGL_V,"Invalid plen type! assuming plen=0\n"); | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
201 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
202 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
203 // Read sequence: |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
204 switch((flags>>1)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
205 case 3: sequence=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
206 case 2: sequence=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
207 case 1: sequence=p[0];p++;break; // byte |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
208 default: sequence=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
209 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
210 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
211 // Read padding size (padding): |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
212 switch((flags>>3)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
213 case 3: padding=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
214 case 2: padding=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
215 case 1: padding=p[0];p++;break; // byte |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
216 default: padding=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
217 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
218 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
219 if(((flags>>5)&3)!=0){ |
1 | 220 // Explicit (absoulte) packet size |
1567 | 221 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Explicit packet size specified: %d \n",plen); |
222 if(plen>asf_packetsize) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize); | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
223 } else { |
1 | 224 // Padding (relative) size |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
225 plen=asf_packetsize-padding; |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
226 } |
1 | 227 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
228 // Read time & duration: |
1342 | 229 time = LOAD_LE32(p); p+=4; |
230 duration = LOAD_LE16(p); p+=2; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
231 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
232 // Read payload flags: |
1 | 233 if(flags&1){ |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
234 // multiple sub-packets |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
235 segsizetype=p[0]>>6; |
1 | 236 segs=p[0] & 0x3F; |
237 ++p; | |
238 } | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
239 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"%08X: flag=%02X segs=%d seq=%d plen=%d pad=%d time=%ld dur=%d\n", |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
240 demux->filepos,flags,segs,sequence,plen,padding,time,duration); |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
241 |
1 | 242 for(seg=0;seg<segs;seg++){ |
243 //ASF_segmhdr_t* sh; | |
244 unsigned char streamno; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
245 unsigned int seq; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
246 unsigned int x; // offset or timestamp |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
247 unsigned int rlen; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
248 // |
1 | 249 int len; |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7472
diff
changeset
|
250 unsigned int time2=0; |
979 | 251 int keyframe=0; |
1 | 252 |
1567 | 253 if(p>=p_end) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! invalid packet 1, sig11 coming soon...\n"); |
1 | 254 |
255 if(verbose>1){ | |
256 int i; | |
257 printf("seg %d:",seg); | |
258 for(i=0;i<16;i++) printf(" %02X",p[i]); | |
259 printf("\n"); | |
260 } | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
261 |
1 | 262 streamno=p[0]&0x7F; |
979 | 263 if(p[0]&0x80) keyframe=1; |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
264 p++; |
1 | 265 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
266 // Read media object number (seq): |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
267 switch((segtype>>4)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
268 case 3: seq=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
269 case 2: seq=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
270 case 1: seq=p[0];p++;break; // byte |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
271 default: seq=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
272 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
273 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
274 // Read offset or timestamp: |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
275 switch((segtype>>2)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
276 case 3: x=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
277 case 2: x=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
278 case 1: x=p[0];p++;break; // byte |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
279 default: x=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
280 } |
1 | 281 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
282 // Read replic.data len: |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
283 switch((segtype)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
284 case 3: rlen=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
285 case 2: rlen=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
286 case 1: rlen=p[0];p++;break; // byte |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
287 default: rlen=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
288 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
289 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
290 // printf("### rlen=%d \n",rlen); |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
291 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
292 switch(rlen){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
293 case 0x01: // 1 = special, means grouping |
1 | 294 //printf("grouping: %02X \n",p[0]); |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
295 ++p; // skip PTS delta |
1 | 296 break; |
297 default: | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
298 if(rlen>=8){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
299 p+=4; // skip object size |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
300 time2=LOAD_LE32(p); // read PTS |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
301 p+=rlen-4; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
302 } else { |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
303 mp_msg(MSGT_DEMUX,MSGL_V,"unknown segment type (rlen): 0x%02X \n",rlen); |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
6668
diff
changeset
|
304 time2=0; // unknown |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
305 p+=rlen; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
306 } |
1 | 307 } |
308 | |
309 if(flags&1){ | |
310 // multiple segments | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
311 switch(segsizetype){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
312 case 3: len=LOAD_LE32(p);p+=4;break; // dword |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
313 case 2: len=LOAD_LE16(p);p+=2;break; // word |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
314 case 1: len=p[0];p++;break; // byte |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
315 default: len=plen-(p-asf_packet); // ??? |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
316 } |
1 | 317 } else { |
318 // single segment | |
319 len=plen-(p-asf_packet); | |
320 } | |
4197 | 321 if(len<0 || (p+len)>p_end){ |
1567 | 322 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len); |
1 | 323 } |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
324 mp_dbg(MSGT_DEMUX,MSGL_DBG4," seg #%d: streamno=%d seq=%d type=%02X len=%d\n",seg,streamno,seq,rlen,len); |
1 | 325 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
326 switch(rlen){ |
1 | 327 case 0x01: |
328 // GROUPING: | |
329 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len); | |
330 //printf(" total: %d \n",len); | |
331 while(len>0){ | |
332 int len2=p[0]; | |
333 p++; | |
334 //printf(" group part: %d bytes\n",len2); | |
979 | 335 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe); |
1 | 336 p+=len2; |
337 len-=len2+1; | |
6668 | 338 ++seq; |
1 | 339 } |
340 if(len!=0){ | |
1567 | 341 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n"); |
1 | 342 } |
343 break; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
344 default: |
1 | 345 // NO GROUPING: |
346 //printf("fragment offset: %d \n",sh->x); | |
979 | 347 demux_asf_read_packet(demux,p,len,streamno,seq,time2,duration,x,keyframe); |
1 | 348 p+=len; |
349 break; | |
350 } | |
351 | |
352 } // for segs | |
353 return 1; // success | |
354 } | |
355 | |
1567 | 356 mp_msg(MSGT_DEMUX,MSGL_V,"%08X: UNKNOWN TYPE %02X %02X %02X %02X %02X...\n",demux->filepos,asf_packet[0],asf_packet[1],asf_packet[2],asf_packet[3],asf_packet[4]); |
1 | 357 return 0; |
358 } | |
1466 | 359 |
360 #include "stheader.h" | |
361 | |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7472
diff
changeset
|
362 extern void resync_audio_stream(sh_audio_t *sh_audio); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7472
diff
changeset
|
363 extern void skip_audio_frame(sh_audio_t *sh_audio); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7472
diff
changeset
|
364 |
16175 | 365 static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){ |
1466 | 366 demux_stream_t *d_audio=demuxer->audio; |
367 demux_stream_t *d_video=demuxer->video; | |
368 sh_audio_t *sh_audio=d_audio->sh; | |
369 // sh_video_t *sh_video=d_video->sh; | |
370 | |
371 //FIXME: OFF_T - didn't test ASF case yet (don't have a large asf...) | |
372 //FIXME: reports good or bad to steve@daviesfam.org please | |
373 | |
374 //================= seek in ASF ========================== | |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
375 float p_rate=asf_packetrate; // packets / sec |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1567
diff
changeset
|
376 off_t rel_seek_packs=(flags&2)? // FIXME: int may be enough? |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1567
diff
changeset
|
377 (rel_seek_secs*(demuxer->movi_end-demuxer->movi_start)/asf_packetsize): |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1567
diff
changeset
|
378 (rel_seek_secs*p_rate); |
1466 | 379 off_t rel_seek_bytes=rel_seek_packs*asf_packetsize; |
380 off_t newpos; | |
381 //printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration)); | |
382 // printf("ASF_seek: %d secs -> %d packs -> %d bytes \n", | |
383 // rel_seek_secs,rel_seek_packs,rel_seek_bytes); | |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1567
diff
changeset
|
384 newpos=((flags&1)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes; |
1466 | 385 if(newpos<0 || newpos<demuxer->movi_start) newpos=demuxer->movi_start; |
386 // printf("\r -- asf: newpos=%d -- \n",newpos); | |
387 stream_seek(demuxer->stream,newpos); | |
388 | |
13310
c629f7ac9b9f
fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents:
12877
diff
changeset
|
389 if (d_video->id >= 0) |
1466 | 390 ds_fill_buffer(d_video); |
391 if(sh_audio){ | |
392 ds_fill_buffer(d_audio); | |
393 resync_audio_stream(sh_audio); | |
394 } | |
395 | |
13310
c629f7ac9b9f
fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents:
12877
diff
changeset
|
396 if (d_video->id < 0) |
c629f7ac9b9f
fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents:
12877
diff
changeset
|
397 sh_audio->delay = d_audio->pts; |
c629f7ac9b9f
fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents:
12877
diff
changeset
|
398 else |
1466 | 399 while(1){ |
400 if(sh_audio && !d_audio->eof){ | |
401 float a_pts=d_audio->pts; | |
402 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | |
403 // sync audio: | |
404 if (d_video->pts > a_pts){ | |
405 skip_audio_frame(sh_audio); | |
406 // if(!ds_fill_buffer(d_audio)) sh_audio=NULL; // skip audio. EOF? | |
407 continue; | |
408 } | |
409 } | |
410 if(d_video->flags&1) break; // found a keyframe! | |
411 if(!ds_fill_buffer(d_video)) break; // skip frame. EOF? | |
412 } | |
413 | |
414 | |
415 } | |
416 | |
16175 | 417 static int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){ |
8254
772d6d27fd66
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
8208
diff
changeset
|
418 /* demux_stream_t *d_audio=demuxer->audio; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
419 demux_stream_t *d_video=demuxer->video; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
420 sh_audio_t *sh_audio=d_audio->sh; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
421 sh_video_t *sh_video=d_video->sh; |
8254
772d6d27fd66
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
8208
diff
changeset
|
422 */ |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
423 switch(cmd) { |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
424 case DEMUXER_CTRL_GET_TIME_LENGTH: |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16175
diff
changeset
|
425 *((double *)arg)=(double)(asf_movielength); |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
426 return DEMUXER_CTRL_OK; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
427 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
428 case DEMUXER_CTRL_GET_PERCENT_POS: |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
429 return DEMUXER_CTRL_DONTKNOW; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
430 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
431 default: |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
432 return DEMUXER_CTRL_NOTIMPL; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
433 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
434 } |
16175 | 435 |
436 | |
437 static demuxer_t* demux_open_asf(demuxer_t* demuxer) | |
438 { | |
439 sh_audio_t *sh_audio=NULL; | |
440 sh_video_t *sh_video=NULL; | |
441 | |
442 //---- ASF header: | |
443 read_asf_header(demuxer); | |
444 stream_reset(demuxer->stream); | |
445 stream_seek(demuxer->stream,demuxer->movi_start); | |
446 // demuxer->idx_pos=0; | |
447 // demuxer->endpos=avi_header.movi_end; | |
448 if(demuxer->video->id != -2) { | |
449 if(!ds_fill_buffer(demuxer->video)){ | |
450 mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream); | |
451 demuxer->video->sh=NULL; | |
452 //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n"); | |
453 } else { | |
454 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video; | |
455 sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms | |
456 //sh_video->i_bps=10*asf_packetsize; // FIXME! | |
457 } | |
458 } | |
459 | |
460 if(demuxer->audio->id!=-2){ | |
461 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,demuxer->audio->id); | |
462 if(!ds_fill_buffer(demuxer->audio)){ | |
463 mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream); | |
464 demuxer->audio->sh=NULL; | |
465 } else { | |
466 sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio; | |
467 sh_audio->format=sh_audio->wf->wFormatTag; | |
468 } | |
469 } | |
470 | |
471 return demuxer; | |
472 } | |
473 | |
474 | |
475 demuxer_desc_t demuxer_desc_asf = { | |
476 "ASF demuxer", | |
477 "asv", | |
478 "ASF", | |
479 "A'rpi", | |
480 "ASF, WMV, WMA", | |
481 DEMUXER_TYPE_ASF, | |
482 1, // safe autodetect | |
483 asf_check_header, | |
484 demux_asf_fill_buffer, | |
485 demux_open_asf, | |
486 NULL, //demux_close_asf, | |
487 demux_seek_asf, | |
488 demux_asf_control | |
489 }; |