67 lines
1.1 KiB
C++
67 lines
1.1 KiB
C++
#ifndef _hls_h264_h_
|
|
#define _hls_h264_h_
|
|
|
|
#include <inttypes.h>
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
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_ */
|