diff asfheader.c @ 1342:baf646413408

ASF support for non-x86 cpus
author jkeil
date Thu, 19 Jul 2001 15:15:21 +0000
parents 3f490fad9bdf
children 1728d249c783
line wrap: on
line diff
--- a/asfheader.c	Wed Jul 18 01:28:01 2001 +0000
+++ b/asfheader.c	Thu Jul 19 15:15:21 2001 +0000
@@ -15,58 +15,28 @@
 
 #include "codec-cfg.h"
 #include "stheader.h"
-
+#include "aviheader.h"
+#include "asf.h"
 
-// BB: Moved to asf.h  --------------------- FROM HERE -------------------
-#ifndef STREAMING
-typedef struct __attribute__((packed)) {
-  unsigned char guid[16];
-  unsigned long long size;
-} ASF_obj_header_t;
-
-typedef struct __attribute__((packed)) {
-  ASF_obj_header_t objh;
-  unsigned int cno; // number of subchunks
-  unsigned char v1; // unknown (0x01)
-  unsigned char v2; // unknown (0x02)
-} ASF_header_t;
+#ifdef ARCH_X86
+#define	ASF_LOAD_GUID_PREFIX(guid)	(*(uint32_t *)(guid))
+#else
+#define	ASF_LOAD_GUID_PREFIX(guid)	\
+	((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0])
+#endif
 
-typedef struct __attribute__((packed)) {
-  unsigned char client[16]; // Client GUID
-  unsigned long long file_size;
-  unsigned long long creat_time; //File creation time FILETIME 8
-  unsigned long long packets;    //Number of packets UINT64 8
-  unsigned long long end_timestamp; //Timestamp of the end position UINT64 8
-  unsigned long long duration;  //Duration of the playback UINT64 8
-  unsigned long start_timestamp; //Timestamp of the start position UINT32 4
-  unsigned long unk1; //Unknown, maybe reserved ( usually contains 0 ) UINT32 4
-  unsigned long flags; //Unknown, maybe flags ( usually contains 2 ) UINT32 4
-  unsigned long packetsize; //Size of packet, in bytes UINT32 4
-  unsigned long packetsize2; //Size of packet ( confirm ) UINT32 4
-  unsigned long frame_size; //Size of uncompressed video frame UINT32 4
-} ASF_file_header_t;
+#define ASF_GUID_PREFIX_audio_stream	0xF8699E40
+#define ASF_GUID_PREFIX_video_stream	0xBC19EFC0
+#define ASF_GUID_PREFIX_audio_conceal_none 0x49f1a440
+#define ASF_GUID_PREFIX_audio_conceal_interleave 0xbfc3cd50
+#define ASF_GUID_PREFIX_header		0x75B22630
+#define ASF_GUID_PREFIX_data_chunk	0x75b22636
+#define ASF_GUID_PREFIX_index_chunk	0x33000890
+#define ASF_GUID_PREFIX_stream_header	0xB7DC0791
+#define ASF_GUID_PREFIX_header_2_0	0xD6E229D1
+#define ASF_GUID_PREFIX_file_header	0x8CABDCA1
+#define	ASF_GUID_PREFIX_content_desc	0x75b22633
 
-typedef struct __attribute__((packed)) {
-  unsigned char type[16]; // Stream type (audio/video) GUID 16
-  unsigned char concealment[16]; // Audio error concealment type GUID 16
-  unsigned long long unk1; // Unknown, maybe reserved ( usually contains 0 ) UINT64 8
-  unsigned long type_size; //Total size of type-specific data UINT32 4
-  unsigned long stream_size; //Size of stream-specific data UINT32 4
-  unsigned short stream_no; //Stream number UINT16 2
-  unsigned long unk2; //Unknown UINT32 4
-} ASF_stream_header_t;
-
-typedef struct  __attribute__((packed)) {
-  unsigned short title_size;
-  unsigned short author_size;
-  unsigned short copyright_size;
-  unsigned short comment_size;
-  unsigned short rating_size;
-} ASF_content_description_t;
-#else
-#include "asf.h"
-#endif
-// BB: Moved to asf.h  --------------------- TO HERE -------------------
 
 static ASF_header_t asfh;
 static ASF_obj_header_t objh;
@@ -98,25 +68,50 @@
   printf("%s%s\n", name, string);
 }
 
