Merge "goldfish-codecs: improve image data copy"
diff --git a/system/codecs/omx/avcdec/GoldfishAVCDec.cpp b/system/codecs/omx/avcdec/GoldfishAVCDec.cpp
index 31470a5..2cde213 100644
--- a/system/codecs/omx/avcdec/GoldfishAVCDec.cpp
+++ b/system/codecs/omx/avcdec/GoldfishAVCDec.cpp
@@ -237,6 +237,21 @@
}
}
+void GoldfishAVCDec::copyImageData( OMX_BUFFERHEADERTYPE *outHeader, h264_image_t & img) {
+ int myStride = outputBufferWidth();
+ for (int i=0; i < mHeight; ++i) {
+ memcpy(outHeader->pBuffer + i * myStride, img.data + i * mWidth, mWidth);
+ }
+ int Y = myStride * outputBufferHeight();
+ for (int i=0; i < mHeight/2; ++i) {
+ memcpy(outHeader->pBuffer + Y + i * myStride / 2 , img.data + mWidth * mHeight + i * mWidth/2, mWidth/2);
+ }
+ int UV = Y/4;
+ for (int i=0; i < mHeight/2; ++i) {
+ memcpy(outHeader->pBuffer + Y + UV + i * myStride / 2 , img.data + mWidth * mHeight * 5/4 + i * mWidth/2, mWidth/2);
+ }
+}
+
void GoldfishAVCDec::onQueueFilled(OMX_U32 portIndex) {
static int count1=0;
ALOGD("calling %s count %d", __func__, ++count1);
@@ -404,17 +419,10 @@
}
}
outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2;
- int myStride = outputBufferWidth();
- for (int i=0; i < mHeight; ++i) {
- memcpy(outHeader->pBuffer + i * myStride, img.data + i * mWidth, mWidth);
- }
- int Y = myStride * outputBufferHeight();
- for (int i=0; i < mHeight/2; ++i) {
- memcpy(outHeader->pBuffer + Y + i * myStride / 2 , img.data + mWidth * mHeight + i * mWidth/2, mWidth/2);
- }
- int UV = Y/4;
- for (int i=0; i < mHeight/2; ++i) {
- memcpy(outHeader->pBuffer + Y + UV + i * myStride / 2 , img.data + mWidth * mHeight * 5/4 + i * mWidth/2, mWidth/2);
+ if (outputBufferWidth() == mWidth && outputBufferHeight() == mHeight) {
+ memcpy(outHeader->pBuffer, img.data, outHeader->nFilledLen);
+ } else {
+ copyImageData(outHeader, img);
}
outHeader->nTimeStamp = img.pts;
diff --git a/system/codecs/omx/avcdec/GoldfishAVCDec.h b/system/codecs/omx/avcdec/GoldfishAVCDec.h
index 3b25630..f6e68c9 100644
--- a/system/codecs/omx/avcdec/GoldfishAVCDec.h
+++ b/system/codecs/omx/avcdec/GoldfishAVCDec.h
@@ -97,6 +97,8 @@
bool getVUIParams(h264_image_t& img);
+ void copyImageData( OMX_BUFFERHEADERTYPE *outHeader, h264_image_t & img);
+
std::unique_ptr<MediaH264Decoder> mContext;
std::vector<uint8_t> mCsd0;
std::vector<uint8_t> mCsd1;