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 "msg_headers.h"
11#include "xrit/identify.h"
13#include "xrit/xrit_file.h"
14
15namespace satdump
16{
17 namespace xrit
18 {
22 class MSGSegmentedImageDecoder : public SegmentedImageDecoder
23 {
24 private:
25 int seg_count = 0;
26 std::vector<bool> segments_done;
27 int seg_height = 0, seg_width = 0;
28
29 public:
30 void init(int bit_depth, int max_seg, int segment_width, int segment_height)
31 {
32 seg_count = max_seg;
33 segments_done.resize(seg_count, false);
34
35 image = image::Image(bit_depth, segment_width, segment_height * max_seg, 1);
36 seg_height = segment_height;
37 seg_width = segment_width;
38
39 image.fill(0);
40 }
41
42 MSGSegmentedImageDecoder(XRITFile &file)
43 {
44 ImageStructureRecord image_structure_record = file.getHeader<ImageStructureRecord>();
45 msg::SegmentIdentificationHeader segment_id_header = file.getHeader<msg::SegmentIdentificationHeader>();
46
47 init(image_structure_record.bit_per_pixel > 8 ? 16 : 8, //
48 segment_id_header.planned_end_segment - segment_id_header.planned_start_segment + 1, //
49 image_structure_record.columns_count, //
50 image_structure_record.lines_count);
51 }
52
53 void pushSegment(image::Image &data, int segc)
54 {
55 if (segc >= seg_count || segc < 0)
56 return;
57 if (data.size() != seg_height * seg_width)
58 {
59 logger->error("Image of the wrong size!");
60 return;
61 }
62 image::imemcpy(image, (seg_height * seg_width) * segc, data, 0, seg_height * seg_width);
63 segments_done[segc] = true;
64 }
65
67 {
68 msg::SegmentIdentificationHeader segment_id_header = file.getHeader<msg::SegmentIdentificationHeader>();
69 auto img = getImageFromXRITFile(XRIT_MSG_SEVIRI, file);
70 pushSegment(img, segment_id_header.segment_sequence_number - segment_id_header.planned_start_segment);
71 }
72
74 {
75 bool complete = true;
76 for (int i = 0; i < seg_count; i++)
77 complete = complete && segments_done[i];
78 return complete;
79 }
80
81 void reset()
82 {
83 for (int i = 0; i < seg_count; i++)
84 segments_done[i] = false;
85 image.clear();
86 }
87
88 bool hasData()
89 {
90 for (int i = 0; i < seg_count; i++)
91 if (segments_done[i])
92 return true;
93 return false;
94 }
95 };
96 } // namespace xrit
97} // namespace satdump
Definition image.h:17
size_t size() const
Returns image data size.
Definition image.h:228
bool hasData()
Allows knowing if an image has data at all (and hence, worth saving)
Definition segment_decoder.h:88
void reset()
Resets the decoder, to lower RAM usage.
Definition segment_decoder.h:81
bool isComplete()
Allows knowing if an image is complete, to save it instantly.
Definition segment_decoder.h:73
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:66
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
Contains functions to identify and process xRIT files.
Core Image class.
MSG/ELEKTRO-L HRIT/LRIT Specific Headers.
Base segmented decoder class.
Definition xrit_file.h:37
Definition xrit_file.h:143