Songyue Han | 130053e | 2024-04-25 22:04:38 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2024 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | //#define LOG_NDEBUG 0 |
| 18 | #define LOG_TAG "CodecCapabilitiesTest" |
| 19 | |
| 20 | #include <utils/Log.h> |
| 21 | |
| 22 | #include <memory> |
| 23 | |
| 24 | #include <gtest/gtest.h> |
| 25 | |
| 26 | #include <binder/Parcel.h> |
| 27 | |
| 28 | #include <media/CodecCapabilities.h> |
| 29 | #include <media/CodecCapabilitiesUtils.h> |
| 30 | #include <media/MediaCodecInfo.h> |
| 31 | |
| 32 | #include <media/stagefright/MediaCodecConstants.h> |
| 33 | #include <media/stagefright/MediaCodecList.h> |
| 34 | #include <media/stagefright/foundation/ABuffer.h> |
| 35 | #include <media/stagefright/foundation/AString.h> |
| 36 | |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 37 | using namespace android; |
| 38 | |
| 39 | class AudioCapsAacTest : public testing::Test { |
| 40 | protected: |
| 41 | AudioCapsAacTest() { |
| 42 | std::string mediaType = MIMETYPE_AUDIO_AAC; |
| 43 | |
| 44 | sp<AMessage> details = new AMessage; |
| 45 | details->setString("bitrate-range", "8000-960000"); |
| 46 | details->setString("max-channel-count", "8"); |
| 47 | details->setString("sample-rate-ranges", |
| 48 | "7350,8000,11025,12000,16000,22050,24000,32000,44100,48000"); |
| 49 | |
| 50 | std::vector<ProfileLevel> profileLevel{ |
| 51 | ProfileLevel(2, 0), |
| 52 | ProfileLevel(5, 0), |
| 53 | ProfileLevel(29, 0), |
| 54 | ProfileLevel(23, 0), |
| 55 | ProfileLevel(39, 0), |
| 56 | ProfileLevel(20, 0), |
| 57 | ProfileLevel(42, 0), |
| 58 | }; |
| 59 | |
| 60 | audioCaps = AudioCapabilities::Create(mediaType, profileLevel, details); |
| 61 | } |
| 62 | |
| 63 | std::shared_ptr<AudioCapabilities> audioCaps; |
| 64 | }; |
| 65 | |
| 66 | TEST_F(AudioCapsAacTest, AudioCaps_Aac_Bitrate) { |
Songyue Han | ad936af | 2024-10-14 23:53:58 +0000 | [diff] [blame] | 67 | const Range<int32_t>& bitrateRange = audioCaps->getBitrateRange(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 68 | EXPECT_EQ(bitrateRange.lower(), 8000) << "bitrate range1 does not match. lower: " |
| 69 | << bitrateRange.lower(); |
| 70 | EXPECT_EQ(bitrateRange.upper(), 510000) << "bitrate range1 does not match. upper: " |
| 71 | << bitrateRange.upper(); |
| 72 | } |
| 73 | |
| 74 | TEST_F(AudioCapsAacTest, AudioCaps_Aac_InputChannelCount) { |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 75 | int32_t maxInputChannelCount = audioCaps->getMaxInputChannelCount(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 76 | EXPECT_EQ(maxInputChannelCount, 8); |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 77 | int32_t minInputChannelCount = audioCaps->getMinInputChannelCount(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 78 | EXPECT_EQ(minInputChannelCount, 1); |
| 79 | } |
| 80 | |
| 81 | TEST_F(AudioCapsAacTest, AudioCaps_Aac_SupportedSampleRates) { |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 82 | const std::vector<int32_t>& sampleRates = audioCaps->getSupportedSampleRates(); |
| 83 | EXPECT_EQ(sampleRates, std::vector<int32_t>({7350, 8000, 11025, 12000, 16000, 22050, |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 84 | 24000, 32000, 44100, 48000})); |
| 85 | |
| 86 | EXPECT_FALSE(audioCaps->isSampleRateSupported(6000)) |
| 87 | << "isSampleRateSupported returned true for unsupported sample rate"; |
| 88 | EXPECT_TRUE(audioCaps->isSampleRateSupported(8000)) |
| 89 | << "isSampleRateSupported returned false for supported sample rate"; |
| 90 | EXPECT_TRUE(audioCaps->isSampleRateSupported(12000)) |
| 91 | << "isSampleRateSupported returned false for supported sample rate"; |
| 92 | EXPECT_FALSE(audioCaps->isSampleRateSupported(44000)) |
| 93 | << "isSampleRateSupported returned true for unsupported sample rate"; |
| 94 | EXPECT_TRUE(audioCaps->isSampleRateSupported(48000)) |
| 95 | << "isSampleRateSupported returned true for unsupported sample rate"; |
| 96 | } |
| 97 | |
| 98 | class AudioCapsRawTest : public testing::Test { |
| 99 | protected: |
| 100 | AudioCapsRawTest() { |
| 101 | std::string mediaType = MIMETYPE_AUDIO_RAW; |
| 102 | |
| 103 | sp<AMessage> details = new AMessage; |
| 104 | details->setString("bitrate-range", "1-10000000"); |
| 105 | details->setString("channel-ranges", "1,2,3,4,5,6,7,8,9,10,11,12"); |
| 106 | details->setString("sample-rate-ranges", "8000-192000"); |
| 107 | |
| 108 | std::vector<ProfileLevel> profileLevel; |
| 109 | |
| 110 | audioCaps = AudioCapabilities::Create(mediaType, profileLevel, details); |
| 111 | } |
| 112 | |
| 113 | std::shared_ptr<AudioCapabilities> audioCaps; |
| 114 | }; |
| 115 | |
| 116 | TEST_F(AudioCapsRawTest, AudioCaps_Raw_Bitrate) { |
Songyue Han | ad936af | 2024-10-14 23:53:58 +0000 | [diff] [blame] | 117 | const Range<int32_t>& bitrateRange = audioCaps->getBitrateRange(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 118 | EXPECT_EQ(bitrateRange.lower(), 1); |
| 119 | EXPECT_EQ(bitrateRange.upper(), 10000000); |
| 120 | } |
| 121 | |
| 122 | TEST_F(AudioCapsRawTest, AudioCaps_Raw_InputChannelCount) { |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 123 | int32_t maxInputChannelCount = audioCaps->getMaxInputChannelCount(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 124 | EXPECT_EQ(maxInputChannelCount, 12); |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 125 | int32_t minInputChannelCount = audioCaps->getMinInputChannelCount(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 126 | EXPECT_EQ(minInputChannelCount, 1); |
| 127 | } |
| 128 | |
| 129 | TEST_F(AudioCapsRawTest, AudioCaps_Raw_InputChannelCountRanges) { |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 130 | const std::vector<Range<int32_t>>& inputChannelCountRanges |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 131 | = audioCaps->getInputChannelCountRanges(); |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 132 | std::vector<Range<int32_t>> expectedOutput({{1,1}, {2,2}, {3,3}, {4,4}, {5,5}, |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 133 | {6,6}, {7,7}, {8,8}, {9,9}, {10,10}, {11,11}, {12,12}}); |
| 134 | ASSERT_EQ(inputChannelCountRanges.size(), expectedOutput.size()); |
| 135 | for (int i = 0; i < inputChannelCountRanges.size(); i++) { |
| 136 | EXPECT_EQ(inputChannelCountRanges.at(i).lower(), expectedOutput.at(i).lower()); |
| 137 | EXPECT_EQ(inputChannelCountRanges.at(i).upper(), expectedOutput.at(i).upper()); |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | TEST_F(AudioCapsRawTest, AudioCaps_Raw_SupportedSampleRates) { |
Songyue Han | c07437e | 2024-11-08 07:43:06 +0000 | [diff] [blame] | 142 | const std::vector<Range<int32_t>>& sampleRateRanges = audioCaps->getSupportedSampleRateRanges(); |
Songyue Han | 73d6d11 | 2024-06-05 17:39:06 +0000 | [diff] [blame] | 143 | EXPECT_EQ(sampleRateRanges.size(), 1); |
| 144 | EXPECT_EQ(sampleRateRanges.at(0).lower(), 8000); |
| 145 | EXPECT_EQ(sampleRateRanges.at(0).upper(), 192000); |
| 146 | |
| 147 | EXPECT_EQ(audioCaps->isSampleRateSupported(7000), false); |
| 148 | EXPECT_EQ(audioCaps->isSampleRateSupported(10000), true); |
| 149 | EXPECT_EQ(audioCaps->isSampleRateSupported(193000), false); |
| 150 | } |
Songyue Han | 4ed0abd | 2024-06-29 00:26:54 +0000 | [diff] [blame] | 151 | |
| 152 | class VideoCapsHevcTest : public testing::Test { |
| 153 | protected: |
| 154 | VideoCapsHevcTest() { |
| 155 | std::string mediaType = MIMETYPE_VIDEO_HEVC; |
| 156 | |
| 157 | sp<AMessage> details = new AMessage; |
| 158 | details->setString("alignment", "2x2"); |
| 159 | details->setString("bitrate-range", "1-120000000"); |
| 160 | details->setString("block-count-range", "1-32640"); |
| 161 | details->setString("block-size", "16x16"); |
| 162 | details->setString("blocks-per-second-range", "1-3916800"); |
| 163 | details->setInt32("feature-adaptive-playback", 0); |
| 164 | details->setInt32("feature-can-swap-width-height", 1); |
| 165 | details->setString("max-concurrent-instances", "16"); |
| 166 | details->setString("measured-frame-rate-1280x720-range", "547-553"); |
| 167 | details->setString("measured-frame-rate-1920x1080-range", "569-572"); |
| 168 | details->setString("measured-frame-rate-352x288-range", "1150-1250"); |
| 169 | details->setString("measured-frame-rate-3840x2160-range", "159-159"); |
| 170 | details->setString("measured-frame-rate-640x360-range", "528-529"); |
| 171 | details->setString("measured-frame-rate-720x480-range", "546-548"); |
| 172 | details->setString("performance-point-1280x720-range", "240"); |
| 173 | details->setString("performance-point-3840x2160-range", "120"); |
| 174 | details->setString("size-range", "64x64-3840x2176"); |
| 175 | |
| 176 | std::vector<ProfileLevel> profileLevel{ |
| 177 | ProfileLevel(1, 8388608), |
| 178 | ProfileLevel(2, 8388608), |
| 179 | ProfileLevel(4096, 8388608), |
| 180 | ProfileLevel(8192, 8388608), |
| 181 | }; |
| 182 | |
| 183 | videoCaps = VideoCapabilities::Create(mediaType, profileLevel, details); |
| 184 | } |
| 185 | |
| 186 | std::shared_ptr<VideoCapabilities> videoCaps; |
| 187 | }; |
| 188 | |
| 189 | TEST_F(VideoCapsHevcTest, VideoCaps_HEVC_Alignment) { |
| 190 | int32_t widthAlignment = videoCaps->getWidthAlignment(); |
| 191 | EXPECT_EQ(widthAlignment, 2); |
| 192 | int32_t heightAlignment = videoCaps->getHeightAlignment(); |
| 193 | EXPECT_EQ(heightAlignment, 2); |
| 194 | } |
| 195 | |
| 196 | TEST_F(VideoCapsHevcTest, VideoCaps_HEVC_BitrateRange) { |
| 197 | const Range<int32_t>& bitrateRange = videoCaps->getBitrateRange(); |
| 198 | EXPECT_EQ(bitrateRange.lower(), 1); |
| 199 | EXPECT_EQ(bitrateRange.upper(), 120000000); |
| 200 | } |
| 201 | |
| 202 | TEST_F(VideoCapsHevcTest, VideoCaps_HEVC_SupportedWidthsAndHeights) { |
| 203 | const Range<int32_t>& supportedWidths = videoCaps->getSupportedWidths(); |
| 204 | EXPECT_EQ(supportedWidths.upper(), 3840); |
| 205 | const Range<int32_t>& supportedHeights = videoCaps->getSupportedHeights(); |
| 206 | EXPECT_EQ(supportedHeights.upper(), 3840); |
| 207 | } |
| 208 | |
| 209 | TEST_F(VideoCapsHevcTest, VideoCaps_HEVC_SupportedFrameRates) { |
| 210 | const Range<int32_t>& supportedFrameRates = videoCaps->getSupportedFrameRates(); |
| 211 | EXPECT_EQ(supportedFrameRates.lower(), 0); |
| 212 | EXPECT_EQ(supportedFrameRates.upper(), 960); |
| 213 | |
| 214 | std::optional<Range<double>> supportedFR720p = videoCaps->getSupportedFrameRatesFor(1280, 720); |
| 215 | EXPECT_EQ(supportedFR720p.value().upper(), 960.0); |
| 216 | std::optional<Range<double>> supportedFR1080p |
| 217 | = videoCaps->getSupportedFrameRatesFor(1920, 1080); |
| 218 | EXPECT_EQ(supportedFR1080p.value().upper(), 480.0); |
| 219 | std::optional<Range<double>> supportedFR4k = videoCaps->getSupportedFrameRatesFor(3840, 2160); |
| 220 | EXPECT_EQ(std::round(supportedFR4k.value().upper()), 121); |
| 221 | } |
| 222 | |
| 223 | TEST_F(VideoCapsHevcTest, VideoCaps_HEVC_AchievableFrameRates) { |
| 224 | std::optional<Range<double>> achievableFR1080p |
| 225 | = videoCaps->getAchievableFrameRatesFor(1920, 1080); |
| 226 | ASSERT_NE(achievableFR1080p, std::nullopt) << "resolution not supported"; |
| 227 | EXPECT_EQ(achievableFR1080p.value().lower(), 569); |
| 228 | EXPECT_EQ(achievableFR1080p.value().upper(), 572); |
| 229 | } |
Songyue Han | a034e24 | 2024-04-25 23:31:56 +0000 | [diff] [blame^] | 230 | |
| 231 | class EncoderCapsAacTest : public testing::Test { |
| 232 | protected: |
| 233 | EncoderCapsAacTest() { |
| 234 | std::string mediaType = MIMETYPE_AUDIO_AAC; |
| 235 | |
| 236 | sp<AMessage> details = new AMessage; |
| 237 | details->setString("bitrate-range", "8000-960000"); |
| 238 | details->setString("max-channel-count", "6"); |
| 239 | details->setString("sample-rate-ranges", |
| 240 | "8000,11025,12000,16000,22050,24000,32000,44100,48000"); |
| 241 | |
| 242 | std::vector<ProfileLevel> profileLevel{ |
| 243 | ProfileLevel(2, 0), |
| 244 | ProfileLevel(5, 0), |
| 245 | ProfileLevel(29, 0), |
| 246 | ProfileLevel(23, 0), |
| 247 | ProfileLevel(39, 0), |
| 248 | }; |
| 249 | |
| 250 | encoderCaps = EncoderCapabilities::Create(mediaType, profileLevel, details); |
| 251 | } |
| 252 | |
| 253 | std::shared_ptr<EncoderCapabilities> encoderCaps; |
| 254 | }; |
| 255 | |
| 256 | |
| 257 | TEST_F(EncoderCapsAacTest, EncoderCaps_AAC_ComplexityRange) { |
| 258 | const Range<int>& complexityRange = encoderCaps->getComplexityRange(); |
| 259 | EXPECT_EQ(complexityRange.lower(), 0); |
| 260 | EXPECT_EQ(complexityRange.upper(), 0); |
| 261 | } |
| 262 | |
| 263 | TEST_F(EncoderCapsAacTest, EncoderCaps_AAC_QualityRange) { |
| 264 | const Range<int>& qualityRange = encoderCaps->getQualityRange(); |
| 265 | EXPECT_EQ(qualityRange.lower(), 0); |
| 266 | EXPECT_EQ(qualityRange.upper(), 0); |
| 267 | } |
| 268 | |
| 269 | TEST_F(EncoderCapsAacTest, EncoderCaps_AAC_SupportedBitrateMode) { |
| 270 | EXPECT_FALSE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CBR)); |
| 271 | EXPECT_TRUE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_VBR)); |
| 272 | EXPECT_FALSE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CQ)); |
| 273 | EXPECT_FALSE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CBR_FD)); |
| 274 | } |
| 275 | |
| 276 | class EncoderCapsFlacTest : public testing::Test { |
| 277 | protected: |
| 278 | EncoderCapsFlacTest() { |
| 279 | std::string mediaType = MIMETYPE_AUDIO_FLAC; |
| 280 | |
| 281 | sp<AMessage> details = new AMessage; |
| 282 | details->setString("bitrate-range", "1-21000000"); |
| 283 | details->setString("complexity-default", "5"); |
| 284 | details->setString("complexity-range", "0-8"); |
| 285 | details->setString("feature-bitrate-modes", "CQ"); |
| 286 | details->setString("max-channel-count", "2"); |
| 287 | details->setString("sample-rate-ranges", "1-655350"); |
| 288 | |
| 289 | std::vector<ProfileLevel> profileLevel; |
| 290 | |
| 291 | encoderCaps = EncoderCapabilities::Create(mediaType, profileLevel, details); |
| 292 | } |
| 293 | |
| 294 | std::shared_ptr<EncoderCapabilities> encoderCaps; |
| 295 | }; |
| 296 | |
| 297 | TEST_F(EncoderCapsFlacTest, EncoderCaps_FLAC_ComplexityRange) { |
| 298 | const Range<int>& complexityRange = encoderCaps->getComplexityRange(); |
| 299 | EXPECT_EQ(complexityRange.lower(), 0); |
| 300 | EXPECT_EQ(complexityRange.upper(), 8); |
| 301 | } |
| 302 | |
| 303 | TEST_F(EncoderCapsFlacTest, EncoderCaps_FLAC_QualityRange) { |
| 304 | const Range<int>& qualityRange = encoderCaps->getQualityRange(); |
| 305 | EXPECT_EQ(qualityRange.lower(), 0); |
| 306 | EXPECT_EQ(qualityRange.upper(), 0); |
| 307 | } |
| 308 | |
| 309 | TEST_F(EncoderCapsFlacTest, EncoderCaps_FLAC_SupportedBitrateMode) { |
| 310 | EXPECT_FALSE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CBR)); |
| 311 | EXPECT_FALSE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_VBR)); |
| 312 | EXPECT_TRUE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CQ)); |
| 313 | EXPECT_FALSE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CBR_FD)); |
| 314 | } |
| 315 | |
| 316 | class EncoderCapsHevcTest : public testing::Test { |
| 317 | protected: |
| 318 | EncoderCapsHevcTest() { |
| 319 | std::string mediaType = MIMETYPE_VIDEO_HEVC; |
| 320 | |
| 321 | sp<AMessage> details = new AMessage; |
| 322 | details->setString("alignment", "2x2"); |
| 323 | details->setString("bitrate-range", "1-120000000"); |
| 324 | details->setString("block-count-range", "1-8160"); |
| 325 | details->setString("block-size", "32x32"); |
| 326 | details->setString("blocks-per-second-range", "1-979200"); |
| 327 | details->setString("feature-bitrate-modes", "VBR,CBR,CQ,CBR-FD"); |
| 328 | details->setInt32("feature-can-swap-width-height", 1); |
| 329 | details->setInt32("feature-qp-bounds", 0); |
| 330 | details->setInt32("feature-vq-minimum-quality", 0); |
| 331 | details->setString("max-concurrent-instances", "16"); |
| 332 | details->setString("measured-frame-rate-1280x720-range", "154-198"); |
| 333 | details->setString("measured-frame-rate-1920x1080-range", "46-97"); |
| 334 | details->setString("measured-frame-rate-320x240-range", "371-553"); |
| 335 | details->setString("measured-frame-rate-720x480-range", "214-305"); |
| 336 | details->setString("performance-point-1280x720-range", "240"); |
| 337 | details->setString("performance-point-3840x2160-range", "120"); |
| 338 | details->setString("quality-default", "57"); |
| 339 | details->setString("quality-range", "0-100"); |
| 340 | details->setString("quality-scale", "linear"); |
| 341 | details->setString("size-range", "64x64-3840x2176"); |
| 342 | |
| 343 | std::vector<ProfileLevel> profileLevel{ |
| 344 | ProfileLevel(1, 2097152), |
| 345 | ProfileLevel(2, 2097152), |
| 346 | ProfileLevel(4096, 2097152), |
| 347 | ProfileLevel(8192, 2097152), |
| 348 | }; |
| 349 | |
| 350 | encoderCaps = EncoderCapabilities::Create(mediaType, profileLevel, details); |
| 351 | } |
| 352 | |
| 353 | std::shared_ptr<EncoderCapabilities> encoderCaps; |
| 354 | }; |
| 355 | |
| 356 | TEST_F(EncoderCapsHevcTest, EncoderCaps_HEVC_ComplexityRange) { |
| 357 | const Range<int>& complexityRange = encoderCaps->getComplexityRange(); |
| 358 | EXPECT_EQ(complexityRange.lower(), 0); |
| 359 | EXPECT_EQ(complexityRange.upper(), 0); |
| 360 | } |
| 361 | |
| 362 | TEST_F(EncoderCapsHevcTest, EncoderCaps_HEVC_QualityRange) { |
| 363 | const Range<int>& qualityRange = encoderCaps->getQualityRange(); |
| 364 | EXPECT_EQ(qualityRange.lower(), 0); |
| 365 | EXPECT_EQ(qualityRange.upper(), 100); |
| 366 | } |
| 367 | |
| 368 | TEST_F(EncoderCapsHevcTest, EncoderCaps_HEVC_SupportedBitrateMode) { |
| 369 | EXPECT_TRUE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CBR)); |
| 370 | EXPECT_TRUE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_VBR)); |
| 371 | EXPECT_TRUE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CQ)); |
| 372 | EXPECT_TRUE(encoderCaps->isBitrateModeSupported(BITRATE_MODE_CBR_FD)); |
| 373 | } |