SatDump 2.0.0-alpha-520736c72
Loading...
Searching...
No Matches
segment_decoder.h
Go to the documentation of this file.
1#pragma once
2
7
8#include "image/image.h"
9#include "logger.h"
11#include "xrit/identify.h"
13#include "xrit/xrit_file.h"
14#include <cstring>
15
16namespace satdump
17{
18 namespace xrit
19 {
23 class GOESSegmentedImageDecoder : public SegmentedImageDecoder
24 {
25 private:
26 int seg_count = 0;
27 std::vector<bool> segments_done;
28 int seg_size = 0;
29
30 public:
31 void init(int max_seg, int max_width, int max_height)
32 {
33 seg_count = max_seg;
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;
37 }
38
39 GOESSegmentedImageDecoder(XRITFile &file)
40 {
41 goes::SegmentIdentificationHeader segment_id_header = file.getHeader<goes::SegmentIdentificationHeader>();
42
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);
45 else
46 {
47 ImageStructureRecord image_structure_record = file.getHeader<ImageStructureRecord>();
48 init(segment_id_header.max_segment, segment_id_header.max_column, segment_id_header.max_segment * image_structure_record.lines_count);
49 }
50 }
51
52 void pushSegment(uint8_t *data, size_t this_size, int segc)
53 {
54 if (segc >= seg_count || segc < 0)
55 return;
56 if (seg_size * segc + this_size <= image.size())
57 std::memcpy((uint8_t *)image.raw_data() + seg_size * segc, data, this_size); // IMGTODO, maybe check 8-bits?
58 else
59 logger->error("TRIED TO WRITE OUT OF BOUNDS!");
60 segments_done[segc] = true;
61 }
62
64 {
65 PrimaryHeader primary_header = file.getHeader<PrimaryHeader>();
66 goes::SegmentIdentificationHeader segment_id_header = file.getHeader<goes::SegmentIdentificationHeader>();
67 goes::NOAALRITHeader noaa_header = file.getHeader<goes::NOAALRITHeader>();
68 ImageStructureRecord image_structure_record = file.getHeader<ImageStructureRecord>();
69
70 if (file.lrit_data.size() - primary_header.total_header_length < image_structure_record.columns_count * image_structure_record.lines_count)
71 {
72 logger->info("Image is too small compared to its header!");
73 return;
74 }
75
76 // GOES-N and Himawari have offset segments
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);
79 else // The rest is normal
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);
81 }
82
84 {
85 bool complete = true;
86 for (int i = 0; i < seg_count; i++)
87 complete = complete && segments_done[i];
88 return complete;
89 }
90
91 void reset()
92 {
93 for (int i = 0; i < seg_count; i++)
94 segments_done[i] = false;
95 image.clear();
96 }
97
98 bool hasData()
99 {
100 for (int i = 0; i < seg_count; i++)
101 if (segments_done[i])
102 return true;
103 return false;
104 }
105 };
106 } // namespace xrit
107} // namespace satdump
void pushSegment(XRITFile &file)
Push a segment into the work-in-progress image. These should already be filtered using file_info....
Definition segment_decoder.h:63
void reset()
Resets the decoder, to lower RAM usage.
Definition segment_decoder.h:91
bool isComplete()
Allows knowing if an image is complete, to save it instantly.
Definition segment_decoder.h:83
bool hasData()
Allows knowing if an image has data at all (and hence, worth saving)
Definition segment_decoder.h:98
Abstract Segmented decoder implementation to be overriden for mission-specific decoders.
Definition segment_decoder.h:26
GOES HRIT/LRIT Specific Headers.
Contains functions to identify and process xRIT files.
Core Image class.
Base segmented decoder class.
Definition xrit_file.h:37
Definition xrit_file.h:16
Definition xrit_file.h:143
Definition goes_headers.h:23