15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef ImageFrameGenerator_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define ImageFrameGenerator_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "SkBitmap.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkSize.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "SkTypes.h" 32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h" 33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/graphics/ThreadSafeDataTransport.h" 347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/PassOwnPtr.h" 357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/PassRefPtr.h" 367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/RefCounted.h" 377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/RefPtr.h" 387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/ThreadingPrimitives.h" 397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/ThreadSafeRefCounted.h" 407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Vector.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ImageDecoder; 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ImagePlanes; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SharedBuffer; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT ImageDecoderFactory { 49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(ImageDecoderFactory); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 51a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ImageDecoderFactory() {} 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual ~ImageDecoderFactory() { } 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual PassOwnPtr<ImageDecoder> create() = 0; 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 56a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT ImageFrameGenerator : public ThreadSafeRefCounted<ImageFrameGenerator> { 57a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(ImageFrameGenerator); 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public: 597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch static PassRefPtr<ImageFrameGenerator> create(const SkISize& fullSize, PassRefPtr<SharedBuffer> data, bool allDataReceived, bool isMultiFrame = false) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return adoptRef(new ImageFrameGenerator(fullSize, data, allDataReceived, isMultiFrame)); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ImageFrameGenerator(const SkISize& fullSize, PassRefPtr<SharedBuffer>, bool allDataReceived, bool isMultiFrame); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~ImageFrameGenerator(); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Decodes and scales the specified frame indicated by |index|. Dimensions 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // and output format are specified in |info|. Decoded pixels are written 6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // into |pixels| with a stride of |rowBytes|. 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Returns true if decoding was successful. 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool decodeAndScale(const SkImageInfo&, size_t index, void* pixels, size_t rowBytes); 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Decodes YUV components directly into the provided memory planes. 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool decodeToYUV(SkISize componentSizes[3], void* planes[3], size_t rowBytes[3]); 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setData(PassRefPtr<SharedBuffer>, bool allDataReceived); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Creates a new SharedBuffer containing the data received so far. 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void copyData(RefPtr<SharedBuffer>*, bool* allDataReceived); 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) SkISize getFullSize() const { return m_fullSize; } 8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch bool isMultiFrame() const { return m_isMultiFrame; } 857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 867757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // FIXME: Return alpha state for each frame. 877757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch bool hasAlpha(size_t); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool getYUVComponentSizes(SkISize componentSizes[3]); 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) class ExternalMemoryAllocator; 93bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) friend class ImageFrameGeneratorTest; 94bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) friend class DeferredImageDecoderTest; 95bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // For testing. |factory| will overwrite the default ImageDecoder creation logic if |factory->create()| returns non-zero. 96bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) void setImageDecoderFactory(PassOwnPtr<ImageDecoderFactory> factory) { m_imageDecoderFactory = factory; } 97bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void setHasAlpha(size_t index, bool hasAlpha); 997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // These methods are called while m_decodeMutex is locked. 1019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) SkBitmap tryToResumeDecode(const SkISize& scaledSize, size_t index); 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Use the given decoder to decode. If a decoder is not given then try to create one. 1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Returns true if decoding was complete. 1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool decode(size_t index, ImageDecoder**, SkBitmap*); 106e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkISize m_fullSize; 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ThreadSafeDataTransport m_data; 1097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch bool m_isMultiFrame; 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool m_decodeFailedAndEmpty; 1117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch Vector<bool> m_hasAlpha; 1129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) int m_decodeCount; 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) OwnPtr<ExternalMemoryAllocator> m_externalAllocator; 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<ImageDecoderFactory> m_imageDecoderFactory; 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Prevents multiple decode operations on the same data. 118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Mutex m_decodeMutex; 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Protect concurrent access to m_hasAlpha. 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Mutex m_alphaMutex; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 127