blob: 814513ecb4e8d489197e1cedf4ba35c684aefd03 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CCVideoLayerImpl_h
#define CCVideoLayerImpl_h
#include "CCLayerImpl.h"
#include "GraphicsContext3D.h"
#include "IntSize.h"
#include <public/WebTransformationMatrix.h>
#include <public/WebVideoFrameProvider.h>
namespace WebKit {
class WebVideoFrame;
}
namespace cc {
class CCLayerTreeHostImpl;
class CCVideoLayerImpl;
class CCVideoLayerImpl : public CCLayerImpl
, public WebKit::WebVideoFrameProvider::Client {
public:
static PassOwnPtr<CCVideoLayerImpl> create(int id, WebKit::WebVideoFrameProvider* provider)
{
return adoptPtr(new CCVideoLayerImpl(id, provider));
}
virtual ~CCVideoLayerImpl();
virtual void willDraw(CCResourceProvider*) OVERRIDE;
virtual void appendQuads(CCQuadSink&, CCAppendQuadsData&) OVERRIDE;
virtual void didDraw(CCResourceProvider*) OVERRIDE;
virtual void dumpLayerProperties(std::string*, int indent) const OVERRIDE;
Mutex& providerMutex() { return m_providerMutex; }
// WebKit::WebVideoFrameProvider::Client implementation.
virtual void stopUsingProvider(); // Callable on any thread.
virtual void didReceiveFrame(); // Callable on impl thread.
virtual void didUpdateMatrix(const float*); // Callable on impl thread.
virtual void didLoseContext() OVERRIDE;
void setNeedsRedraw();
struct FramePlane {
CCResourceProvider::ResourceId resourceId;
IntSize size;
GC3Denum format;
IntSize visibleSize;
FramePlane() : resourceId(0) { }
bool allocateData(CCResourceProvider*);
void freeData(CCResourceProvider*);
};
private:
CCVideoLayerImpl(int, WebKit::WebVideoFrameProvider*);
static IntSize computeVisibleSize(const WebKit::WebVideoFrame&, unsigned plane);
virtual const char* layerTypeAsString() const OVERRIDE;
void willDrawInternal(CCResourceProvider*);
bool allocatePlaneData(CCResourceProvider*);
bool copyPlaneData(CCResourceProvider*);
void freePlaneData(CCResourceProvider*);
void freeUnusedPlaneData(CCResourceProvider*);
// Guards the destruction of m_provider and the frame that it provides
Mutex m_providerMutex;
WebKit::WebVideoFrameProvider* m_provider;
WebKit::WebTransformationMatrix m_streamTextureMatrix;
WebKit::WebVideoFrame* m_frame;
GC3Denum m_format;
CCResourceProvider::ResourceId m_externalTextureResource;
// Each index in this array corresponds to a plane in WebKit::WebVideoFrame.
FramePlane m_framePlanes[WebKit::WebVideoFrame::maxPlanes];
};
}
#endif // CCVideoLayerImpl_h