| 529 | #define RAW_PACKET_SIZE 1000 |
| 530 | |
| 531 | static int sync(AVFormatContext *s, int64_t *timestamp, int *flags, int *stream_index, int64_t *pos){ |
| 532 | RMDemuxContext *rm = s->priv_data; |
| 533 | ByteIOContext *pb = s->pb; |
| 534 | AVStream *st; |
| 535 | uint32_t state=0xFFFFFFFF; |
| 536 | |
| 537 | while(!url_feof(pb)){ |
| 538 | int len, num, i; |
| 539 | *pos= url_ftell(pb) - 3; |
| 540 | if(rm->remaining_len > 0){ |
| 541 | num= rm->current_stream; |
| 542 | len= rm->remaining_len; |
| 543 | *timestamp = AV_NOPTS_VALUE; |
| 544 | *flags= 0; |
| 545 | }else{ |
| 546 | state= (state<<8) + get_byte(pb); |
| 547 | |
| 548 | if(state == MKBETAG('I', 'N', 'D', 'X')){ |
| 549 | int n_pkts, expected_len; |
| 550 | len = get_be32(pb); |
| 551 | url_fskip(pb, 2); |
| 552 | n_pkts = get_be32(pb); |
| 553 | expected_len = 20 + n_pkts * 14; |
| 554 | if (len == 20) |
| 555 | /* some files don't add index entries to chunk size... */ |
| 556 | len = expected_len; |
| 557 | else if (len != expected_len) |
| 558 | av_log(s, AV_LOG_WARNING, |
| 559 | "Index size %d (%d pkts) is wrong, should be %d.\n", |
| 560 | len, n_pkts, expected_len); |
| 561 | len -= 14; // we already read part of the index header |
| 562 | if(len<0) |
| 563 | continue; |
| 564 | goto skip; |
| 565 | } else if (state == MKBETAG('D','A','T','A')) { |
| 566 | av_log(s, AV_LOG_WARNING, |
| 567 | "DATA tag in middle of chunk, file may be broken.\n"); |
| 568 | } |
| 569 | |
| 570 | if(state > (unsigned)0xFFFF || state <= 12) |
| 571 | continue; |
| 572 | len=state - 12; |
| 573 | state= 0xFFFFFFFF; |
| 574 | |
| 575 | num = get_be16(pb); |
| 576 | *timestamp = get_be32(pb); |
| 577 | get_byte(pb); /* reserved */ |
| 578 | *flags = get_byte(pb); /* flags */ |
| 579 | } |
| 580 | for(i=0;i<s->nb_streams;i++) { |
| 581 | st = s->streams[i]; |
| 582 | if (num == st->id) |
| 583 | break; |
| 584 | } |
| 585 | if (i == s->nb_streams) { |
| 586 | skip: |
| 587 | /* skip packet if unknown number */ |
| 588 | url_fskip(pb, len); |