diff options
Diffstat (limited to 'libs/jpegrecoverymap/recoverymap.cpp')
-rw-r--r-- | libs/jpegrecoverymap/recoverymap.cpp | 69 |
1 files changed, 53 insertions, 16 deletions
diff --git a/libs/jpegrecoverymap/recoverymap.cpp b/libs/jpegrecoverymap/recoverymap.cpp index bc69a83379..1b697436b2 100644 --- a/libs/jpegrecoverymap/recoverymap.cpp +++ b/libs/jpegrecoverymap/recoverymap.cpp @@ -192,6 +192,31 @@ status_t updateExif(jr_exif_ptr exif, jr_exif_ptr dest) { return NO_ERROR; } +/* + * Helper function copies the JPEG image from without EXIF. + * + * @param dest destination of the data to be written. + * @param source source of data being written. + * @param exif_pos position of the EXIF package, which is aligned with jpegdecoder.getEXIFPos(). + * (4 bypes offset to FF sign, the byte after FF E1 XX XX <this byte>). + * @param exif_size exif size without the initial 4 bytes, aligned with jpegdecoder.getEXIFSize(). + */ +void copyJpegWithoutExif(jr_compressed_ptr dest, + jr_compressed_ptr source, + size_t exif_pos, + size_t exif_size) { + memcpy(dest, source, sizeof(jpegr_compressed_struct)); + + const size_t exif_offset = 4; //exif_pos has 4 bypes offset to the FF sign + dest->length = source->length - exif_size - exif_offset; + dest->data = malloc(dest->length); + + memcpy(dest->data, source->data, exif_pos - exif_offset); + memcpy((uint8_t*)dest->data + exif_pos - exif_offset, + (uint8_t*)source->data + exif_pos + exif_size, + source->length - exif_pos - exif_size); +} + /* Encode API-0 */ status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jpegr_transfer_function hdr_tf, @@ -367,17 +392,18 @@ status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, return ERROR_JPEGR_DECODE_ERROR; } + // Update exif. jpegr_exif_struct exif; exif.data = nullptr; exif.length = 0; - // Delete EXIF package if it appears, and update exif. + jpegr_compressed_struct new_jpeg_image; + new_jpeg_image.data = nullptr; + new_jpeg_image.length = 0; if (jpeg_decoder.getEXIFPos() != 0) { - int new_length = compressed_jpeg_image->length - jpeg_decoder.getEXIFSize() - 4; - memcpy((uint8_t*)compressed_jpeg_image->data + jpeg_decoder.getEXIFPos() - 4, - (uint8_t*)compressed_jpeg_image->data + jpeg_decoder.getEXIFPos() - + jpeg_decoder.getEXIFSize(), - compressed_jpeg_image->length - jpeg_decoder.getEXIFPos() - jpeg_decoder.getEXIFSize()); - compressed_jpeg_image->length = new_length; + copyJpegWithoutExif(&new_jpeg_image, + compressed_jpeg_image, + jpeg_decoder.getEXIFPos(), + jpeg_decoder.getEXIFSize()); exif.data = jpeg_decoder.getEXIFPtr(); exif.length = jpeg_decoder.getEXIFSize(); } @@ -395,7 +421,12 @@ status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, JPEGR_CHECK(updateExif(&exif, &new_exif)); JPEGR_CHECK(appendRecoveryMap( - compressed_jpeg_image, &compressed_map, &new_exif, &metadata, dest)); + new_jpeg_image.data == nullptr ? compressed_jpeg_image : &new_jpeg_image, + &compressed_map, &new_exif, &metadata, dest)); + + if (new_jpeg_image.data != nullptr) { + free(new_jpeg_image.data); + } return NO_ERROR; } @@ -421,17 +452,18 @@ status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, uncompressed_yuv_420_image.height = jpeg_decoder.getDecompressedImageHeight(); uncompressed_yuv_420_image.colorGamut = compressed_jpeg_image->colorGamut; + // Update exif. jpegr_exif_struct exif; exif.data = nullptr; exif.length = 0; - // Delete EXIF package if it appears, and update exif. + jpegr_compressed_struct new_jpeg_image; + new_jpeg_image.data = nullptr; + new_jpeg_image.length = 0; if (jpeg_decoder.getEXIFPos() != 0) { - int new_length = compressed_jpeg_image->length - jpeg_decoder.getEXIFSize() - 4; - memcpy((uint8_t*)compressed_jpeg_image->data + jpeg_decoder.getEXIFPos() - 4, - (uint8_t*)compressed_jpeg_image->data + jpeg_decoder.getEXIFPos() - + jpeg_decoder.getEXIFSize(), - compressed_jpeg_image->length - jpeg_decoder.getEXIFPos() - jpeg_decoder.getEXIFSize()); - compressed_jpeg_image->length = new_length; + copyJpegWithoutExif(&new_jpeg_image, + compressed_jpeg_image, + jpeg_decoder.getEXIFPos(), + jpeg_decoder.getEXIFSize()); exif.data = jpeg_decoder.getEXIFPtr(); exif.length = jpeg_decoder.getEXIFSize(); } @@ -472,7 +504,12 @@ status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, JPEGR_CHECK(compressRecoveryMap(&map, &compressed_map)); JPEGR_CHECK(appendRecoveryMap( - compressed_jpeg_image, &compressed_map, &new_exif, &metadata, dest)); + new_jpeg_image.data == nullptr ? compressed_jpeg_image : &new_jpeg_image, + &compressed_map, &new_exif, &metadata, dest)); + + if (new_jpeg_image.data != nullptr) { + free(new_jpeg_image.data); + } return NO_ERROR; } |