blob: 39905659bab3c27a3b99937c022c1a6ae9b3d76d [file] [edit]
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Internal encoding primitives: Functions for writing individual JUMBF
// constructs.
//
// These functions each write a single JUMBF construct. Care is needed to use
// them properly, as callers must track the number of bytes written to properly
// close out Superboxes.
//
// For example, to create a superbox containing a single CBOR content box:
//
// size_t superbox_size = 0;
// CHECK_OK(EncodeContentBox(kCborBoxType, cbor_data, &writer, &superbox_size));
// CHECK_OK(EncodeDescriptionBox(kCborBoxTypeUuid, DescriptionBoxOptions{
// .label = riegeli::ExternalRef::From("mylabel"),
// }, &writer, &superbox_size));
// CHECK_OK(EncodeBoxHeader(superbox_size, kSuperBoxType, &writer,
// &superbox_size));
//
// The public `SuperBoxBuilder` class in
// c2pa/jumbf/box_builder.h is easier to use.
#ifndef THIRD_PARTY_CREDENTIO_JUMBF_INTERNAL_ENCODE_H_
#define THIRD_PARTY_CREDENTIO_JUMBF_INTERNAL_ENCODE_H_
#include <cstdint>
#include "absl/status/status.h"
#include "absl/strings/cord.h"
#include "jumbf/encode_params.h"
#include "riegeli/base/types.h"
#include "riegeli/bytes/backward_writer.h"
#include "uuid/uuid.h"
namespace jumbf {
// Writes a padding box to `writer`.
absl::Status EncodePaddingBox(uint64_t padding_size,
riegeli::BackwardWriter* writer);
// Writes `payload` of the serialized super box to `writer`.
absl::Status EncodeSerializedSuperBox(absl::Cord payload,
riegeli::BackwardWriter* writer);
// Wraps `payload` in a box of type `tbox` and writes it to `writer`.
absl::Status EncodeContentBox(uint32_t tbox, absl::Cord payload,
riegeli::BackwardWriter* writer);
// Writes a description box to `writer`.
absl::Status EncodeDescriptionBox(credentio::Uuid type_uuid,
DescriptionBoxOptions options,
riegeli::BackwardWriter* writer);
// Closes a box by writing the header to `writer`.
absl::Status EncodeBoxHeader(riegeli::Position payload_length, uint32_t tbox,
riegeli::BackwardWriter* writer);
} // namespace jumbf
#endif // THIRD_PARTY_CREDENTIO_JUMBF_INTERNAL_ENCODE_H_