summaryrefslogtreecommitdiff
path: root/src/tools/sstv-encode.cpp
diff options
context:
space:
mode:
authorrimio <vasi.vilvoiu@gmail.com>2019-01-10 01:29:40 +0200
committerrimio <vasi.vilvoiu@gmail.com>2019-01-10 01:29:40 +0200
commitde931b95f6dc358b20fdfdf493013fcd673ac70a (patch)
tree0b801f83be3281cd77da62892de3b95b61587262 /src/tools/sstv-encode.cpp
parent41f3b5f445a98500a345b00bc4a3ce111af652e8 (diff)
PD120 somewhat working
Diffstat (limited to 'src/tools/sstv-encode.cpp')
-rw-r--r--src/tools/sstv-encode.cpp60
1 files changed, 55 insertions, 5 deletions
diff --git a/src/tools/sstv-encode.cpp b/src/tools/sstv-encode.cpp
index 3919968..51b5a33 100644
--- a/src/tools/sstv-encode.cpp
+++ b/src/tools/sstv-encode.cpp
@@ -7,11 +7,11 @@
#include <iostream>
#include <malloc.h>
-#include <sndfile.h>
#include <glog/logging.h>
#include <gflags/gflags.h>
-#include "cimg/CImg.h"
+#include <Magick++.h>
+#include <sndfile.h>
extern "C" {
#include <libsstv.h>
@@ -50,12 +50,62 @@ int main(int argc, char **argv)
/* TODO: parse SSTV mode */
sstv_mode_t mode = SSTV_MODE_PD120;
- /* load image from file (TODO: perform normalization from source to desired properties) */
+ /* get image properties for chosen mode */
+ size_t width, height;
+ sstv_image_format_t format;
+ if (sstv_get_mode_image_props(mode, &width, &height, &format) != SSTV_OK) {
+ LOG(FATAL) << "sstv_get_mode_image_props() failed";
+ }
+
+ /* load image from file */
LOG(INFO) << "Loading image from " << FLAGS_input;
- cimg_library::CImg<unsigned char> input_image = (cimg_library::CImg<>(FLAGS_input.c_str())).RGBtoYCbCr();
+
+ Magick::Image image;
+ std::string map = "";
+ uint8_t *image_buffer = NULL;
+
+ try {
+ /* load from file */
+ image.read(FLAGS_input);
+
+ /* resize */
+ LOG(INFO) << "Resizing to " << width << "x"<<height;
+ Magick::Geometry nsize(width, height);
+ nsize.aspect(true);
+ image.scale(nsize);
+
+ /* format */
+ //format = SSTV_FORMAT_Y;
+ switch (format) {
+ case SSTV_FORMAT_Y:
+ map = "R";
+ image.magick("Y");
+ break;
+
+ case SSTV_FORMAT_YCBCR:
+ map = "RGB";
+ image.colorSpace(Magick::YCbCrColorspace);
+ break;
+
+ case SSTV_FORMAT_RGB:
+ map = "RGB";
+ image.colorSpace(Magick::RGBColorspace);
+ break;
+
+ default:
+ LOG(FATAL) << "Unknown pixel format";
+ break;
+ }
+ } catch (int e) {
+ LOG(FATAL) << "Magick++ failed";
+ }
+
+ /* get raw */
+ Magick::PixelData blob(image, map, Magick::CharPixel);
+ image_buffer = (uint8_t *)blob.data();
sstv_image_t sstv_image;
- if (sstv_pack_image(&sstv_image, input_image.width(), input_image.height(), SSTV_FORMAT_YCBCR, input_image.data()) != SSTV_OK) {
+ if (sstv_pack_image(&sstv_image, width, height, format, image_buffer) != SSTV_OK) {
LOG(FATAL) << "sstv_pack_image() failed";
}