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
9#include "image/image.h"
10#include "utils/string.h"
12#include "xrit/identify.h"
14#include "xrit/xrit_file.h"
15
16namespace satdump
17{
18 namespace xrit
19 {
23 class GK2ASegmentedImageDecoder : public SegmentedImageDecoder
24 {
25 private:
26 int seg_count = 0;
27 std::vector<bool> segments_done;
28 int seg_height = 0, seg_width = 0;
29
30 public:
31 void init(int bit_depth, int max_seg, int segment_width, int segment_height)
32 {
33 seg_count = max_seg;
34 segments_done.resize(seg_count, false);
35
36 // TODOREWORKXRIT check we ONLY get FD?
37 image = image::Image(bit_depth, segment_width, segment_width, 1);
38 seg_height = segment_height;
39 seg_width = segment_width;
40
41 image.fill(0);
42 }
43
44 GK2ASegmentedImageDecoder(XRITFile &file)
45 {
46 ImageStructureRecord image_structure_record = file.getHeader<ImageStructureRecord>();
47
48 init(image_structure_record.bit_per_pixel > 8 ? 16 : 8, //
49 file.hasHeader<gk2a::ImageSegmentationIdentification>() ? file.getHeader<gk2a::ImageSegmentationIdentification>().total_segments_nb : 10, //
50 image_structure_record.columns_count, //
51 image_structure_record.lines_count);
52 }
53
54 void pushSegment(image::Image &data, int segc, int pos)
55 {
56 if (segc >= seg_count || segc < 0 || pos < 0)
57 return;
58 if (data.height() + pos > image.height() || data.width() != seg_width)
59 {
60 logger->error("Image of the wrong size! %dx%d | %dx%d | %d/%d", seg_width, seg_height, data.width(), data.height(), data.height() + pos, image.height());
61 return;
62 }
63 image::imemcpy(image, seg_width * pos, data, 0, data.size());
64 segments_done[segc] = true;
65 }
66
68 {
69 auto img = getImageFromXRITFile(XRIT_GK2A_AMI, file);
70
71 std::vector<std::string> header_parts = splitString(file.filename, '_');
72
73 int seg_number = 0;
74 if (header_parts.size() >= 7)
75 {
76 seg_number = std::stoi(header_parts[6].substr(0, header_parts.size() - 4)) - 1;
77 }
78 else
79 {
80 logger->critical("Could not parse segment number from filename!");
81 return;
82 }
83
84 if (file.hasHeader<gk2a::ImageSegmentationIdentification>())
85 pushSegment(img, seg_number, file.getHeader<gk2a::ImageSegmentationIdentification>().line_nb - 1);
86 else
87 logger->error("Segment header missing!");
88 }
89
91 {
92 bool complete = true;
93 for (int i = 0; i < seg_count; i++)
94 complete = complete && segments_done[i];
95 return complete;
96 }
97
98 void reset()
99 {
100 for (int i = 0; i < seg_count; i++)
101 segments_done[i] = false;
102 image.clear();
103 }
104
105 bool hasData()
106 {
107 for (int i = 0; i < seg_count; i++)
108 if (segments_done[i])
109 return true;
110 return false;
111 }
112 };
113 } // namespace xrit
114} // namespace satdump
Definition image.h:17
size_t size() const
Returns image data size.
Definition image.h:228
size_t height() const
Returns image height.
Definition image.h:216
size_t width() const
Returns image width.
Definition image.h:210
bool hasData()
Allows knowing if an image has data at all (and hence, worth saving)
Definition segment_decoder.h:105
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:67
bool isComplete()
Allows knowing if an image is complete, to save it instantly.
Definition segment_decoder.h:90
void reset()
Resets the decoder, to lower RAM usage.
Definition segment_decoder.h:98
Abstract Segmented decoder implementation to be overriden for mission-specific decoders.
Definition segment_decoder.h:26
xRIT files => Images
image::Image getImageFromXRITFile(xrit_file_type_t type, XRITFile &file)
This converts a xRIT file (given its type) into an image object handling missing-specific details and...
Definition get_img.h:28
GK-2A HRIT/LRIT Specific Headers.
Contains functions to identify and process xRIT files.
Core Image class.
Base segmented decoder class.
A collection of string-related utility functions.
Definition xrit_file.h:37
Definition xrit_file.h:143