#ifndef _hls_h264_h_ #define _hls_h264_h_ #include #include #include static inline const uint8_t* h264_startcode(const uint8_t *data, size_t bytes) { size_t i; for (i = 2; i + 1 < bytes; i++) { if (0x01 == data[i] && 0x00 == data[i - 1] && 0x00 == data[i - 2]) return data + i + 1; } return NULL; } static inline uint8_t h264_idr(const uint8_t *data, size_t bytes) { uint8_t naltype; const uint8_t *p; do { p = h264_startcode(data, bytes); if (p) { naltype = p[0] & 0x1f; // 1: no-IDR slice // 2: A-slice // 3: B-slice // 4: C-slice // 5: IDR frame if (naltype > 0 && naltype < 6) { return 5 == naltype ? 1 : 0; } bytes -= p - data; data = p; } } while (p); return 0; } static inline int h265_irap(const uint8_t* p, size_t bytes) { size_t i; uint8_t type; for (i = 2; i + 1 < bytes; i++) { if (0x01 == p[i] && 0x00 == p[i - 1] && 0x00 == p[i - 2]) { type = (p[i + 1] >> 1) & 0x3f; if (type < 32) return (16 <= type && type <= 23) ? 1 : 0; } } return 0; } #endif /* !_hls_h264_h_ */