Skip to content

Commit

Permalink
Merge pull request tesseract-ocr#1551 from stweil/bigendian
Browse files Browse the repository at this point in the history
Fix Tesseract for big endian machines
  • Loading branch information
zdenop authored May 3, 2018
2 parents f53290a + 21d5ce5 commit 9ae9750
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 8 deletions.
2 changes: 2 additions & 0 deletions src/ccutil/helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#ifndef TESSERACT_CCUTIL_HELPERS_H_
#define TESSERACT_CCUTIL_HELPERS_H_

#include <cassert>
#include <stdio.h>
#include <string.h>
#include <functional>
Expand Down Expand Up @@ -187,6 +188,7 @@ inline int IntCastRounded(float x) {

// Reverse the order of bytes in a n byte quantity for big/little-endian switch.
inline void ReverseN(void* ptr, int num_bytes) {
assert(num_bytes == 1 || num_bytes == 2 || num_bytes == 4 || num_bytes == 8);
char* cptr = static_cast<char*>(ptr);
int halfsize = num_bytes / 2;
for (int i = 0; i < halfsize; ++i) {
Expand Down
6 changes: 2 additions & 4 deletions src/lstm/input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,12 @@ Input::~Input() {

// Writes to the given file. Returns false in case of error.
bool Input::Serialize(TFile* fp) const {
if (!Network::Serialize(fp)) return false;
if (fp->FWrite(&shape_, sizeof(shape_), 1) != 1) return false;
return true;
return Network::Serialize(fp) && shape_.Serialize(fp);
}

// Reads from the given file. Returns false in case of error.
bool Input::DeSerialize(TFile* fp) {
return fp->FReadEndian(&shape_, sizeof(shape_), 1) == 1;
return shape_.DeSerialize(fp);
}

// Returns an integer reduction factor that the network applies to the
Expand Down
30 changes: 26 additions & 4 deletions src/lstm/static_shape.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,40 @@ class StaticShape {
height_, width_, depth_, loss_type_);
}

bool DeSerialize(TFile *fp) {
int32_t tmp;
bool result =
fp->FReadEndian(&batch_, sizeof(batch_), 1) == 1 &&
fp->FReadEndian(&height_, sizeof(height_), 1) == 1 &&
fp->FReadEndian(&width_, sizeof(width_), 1) == 1 &&
fp->FReadEndian(&depth_, sizeof(depth_), 1) == 1 &&
fp->FReadEndian(&tmp, sizeof(tmp), 1) == 1;
loss_type_ = static_cast<LossType>(tmp);
return result;
}

bool Serialize(TFile *fp) const {
int32_t tmp = loss_type_;
return
fp->FWrite(&batch_, sizeof(batch_), 1) == 1 &&
fp->FWrite(&height_, sizeof(height_), 1) == 1 &&
fp->FWrite(&width_, sizeof(width_), 1) == 1 &&
fp->FWrite(&depth_, sizeof(depth_), 1) == 1 &&
fp->FWrite(&tmp, sizeof(tmp), 1) == 1;
}

private:
// Size of the 4-D tensor input/output to a network. A value of zero is
// allowed for all except depth_ and means to be determined at runtime, and
// regarded as variable.
// Number of elements in a batch, or number of frames in a video stream.
int batch_;
int32_t batch_;
// Height of the image.
int height_;
int32_t height_;
// Width of the image.
int width_;
int32_t width_;
// Depth of the image. (Number of "nodes").
int depth_;
int32_t depth_;
// How to train/interpret the output.
LossType loss_type_;
};
Expand Down

0 comments on commit 9ae9750

Please sign in to comment.