summaryrefslogtreecommitdiffstats
path: root/demux_asf.c
diff options
context:
space:
mode:
authorjkeil <jkeil@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-07-19 15:15:21 +0000
committerjkeil <jkeil@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-07-19 15:15:21 +0000
commitaec1d5237ffed5a68886344eb14e293ee5fc80b1 (patch)
tree16a2b2651891a5dbaa2426d5ac11158fec80b739 /demux_asf.c
parent0605b2b8b356441dcab3b960504dccb2889cba5b (diff)
downloadmpv-aec1d5237ffed5a68886344eb14e293ee5fc80b1.tar.bz2
mpv-aec1d5237ffed5a68886344eb14e293ee5fc80b1.tar.xz
ASF support for non-x86 cpus
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1343 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'demux_asf.c')
-rw-r--r--demux_asf.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/demux_asf.c b/demux_asf.c
index 6b6f6b1e2a..6d2dee5c81 100644
--- a/demux_asf.c
+++ b/demux_asf.c
@@ -6,9 +6,26 @@
extern int verbose; // defined in mplayer.c
#include "stream.h"
+#include "asf.h"
#include "demuxer.h"
+/*
+ * Load 16/32-bit values in little endian byte order
+ * from an unaligned address
+ */
+#ifdef ARCH_X86
+#define LOAD_LE32(p) (*(unsigned int*)(p))
+#define LOAD_LE16(p) (*(unsigned short*)(p))
+#else
+#define LOAD_LE32(p) (((unsigned char*)(p))[0] | \
+ ((unsigned char*)(p))[1]<< 8 | \
+ ((unsigned char*)(p))[2]<<16 | \
+ ((unsigned char*)(p))[3]<<24 )
+#define LOAD_LE16(p) (((unsigned char*)(p))[0] | \
+ ((unsigned char*)(p))[1]<<8)
+#endif
+
// defined at asfheader.c:
extern unsigned char* asf_packet;
extern int asf_scrambling_h;
@@ -25,18 +42,6 @@ extern int asf_packetsize;
//static int skip_video_frames=0;
-//BB: Moved to asf.h --------- FROM HERE --------
-#ifndef STREAMING
-typedef struct __attribute__((packed)) {
- unsigned char streamno;
- unsigned char seq;
- unsigned long x;
- unsigned char flag;
-} ASF_segmhdr_t;
-#else
-#include "asf.h"
-#endif
-//BB: Moved to asf.h --------- TO HERE --------
static void asf_descrambling(unsigned char *src,int len){
unsigned char *dst=malloc(len);
@@ -172,7 +177,7 @@ int demux_asf_fill_buffer(demuxer_t *demux){
// Calculate packet size (plen):
if(flags&0x40){
// Explicit (absoulte) packet size
- plen=p[0]|(p[1]<<8); p+=2;
+ plen=LOAD_LE16(p); p+=2;
if(verbose>1)printf("Explicit packet size specified: %d \n",plen);
if(plen>asf_packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize);
if(flags&(8|16)){
@@ -186,13 +191,13 @@ int demux_asf_fill_buffer(demuxer_t *demux){
padding=p[0];++p;
} else
if(flags&16){
- padding=p[0]|(p[1]<<8);p+=2;
+ padding=LOAD_LE16(p);p+=2;
}
plen=asf_packetsize-padding;
}
- time=*((unsigned long*)p);p+=4;
- duration=*((unsigned short*)p);p+=2;
+ time = LOAD_LE32(p); p+=4;
+ duration = LOAD_LE16(p); p+=2;
if(flags&1){
segsizetype=p[0] & 0xC0;
segs=p[0] & 0x3F;
@@ -230,11 +235,11 @@ int demux_asf_fill_buffer(demuxer_t *demux){
p++;
break;
case 0x59:
- x=*((unsigned short*)p);
+ x=LOAD_LE16(p);
p+=2;
break;
case 0x5D:
- x=*((unsigned long*)p);
+ x=LOAD_LE32(p);
p+=4;
break;
default:
@@ -252,7 +257,7 @@ int demux_asf_fill_buffer(demuxer_t *demux){
case 0x08:
//printf("!!! obj_length = %d\n",*((unsigned long*)p));
p+=4;
- time2=*((unsigned long*)p);p+=4;
+ time2=LOAD_LE32(p);p+=4;
break;
default:
printf("unknown segment type: 0x%02X \n",type);
@@ -261,9 +266,9 @@ int demux_asf_fill_buffer(demuxer_t *demux){
if(flags&1){
// multiple segments
if(segsizetype==0x40){
- len=*((unsigned char*)p);p++; // 1 byte
+ len=*((unsigned char*)p);p++; // 1 byte
} else {
- len=*((unsigned short*)p);p+=2; // 2 byte
+ len=LOAD_LE16(p);p+=2; // 2 byte
}
} else {
// single segment