| 2737 | } |
| 2738 | |
| 2739 | int decode_program_map(hb_stream_t* stream) |
| 2740 | { |
| 2741 | bitbuf_t bb; |
| 2742 | bits_init(&bb, stream->pmt_info.tablebuf, stream->pmt_info.tablepos, 0); |
| 2743 | |
| 2744 | bits_get(&bb, 8); // table_id |
| 2745 | bits_get(&bb, 4); |
| 2746 | unsigned int section_length = bits_get(&bb, 12); |
| 2747 | |
| 2748 | bits_get(&bb, 16); // program number |
| 2749 | bits_get(&bb, 2); |
| 2750 | bits_get(&bb, 5); // version_number |
| 2751 | bits_get(&bb, 1); |
| 2752 | bits_get(&bb, 8); // section_number |
| 2753 | bits_get(&bb, 8); // last_section_number |
| 2754 | bits_get(&bb, 3); |
| 2755 | stream->pmt_info.PCR_PID = bits_get(&bb, 13); |
| 2756 | bits_get(&bb, 4); |
| 2757 | int program_info_length = bits_get(&bb, 12); |
| 2758 | int i; |
| 2759 | for (i = 0; i < program_info_length - 2; ) |
| 2760 | { |
| 2761 | uint8_t tag, len; |
| 2762 | tag = bits_get(&bb, 8); |
| 2763 | len = bits_get(&bb, 8); |
| 2764 | i += 2; |
| 2765 | if ( i + len > program_info_length ) |
| 2766 | { |
| 2767 | break; |
| 2768 | } |
| 2769 | if (tag == 0x05 && len >= 4) |
| 2770 | { |
| 2771 | // registration descriptor |
| 2772 | stream->reg_desc = bits_get(&bb, 32); |
| 2773 | i += 4; |
| 2774 | len -= 4; |
| 2775 | } |
| 2776 | int j; |
| 2777 | for ( j = 0; j < len; j++ ) |
| 2778 | { |
| 2779 | bits_get(&bb, 8); |
| 2780 | } |
| 2781 | i += len; |
| 2782 | } |
| 2783 | for ( ; i < program_info_length; i++ ) |
| 2784 | { |
| 2785 | bits_get(&bb, 8); |
| 2786 | } |
| 2787 | |
| 2788 | int cur_pos = 9 /* data after the section length field*/ + program_info_length; |
| 2789 | int done_reading_stream_types = 0; |
| 2790 | int ii = 0; |
| 2791 | while (!done_reading_stream_types) |
| 2792 | { |
| 2793 | unsigned char stream_type = bits_get(&bb, 8); |
| 2794 | bits_get(&bb, 3); |
| 2795 | unsigned int elementary_PID = bits_get(&bb, 13); |
| 2796 | bits_get(&bb, 4); |
no test coverage detected