Loading libs/jpegrecoverymap/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -31,4 +31,8 @@ cc_library_static { srcs: [ "recoverymap.cpp", ], shared_libs: [ "libutils", ], } No newline at end of file libs/jpegrecoverymap/include/jpegrecoverymap/recoverymap.h +82 −24 Original line number Diff line number Diff line Loading @@ -14,12 +14,14 @@ * limitations under the License. */ #include <utils/Errors.h> namespace android::recoverymap { /* * Holds information for uncompressed image or recovery map. */ struct jpeg_r_uncompressed_struct { struct jpegr_uncompressed_struct { // Pointer to the data location. void* data; // Width of the recovery map or image in pixels. Loading @@ -31,37 +33,90 @@ struct jpeg_r_uncompressed_struct { /* * Holds information for compressed image or recovery map. */ struct jpeg_r_compressed_struct { struct jpegr_compressed_struct { // Pointer to the data location. void* data; // Data length; int length; }; typedef struct jpeg_r_uncompressed_struct* j_r_uncompressed_ptr; typedef struct jpeg_r_compressed_struct* j_r_compressed_ptr; typedef struct jpegr_uncompressed_struct* jr_uncompressed_ptr; typedef struct jpegr_compressed_struct* jr_compressed_ptr; class RecoveryMap { public: /* * Compress JPEGR image from 10-bit HDR YUV and 8-bit SDR YUV. * * Generate recovery map from the HDR and SDR inputs, compress SDR YUV to 8-bit JPEG and append * the recovery map to the end of the compressed JPEG. * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param dest destination of the compressed JPEGR image * @return NO_ERROR if encoding succeeds, error code if error occurs. */ status_t encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* dest); /* * Compress JPEGR image from 10-bit HDR YUV and 8-bit SDR YUV. * * Generate recovery map from the HDR and SDR inputs, append the recovery map to the end of the * compressed JPEG. * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param compressed_jpeg_image compressed 8-bit JPEG image * @param dest destination of the compressed JPEGR image * @return NO_ERROR if encoding succeeds, error code if error occurs. */ status_t encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* compressed_jpeg_image, void* dest); /* * Compress JPEGR image from 10-bit HDR YUV and 8-bit SDR YUV. * * Decode the compressed 8-bit JPEG image to YUV SDR, generate recovery map from the HDR input * and the decoded SDR result, append the recovery map to the end of the compressed JPEG. * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param compressed_jpeg_image compressed 8-bit JPEG image * @param dest destination of the compressed JPEGR image * @return NO_ERROR if encoding succeeds, error code if error occurs. */ status_t encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, void* compressed_jpeg_image, void* dest); /* * Decompress JPEGR image. * * @param compressed_jpegr_image compressed JPEGR image * @param dest destination of the uncompressed JPEGR image * @return NO_ERROR if decoding succeeds, error code if error occurs. */ status_t decodeJPEGR(void* compressed_jpegr_image, jr_uncompressed_ptr dest); private: /* * This method is called in the decoding pipeline. It will decode the recovery map. * * @param compressed_recovery_map compressed recovery map * @param dest decoded recover map * @return true if decoding succeeds * @return NO_ERROR if decoding succeeds, error code if error occurs. */ bool decodeRecoveryMap(j_r_compressed_ptr compressed_recovery_map, j_r_uncompressed_ptr dest); status_t decodeRecoveryMap(jr_compressed_ptr compressed_recovery_map, jr_uncompressed_ptr dest); /* * This method is called in the encoding pipeline. It will encode the recovery map. * * @param uncompressed_recovery_map uncompressed recovery map * @param dest encoded recover map * @return true if encoding succeeds * @return NO_ERROR if encoding succeeds, error code if error occurs. */ bool encodeRecoveryMap(j_r_uncompressed_ptr uncompressed_recovery_map, j_r_compressed_ptr dest); status_t encodeRecoveryMap(jr_uncompressed_ptr uncompressed_recovery_map, jr_compressed_ptr dest); /* * This method is called in the encoding pipeline. It will take the uncompressed 8-bit and Loading @@ -70,11 +125,11 @@ public: * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param dest recover map * @return true if calculation succeeds * @return NO_ERROR if calculation succeeds, error code if error occurs. */ bool generateRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_p010_image, j_r_uncompressed_ptr dest); status_t generateRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr dest); /* * This method is called in the decoding pipeline. It will take the uncompressed (decoded) Loading @@ -84,20 +139,21 @@ public: * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param uncompressed_recovery_map uncompressed recovery map * @param dest reconstructed HDR image * @return true if calculation succeeds * @return NO_ERROR if calculation succeeds, error code if error occurs. */ bool applyRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_recovery_map, j_r_uncompressed_ptr dest); status_t applyRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_recovery_map, jr_uncompressed_ptr dest); /* * This method is called in the decoding pipeline. It will read XMP metadata to find the start * position of the compressed recovery map, and will extract the compressed recovery map. * * @param compressed_jpeg_r_image compressed JPEG_R image * @return compressed recovery map * @param compressed_jpegr_image compressed JPEGR image * @param dest destination of compressed recovery map * @return NO_ERROR if calculation succeeds, error code if error occurs. */ j_r_compressed_ptr extractRecoveryMap(void* compressed_jpeg_r_image); status_t extractRecoveryMap(void* compressed_jpegr_image, jr_compressed_ptr dest); /* * This method is called in the encoding pipeline. It will take the standard 8-bit JPEG image Loading @@ -106,10 +162,12 @@ public: * * @param compressed_jpeg_image compressed 8-bit JPEG image * @param compress_recovery_map compressed recover map * @return compressed JPEG_R image * @param dest compressed JPEGR image * @return NO_ERROR if calculation succeeds, error code if error occurs. */ void* appendRecoveryMap(void* compressed_jpeg_image, j_r_compressed_ptr compressed_recovery_map); status_t appendRecoveryMap(void* compressed_jpeg_image, jr_compressed_ptr compressed_recovery_map, void* dest); }; } // namespace android::recoverymap libs/jpegrecoverymap/recoverymap.cpp +81 −27 Original line number Diff line number Diff line Loading @@ -18,69 +18,123 @@ namespace android::recoverymap { bool RecoveryMap::decodeRecoveryMap(j_r_compressed_ptr compressed_recovery_map, j_r_uncompressed_ptr dest) { status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* dest) { if (uncompressed_p010_image == nullptr || uncompressed_yuv_420_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* compressed_jpeg_image, void* dest) { if (uncompressed_p010_image == nullptr || uncompressed_yuv_420_image == nullptr || compressed_jpeg_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, void* compressed_jpeg_image, void* dest) { if (uncompressed_p010_image == nullptr || compressed_jpeg_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::decodeJPEGR(void* compressed_jpegr_image, jr_uncompressed_ptr dest) { if (compressed_jpegr_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::decodeRecoveryMap(jr_compressed_ptr compressed_recovery_map, jr_uncompressed_ptr dest) { if (compressed_recovery_map == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } bool RecoveryMap::encodeRecoveryMap(j_r_uncompressed_ptr uncompressed_recovery_map, j_r_compressed_ptr dest) { status_t RecoveryMap::encodeRecoveryMap(jr_uncompressed_ptr uncompressed_recovery_map, jr_compressed_ptr dest) { if (uncompressed_recovery_map == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } bool RecoveryMap::generateRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_p010_image, j_r_uncompressed_ptr dest) { status_t RecoveryMap::generateRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr dest) { if (uncompressed_yuv_420_image == nullptr || uncompressed_p010_image == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } bool RecoveryMap::applyRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_recovery_map, j_r_uncompressed_ptr dest) { status_t RecoveryMap::applyRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_recovery_map, jr_uncompressed_ptr dest) { if (uncompressed_yuv_420_image == nullptr || uncompressed_recovery_map == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } j_r_compressed_ptr RecoveryMap::extractRecoveryMap(void* compressed_jpeg_r_image) { if (compressed_jpeg_r_image == nullptr) { return nullptr; status_t RecoveryMap::extractRecoveryMap(void* compressed_jpegr_image, jr_compressed_ptr dest) { if (compressed_jpegr_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return nullptr; return NO_ERROR; } void* RecoveryMap::appendRecoveryMap(void* compressed_jpeg_image, j_r_compressed_ptr compressed_recovery_map) { if (compressed_jpeg_image == nullptr || compressed_recovery_map == nullptr) { return nullptr; status_t RecoveryMap::appendRecoveryMap(void* compressed_jpeg_image, jr_compressed_ptr compressed_recovery_map, void* dest) { if (compressed_jpeg_image == nullptr || compressed_recovery_map == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return nullptr; return NO_ERROR; } } // namespace android::recoverymap Loading
libs/jpegrecoverymap/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -31,4 +31,8 @@ cc_library_static { srcs: [ "recoverymap.cpp", ], shared_libs: [ "libutils", ], } No newline at end of file
libs/jpegrecoverymap/include/jpegrecoverymap/recoverymap.h +82 −24 Original line number Diff line number Diff line Loading @@ -14,12 +14,14 @@ * limitations under the License. */ #include <utils/Errors.h> namespace android::recoverymap { /* * Holds information for uncompressed image or recovery map. */ struct jpeg_r_uncompressed_struct { struct jpegr_uncompressed_struct { // Pointer to the data location. void* data; // Width of the recovery map or image in pixels. Loading @@ -31,37 +33,90 @@ struct jpeg_r_uncompressed_struct { /* * Holds information for compressed image or recovery map. */ struct jpeg_r_compressed_struct { struct jpegr_compressed_struct { // Pointer to the data location. void* data; // Data length; int length; }; typedef struct jpeg_r_uncompressed_struct* j_r_uncompressed_ptr; typedef struct jpeg_r_compressed_struct* j_r_compressed_ptr; typedef struct jpegr_uncompressed_struct* jr_uncompressed_ptr; typedef struct jpegr_compressed_struct* jr_compressed_ptr; class RecoveryMap { public: /* * Compress JPEGR image from 10-bit HDR YUV and 8-bit SDR YUV. * * Generate recovery map from the HDR and SDR inputs, compress SDR YUV to 8-bit JPEG and append * the recovery map to the end of the compressed JPEG. * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param dest destination of the compressed JPEGR image * @return NO_ERROR if encoding succeeds, error code if error occurs. */ status_t encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* dest); /* * Compress JPEGR image from 10-bit HDR YUV and 8-bit SDR YUV. * * Generate recovery map from the HDR and SDR inputs, append the recovery map to the end of the * compressed JPEG. * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param compressed_jpeg_image compressed 8-bit JPEG image * @param dest destination of the compressed JPEGR image * @return NO_ERROR if encoding succeeds, error code if error occurs. */ status_t encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* compressed_jpeg_image, void* dest); /* * Compress JPEGR image from 10-bit HDR YUV and 8-bit SDR YUV. * * Decode the compressed 8-bit JPEG image to YUV SDR, generate recovery map from the HDR input * and the decoded SDR result, append the recovery map to the end of the compressed JPEG. * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param compressed_jpeg_image compressed 8-bit JPEG image * @param dest destination of the compressed JPEGR image * @return NO_ERROR if encoding succeeds, error code if error occurs. */ status_t encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, void* compressed_jpeg_image, void* dest); /* * Decompress JPEGR image. * * @param compressed_jpegr_image compressed JPEGR image * @param dest destination of the uncompressed JPEGR image * @return NO_ERROR if decoding succeeds, error code if error occurs. */ status_t decodeJPEGR(void* compressed_jpegr_image, jr_uncompressed_ptr dest); private: /* * This method is called in the decoding pipeline. It will decode the recovery map. * * @param compressed_recovery_map compressed recovery map * @param dest decoded recover map * @return true if decoding succeeds * @return NO_ERROR if decoding succeeds, error code if error occurs. */ bool decodeRecoveryMap(j_r_compressed_ptr compressed_recovery_map, j_r_uncompressed_ptr dest); status_t decodeRecoveryMap(jr_compressed_ptr compressed_recovery_map, jr_uncompressed_ptr dest); /* * This method is called in the encoding pipeline. It will encode the recovery map. * * @param uncompressed_recovery_map uncompressed recovery map * @param dest encoded recover map * @return true if encoding succeeds * @return NO_ERROR if encoding succeeds, error code if error occurs. */ bool encodeRecoveryMap(j_r_uncompressed_ptr uncompressed_recovery_map, j_r_compressed_ptr dest); status_t encodeRecoveryMap(jr_uncompressed_ptr uncompressed_recovery_map, jr_compressed_ptr dest); /* * This method is called in the encoding pipeline. It will take the uncompressed 8-bit and Loading @@ -70,11 +125,11 @@ public: * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param uncompressed_p010_image uncompressed HDR image in P010 color format * @param dest recover map * @return true if calculation succeeds * @return NO_ERROR if calculation succeeds, error code if error occurs. */ bool generateRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_p010_image, j_r_uncompressed_ptr dest); status_t generateRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr dest); /* * This method is called in the decoding pipeline. It will take the uncompressed (decoded) Loading @@ -84,20 +139,21 @@ public: * @param uncompressed_yuv_420_image uncompressed SDR image in YUV_420 color format * @param uncompressed_recovery_map uncompressed recovery map * @param dest reconstructed HDR image * @return true if calculation succeeds * @return NO_ERROR if calculation succeeds, error code if error occurs. */ bool applyRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_recovery_map, j_r_uncompressed_ptr dest); status_t applyRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_recovery_map, jr_uncompressed_ptr dest); /* * This method is called in the decoding pipeline. It will read XMP metadata to find the start * position of the compressed recovery map, and will extract the compressed recovery map. * * @param compressed_jpeg_r_image compressed JPEG_R image * @return compressed recovery map * @param compressed_jpegr_image compressed JPEGR image * @param dest destination of compressed recovery map * @return NO_ERROR if calculation succeeds, error code if error occurs. */ j_r_compressed_ptr extractRecoveryMap(void* compressed_jpeg_r_image); status_t extractRecoveryMap(void* compressed_jpegr_image, jr_compressed_ptr dest); /* * This method is called in the encoding pipeline. It will take the standard 8-bit JPEG image Loading @@ -106,10 +162,12 @@ public: * * @param compressed_jpeg_image compressed 8-bit JPEG image * @param compress_recovery_map compressed recover map * @return compressed JPEG_R image * @param dest compressed JPEGR image * @return NO_ERROR if calculation succeeds, error code if error occurs. */ void* appendRecoveryMap(void* compressed_jpeg_image, j_r_compressed_ptr compressed_recovery_map); status_t appendRecoveryMap(void* compressed_jpeg_image, jr_compressed_ptr compressed_recovery_map, void* dest); }; } // namespace android::recoverymap
libs/jpegrecoverymap/recoverymap.cpp +81 −27 Original line number Diff line number Diff line Loading @@ -18,69 +18,123 @@ namespace android::recoverymap { bool RecoveryMap::decodeRecoveryMap(j_r_compressed_ptr compressed_recovery_map, j_r_uncompressed_ptr dest) { status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* dest) { if (uncompressed_p010_image == nullptr || uncompressed_yuv_420_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr uncompressed_yuv_420_image, void* compressed_jpeg_image, void* dest) { if (uncompressed_p010_image == nullptr || uncompressed_yuv_420_image == nullptr || compressed_jpeg_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::encodeJPEGR(jr_uncompressed_ptr uncompressed_p010_image, void* compressed_jpeg_image, void* dest) { if (uncompressed_p010_image == nullptr || compressed_jpeg_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::decodeJPEGR(void* compressed_jpegr_image, jr_uncompressed_ptr dest) { if (compressed_jpegr_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return NO_ERROR; } status_t RecoveryMap::decodeRecoveryMap(jr_compressed_ptr compressed_recovery_map, jr_uncompressed_ptr dest) { if (compressed_recovery_map == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } bool RecoveryMap::encodeRecoveryMap(j_r_uncompressed_ptr uncompressed_recovery_map, j_r_compressed_ptr dest) { status_t RecoveryMap::encodeRecoveryMap(jr_uncompressed_ptr uncompressed_recovery_map, jr_compressed_ptr dest) { if (uncompressed_recovery_map == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } bool RecoveryMap::generateRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_p010_image, j_r_uncompressed_ptr dest) { status_t RecoveryMap::generateRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_p010_image, jr_uncompressed_ptr dest) { if (uncompressed_yuv_420_image == nullptr || uncompressed_p010_image == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } bool RecoveryMap::applyRecoveryMap(j_r_uncompressed_ptr uncompressed_yuv_420_image, j_r_uncompressed_ptr uncompressed_recovery_map, j_r_uncompressed_ptr dest) { status_t RecoveryMap::applyRecoveryMap(jr_uncompressed_ptr uncompressed_yuv_420_image, jr_uncompressed_ptr uncompressed_recovery_map, jr_uncompressed_ptr dest) { if (uncompressed_yuv_420_image == nullptr || uncompressed_recovery_map == nullptr || dest == nullptr) { return false; return BAD_VALUE; } // TBD return true; return NO_ERROR; } j_r_compressed_ptr RecoveryMap::extractRecoveryMap(void* compressed_jpeg_r_image) { if (compressed_jpeg_r_image == nullptr) { return nullptr; status_t RecoveryMap::extractRecoveryMap(void* compressed_jpegr_image, jr_compressed_ptr dest) { if (compressed_jpegr_image == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return nullptr; return NO_ERROR; } void* RecoveryMap::appendRecoveryMap(void* compressed_jpeg_image, j_r_compressed_ptr compressed_recovery_map) { if (compressed_jpeg_image == nullptr || compressed_recovery_map == nullptr) { return nullptr; status_t RecoveryMap::appendRecoveryMap(void* compressed_jpeg_image, jr_compressed_ptr compressed_recovery_map, void* dest) { if (compressed_jpeg_image == nullptr || compressed_recovery_map == nullptr || dest == nullptr) { return BAD_VALUE; } // TBD return nullptr; return NO_ERROR; } } // namespace android::recoverymap