comparison libmpdemux/demux_real.c @ 11870:5be0e6772ec3

continue playing real files after errors patch by Pekka Enberg <Pekka.Enberg@cs.helsinki.fi> additionally changed all printfs to mp_msg
author attila
date Thu, 29 Jan 2004 10:13:35 +0000
parents 571295c177d2
children 9b2035d703da
comparison
equal deleted inserted replaced
11869:c10bd91a4eb2 11870:5be0e6772ec3
91 91
92 stream_read(demuxer->stream, buf, (len > buf_size) ? buf_size : len); 92 stream_read(demuxer->stream, buf, (len > buf_size) ? buf_size : len);
93 if (len > buf_size) 93 if (len > buf_size)
94 stream_skip(demuxer->stream, len-buf_size); 94 stream_skip(demuxer->stream, len-buf_size);
95 95
96 printf("read_str: %d bytes read\n", len); 96 mp_msg(MSGT_DEMUX, MSGL_V, "read_str: %d bytes read\n", len);
97 } 97 }
98 98
99 static void skip_str(int isbyte, demuxer_t *demuxer) 99 static void skip_str(int isbyte, demuxer_t *demuxer)
100 { 100 {
101 int len; 101 int len;
105 else 105 else
106 len = stream_read_word(demuxer->stream); 106 len = stream_read_word(demuxer->stream);
107 107
108 stream_skip(demuxer->stream, len); 108 stream_skip(demuxer->stream, len);
109 109
110 printf("skip_str: %d bytes skipped\n", len); 110 mp_msg(MSGT_DEMUX, MSGL_V, "skip_str: %d bytes skipped\n", len);
111 } 111 }
112 112
113 static void dump_index(demuxer_t *demuxer, int stream_id) 113 static void dump_index(demuxer_t *demuxer, int stream_id)
114 { 114 {
115 real_priv_t *priv = demuxer->priv; 115 real_priv_t *priv = demuxer->priv;
123 return; 123 return;
124 124
125 index = priv->index_table[stream_id]; 125 index = priv->index_table[stream_id];
126 entries = priv->index_table_size[stream_id]; 126 entries = priv->index_table_size[stream_id];
127 127
128 printf("Index table for stream %d\n", stream_id); 128 mp_msg(MSGT_DEMUX, MSGL_V, "Index table for stream %d\n", stream_id);
129 for (i = 0; i < entries; i++) 129 for (i = 0; i < entries; i++)
130 { 130 {
131 #if 1 131 #if 1
132 printf("i: %d, pos: %d, timestamp: %d\n", i, index[i].offset, index[i].timestamp); 132 mp_msg(MSGT_DEMUX, MSGL_V,"i: %d, pos: %d, timestamp: %d\n", i, index[i].offset, index[i].timestamp);
133 #else 133 #else
134 printf("packetno: %x pos: %x len: %x timestamp: %x flags: %x\n", 134 mp_msg(MSGT_DEMUX, MSGL_V,"packetno: %x pos: %x len: %x timestamp: %x flags: %x\n",
135 index[i].packetno, index[i].offset, index[i].len, index[i].timestamp, 135 index[i].packetno, index[i].offset, index[i].len, index[i].timestamp,
136 index[i].flags); 136 index[i].flags);
137 #endif 137 #endif
138 } 138 }
139 } 139 }
149 stream_seek(demuxer->stream, next_header_pos); 149 stream_seek(demuxer->stream, next_header_pos);
150 150
151 i = stream_read_dword_le(demuxer->stream); 151 i = stream_read_dword_le(demuxer->stream);
152 if ((i == -256) || (i != MKTAG('I', 'N', 'D', 'X'))) 152 if ((i == -256) || (i != MKTAG('I', 'N', 'D', 'X')))
153 { 153 {
154 printf("Something went wrong, no index chunk found on given address (%d)\n", 154 mp_msg(MSGT_DEMUX, MSGL_WARN,"Something went wrong, no index chunk found on given address (%d)\n",
155 next_header_pos); 155 next_header_pos);
156 index_mode = -1; 156 index_mode = -1;
157 if (i == -256) 157 if (i == -256)
158 stream_reset(demuxer->stream); 158 stream_reset(demuxer->stream);
159 stream_seek(demuxer->stream, origpos); 159 stream_seek(demuxer->stream, origpos);
160 return 0; 160 return 0;
161 //goto end; 161 //goto end;
162 } 162 }
163 163
164 printf("Reading index table from index chunk (%d)\n", 164 mp_msg(MSGT_DEMUX, MSGL_V,"Reading index table from index chunk (%d)\n",
165 next_header_pos); 165 next_header_pos);
166 166
167 i = stream_read_dword(demuxer->stream); 167 i = stream_read_dword(demuxer->stream);
168 printf("size: %d bytes\n", i); 168 mp_msg(MSGT_DEMUX, MSGL_V,"size: %d bytes\n", i);
169 169
170 i = stream_read_word(demuxer->stream); 170 i = stream_read_word(demuxer->stream);
171 if (i != 0) 171 if (i != 0)
172 printf("Hmm, index table with unknown version (%d), please report it to MPlayer developers!\n", i); 172 mp_msg(MSGT_DEMUX, MSGL_WARN,"Hmm, index table with unknown version (%d), please report it to MPlayer developers!\n", i);
173 173
174 entries = stream_read_dword(demuxer->stream); 174 entries = stream_read_dword(demuxer->stream);
175 printf("entries: %d\n", entries); 175 mp_msg(MSGT_DEMUX, MSGL_V,"entries: %d\n", entries);
176 176
177 stream_id = stream_read_word(demuxer->stream); 177 stream_id = stream_read_word(demuxer->stream);
178 printf("stream_id: %d\n", stream_id); 178 mp_msg(MSGT_DEMUX, MSGL_V,"stream_id: %d\n", stream_id);
179 179
180 next_header_pos = stream_read_dword(demuxer->stream); 180 next_header_pos = stream_read_dword(demuxer->stream);
181 printf("next_header_pos: %d\n", next_header_pos); 181 mp_msg(MSGT_DEMUX, MSGL_V,"next_header_pos: %d\n", next_header_pos);
182 if (entries <= 0) 182 if (entries <= 0)
183 { 183 {
184 if (next_header_pos) 184 if (next_header_pos)
185 goto read_index; 185 goto read_index;
186 i = entries; 186 i = entries;
299 299
300 stream_seek(demuxer->stream, data_pos); 300 stream_seek(demuxer->stream, data_pos);
301 tag = stream_read_dword(demuxer->stream); 301 tag = stream_read_dword(demuxer->stream);
302 if (tag != MKTAG('A', 'T', 'A', 'D')) 302 if (tag != MKTAG('A', 'T', 'A', 'D'))
303 { 303 {
304 printf("Something went wrong, no data chunk found on given address (%d)\n", data_pos); 304 mp_msg(MSGT_DEMUX, MSGL_WARN,"Something went wrong, no data chunk found on given address (%d)\n", data_pos);
305 } 305 }
306 else 306 else
307 { 307 {
308 stream_skip(demuxer->stream, 14); 308 stream_skip(demuxer->stream, 14);
309 add_index_segment(demuxer, -1, -1); 309 add_index_segment(demuxer, -1, -1);
338 stream_seek(demuxer->stream, data_pos); 338 stream_seek(demuxer->stream, data_pos);
339 339
340 i = stream_read_dword_le(demuxer->stream); 340 i = stream_read_dword_le(demuxer->stream);
341 if ((i == -256) || (i != MKTAG('D', 'A', 'T', 'A'))) 341 if ((i == -256) || (i != MKTAG('D', 'A', 'T', 'A')))
342 { 342 {
343 printf("Something went wrong, no data chunk found on given address (%d)\n", 343 mp_msg(MSGT_DEMUX, MSGL_WARN,"Something went wrong, no data chunk found on given address (%d)\n",
344 data_pos); 344 data_pos);
345 goto end; 345 goto end;
346 } 346 }
347 stream_skip(demuxer->stream, 4); /* chunk size */ 347 stream_skip(demuxer->stream, 4); /* chunk size */
348 stream_skip(demuxer->stream, 2); /* version */ 348 stream_skip(demuxer->stream, 2); /* version */
349 349
350 num_of_packets = stream_read_dword(demuxer->stream); 350 num_of_packets = stream_read_dword(demuxer->stream);
351 printf("Generating index table from raw data (pos: 0x%x) for %d packets\n", 351 mp_msg(MSGT_DEMUX, MSGL_V,"Generating index table from raw data (pos: 0x%x) for %d packets\n",
352 data_pos, num_of_packets); 352 data_pos, num_of_packets);
353 353
354 data_pos = stream_read_dword_le(demuxer->stream)-10; /* next data chunk */ 354 data_pos = stream_read_dword_le(demuxer->stream)-10; /* next data chunk */
355 355
356 for (i = 0; i < MAX_STREAMS; i++) 356 for (i = 0; i < MAX_STREAMS; i++)
465 kf= SHOW_BITS(13); // kf= 2*SHOW_BITS(12); 465 kf= SHOW_BITS(13); // kf= 2*SHOW_BITS(12);
466 // if(pict_type==0) 466 // if(pict_type==0)
467 if(pict_type<=1){ 467 if(pict_type<=1){
468 // I frame, sync timestamps: 468 // I frame, sync timestamps:
469 priv->kf_base=timestamp-kf; 469 priv->kf_base=timestamp-kf;
470 if(verbose>1) printf("\nTS: base=%08X\n",priv->kf_base); 470 mp_msg(MSGT_DEMUX, MSGL_V,"\nTS: base=%08X\n",priv->kf_base);
471 kf=timestamp; 471 kf=timestamp;
472 } else { 472 } else {
473 // P/B frame, merge timestamps: 473 // P/B frame, merge timestamps:
474 int tmp=timestamp-priv->kf_base; 474 int tmp=timestamp-priv->kf_base;
475 kf|=tmp&(~0x1fff); // combine with packet timestamp 475 kf|=tmp&(~0x1fff); // combine with packet timestamp
481 int tmp=kf; 481 int tmp=kf;
482 kf=priv->kf_pts; 482 kf=priv->kf_pts;
483 priv->kf_pts=tmp; 483 priv->kf_pts=tmp;
484 // if(kf<=tmp) kf=0; 484 // if(kf<=tmp) kf=0;
485 } 485 }
486 if(verbose>1) printf("\nTS: %08X -> %08X (%04X) %d %02X %02X %02X %02X %5d\n",timestamp,kf,orig_kf,pict_type,s[0],s[1],s[2],s[3],kf-(int)(1000.0*priv->v_pts)); 486 mp_msg(MSGT_DEMUX, MSGL_V,"\nTS: %08X -> %08X (%04X) %d %02X %02X %02X %02X %5d\n",timestamp,kf,orig_kf,pict_type,s[0],s[1],s[2],s[3],kf-(int)(1000.0*priv->v_pts));
487 } 487 }
488 #endif 488 #endif
489 v_pts=kf*0.001f; 489 v_pts=kf*0.001f;
490 // if(v_pts<priv->v_pts || !kf) v_pts=priv->v_pts+frametime; 490 // if(v_pts<priv->v_pts || !kf) v_pts=priv->v_pts+frametime;
491 priv->v_pts=v_pts; 491 priv->v_pts=v_pts;
533 if (len == -256){ /* EOF */ 533 if (len == -256){ /* EOF */
534 // printf("len==-256!\n"); 534 // printf("len==-256!\n");
535 return 0; 535 return 0;
536 } 536 }
537 if (len < 12){ 537 if (len < 12){
538 printf("%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len); 538 mp_msg(MSGT_DEMUX, MSGL_V,"%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len);
539 printf("bad packet len (%d)\n", len); 539 mp_msg(MSGT_DEMUX, MSGL_WARN,"bad packet len (%d)\n", len);
540 stream_skip(demuxer->stream, len); 540 stream_skip(demuxer->stream, len);
541 continue; //goto loop; 541 continue; //goto loop;
542 } 542 }
543 543
544 stream_id = stream_read_word(demuxer->stream); 544 stream_id = stream_read_word(demuxer->stream);
582 static int cnt2=CRACK_MATRIX; 582 static int cnt2=CRACK_MATRIX;
583 #endif 583 #endif
584 demux_packet_t *dp = new_demux_packet(len); 584 demux_packet_t *dp = new_demux_packet(len);
585 stream_read(demuxer->stream, dp->buffer, len); 585 stream_read(demuxer->stream, dp->buffer, len);
586 #ifdef CRACK_MATRIX 586 #ifdef CRACK_MATRIX
587 printf("*** audio block len=%d\n",len); 587 mp_msg(MSGT_DEMUX, MSGL_V,"*** audio block len=%d\n",len);
588 { // HACK - used for reverse engineering the descrambling matrix 588 { // HACK - used for reverse engineering the descrambling matrix
589 FILE* f=fopen("test.rm","r+"); 589 FILE* f=fopen("test.rm","r+");
590 fseek(f,spos,SEEK_SET); 590 fseek(f,spos,SEEK_SET);
591 ++cnt; 591 ++cnt;
592 // for(i=0;i<len;i++) dp->buffer[i]=i/0x12; 592 // for(i=0;i<len;i++) dp->buffer[i]=i/0x12;
804 ds->asf_packet=dp; 804 ds->asf_packet=dp;
805 len=0; 805 len=0;
806 break; 806 break;
807 } 807 }
808 // whole packet (not fragmented): 808 // whole packet (not fragmented):
809 if (vpkg_length > len) {
810 mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** WARNING: vpkg_length=%i > len=%i ********\n", vpkg_length, len);
811 /*
812 * To keep the video stream rolling, we need to break
813 * here. We shouldn't touch len to make sure rest of the
814 * broken packet is skipped.
815 */
816 break;
817 }
809 dp_hdr->len=vpkg_length; len-=vpkg_length; 818 dp_hdr->len=vpkg_length; len-=vpkg_length;
810 stream_read(demuxer->stream, dp_data, vpkg_length); 819 stream_read(demuxer->stream, dp_data, vpkg_length);
811 if(priv->video_after_seek){ 820 if(priv->video_after_seek){
812 dp->pts=timestamp; 821 dp->pts=timestamp;
813 priv->kf_base = 0; 822 priv->kf_base = 0;
819 ds_add_packet(ds,dp); 828 ds_add_packet(ds,dp);
820 829
821 } // while(len>0) 830 } // while(len>0)
822 831
823 if(len){ 832 if(len){
824 printf("\n******** !!!!!!!! BUG!! len=%d !!!!!!!!!!! ********\n",len); 833 mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** !!!!!!!! BUG!! len=%d !!!!!!!!!!! ********\n",len);
825 if(len>0) stream_skip(demuxer->stream, len); 834 if(len>0) stream_skip(demuxer->stream, len);
826 } 835 }
827 } 836 }
828 if ((unsigned)demuxer->video->id < MAX_STREAMS) 837 if ((unsigned)demuxer->video->id < MAX_STREAMS)
829 while (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id] && 838 while (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id] &&
1230 sh->frametime = 1.0f/sh->fps; 1239 sh->frametime = 1.0f/sh->fps;
1231 1240
1232 #if 1 1241 #if 1
1233 stream_skip(demuxer->stream, 4); 1242 stream_skip(demuxer->stream, 4);
1234 #else 1243 #else
1235 printf("unknown1: 0x%X \n",stream_read_dword(demuxer->stream)); 1244 mp_msg(MSGT_DEMUX, MSGL_V,"unknown1: 0x%X \n",stream_read_dword(demuxer->stream));
1236 printf("unknown2: 0x%X \n",stream_read_word(demuxer->stream)); 1245 mp_msg(MSGT_DEMUX, MSGL_V,"unknown2: 0x%X \n",stream_read_word(demuxer->stream));
1237 printf("unknown3: 0x%X \n",stream_read_word(demuxer->stream)); 1246 mp_msg(MSGT_DEMUX, MSGL_V,"unknown3: 0x%X \n",stream_read_word(demuxer->stream));
1238 #endif 1247 #endif
1239 // if(sh->format==0x30335652 || sh->format==0x30325652 ) 1248 // if(sh->format==0x30335652 || sh->format==0x30325652 )
1240 if(1) 1249 if(1)
1241 { 1250 {
1242 int tmp=stream_read_word(demuxer->stream); 1251 int tmp=stream_read_word(demuxer->stream);
1243 if(tmp>0){ 1252 if(tmp>0){
1244 sh->fps=tmp; sh->frametime = 1.0f/sh->fps; 1253 sh->fps=tmp; sh->frametime = 1.0f/sh->fps;
1245 } 1254 }
1246 } else { 1255 } else {
1247 int fps=stream_read_word(demuxer->stream); 1256 int fps=stream_read_word(demuxer->stream);
1248 printf("realvid: ignoring FPS = %d\n",fps); 1257 mp_msg(MSGT_DEMUX, MSGL_WARN,"realvid: ignoring FPS = %d\n",fps);
1249 } 1258 }
1250 stream_skip(demuxer->stream, 2); 1259 stream_skip(demuxer->stream, 2);
1251 1260
1252 // read codec sub-format (to make difference between low and high rate codec) 1261 // read codec sub-format (to make difference between low and high rate codec)
1253 ((unsigned int*)(sh->bih+1))[0]=stream_read_dword(demuxer->stream); 1262 ((unsigned int*)(sh->bih+1))[0]=stream_read_dword(demuxer->stream);
1309 tmp = stream_tell(demuxer->stream) - codec_pos; 1318 tmp = stream_tell(demuxer->stream) - codec_pos;
1310 mp_msg(MSGT_DEMUX,MSGL_V,"### skipping %d bytes of codec info\n", codec_data_size - tmp); 1319 mp_msg(MSGT_DEMUX,MSGL_V,"### skipping %d bytes of codec info\n", codec_data_size - tmp);
1311 #if 0 1320 #if 0
1312 { int i; 1321 { int i;
1313 for(i=0;i<codec_data_size - tmp;i++) 1322 for(i=0;i<codec_data_size - tmp;i++)
1314 printf(" %02X",stream_read_char(demuxer->stream)); 1323 mp_msg(MSGT_DEMUX, MSGL_V," %02X",stream_read_char(demuxer->stream));
1315 printf("\n"); 1324 mp_msg(MSGT_DEMUX, MSGL_V,"\n");
1316 } 1325 }
1317 #else 1326 #else
1318 stream_skip(demuxer->stream, codec_data_size - tmp); 1327 stream_skip(demuxer->stream, codec_data_size - tmp);
1319 #endif 1328 #endif
1320 break; 1329 break;