uvgVPCCenc 1.2.0
uvgVPCCenc is an open-source real-time V-PCC encoder library written in C++ from scratch.
Loading...
Searching...
No Matches
v3cbitstream.hpp
Go to the documentation of this file.
1/*****************************************************************************
2 * This file is part of uvgVPCCenc V-PCC encoder.
3 *
4 * Copyright (c) 2024-present, Tampere University, ITU/ISO/IEC, project contributors
5 * All rights reserved.
6 ****************************************************************************/
7
8#pragma once
9
10#include <cstddef>
11#include <cstdint>
12#include <memory>
13#include <mutex>
14#include <queue>
15#include <semaphore>
16#include <vector>
17
18#include "atlas.hpp"
19#include "vps.hpp"
20
21namespace uvgv3cbitstream {
22
23static inline int floorLog2(uint32_t x) {
24 if (x == 0) {
25 return -1;
26 }
27#ifdef __GNUC__
28 return 31 - __builtin_clz(x);
29#else
30 int result = 0;
31 if (x & 0xffff0000) {
32 x >>= 16;
33 result += 16;
34 }
35 if (x & 0xff00) {
36 x >>= 8;
37 result += 8;
38 }
39 if (x & 0xf0) {
40 x >>= 4;
41 result += 4;
42 }
43 if (x & 0xc) {
44 x >>= 2;
45 result += 2;
46 }
47 if (x & 0x2) {
48 result += 1;
49 }
50 return result;
51#endif
52}
53
54#define UVG_DATA_CHUNK_SIZE 4096
55
57struct v3c_unit {
59 size_t len = 0; // Length of data in buffer
60 std::unique_ptr<char[]> data; // Actual data (char type can be used to describe a byte. No need for uint8_t or unsigned char types.)
61
62 v3c_unit() = default;
63 v3c_unit(VUT type, size_t len, std::unique_ptr<char[]> data) : type(type), len(len), data(std::move(data)) {}
64};
65
68 std::vector<v3c_unit> v3c_units = {};
69};
70
72 std::queue<v3c_unit_batch> v3c_unit_batches = {};
73 std::counting_semaphore<> available_chunks{0};
74 std::mutex io_mutex; // Locks production and consumption in the v3c_unit_batches queue
75};
76
77typedef struct uvg_data_chunk {
79 uint32_t len;
81} uvg_data_chunk;
82
83typedef struct bitstream_t {
84 uint32_t len;
87 uint8_t data;
88 uint8_t cur_bit;
89} bitstream_t;
90
91struct nal_info {
92 size_t location = 0;
93 size_t size = 0;
94};
95
96struct V3cGof {
97 size_t gof_id = 0;
98 size_t n_frames = 0;
99 std::unique_ptr<Vps> vps = nullptr;
100 std::unique_ptr<AtlasContext> atlas = nullptr;
101 std::unique_ptr<std::vector<uint8_t>> ovd = nullptr;
102 std::unique_ptr<std::vector<uint8_t>> gvd = nullptr;
103 std::unique_ptr<std::vector<uint8_t>> avd = nullptr;
104};
105
108 size_t len = 0;
109 std::unique_ptr<char[]> data;
110};
111
112static inline int ceilLog2(uint32_t x) { return (x == 0) ? -1 : floorLog2(x - 1) + 1; }
113
114void uvg_bitstream_init(bitstream_t* stream);
115uvg_data_chunk* uvg_bitstream_alloc_chunk();
116void uvg_bitstream_free_chunks(uvg_data_chunk* chunk);
117void uvg_bitstream_writebyte(bitstream_t* stream, uint8_t byte);
118void uvg_bitstream_put(bitstream_t* stream, uint32_t data, uint8_t bits);
119uvg_data_chunk* uvg_bitstream_take_chunks(bitstream_t* stream);
120void uvg_bitstream_finalize(bitstream_t* stream);
121void uvg_bitstream_clear(bitstream_t* stream);
122uint64_t uvg_bitstream_tell(const bitstream_t* stream);
123void uvg_bitstream_put_ue(bitstream_t* stream, uint32_t code_num);
124size_t uvg_calculate_ue_len(uint32_t number);
125void uvg_bitstream_add_rbsp_trailing_bits(bitstream_t* stream);
126void uvg_bitstream_align(bitstream_t* stream);
127void uvg_bitstream_move(bitstream_t* dst, bitstream_t* src);
128void uvg_bitstream_copy_bytes(bitstream_t* stream, const uint8_t* bytes, uint32_t len);
129uint32_t uvg_bitstream_peek_last_byte(bitstream_t* stream);
130
131void prepareAtlasContext(AtlasContext& atlas);
132bool writeVps(bitstream_t* stream, const Vps& vps);
133void writeAtlasSubBitstream(bitstream_t* stream, const AtlasContext& atlas);
134void writeAtlasParameterSetNals(bitstream_t* stream, const AtlasContext& atlas);
135void writeAtlasNal(bitstream_t* stream, const AtlasContext& atlas, size_t index);
136void writeAtlasEob(bitstream_t* stream, const AtlasContext& atlas);
137std::vector<SerializedUnit> writeV3cUnits(const V3cGof& gof);
138std::vector<SerializedUnit> writeV3cLdUnits(const V3cGof& gof, const std::vector<nal_info>& ovd_nals, const std::vector<nal_info>& gvd_nals,
139 const std::vector<nal_info>& avd_nals, bool double_layer);
140
141} // namespace uvgv3cbitstream
Definition vps.hpp:42
Definition jobManagement.hpp:72
Definition atlas.hpp:17
uint64_t uvg_bitstream_tell(const bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:105
uvg_data_chunk * uvg_bitstream_alloc_chunk()
Definition v3cbitstream_bitstream.cpp:38
void uvg_bitstream_align(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:130
void uvg_bitstream_init(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:36
void writeAtlasEob(bitstream_t *stream, const AtlasContext &atlas)
Definition v3cbitstream_writer.cpp:418
void uvg_bitstream_copy_bytes(bitstream_t *stream, const uint8_t *bytes, uint32_t len)
Definition v3cbitstream_bitstream.cpp:155
void uvg_bitstream_clear(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:100
uint32_t uvg_bitstream_peek_last_byte(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:193
size_t uvg_calculate_ue_len(uint32_t number)
Definition v3cbitstream_bitstream.cpp:118
VUT
Definition const_defs.h:175
@ V3C_VPS
Definition const_defs.h:176
std::vector< SerializedUnit > writeV3cLdUnits(const V3cGof &gof, const std::vector< nal_info > &ovd_nals, const std::vector< nal_info > &gvd_nals, const std::vector< nal_info > &avd_nals, bool double_layer)
Definition v3cbitstream_writer.cpp:459
void uvg_bitstream_put(bitstream_t *stream, uint32_t data, uint8_t bits)
Definition v3cbitstream_bitstream.cpp:73
uvg_data_chunk * uvg_bitstream_take_chunks(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:87
void writeAtlasSubBitstream(bitstream_t *stream, const AtlasContext &atlas)
Definition v3cbitstream_writer.cpp:382
void uvg_bitstream_put_ue(bitstream_t *stream, uint32_t code_num)
Definition v3cbitstream_bitstream.cpp:109
std::vector< SerializedUnit > writeV3cUnits(const V3cGof &gof)
Definition v3cbitstream_writer.cpp:424
void uvg_bitstream_finalize(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:95
void writeAtlasNal(bitstream_t *stream, const AtlasContext &atlas, size_t index)
Definition v3cbitstream_writer.cpp:411
bool writeVps(bitstream_t *stream, const Vps &vps)
Definition v3cbitstream_writer.cpp:255
void uvg_bitstream_move(bitstream_t *dst, bitstream_t *src)
Definition v3cbitstream_bitstream.cpp:136
void uvg_bitstream_free_chunks(uvg_data_chunk *chunk)
Definition v3cbitstream_bitstream.cpp:47
void uvg_bitstream_add_rbsp_trailing_bits(bitstream_t *stream)
Definition v3cbitstream_bitstream.cpp:123
void uvg_bitstream_writebyte(bitstream_t *stream, uint8_t byte)
Definition v3cbitstream_bitstream.cpp:55
void prepareAtlasContext(AtlasContext &atlas)
Definition v3cbitstream_writer.cpp:336
void writeAtlasParameterSetNals(bitstream_t *stream, const AtlasContext &atlas)
Definition v3cbitstream_writer.cpp:401
Definition v3cbitstream.hpp:106
VUT type
Definition v3cbitstream.hpp:107
std::unique_ptr< char[]> data
Definition v3cbitstream.hpp:109
size_t len
Definition v3cbitstream.hpp:108
Definition v3cbitstream.hpp:96
std::unique_ptr< std::vector< uint8_t > > ovd
Definition v3cbitstream.hpp:101
size_t n_frames
Definition v3cbitstream.hpp:98
std::unique_ptr< AtlasContext > atlas
Definition v3cbitstream.hpp:100
size_t gof_id
Definition v3cbitstream.hpp:97
std::unique_ptr< std::vector< uint8_t > > avd
Definition v3cbitstream.hpp:103
std::unique_ptr< std::vector< uint8_t > > gvd
Definition v3cbitstream.hpp:102
Definition v3cbitstream.hpp:83
uvg_data_chunk * last
Definition v3cbitstream.hpp:86
uint8_t data
Definition v3cbitstream.hpp:87
uint32_t len
Definition v3cbitstream.hpp:84
uvg_data_chunk * first
Definition v3cbitstream.hpp:85
uint8_t cur_bit
Definition v3cbitstream.hpp:88
Definition v3cbitstream.hpp:91
size_t location
Definition v3cbitstream.hpp:92
size_t size
Definition v3cbitstream.hpp:93
Definition v3cbitstream.hpp:77
struct uvg_data_chunk * next
Definition v3cbitstream.hpp:80
uint32_t len
Definition v3cbitstream.hpp:79
uint8_t data[UVG_DATA_CHUNK_SIZE]
Definition v3cbitstream.hpp:78
One GOF-worth of ordered V3C units emitted by the encoder.
Definition v3cbitstream.hpp:67
std::vector< v3c_unit > v3c_units
Definition v3cbitstream.hpp:68
Definition v3cbitstream.hpp:71
std::queue< v3c_unit_batch > v3c_unit_batches
Definition v3cbitstream.hpp:72
std::counting_semaphore available_chunks
Definition v3cbitstream.hpp:73
std::mutex io_mutex
Definition v3cbitstream.hpp:74
One complete V3C unit, including the V3C unit header.
Definition v3cbitstream.hpp:57
VUT type
Definition v3cbitstream.hpp:58
v3c_unit(VUT type, size_t len, std::unique_ptr< char[]> data)
Definition v3cbitstream.hpp:63
std::unique_ptr< char[]> data
Definition v3cbitstream.hpp:60
size_t len
Definition v3cbitstream.hpp:59
#define UVG_DATA_CHUNK_SIZE
Definition v3cbitstream.hpp:54