27 std::vector<bool> segments_done;
31 void init(
int max_seg,
int max_width,
int max_height)
34 segments_done = std::vector<bool>(seg_count,
false);
35 image.init(8, max_width, max_height, 1);
36 seg_size = int(max_height / max_seg) * max_width;
39 GOESSegmentedImageDecoder(
XRITFile &file)
43 if (segment_id_header.max_row > 0)
44 init(segment_id_header.max_segment, segment_id_header.max_column, segment_id_header.max_row);
48 init(segment_id_header.max_segment, segment_id_header.max_column, segment_id_header.max_segment * image_structure_record.lines_count);
52 void pushSegment(uint8_t *data,
size_t this_size,
int segc)
54 if (segc >= seg_count || segc < 0)
56 if (seg_size * segc + this_size <= image.size())
57 std::memcpy((uint8_t *)image.raw_data() + seg_size * segc, data, this_size);
59 logger->error(
"TRIED TO WRITE OUT OF BOUNDS!");
60 segments_done[segc] =
true;
70 if (file.lrit_data.size() - primary_header.total_header_length < image_structure_record.columns_count * image_structure_record.lines_count)
72 logger->info(
"Image is too small compared to its header!");
77 if (noaa_header.product_id == goes::ID_HIMAWARI || (noaa_header.product_id <= 15 && noaa_header.product_id >= 13))
78 pushSegment(&file.lrit_data[primary_header.total_header_length], file.lrit_data.size() - primary_header.total_header_length, segment_id_header.segment_sequence_number - 1);
80 pushSegment(&file.lrit_data[primary_header.total_header_length], file.lrit_data.size() - primary_header.total_header_length, segment_id_header.segment_sequence_number);
86 for (
int i = 0; i < seg_count; i++)
87 complete = complete && segments_done[i];
93 for (
int i = 0; i < seg_count; i++)
94 segments_done[i] =
false;
100 for (
int i = 0; i < seg_count; i++)
101 if (segments_done[i])