Skip to content

Commit ba0b585

Browse files
author
Louis Fréneau
committed
Intermediate files exportation now handle atlas information
1 parent 2eaf3ba commit ba0b585

File tree

8 files changed

+205
-141
lines changed

8 files changed

+205
-141
lines changed

src/lib/bitstreamGeneration/atlas_context.cpp

Lines changed: 66 additions & 66 deletions
Large diffs are not rendered by default.

src/lib/bitstreamGeneration/atlas_context.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class atlas_context {
6565
atlas_frame_parameter_set& get_afps() { return afps_; };
6666

6767
// -------------- Getters - helper variables --------------
68-
size_t get_gof_id() { return gof_id_; };
68+
size_t get_gof_id() const { return gof_id_; };
6969
size_t get_atlas_sub_size() { return atlas_sub_size_; };
7070
std::vector<size_t> get_ad_nal_sizes() { return ad_nal_sizes_; };
7171
size_t get_ad_nal_precision() { return ad_nal_precision_; };

src/lib/bitstreamGeneration/bitstream_util.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
#include <cstring>
4040
#include <new>
4141

42+
#include "utils/parameters.hpp"
43+
#include "utils/fileExport.hpp"
44+
45+
4246
// NOLINTBEGIN(cppcoreguidelines-owning-memory,cppcoreguidelines-no-malloc,hicpp-no-malloc) //
4347
// TODO(gg) : lf : Currently we manually handle most of the memory object in the bitstream generation. Consider reducing alloc use to minimum
4448

@@ -173,6 +177,28 @@ void uvg_bitstream_put_ue(bitstream_t *stream, uint32_t code_num) {
173177
uvg_bitstream_put(stream, value, num_bits);
174178
}
175179

180+
void writeU(bitstream_t *const stream, const uint32_t data, uint8_t bits, std::string name, size_t gofId) {
181+
uvg_bitstream_put(stream, data, bits);
182+
if(uvgvpcc_enc::p_->exportIntermediateFiles) {
183+
std::ostringstream oss;
184+
oss << std::left << std::setw(50) << name
185+
<< " u(" << bits << ") : " << data;
186+
std::string logLine = oss.str();
187+
FileExport::exportAtlasInformation(gofId,logLine);
188+
}
189+
}
190+
191+
void writeUE(bitstream_t *const stream, const uint32_t data, std::string name, size_t gofId) {
192+
uvg_bitstream_put_ue(stream, data);
193+
if(uvgvpcc_enc::p_->exportIntermediateFiles) {
194+
std::ostringstream oss;
195+
oss << std::left << std::setw(50) << name
196+
<< " ue(v): " << data;
197+
std::string logLine = oss.str();
198+
FileExport::exportAtlasInformation(gofId,logLine);
199+
}
200+
}
201+
176202
// TODO(lf): rename this function
177203
size_t uvg_calculate_ue_len(uint32_t number) {
178204
const unsigned code_num_log2 = uvg_math_floor_log2(number + 1);

src/lib/bitstreamGeneration/bitstream_util.hpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@
3535
#include <cassert>
3636
#include <cstring>
3737
#include <cstdint>
38+
#include <string>
3839

39-
#define BITSTREAM_DEBUG false
40+
#define BITSTREAM_DEBUG true
4041

4142
/* Size of data chunks */
4243
#define UVG_DATA_CHUNK_SIZE 4096
@@ -124,26 +125,29 @@ void uvg_bitstream_copy_bytes(bitstream_t *const stream, const uint8_t *bytes, u
124125
/* Get the last (possibly incomplete) byte of the bitstream */
125126
uint32_t uvg_bitstream_peek_last_byte(bitstream_t *const stream);
126127

127-
/* In debug mode print out some extra info */
128-
#if BITSTREAM_DEBUG
128+
/* In debug mode print out some extra info */ // lf: replaced with file export function
129+
// #if BITSTREAM_DEBUG
129130
/* Counter to keep up with bits written */
130-
#define WRITE_U(stream, data, bits, name) \
131-
{ \
132-
printf("%-50s u(%d) : %d\n", name, bits, data); \
133-
uvg_bitstream_put(stream, data, bits); \
134-
}
135-
#define WRITE_UE(stream, data, name) \
136-
{ \
137-
printf("%-50s ue(v): %d\n", name, data); \
138-
uvg_bitstream_put_ue(stream, data); \
139-
}
140-
#else
141-
#define WRITE_U(stream, data, bits, name) \
142-
{ \
143-
uvg_bitstream_put(stream, data, bits); \
144-
}
145-
#define WRITE_UE(stream, data, name) \
146-
{ \
147-
uvg_bitstream_put_ue(stream, data); \
148-
}
149-
#endif
131+
// #define WRITE_U(stream, data, bits, name) \
132+
// { \
133+
// printf("%-50s u(%d) : %d\n", name, bits, data); \
134+
// uvg_bitstream_put(stream, data, bits); \
135+
// }
136+
// #define WRITE_UE(stream, data, name) \
137+
// { \
138+
// printf("%-50s ue(v): %d\n", name, data); \
139+
// uvg_bitstream_put_ue(stream, data); \
140+
// }
141+
// #else
142+
// #define WRITE_U(stream, data, bits, name) \
143+
// { \
144+
// uvg_bitstream_put(stream, data, bits); \
145+
// }
146+
// #define WRITE_UE(stream, data, name) \
147+
// { \
148+
// uvg_bitstream_put_ue(stream, data); \
149+
// }
150+
// #endif
151+
152+
void writeU(bitstream_t *const stream, const uint32_t data, uint8_t bits, std::string name, size_t gofId);
153+
void writeUE(bitstream_t *const stream, const uint32_t data, std::string name, size_t gofId);

src/lib/bitstreamGeneration/vps.cpp

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ vps::vps(const uvgvpcc_enc::Parameters& paramUVG, const std::shared_ptr<uvgvpcc_
5454
"Error : unknown ptl_profile_codec_group_idc. This bitstream parameter indicates what codec is used to encode the 2D videos.");
5555
}
5656
size_t vps_length_bits = 0;
57-
ptl_ = fill_ptl(vps_length_bits); // profile_tier_level
57+
ptl_ = fill_ptl(vps_length_bits); // profile_tier_level
58+
gofId = gofUVG->gofId; // lf addition for exporting intermediate atlas information
5859
vps_v3c_parameter_set_id_ = gofUVG->gofId % 16; // The value of vps_v3c_parameter_set_id shall be in the range of 0 to 15
5960
vps_atlas_count_minus1_ = 0; // for atlas count 1
6061
vps_length_bits += 18; // fixed fields
@@ -152,85 +153,86 @@ vps::vps(const uvgvpcc_enc::Parameters& paramUVG, const std::shared_ptr<uvgvpcc_
152153
}
153154

154155
bool vps::write_vps(bitstream_t* stream) {
156+
155157
// profile_tier_level
156-
WRITE_U(stream, ptl_.ptl_tier_flag, 1, "ptl_tier_flag");
157-
WRITE_U(stream, ptl_.ptl_profile_codec_group_idc, 7, "ptl_profile_codec_group_idc");
158-
WRITE_U(stream, ptl_.ptl_profile_toolset_idc, 8, "ptl_profile_toolset_idc");
159-
WRITE_U(stream, ptl_.ptl_profile_reconstruction_idc, 8, "ptl_profile_reconstruction_idc");
160-
WRITE_U(stream, 0, 16, "ptl_reserved_zero_16bits");
161-
WRITE_U(stream, ptl_.ptl_max_decodes_idc, 4, "ptl_max_decodes_idc");
162-
WRITE_U(stream, 0xfff, 12, "ptl_reserved_0xfff_12bits");
163-
WRITE_U(stream, ptl_.ptl_level_idc, 8, "ptl_level_idc");
164-
WRITE_U(stream, ptl_.ptl_num_sub_profiles, 6, "ptl_num_sub_profiles");
165-
WRITE_U(stream, ptl_.ptl_extended_sub_profile_flag, 1, "ptl_extended_sub_profile_flag");
166-
WRITE_U(stream, ptl_.ptl_toolset_constraints_present_flag, 1, "ptl_toolset_constraints_present_flag");
158+
writeU(stream, ptl_.ptl_tier_flag, 1, "ptl_tier_flag",gofId);
159+
writeU(stream, ptl_.ptl_profile_codec_group_idc, 7, "ptl_profile_codec_group_idc",gofId);
160+
writeU(stream, ptl_.ptl_profile_toolset_idc, 8, "ptl_profile_toolset_idc",gofId);
161+
writeU(stream, ptl_.ptl_profile_reconstruction_idc, 8, "ptl_profile_reconstruction_idc",gofId);
162+
writeU(stream, 0, 16, "ptl_reserved_zero_16bits",gofId);
163+
writeU(stream, ptl_.ptl_max_decodes_idc, 4, "ptl_max_decodes_idc",gofId);
164+
writeU(stream, 0xfff, 12, "ptl_reserved_0xfff_12bits",gofId);
165+
writeU(stream, ptl_.ptl_level_idc, 8, "ptl_level_idc",gofId);
166+
writeU(stream, ptl_.ptl_num_sub_profiles, 6, "ptl_num_sub_profiles",gofId);
167+
writeU(stream, ptl_.ptl_extended_sub_profile_flag, 1, "ptl_extended_sub_profile_flag",gofId);
168+
writeU(stream, ptl_.ptl_toolset_constraints_present_flag, 1, "ptl_toolset_constraints_present_flag",gofId);
167169

168170
// profile_toolset_constraints_information
169171
// TODO(lf): Do we need profile_toolset_constraints_information? Not present from TMC2 interface
170172

171-
WRITE_U(stream, vps_v3c_parameter_set_id_, 4, "vps_v3c_parameter_set_id");
172-
WRITE_U(stream, 0, 8, "vps_reserved_zero_8bits");
173-
WRITE_U(stream, vps_atlas_count_minus1_, 6, "vps_atlas_count_minus1");
173+
writeU(stream, vps_v3c_parameter_set_id_, 4, "vps_v3c_parameter_set_id",gofId);
174+
writeU(stream, 0, 8, "vps_reserved_zero_8bits",gofId);
175+
writeU(stream, vps_atlas_count_minus1_, 6, "vps_atlas_count_minus1",gofId);
174176

175177
for (uint8_t j = 0; j < (vps_atlas_count_minus1_ + 1); j++) {
176-
WRITE_U(stream, j, 6, "vps_atlas_id");
177-
WRITE_UE(stream, int(vps_frame_width_.at(j)), "vps_frame_width");
178-
WRITE_UE(stream, int(vps_frame_height_.at(j)), "vps_frame_height");
179-
WRITE_U(stream, vps_map_count_minus1_.at(j), 4, "vps_map_count_minus1");
178+
writeU(stream, j, 6, "vps_atlas_id",gofId);
179+
writeUE(stream, int(vps_frame_width_.at(j)), "vps_frame_width",gofId);
180+
writeUE(stream, int(vps_frame_height_.at(j)), "vps_frame_height",gofId);
181+
writeU(stream, vps_map_count_minus1_.at(j), 4, "vps_map_count_minus1",gofId);
180182

181183
if (vps_map_count_minus1_.at(j) > 0) {
182-
WRITE_U(stream, int(vps_multiple_map_streams_present_flag_.at(j)), 1, "vps_multiple_map_streams_present_flag");
184+
writeU(stream, int(vps_multiple_map_streams_present_flag_.at(j)), 1, "vps_multiple_map_streams_present_flag",gofId);
183185
}
184-
WRITE_U(stream, int(vps_auxiliary_video_present_flag_.at(j)), 1, "vps_auxiliary_video_present_flag");
185-
WRITE_U(stream, int(vps_occupancy_video_present_flag_.at(j)), 1, "vps_occupancy_video_present_flag");
186-
WRITE_U(stream, int(vps_geometry_video_present_flag_.at(j)), 1, "vps_geometry_video_present_flag");
187-
WRITE_U(stream, int(vps_attribute_video_present_flag_.at(j)), 1, "vps_attribute_video_present_flag");
186+
writeU(stream, int(vps_auxiliary_video_present_flag_.at(j)), 1, "vps_auxiliary_video_present_flag",gofId);
187+
writeU(stream, int(vps_occupancy_video_present_flag_.at(j)), 1, "vps_occupancy_video_present_flag",gofId);
188+
writeU(stream, int(vps_geometry_video_present_flag_.at(j)), 1, "vps_geometry_video_present_flag",gofId);
189+
writeU(stream, int(vps_attribute_video_present_flag_.at(j)), 1, "vps_attribute_video_present_flag",gofId);
188190

189191
if (vps_occupancy_video_present_flag_.at(j)) {
190-
WRITE_U(stream, occupancy_info_.at(j).oi_occupancy_codec_id, 8, "oi_occupancy_codec_id");
191-
WRITE_U(stream, occupancy_info_.at(j).oi_lossy_occupancy_compression_threshold, 8, "oi_lossy_occupancy_compression_threshold");
192-
WRITE_U(stream, occupancy_info_.at(j).oi_occupancy_2d_bit_depth_minus1, 5, "oi_occupancy_2d_bit_depth_minus1");
193-
WRITE_U(stream, occupancy_info_.at(j).oi_occupancy_MSB_align_flag, 1, "oi_occupancy_MSB_align_flag");
192+
writeU(stream, occupancy_info_.at(j).oi_occupancy_codec_id, 8, "oi_occupancy_codec_id",gofId);
193+
writeU(stream, occupancy_info_.at(j).oi_lossy_occupancy_compression_threshold, 8, "oi_lossy_occupancy_compression_threshold",gofId);
194+
writeU(stream, occupancy_info_.at(j).oi_occupancy_2d_bit_depth_minus1, 5, "oi_occupancy_2d_bit_depth_minus1",gofId);
195+
writeU(stream, occupancy_info_.at(j).oi_occupancy_MSB_align_flag, 1, "oi_occupancy_MSB_align_flag",gofId);
194196
}
195197

196198
if (vps_geometry_video_present_flag_.at(j)) {
197-
WRITE_U(stream, geometry_info_.at(j).gi_geometry_codec_id, 8, "gi_geometry_codec_id");
198-
WRITE_U(stream, geometry_info_.at(j).gi_geometry_2d_bit_depth_minus1, 5, "gi_geometry_2d_bit_depth_minus1");
199-
WRITE_U(stream, geometry_info_.at(j).gi_geometry_MSB_align_flag, 1, "gi_geometry_MSB_align_flag");
200-
WRITE_U(stream, geometry_info_.at(j).gi_geometry_3d_coordinates_bit_depth_minus1, 5,
201-
"gi_geometry_3d_coordinates_bit_depth_minus1");
199+
writeU(stream, geometry_info_.at(j).gi_geometry_codec_id, 8, "gi_geometry_codec_id",gofId);
200+
writeU(stream, geometry_info_.at(j).gi_geometry_2d_bit_depth_minus1, 5, "gi_geometry_2d_bit_depth_minus1",gofId);
201+
writeU(stream, geometry_info_.at(j).gi_geometry_MSB_align_flag, 1, "gi_geometry_MSB_align_flag",gofId);
202+
writeU(stream, geometry_info_.at(j).gi_geometry_3d_coordinates_bit_depth_minus1, 5,
203+
"gi_geometry_3d_coordinates_bit_depth_minus1",gofId);
202204

203205
if (vps_auxiliary_video_present_flag_.at(j)) {
204-
WRITE_U(stream, geometry_info_.at(j).gi_auxiliary_geometry_codec_id, 8, "gi_auxiliary_geometry_codec_id");
206+
writeU(stream, geometry_info_.at(j).gi_auxiliary_geometry_codec_id, 8, "gi_auxiliary_geometry_codec_id",gofId);
205207
}
206208
}
207209

208210
if (vps_attribute_video_present_flag_.at(j)) {
209-
WRITE_U(stream, attribute_info_.at(j).ai_attribute_count, 7, "ai_attribute_count");
211+
writeU(stream, attribute_info_.at(j).ai_attribute_count, 7, "ai_attribute_count",gofId);
210212

211213
for (uint8_t i = 0; i < attribute_info_.at(j).ai_attribute_count; ++i) {
212-
WRITE_U(stream, attribute_info_.at(j).ai_attribute_type_id.at(i), 4, "ai_attribute_type_id");
213-
WRITE_U(stream, attribute_info_.at(j).ai_attribute_codec_id.at(i), 8, "ai_attribute_codec_id");
214+
writeU(stream, attribute_info_.at(j).ai_attribute_type_id.at(i), 4, "ai_attribute_type_id",gofId);
215+
writeU(stream, attribute_info_.at(j).ai_attribute_codec_id.at(i), 8, "ai_attribute_codec_id",gofId);
214216

215217
if (vps_auxiliary_video_present_flag_.at(j)) {
216-
WRITE_U(stream, attribute_info_.at(j).ai_auxiliary_attribute_codec_id.at(i), 8, "ai_auxiliary_attribute_codec_id");
218+
writeU(stream, attribute_info_.at(j).ai_auxiliary_attribute_codec_id.at(i), 8, "ai_auxiliary_attribute_codec_id",gofId);
217219
}
218220
if (vps_map_count_minus1_.at(j) > 0) {
219-
WRITE_U(stream, int(attribute_info_.at(j).ai_attribute_map_absolute_coding_persistence_flag.at(i)), 1,
220-
"ai_attribute_map_absolute_coding_persistence_flag");
221+
writeU(stream, int(attribute_info_.at(j).ai_attribute_map_absolute_coding_persistence_flag.at(i)), 1,
222+
"ai_attribute_map_absolute_coding_persistence_flag",gofId);
221223
}
222224

223225
uint8_t d = attribute_info_.at(j).ai_attribute_dimension_minus1.at(i);
224-
WRITE_U(stream, d, 6, "ai_attribute_dimension_minus1");
226+
writeU(stream, d, 6, "ai_attribute_dimension_minus1",gofId);
225227

226228
uint8_t m = 0;
227229
if (d == 0) { // true
228230
m = 0;
229231
attribute_info_.at(j).ai_attribute_dimension_partitions_minus1.at(i) = 0;
230232
} else {
231233
m = attribute_info_.at(j).ai_attribute_dimension_partitions_minus1.at(i);
232-
WRITE_U(stream, attribute_info_.at(j).ai_attribute_dimension_partitions_minus1.at(i), 6,
233-
"ai_attribute_dimension_partitions_minus1");
234+
writeU(stream, attribute_info_.at(j).ai_attribute_dimension_partitions_minus1.at(i), 6,
235+
"ai_attribute_dimension_partitions_minus1",gofId);
234236
}
235237

236238
uint16_t n = 0;
@@ -240,23 +242,23 @@ bool vps::write_vps(bitstream_t* stream) {
240242
attribute_info_.at(j).ai_attribute_partition_channels_minus1.at(i).at(k) = 0;
241243
} else {
242244
n = attribute_info_.at(j).ai_attribute_partition_channels_minus1.at(i).at(k);
243-
WRITE_UE(stream, attribute_info_.at(j).ai_attribute_partition_channels_minus1.at(i).at(k),
244-
"ai_attribute_partition_channels_minus1");
245+
writeUE(stream, attribute_info_.at(j).ai_attribute_partition_channels_minus1.at(i).at(k),
246+
"ai_attribute_partition_channels_minus1",gofId);
245247
}
246248
d -= n + 1;
247249
}
248250
attribute_info_.at(j).ai_attribute_partition_channels_minus1.at(i).at(m) = d;
249251

250-
WRITE_U(stream, attribute_info_.at(j).ai_attribute_2d_bit_depth_minus1.at(i), 5, "ai_attribute_2d_bit_depth_minus1");
251-
WRITE_U(stream, int(attribute_info_.at(j).ai_attribute_MSB_align_flag.at(i)), 1, "ai_attribute_MSB_align_flag");
252+
writeU(stream, attribute_info_.at(j).ai_attribute_2d_bit_depth_minus1.at(i), 5, "ai_attribute_2d_bit_depth_minus1",gofId);
253+
writeU(stream, int(attribute_info_.at(j).ai_attribute_MSB_align_flag.at(i)), 1, "ai_attribute_MSB_align_flag",gofId);
252254
}
253255
}
254-
WRITE_U(stream, vps_extension_present_flag_, 1, "vps_extension_present_flag");
256+
writeU(stream, vps_extension_present_flag_, 1, "vps_extension_present_flag",gofId);
255257

256258
if (vps_extension_present_flag_) {
257-
WRITE_U(stream, vps_packing_information_present_flag_, 1, "vps_packing_information_present_flag");
258-
WRITE_U(stream, vps_miv_extension_present_flag_, 1, "vps_miv_extension_present_flag");
259-
WRITE_U(stream, vps_extension_6bits_, 6, "vps_extension_6bits");
259+
writeU(stream, vps_packing_information_present_flag_, 1, "vps_packing_information_present_flag",gofId);
260+
writeU(stream, vps_miv_extension_present_flag_, 1, "vps_miv_extension_present_flag",gofId);
261+
writeU(stream, vps_extension_6bits_, 6, "vps_extension_6bits",gofId);
260262
}
261263
// No packing information
262264
// No MIV extension

src/lib/bitstreamGeneration/vps.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ class vps {
108108
size_t get_vps_byte_len() { return vps_length_bytes_; };
109109

110110
private:
111+
size_t gofId; // lf addition for exporting intermediate atlas information
112+
111113
/* Fill the PTL values in VPS */
112114
profile_tier_level fill_ptl(size_t& len) const;
113115

src/lib/utils/fileExport.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,4 +485,28 @@ void exportGeometryBitstream(const std::shared_ptr<uvgvpcc_enc::GOF>& gof, const
485485
exportBitstream(outputPath, bitstream);
486486
}
487487

488+
//TODO(lf): currently the file is open and close for every log line...
489+
void exportAtlasInformation(const size_t& gofId, const std::string& logLine) {
490+
const std::string filePath = p_->intermediateFilesDir +
491+
"/16-atlasInformation/ATLAS_g" + zeroPad(gofId, 3) + ".txt";
492+
493+
createDirs(filePath);
494+
495+
std::ofstream textFile(filePath, std::ios::app);
496+
if (!textFile.is_open()) {
497+
throw std::runtime_error("Unable to open file: " + filePath);
498+
}
499+
500+
textFile << logLine << '\n';
501+
if (!textFile) {
502+
throw std::runtime_error("Error while writing to file: " + filePath);
503+
}
504+
505+
textFile.close();
506+
if (!textFile) {
507+
throw std::runtime_error("Error while closing file: " + filePath);
508+
}
509+
}
510+
511+
488512
} // namespace FileExport

src/lib/utils/fileExport.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232

3333
/// \file Intermediary files exportation management.
3434

35+
#include <cstddef>
3536
#include <memory>
37+
#include <string>
3638
#include <vector>
3739

3840
#include "utils/utils.hpp"
@@ -72,4 +74,8 @@ void exportAttributeBitstream(const std::shared_ptr<uvgvpcc_enc::GOF>& gof, cons
7274
void exportGeometryBitstream(const std::shared_ptr<uvgvpcc_enc::GOF>& gof, const std::vector<uint8_t>& bitstream,
7375
const std::string& codecExtension);
7476

77+
// Bitstream generation
78+
void exportAtlasInformation(const size_t& gofId, const std::string& logLine);
79+
80+
7581
} // namespace FileExport

0 commit comments

Comments
 (0)