Codec2BufferUtils: improve ImageCopy efficiency
Perform memcpy by row even by plane if applicable for ImageCopy.
Bug: 119859614
Bug: 120425569
Test: CtsMediaTestCases android.media.cts.DecoderTest#testVP9Decode30fps3840x2160
Test: CtsMediaTestCases android.media.cts.DecoderTest#testVP9Decode60fps3840x2160
Merged-In: I26b6a7a0c3db0f99cc7afcb9fbcdcd4fac0e7c06
Change-Id: I26b6a7a0c3db0f99cc7afcb9fbcdcd4fac0e7c06
(cherry picked from commit 0af065ff53718521f7b598321d8e89b24b5300e9)
diff --git a/media/sfplugin/utils/Codec2BufferUtils.cpp b/media/sfplugin/utils/Codec2BufferUtils.cpp
index b7519da..84d22a3 100644
--- a/media/sfplugin/utils/Codec2BufferUtils.cpp
+++ b/media/sfplugin/utils/Codec2BufferUtils.cpp
@@ -88,16 +88,30 @@
uint32_t planeW = img->mWidth / plane.colSampling;
uint32_t planeH = img->mHeight / plane.rowSampling;
- for (uint32_t row = 0; row < planeH; ++row) {
- decltype(imgRow) imgPtr = imgRow;
- decltype(viewRow) viewPtr = viewRow;
- for (uint32_t col = 0; col < planeW; ++col) {
- MemCopier<ToMediaImage, 0>::copy(imgPtr, viewPtr, bpp);
- imgPtr += img->mPlane[i].mColInc;
- viewPtr += plane.colInc;
+
+ bool canCopyByRow = (plane.colInc == 1) && (img->mPlane[i].mColInc == 1);
+ bool canCopyByPlane = canCopyByRow && (plane.rowInc == img->mPlane[i].mRowInc);
+ if (canCopyByPlane) {
+ MemCopier<ToMediaImage, 0>::copy(imgRow, viewRow, plane.rowInc * planeH);
+ } else if (canCopyByRow) {
+ for (uint32_t row = 0; row < planeH; ++row) {
+ MemCopier<ToMediaImage, 0>::copy(
+ imgRow, viewRow, std::min(plane.rowInc, img->mPlane[i].mRowInc));
+ imgRow += img->mPlane[i].mRowInc;
+ viewRow += plane.rowInc;
}
- imgRow += img->mPlane[i].mRowInc;
- viewRow += plane.rowInc;
+ } else {
+ for (uint32_t row = 0; row < planeH; ++row) {
+ decltype(imgRow) imgPtr = imgRow;
+ decltype(viewRow) viewPtr = viewRow;
+ for (uint32_t col = 0; col < planeW; ++col) {
+ MemCopier<ToMediaImage, 0>::copy(imgPtr, viewPtr, bpp);
+ imgPtr += img->mPlane[i].mColInc;
+ viewPtr += plane.colInc;
+ }
+ imgRow += img->mPlane[i].mRowInc;
+ viewRow += plane.rowInc;
+ }
}
}
return OK;