Mercurial > mplayer.hg
annotate libmpdemux/demux_asf.c @ 13395:07708ec98d87
New MD5 sum video output driver. For every frame, it calculates the MD5 sum
and writes a list of those sums to an, optionally specified, output file.
It does not rely on external programs to be installed. The MD5 sum code is
borrowed from the uCIFS library, written by Christopher R. Hertel in 2004
and released under the LGPL license.
Note: This driver is not yet activated and will not be compiled and linked
to libvo. A separate patch will take care of that. This is just for adding
the files to the repository.
author | ivo |
---|---|
date | Mon, 20 Sep 2004 01:01:08 +0000 |
parents | c629f7ac9b9f |
children | 8769fa370f83 |
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 |
833 | 15 |
1342 | 16 /* |
17 * Load 16/32-bit values in little endian byte order | |
18 * from an unaligned address | |
19 */ | |
20 #ifdef ARCH_X86 | |
21 #define LOAD_LE32(p) (*(unsigned int*)(p)) | |
22 #define LOAD_LE16(p) (*(unsigned short*)(p)) | |
23 #else | |
24 #define LOAD_LE32(p) (((unsigned char*)(p))[0] | \ | |
25 ((unsigned char*)(p))[1]<< 8 | \ | |
26 ((unsigned char*)(p))[2]<<16 | \ | |
27 ((unsigned char*)(p))[3]<<24 ) | |
28 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \ | |
29 ((unsigned char*)(p))[1]<<8) | |
30 #endif | |
31 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
32 // defined at asfheader.c: |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
33 extern unsigned char* asf_packet; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
34 extern int asf_scrambling_h; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
35 extern int asf_scrambling_w; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
36 extern int asf_scrambling_b; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
37 extern int asf_packetsize; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
38 extern double asf_packetrate; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
39 extern int asf_movielength; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
40 |
1 | 41 // based on asf file-format doc by Eugene [http://divx.euro.ru] |
42 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
43 static void asf_descrambling(unsigned char *src,int len){ |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
44 unsigned char *dst=malloc(len); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
45 unsigned char *s2=src; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
46 int i=0,x,y; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
47 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){ |
1567 | 48 // 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
|
49 //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
|
50 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
|
51 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
|
52 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
|
53 i+=asf_scrambling_b; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
54 } |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
55 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
|
56 } |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
57 //if(i<len) memcpy(dst+i,src+i,len-i); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
58 memcpy(src,dst,i); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
59 free(dst); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
60 } |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
61 |
1 | 62 |
979 | 63 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 | 64 demux_stream_t *ds=NULL; |
65 | |
1567 | 66 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len); |
1 | 67 |
426 | 68 if(demux->video->id==-1) |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
69 if(demux->v_streams[id]) |
426 | 70 demux->video->id=id; |
71 | |
1 | 72 if(demux->audio->id==-1) |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
73 if(demux->a_streams[id]) |
426 | 74 demux->audio->id=id; |
1 | 75 |
76 if(id==demux->audio->id){ | |
77 // audio | |
78 ds=demux->audio; | |
426 | 79 if(!ds->sh){ |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
80 ds->sh=demux->a_streams[id]; |
1567 | 81 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF audio ID = %d\n",ds->id); |
426 | 82 } |
1 | 83 } else |
84 if(id==demux->video->id){ | |
85 // video | |
86 ds=demux->video; | |
426 | 87 if(!ds->sh){ |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
88 ds->sh=demux->v_streams[id]; |
1567 | 89 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF video ID = %d\n",ds->id); |
426 | 90 } |
1 | 91 } |
92 | |
93 if(ds){ | |
94 if(ds->asf_packet){ | |
95 if(ds->asf_seq!=seq){ | |
96 // closed segment, finalize packet: | |
97 if(ds==demux->audio) | |
98 if(asf_scrambling_h>1 && asf_scrambling_w>1) | |
99 asf_descrambling(ds->asf_packet->buffer,ds->asf_packet->len); | |
100 ds_add_packet(ds,ds->asf_packet); | |
101 ds->asf_packet=NULL; | |
102 } else { | |
103 // append data to it! | |
104 demux_packet_t* dp=ds->asf_packet; | |
1567 | 105 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 | 106 dp->buffer=realloc(dp->buffer,dp->len+len); |
107 memcpy(dp->buffer+dp->len,data,len); | |
1567 | 108 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"data appended! %d+%d\n",dp->len,len); |
1 | 109 dp->len+=len; |
110 // we are ready now. | |
111 return 1; | |
112 } | |
113 } | |
114 // create new packet: | |
115 { demux_packet_t* dp; | |
116 if(offs>0){ | |
1567 | 117 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs); |
1 | 118 return 0; |
119 } | |
120 dp=new_demux_packet(len); | |
121 memcpy(dp->buffer,data,len); | |
122 dp->pts=time*0.001f; | |
979 | 123 dp->flags=keyframe; |
1 | 124 // if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur); |
125 dp->pos=demux->filepos; | |
126 ds->asf_packet=dp; | |
127 ds->asf_seq=seq; | |
128 // we are ready now. | |
129 return 1; | |
130 } | |
131 } | |
132 | |
133 return 0; | |
134 } | |
135 | |
136 //static int num_elementary_packets100=0; | |
137 //static int num_elementary_packets101=0; | |
138 | |
139 // return value: | |
140 // 0 = EOF or no stream found | |
141 // 1 = successfully read a packet | |
142 int demux_asf_fill_buffer(demuxer_t *demux){ | |
143 | |
144 demux->filepos=stream_tell(demux->stream); | |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
2338
diff
changeset
|
145 // Brodcast stream have movi_start==movi_end |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
2338
diff
changeset
|
146 // Better test ? |
10622 | 147 if((demux->movi_start < demux->movi_end) && (demux->filepos>=demux->movi_end)){ |
1 | 148 demux->stream->eof=1; |
149 return 0; | |
150 } | |
151 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
152 stream_read(demux->stream,asf_packet,asf_packetsize); |
1 | 153 if(demux->stream->eof) return 0; // EOF |
154 | |
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
|
155 { |
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
|
156 unsigned char* p=asf_packet; |
4197 | 157 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
|
158 unsigned char flags=p[0]; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
159 unsigned char segtype=p[1]; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
160 int padding; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
161 int plen; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
162 int sequence; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
163 unsigned long time=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
164 unsigned short duration=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
165 |
1 | 166 int segs=1; |
167 unsigned char segsizetype=0x80; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
168 int seg=-1; |
1 | 169 |
170 if(verbose>1){ | |
171 int i; | |
172 for(i=0;i<16;i++) printf(" %02X",asf_packet[i]); | |
173 printf("\n"); | |
174 } | |
175 | |
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
|
176 // 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
|
177 // 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
|
178 // 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
|
179 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
|
180 { |
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 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
|
182 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
|
183 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
|
184 } |
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 |
1 | 186 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n"); |
187 | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
188 p+=2; // skip flags & segtype |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
189 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
190 // Read packet size (plen): |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
191 switch((flags>>5)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
192 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
|
193 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
|
194 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
|
195 default: plen=0; |
10832 | 196 //plen==0 is handled later |
197 //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
|
198 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
199 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
200 // Read sequence: |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
201 switch((flags>>1)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
202 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
|
203 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
|
204 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
|
205 default: sequence=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
206 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
207 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
208 // Read padding size (padding): |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
209 switch((flags>>3)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
210 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
|
211 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
|
212 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
|
213 default: padding=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
214 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
215 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
216 if(((flags>>5)&3)!=0){ |
1 | 217 // Explicit (absoulte) packet size |
1567 | 218 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Explicit packet size specified: %d \n",plen); |
219 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
|
220 } else { |
1 | 221 // Padding (relative) size |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
426
diff
changeset
|
222 plen=asf_packetsize-padding; |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
223 } |
1 | 224 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
225 // Read time & duration: |
1342 | 226 time = LOAD_LE32(p); p+=4; |
227 duration = LOAD_LE16(p); p+=2; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
228 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
229 // Read payload flags: |
1 | 230 if(flags&1){ |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
231 // multiple sub-packets |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
232 segsizetype=p[0]>>6; |
1 | 233 segs=p[0] & 0x3F; |
234 ++p; | |
235 } | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
236 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
|
237 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
|
238 |
1 | 239 for(seg=0;seg<segs;seg++){ |
240 //ASF_segmhdr_t* sh; | |
241 unsigned char streamno; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
242 unsigned int seq; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
243 unsigned int x; // offset or timestamp |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
244 unsigned int rlen; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
245 // |
1 | 246 int len; |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7472
diff
changeset
|
247 unsigned int time2=0; |
979 | 248 int keyframe=0; |
1 | 249 |
1567 | 250 if(p>=p_end) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! invalid packet 1, sig11 coming soon...\n"); |
1 | 251 |
252 if(verbose>1){ | |
253 int i; | |
254 printf("seg %d:",seg); | |
255 for(i=0;i<16;i++) printf(" %02X",p[i]); | |
256 printf("\n"); | |
257 } | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
258 |
1 | 259 streamno=p[0]&0x7F; |
979 | 260 if(p[0]&0x80) keyframe=1; |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
261 p++; |
1 | 262 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
263 // Read media object number (seq): |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
264 switch((segtype>>4)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
265 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
|
266 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
|
267 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
|
268 default: seq=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
269 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
270 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
271 // Read offset or timestamp: |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
272 switch((segtype>>2)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
273 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
|
274 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
|
275 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
|
276 default: x=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
277 } |
1 | 278 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
279 // Read replic.data len: |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
280 switch((segtype)&3){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
281 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
|
282 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
|
283 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
|
284 default: rlen=0; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
285 } |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
286 |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
287 // printf("### rlen=%d \n",rlen); |
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 switch(rlen){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
290 case 0x01: // 1 = special, means grouping |
1 | 291 //printf("grouping: %02X \n",p[0]); |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
292 ++p; // skip PTS delta |
1 | 293 break; |
294 default: | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
295 if(rlen>=8){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
296 p+=4; // skip object size |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
297 time2=LOAD_LE32(p); // read PTS |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
298 p+=rlen-4; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
299 } else { |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
300 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
|
301 time2=0; // unknown |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
302 p+=rlen; |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
303 } |
1 | 304 } |
305 | |
306 if(flags&1){ | |
307 // multiple segments | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
308 switch(segsizetype){ |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
309 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
|
310 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
|
311 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
|
312 default: len=plen-(p-asf_packet); // ??? |
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
313 } |
1 | 314 } else { |
315 // single segment | |
316 len=plen-(p-asf_packet); | |
317 } | |
4197 | 318 if(len<0 || (p+len)>p_end){ |
1567 | 319 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len); |
1 | 320 } |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
321 mp_dbg(MSGT_DEMUX,MSGL_DBG4," seg #%d: streamno=%d seq=%d type=%02X len=%d\n",seg,streamno,seq,rlen,len); |
1 | 322 |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
323 switch(rlen){ |
1 | 324 case 0x01: |
325 // GROUPING: | |
326 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len); | |
327 //printf(" total: %d \n",len); | |
328 while(len>0){ | |
329 int len2=p[0]; | |
330 p++; | |
331 //printf(" group part: %d bytes\n",len2); | |
979 | 332 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe); |
1 | 333 p+=len2; |
334 len-=len2+1; | |
6668 | 335 ++seq; |
1 | 336 } |
337 if(len!=0){ | |
1567 | 338 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n"); |
1 | 339 } |
340 break; | |
6442
2eaeb73ce8ab
some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents:
4197
diff
changeset
|
341 default: |
1 | 342 // NO GROUPING: |
343 //printf("fragment offset: %d \n",sh->x); | |
979 | 344 demux_asf_read_packet(demux,p,len,streamno,seq,time2,duration,x,keyframe); |
1 | 345 p+=len; |
346 break; | |
347 } | |
348 | |
349 } // for segs | |
350 return 1; // success | |
351 } | |
352 | |
1567 | 353 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 | 354 return 0; |
355 } | |
1466 | 356 |
357 #include "stheader.h" | |
358 | |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7472
diff
changeset
|
359 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
|
360 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
|
361 |
1466 | 362 void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){ |
363 demux_stream_t *d_audio=demuxer->audio; | |
364 demux_stream_t *d_video=demuxer->video; | |
365 sh_audio_t *sh_audio=d_audio->sh; | |
366 // sh_video_t *sh_video=d_video->sh; | |
367 | |
368 //FIXME: OFF_T - didn't test ASF case yet (don't have a large asf...) | |
369 //FIXME: reports good or bad to steve@daviesfam.org please | |
370 | |
371 //================= seek in ASF ========================== | |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
372 float p_rate=asf_packetrate; // packets / sec |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1567
diff
changeset
|
373 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
|
374 (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
|
375 (rel_seek_secs*p_rate); |
1466 | 376 off_t rel_seek_bytes=rel_seek_packs*asf_packetsize; |
377 off_t newpos; | |
378 //printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration)); | |
379 // printf("ASF_seek: %d secs -> %d packs -> %d bytes \n", | |
380 // 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
|
381 newpos=((flags&1)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes; |
1466 | 382 if(newpos<0 || newpos<demuxer->movi_start) newpos=demuxer->movi_start; |
383 // printf("\r -- asf: newpos=%d -- \n",newpos); | |
384 stream_seek(demuxer->stream,newpos); | |
385 | |
13310
c629f7ac9b9f
fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents:
12877
diff
changeset
|
386 if (d_video->id >= 0) |
1466 | 387 ds_fill_buffer(d_video); |
388 if(sh_audio){ | |
389 ds_fill_buffer(d_audio); | |
390 resync_audio_stream(sh_audio); | |
391 } | |
392 | |
13310
c629f7ac9b9f
fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents:
12877
diff
changeset
|
393 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
|
394 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
|
395 else |
1466 | 396 while(1){ |
397 if(sh_audio && !d_audio->eof){ | |
398 float a_pts=d_audio->pts; | |
399 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | |
400 // sync audio: | |
401 if (d_video->pts > a_pts){ | |
402 skip_audio_frame(sh_audio); | |
403 // if(!ds_fill_buffer(d_audio)) sh_audio=NULL; // skip audio. EOF? | |
404 continue; | |
405 } | |
406 } | |
407 if(d_video->flags&1) break; // found a keyframe! | |
408 if(!ds_fill_buffer(d_video)) break; // skip frame. EOF? | |
409 } | |
410 | |
411 | |
412 } | |
413 | |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
414 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
|
415 /* demux_stream_t *d_audio=demuxer->audio; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
416 demux_stream_t *d_video=demuxer->video; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
417 sh_audio_t *sh_audio=d_audio->sh; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
418 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
|
419 */ |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
420 switch(cmd) { |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
421 case DEMUXER_CTRL_GET_TIME_LENGTH: |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
422 *((unsigned long *)arg)=(unsigned long)(asf_movielength); |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
423 return DEMUXER_CTRL_OK; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
424 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
425 case DEMUXER_CTRL_GET_PERCENT_POS: |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
426 if (demuxer->movi_end==demuxer->movi_start) { |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
427 return DEMUXER_CTRL_DONTKNOW; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
428 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
429 *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100)); |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
430 return DEMUXER_CTRL_OK; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
431 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
432 default: |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
433 return DEMUXER_CTRL_NOTIMPL; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
434 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
435 } |