stream-deploy/ZLM/3rdpart/media-server/libhls/source/hls-h264.h

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_ */