Mercurial > libavformat.hg
comparison mpegts.c @ 4981:5b710f5c8a53 libavformat
simplify and merge
author | bcoudurier |
---|---|
date | Sun, 31 May 2009 03:35:29 +0000 |
parents | 3f9b378936f2 |
children | dc217282e78b |
comparison
equal
deleted
inserted
replaced
4980:3f9b378936f2 | 4981:5b710f5c8a53 |
---|---|
531 return; | 531 return; |
532 } | 532 } |
533 } | 533 } |
534 } | 534 } |
535 | 535 |
536 static AVStream *new_pes_av_stream(PESContext *pes, uint32_t code, | 536 static AVStream *new_pes_av_stream(PESContext *pes, uint32_t prog_reg_desc) |
537 uint32_t prog_reg_desc, uint32_t reg_desc) | |
538 { | 537 { |
539 AVStream *st = av_new_stream(pes->stream, pes->pid); | 538 AVStream *st = av_new_stream(pes->stream, pes->pid); |
540 | 539 |
541 if (!st) | 540 if (!st) |
542 return NULL; | 541 return NULL; |
546 st->codec->codec_type = CODEC_TYPE_DATA; | 545 st->codec->codec_type = CODEC_TYPE_DATA; |
547 st->codec->codec_id = CODEC_ID_PROBE; | 546 st->codec->codec_id = CODEC_ID_PROBE; |
548 st->need_parsing = AVSTREAM_PARSE_FULL; | 547 st->need_parsing = AVSTREAM_PARSE_FULL; |
549 pes->st = st; | 548 pes->st = st; |
550 | 549 |
551 dprintf(pes->stream, "stream_type=%x prog_reg_desc=%.4s reg_desc=%.4s\n", | 550 dprintf(pes->stream, "stream_type=%x pid=%x prog_reg_desc=%.4s\n", |
552 pes->stream_type, (char*)&prog_reg_desc, (char*)®_desc); | 551 pes->stream_type, pes->pid, (char*)&prog_reg_desc); |
553 | 552 |
554 if (pes->stream_type == 0x06) { // private data carrying pes data | |
555 mpegts_find_stream_type(st, reg_desc, REGD_types); | |
556 } else { | |
557 mpegts_find_stream_type(st, pes->stream_type, ISO_types); | 553 mpegts_find_stream_type(st, pes->stream_type, ISO_types); |
558 if (prog_reg_desc == AV_RL32("HDMV") && | 554 if (prog_reg_desc == AV_RL32("HDMV") && |
559 st->codec->codec_id == CODEC_ID_PROBE) | 555 st->codec->codec_id == CODEC_ID_PROBE) |
560 mpegts_find_stream_type(st, pes->stream_type, HDMV_types); | 556 mpegts_find_stream_type(st, pes->stream_type, HDMV_types); |
561 if (st->codec->codec_id == CODEC_ID_PROBE) | 557 if (st->codec->codec_id == CODEC_ID_PROBE) |
562 mpegts_find_stream_type(st, pes->stream_type, MISC_types); | 558 mpegts_find_stream_type(st, pes->stream_type, MISC_types); |
563 } | |
564 | 559 |
565 return st; | 560 return st; |
566 } | 561 } |
567 | 562 |
568 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) | 563 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
622 } | 617 } |
623 p += program_info_length; | 618 p += program_info_length; |
624 if (p >= p_end) | 619 if (p >= p_end) |
625 return; | 620 return; |
626 for(;;) { | 621 for(;;) { |
627 reg_desc = 0; | |
628 language[0] = 0; | |
629 st = 0; | 622 st = 0; |
630 stream_type = get8(&p, p_end); | 623 stream_type = get8(&p, p_end); |
631 if (stream_type < 0) | 624 if (stream_type < 0) |
632 break; | 625 break; |
633 pid = get16(&p, p_end) & 0x1fff; | 626 pid = get16(&p, p_end) & 0x1fff; |
634 if (pid < 0) | 627 if (pid < 0) |
635 break; | 628 break; |
629 | |
630 /* now create ffmpeg stream */ | |
631 if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) { | |
632 pes = ts->pids[pid]->u.pes_filter.opaque; | |
633 st = pes->st; | |
634 } else { | |
635 if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably | |
636 pes = add_pes_stream(ts, pid, pcr_pid, stream_type); | |
637 if (pes) | |
638 st = new_pes_av_stream(pes, prog_reg_desc); | |
639 } | |
640 | |
641 if (!st) | |
642 return; | |
643 | |
644 add_pid_to_pmt(ts, h->id, pid); | |
645 | |
646 av_program_add_stream_index(ts->stream, h->id, st->index); | |
647 | |
636 desc_list_len = get16(&p, p_end) & 0xfff; | 648 desc_list_len = get16(&p, p_end) & 0xfff; |
637 if (desc_list_len < 0) | 649 if (desc_list_len < 0) |
638 break; | 650 break; |
639 desc_list_end = p + desc_list_len; | 651 desc_list_end = p + desc_list_len; |
640 if (desc_list_end > p_end) | 652 if (desc_list_end > p_end) |
641 break; | 653 break; |
642 for(;;) { | 654 for(;;) { |
643 desc_tag = get8(&p, desc_list_end); | 655 desc_tag = get8(&p, desc_list_end); |
644 if (desc_tag < 0) | 656 if (desc_tag < 0) |
645 break; | 657 break; |
646 if (stream_type == STREAM_TYPE_PRIVATE_DATA) { | |
647 if((desc_tag == 0x6A) || (desc_tag == 0x7A)) { | |
648 /*assume DVB AC-3 Audio*/ | |
649 stream_type = STREAM_TYPE_AUDIO_AC3; | |
650 } else if(desc_tag == 0x7B) { | |
651 /* DVB DTS audio */ | |
652 stream_type = STREAM_TYPE_AUDIO_DTS; | |
653 } | |
654 } | |
655 desc_len = get8(&p, desc_list_end); | 658 desc_len = get8(&p, desc_list_end); |
656 if (desc_len < 0) | 659 if (desc_len < 0) |
657 break; | 660 break; |
658 desc_end = p + desc_len; | 661 desc_end = p + desc_len; |
659 if (desc_end > desc_list_end) | 662 if (desc_end > desc_list_end) |
661 | 664 |
662 dprintf(ts->stream, "tag: 0x%02x len=%d\n", | 665 dprintf(ts->stream, "tag: 0x%02x len=%d\n", |
663 desc_tag, desc_len); | 666 desc_tag, desc_len); |
664 | 667 |
665 switch(desc_tag) { | 668 switch(desc_tag) { |
669 case 0x6a: /* AC-3 descriptor */ | |
670 case 0x7a: /* AC-3 descriptor */ | |
671 st->codec->codec_type = CODEC_TYPE_AUDIO; | |
672 st->codec->codec_id = CODEC_ID_AC3; | |
673 break; | |
674 case 0x7b: | |
675 st->codec->codec_type = CODEC_TYPE_AUDIO; | |
676 st->codec->codec_id = CODEC_ID_DTS; | |
677 break; | |
666 case 0x59: /* subtitling descriptor */ | 678 case 0x59: /* subtitling descriptor */ |
667 if (stream_type == STREAM_TYPE_PRIVATE_DATA) | 679 if (stream_type == STREAM_TYPE_PRIVATE_DATA) { |
668 stream_type = 0x100; // demuxer internal | 680 st->codec->codec_type = CODEC_TYPE_SUBTITLE; |
669 | 681 st->codec->codec_id = CODEC_ID_DVB_SUBTITLE; |
682 } | |
670 language[0] = get8(&p, desc_end); | 683 language[0] = get8(&p, desc_end); |
671 language[1] = get8(&p, desc_end); | 684 language[1] = get8(&p, desc_end); |
672 language[2] = get8(&p, desc_end); | 685 language[2] = get8(&p, desc_end); |
673 language[3] = 0; | 686 language[3] = 0; |
674 get8(&p, desc_end); | 687 get8(&p, desc_end); |
675 comp_page = get16(&p, desc_end); | 688 comp_page = get16(&p, desc_end); |
676 anc_page = get16(&p, desc_end); | 689 anc_page = get16(&p, desc_end); |
677 | 690 st->codec->sub_id = (anc_page << 16) | comp_page; |
691 av_metadata_set(&st->metadata, "language", language); | |
678 break; | 692 break; |
679 case 0x0a: /* ISO 639 language descriptor */ | 693 case 0x0a: /* ISO 639 language descriptor */ |
680 language[0] = get8(&p, desc_end); | 694 language[0] = get8(&p, desc_end); |
681 language[1] = get8(&p, desc_end); | 695 language[1] = get8(&p, desc_end); |
682 language[2] = get8(&p, desc_end); | 696 language[2] = get8(&p, desc_end); |
683 language[3] = 0; | 697 language[3] = 0; |
698 av_metadata_set(&st->metadata, "language", language); | |
684 break; | 699 break; |
685 case 0x05: /* registration descriptor */ | 700 case 0x05: /* registration descriptor */ |
686 reg_desc = bytestream_get_le32(&p); | 701 reg_desc = bytestream_get_le32(&p); |
702 if (st->codec->codec_id == CODEC_ID_PROBE && | |
703 stream_type == STREAM_TYPE_PRIVATE_DATA) | |
704 mpegts_find_stream_type(st, reg_desc, REGD_types); | |
687 break; | 705 break; |
688 default: | 706 default: |
689 break; | 707 break; |
690 } | 708 } |
691 p = desc_end; | 709 p = desc_end; |
692 } | 710 } |
693 p = desc_list_end; | 711 p = desc_list_end; |
694 | |
695 dprintf(ts->stream, "stream_type=%x pid=0x%x\n", | |
696 stream_type, pid); | |
697 | |
698 /* now create ffmpeg stream */ | |
699 if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) { | |
700 pes= ts->pids[pid]->u.pes_filter.opaque; | |
701 st= pes->st; | |
702 } else { | |
703 if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably | |
704 pes = add_pes_stream(ts, pid, pcr_pid, stream_type); | |
705 if (pes) | |
706 st = new_pes_av_stream(pes, 0, prog_reg_desc, reg_desc); | |
707 } | |
708 | |
709 add_pid_to_pmt(ts, h->id, pid); | |
710 | |
711 if(st) { | |
712 av_program_add_stream_index(ts->stream, h->id, st->index); | |
713 | |
714 if (language[0] != 0) | |
715 av_metadata_set(&st->metadata, "language", language); | |
716 | |
717 if (stream_type == 0x100) | |
718 st->codec->sub_id = (anc_page << 16) | comp_page; | |
719 } | |
720 } | 712 } |
721 /* all parameters are there */ | 713 /* all parameters are there */ |
722 ts->stop_parse++; | 714 ts->stop_parse++; |
723 mpegts_close_filter(ts, filter); | 715 mpegts_close_filter(ts, filter); |
724 } | 716 } |