summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/VideoLayerManager.h
blob: de2dafc6b19e4ebfee9d8bda90f211baf6498029 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * Copyright 2011 The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef VideoLayerManager_h
#define VideoLayerManager_h

#include "GLUtils.h"
#include <wtf/HashMap.h>
#include <wtf/Vector.h>

#if USE(ACCELERATED_COMPOSITING)

namespace WebCore {

// Every video layer can use its uniqueId to query VideoLayerManager about such
// info globally.
struct VideoLayerInfo {
    GLuint textureId; // GL texture bound with the surface texture.
    int videoSize; // The size of the video.
    int timeStamp; // Used to decide which VideoLayerInfo is the oldest one.
    GLfloat surfaceMatrix[16];
};


class VideoLayerManager {

public:
    typedef HashMap<int, VideoLayerInfo*>::const_iterator InfoIterator;

    VideoLayerManager();

    // Register the texture when we got setSurfaceTexture call.
    void registerTexture(const int layerId, const GLuint textureId);
    // Update the size when the video is prepared.
    void updateVideoLayerSize(const int layerId, const int size);
    // At draw time, update the matrix for every video frame update.
    void updateMatrix(const int layerId, const GLfloat* matrix);
    // Remove the layer info from the mapping.
    void removeLayer(const int layerId);

    // Return the texture name corresponding to the layerId
    GLuint getTextureId(const int layerId);
    // Return the matrix for surface texture corresponding to the layerId
    GLfloat* getMatrix(const int layerId);

    // Delete the GL textures
    void deleteUnusedTextures();

private:
    // Get the sum of all the video size stored in m_videoLayerInfoMap.
    int getTotalMemUsage();
    // If the memory consumption is out of bound, recycle some textures.
    bool recycleTextureMem();
    // The private function to remove layer.
    void removeLayerInternal(const int layerId);

    // Indexed by each layer's uniqueId, this map contains the important info
    // used for showing the video when playing or the screenshot when paused.
    HashMap<int, VideoLayerInfo*> m_videoLayerInfoMap;
    android::Mutex m_videoLayerInfoMapLock;

    // Everytime we add one item to the map, we update the timestamp.
    int m_currentTimeStamp;

    // The retiredTextures is used to communicate between UI thread and webcore
    // thread. Basically, GL textures are determined to retire in the webcore
    // thread, and really get deleted in the UI thread.
    Vector<GLuint> m_retiredTextures;
    android::Mutex m_retiredTexturesLock;
};

} // namespace WebCore

#endif // USE(ACCELERATED_COMPOSITING)
       //
#endif // VideoLayerManager_h