| // Copyright 2022 Google LLC | |
| // SPDX-License-Identifier: BSD-2-Clause | |
| #ifndef LIBAVIF_TESTS_AVIFINCRTEST_HELPERS_H_ | |
| #define LIBAVIF_TESTS_AVIFINCRTEST_HELPERS_H_ | |
| #include <cstdint> | |
| #include "avif/avif.h" | |
| namespace avif { | |
| namespace testutil { | |
| //------------------------------------------------------------------------------ | |
| // Duplicated from internal.h | |
| // Used for debugging. Define AVIF_BREAK_ON_ERROR to catch the earliest failure | |
| // during encoding or decoding. | |
| #if defined(AVIF_BREAK_ON_ERROR) | |
| static inline void avifBreakOnError() { | |
| // Same mechanism as OpenCV's error() function, or replace by a breakpoint. | |
| int* p = NULL; | |
| *p = 0; | |
| } | |
| #else | |
| #define avifBreakOnError() | |
| #endif | |
| // Used instead of CHECK if needing to return a specific error on failure, | |
| // instead of AVIF_FALSE | |
| #define AVIF_CHECKERR(A, ERR) \ | |
| do { \ | |
| if (!(A)) { \ | |
| avifBreakOnError(); \ | |
| return ERR; \ | |
| } \ | |
| } while (0) | |
| //------------------------------------------------------------------------------ | |
| // Encodes a portion of the image to be decoded incrementally. | |
| void EncodeRectAsIncremental(const avifImage& image, uint32_t width, | |
| uint32_t height, bool create_alpha_if_none, | |
| bool flat_cells, avifRWData* output, | |
| uint32_t* cell_width, uint32_t* cell_height); | |
| // Decodes incrementally the encoded_avif and compares the pixels with the given | |
| // reference. If is_persistent is true, the input encoded_avif is considered as | |
| // accessible during the whole decoding. If give_size_hint is true, the whole | |
| // encoded_avif size is given as a hint to the decoder. use_nth_image_api | |
| // describes whether the NthImage or NextImage decoder API will be used. The | |
| // cell_height of all planes of the encoded_avif is given to estimate the | |
| // incremental granularity. enable_fine_incremental_check checks that sample | |
| // rows are gradually output when feeding more and more input bytes to the | |
| // decoder. | |
| // If 'expect_parse_success_from_partial_file' is true, avifDecoderParse | |
| // should succeed before the whole file is available. Returns an error | |
| // if avifDecoderParse fails until all the bytes are available. | |
| // `expect_parse_success_from_partial_file` should be set to false if the file | |
| // may be using 'idat' or may have some metadata at the end of the file. | |
| avifResult DecodeIncrementally( | |
| const avifRWData& encoded_avif, avifDecoder* decoder, bool is_persistent, | |
| bool give_size_hint, bool use_nth_image_api, const avifImage& reference, | |
| uint32_t cell_height, bool enable_fine_incremental_check = false, | |
| bool expect_whole_file_read = true, | |
| bool expect_parse_success_from_partial_file = true); | |
| // Calls DecodeIncrementally() with the reference being a regular decoding of | |
| // encoded_avif. | |
| avifResult DecodeNonIncrementallyAndIncrementally( | |
| const avifRWData& encoded_avif, avifDecoder* decoder, bool is_persistent, | |
| bool give_size_hint, bool use_nth_image_api, uint32_t cell_height, | |
| bool enable_fine_incremental_check = false, | |
| bool expect_whole_file_read = true, | |
| bool expect_parse_success_from_partial_file = true); | |
| } // namespace testutil | |
| } // namespace avif | |
| #endif // LIBAVIF_TESTS_AVIFINCRTEST_HELPERS_H_ |