/* nal_units.h
*
* Copyright (c) 2003-2025 HandBrake Team
* This file is part of the HandBrake source code.
* Homepage: .
* It may be used under the terms of the GNU General Public License v2.
* For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
*/
#ifndef HANDBRAKE_NAL_UNITS_H
#define HANDBRAKE_NAL_UNITS_H
#include
#include "handbrake/common.h"
/*
* Write a NAL unit of the specified size to the provided
* output buffer, using the requested output format.
* Returns the amount (in bytes) of data written to the buffer.
*
* The provided NAL unit must start with the NAL unit header.
*
* Note: the buffer is assumed to be large enough to hold the NAL unit
* as well as any additional data the function may prepend/append to it.
*
* The caller may check the minimum required buffer size by passing a
* NULL buffer to the function and checking the returned size value.
*/
size_t hb_nal_unit_write_annexb(uint8_t *buf, const uint8_t *nal_unit, const size_t nal_unit_size);
size_t hb_nal_unit_write_isomp4(uint8_t *buf, const uint8_t *nal_unit, const size_t nal_unit_size);
/*
* Search the provided data buffer for NAL units in Annex B format.
*
* Returns a pointer to the start (start code prefix excluded) of the
* first NAL unit found, or NULL if no NAL units were found in the buffer.
*
* On input, size holds the length of the provided data buffer.
* On output, size holds the length of the returned NAL unit.
*/
uint8_t* hb_annexb_find_next_nalu(const uint8_t *start, size_t *size);
/*
* Search the provided data buffer for NAL units.
*
* Returns a pointer to the start of the first NAL unit found,
* or NULL if no NAL units were found in the buffer.
*
* On input, size holds the length of the provided data buffer.
* On output, size holds the length of the returned NAL unit.
*/
uint8_t* hb_isomp4_find_next_nalu(const uint8_t *start, size_t *size, const uint8_t nal_length_size);
/*
* Returns a newly-allocated buffer holding a copy of the provided
* NAL unit bitstream data, converted to the requested format.
*/
hb_buffer_t* hb_nal_bitstream_annexb_to_mp4(const uint8_t *data, const size_t size);
hb_buffer_t* hb_nal_bitstream_mp4_to_annexb(const uint8_t *data, const size_t size, const uint8_t nal_length_size);
typedef enum
{
HB_HEVC_NAL_UNIT_CODED_SLICE_TRAIL_N = 0,
HB_HEVC_NAL_UNIT_CODED_SLICE_TRAIL_R,
HB_HEVC_NAL_UNIT_CODED_SLICE_TSA_N,
HB_HEVC_NAL_UNIT_CODED_SLICE_TSA_R,
HB_HEVC_NAL_UNIT_CODED_SLICE_STSA_N,
HB_HEVC_NAL_UNIT_CODED_SLICE_STSA_R,
HB_HEVC_NAL_UNIT_CODED_SLICE_RADL_N,
HB_HEVC_NAL_UNIT_CODED_SLICE_RADL_R,
HB_HEVC_NAL_UNIT_CODED_SLICE_RASL_N,
HB_HEVC_NAL_UNIT_CODED_SLICE_RASL_R,
HB_HEVC_NAL_UNIT_CODED_SLICE_BLA_W_LP = 16,
HB_HEVC_NAL_UNIT_CODED_SLICE_BLA_W_RADL,
HB_HEVC_NAL_UNIT_CODED_SLICE_BLA_N_LP,
HB_HEVC_NAL_UNIT_CODED_SLICE_IDR_W_RADL,
HB_HEVC_NAL_UNIT_CODED_SLICE_IDR_N_LP,
HB_HEVC_NAL_UNIT_CODED_SLICE_CRA,
HB_HEVC_NAL_UNIT_VPS = 32,
HB_HEVC_NAL_UNIT_SPS,
HB_HEVC_NAL_UNIT_PPS,
HB_HEVC_NAL_UNIT_ACCESS_UNIT_DELIMITER,
HB_HEVC_NAL_UNIT_EOS,
HB_HEVC_NAL_UNIT_EOB,
HB_HEVC_NAL_UNIT_FILLER_DATA,
HB_HEVC_NAL_UNIT_PREFIX_SEI,
HB_HEVC_NAL_UNIT_SUFFIX_SEI,
HB_HEVC_NAL_UNIT_UNSPECIFIED = 62,
HB_HEVC_NAL_UNIT_INVALID = 64,
} hb_nal_type_t;
typedef enum
{
HB_BUFFERING_PERIOD = 0,
HB_PICTURE_TIMING = 1,
HB_PAN_SCAN_RECT = 2,
HB_FILLER_PAYLOAD = 3,
HB_USER_DATA_REGISTERED_ITU_T_T35 = 4,
HB_USER_DATA_UNREGISTERED = 5,
HB_RECOVERY_POINT = 6,
HB_SCENE_INFO = 9,
HB_FULL_FRAME_SNAPSHOT = 15,
HB_PROGRESSIVE_REFINEMENT_SEGMENT_START = 16,
HB_PROGRESSIVE_REFINEMENT_SEGMENT_END = 17,
HB_FILM_GRAIN_CHARACTERISTICS = 19,
HB_POST_FILTER_HINT = 22,
HB_TONE_MAPPING_INFO = 23,
HB_FRAME_PACKING = 45,
HB_DISPLAY_ORIENTATION = 47,
HB_SOP_DESCRIPTION = 128,
HB_ACTIVE_PARAMETER_SETS = 129,
HB_DECODING_UNIT_INFO = 130,
HB_TEMPORAL_LEVEL0_INDEX = 131,
HB_DECODED_PICTURE_HASH = 132,
HB_SCALABLE_NESTING = 133,
HB_REGION_REFRESH_INFO = 134,
HB_MASTERING_DISPLAY_INFO = 137,
HB_CONTENT_LIGHT_LEVEL_INFO = 144,
HB_ALTERNATIVE_TRANSFER_CHARACTERISTICS = 147,
HB_AMBIENT_VIEWING_ENVIRONMENT = 148,
} hb_sei_type_t;
typedef struct hb_nal_s
{
hb_nal_type_t type;
size_t payload_size;
const uint8_t *payload;
} hb_nal_t;
typedef struct hb_sei_s
{
hb_sei_type_t type;
size_t payload_size;
const uint8_t *payload;
// Internal fields
size_t nalu_size;
uint8_t written;
} hb_sei_t;
/*
* Returns a newly-allocated buffer holding a copy of the provided
* NAL unit bitstream data plus the sei.
*/
hb_buffer_t * hb_isomp4_hevc_nal_bitstream_insert_payloads(const uint8_t *data,
const size_t size,
hb_sei_t *sei,
const size_t sei_count,
const hb_nal_t *nals,
const size_t nal_count,
const uint8_t nal_length_size);
#endif // HANDBRAKE_NAL_UNITS_H