PDF417Decoder.cpp Example File
appdemos/qtws/QZXing/zxing/zxing/pdf417/decoder/PDF417Decoder.cpp
#include <zxing/pdf417/PDF417Reader.h>
#include <zxing/pdf417/decoder/Decoder.h>
#include <zxing/pdf417/decoder/BitMatrixParser.h>
#include <zxing/pdf417/decoder/DecodedBitStreamParser.h>
#include <zxing/ReaderException.h>
#include <zxing/common/reedsolomon/ReedSolomonException.h>
using zxing::pdf417::decoder::Decoder;
using zxing::pdf417::decoder::ec::ErrorCorrection;
using zxing::Ref;
using zxing::DecoderResult;
using zxing::BitMatrix;
using zxing::DecodeHints;
using zxing::ArrayRef;
const int Decoder::MAX_ERRORS = 3;
const int Decoder::MAX_EC_CODEWORDS = 512;
Ref<DecoderResult> Decoder::decode(Ref<BitMatrix> bits, DecodeHints const& hints) {
(void)hints;
BitMatrixParser parser(bits);
ArrayRef<int> codewords(parser.readCodewords());
if (codewords->size() == 0) {
throw FormatException("PDF:Decoder:decode: cannot read codewords");
}
int ecLevel = parser.getECLevel();
int numECCodewords = 1 << (ecLevel + 1);
ArrayRef<int> erasures = parser.getErasures();
correctErrors(codewords, erasures, numECCodewords);
verifyCodewordCount(codewords, numECCodewords);
return DecodedBitStreamParser::decode(codewords);
}
void Decoder::verifyCodewordCount(ArrayRef<int> codewords, int numECCodewords) {
int cwsize = codewords->size();
if (cwsize < 4) {
throw FormatException("PDF:Decoder:verifyCodewordCount: codeword array too small!");
}
int numberOfCodewords = codewords[0];
if (numberOfCodewords > cwsize) {
throw FormatException("PDF:Decoder:verifyCodewordCount: bad codeword number descriptor!");
}
if (numberOfCodewords == 0) {
if (numECCodewords < cwsize) {
codewords[0] = cwsize - numECCodewords;
} else {
throw FormatException("PDF:Decoder:verifyCodewordCount: bad error correction cw number!");
}
}
}
void Decoder::correctErrors(ArrayRef<int> codewords,
ArrayRef<int> erasures, int numECCodewords) {
if (erasures->size() > numECCodewords / 2 + MAX_ERRORS ||
numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) {
throw FormatException("PDF:Decoder:correctErrors: Too many errors or EC Codewords corrupted");
}
Ref<ErrorCorrection> errorCorrection(new ErrorCorrection);
errorCorrection->decode(codewords, numECCodewords, erasures);
for (int i = 0; i < codewords->size(); i++) {
if (codewords[i]<0) {
throw FormatException("PDF:Decoder:correctErrors: Error correction did not succeed!");
}
}
}