From 96624731c31de41968539b7c95b124d0845929e4 Mon Sep 17 00:00:00 2001 From: Nipun Kwatra Date: Thu, 19 Aug 2010 17:45:45 -0700 Subject: [PATCH] Added downsample() Added a downsample function which downsamples the source image starting at an offset and skipping every few pixels. Currently no low pass filtering is done, but it should be added later. Change-Id: Iec34092c536bfc661a15521e6a1ef2ef3f815c61 --- include/media/stagefright/YUVCanvas.h | 12 +++++++++++ media/libstagefright/yuv/YUVCanvas.cpp | 30 +++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/include/media/stagefright/YUVCanvas.h b/include/media/stagefright/YUVCanvas.h index 5e17046b411c5..ff70923f040a7 100644 --- a/include/media/stagefright/YUVCanvas.h +++ b/include/media/stagefright/YUVCanvas.h @@ -55,6 +55,18 @@ public: int32_t destStartX, int32_t destStartY, const YUVImage &srcImage); + // Downsamples the srcImage into the canvas' target image (mYUVImage) + // The downsampling copies pixels from the source image starting at + // (srcOffsetX, srcOffsetY) to the target image, starting at (0, 0). + // For each X increment in the target image, skipX pixels are skipped + // in the source image. + // Similarly for each Y increment in the target image, skipY pixels + // are skipped in the source image. + void downsample( + int32_t srcOffsetX, int32_t srcOffsetY, + int32_t skipX, int32_t skipY, + const YUVImage &srcImage); + private: YUVImage& mYUVImage; diff --git a/media/libstagefright/yuv/YUVCanvas.cpp b/media/libstagefright/yuv/YUVCanvas.cpp index 7ef652dea7fb3..38aa779c94c88 100644 --- a/media/libstagefright/yuv/YUVCanvas.cpp +++ b/media/libstagefright/yuv/YUVCanvas.cpp @@ -17,6 +17,7 @@ #define LOG_NDEBUG 0 #define LOG_TAG "YUVCanvas" +#include #include #include #include @@ -74,10 +75,37 @@ void YUVCanvas::CopyImageRect( uint8_t uValue; uint8_t vValue; - srcImage.getPixelValue(srcX, srcY, &yValue, &uValue, & 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