Mercurial > mplayer.hg
comparison demux_asf.c @ 1342:baf646413408
ASF support for non-x86 cpus
author | jkeil |
---|---|
date | Thu, 19 Jul 2001 15:15:21 +0000 |
parents | b12e1817bcc2 |
children | 1728d249c783 |
comparison
equal
deleted
inserted
replaced
1341:5628c341f4ff | 1342:baf646413408 |
---|---|
4 #include <stdlib.h> | 4 #include <stdlib.h> |
5 | 5 |
6 extern int verbose; // defined in mplayer.c | 6 extern int verbose; // defined in mplayer.c |
7 | 7 |
8 #include "stream.h" | 8 #include "stream.h" |
9 #include "asf.h" | |
9 #include "demuxer.h" | 10 #include "demuxer.h" |
10 | 11 |
12 | |
13 /* | |
14 * Load 16/32-bit values in little endian byte order | |
15 * from an unaligned address | |
16 */ | |
17 #ifdef ARCH_X86 | |
18 #define LOAD_LE32(p) (*(unsigned int*)(p)) | |
19 #define LOAD_LE16(p) (*(unsigned short*)(p)) | |
20 #else | |
21 #define LOAD_LE32(p) (((unsigned char*)(p))[0] | \ | |
22 ((unsigned char*)(p))[1]<< 8 | \ | |
23 ((unsigned char*)(p))[2]<<16 | \ | |
24 ((unsigned char*)(p))[3]<<24 ) | |
25 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \ | |
26 ((unsigned char*)(p))[1]<<8) | |
27 #endif | |
11 | 28 |
12 // defined at asfheader.c: | 29 // defined at asfheader.c: |
13 extern unsigned char* asf_packet; | 30 extern unsigned char* asf_packet; |
14 extern int asf_scrambling_h; | 31 extern int asf_scrambling_h; |
15 extern int asf_scrambling_w; | 32 extern int asf_scrambling_w; |
23 //static float avi_audio_pts=0; | 40 //static float avi_audio_pts=0; |
24 //static float avi_video_pts=0; | 41 //static float avi_video_pts=0; |
25 | 42 |
26 //static int skip_video_frames=0; | 43 //static int skip_video_frames=0; |
27 | 44 |
28 //BB: Moved to asf.h --------- FROM HERE -------- | |
29 #ifndef STREAMING | |
30 typedef struct __attribute__((packed)) { | |
31 unsigned char streamno; | |
32 unsigned char seq; | |
33 unsigned long x; | |
34 unsigned char flag; | |
35 } ASF_segmhdr_t; | |
36 #else | |
37 #include "asf.h" | |
38 #endif | |
39 //BB: Moved to asf.h --------- TO HERE -------- | |
40 | 45 |
41 static void asf_descrambling(unsigned char *src,int len){ | 46 static void asf_descrambling(unsigned char *src,int len){ |
42 unsigned char *dst=malloc(len); | 47 unsigned char *dst=malloc(len); |
43 unsigned char *s2=src; | 48 unsigned char *s2=src; |
44 int i=0,x,y; | 49 int i=0,x,y; |
170 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n"); | 175 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n"); |
171 | 176 |
172 // Calculate packet size (plen): | 177 // Calculate packet size (plen): |
173 if(flags&0x40){ | 178 if(flags&0x40){ |
174 // Explicit (absoulte) packet size | 179 // Explicit (absoulte) packet size |
175 plen=p[0]|(p[1]<<8); p+=2; | 180 plen=LOAD_LE16(p); p+=2; |
176 if(verbose>1)printf("Explicit packet size specified: %d \n",plen); | 181 if(verbose>1)printf("Explicit packet size specified: %d \n",plen); |
177 if(plen>asf_packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize); | 182 if(plen>asf_packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize); |
178 if(flags&(8|16)){ | 183 if(flags&(8|16)){ |
179 padding=p[0];p++; | 184 padding=p[0];p++; |
180 if(flags&16){ padding|=p[0]<<8; p++;} | 185 if(flags&16){ padding|=p[0]<<8; p++;} |
184 // Padding (relative) size | 189 // Padding (relative) size |
185 if(flags&8){ | 190 if(flags&8){ |
186 padding=p[0];++p; | 191 padding=p[0];++p; |
187 } else | 192 } else |
188 if(flags&16){ | 193 if(flags&16){ |
189 padding=p[0]|(p[1]<<8);p+=2; | 194 padding=LOAD_LE16(p);p+=2; |
190 } | 195 } |
191 plen=asf_packetsize-padding; | 196 plen=asf_packetsize-padding; |
192 } | 197 } |
193 | 198 |
194 time=*((unsigned long*)p);p+=4; | 199 time = LOAD_LE32(p); p+=4; |
195 duration=*((unsigned short*)p);p+=2; | 200 duration = LOAD_LE16(p); p+=2; |
196 if(flags&1){ | 201 if(flags&1){ |
197 segsizetype=p[0] & 0xC0; | 202 segsizetype=p[0] & 0xC0; |
198 segs=p[0] & 0x3F; | 203 segs=p[0] & 0x3F; |
199 ++p; | 204 ++p; |
200 } | 205 } |
228 case 0x55: | 233 case 0x55: |
229 x=*((unsigned char*)p); | 234 x=*((unsigned char*)p); |
230 p++; | 235 p++; |
231 break; | 236 break; |
232 case 0x59: | 237 case 0x59: |
233 x=*((unsigned short*)p); | 238 x=LOAD_LE16(p); |
234 p+=2; | 239 p+=2; |
235 break; | 240 break; |
236 case 0x5D: | 241 case 0x5D: |
237 x=*((unsigned long*)p); | 242 x=LOAD_LE32(p); |
238 p+=4; | 243 p+=4; |
239 break; | 244 break; |
240 default: | 245 default: |
241 printf("Warning! unknown segtype == 0x%2X \n",segtype); | 246 printf("Warning! unknown segtype == 0x%2X \n",segtype); |
242 x=0; | 247 x=0; |
250 ++p; // skip unknown byte | 255 ++p; // skip unknown byte |
251 break; | 256 break; |
252 case 0x08: | 257 case 0x08: |
253 //printf("!!! obj_length = %d\n",*((unsigned long*)p)); | 258 //printf("!!! obj_length = %d\n",*((unsigned long*)p)); |
254 p+=4; | 259 p+=4; |
255 time2=*((unsigned long*)p);p+=4; | 260 time2=LOAD_LE32(p);p+=4; |
256 break; | 261 break; |
257 default: | 262 default: |
258 printf("unknown segment type: 0x%02X \n",type); | 263 printf("unknown segment type: 0x%02X \n",type); |
259 } | 264 } |
260 | 265 |
261 if(flags&1){ | 266 if(flags&1){ |
262 // multiple segments | 267 // multiple segments |
263 if(segsizetype==0x40){ | 268 if(segsizetype==0x40){ |
264 len=*((unsigned char*)p);p++; // 1 byte | 269 len=*((unsigned char*)p);p++; // 1 byte |
265 } else { | 270 } else { |
266 len=*((unsigned short*)p);p+=2; // 2 byte | 271 len=LOAD_LE16(p);p+=2; // 2 byte |
267 } | 272 } |
268 } else { | 273 } else { |
269 // single segment | 274 // single segment |
270 len=plen-(p-asf_packet); | 275 len=plen-(p-asf_packet); |
271 } | 276 } |