Skip to content

Commit 4824f94

Browse files
authored
Merge pull request #87 from Digitelektro/develop
Develop
2 parents 935ee55 + 7c9ad6a commit 4824f94

5 files changed

Lines changed: 163 additions & 94 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ if(UNIX AND NOT APPLE)
152152
SET(CPACK_GENERATOR "DEB")
153153
SET(CPACK_PACKAGE_VERSION_MAJOR "2")
154154
SET(CPACK_PACKAGE_VERSION_MINOR "5")
155-
SET(CPACK_PACKAGE_VERSION_PATCH "6")
155+
SET(CPACK_PACKAGE_VERSION_PATCH "7")
156156
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Digitelektro")
157157
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/Digitelektro/MeteorDemod")
158158
SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Russian Meteor M2 weather satellite data decoder")

common/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33

44
#define VERSION_MAJOR 2
55
#define VERSION_MINOR 5
6-
#define VERSION_FIX 6
6+
#define VERSION_FIX 7
77

88
#endif // VERSION_H

decoder/meteorimage.cpp

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ int MeteorImage::getAcReal(uint16_t word) {
151151

152152
MeteorImage::~MeteorImage() {}
153153

154-
cv::Mat MeteorImage::getChannelImage(ChannelIDs APID, bool fillBlackLines) {
155-
if(mFullImage.size() == 0) {
154+
cv::Mat MeteorImage::getChannelImage(APIDs channelID, bool fillBlackLines) {
155+
if(mChannels.size() == 0) {
156156
return cv::Mat();
157157
}
158158

@@ -167,32 +167,9 @@ cv::Mat MeteorImage::getChannelImage(ChannelIDs APID, bool fillBlackLines) {
167167

168168
cv::Vec3b& color = image.at<cv::Vec3b>(y, x);
169169

170-
image.at<cv::Vec3b>(cv::Point(x, y)) = color;
171-
172-
switch(APID) {
173-
case APID_68:
174-
color[0] = mFullImage[off].r;
175-
color[1] = mFullImage[off].r;
176-
color[2] = mFullImage[off].r;
177-
break;
178-
case APID_66:
179-
color[0] = mFullImage[off].r;
180-
color[1] = mFullImage[off].r;
181-
color[2] = mFullImage[off].r;
182-
break;
183-
case APID_65:
184-
color[0] = mFullImage[off].g;
185-
color[1] = mFullImage[off].g;
186-
color[2] = mFullImage[off].g;
187-
break;
188-
case APID_64:
189-
color[0] = mFullImage[off].b;
190-
color[1] = mFullImage[off].b;
191-
color[2] = mFullImage[off].b;
192-
break;
193-
}
194-
195-
image.at<cv::Vec3b>(cv::Point(x, y)) = color;
170+
color[0] = mChannels[off][channelID - 64];
171+
color[1] = mChannels[off][channelID - 64];
172+
color[2] = mChannels[off][channelID - 64];
196173
}
197174
}
198175

@@ -204,24 +181,23 @@ cv::Mat MeteorImage::getChannelImage(ChannelIDs APID, bool fillBlackLines) {
204181
return image;
205182
}
206183

207-
cv::Mat MeteorImage::getRGBImage(ChannelIDs redAPID, ChannelIDs greenAPID, ChannelIDs blueAPID, bool fillBlackLines) {
208-
if(mFullImage.size() == 0) {
184+
cv::Mat MeteorImage::getRGBImage(APIDs redAPID, APIDs greenAPID, APIDs blueAPID, bool fillBlackLines) {
185+
if(mChannels.size() == 0) {
209186
return cv::Mat();
210187
}
211188

212189
int width = 8 * MCU_PER_LINE;
213190
int height = mCurY + 8;
214191
cv::Mat image = cv::Mat(height, width, CV_8UC3);
215-
cv::Vec3b color;
216192

217193
for(int y = 0; y < image.rows; y++) {
218194
for(int x = 0; x < image.cols; x++) {
219195
uint off = x + y * MCU_PER_LINE * 8;
196+
cv::Vec3b& color = image.at<cv::Vec3b>(cv::Point(x, y));
220197

221-
color[0] = (blueAPID == APID_66 || blueAPID == APID_68) ? mFullImage[off].r : (blueAPID == APID_65) ? mFullImage[off].g : mFullImage[off].b;
222-
color[1] = (greenAPID == APID_66 || greenAPID == APID_68) ? mFullImage[off].r : (greenAPID == APID_65) ? mFullImage[off].g : mFullImage[off].b;
223-
color[2] = (redAPID == APID_66 || redAPID == APID_68) ? mFullImage[off].r : (redAPID == APID_65) ? mFullImage[off].g : mFullImage[off].b;
224-
image.at<cv::Vec3b>(cv::Point(x, y)) = color;
198+
color[0] = mChannels[off][blueAPID - 64];
199+
color[1] = mChannels[off][greenAPID - 64];
200+
color[2] = mChannels[off][redAPID - 64];
225201
}
226202
}
227203

@@ -258,7 +234,7 @@ bool MeteorImage::progressImage(int apd, int mcu_id, int pck_cnt) {
258234

259235
mCurY = 8 * ((pck_cnt - mFirstPacket) / (14 + 14 + 14 + 1));
260236
if(mCurY > mLastY) {
261-
mFullImage.resize(MCU_PER_LINE * 8 * (mCurY + 8));
237+
mChannels.resize(MCU_PER_LINE * 8 * (mCurY + 8));
262238
}
263239
mLastY = mCurY;
264240

@@ -314,37 +290,57 @@ void MeteorImage::fillPix(std::array<float, 64>& img_dct, int apd, int mcu_id, i
314290
int y = mCurY + i / 8;
315291
uint off = x + y * MCU_PER_LINE * 8;
316292

317-
if(apd == APID_68 || apd == APID_66) {
318-
mFullImage[off].r = t;
319-
}
320-
if(apd == APID_65) {
321-
mFullImage[off].g = t;
322-
}
323-
if(apd == APID_64) {
324-
mFullImage[off].b = t;
293+
switch(apd) {
294+
case 64:
295+
mChannels[off][APIDs::APID64 - 64] = t;
296+
break;
297+
case 65:
298+
mChannels[off][APIDs::APID65 - 64] = t;
299+
break;
300+
case 66:
301+
mChannels[off][APIDs::APID66 - 64] = t;
302+
break;
303+
case 67:
304+
mChannels[off][APIDs::APID67 - 64] = t;
305+
break;
306+
case 68:
307+
mChannels[off][APIDs::APID68 - 64] = t;
308+
break;
309+
case 69:
310+
mChannels[off][APIDs::APID69 - 64] = t;
311+
break;
312+
313+
default:
314+
break;
325315
}
326316
}
327317
}
328318

329319
void MeteorImage::decMCUs(const uint8_t* packet, int len, int apd, int pck_cnt, int mcu_id, uint8_t q) {
330320
BitIOConst b(packet);
331321

332-
if(!progressImage(apd, mcu_id, pck_cnt))
322+
if(!progressImage(apd, mcu_id, pck_cnt)) {
333323
return;
324+
}
334325

335-
if(apd == APID_64) {
326+
if(apd == APIDs::APID64) {
336327
mIsChannel64Available = true;
337328
}
338-
if(apd == APID_65) {
329+
if(apd == APIDs::APID65) {
339330
mIsChannel65Available = true;
340331
}
341-
342-
if(apd == APID_66) {
332+
if(apd == APIDs::APID66) {
343333
mIsChannel66Available = true;
344334
}
345-
if(apd == APID_68) {
335+
if(apd == APIDs::APID67) {
336+
mIsChannel67Available = true;
337+
}
338+
if(apd == APIDs::APID68) {
346339
mIsChannel68Available = true;
347340
}
341+
if(apd == APIDs::APID69) {
342+
mIsChannel69Available = true;
343+
}
348344

349345
std::array<int, 64> dqt{};
350346
std::array<float, 64> zdct{}, dct{}, img_dct{};

decoder/meteorimage.h

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,6 @@
1919
#define PACK(__Declaration__) __pragma(pack(push, 1)) __Declaration__ __pragma(pack(pop))
2020
#endif
2121

22-
union Pixel {
23-
PACK(struct {
24-
uint8_t b;
25-
uint8_t g;
26-
uint8_t r;
27-
uint8_t a;
28-
});
29-
uint32_t pixel;
30-
};
31-
3222
struct ac_table_rec {
3323
int run;
3424
int size;
@@ -39,19 +29,14 @@ struct ac_table_rec {
3929

4030
class MeteorImage {
4131
public:
42-
enum ChannelIDs {
43-
APID_68 = 68, // R
44-
APID_66 = 66, // B
45-
APID_65 = 65, // G
46-
APID_64 = 64 // R
47-
};
32+
enum APIDs { APID64 = 64, APID65, APID66, APID67, APID68, APID69 };
4833

4934
public:
5035
MeteorImage();
5136
virtual ~MeteorImage();
5237

53-
cv::Mat getRGBImage(ChannelIDs redAPID, ChannelIDs greenAPID, ChannelIDs blueAPID, bool fillBlackLines = true);
54-
cv::Mat getChannelImage(ChannelIDs APID, bool fillBlackLines = true);
38+
cv::Mat getRGBImage(APIDs redAPID, APIDs greenAPID, APIDs blueAPID, bool fillBlackLines = true);
39+
cv::Mat getChannelImage(APIDs APID, bool fillBlackLines = true);
5540

5641
public:
5742
bool isChannel64Available() const {
@@ -63,9 +48,15 @@ class MeteorImage {
6348
bool isChannel66Available() const {
6449
return mIsChannel66Available;
6550
}
51+
bool isChannel67Available() const {
52+
return mIsChannel67Available;
53+
}
6654
bool isChannel68Available() const {
6755
return mIsChannel68Available;
6856
}
57+
bool isChannel69Available() const {
58+
return mIsChannel69Available;
59+
}
6960

7061
protected:
7162
void decMCUs(const uint8_t* packet, int len, int apd, int pck_cnt, int mcu_id, uint8_t q);
@@ -93,9 +84,11 @@ class MeteorImage {
9384
bool mIsChannel64Available;
9485
bool mIsChannel65Available;
9586
bool mIsChannel66Available;
87+
bool mIsChannel67Available;
9688
bool mIsChannel68Available;
89+
bool mIsChannel69Available;
9790

98-
std::vector<Pixel> mFullImage;
91+
std::vector<std::array<uint8_t, 6>> mChannels;
9992
int mLastMCU, mCurY, mLastY, mFirstPacket, mPrevPacket;
10093
std::array<int, 65536> mAcLookup{}, mDcLookup{};
10194
std::array<ac_table_rec, 162> mAcTable{};

0 commit comments

Comments
 (0)