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