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 }