7#include <packager/media/codecs/h265_byte_to_unit_stream_converter.h>
12#include <absl/log/check.h>
14#include <packager/media/base/buffer_writer.h>
15#include <packager/media/base/rcheck.h>
16#include <packager/media/base/video_stream_info.h>
17#include <packager/media/codecs/h265_parser.h>
18#include <packager/media/codecs/h26x_byte_to_unit_stream_converter.h>
27 H26xStreamFormat stream_format)
30H265ByteToUnitStreamConverter::~H265ByteToUnitStreamConverter() {}
33 std::vector<uint8_t>* decoder_config)
const {
34 DCHECK(decoder_config);
36 if (last_sps_.empty() || last_pps_.empty() || last_vps_.empty()) {
45 RCHECK(nalu.Initialize(Nalu::kH265, last_sps_.data(), last_sps_.size()));
46 RCHECK(parser.
ParseSps(nalu, &
id) == H265Parser::kOk);
51 BufferWriter buffer(last_sps_.size() + last_pps_.size() + last_vps_.size() +
53 buffer.
AppendInt(
static_cast<uint8_t
>(1) );
58 for (
int byte : sps->general_profile_tier_level_data)
59 buffer.
AppendInt(
static_cast<uint8_t
>(
byte));
62 int min_spatial_segmentation_idc =
63 sps->vui_parameters.min_spatial_segmentation_idc;
66 static_cast<uint16_t
>(0xf000 | min_spatial_segmentation_idc));
67 buffer.
AppendInt(
static_cast<uint8_t
>(0xfc) );
68 buffer.
AppendInt(
static_cast<uint8_t
>(0xfc | sps->chroma_format_idc));
69 buffer.
AppendInt(
static_cast<uint8_t
>(0xf8 | sps->bit_depth_luma_minus8));
70 buffer.
AppendInt(
static_cast<uint8_t
>(0xf8 | sps->bit_depth_chroma_minus8));
71 buffer.
AppendInt(
static_cast<uint16_t
>(0) );
76 buffer.
AppendInt(
static_cast<uint8_t
>(kUnitStreamNaluLengthSize - 1));
77 buffer.
AppendInt(
static_cast<uint8_t
>(3) );
81 const uint8_t array_completeness = strip_parameter_set_nalus() ? 0x80 : 0;
84 buffer.
AppendInt(
static_cast<uint8_t
>(array_completeness | Nalu::H265_VPS));
85 buffer.
AppendInt(
static_cast<uint16_t
>(1) );
86 buffer.
AppendInt(
static_cast<uint16_t
>(last_vps_.size()));
87 buffer.AppendVector(last_vps_);
90 buffer.
AppendInt(
static_cast<uint8_t
>(array_completeness | Nalu::H265_SPS));
91 buffer.
AppendInt(
static_cast<uint16_t
>(1) );
92 buffer.
AppendInt(
static_cast<uint16_t
>(last_sps_.size()));
93 buffer.AppendVector(last_sps_);
96 buffer.
AppendInt(
static_cast<uint8_t
>(array_completeness | Nalu::H265_PPS));
97 buffer.
AppendInt(
static_cast<uint16_t
>(1) );
98 buffer.
AppendInt(
static_cast<uint16_t
>(last_pps_.size()));
99 buffer.AppendVector(last_pps_);
101 buffer.SwapBuffer(decoder_config);
105bool H265ByteToUnitStreamConverter::ProcessNalu(
const Nalu& nalu) {
109 const uint8_t* nalu_ptr = nalu.
data();
112 switch (nalu.
type()) {
114 if (strip_parameter_set_nalus())
115 WarnIfNotMatch(nalu.
type(), nalu_ptr, nalu_size, last_sps_);
117 last_sps_.assign(nalu_ptr, nalu_ptr + nalu_size);
118 return strip_parameter_set_nalus();
120 if (strip_parameter_set_nalus())
121 WarnIfNotMatch(nalu.
type(), nalu_ptr, nalu_size, last_pps_);
123 last_pps_.assign(nalu_ptr, nalu_ptr + nalu_size);
124 return strip_parameter_set_nalus();
126 if (strip_parameter_set_nalus())
127 WarnIfNotMatch(nalu.
type(), nalu_ptr, nalu_size, last_vps_);
129 last_vps_.assign(nalu_ptr, nalu_ptr + nalu_size);
130 return strip_parameter_set_nalus();
All the methods that are virtual are virtual for mocking.