private static DecoderResult createDecoderResultFromAmbiguousValues ( int ecLevel , int [ ] codewords , int [ ] erasureArray , int [ ] ambiguousIndexes , int [ ] [ ] ambiguousIndexValues ) throws FormatException , ChecksumException { int [ ] ambiguousIndexCount = new int [ ambiguousIndexes . length ] ; int tries = 100 ; while ( tries -- > 0 ) { for ( int i = 0 ; i < ambiguousIndexCount . length ; i ++ ) { codewords [ ambiguousIndexes [ i ] ] = ambiguousIndexValues [ i ] [ ambiguousIndexCount [ i ] ] ; } try { return decodeCodewords ( codewords , ecLevel , erasureArray ) ; } catch ( ChecksumException ignored ) { // } if ( ambiguousIndexCount . length == 0 ) { throw ChecksumException . getChecksumInstance ( ) ; } for ( int i = 0 ; i < ambiguousIndexCount . length ; i ++ ) { if ( ambiguousIndexCount [ i ] < ambiguousIndexValues [ i ] . length - 1 ) { ambiguousIndexCount [ i ] ++ ; break ; } else { ambiguousIndexCount [ i ] = 0 ; if ( i == ambiguousIndexCount . length - 1 ) { throw ChecksumException . getChecksumInstance ( ) ; } } } } throw ChecksumException . getChecksumInstance ( ) ; }
This method deals with the fact that the decoding process doesn t always yield a single most likely value . The current error correction implementation doesn t deal with erasures very well so it s better to provide a value for these ambiguous codewords instead of treating it as an erasure . The problem is that we don t know which of the ambiguous values to choose . We try decode using the first value and if that fails we use another of the ambiguous values and try to decode again . This usually only happens on very hard to read and decode barcodes so decoding the normal barcodes is not affected by this .