comparison demux_asf.c @ 1567:5c7760aa4f94

printf->mp_msg/mp_dbg
author arpi
date Fri, 17 Aug 2001 00:40:25 +0000
parents b895f95e7657
children bd1ef18cdf33
comparison
equal deleted inserted replaced
1566:913c1ee56b4f 1567:5c7760aa4f94
2 2
3 #include <stdio.h> 3 #include <stdio.h>
4 #include <stdlib.h> 4 #include <stdlib.h>
5 #include <unistd.h> 5 #include <unistd.h>
6 6
7 extern int verbose; // defined in mplayer.c 7 #include "config.h"
8 #include "mp_msg.h"
8 9
9 #include "stream.h" 10 #include "stream.h"
10 #include "asf.h" 11 #include "asf.h"
11 #include "demuxer.h" 12 #include "demuxer.h"
12 13
40 static void asf_descrambling(unsigned char *src,int len){ 41 static void asf_descrambling(unsigned char *src,int len){
41 unsigned char *dst=malloc(len); 42 unsigned char *dst=malloc(len);
42 unsigned char *s2=src; 43 unsigned char *s2=src;
43 int i=0,x,y; 44 int i=0,x,y;
44 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){ 45 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
45 // printf("descrambling! (w=%d b=%d)\n",w,asf_scrambling_b); 46 // mp_msg(MSGT_DEMUX,MSGL_DBG4,"descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
46 //i+=asf_scrambling_h*asf_scrambling_w; 47 //i+=asf_scrambling_h*asf_scrambling_w;
47 for(x=0;x<asf_scrambling_w;x++) 48 for(x=0;x<asf_scrambling_w;x++)
48 for(y=0;y<asf_scrambling_h;y++){ 49 for(y=0;y<asf_scrambling_h;y++){
49 memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b); 50 memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
50 i+=asf_scrambling_b; 51 i+=asf_scrambling_b;
58 59
59 60
60 static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs,int keyframe){ 61 static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs,int keyframe){
61 demux_stream_t *ds=NULL; 62 demux_stream_t *ds=NULL;
62 63
63 if(verbose>=4) printf("demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len); 64 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len);
64 65
65 if(demux->video->id==-1) 66 if(demux->video->id==-1)
66 if(demux->v_streams[id]) 67 if(demux->v_streams[id])
67 demux->video->id=id; 68 demux->video->id=id;
68 69
73 if(id==demux->audio->id){ 74 if(id==demux->audio->id){
74 // audio 75 // audio
75 ds=demux->audio; 76 ds=demux->audio;
76 if(!ds->sh){ 77 if(!ds->sh){
77 ds->sh=demux->a_streams[id]; 78 ds->sh=demux->a_streams[id];
78 if(verbose) printf("Auto-selected ASF audio ID = %d\n",ds->id); 79 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF audio ID = %d\n",ds->id);
79 } 80 }
80 } else 81 } else
81 if(id==demux->video->id){ 82 if(id==demux->video->id){
82 // video 83 // video
83 ds=demux->video; 84 ds=demux->video;
84 if(!ds->sh){ 85 if(!ds->sh){
85 ds->sh=demux->v_streams[id]; 86 ds->sh=demux->v_streams[id];
86 if(verbose) printf("Auto-selected ASF video ID = %d\n",ds->id); 87 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF video ID = %d\n",ds->id);
87 } 88 }
88 } 89 }
89 90
90 if(ds){ 91 if(ds){
91 if(ds->asf_packet){ 92 if(ds->asf_packet){
97 ds_add_packet(ds,ds->asf_packet); 98 ds_add_packet(ds,ds->asf_packet);
98 ds->asf_packet=NULL; 99 ds->asf_packet=NULL;
99 } else { 100 } else {
100 // append data to it! 101 // append data to it!
101 demux_packet_t* dp=ds->asf_packet; 102 demux_packet_t* dp=ds->asf_packet;
102 if(dp->len!=offs && offs!=-1) printf("warning! fragment.len=%d BUT next fragment offset=%d \n",dp->len,offs); 103 if(dp->len!=offs && offs!=-1) mp_msg(MSGT_DEMUX,MSGL_V,"warning! fragment.len=%d BUT next fragment offset=%d \n",dp->len,offs);
103 dp->buffer=realloc(dp->buffer,dp->len+len); 104 dp->buffer=realloc(dp->buffer,dp->len+len);
104 memcpy(dp->buffer+dp->len,data,len); 105 memcpy(dp->buffer+dp->len,data,len);
105 if(verbose>=4) printf("data appended! %d+%d\n",dp->len,len); 106 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"data appended! %d+%d\n",dp->len,len);
106 dp->len+=len; 107 dp->len+=len;
107 // we are ready now. 108 // we are ready now.
108 return 1; 109 return 1;
109 } 110 }
110 } 111 }
111 // create new packet: 112 // create new packet:
112 { demux_packet_t* dp; 113 { demux_packet_t* dp;
113 if(offs>0){ 114 if(offs>0){
114 if(verbose) printf("warning! broken fragment, %d bytes missing \n",offs); 115 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs);
115 return 0; 116 return 0;
116 } 117 }
117 dp=new_demux_packet(len); 118 dp=new_demux_packet(len);
118 memcpy(dp->buffer,data,len); 119 memcpy(dp->buffer,data,len);
119 dp->pts=time*0.001f; 120 dp->pts=time*0.001f;
170 171
171 // Calculate packet size (plen): 172 // Calculate packet size (plen):
172 if(flags&0x40){ 173 if(flags&0x40){
173 // Explicit (absoulte) packet size 174 // Explicit (absoulte) packet size
174 plen=LOAD_LE16(p); p+=2; 175 plen=LOAD_LE16(p); p+=2;
175 if(verbose>1)printf("Explicit packet size specified: %d \n",plen); 176 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Explicit packet size specified: %d \n",plen);
176 if(plen>asf_packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize); 177 if(plen>asf_packetsize) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize);
177 if(flags&(8|16)){ 178 if(flags&(8|16)){
178 padding=p[0];p++; 179 padding=p[0];p++;
179 if(flags&16){ padding|=p[0]<<8; p++;} 180 if(flags&16){ padding|=p[0]<<8; p++;}
180 if(verbose)printf("Warning! explicit=%d padding=%d \n",plen,asf_packetsize-padding); 181 mp_msg(MSGT_DEMUX,MSGL_V,"Warning! explicit=%d padding=%d \n",plen,asf_packetsize-padding);
181 } 182 }
182 } else { 183 } else {
183 // Padding (relative) size 184 // Padding (relative) size
184 if(flags&8){ 185 if(flags&8){
185 padding=p[0];++p; 186 padding=p[0];++p;
195 if(flags&1){ 196 if(flags&1){
196 segsizetype=p[0] & 0xC0; 197 segsizetype=p[0] & 0xC0;
197 segs=p[0] & 0x3F; 198 segs=p[0] & 0x3F;
198 ++p; 199 ++p;
199 } 200 }
200 if(verbose>=4) printf("%08X: flag=%02X segs=%d pad=%d time=%ld dur=%d\n", 201 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"%08X: flag=%02X segs=%d pad=%d time=%ld dur=%d\n",
201 demux->filepos,flags,segs,padding,time,duration); 202 demux->filepos,flags,segs,padding,time,duration);
202 for(seg=0;seg<segs;seg++){ 203 for(seg=0;seg<segs;seg++){
203 //ASF_segmhdr_t* sh; 204 //ASF_segmhdr_t* sh;
204 unsigned char streamno; 205 unsigned char streamno;
205 unsigned char seq; 206 unsigned char seq;
207 unsigned long x; 208 unsigned long x;
208 unsigned char type; 209 unsigned char type;
209 unsigned long time2; 210 unsigned long time2;
210 int keyframe=0; 211 int keyframe=0;
211 212
212 if(p>=p_end) printf("Warning! invalid packet 1, sig11 coming soon...\n"); 213 if(p>=p_end) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! invalid packet 1, sig11 coming soon...\n");
213 214
214 if(verbose>1){ 215 if(verbose>1){
215 int i; 216 int i;
216 printf("seg %d:",seg); 217 printf("seg %d:",seg);
217 for(i=0;i<16;i++) printf(" %02X",p[i]); 218 for(i=0;i<16;i++) printf(" %02X",p[i]);
235 case 0x5D: 236 case 0x5D:
236 x=LOAD_LE32(p); 237 x=LOAD_LE32(p);
237 p+=4; 238 p+=4;
238 break; 239 break;
239 default: 240 default:
240 printf("Warning! unknown segtype == 0x%2X \n",segtype); 241 mp_msg(MSGT_DEMUX,MSGL_V,"Warning! unknown segtype == 0x%2X \n",segtype);
241 x=0; 242 x=0;
242 } 243 }
243 244
244 type=p[0]; p++; // 0x01: grouping 0x08: single 245 type=p[0]; p++; // 0x01: grouping 0x08: single
245 246
252 //printf("!!! obj_length = %d\n",*((unsigned long*)p)); 253 //printf("!!! obj_length = %d\n",*((unsigned long*)p));
253 p+=4; 254 p+=4;
254 time2=LOAD_LE32(p);p+=4; 255 time2=LOAD_LE32(p);p+=4;
255 break; 256 break;
256 default: 257 default:
257 printf("unknown segment type: 0x%02X \n",type); 258 mp_msg(MSGT_DEMUX,MSGL_V,"unknown segment type: 0x%02X \n",type);
258 } 259 }
259 260
260 if(flags&1){ 261 if(flags&1){
261 // multiple segments 262 // multiple segments
262 if(segsizetype==0x40){ 263 if(segsizetype==0x40){
267 } else { 268 } else {
268 // single segment 269 // single segment
269 len=plen-(p-asf_packet); 270 len=plen-(p-asf_packet);
270 } 271 }
271 if(len<0 || (p+len)>=p_end){ 272 if(len<0 || (p+len)>=p_end){
272 printf("ASF_parser: warning! segment len=%d\n",len); 273 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len);
273 } 274 }
274 if(verbose>=4) printf(" seg #%d: streamno=%d seq=%d type=%02X len=%d\n",seg,streamno,seq,type,len); 275 mp_dbg(MSGT_DEMUX,MSGL_DBG4," seg #%d: streamno=%d seq=%d type=%02X len=%d\n",seg,streamno,seq,type,len);
275 276
276 switch(type){ 277 switch(type){
277 case 0x01: 278 case 0x01:
278 // GROUPING: 279 // GROUPING:
279 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len); 280 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len);
285 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe); 286 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe);
286 p+=len2; 287 p+=len2;
287 len-=len2+1; 288 len-=len2+1;
288 } 289 }
289 if(len!=0){ 290 if(len!=0){
290 printf("ASF_parser: warning! groups total != len\n"); 291 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n");
291 } 292 }
292 break; 293 break;
293 case 0x08: 294 case 0x08:
294 // NO GROUPING: 295 // NO GROUPING:
295 //printf("fragment offset: %d \n",sh->x); 296 //printf("fragment offset: %d \n",sh->x);
300 301
301 } // for segs 302 } // for segs
302 return 1; // success 303 return 1; // success
303 } 304 }
304 305
305 printf("%08X: UNKNOWN TYPE %02X %02X %02X %02X %02X...\n",demux->filepos,asf_packet[0],asf_packet[1],asf_packet[2],asf_packet[3],asf_packet[4]); 306 mp_msg(MSGT_DEMUX,MSGL_V,"%08X: UNKNOWN TYPE %02X %02X %02X %02X %02X...\n",demux->filepos,asf_packet[0],asf_packet[1],asf_packet[2],asf_packet[3],asf_packet[4]);
306 return 0; 307 return 0;
307 } 308 }
308 309
309 310
310 #include "wine/mmreg.h" 311 #include "wine/mmreg.h"