aboutsummaryrefslogtreecommitdiffstats
path: root/src/sls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sls.cpp')
-rw-r--r--src/sls.cpp56
1 files changed, 39 insertions, 17 deletions
diff --git a/src/sls.cpp b/src/sls.cpp
index f0b72f7..f6cfb6f 100644
--- a/src/sls.cpp
+++ b/src/sls.cpp
@@ -369,6 +369,19 @@ static void dump_slide(const std::string& dump_name, const uint8_t *blob, size_t
fclose(fd);
}
+static bool filename_specifies_raw_mode(const std::string& fname)
+{
+ const size_t sep = fname.rfind("_");
+ if (sep != std::string::npos) {
+ std::string suffix = fname.substr(sep, std::string::npos);
+ std::transform(suffix.begin(), suffix.end(), suffix.begin(), ::tolower);
+ return suffix == "_padencrawmode.png" or suffix == "_padencrawmode.jpg";
+ }
+ else {
+ return false;
+ }
+}
+
bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides, size_t max_slide_size, const std::string& dump_name)
{
bool result = false;
@@ -377,11 +390,14 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
MagickWand *m_wand = NULL;
#endif
- uint8_t* blob = NULL;
+ uint8_t *raw_blob = NULL;
+ uint8_t *magick_blob = NULL;
size_t blobsize;
bool jfif_not_png = true;
- if (!raw_slides) {
+ const bool raw_slide = filename_specifies_raw_mode(fname) or raw_slides;
+
+ if (!raw_slide) {
#if HAVE_MAGICKWAND
/*! By default, we do resize the image to 320x240, with a quality such that
* the blobsize is at most MAXSLIDESIZE.
@@ -451,7 +467,7 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
if (native_support && height <= 240 && width <= 320 && not jpeg_progr) {
// Don't recompress the image and check if the blobsize is suitable
- blob = MagickGetImageBlob(m_wand, &blobsize);
+ magick_blob = MagickGetImageBlob(m_wand, &blobsize);
if (blobsize <= max_slide_size) {
if (verbose) {
@@ -460,13 +476,13 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
}
resize_required = false;
} else {
- MagickRelinquishMemory(blob);
- blob = NULL;
+ MagickRelinquishMemory(magick_blob);
+ magick_blob = NULL;
}
}
if (resize_required) {
- blobsize = resizeImage(m_wand, &blob, fname, &jfif_not_png, max_slide_size);
+ blobsize = resizeImage(m_wand, &magick_blob, fname, &jfif_not_png, max_slide_size);
} else {
// warn if unresized image smaller than default dimension
warnOnSmallerImage(height, width, fname);
@@ -501,15 +517,15 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
}
// allocate memory to contain the whole file:
- blob = (uint8_t*) malloc(blobsize);
- if (blob == NULL) {
+ raw_blob = (uint8_t*) malloc(blobsize);
+ if (raw_blob == NULL) {
fprintf(stderr, "ODR-PadEnc Error: Memory allocation error\n");
fclose(pFile);
goto encodefile_out;
}
// copy the file into the buffer:
- if (fread(blob, blobsize, 1, pFile) != 1) {
+ if (fread(raw_blob, blobsize, 1, pFile) != 1) {
fprintf(stderr, "ODR-PadEnc Error: Could not read file\n");
fclose(pFile);
goto encodefile_out;
@@ -537,6 +553,12 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
}
if (blobsize) {
+ if (raw_blob == nullptr and magick_blob == nullptr) {
+ fprintf(stderr, "ODR-PadEnc logic error: either raw_blob or magick_blob must be non-null! See src/sls.cpp line %d\n", __LINE__);
+ abort();
+ }
+ const uint8_t *blob = raw_blob ? raw_blob : magick_blob;
+
MSCDG msc;
DATA_GROUP* dgli;
DATA_GROUP* mscdg;
@@ -561,7 +583,7 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
// MOT Body
for (size_t i = 0; i < nseg; i++) {
- unsigned char *curseg = blob + i * MAXSEGLEN;
+ const uint8_t *curseg = blob + i * MAXSEGLEN;
size_t curseglen;
int last;
@@ -589,14 +611,14 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
}
encodefile_out:
- if (blob) {
- if(raw_slides) {
- free(blob);
- } else {
+ if (raw_blob) {
+ free(raw_blob);
+ }
+
+ if (magick_blob) {
#if HAVE_MAGICKWAND
- MagickRelinquishMemory(blob);
+ MagickRelinquishMemory(magick_blob);
#endif
- }
}
#if HAVE_MAGICKWAND
@@ -730,7 +752,7 @@ uint8_vector_t SLSEncoder::createMotHeader(size_t blobsize, int fidx, bool jfif_
void SLSEncoder::createMscDG(MSCDG* msc, unsigned short int dgtype,
int *cindex, unsigned short int segnum, unsigned short int lastseg,
- unsigned short int tid, unsigned char* data,
+ unsigned short int tid, const uint8_t* data,
unsigned short int datalen)
{
msc->extflag = 0;