Hello guys,
I want to know How to recognize the NAL unit in a H265 byte stream after H265 hardware encoding in C or C++ programming. The NALU will be the RTP package input.
Hello guys,
I want to know How to recognize the NAL unit in a H265 byte stream after H265 hardware encoding in C or C++ programming. The NALU will be the RTP package input.
Hi,
Please refer to read_decoder_input_nalu() in 00_video_decode:
/usr/src/jetson_multimedia_api/samples/00_video_decode
Thank you very much for your reply, I have a look at the example 00_video_decode, but I can’t understand the function “read_decoder_input_nalu()”, do you have a flow chart or some explanation to show how the function to get each nalu from a encoded bitstream?
Thank you very much.
Hi,
Each NAL begins with start code 0x00000001 or 0x000001. The macros look for the start code:
#define IS_NAL_UNIT_START(buffer_ptr) (!buffer_ptr[0] && !buffer_ptr[1] && \
!buffer_ptr[2] && (buffer_ptr[3] == 1))
#define IS_NAL_UNIT_START1(buffer_ptr) (!buffer_ptr[0] && !buffer_ptr[1] && \
(buffer_ptr[2] == 1))
The next byte contains type of the NAL. For H264, need to read value of (the byte & 0x1f) to get the type:
/*
enum Nal_Unit_Type
{
NAL_UNIT_EXTERNAL = 0,
NAL_UNIT_CODED_SLICE = 1,
NAL_UNIT_CODED_SLICE_DATAPART_A = 2,
NAL_UNIT_CODED_SLICE_DATAPART_B = 3,
NAL_UNIT_CODED_SLICE_DATAPART_C = 4,
NAL_UNIT_CODED_SLICE_IDR = 5,
NAL_UNIT_SEI = 6,
NAL_UNIT_SPS = 7,
NAL_UNIT_PPS = 8,
NAL_UNIT_ACCESS_UNIT_DELIMITER = 9,
NAL_UNIT_END_OF_SEQUENCE = 10,
NAL_UNIT_END_OF_STREAM = 11,
NAL_UNIT_FILLER_DATA = 12,
NAL_UNIT_SUBSET_SPS = 15,
NAL_UNIT_CODED_SLICE_PREFIX = 14,
NAL_UNIT_CODED_SLICE_SCALABLE = 20,
NAL_UNIT_CODED_SLICE_IDR_SCALABLE = 21
};
*/
Hi,
For H265, need to read
#define GET_H265_NAL_UNIT_TYPE(buffer_ptr) ((buffer_ptr[0] & 0x7E) >> 1)
The table is
/**
* Table 7-3: NAL unit type codes
*/
enum HEVCNALUnitType {
HEVC_NAL_TRAIL_N = 0,
HEVC_NAL_TRAIL_R = 1,
HEVC_NAL_TSA_N = 2,
HEVC_NAL_TSA_R = 3,
HEVC_NAL_STSA_N = 4,
HEVC_NAL_STSA_R = 5,
HEVC_NAL_RADL_N = 6,
HEVC_NAL_RADL_R = 7,
HEVC_NAL_RASL_N = 8,
HEVC_NAL_RASL_R = 9,
HEVC_NAL_BLA_W_LP = 16,
HEVC_NAL_BLA_W_RADL = 17,
HEVC_NAL_BLA_N_LP = 18,
HEVC_NAL_IDR_W_RADL = 19,
HEVC_NAL_IDR_N_LP = 20,
HEVC_NAL_CRA_NUT = 21,
HEVC_NAL_VPS = 32,
HEVC_NAL_SPS = 33,
HEVC_NAL_PPS = 34,
HEVC_NAL_AUD = 35,
HEVC_NAL_EOS_NUT = 36,
HEVC_NAL_EOB_NUT = 37,
HEVC_NAL_FD_NUT = 38,
HEVC_NAL_SEI_PREFIX = 39,
HEVC_NAL_SEI_SUFFIX = 40,
};
Thank you very much