Skip to content

Commit

Permalink
deduplicate hvcC box (#1175)
Browse files Browse the repository at this point in the history
  • Loading branch information
farindk committed Jun 10, 2024
1 parent 37dc08c commit 5f606a6
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 81 deletions.
16 changes: 9 additions & 7 deletions libheif/context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2146,7 +2146,7 @@ create_alpha_image_from_image_alpha_channel(const std::shared_ptr<HeifPixelImage

void HeifContext::Image::set_preencoded_hevc_image(const std::vector<uint8_t>& data)
{
m_heif_context->m_heif_file->add_hvcC_property(m_id);
auto hvcC = std::make_shared<Box_hvcC>();


// --- parse the h265 stream and set hvcC headers and compressed image data
Expand Down Expand Up @@ -2209,8 +2209,7 @@ void HeifContext::Image::set_preencoded_hevc_image(const std::vector<uint8_t>& d
case 0x20:
case 0x21:
case 0x22:
m_heif_context->m_heif_file->append_hvcC_nal_data(m_id, nal_data);
/*hvcC->append_nal_data(nal_data);*/
hvcC->append_nal_data(nal_data);
break;

default: {
Expand All @@ -2236,6 +2235,8 @@ void HeifContext::Image::set_preencoded_hevc_image(const std::vector<uint8_t>& d
break;
}
}

m_heif_context->m_heif_file->add_property(m_id, hvcC, true);
}


Expand Down Expand Up @@ -2499,8 +2500,7 @@ Error HeifContext::encode_image_as_hevc(const std::shared_ptr<HeifPixelImage>& i
out_image->set_size(input_width, input_height);


m_heif_file->add_hvcC_property(image_id);

auto hvcC = std::make_shared<Box_hvcC>();

heif_image c_api_image;
c_api_image.image = src_image;
Expand Down Expand Up @@ -2533,14 +2533,14 @@ Error HeifContext::encode_image_as_hevc(const std::shared_ptr<HeifPixelImage>& i

parse_sps_for_hvcC_configuration(data, size, &config, &encoded_width, &encoded_height);

m_heif_file->set_hvcC_configuration(image_id, config);
hvcC->set_configuration(config);
}

switch (data[0] >> 1) {
case 0x20:
case 0x21:
case 0x22:
m_heif_file->append_hvcC_nal_data(image_id, data, size);
hvcC->append_nal_data(data, size);
break;

default:
Expand All @@ -2553,6 +2553,8 @@ Error HeifContext::encode_image_as_hevc(const std::shared_ptr<HeifPixelImage>& i
heif_suberror_Invalid_image_size);
}

m_heif_file->add_property(image_id, hvcC, true);

if (encoder->plugin->plugin_api_version >= 3 &&
encoder->plugin->query_encoded_size != nullptr) {
uint32_t check_encoded_width = input_width, check_encoded_height = input_height;
Expand Down
67 changes: 1 addition & 66 deletions libheif/file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -988,7 +988,7 @@ void HeifFile::add_clap_property(heif_item_id id, uint32_t clap_width, uint32_t

heif_property_id HeifFile::add_property(heif_item_id id, std::shared_ptr<Box> property, bool essential)
{
int index = m_ipco_box->append_child_box(property);
int index = m_ipco_box->find_or_append_child_box(property);

m_ipma_box->add_property_for_item_ID(id, Box_ipma::PropertyAssociation{essential, uint16_t(index + 1)});

Expand Down Expand Up @@ -1073,71 +1073,6 @@ void HeifFile::add_pixi_property(heif_item_id id, uint8_t c1, uint8_t c2, uint8_
}


void HeifFile::add_hvcC_property(heif_item_id id)
{
auto hvcC = std::make_shared<Box_hvcC>();
int index = m_ipco_box->append_child_box(hvcC);

m_ipma_box->add_property_for_item_ID(id, Box_ipma::PropertyAssociation{true, uint16_t(index + 1)});
}


Error HeifFile::append_hvcC_nal_data(heif_item_id id, const std::vector<uint8_t>& nal_data)
{
auto hvcC = std::dynamic_pointer_cast<Box_hvcC>(m_ipco_box->get_property_for_item_ID(id,
m_ipma_box,
fourcc("hvcC")));

if (hvcC) {
hvcC->append_nal_data(nal_data);
return Error::Ok;
}
else {
// Should always have an hvcC box, because we are checking this in
// heif_context::interpret_heif_file()
assert(false);
return Error(heif_error_Usage_error,
heif_suberror_No_hvcC_box);
}
}


Error HeifFile::set_hvcC_configuration(heif_item_id id, const Box_hvcC::configuration& config)
{
auto hvcC = std::dynamic_pointer_cast<Box_hvcC>(m_ipco_box->get_property_for_item_ID(id,
m_ipma_box,
fourcc("hvcC")));

if (hvcC) {
hvcC->set_configuration(config);
return Error::Ok;
}
else {
return Error(heif_error_Usage_error,
heif_suberror_No_hvcC_box);
}
}


Error HeifFile::append_hvcC_nal_data(heif_item_id id, const uint8_t* data, size_t size)
{
std::vector<std::shared_ptr<Box>> properties;

auto hvcC = std::dynamic_pointer_cast<Box_hvcC>(m_ipco_box->get_property_for_item_ID(id,
m_ipma_box,
fourcc("hvcC")));

if (hvcC) {
hvcC->append_nal_data(data, size);
return Error::Ok;
}
else {
return Error(heif_error_Usage_error,
heif_suberror_No_hvcC_box);
}
}


void HeifFile::add_av1C_property(heif_item_id id)
{
auto av1C = std::make_shared<Box_av1C>();
Expand Down
8 changes: 0 additions & 8 deletions libheif/file.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,6 @@ class HeifFile

std::shared_ptr<Box_infe> add_new_infe_box(const char* item_type);

void add_hvcC_property(heif_item_id id);

Error append_hvcC_nal_data(heif_item_id id, const std::vector<uint8_t>& data);

Error append_hvcC_nal_data(heif_item_id id, const uint8_t* data, size_t size);

Error set_hvcC_configuration(heif_item_id id, const Box_hvcC::configuration& config);

void add_av1C_property(heif_item_id id);

Error set_av1C_configuration(heif_item_id id, const Box_av1C::configuration& config);
Expand Down

0 comments on commit 5f606a6

Please sign in to comment.