Merge "Remove unused libstagefright_yuv"
diff --git a/media/libstagefright/yuv/Android.mk b/media/libstagefright/yuv/Android.mk
deleted file mode 100644
index 08d202b..0000000
--- a/media/libstagefright/yuv/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- YUVImage.cpp \
- YUVCanvas.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- liblog
-
-LOCAL_MODULE:= libstagefright_yuv
-
-
-LOCAL_CFLAGS += -Werror -Wall
-LOCAL_SANITIZE := signed-integer-overflow
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libstagefright/yuv/MODULE_LICENSE_APACHE2 b/media/libstagefright/yuv/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/media/libstagefright/yuv/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/media/libstagefright/yuv/NOTICE b/media/libstagefright/yuv/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/media/libstagefright/yuv/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2005-2008, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/media/libstagefright/yuv/YUVCanvas.cpp b/media/libstagefright/yuv/YUVCanvas.cpp
deleted file mode 100644
index 4c9fee8..0000000
--- a/media/libstagefright/yuv/YUVCanvas.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_NDEBUG 0
-#define LOG_TAG "YUVCanvas"
-
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/YUVCanvas.h>
-#include <media/stagefright/YUVImage.h>
-#include <ui/Rect.h>
-
-namespace android {
-
-YUVCanvas::YUVCanvas(YUVImage &yuvImage)
- : mYUVImage(yuvImage) {
-}
-
-YUVCanvas::~YUVCanvas() {
-}
-
-void YUVCanvas::FillYUV(uint8_t yValue, uint8_t uValue, uint8_t vValue) {
- for (int32_t y = 0; y < mYUVImage.height(); ++y) {
- for (int32_t x = 0; x < mYUVImage.width(); ++x) {
- mYUVImage.setPixelValue(x, y, yValue, uValue, vValue);
- }
- }
-}
-
-void YUVCanvas::FillYUVRectangle(const Rect& rect,
- uint8_t yValue, uint8_t uValue, uint8_t vValue) {
- for (int32_t y = rect.top; y < rect.bottom; ++y) {
- for (int32_t x = rect.left; x < rect.right; ++x) {
- mYUVImage.setPixelValue(x, y, yValue, uValue, vValue);
- }
- }
-}
-
-void YUVCanvas::CopyImageRect(
- const Rect& srcRect,
- int32_t destStartX, int32_t destStartY,
- const YUVImage &srcImage) {
-
- // Try fast copy first
- if (YUVImage::fastCopyRectangle(
- srcRect,
- destStartX, destStartY,
- srcImage, mYUVImage)) {
- return;
- }
-
- int32_t srcStartX = srcRect.left;
- int32_t srcStartY = srcRect.top;
- for (int32_t offsetY = 0; offsetY < srcRect.height(); ++offsetY) {
- for (int32_t offsetX = 0; offsetX < srcRect.width(); ++offsetX) {
- int32_t srcX = srcStartX + offsetX;
- int32_t srcY = srcStartY + offsetY;
-
- int32_t destX = destStartX + offsetX;
- int32_t destY = destStartY + offsetY;
-
- uint8_t yValue;
- uint8_t uValue;
- uint8_t vValue;
-
- srcImage.getPixelValue(srcX, srcY, &yValue, &uValue, &vValue);
- mYUVImage.setPixelValue(destX, destY, yValue, uValue, vValue);
- }
- }
-}
-
-void YUVCanvas::downsample(
- int32_t srcOffsetX, int32_t srcOffsetY,
- int32_t skipX, int32_t skipY,
- const YUVImage &srcImage) {
- // TODO: Add a low pass filter for downsampling.
-
- // Check that srcImage is big enough to fill mYUVImage.
- CHECK((srcOffsetX + (mYUVImage.width() - 1) * skipX) < srcImage.width());
- CHECK((srcOffsetY + (mYUVImage.height() - 1) * skipY) < srcImage.height());
-
- uint8_t yValue;
- uint8_t uValue;
- uint8_t vValue;
-
- int32_t srcY = srcOffsetY;
- for (int32_t y = 0; y < mYUVImage.height(); ++y) {
- int32_t srcX = srcOffsetX;
- for (int32_t x = 0; x < mYUVImage.width(); ++x) {
- srcImage.getPixelValue(srcX, srcY, &yValue, &uValue, &vValue);
- mYUVImage.setPixelValue(x, y, yValue, uValue, vValue);
-
- srcX += skipX;
- }
- srcY += skipY;
- }
-}
-
-} // namespace android
diff --git a/media/libstagefright/yuv/YUVImage.cpp b/media/libstagefright/yuv/YUVImage.cpp
deleted file mode 100644
index c098135..0000000
--- a/media/libstagefright/yuv/YUVImage.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_NDEBUG 0
-#define LOG_TAG "YUVImage"
-
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/YUVImage.h>
-#include <ui/Rect.h>
-
-namespace android {
-
-YUVImage::YUVImage(YUVFormat yuvFormat, int32_t width, int32_t height) {
- mYUVFormat = yuvFormat;
- mWidth = width;
- mHeight = height;
-
- size_t numberOfBytes = bufferSize(yuvFormat, width, height);
- uint8_t *buffer = new uint8_t[numberOfBytes];
- mBuffer = buffer;
- mOwnBuffer = true;
-
- initializeYUVPointers();
-}
-
-YUVImage::YUVImage(YUVFormat yuvFormat, int32_t width, int32_t height, uint8_t *buffer) {
- mYUVFormat = yuvFormat;
- mWidth = width;
- mHeight = height;
- mBuffer = buffer;
- mOwnBuffer = false;
-
- initializeYUVPointers();
-}
-
-//static
-size_t YUVImage::bufferSize(YUVFormat yuvFormat, int32_t width, int32_t height) {
- int32_t numberOfPixels = width*height;
- size_t numberOfBytes = 0;
- if (yuvFormat == YUV420Planar || yuvFormat == YUV420SemiPlanar) {
- // Y takes numberOfPixels bytes and U/V take numberOfPixels/4 bytes each.
- numberOfBytes = (size_t)(numberOfPixels + (numberOfPixels >> 1));
- } else {
- ALOGE("Format not supported");
- }
- return numberOfBytes;
-}
-
-bool YUVImage::initializeYUVPointers() {
- int32_t numberOfPixels = mWidth * mHeight;
-
- if (mYUVFormat == YUV420Planar) {
- mYdata = (uint8_t *)mBuffer;
- mUdata = mYdata + numberOfPixels;
- mVdata = mUdata + (numberOfPixels >> 2);
- } else if (mYUVFormat == YUV420SemiPlanar) {
- // U and V channels are interleaved as VUVUVU.
- // So V data starts at the end of Y channel and
- // U data starts right after V's start.
- mYdata = (uint8_t *)mBuffer;
- mVdata = mYdata + numberOfPixels;
- mUdata = mVdata + 1;
- } else {
- ALOGE("Format not supported");
- return false;
- }
- return true;
-}
-
-YUVImage::~YUVImage() {
- if (mOwnBuffer) delete[] mBuffer;
-}
-
-bool YUVImage::getOffsets(int32_t x, int32_t y,
- int32_t *yOffset, int32_t *uOffset, int32_t *vOffset) const {
- *yOffset = y*mWidth + x;
-
- int32_t uvOffset = (y >> 1) * (mWidth >> 1) + (x >> 1);
- if (mYUVFormat == YUV420Planar) {
- *uOffset = uvOffset;
- *vOffset = uvOffset;
- } else if (mYUVFormat == YUV420SemiPlanar) {
- // Since U and V channels are interleaved, offsets need
- // to be doubled.
- *uOffset = 2*uvOffset;
- *vOffset = 2*uvOffset;
- } else {
- ALOGE("Format not supported");
- return false;
- }
-
- return true;
-}
-
-bool YUVImage::getOffsetIncrementsPerDataRow(
- int32_t *yDataOffsetIncrement,
- int32_t *uDataOffsetIncrement,
- int32_t *vDataOffsetIncrement) const {
- *yDataOffsetIncrement = mWidth;
-
- int32_t uvDataOffsetIncrement = mWidth >> 1;
-
- if (mYUVFormat == YUV420Planar) {
- *uDataOffsetIncrement = uvDataOffsetIncrement;
- *vDataOffsetIncrement = uvDataOffsetIncrement;
- } else if (mYUVFormat == YUV420SemiPlanar) {
- // Since U and V channels are interleaved, offsets need
- // to be doubled.
- *uDataOffsetIncrement = 2*uvDataOffsetIncrement;
- *vDataOffsetIncrement = 2*uvDataOffsetIncrement;
- } else {
- ALOGE("Format not supported");
- return false;
- }
-
- return true;
-}
-
-uint8_t* YUVImage::getYAddress(int32_t offset) const {
- return mYdata + offset;
-}
-
-uint8_t* YUVImage::getUAddress(int32_t offset) const {
- return mUdata + offset;
-}
-
-uint8_t* YUVImage::getVAddress(int32_t offset) const {
- return mVdata + offset;
-}
-
-bool YUVImage::getYUVAddresses(int32_t x, int32_t y,
- uint8_t **yAddr, uint8_t **uAddr, uint8_t **vAddr) const {
- int32_t yOffset;
- int32_t uOffset;
- int32_t vOffset;
- if (!getOffsets(x, y, &yOffset, &uOffset, &vOffset)) return false;
-
- *yAddr = getYAddress(yOffset);
- *uAddr = getUAddress(uOffset);
- *vAddr = getVAddress(vOffset);
-
- return true;
-}
-
-bool YUVImage::validPixel(int32_t x, int32_t y) const {
- return (x >= 0 && x < mWidth &&
- y >= 0 && y < mHeight);
-}
-
-bool YUVImage::getPixelValue(int32_t x, int32_t y,
- uint8_t *yPtr, uint8_t *uPtr, uint8_t *vPtr) const {
- CHECK(validPixel(x, y));
-
- uint8_t *yAddr;
- uint8_t *uAddr;
- uint8_t *vAddr;
- if (!getYUVAddresses(x, y, &yAddr, &uAddr, &vAddr)) return false;
-
- *yPtr = *yAddr;
- *uPtr = *uAddr;
- *vPtr = *vAddr;
-
- return true;
-}
-
-bool YUVImage::setPixelValue(int32_t x, int32_t y,
- uint8_t yValue, uint8_t uValue, uint8_t vValue) {
- CHECK(validPixel(x, y));
-
- uint8_t *yAddr;
- uint8_t *uAddr;
- uint8_t *vAddr;
- if (!getYUVAddresses(x, y, &yAddr, &uAddr, &vAddr)) return false;
-
- *yAddr = yValue;
- *uAddr = uValue;
- *vAddr = vValue;
-
- return true;
-}
-
-void YUVImage::fastCopyRectangle420Planar(
- const Rect& srcRect,
- int32_t destStartX, int32_t destStartY,
- const YUVImage &srcImage, YUVImage &destImage) {
- CHECK(srcImage.mYUVFormat == YUV420Planar);
- CHECK(destImage.mYUVFormat == YUV420Planar);
-
- int32_t srcStartX = srcRect.left;
- int32_t srcStartY = srcRect.top;
- int32_t width = srcRect.width();
- int32_t height = srcRect.height();
-
- // Get source and destination start addresses
- uint8_t *ySrcAddrBase;
- uint8_t *uSrcAddrBase;
- uint8_t *vSrcAddrBase;
- srcImage.getYUVAddresses(srcStartX, srcStartY,
- &ySrcAddrBase, &uSrcAddrBase, &vSrcAddrBase);
-
- uint8_t *yDestAddrBase;
- uint8_t *uDestAddrBase;
- uint8_t *vDestAddrBase;
- destImage.getYUVAddresses(destStartX, destStartY,
- &yDestAddrBase, &uDestAddrBase, &vDestAddrBase);
-
- // Get source and destination offset increments incurred in going
- // from one data row to next.
- int32_t ySrcOffsetIncrement;
- int32_t uSrcOffsetIncrement;
- int32_t vSrcOffsetIncrement;
- srcImage.getOffsetIncrementsPerDataRow(
- &ySrcOffsetIncrement, &uSrcOffsetIncrement, &vSrcOffsetIncrement);
-
- int32_t yDestOffsetIncrement;
- int32_t uDestOffsetIncrement = 0;
- int32_t vDestOffsetIncrement = 0;
- destImage.getOffsetIncrementsPerDataRow(
- &yDestOffsetIncrement, &uDestOffsetIncrement, &vDestOffsetIncrement);
-
- // Copy Y
- {
- size_t numberOfYBytesPerRow = (size_t) width;
- uint8_t *ySrcAddr = ySrcAddrBase;
- uint8_t *yDestAddr = yDestAddrBase;
- for (int32_t offsetY = 0; offsetY < height; ++offsetY) {
- memcpy(yDestAddr, ySrcAddr, numberOfYBytesPerRow);
-
- ySrcAddr += ySrcOffsetIncrement;
- yDestAddr += yDestOffsetIncrement;
- }
- }
-
- // Copy U
- {
- size_t numberOfUBytesPerRow = (size_t) (width >> 1);
- uint8_t *uSrcAddr = uSrcAddrBase;
- uint8_t *uDestAddr = uDestAddrBase;
- // Every other row has an entry for U/V channel values. Hence only
- // go half the height.
- for (int32_t offsetY = 0; offsetY < (height >> 1); ++offsetY) {
- memcpy(uDestAddr, uSrcAddr, numberOfUBytesPerRow);
-
- uSrcAddr += uSrcOffsetIncrement;
- uDestAddr += uDestOffsetIncrement;
- }
- }
-
- // Copy V
- {
- size_t numberOfVBytesPerRow = (size_t) (width >> 1);
- uint8_t *vSrcAddr = vSrcAddrBase;
- uint8_t *vDestAddr = vDestAddrBase;
- // Every other pixel row has a U/V data row. Hence only go half the height.
- for (int32_t offsetY = 0; offsetY < (height >> 1); ++offsetY) {
- memcpy(vDestAddr, vSrcAddr, numberOfVBytesPerRow);
-
- vSrcAddr += vSrcOffsetIncrement;
- vDestAddr += vDestOffsetIncrement;
- }
- }
-}
-
-void YUVImage::fastCopyRectangle420SemiPlanar(
- const Rect& srcRect,
- int32_t destStartX, int32_t destStartY,
- const YUVImage &srcImage, YUVImage &destImage) {
- CHECK(srcImage.mYUVFormat == YUV420SemiPlanar);
- CHECK(destImage.mYUVFormat == YUV420SemiPlanar);
-
- int32_t srcStartX = srcRect.left;
- int32_t srcStartY = srcRect.top;
- int32_t width = srcRect.width();
- int32_t height = srcRect.height();
-
- // Get source and destination start addresses
- uint8_t *ySrcAddrBase;
- uint8_t *uSrcAddrBase;
- uint8_t *vSrcAddrBase;
- srcImage.getYUVAddresses(srcStartX, srcStartY,
- &ySrcAddrBase, &uSrcAddrBase, &vSrcAddrBase);
-
- uint8_t *yDestAddrBase;
- uint8_t *uDestAddrBase;
- uint8_t *vDestAddrBase;
- destImage.getYUVAddresses(destStartX, destStartY,
- &yDestAddrBase, &uDestAddrBase, &vDestAddrBase);
-
- // Get source and destination offset increments incurred in going
- // from one data row to next.
- int32_t ySrcOffsetIncrement;
- int32_t uSrcOffsetIncrement;
- int32_t vSrcOffsetIncrement;
- srcImage.getOffsetIncrementsPerDataRow(
- &ySrcOffsetIncrement, &uSrcOffsetIncrement, &vSrcOffsetIncrement);
-
- int32_t yDestOffsetIncrement;
- int32_t uDestOffsetIncrement;
- int32_t vDestOffsetIncrement = 0;
- destImage.getOffsetIncrementsPerDataRow(
- &yDestOffsetIncrement, &uDestOffsetIncrement, &vDestOffsetIncrement);
-
- // Copy Y
- {
- size_t numberOfYBytesPerRow = (size_t) width;
- uint8_t *ySrcAddr = ySrcAddrBase;
- uint8_t *yDestAddr = yDestAddrBase;
- for (int32_t offsetY = 0; offsetY < height; ++offsetY) {
- memcpy(yDestAddr, ySrcAddr, numberOfYBytesPerRow);
-
- ySrcAddr = ySrcAddr + ySrcOffsetIncrement;
- yDestAddr = yDestAddr + yDestOffsetIncrement;
- }
- }
-
- // Copy UV
- {
- // UV are interleaved. So number of UV bytes per row is 2*(width/2).
- size_t numberOfUVBytesPerRow = (size_t) width;
- uint8_t *vSrcAddr = vSrcAddrBase;
- uint8_t *vDestAddr = vDestAddrBase;
- // Every other pixel row has a U/V data row. Hence only go half the height.
- for (int32_t offsetY = 0; offsetY < (height >> 1); ++offsetY) {
- memcpy(vDestAddr, vSrcAddr, numberOfUVBytesPerRow);
-
- vSrcAddr += vSrcOffsetIncrement;
- vDestAddr += vDestOffsetIncrement;
- }
- }
-}
-
-// static
-bool YUVImage::fastCopyRectangle(
- const Rect& srcRect,
- int32_t destStartX, int32_t destStartY,
- const YUVImage &srcImage, YUVImage &destImage) {
- if (srcImage.mYUVFormat == destImage.mYUVFormat) {
- if (srcImage.mYUVFormat == YUV420Planar) {
- fastCopyRectangle420Planar(
- srcRect,
- destStartX, destStartY,
- srcImage, destImage);
- } else if (srcImage.mYUVFormat == YUV420SemiPlanar) {
- fastCopyRectangle420SemiPlanar(
- srcRect,
- destStartX, destStartY,
- srcImage, destImage);
- }
- return true;
- }
- return false;
-}
-
-uint8_t clamp(uint8_t v, uint8_t minValue, uint8_t maxValue) {
- CHECK(maxValue >= minValue);
-
- if (v < minValue) return minValue;
- else if (v > maxValue) return maxValue;
- else return v;
-}
-
-void YUVImage::yuv2rgb(uint8_t yValue, uint8_t uValue, uint8_t vValue,
- uint8_t *r, uint8_t *g, uint8_t *b) const {
- int rTmp = yValue + (1.370705 * (vValue-128));
- int gTmp = yValue - (0.698001 * (vValue-128)) - (0.337633 * (uValue-128));
- int bTmp = yValue + (1.732446 * (uValue-128));
-
- *r = clamp(rTmp, 0, 255);
- *g = clamp(gTmp, 0, 255);
- *b = clamp(bTmp, 0, 255);
-}
-
-bool YUVImage::writeToPPM(const char *filename) const {
- FILE *fp = fopen(filename, "w");
- if (fp == NULL) {
- return false;
- }
- fprintf(fp, "P3\n");
- fprintf(fp, "%d %d\n", mWidth, mHeight);
- fprintf(fp, "255\n");
- for (int32_t y = 0; y < mHeight; ++y) {
- for (int32_t x = 0; x < mWidth; ++x) {
- uint8_t yValue = 0u;
- uint8_t uValue = 0u;
- uint8_t vValue = 0u;
- getPixelValue(x, y, &yValue, &uValue, & vValue);
-
- uint8_t rValue;
- uint8_t gValue;
- uint8_t bValue;
- yuv2rgb(yValue, uValue, vValue, &rValue, &gValue, &bValue);
-
- fprintf(fp, "%d %d %d\n", (int32_t)rValue, (int32_t)gValue, (int32_t)bValue);
- }
- }
- fclose(fp);
- return true;
-}
-
-} // namespace android