-static char* asf_chunk_type(unsigned char* guid){
-  switch(*((unsigned int*)guid)){
-    case 0xF8699E40: return "guid_audio_stream";
-    case 0xBC19EFC0: return "guid_video_stream";
-    case 0x49f1a440: return "guid_audio_conceal_none";
-    case 0xbfc3cd50: return "guid_audio_conceal_interleave";
-    case 0x75B22630: return "guid_header";
-    case 0x75b22636: return "guid_data_chunk";
-    case 0x33000890: return "guid_index_chunk";
-    case 0xB7DC0791: return "guid_stream_header";
-    case 0xD6E229D1: return "guid_header_2_0";
-    case 0x8CABDCA1: return "guid_file_header";
+static char* asf_chunk_type(unsigned char* guid) {
+  static char tmp[60];
+  char *p;
+  int i;
+
+  switch(ASF_LOAD_GUID_PREFIX(guid)){
+    case ASF_GUID_PREFIX_audio_stream:
+      return "guid_audio_stream";
+    case ASF_GUID_PREFIX_video_stream: 
+      return "guid_video_stream";
+    case ASF_GUID_PREFIX_audio_conceal_none:
+      return "guid_audio_conceal_none";
+    case ASF_GUID_PREFIX_audio_conceal_interleave:
+      return "guid_audio_conceal_interleave";
+    case ASF_GUID_PREFIX_header:
+      return "guid_header";
+    case ASF_GUID_PREFIX_data_chunk:
+      return "guid_data_chunk";
+    case ASF_GUID_PREFIX_index_chunk:
+      return "guid_index_chunk";
+    case ASF_GUID_PREFIX_stream_header:
+      return "guid_stream_header";
+    case ASF_GUID_PREFIX_header_2_0: 
+      return "guid_header_2_0";
+    case ASF_GUID_PREFIX_file_header:
+      return "guid_file_header";
+    case ASF_GUID_PREFIX_content_desc:
+      return "guid_content_desc";
+    default:
+      strcpy(tmp, "unknown guid ");
+      p = tmp + strlen(tmp);
+      for (i = 0; i < 16; i++) {
+	if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-';
+	sprintf(p, "%02x", guid[i]);
+	p += 2;
+      }
+      return tmp;
   }
-  return NULL;
 }
 
 int asf_check_header(demuxer_t *demuxer){
   unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
   stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj
+  le2me_ASF_header_t(&asfh);			// swap to machine endian
 //  for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n");
 //  for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n");
   if(memcmp(asfhdrguid,asfh.objh.guid,16)){
@@ -142,20 +137,22 @@
   int pos,endpos;
   pos=stream_tell(demuxer->stream);
   stream_read(demuxer->stream,(char*) &objh,sizeof(objh));
+  le2me_ASF_obj_header_t(&objh);
   if(stream_eof(demuxer->stream)) break; // EOF
   endpos=pos+objh.size;
 //  for(i=0;i<16;i++) printf("%02X ",objh.guid[i]);
   //printf("0x%08X  [%s] %d\n",pos, asf_chunk_type(objh.guid),(int) objh.size);
-  switch(*((unsigned int*)&objh.guid)){
-    case 0xB7DC0791: // guid_stream_header
+  switch(ASF_LOAD_GUID_PREFIX(objh.guid)){
+    case ASF_GUID_PREFIX_stream_header:
       stream_read(demuxer->stream,(char*) &streamh,sizeof(streamh));
-if(verbose){
-      printf("stream type: %s\n",asf_chunk_type(streamh.type));
-      printf("stream concealment: %s\n",asf_chunk_type(streamh.concealment));
-      printf("type: %d bytes,  stream: %d bytes  ID: %d\n",(int)streamh.type_size,(int)streamh.stream_size,(int)streamh.stream_no);
-      printf("unk1: %lX  unk2: %X\n",(unsigned long)streamh.unk1,(unsigned int)streamh.unk2);
-      printf("FILEPOS=0x%X\n",stream_tell(demuxer->stream));
-}
+      le2me_ASF_stream_header_t(&streamh);
+      if(verbose){
+        printf("stream type: %s\n",asf_chunk_type(streamh.type));
+	printf("stream concealment: %s\n",asf_chunk_type(streamh.concealment));
+	printf("type: %d bytes,  stream: %d bytes  ID: %d\n",(int)streamh.type_size,(int)streamh.stream_size,(int)streamh.stream_no);
+	printf("unk1: %lX  unk2: %X\n",(unsigned long)streamh.unk1,(unsigned int)streamh.unk2);
+	printf("FILEPOS=0x%X\n",stream_tell(demuxer->stream));
+      }
       if(streamh.type_size>1024 || streamh.stream_size>1024){
           printf("FATAL: header size bigger than 1024 bytes!\n");
           printf("Please contact mplayer authors, and upload/send this file.\n");
@@ -163,13 +160,14 @@
       }
       // type-specific data:
       stream_read(demuxer->stream,(char*) buffer,streamh.type_size);
-      switch(*((unsigned int*)&streamh.type)){
-      case 0xF8699E40: { // guid_audio_stream
+      switch(ASF_LOAD_GUID_PREFIX(streamh.type)){
+      case ASF_GUID_PREFIX_audio_stream: {
         sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh.stream_no & 0x7F);
         sh_audio->wf=calloc((streamh.type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh.type_size,1);
         memcpy(sh_audio->wf,buffer,streamh.type_size);
+	le2me_WAVEFORMATEX(sh_audio->wf);
         if(verbose>=1) print_wave_header(sh_audio->wf);
-	if((*((unsigned int*)&streamh.concealment))==0xbfc3cd50){
+	if(ASF_LOAD_GUID_PREFIX(streamh.concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){
           stream_read(demuxer->stream,(char*) buffer,streamh.stream_size);
           asf_scrambling_h=buffer[0];
           asf_scrambling_w=(buffer[2]<<8)|buffer[1];
@@ -182,12 +180,13 @@
 	//if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F;
         break;
         }
-      case 0xBC19EFC0: { // guid_video_stream
+      case ASF_GUID_PREFIX_video_stream: {
         sh_video_t* sh_video=new_sh_video(demuxer,streamh.stream_no & 0x7F);
         int len=streamh.type_size-(4+4+1+2);
 //        sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize);
         sh_video->bih=calloc((len<sizeof(BITMAPINFOHEADER))?sizeof(BITMAPINFOHEADER):len,1);
         memcpy(sh_video->bih,&buffer[4+4+1+2],len);
+	le2me_BITMAPINFOHEADER(sh_video->bih);
         //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
         //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
         if(verbose>=1) print_video_header(sh_video->bih);
@@ -199,25 +198,27 @@
       // stream-specific data:
       // stream_read(demuxer->stream,(char*) buffer,streamh.stream_size);
       break;
-//    case 0xD6E229D1: return "guid_header_2_0";
-    case 0x8CABDCA1: // guid_file_header
+//  case ASF_GUID_PREFIX_header_2_0: return "guid_header_2_0";
+    case ASF_GUID_PREFIX_file_header: // guid_file_header
       stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh));
+      le2me_ASF_file_header_t(&fileh);
       if(verbose) printf("ASF: packets: %d  flags: %d  pack_size: %d  frame_size: %d\n",(int)fileh.packets,(int)fileh.flags,(int)fileh.packetsize,(int)fileh.frame_size);
       asf_packetsize=fileh.packetsize;
       asf_packet=malloc(asf_packetsize); // !!!
       break;
-    case 0x75b22636: // guid_data_chunk
+    case ASF_GUID_PREFIX_data_chunk: // guid_data_chunk
       demuxer->movi_start=stream_tell(demuxer->stream)+26;
       demuxer->movi_end=endpos;
       if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end);
       break;
 
-//    case 0x33000890: return "guid_index_chunk";
+//  case ASF_GUID_PREFIX_index_chunk: return "guid_index_chunk";
 
-    case 0x75b22633: // Content description
+    case ASF_GUID_PREFIX_content_desc: // Content description
       if(verbose){
         char *string=NULL;
         stream_read(demuxer->stream,(char*) &contenth,sizeof(contenth));
+	le2me_ASF_content_description_t(&contenth);
         // extract the title
         if( contenth.title_size!=0 ) {
           string=(char*)malloc(contenth.title_size);
@@ -255,7 +256,7 @@
 
   } // switch GUID
 
-  if((*((unsigned int*)&objh.guid))==0x75b22636) break; // movi chunk
+  if(ASF_LOAD_GUID_PREFIX(objh.guid)==ASF_GUID_PREFIX_data_chunk) break; // movi chunk
 
   if(!stream_seek(demuxer->stream,endpos)) break;
 } // while EOF