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*)&reg_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 }