From 3a0b6a588a9cf02fdc5b47644ed446687469a025 Mon Sep 17 00:00:00 2001 From: Alex Zhang Date: Fri, 17 Apr 2020 16:08:24 -0700 Subject: [PATCH 19/21] Allow graceful degradation of MediaProfile with broken configuration. Currently, when media profile declares something unsupported / broken, MediaProfile will crash. This patch will change the behavior to gracefully degradation instead. b/147701370 is an example IRL. If vendor declares profile unsupported in AOSP, Treble firmware will crash instead of having a non-working or suboptimally working camera. Test: Compiles Signed-off-by: Alex Zhang Change-Id: Icc0f85fe0aac748be4d4f7dd94814f615d528a03 --- media/libmedia/MediaProfiles.cpp | 42 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/media/libmedia/MediaProfiles.cpp b/media/libmedia/MediaProfiles.cpp index 98c54971ad..366d90de9e 100644 --- a/media/libmedia/MediaProfiles.cpp +++ b/media/libmedia/MediaProfiles.cpp @@ -194,7 +194,7 @@ MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); - CHECK(codec != -1); + if (codec == -1) return nullptr; MediaProfiles::VideoCodec *videoCodec = new MediaProfiles::VideoCodec(static_cast(codec), @@ -216,7 +216,7 @@ MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) !strcmp("channels", atts[6])); const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); - CHECK(codec != -1); + if (codec == -1) return nullptr; MediaProfiles::AudioCodec *audioCodec = new MediaProfiles::AudioCodec(static_cast(codec), @@ -236,7 +236,7 @@ MediaProfiles::createAudioDecoderCap(const char **atts) const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); const int codec = findTagForName(sAudioDecoderNameMap, nMappings, atts[1]); - CHECK(codec != -1); + if (codec == -1) return nullptr; MediaProfiles::AudioDecoderCap *cap = new MediaProfiles::AudioDecoderCap(static_cast(codec)); @@ -252,7 +252,7 @@ MediaProfiles::createVideoDecoderCap(const char **atts) const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); const int codec = findTagForName(sVideoDecoderNameMap, nMappings, atts[1]); - CHECK(codec != -1); + if (codec == -1) return nullptr; MediaProfiles::VideoDecoderCap *cap = new MediaProfiles::VideoDecoderCap(static_cast(codec)); @@ -276,7 +276,7 @@ MediaProfiles::createVideoEncoderCap(const char **atts) const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); - CHECK(codec != -1); + if (codec == -1) return nullptr; MediaProfiles::VideoEncoderCap *cap = new MediaProfiles::VideoEncoderCap(static_cast(codec), @@ -300,7 +300,7 @@ MediaProfiles::createAudioEncoderCap(const char **atts) const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); - CHECK(codec != -1); + if (codec == -1) return nullptr; MediaProfiles::AudioEncoderCap *cap = new MediaProfiles::AudioEncoderCap(static_cast(codec), atoi(atts[5]), @@ -340,11 +340,11 @@ MediaProfiles::createCamcorderProfile(int cameraId, const char **atts, VectormCameraId = cameraId; @@ -416,24 +416,38 @@ MediaProfiles::startElementHandler(void *userData, const char *name, const char createAudioCodec(atts, profiles); } else if (strcmp("VideoEncoderCap", name) == 0 && strcmp("true", atts[3]) == 0) { - profiles->mVideoEncoders.add(createVideoEncoderCap(atts)); + MediaProfiles::VideoEncoderCap* cap = createVideoEncoderCap(atts); + if (cap != nullptr) { + profiles->mVideoEncoders.add(cap); + } } else if (strcmp("AudioEncoderCap", name) == 0 && strcmp("true", atts[3]) == 0) { - profiles->mAudioEncoders.add(createAudioEncoderCap(atts)); + MediaProfiles::AudioEncoderCap* cap = createAudioEncoderCap(atts); + if (cap != nullptr) { + profiles->mAudioEncoders.add(cap); + } } else if (strcmp("VideoDecoderCap", name) == 0 && strcmp("true", atts[3]) == 0) { - profiles->mVideoDecoders.add(createVideoDecoderCap(atts)); + MediaProfiles::VideoDecoderCap* cap = createVideoDecoderCap(atts); + if (cap != nullptr) { + profiles->mVideoDecoders.add(cap); + } } else if (strcmp("AudioDecoderCap", name) == 0 && strcmp("true", atts[3]) == 0) { - profiles->mAudioDecoders.add(createAudioDecoderCap(atts)); + MediaProfiles::AudioDecoderCap* cap = createAudioDecoderCap(atts); + if (cap != nullptr) { + profiles->mAudioDecoders.add(cap); + } } else if (strcmp("EncoderOutputFileFormat", name) == 0) { profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); } else if (strcmp("CamcorderProfiles", name) == 0) { profiles->mCurrentCameraId = getCameraId(atts); profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts); } else if (strcmp("EncoderProfile", name) == 0) { - profiles->mCamcorderProfiles.add( - createCamcorderProfile(profiles->mCurrentCameraId, atts, profiles->mCameraIds)); + MediaProfiles::CamcorderProfile* profile = createCamcorderProfile(profiles->mCurrentCameraId, atts, profiles->mCameraIds); + if (profile != nullptr) { + profiles->mCamcorderProfiles.add(profile); + } } else if (strcmp("ImageEncoding", name) == 0) { profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); } -- 2.17.1