Loading media/codec2/sfplugin/CCodec.cpp +36 −17 Original line number Original line Diff line number Diff line Loading @@ -1018,29 +1018,31 @@ void CCodec::configure(const sp<AMessage> &msg) { } else { } else { pixelFormatInfo = nullptr; pixelFormatInfo = nullptr; } } std::optional<uint32_t> flexPixelFormat{}; // bit depth -> format std::optional<uint32_t> flexPlanarPixelFormat{}; std::map<uint32_t, uint32_t> flexPixelFormat; std::optional<uint32_t> flexSemiPlanarPixelFormat{}; std::map<uint32_t, uint32_t> flexPlanarPixelFormat; std::map<uint32_t, uint32_t> flexSemiPlanarPixelFormat; if (pixelFormatInfo && *pixelFormatInfo) { if (pixelFormatInfo && *pixelFormatInfo) { for (size_t i = 0; i < pixelFormatInfo->flexCount(); ++i) { for (size_t i = 0; i < pixelFormatInfo->flexCount(); ++i) { const C2FlexiblePixelFormatDescriptorStruct &desc = const C2FlexiblePixelFormatDescriptorStruct &desc = pixelFormatInfo->m.values[i]; pixelFormatInfo->m.values[i]; if (desc.bitDepth != 8 if (desc.subsampling != C2Color::YUV_420 || desc.subsampling != C2Color::YUV_420 // TODO(b/180076105): some device report wrong layout // TODO(b/180076105): some device report wrong layout // || desc.layout == C2Color::INTERLEAVED_PACKED // || desc.layout == C2Color::INTERLEAVED_PACKED // || desc.layout == C2Color::INTERLEAVED_ALIGNED // || desc.layout == C2Color::INTERLEAVED_ALIGNED || desc.layout == C2Color::UNKNOWN_LAYOUT) { || desc.layout == C2Color::UNKNOWN_LAYOUT) { continue; continue; } } if (!flexPixelFormat) { if (flexPixelFormat.count(desc.bitDepth) == 0) { flexPixelFormat = desc.pixelFormat; flexPixelFormat.emplace(desc.bitDepth, desc.pixelFormat); } } if (desc.layout == C2Color::PLANAR_PACKED && !flexPlanarPixelFormat) { if (desc.layout == C2Color::PLANAR_PACKED flexPlanarPixelFormat = desc.pixelFormat; && flexPlanarPixelFormat.count(desc.bitDepth) == 0) { flexPlanarPixelFormat.emplace(desc.bitDepth, desc.pixelFormat); } } if (desc.layout == C2Color::SEMIPLANAR_PACKED && !flexSemiPlanarPixelFormat) { if (desc.layout == C2Color::SEMIPLANAR_PACKED flexSemiPlanarPixelFormat = desc.pixelFormat; && flexSemiPlanarPixelFormat.count(desc.bitDepth) == 0) { flexSemiPlanarPixelFormat.emplace(desc.bitDepth, desc.pixelFormat); } } } } } } Loading @@ -1050,7 +1052,7 @@ void CCodec::configure(const sp<AMessage> &msg) { if (!(config->mDomain & Config::IS_ENCODER)) { if (!(config->mDomain & Config::IS_ENCODER)) { if (surface == nullptr) { if (surface == nullptr) { const char *prefix = ""; const char *prefix = ""; if (flexSemiPlanarPixelFormat) { if (flexSemiPlanarPixelFormat.count(8) != 0) { format = COLOR_FormatYUV420SemiPlanar; format = COLOR_FormatYUV420SemiPlanar; prefix = "semi-"; prefix = "semi-"; } else { } else { Loading @@ -1067,17 +1069,34 @@ void CCodec::configure(const sp<AMessage> &msg) { if ((config->mDomain & Config::IS_ENCODER) || !surface) { if ((config->mDomain & Config::IS_ENCODER) || !surface) { switch (format) { switch (format) { case COLOR_FormatYUV420Flexible: case COLOR_FormatYUV420Flexible: format = flexPixelFormat.value_or(COLOR_FormatYUV420Planar); format = COLOR_FormatYUV420Planar; if (flexPixelFormat.count(8) != 0) { format = flexPixelFormat[8]; } break; break; case COLOR_FormatYUV420Planar: case COLOR_FormatYUV420Planar: case COLOR_FormatYUV420PackedPlanar: case COLOR_FormatYUV420PackedPlanar: format = flexPlanarPixelFormat.value_or( if (flexPlanarPixelFormat.count(8) != 0) { flexPixelFormat.value_or(format)); format = flexPlanarPixelFormat[8]; } else if (flexPixelFormat.count(8) != 0) { format = flexPixelFormat[8]; } break; break; case COLOR_FormatYUV420SemiPlanar: case COLOR_FormatYUV420SemiPlanar: case COLOR_FormatYUV420PackedSemiPlanar: case COLOR_FormatYUV420PackedSemiPlanar: format = flexSemiPlanarPixelFormat.value_or( if (flexSemiPlanarPixelFormat.count(8) != 0) { flexPixelFormat.value_or(format)); format = flexSemiPlanarPixelFormat[8]; } else if (flexPixelFormat.count(8) != 0) { format = flexPixelFormat[8]; } break; case COLOR_FormatYUVP010: format = COLOR_FormatYUVP010; if (flexSemiPlanarPixelFormat.count(10) != 0) { format = flexSemiPlanarPixelFormat[10]; } else if (flexPixelFormat.count(10) != 0) { format = flexPixelFormat[10]; } break; break; default: default: // No-op // No-op Loading media/codec2/sfplugin/Codec2Buffer.cpp +16 −9 Original line number Original line Diff line number Diff line Loading @@ -363,21 +363,22 @@ public: break; break; case COLOR_FormatYUVP010: case COLOR_FormatYUVP010: // stride is in bytes mediaImage->mPlane[mediaImage->Y].mOffset = 0; mediaImage->mPlane[mediaImage->Y].mOffset = 0; mediaImage->mPlane[mediaImage->Y].mColInc = 2; mediaImage->mPlane[mediaImage->Y].mColInc = 2; mediaImage->mPlane[mediaImage->Y].mRowInc = stride * 2; mediaImage->mPlane[mediaImage->Y].mRowInc = stride; mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1; mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1; mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1; mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1; mediaImage->mPlane[mediaImage->U].mOffset = stride * vStride * 2; mediaImage->mPlane[mediaImage->U].mOffset = stride * vStride; mediaImage->mPlane[mediaImage->U].mColInc = 4; mediaImage->mPlane[mediaImage->U].mColInc = 4; mediaImage->mPlane[mediaImage->U].mRowInc = stride * 2; mediaImage->mPlane[mediaImage->U].mRowInc = stride; mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2; mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2; mediaImage->mPlane[mediaImage->V].mOffset = stride * vStride * 2 + 2; mediaImage->mPlane[mediaImage->V].mOffset = stride * vStride + 2; mediaImage->mPlane[mediaImage->V].mColInc = 4; mediaImage->mPlane[mediaImage->V].mColInc = 4; mediaImage->mPlane[mediaImage->V].mRowInc = stride * 2; mediaImage->mPlane[mediaImage->V].mRowInc = stride; mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2; mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2; if (tryWrapping) { if (tryWrapping) { Loading Loading @@ -538,8 +539,8 @@ public: mInitCheck = BAD_VALUE; mInitCheck = BAD_VALUE; return; return; } } bufferSize += stride * vStride // stride is in bytes / plane.rowSampling / plane.colSampling * divUp(mAllocatedDepth, 8u); bufferSize += stride * vStride / plane.rowSampling / plane.colSampling; } } mBackBufferSize = bufferSize; mBackBufferSize = bufferSize; Loading Loading @@ -792,8 +793,14 @@ sp<ConstGraphicBlockBuffer> ConstGraphicBlockBuffer::AllocateEmpty( ALOGD("format had no width / height"); ALOGD("format had no width / height"); return nullptr; return nullptr; } } // NOTE: we currently only support YUV420 formats for byte-buffer mode. int32_t colorFormat = COLOR_FormatYUV420Flexible; sp<ABuffer> aBuffer(alloc(align(width, 16) * align(height, 16) * 3 / 2)); int32_t bpp = 12; // 8(Y) + 2(U) + 2(V) if (format->findInt32(KEY_COLOR_FORMAT, &colorFormat)) { if (colorFormat == COLOR_FormatYUVP010) { bpp = 24; // 16(Y) + 4(U) + 4(V) } } sp<ABuffer> aBuffer(alloc(align(width, 16) * align(height, 16) * bpp / 8)); return new ConstGraphicBlockBuffer( return new ConstGraphicBlockBuffer( format, format, aBuffer, aBuffer, Loading Loading
media/codec2/sfplugin/CCodec.cpp +36 −17 Original line number Original line Diff line number Diff line Loading @@ -1018,29 +1018,31 @@ void CCodec::configure(const sp<AMessage> &msg) { } else { } else { pixelFormatInfo = nullptr; pixelFormatInfo = nullptr; } } std::optional<uint32_t> flexPixelFormat{}; // bit depth -> format std::optional<uint32_t> flexPlanarPixelFormat{}; std::map<uint32_t, uint32_t> flexPixelFormat; std::optional<uint32_t> flexSemiPlanarPixelFormat{}; std::map<uint32_t, uint32_t> flexPlanarPixelFormat; std::map<uint32_t, uint32_t> flexSemiPlanarPixelFormat; if (pixelFormatInfo && *pixelFormatInfo) { if (pixelFormatInfo && *pixelFormatInfo) { for (size_t i = 0; i < pixelFormatInfo->flexCount(); ++i) { for (size_t i = 0; i < pixelFormatInfo->flexCount(); ++i) { const C2FlexiblePixelFormatDescriptorStruct &desc = const C2FlexiblePixelFormatDescriptorStruct &desc = pixelFormatInfo->m.values[i]; pixelFormatInfo->m.values[i]; if (desc.bitDepth != 8 if (desc.subsampling != C2Color::YUV_420 || desc.subsampling != C2Color::YUV_420 // TODO(b/180076105): some device report wrong layout // TODO(b/180076105): some device report wrong layout // || desc.layout == C2Color::INTERLEAVED_PACKED // || desc.layout == C2Color::INTERLEAVED_PACKED // || desc.layout == C2Color::INTERLEAVED_ALIGNED // || desc.layout == C2Color::INTERLEAVED_ALIGNED || desc.layout == C2Color::UNKNOWN_LAYOUT) { || desc.layout == C2Color::UNKNOWN_LAYOUT) { continue; continue; } } if (!flexPixelFormat) { if (flexPixelFormat.count(desc.bitDepth) == 0) { flexPixelFormat = desc.pixelFormat; flexPixelFormat.emplace(desc.bitDepth, desc.pixelFormat); } } if (desc.layout == C2Color::PLANAR_PACKED && !flexPlanarPixelFormat) { if (desc.layout == C2Color::PLANAR_PACKED flexPlanarPixelFormat = desc.pixelFormat; && flexPlanarPixelFormat.count(desc.bitDepth) == 0) { flexPlanarPixelFormat.emplace(desc.bitDepth, desc.pixelFormat); } } if (desc.layout == C2Color::SEMIPLANAR_PACKED && !flexSemiPlanarPixelFormat) { if (desc.layout == C2Color::SEMIPLANAR_PACKED flexSemiPlanarPixelFormat = desc.pixelFormat; && flexSemiPlanarPixelFormat.count(desc.bitDepth) == 0) { flexSemiPlanarPixelFormat.emplace(desc.bitDepth, desc.pixelFormat); } } } } } } Loading @@ -1050,7 +1052,7 @@ void CCodec::configure(const sp<AMessage> &msg) { if (!(config->mDomain & Config::IS_ENCODER)) { if (!(config->mDomain & Config::IS_ENCODER)) { if (surface == nullptr) { if (surface == nullptr) { const char *prefix = ""; const char *prefix = ""; if (flexSemiPlanarPixelFormat) { if (flexSemiPlanarPixelFormat.count(8) != 0) { format = COLOR_FormatYUV420SemiPlanar; format = COLOR_FormatYUV420SemiPlanar; prefix = "semi-"; prefix = "semi-"; } else { } else { Loading @@ -1067,17 +1069,34 @@ void CCodec::configure(const sp<AMessage> &msg) { if ((config->mDomain & Config::IS_ENCODER) || !surface) { if ((config->mDomain & Config::IS_ENCODER) || !surface) { switch (format) { switch (format) { case COLOR_FormatYUV420Flexible: case COLOR_FormatYUV420Flexible: format = flexPixelFormat.value_or(COLOR_FormatYUV420Planar); format = COLOR_FormatYUV420Planar; if (flexPixelFormat.count(8) != 0) { format = flexPixelFormat[8]; } break; break; case COLOR_FormatYUV420Planar: case COLOR_FormatYUV420Planar: case COLOR_FormatYUV420PackedPlanar: case COLOR_FormatYUV420PackedPlanar: format = flexPlanarPixelFormat.value_or( if (flexPlanarPixelFormat.count(8) != 0) { flexPixelFormat.value_or(format)); format = flexPlanarPixelFormat[8]; } else if (flexPixelFormat.count(8) != 0) { format = flexPixelFormat[8]; } break; break; case COLOR_FormatYUV420SemiPlanar: case COLOR_FormatYUV420SemiPlanar: case COLOR_FormatYUV420PackedSemiPlanar: case COLOR_FormatYUV420PackedSemiPlanar: format = flexSemiPlanarPixelFormat.value_or( if (flexSemiPlanarPixelFormat.count(8) != 0) { flexPixelFormat.value_or(format)); format = flexSemiPlanarPixelFormat[8]; } else if (flexPixelFormat.count(8) != 0) { format = flexPixelFormat[8]; } break; case COLOR_FormatYUVP010: format = COLOR_FormatYUVP010; if (flexSemiPlanarPixelFormat.count(10) != 0) { format = flexSemiPlanarPixelFormat[10]; } else if (flexPixelFormat.count(10) != 0) { format = flexPixelFormat[10]; } break; break; default: default: // No-op // No-op Loading
media/codec2/sfplugin/Codec2Buffer.cpp +16 −9 Original line number Original line Diff line number Diff line Loading @@ -363,21 +363,22 @@ public: break; break; case COLOR_FormatYUVP010: case COLOR_FormatYUVP010: // stride is in bytes mediaImage->mPlane[mediaImage->Y].mOffset = 0; mediaImage->mPlane[mediaImage->Y].mOffset = 0; mediaImage->mPlane[mediaImage->Y].mColInc = 2; mediaImage->mPlane[mediaImage->Y].mColInc = 2; mediaImage->mPlane[mediaImage->Y].mRowInc = stride * 2; mediaImage->mPlane[mediaImage->Y].mRowInc = stride; mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1; mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1; mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1; mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1; mediaImage->mPlane[mediaImage->U].mOffset = stride * vStride * 2; mediaImage->mPlane[mediaImage->U].mOffset = stride * vStride; mediaImage->mPlane[mediaImage->U].mColInc = 4; mediaImage->mPlane[mediaImage->U].mColInc = 4; mediaImage->mPlane[mediaImage->U].mRowInc = stride * 2; mediaImage->mPlane[mediaImage->U].mRowInc = stride; mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2; mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2; mediaImage->mPlane[mediaImage->V].mOffset = stride * vStride * 2 + 2; mediaImage->mPlane[mediaImage->V].mOffset = stride * vStride + 2; mediaImage->mPlane[mediaImage->V].mColInc = 4; mediaImage->mPlane[mediaImage->V].mColInc = 4; mediaImage->mPlane[mediaImage->V].mRowInc = stride * 2; mediaImage->mPlane[mediaImage->V].mRowInc = stride; mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2; mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2; mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2; if (tryWrapping) { if (tryWrapping) { Loading Loading @@ -538,8 +539,8 @@ public: mInitCheck = BAD_VALUE; mInitCheck = BAD_VALUE; return; return; } } bufferSize += stride * vStride // stride is in bytes / plane.rowSampling / plane.colSampling * divUp(mAllocatedDepth, 8u); bufferSize += stride * vStride / plane.rowSampling / plane.colSampling; } } mBackBufferSize = bufferSize; mBackBufferSize = bufferSize; Loading Loading @@ -792,8 +793,14 @@ sp<ConstGraphicBlockBuffer> ConstGraphicBlockBuffer::AllocateEmpty( ALOGD("format had no width / height"); ALOGD("format had no width / height"); return nullptr; return nullptr; } } // NOTE: we currently only support YUV420 formats for byte-buffer mode. int32_t colorFormat = COLOR_FormatYUV420Flexible; sp<ABuffer> aBuffer(alloc(align(width, 16) * align(height, 16) * 3 / 2)); int32_t bpp = 12; // 8(Y) + 2(U) + 2(V) if (format->findInt32(KEY_COLOR_FORMAT, &colorFormat)) { if (colorFormat == COLOR_FormatYUVP010) { bpp = 24; // 16(Y) + 4(U) + 4(V) } } sp<ABuffer> aBuffer(alloc(align(width, 16) * align(height, 16) * bpp / 8)); return new ConstGraphicBlockBuffer( return new ConstGraphicBlockBuffer( format, format, aBuffer, aBuffer, Loading