AV1 Encoder: Fix 10bit encoding
This CL adds proper handling of 10bit input data. For now the only
10-bit input supported is P010.
Fixes: 256115786,255277757,253491266,249143037
Bug: 252836071
Test: atest CodecEncoderSurfaceTest
Change-Id: Id74efbc47bd0cc81895ce6d40a939efc19ec9794
diff --git a/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
index 807841e..9004bcf 100644
--- a/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
+++ b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
@@ -313,6 +313,28 @@
&& layout.planes[layout.PLANE_V].rowSampling == 2);
}
+bool IsYUV420_10bit(const C2GraphicView &view) {
+ const C2PlanarLayout &layout = view.layout();
+ return (layout.numPlanes == 3
+ && layout.type == C2PlanarLayout::TYPE_YUV
+ && layout.planes[layout.PLANE_Y].channel == C2PlaneInfo::CHANNEL_Y
+ && layout.planes[layout.PLANE_Y].allocatedDepth == 16
+ && layout.planes[layout.PLANE_Y].bitDepth == 10
+ && layout.planes[layout.PLANE_Y].colSampling == 1
+ && layout.planes[layout.PLANE_Y].rowSampling == 1
+ && layout.planes[layout.PLANE_U].channel == C2PlaneInfo::CHANNEL_CB
+ && layout.planes[layout.PLANE_U].allocatedDepth == 16
+ && layout.planes[layout.PLANE_U].bitDepth == 10
+ && layout.planes[layout.PLANE_U].colSampling == 2
+ && layout.planes[layout.PLANE_U].rowSampling == 2
+ && layout.planes[layout.PLANE_V].channel == C2PlaneInfo::CHANNEL_CR
+ && layout.planes[layout.PLANE_V].allocatedDepth == 16
+ && layout.planes[layout.PLANE_V].bitDepth == 10
+ && layout.planes[layout.PLANE_V].colSampling == 2
+ && layout.planes[layout.PLANE_V].rowSampling == 2);
+}
+
+
bool IsNV12(const C2GraphicView &view) {
if (!IsYUV420(view)) {
return false;
@@ -327,6 +349,24 @@
&& layout.planes[layout.PLANE_V].offset == 1);
}
+bool IsP010(const C2GraphicView &view) {
+ if (!IsYUV420_10bit(view)) {
+ return false;
+ }
+ const C2PlanarLayout &layout = view.layout();
+ return (layout.rootPlanes == 2
+ && layout.planes[layout.PLANE_U].colInc == 4
+ && layout.planes[layout.PLANE_U].rootIx == layout.PLANE_U
+ && layout.planes[layout.PLANE_U].offset == 0
+ && layout.planes[layout.PLANE_V].colInc == 4
+ && layout.planes[layout.PLANE_V].rootIx == layout.PLANE_U
+ && layout.planes[layout.PLANE_V].offset == 2
+ && layout.planes[layout.PLANE_Y].rightShift == 6
+ && layout.planes[layout.PLANE_U].rightShift == 6
+ && layout.planes[layout.PLANE_V].rightShift == 6);
+}
+
+
bool IsNV21(const C2GraphicView &view) {
if (!IsYUV420(view)) {
return false;