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