comparison asfheader.c @ 587:8511095c5283

stage#1 completed: c files no more included from mplayer.c
author arpi_esp
date Mon, 23 Apr 2001 03:42:17 +0000
parents 5251b0c57e39
children ef932c18cb14
comparison
equal deleted inserted replaced
586:e1b8c0b3ec35 587:8511095c5283
1 // .asf fileformat docs from http://divx.euro.ru 1 // .asf fileformat docs from http://divx.euro.ru
2
3
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 extern int verbose; // defined in mplayer.c
8
9 #include "stream.h"
10 #include "demuxer.h"
11
12 #include "wine/mmreg.h"
13 #include "wine/avifmt.h"
14 #include "wine/vfw.h"
15
16 #include "codec-cfg.h"
17 #include "stheader.h"
2 18
3 typedef struct __attribute__((packed)) { 19 typedef struct __attribute__((packed)) {
4 unsigned char guid[16]; 20 unsigned char guid[16];
5 unsigned long long size; 21 unsigned long long size;
6 } ASF_obj_header_t; 22 } ASF_obj_header_t;
36 unsigned short stream_no; //Stream number UINT16 2 52 unsigned short stream_no; //Stream number UINT16 2
37 unsigned long unk2; //Unknown UINT32 4 53 unsigned long unk2; //Unknown UINT32 4
38 } ASF_stream_header_t; 54 } ASF_stream_header_t;
39 55
40 56
41 ASF_header_t asfh; 57 static ASF_header_t asfh;
42 ASF_obj_header_t objh; 58 static ASF_obj_header_t objh;
43 ASF_file_header_t fileh; 59 static ASF_file_header_t fileh;
44 ASF_stream_header_t streamh; 60 static ASF_stream_header_t streamh;
61
45 unsigned char* asf_packet=NULL; 62 unsigned char* asf_packet=NULL;
46 //int asf_video_id=-1;
47 int asf_scrambling_h=1; 63 int asf_scrambling_h=1;
48 int asf_scrambling_w=1; 64 int asf_scrambling_w=1;
49 int asf_scrambling_b=1; 65 int asf_scrambling_b=1;
66 int asf_packetsize=0;
50 67
51 int i; 68 //int i;
52 69
53 void asf_descrambling(unsigned char *src,int len){
54 unsigned char *dst=malloc(len);
55 unsigned char *s2=src;
56 int i=0,x,y;
57 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
58 // printf("descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
59 //i+=asf_scrambling_h*asf_scrambling_w;
60 for(x=0;x<asf_scrambling_w;x++)
61 for(y=0;y<asf_scrambling_h;y++){
62 memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
63 i+=asf_scrambling_b;
64 }
65 s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b;
66 }
67 //if(i<len) memcpy(dst+i,src+i,len-i);
68 memcpy(src,dst,i);
69 free(dst);
70 }
71 70
72 char* asf_chunk_type(unsigned char* guid){ 71 static char* asf_chunk_type(unsigned char* guid){
73 switch(*((unsigned int*)guid)){ 72 switch(*((unsigned int*)guid)){
74 case 0xF8699E40: return "guid_audio_stream"; 73 case 0xF8699E40: return "guid_audio_stream";
75 case 0xBC19EFC0: return "guid_video_stream"; 74 case 0xBC19EFC0: return "guid_video_stream";
76 case 0x49f1a440: return "guid_audio_conceal_none"; 75 case 0x49f1a440: return "guid_audio_conceal_none";
77 case 0xbfc3cd50: return "guid_audio_conceal_interleave"; 76 case 0xbfc3cd50: return "guid_audio_conceal_interleave";
83 case 0x8CABDCA1: return "guid_file_header"; 82 case 0x8CABDCA1: return "guid_file_header";
84 } 83 }
85 return NULL; 84 return NULL;
86 } 85 }
87 86
88 int asf_check_header(){ 87 int asf_check_header(demuxer_t *demuxer){
89 unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C}; 88 unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
90 stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj 89 stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj
91 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); 90 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n");
92 // for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n"); 91 // for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n");
93 if(memcmp(asfhdrguid,asfh.objh.guid,16)){ 92 if(memcmp(asfhdrguid,asfh.objh.guid,16)){
99 return 0; // invalid header??? 98 return 0; // invalid header???
100 } 99 }
101 return 1; 100 return 1;
102 } 101 }
103 102
104 int read_asf_header(){ 103 int read_asf_header(demuxer_t *demuxer){
105 unsigned char buffer[512]; 104 unsigned char buffer[512];
106 105
107 #if 1 106 #if 1
108 //printf("ASF file! (subchunks: %d)\n",asfh.cno); 107 //printf("ASF file! (subchunks: %d)\n",asfh.cno);
109 while(!stream_eof(demuxer->stream)){ 108 while(!stream_eof(demuxer->stream)){
164 break; 163 break;
165 // case 0xD6E229D1: return "guid_header_2_0"; 164 // case 0xD6E229D1: return "guid_header_2_0";
166 case 0x8CABDCA1: // guid_file_header 165 case 0x8CABDCA1: // guid_file_header
167 stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh)); 166 stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh));
168 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); 167 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);
169 asf_packet=malloc(fileh.packetsize); // !!! 168 asf_packetsize=fileh.packetsize;
169 asf_packet=malloc(asf_packetsize); // !!!
170 break; 170 break;
171 case 0x75b22636: // guid_data_chunk 171 case 0x75b22636: // guid_data_chunk
172 avi_header.movi_start=stream_tell(demuxer->stream)+26; 172 demuxer->movi_start=stream_tell(demuxer->stream)+26;
173 avi_header.movi_end=endpos; 173 demuxer->movi_end=endpos;
174 if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",avi_header.movi_start,avi_header.movi_end); 174 if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end);
175 break; 175 break;
176 176
177 // case 0x33000890: return "guid_index_chunk"; 177 // case 0x33000890: return "guid_index_chunk";
178 178
179 } // switch GUID 179 } // switch GUID