| Index: skia/images/SkImageDecoder_libpvjpeg.cpp
|
| ===================================================================
|
| --- skia/images/SkImageDecoder_libpvjpeg.cpp (revision 16859)
|
| +++ skia/images/SkImageDecoder_libpvjpeg.cpp (working copy)
|
| @@ -1,206 +0,0 @@
|
| -#include "SkImageDecoder.h"
|
| -#include "SkColor.h"
|
| -#include "SkColorPriv.h"
|
| -#include "SkDither.h"
|
| -#include "SkMath.h"
|
| -#include "SkStream.h"
|
| -#include "SkTemplates.h"
|
| -#include "SkUtils.h"
|
| -
|
| -extern void ValidateHeap();
|
| -
|
| -class SkPVJPEGImageDecoder : public SkImageDecoder {
|
| -protected:
|
| - virtual bool onDecode(SkStream* stream, SkBitmap* bm,
|
| - SkBitmap::Config pref, Mode);
|
| -
|
| -private:
|
| - enum {
|
| - STORAGE_SIZE = 8 * 1024
|
| - };
|
| - char fStorage[STORAGE_SIZE];
|
| -};
|
| -
|
| -SkImageDecoder* SkImageDecoder_PVJPEG_Factory(SkStream* stream)
|
| -{
|
| - return SkNEW(SkPVJPEGImageDecoder);
|
| -}
|
| -
|
| -#include "pvjpgdecoderinterface.h"
|
| -#include "pvjpgdecoder_factory.h"
|
| -
|
| -class AutoPVDelete {
|
| -public:
|
| - AutoPVDelete(PVJpgDecoderInterface* codec) : fCodec(codec) {}
|
| - ~AutoPVDelete() {
|
| - fCodec->Reset();
|
| - PVJpgDecoderFactory::DeletePVJpgDecoder(fCodec);
|
| - }
|
| -private:
|
| - PVJpgDecoderInterface* fCodec;
|
| -};
|
| -
|
| -class MyObserver : public MPVJpegDecObserver {
|
| -public:
|
| - MyObserver() : fCount(0) {}
|
| - ~MyObserver() {
|
| - if (fCount != 0) {
|
| - SkDebugf("--- pvjpeg left %d allocations\n", fCount);
|
| - }
|
| - }
|
| -
|
| - virtual void allocateBuffer(uint8* &buffer, int32 buffersize) {
|
| - ++fCount;
|
| - // we double the allocation to work around bug when height is odd
|
| - buffer = (uint8*)sk_malloc_throw(buffersize << 1);
|
| - SkDebugf("--- pvjpeg alloc [%d] %d addr=%p\n", fCount, buffersize, buffer);
|
| - }
|
| -
|
| - virtual void deallocateBuffer(uint8 *buffer) {
|
| - SkDebugf("--- pvjpeg free [%d] addr=%p\n", fCount, buffer);
|
| - --fCount;
|
| - sk_free(buffer);
|
| - }
|
| -
|
| -private:
|
| - int fCount;
|
| -};
|
| -
|
| -static void check_status(TPvJpgDecStatus status) {
|
| - if (TPVJPGDEC_SUCCESS != status) {
|
| - SkDEBUGF(("--- pvjpeg status %d\n", status));
|
| - }
|
| -}
|
| -
|
| -static bool getFrame(PVJpgDecoderInterface* codec, SkBitmap* bitmap,
|
| - SkBitmap::Config prefConfig, SkImageDecoder::Mode mode) {
|
| - TPvJpgDecInfo info;
|
| - TPvJpgDecStatus status = codec->GetInfo(&info);
|
| - if (status != TPVJPGDEC_SUCCESS)
|
| - return false;
|
| -
|
| - int width = info.iWidth[0];
|
| - int height = info.iHeight[0];
|
| -
|
| - bitmap->setConfig(SkBitmap::kRGB_565_Config, width, height);
|
| - bitmap->setIsOpaque(true);
|
| -
|
| - if (SkImageDecoder::kDecodeBounds_Mode == mode) {
|
| - return true;
|
| - }
|
| -
|
| - SkASSERT(info.iNumComponent == 3);
|
| -
|
| - TPvJpgDecOutputFmt format;
|
| - format.iColorFormat = TPV_COLORFMT_RGB16;
|
| - format.iCropped.topLeftX = 0;
|
| - format.iCropped.topLeftY = 0;
|
| - format.iCropped.bottomRightX = width - 1;
|
| - format.iCropped.bottomRightY = height - 1;
|
| - format.iOutputPitch = bitmap->rowBytes() >> 1;
|
| - status = codec->SetOutput(&format);
|
| - if (status != TPVJPGDEC_SUCCESS) {
|
| - SkDebugf("--- PV SetOutput failed %d\n", status);
|
| - return false;
|
| - }
|
| -
|
| - TPvJpgDecFrame frame;
|
| - uint8* ptrs[3];
|
| - int32 widths[3], heights[3];
|
| - bzero(ptrs, sizeof(ptrs));
|
| - frame.ptr = ptrs;
|
| - frame.iWidth = widths;
|
| - frame.iHeight = heights;
|
| -
|
| - status = codec->GetFrame(&frame);
|
| - if (status != TPVJPGDEC_SUCCESS) {
|
| - SkDebugf("--- PV GetFrame failed %d\n", status);
|
| - return false;
|
| - }
|
| -
|
| - bitmap->allocPixels();
|
| - memcpy(bitmap->getPixels(), ptrs[0], bitmap->getSize());
|
| - return true;
|
| -}
|
| -
|
| -class OsclCleanupper {
|
| -public:
|
| - OsclCleanupper() {
|
| - OsclBase::Init();
|
| - OsclErrorTrap::Init();
|
| - OsclMem::Init();
|
| - }
|
| - ~OsclCleanupper() {
|
| - OsclMem::Cleanup();
|
| - OsclErrorTrap::Cleanup();
|
| - OsclBase::Cleanup();
|
| - }
|
| -};
|
| -
|
| -bool SkPVJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap,
|
| - SkBitmap::Config prefConfig, Mode mode)
|
| -{
|
| - // do I need this guy?
|
| - OsclCleanupper oc;
|
| -
|
| - PVJpgDecoderInterface* codec = PVJpgDecoderFactory::CreatePVJpgDecoder();
|
| - TPvJpgDecStatus status = codec->Init();
|
| - check_status(status);
|
| -
|
| - MyObserver observer; // must create before autopvdelete
|
| - AutoPVDelete ad(codec);
|
| -
|
| - status = codec->SetObserver(&observer);
|
| - check_status(status);
|
| -
|
| - char* storage = fStorage;
|
| - int32 bytesInStorage = 0;
|
| - for (;;)
|
| - {
|
| - int32 bytesRead = stream->read(storage + bytesInStorage,
|
| - STORAGE_SIZE - bytesInStorage);
|
| - if (bytesRead <= 0) {
|
| - SkDEBUGF(("SkPVJPEGImageDecoder: stream read returned %d\n", bytesRead));
|
| - return false;
|
| - }
|
| -
|
| - // update bytesInStorage to account for the read()
|
| - bytesInStorage += bytesRead;
|
| - SkASSERT(bytesInStorage <= STORAGE_SIZE);
|
| -
|
| - // now call Decode to eat some of the bytes
|
| - int32 consumed = bytesInStorage;
|
| - status = codec->Decode((uint8*)storage, &consumed);
|
| -
|
| - SkASSERT(bytesInStorage >= consumed);
|
| - bytesInStorage -= consumed;
|
| - // now bytesInStorage is the remaining unread bytes
|
| - if (bytesInStorage > 0) { // slide the leftovers to the beginning
|
| - SkASSERT(storage == fStorage);
|
| - SkASSERT(consumed >= 0 && bytesInStorage >= 0);
|
| - SkASSERT((size_t)(consumed + bytesInStorage) <= sizeof(fStorage));
|
| - SkASSERT(sizeof(fStorage) == STORAGE_SIZE);
|
| - // SkDebugf("-- memmov srcOffset=%d, numBytes=%d\n", consumed, bytesInStorage);
|
| - memmove(storage, storage + consumed, bytesInStorage);
|
| - }
|
| -
|
| - switch (status) {
|
| - case TPVJPGDEC_SUCCESS:
|
| - SkDEBUGF(("SkPVJPEGImageDecoder::Decode returned success?\n");)
|
| - return false;
|
| - case TPVJPGDEC_FRAME_READY:
|
| - case TPVJPGDEC_DONE:
|
| - return getFrame(codec, decodedBitmap, prefConfig, mode);
|
| - case TPVJPGDEC_FAIL:
|
| - case TPVJPGDEC_INVALID_MEMORY:
|
| - case TPVJPGDEC_INVALID_PARAMS:
|
| - case TPVJPGDEC_NO_IMAGE_DATA:
|
| - SkDEBUGF(("SkPVJPEGImageDecoder: failed to decode err=%d\n", status);)
|
| - return false;
|
| - case TPVJPGDEC_WAITING_FOR_INPUT:
|
| - break; // loop around and eat more from the stream
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
|
|