comparison parser.c @ 2470:06aafb585f69 libavcodec

require a few valid and equal mp3 headers for resync
author michael
date Sat, 29 Jan 2005 23:59:32 +0000
parents 429c1eedeee9
children 5252700f61df
comparison
equal deleted inserted replaced
2469:df02930c138b 2470:06aafb585f69
492 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */ 492 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
493 uint8_t *inbuf_ptr; 493 uint8_t *inbuf_ptr;
494 int frame_size; 494 int frame_size;
495 int free_format_frame_size; 495 int free_format_frame_size;
496 int free_format_next_header; 496 int free_format_next_header;
497 uint32_t header;
498 int header_count;
497 } MpegAudioParseContext; 499 } MpegAudioParseContext;
498 500
499 #define MPA_HEADER_SIZE 4 501 #define MPA_HEADER_SIZE 4
500 502
501 /* header + layer + bitrate + freq + lsf/mpeg25 */ 503 /* header + layer + bitrate + freq + lsf/mpeg25 */
513 AVCodecContext *avctx, 515 AVCodecContext *avctx,
514 uint8_t **poutbuf, int *poutbuf_size, 516 uint8_t **poutbuf, int *poutbuf_size,
515 const uint8_t *buf, int buf_size) 517 const uint8_t *buf, int buf_size)
516 { 518 {
517 MpegAudioParseContext *s = s1->priv_data; 519 MpegAudioParseContext *s = s1->priv_data;
518 int len, ret; 520 int len, ret, sr;
519 uint32_t header; 521 uint32_t header;
520 const uint8_t *buf_ptr; 522 const uint8_t *buf_ptr;
521 523
522 *poutbuf = NULL; 524 *poutbuf = NULL;
523 *poutbuf_size = 0; 525 *poutbuf_size = 0;
547 buf_size -= len; 549 buf_size -= len;
548 s->inbuf_ptr += len; 550 s->inbuf_ptr += len;
549 } 551 }
550 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) { 552 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
551 got_header: 553 got_header:
554 sr= avctx->sample_rate;
552 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) | 555 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
553 (s->inbuf[2] << 8) | s->inbuf[3]; 556 (s->inbuf[2] << 8) | s->inbuf[3];
554 557
555 ret = mpa_decode_header(avctx, header); 558 ret = mpa_decode_header(avctx, header);
556 if (ret < 0) { 559 if (ret < 0) {
560 s->header_count= -2;
557 /* no sync found : move by one byte (inefficient, but simple!) */ 561 /* no sync found : move by one byte (inefficient, but simple!) */
558 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); 562 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
559 s->inbuf_ptr--; 563 s->inbuf_ptr--;
560 dprintf("skip %x\n", header); 564 dprintf("skip %x\n", header);
561 /* reset free format frame size to give a chance 565 /* reset free format frame size to give a chance
562 to get a new bitrate */ 566 to get a new bitrate */
563 s->free_format_frame_size = 0; 567 s->free_format_frame_size = 0;
564 } else { 568 } else {
569 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
570 s->header_count= -3;
571 s->header= header;
572 s->header_count++;
565 s->frame_size = ret; 573 s->frame_size = ret;
574
566 #if 0 575 #if 0
567 /* free format: prepare to compute frame size */ 576 /* free format: prepare to compute frame size */
568 if (decode_header(s, header) == 1) { 577 if (decode_header(s, header) == 1) {
569 s->frame_size = -1; 578 s->frame_size = -1;
570 } 579 }
571 #endif 580 #endif
572 } 581 }
582 if(s->header_count <= 0)
583 avctx->sample_rate= sr; //FIXME ugly
573 } 584 }
574 } else 585 } else
575 #if 0 586 #if 0
576 if (s->frame_size == -1) { 587 if (s->frame_size == -1) {
577 /* free format : find next sync to compute frame size */ 588 /* free format : find next sync to compute frame size */
640 buf_size -= len; 651 buf_size -= len;
641 } 652 }
642 // next_data: 653 // next_data:
643 if (s->frame_size > 0 && 654 if (s->frame_size > 0 &&
644 (s->inbuf_ptr - s->inbuf) >= s->frame_size) { 655 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
645 *poutbuf = s->inbuf; 656 if(s->header_count > 0){
646 *poutbuf_size = s->inbuf_ptr - s->inbuf; 657 *poutbuf = s->inbuf;
658 *poutbuf_size = s->inbuf_ptr - s->inbuf;
659 }
647 s->inbuf_ptr = s->inbuf; 660 s->inbuf_ptr = s->inbuf;
648 s->frame_size = 0; 661 s->frame_size = 0;
649 break; 662 break;
650 } 663 }
651 } 664 }