| 3021 | } |
| 3022 | |
| 3023 | static int parse_pes_header( |
| 3024 | hb_stream_t *stream, |
| 3025 | bitbuf_t *bb, |
| 3026 | hb_pes_info_t *pes_info ) |
| 3027 | { |
| 3028 | if ( bits_bytes_left(bb) < 6 ) |
| 3029 | { |
| 3030 | return 0; |
| 3031 | } |
| 3032 | |
| 3033 | bits_skip(bb, 8 * 4); |
| 3034 | pes_info->packet_len = bits_get(bb, 16); |
| 3035 | pes_info->stuffing_len = 0; |
| 3036 | |
| 3037 | /* |
| 3038 | * This would normally be an error. But the decoders can generally |
| 3039 | * recover well from missing data. So let the packet pass. |
| 3040 | if ( bits_bytes_left(bb) < pes_info->packet_len ) |
| 3041 | { |
| 3042 | return 0; |
| 3043 | } |
| 3044 | */ |
| 3045 | |
| 3046 | int mark = bits_peek(bb, 2); |
| 3047 | if ( mark == 0x02 ) |
| 3048 | { |
| 3049 | // mpeg2 pes |
| 3050 | if ( bits_bytes_left(bb) < 3 ) |
| 3051 | { |
| 3052 | return 0; |
| 3053 | } |
| 3054 | |
| 3055 | /* |
| 3056 | bits_skip(bb, 2); |
| 3057 | bits_get(bb, 2); // scrambling |
| 3058 | bits_get(bb, 1); // priority |
| 3059 | bits_get(bb, 1); // alignment |
| 3060 | bits_get(bb, 1); // copyright |
| 3061 | bits_get(bb, 1); // original |
| 3062 | */ |
| 3063 | bits_get(bb, 8); // skip all of the above |
| 3064 | |
| 3065 | int has_pts = bits_get(bb, 2); |
| 3066 | int has_escr = bits_get(bb, 1); |
| 3067 | int has_esrate = bits_get(bb, 1); |
| 3068 | int has_dsm = bits_get(bb, 1); |
| 3069 | int has_copy_info = bits_get(bb, 1); |
| 3070 | int has_crc = bits_get(bb, 1); |
| 3071 | int has_ext = bits_get(bb, 1); |
| 3072 | int hdr_len = pes_info->header_len = bits_get(bb, 8); |
| 3073 | pes_info->header_len += bb->pos >> 3; |
| 3074 | |
| 3075 | bitbuf_t bb_hdr; |
| 3076 | bits_clone(&bb_hdr, bb, hdr_len); |
| 3077 | |
| 3078 | if ( bits_bytes_left(&bb_hdr) < hdr_len ) |
| 3079 | { |
| 3080 | return 0; |
no test coverage detected