Mercurial > mplayer.hg
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 |