diff -r 000000000000 -r 6474c204b198 gfx/layers/GrallocImages.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/layers/GrallocImages.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef GRALLOCIMAGES_H +#define GRALLOCIMAGES_H + +#ifdef MOZ_WIDGET_GONK + +#include "ImageLayers.h" +#include "ImageContainer.h" +#include "mozilla/gfx/Point.h" +#include "mozilla/layers/AtomicRefCountedWithFinalize.h" +#include "mozilla/layers/FenceUtils.h" +#include "mozilla/layers/LayersSurfaces.h" + +#include + +namespace mozilla { +namespace layers { + +class GrallocTextureClientOGL; + +/** + * The YUV format supported by Android HAL + * + * 4:2:0 - CbCr width and height is half that of Y. + * + * This format assumes + * - an even width + * - an even height + * - a horizontal stride multiple of 16 pixels + * - a vertical stride equal to the height + * + * y_size = stride * height + * c_size = ALIGN(stride/2, 16) * height/2 + * size = y_size + c_size * 2 + * cr_offset = y_size + * cb_offset = y_size + c_size + * + * The Image that is rendered is the picture region defined by + * mPicX, mPicY and mPicSize. The size of the rendered image is + * mPicSize, not mYSize or mCbCrSize. + */ +class GrallocImage : public PlanarYCbCrImage + , public ISharedImage +{ + typedef PlanarYCbCrData Data; + static uint32_t sColorIdMap[]; +public: + struct GrallocData { + nsRefPtr mGraphicBuffer; + gfx::IntSize mPicSize; + }; + + GrallocImage(); + + virtual ~GrallocImage(); + + /** + * This makes a copy of the data buffers, in order to support functioning + * in all different layer managers. + */ + virtual void SetData(const Data& aData); + + /** + * Share the SurfaceDescriptor without making the copy, in order + * to support functioning in all different layer managers. + */ + virtual void SetData(const GrallocData& aData); + + // From [android 4.0.4]/hardware/msm7k/libgralloc-qsd8k/gralloc_priv.h + enum { + /* OEM specific HAL formats */ + HAL_PIXEL_FORMAT_YCbCr_422_P = 0x102, + HAL_PIXEL_FORMAT_YCbCr_420_P = 0x103, + HAL_PIXEL_FORMAT_YCbCr_420_SP = 0x109, + HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO = 0x10A, + HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x7FA30C03, + HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS = 0x7FA30C04, + }; + + virtual TemporaryRef GetAsSourceSurface() MOZ_OVERRIDE; + + android::sp GetGraphicBuffer() const; + + void* GetNativeBuffer(); + + virtual bool IsValid() { return !!mTextureClient; } + + virtual ISharedImage* AsSharedImage() MOZ_OVERRIDE { return this; } + + virtual TextureClient* GetTextureClient(CompositableClient* aClient) MOZ_OVERRIDE; + + virtual uint8_t* GetBuffer() + { + return static_cast(GetNativeBuffer()); + } + +private: + RefPtr mTextureClient; +}; + +} // namespace layers +} // namespace mozilla +#endif + +#endif /* GRALLOCIMAGES_H */