| 3790 | } |
| 3791 | |
| 3792 | static int decode_ps_map( hb_stream_t * stream, uint8_t *buf, int len ) |
| 3793 | { |
| 3794 | int retval = 1; |
| 3795 | bitbuf_t bb; |
| 3796 | bits_init(&bb, buf, len, 0); |
| 3797 | |
| 3798 | if ( bits_bytes_left(&bb) < 10 ) |
| 3799 | return 0; |
| 3800 | |
| 3801 | // Skip stuff not needed |
| 3802 | bits_skip(&bb, 8 * 8); |
| 3803 | int info_len = bits_get(&bb, 16); |
| 3804 | if ( bits_bytes_left(&bb) < info_len ) |
| 3805 | return 0; |
| 3806 | |
| 3807 | if ( info_len ) |
| 3808 | { |
| 3809 | bitbuf_t cc; |
| 3810 | bits_clone( &cc, &bb, info_len ); |
| 3811 | |
| 3812 | while ( bits_bytes_left(&cc) >= 2 ) |
| 3813 | { |
| 3814 | uint8_t tag, len; |
| 3815 | |
| 3816 | tag = bits_get(&cc, 8); |
| 3817 | len = bits_get(&cc, 8); |
| 3818 | if ( bits_bytes_left(&cc) < len ) |
| 3819 | return 0; |
| 3820 | |
| 3821 | if (tag == 0x05 && len >= 4) |
| 3822 | { |
| 3823 | // registration descriptor |
| 3824 | stream->reg_desc = bits_get(&cc, 32); |
| 3825 | bits_skip(&cc, 8 * (len - 4)); |
| 3826 | } |
| 3827 | else |
| 3828 | { |
| 3829 | bits_skip(&cc, 8 * len); |
| 3830 | } |
| 3831 | } |
| 3832 | bits_skip(&bb, 8 * info_len); |
| 3833 | } |
| 3834 | |
| 3835 | int map_len = bits_get(&bb, 16); |
| 3836 | if ( bits_bytes_left(&bb) < map_len ) |
| 3837 | return 0; |
| 3838 | |
| 3839 | // Process the map |
| 3840 | int ii = 0; |
| 3841 | while ( bits_bytes_left(&bb) >= 8 ) |
| 3842 | { |
| 3843 | int pes_idx; |
| 3844 | int stream_type = bits_get(&bb, 8); |
| 3845 | int stream_id = bits_get(&bb, 8); |
| 3846 | info_len = bits_get(&bb, 16); |
| 3847 | if ( info_len > bits_bytes_left(&bb) ) |
| 3848 | return 0; |
| 3849 |
no test coverage detected