Merge "Check bit-depth before creating converters" into tm-dev am: f9591d6ba0
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/18842115
Change-Id: Ifebeb8c742968ea3c3e72f7afe0631dacd6a3c85
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index f27cc21..dc9f848 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -1016,6 +1016,10 @@
array->clear();
Mutexed<Input>::Locked input(mInput);
+ if (!input->buffers) {
+ ALOGE("getInputBufferArray: No Input Buffers allocated");
+ return;
+ }
if (!input->buffers->isArrayMode()) {
input->buffers = input->buffers->toArrayMode(input->numSlots);
}
@@ -1026,7 +1030,10 @@
void CCodecBufferChannel::getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) {
array->clear();
Mutexed<Output>::Locked output(mOutput);
-
+ if (!output->buffers) {
+ ALOGE("getOutputBufferArray: No Output Buffers allocated");
+ return;
+ }
if (!output->buffers->isArrayMode()) {
output->buffers = output->buffers->toArrayMode(output->numSlots);
}
diff --git a/media/codec2/sfplugin/Codec2Buffer.cpp b/media/codec2/sfplugin/Codec2Buffer.cpp
index 6084ee3..cde4c72 100644
--- a/media/codec2/sfplugin/Codec2Buffer.cpp
+++ b/media/codec2/sfplugin/Codec2Buffer.cpp
@@ -268,6 +268,39 @@
mInitCheck = BAD_VALUE;
return;
}
+ std::optional<int> clientBitDepth = {};
+ switch (mClientColorFormat) {
+ case COLOR_FormatYUVP010:
+ clientBitDepth = 10;
+ break;
+ case COLOR_FormatYUV411PackedPlanar:
+ case COLOR_FormatYUV411Planar:
+ case COLOR_FormatYUV420Flexible:
+ case COLOR_FormatYUV420PackedPlanar:
+ case COLOR_FormatYUV420PackedSemiPlanar:
+ case COLOR_FormatYUV420Planar:
+ case COLOR_FormatYUV420SemiPlanar:
+ case COLOR_FormatYUV422Flexible:
+ case COLOR_FormatYUV422PackedPlanar:
+ case COLOR_FormatYUV422PackedSemiPlanar:
+ case COLOR_FormatYUV422Planar:
+ case COLOR_FormatYUV422SemiPlanar:
+ case COLOR_FormatYUV444Flexible:
+ case COLOR_FormatYUV444Interleaved:
+ clientBitDepth = 8;
+ break;
+ default:
+ // no-op; used with optional
+ break;
+
+ }
+ // conversion fails if client bit-depth and the component bit-depth differs
+ if ((clientBitDepth) && (bitDepth != clientBitDepth.value())) {
+ ALOGD("Bit depth of client: %d and component: %d differs",
+ *clientBitDepth, bitDepth);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
C2PlaneInfo yPlane = layout.planes[C2PlanarLayout::PLANE_Y];
C2PlaneInfo uPlane = layout.planes[C2PlanarLayout::PLANE_U];
C2PlaneInfo vPlane = layout.planes[C2PlanarLayout::PLANE_V];
diff --git a/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
index a3a023a..807841e 100644
--- a/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
+++ b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
@@ -121,7 +121,10 @@
} // namespace
status_t ImageCopy(uint8_t *imgBase, const MediaImage2 *img, const C2GraphicView &view) {
- if (view.crop().width != img->mWidth || view.crop().height != img->mHeight) {
+ if (img == nullptr
+ || imgBase == nullptr
+ || view.crop().width != img->mWidth
+ || view.crop().height != img->mHeight) {
return BAD_VALUE;
}
const uint8_t* src_y = view.data()[0];
@@ -203,7 +206,10 @@
}
status_t ImageCopy(C2GraphicView &view, const uint8_t *imgBase, const MediaImage2 *img) {
- if (view.crop().width != img->mWidth || view.crop().height != img->mHeight) {
+ if (img == nullptr
+ || imgBase == nullptr
+ || view.crop().width != img->mWidth
+ || view.crop().height != img->mHeight) {
return BAD_VALUE;
}
const uint8_t* src_y = imgBase + img->mPlane[0].mOffset;