| 17 | //------------------------------------------------------------------------------ |
| 18 | |
| 19 | void TestEncodeDecode(avifCodecChoice codec, |
| 20 | const std::map<std::string, std::string>& init_cs_options, |
| 21 | bool can_encode, bool use_cq) { |
| 22 | if (avifCodecName(codec, AVIF_CODEC_FLAG_CAN_ENCODE) == nullptr) { |
| 23 | GTEST_SKIP() << "Codec unavailable, skip test."; |
| 24 | } |
| 25 | |
| 26 | constexpr uint32_t kImageSize = 512; |
| 27 | ImagePtr image = testutil::CreateImage(kImageSize, kImageSize, /*depth=*/8, |
| 28 | AVIF_PIXEL_FORMAT_YUV420, |
| 29 | AVIF_PLANES_YUV, AVIF_RANGE_FULL); |
| 30 | ASSERT_NE(image, nullptr); |
| 31 | testutil::FillImageGradient(image.get()); |
| 32 | |
| 33 | // Encode |
| 34 | EncoderPtr encoder(avifEncoderCreate()); |
| 35 | ASSERT_NE(encoder, nullptr); |
| 36 | encoder->codecChoice = codec; |
| 37 | encoder->speed = AVIF_SPEED_FASTEST; |
| 38 | encoder->timescale = 1; |
| 39 | |
| 40 | for (const auto& option : init_cs_options) { |
| 41 | ASSERT_EQ(avifEncoderSetCodecSpecificOption( |
| 42 | encoder.get(), option.first.c_str(), option.second.c_str()), |
| 43 | AVIF_RESULT_OK); |
| 44 | } |
| 45 | |
| 46 | if (use_cq) { |
| 47 | encoder->minQuantizer = 0; |
| 48 | encoder->maxQuantizer = 63; |
| 49 | ASSERT_EQ( |
| 50 | avifEncoderSetCodecSpecificOption(encoder.get(), "end-usage", "q"), |
| 51 | AVIF_RESULT_OK); |
| 52 | ASSERT_EQ( |
| 53 | avifEncoderSetCodecSpecificOption(encoder.get(), "cq-level", "63"), |
| 54 | AVIF_RESULT_OK); |
| 55 | } else { |
| 56 | encoder->minQuantizer = 63; |
| 57 | encoder->maxQuantizer = 63; |
| 58 | } |
| 59 | |
| 60 | ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1, |
| 61 | AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME), |
| 62 | AVIF_RESULT_OK); |
| 63 | |
| 64 | if (use_cq) { |
| 65 | ASSERT_EQ(avifEncoderSetCodecSpecificOption(encoder.get(), "cq-level", "0"), |
| 66 | AVIF_RESULT_OK); |
| 67 | } else { |
| 68 | encoder->minQuantizer = 0; |
| 69 | encoder->maxQuantizer = 0; |
| 70 | } |
| 71 | |
| 72 | if (!can_encode) { |
| 73 | ASSERT_EQ(avifEncoderAddImage(encoder.get(), image.get(), 1, |
| 74 | AVIF_ADD_IMAGE_FLAG_FORCE_KEYFRAME), |
| 75 | AVIF_RESULT_NOT_IMPLEMENTED); |
| 76 |
no test coverage detected