SurfaceMediaSource_test.cpp revision 557b7092cc9a1dfe766ac3d0421e1049c653c4ae
126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi/*
226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * Copyright (C) 2011 The Android Open Source Project
326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi *
426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * Licensed under the Apache License, Version 2.0 (the "License");
526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * you may not use this file except in compliance with the License.
626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * You may obtain a copy of the License at
726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi *
826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi *      http://www.apache.org/licenses/LICENSE-2.0
926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi *
1026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * Unless required by applicable law or agreed to in writing, software
1126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * distributed under the License is distributed on an "AS IS" BASIS,
1226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * See the License for the specific language governing permissions and
1426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * limitations under the License.
1526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi */
1626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
1726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// #define LOG_NDEBUG 0
18557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi#define LOG_TAG "SurfaceMediaSource_test"
1926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
2026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <gtest/gtest.h>
2126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <utils/String8.h>
2226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <utils/Errors.h>
23557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi#include <fcntl.h>
24557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi#include <unistd.h>
2526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
26f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi#include <media/stagefright/SurfaceMediaSource.h>
27557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi#include <media/mediarecorder.h>
2826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
2926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <gui/SurfaceTextureClient.h>
3026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <ui/GraphicBuffer.h>
3126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <surfaceflinger/ISurfaceComposer.h>
3226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <surfaceflinger/Surface.h>
3326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <surfaceflinger/SurfaceComposerClient.h>
3426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
3526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <binder/ProcessState.h>
3626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <ui/FramebufferNativeWindow.h>
3726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
3826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MediaDebug.h>
39557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi#include <media/stagefright/MediaBufferGroup.h>
4026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MediaDefs.h>
4126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MetaData.h>
4226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/OMXClient.h>
4326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/OMXCodec.h>
4426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <OMX_Component.h>
4526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
4626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include "DummyRecorder.h"
4726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
48557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
4926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketinamespace android {
5026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
51557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketiclass GLTest : public ::testing::Test {
52557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketiprotected:
53557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
54557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    GLTest():
55557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglDisplay(EGL_NO_DISPLAY),
56557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglSurface(EGL_NO_SURFACE),
57557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglContext(EGL_NO_CONTEXT) {
58557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
59557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
60557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void SetUp() {
61557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("GLTest::SetUp()");
62557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
63557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
64557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
65557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
66557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGLint majorVersion;
67557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGLint minorVersion;
68557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
69557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
70557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        RecordProperty("EglVersionMajor", majorVersion);
71557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        RecordProperty("EglVersionMajor", minorVersion);
72557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
73557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGLint numConfigs = 0;
74557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mGlConfig,
75557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                1, &numConfigs));
76557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
77557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
78557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        char* displaySecsEnv = getenv("GLTEST_DISPLAY_SECS");
79557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (displaySecsEnv != NULL) {
80557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mDisplaySecs = atoi(displaySecsEnv);
81557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (mDisplaySecs < 0) {
82557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                mDisplaySecs = 0;
83557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
84557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        } else {
85557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mDisplaySecs = 0;
86557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
87557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
88557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mDisplaySecs > 0) {
89557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mComposerClient = new SurfaceComposerClient;
90557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
91557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
92557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mSurfaceControl = mComposerClient->createSurface(
93557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    String8("Test Surface"), 0,
94557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    getSurfaceWidth(), getSurfaceHeight(),
95557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    PIXEL_FORMAT_RGB_888, 0);
96557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
97557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_TRUE(mSurfaceControl != NULL);
98557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_TRUE(mSurfaceControl->isValid());
99557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
100557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            SurfaceComposerClient::openGlobalTransaction();
101557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
102557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
103557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            SurfaceComposerClient::closeGlobalTransaction();
104557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
105557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            sp<ANativeWindow> window = mSurfaceControl->getSurface();
106557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
107557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    window.get(), NULL);
108557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        } else {
109557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGLint pbufferAttribs[] = {
110557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                EGL_WIDTH, getSurfaceWidth(),
111557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                EGL_HEIGHT, getSurfaceHeight(),
112557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                EGL_NONE };
113557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
114557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglSurface = eglCreatePbufferSurface(mEglDisplay, mGlConfig,
115557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    pbufferAttribs);
116557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
117557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
118557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
119557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
120557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mEglContext = eglCreateContext(mEglDisplay, mGlConfig, EGL_NO_CONTEXT,
121557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                getContextAttribs());
122557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
123557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
124557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
125557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
126557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                mEglContext));
127557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
128557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
129557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGLint w, h;
130557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &w));
131557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
132557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &h));
133557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
134557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        RecordProperty("EglSurfaceWidth", w);
135557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        RecordProperty("EglSurfaceHeight", h);
136557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
137557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glViewport(0, 0, w, h);
138557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
139557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
140557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
141557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void TearDown() {
142557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        // Display the result
143557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mDisplaySecs > 0 && mEglSurface != EGL_NO_SURFACE) {
144557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglSwapBuffers(mEglDisplay, mEglSurface);
145557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            sleep(mDisplaySecs);
146557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
147557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
148557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mComposerClient != NULL) {
149557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mComposerClient->dispose();
150557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
151557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mEglContext != EGL_NO_CONTEXT) {
152557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglDestroyContext(mEglDisplay, mEglContext);
153557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
154557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mEglSurface != EGL_NO_SURFACE) {
155557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglDestroySurface(mEglDisplay, mEglSurface);
156557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
157557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mEglDisplay != EGL_NO_DISPLAY) {
158557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
159557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    EGL_NO_CONTEXT);
160557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglTerminate(mEglDisplay);
161557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
162557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
163557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
164557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
165557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint const* getConfigAttribs() {
166557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("GLTest getConfigAttribs");
167557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        static EGLint sDefaultConfigAttribs[] = {
168557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
169557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
170557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_RED_SIZE, 8,
171557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_GREEN_SIZE, 8,
172557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_BLUE_SIZE, 8,
173557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_ALPHA_SIZE, 8,
174557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_DEPTH_SIZE, 16,
175557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_STENCIL_SIZE, 8,
176557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_NONE };
177557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
178557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return sDefaultConfigAttribs;
179557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
180557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
181557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint const* getContextAttribs() {
182557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        static EGLint sDefaultContextAttribs[] = {
183557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_CONTEXT_CLIENT_VERSION, 2,
184557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_NONE };
185557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
186557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return sDefaultContextAttribs;
187557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
188557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
189557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint getSurfaceWidth() {
190557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return 512;
191557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
192557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
193557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint getSurfaceHeight() {
194557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return 512;
195557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
196557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
197557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void loadShader(GLenum shaderType, const char* pSource, GLuint* outShader) {
198557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLuint shader = glCreateShader(shaderType);
199557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
200557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (shader) {
201557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glShaderSource(shader, 1, &pSource, NULL);
202557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
203557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glCompileShader(shader);
204557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
205557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            GLint compiled = 0;
206557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
207557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
208557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!compiled) {
209557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                GLint infoLen = 0;
210557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
211557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
212557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                if (infoLen) {
213557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    char* buf = (char*) malloc(infoLen);
214557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    if (buf) {
215557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        glGetShaderInfoLog(shader, infoLen, NULL, buf);
216557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        printf("Shader compile log:\n%s\n", buf);
217557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        free(buf);
218557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        FAIL();
219557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    }
220557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                } else {
221557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    char* buf = (char*) malloc(0x1000);
222557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    if (buf) {
223557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        glGetShaderInfoLog(shader, 0x1000, NULL, buf);
224557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        printf("Shader compile log:\n%s\n", buf);
225557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        free(buf);
226557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        FAIL();
227557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    }
228557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                }
229557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glDeleteShader(shader);
230557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                shader = 0;
231557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
232557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
233557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_TRUE(shader != 0);
234557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        *outShader = shader;
235557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
236557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
237557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void createProgram(const char* pVertexSource, const char* pFragmentSource,
238557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            GLuint* outPgm) {
239557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLuint vertexShader, fragmentShader;
240557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        {
241557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            SCOPED_TRACE("compiling vertex shader");
242557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            loadShader(GL_VERTEX_SHADER, pVertexSource, &vertexShader);
243557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (HasFatalFailure()) {
244557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                return;
245557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
246557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
247557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        {
248557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            SCOPED_TRACE("compiling fragment shader");
249557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            loadShader(GL_FRAGMENT_SHADER, pFragmentSource, &fragmentShader);
250557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (HasFatalFailure()) {
251557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                return;
252557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
253557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
254557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
255557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLuint program = glCreateProgram();
256557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
257557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (program) {
258557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glAttachShader(program, vertexShader);
259557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
260557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glAttachShader(program, fragmentShader);
261557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
262557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glLinkProgram(program);
263557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            GLint linkStatus = GL_FALSE;
264557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
265557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (linkStatus != GL_TRUE) {
266557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                GLint bufLength = 0;
267557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
268557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                if (bufLength) {
269557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    char* buf = (char*) malloc(bufLength);
270557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    if (buf) {
271557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        glGetProgramInfoLog(program, bufLength, NULL, buf);
272557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        printf("Program link log:\n%s\n", buf);
273557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        free(buf);
274557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        FAIL();
275557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    }
276557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                }
277557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glDeleteProgram(program);
278557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                program = 0;
279557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
280557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
281557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glDeleteShader(vertexShader);
282557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glDeleteShader(fragmentShader);
283557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_TRUE(program != 0);
284557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        *outPgm = program;
285557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
28626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
287557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    static int abs(int value) {
288557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return value > 0 ? value : -value;
289557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
290557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
291557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ::testing::AssertionResult checkPixel(int x, int y, int r,
292557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            int g, int b, int a, int tolerance=2) {
293557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLubyte pixel[4];
294557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        String8 msg;
295557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
296557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLenum err = glGetError();
297557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (err != GL_NO_ERROR) {
298557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("error reading pixel: %#x", err);
299557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            while ((err = glGetError()) != GL_NO_ERROR) {
300557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += String8::format(", %#x", err);
301557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
302557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            fprintf(stderr, "pixel check failure: %s\n", msg.string());
303557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            return ::testing::AssertionFailure(
304557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    ::testing::Message(msg.string()));
305557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
306557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (r >= 0 && abs(r - int(pixel[0])) > tolerance) {
307557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("r(%d isn't %d)", pixel[0], r);
308557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
309557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (g >= 0 && abs(g - int(pixel[1])) > tolerance) {
310557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!msg.isEmpty()) {
311557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += " ";
312557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
313557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("g(%d isn't %d)", pixel[1], g);
314557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
315557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (b >= 0 && abs(b - int(pixel[2])) > tolerance) {
316557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!msg.isEmpty()) {
317557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += " ";
318557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
319557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("b(%d isn't %d)", pixel[2], b);
320557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
321557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (a >= 0 && abs(a - int(pixel[3])) > tolerance) {
322557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!msg.isEmpty()) {
323557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += " ";
324557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
325557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("a(%d isn't %d)", pixel[3], a);
326557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
327557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (!msg.isEmpty()) {
328557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            fprintf(stderr, "pixel check failure: %s\n", msg.string());
329557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            return ::testing::AssertionFailure(
330557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    ::testing::Message(msg.string()));
331557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        } else {
332557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            return ::testing::AssertionSuccess();
333557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
334557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
335557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
336557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int mDisplaySecs;
337557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceComposerClient> mComposerClient;
338557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceControl> mSurfaceControl;
339557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
340557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLDisplay mEglDisplay;
341557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLSurface mEglSurface;
342557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLContext mEglContext;
343557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLConfig  mGlConfig;
344557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi};
345557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
346557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
347557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//    Class for  the NON-GL tests
348557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
349f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketiclass SurfaceMediaSourceTest : public ::testing::Test {
35026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketipublic:
35126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
352557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    SurfaceMediaSourceTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { }
35326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    void oneBufferPass(int width, int height );
354557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void oneBufferPassNoFill(int width, int height );
35526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    static void fillYV12Buffer(uint8_t* buf, int w, int h, int stride) ;
35626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    static void fillYV12BufferRect(uint8_t* buf, int w, int h,
35726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                        int stride, const android_native_rect_t& rect) ;
35826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketiprotected:
35926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
36026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    virtual void SetUp() {
361449eef989e3c4fe1c134926efe335617e8d12ae4James Dong        android::ProcessState::self()->startThreadPool();
362f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
363f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSMS->setSynchronousMode(true);
364f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSTC = new SurfaceTextureClient(mSMS);
36526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        mANW = mSTC;
366557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
36726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
368557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void TearDown() {
369557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSMS.clear();
370557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSTC.clear();
371557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mANW.clear();
37226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
37326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
374557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const int mYuvTexWidth;
375557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const int mYuvTexHeight;
376557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
377557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceMediaSource> mSMS;
378557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceTextureClient> mSTC;
379557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<ANativeWindow> mANW;
380557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi};
381557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
382557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
383557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//    Class for  the GL tests
384557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
385557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketiclass SurfaceMediaSourceGLTest : public GLTest {
386557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketipublic:
387557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
388557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    SurfaceMediaSourceGLTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { }
389557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint const* getConfigAttribs();
390557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void oneBufferPassGL(int num = 0);
391557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    static sp<MediaRecorder> setUpMediaRecorder(int fileDescriptor, int videoSource,
392557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        int outputFormat, int videoEncoder, int width, int height, int fps);
393557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketiprotected:
394557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
395557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void SetUp() {
396557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("SMS-GLTest::SetUp()");
397557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        android::ProcessState::self()->startThreadPool();
398557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
399557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSTC = new SurfaceTextureClient(mSMS);
400557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mANW = mSTC;
401557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
402557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        // Doing the setup related to the GL Side
403557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLTest::SetUp();
404557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
40526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
40626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    virtual void TearDown() {
407f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSMS.clear();
40826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        mSTC.clear();
40926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        mANW.clear();
410557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLTest::TearDown();
411557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        eglDestroySurface(mEglDisplay, mSmsEglSurface);
41226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
41326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
414557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr);
415557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
416b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi    const int mYuvTexWidth;
417b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi    const int mYuvTexHeight;
41826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
419f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    sp<SurfaceMediaSource> mSMS;
42026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    sp<SurfaceTextureClient> mSTC;
42126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    sp<ANativeWindow> mANW;
422557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLConfig  mSMSGlConfig;
423557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLSurface  mSmsEglSurface;
42426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi};
42526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
426557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
427557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Methods in SurfaceMediaSourceGLTest
428557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
429557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiEGLint const* SurfaceMediaSourceGLTest::getConfigAttribs() {
430557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("SurfaceMediaSourceGLTest getConfigAttribs");
431557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    static EGLint sDefaultConfigAttribs[] = {
432557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
433557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
434557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_RED_SIZE, 8,
435557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_GREEN_SIZE, 8,
436557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_BLUE_SIZE, 8,
437557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_RECORDABLE_ANDROID, EGL_TRUE,
438557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_NONE };
439557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
440557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    return sDefaultConfigAttribs;
441557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
442557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
443557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// One pass of dequeuing and queuing a GLBuffer
444557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketivoid SurfaceMediaSourceGLTest::oneBufferPassGL(int num) {
445557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int d = num % 50;
446557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    float f = 0.2f; // 0.1f * d;
447557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
448557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0, 0.3, 0, 0.6);
449557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
450557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
451557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glEnable(GL_SCISSOR_TEST);
452557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(4 + d, 4 + d, 4, 4);
453557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(1.0 - f, f, f, 1.0);
454557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
455557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
456557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(24 + d, 48 + d, 4, 4);
457557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(f, 1.0 - f, f, 1.0);
458557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
459557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
460557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(37 + d, 17 + d, 4, 4);
461557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(f, f, 1.0 - f, 1.0);
462557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
463557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
464557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // The following call dequeues and queues the buffer
465557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    eglSwapBuffers(mEglDisplay, mSmsEglSurface);
466557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glDisable(GL_SCISSOR_TEST);
467557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
468557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
469557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Set up the MediaRecorder which runs in the same process as mediaserver
470557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketisp<MediaRecorder> SurfaceMediaSourceGLTest::setUpMediaRecorder(int fd, int videoSource,
471557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        int outputFormat, int videoEncoder, int width, int height, int fps) {
472557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = new MediaRecorder();
473557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoSource(videoSource);
474557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setOutputFormat(outputFormat);
475557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoEncoder(videoEncoder);
476557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setOutputFile(fd, 0, 0);
477557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoSize(width, height);
478557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoFrameRate(fps);
479557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->prepare();
480557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Starting MediaRecorder...");
481557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->start());
482557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    return mr;
483557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
484557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
485557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// query the mediarecorder for a surfacemeidasource and create an egl surface with that
486557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketivoid SurfaceMediaSourceGLTest::setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr) {
487557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<ISurfaceTexture> iST = mr->querySurfaceMediaSourceFromMediaServer();
488557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSTC = new SurfaceTextureClient(iST);
489557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mANW = mSTC;
490557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
491557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLint numConfigs = 0;
492557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mSMSGlConfig,
493557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            1, &numConfigs));
494557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
495557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
496557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Native Window = %p, mSTC = %p", mANW.get(), mSTC.get());
497557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
498557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSmsEglSurface = eglCreateWindowSurface(mEglDisplay, mSMSGlConfig,
499557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                                mANW.get(), NULL);
500557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
501557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_NE(EGL_NO_SURFACE, mSmsEglSurface) ;
502557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
503557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mSmsEglSurface, mSmsEglSurface,
504557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglContext));
505557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
506557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
507557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
508557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
509557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
510557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Methods in SurfaceMediaSourceTest
511557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
512557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
513557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// One pass of dequeuing and queuing the buffer. Fill it in with
514557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// cpu YV12 buffer
515f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPass(int width, int height ) {
51626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ANativeWindowBuffer* anb;
51726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
51826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_TRUE(anb != NULL);
51926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
52026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
52126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer()));
52226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
52326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    // Fill the buffer with the a checkerboard pattern
52426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    uint8_t* img = NULL;
52526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
526f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    SurfaceMediaSourceTest::fillYV12Buffer(img, width, height, buf->getStride());
52726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    buf->unlock();
52826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
52926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer()));
53026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
53126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
532557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dequeuing and queuing the buffer without really filling it in.
533557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketivoid SurfaceMediaSourceTest::oneBufferPassNoFill(int width, int height ) {
534557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ANativeWindowBuffer* anb;
535557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
536557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_TRUE(anb != NULL);
53726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
538557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
539557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer()));
540557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // We do not fill the buffer in. Just queue it back.
541557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer()));
54226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
54326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
54426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern
545f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) {
54626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int blockWidth = w > 16 ? w / 16 : 1;
54726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int blockHeight = h > 16 ? h / 16 : 1;
54826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int yuvTexOffsetY = 0;
54926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideY = stride;
55026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetV = yuvTexStrideY * h;
55126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf;
55226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2;
55326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideU = yuvTexStrideV;
55426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    for (int x = 0; x < w; x++) {
55526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        for (int y = 0; y < h; y++) {
55626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            int parityX = (x / blockWidth) & 1;
55726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            int parityY = (y / blockHeight) & 1;
55826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            unsigned char intensity = (parityX ^ parityY) ? 63 : 191;
55926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity;
56026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            if (x < w / 2 && y < h / 2) {
56126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity;
56226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                if (x * 2 < w / 2 && y * 2 < h / 2) {
56326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] =
56426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] =
56526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] =
56626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] =
56726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                        intensity;
56826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                }
56926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            }
57026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
57126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
57226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
57326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
57426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it.
575f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12BufferRect(uint8_t* buf, int w,
57626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                  int h, int stride, const android_native_rect_t& rect) {
57726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int yuvTexOffsetY = 0;
57826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideY = stride;
57926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetV = yuvTexStrideY * h;
58026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf;
58126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2;
58226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideU = yuvTexStrideV;
58326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    for (int x = 0; x < w; x++) {
58426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        for (int y = 0; y < h; y++) {
58526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            bool inside = rect.left <= x && x < rect.right &&
58626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    rect.top <= y && y < rect.bottom;
58726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64;
58826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            if (x < w / 2 && y < h / 2) {
58926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                bool inside = rect.left <= 2*x && 2*x < rect.right &&
59026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                        rect.top <= 2*y && 2*y < rect.bottom;
59126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16;
59226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] =
59326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                                                inside ? 16 : 255;
59426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            }
59526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
59626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
597f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi}  ///////// End of class SurfaceMediaSourceTest
59826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
59926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi///////////////////////////////////////////////////////////////////
60026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Class to imitate the recording     /////////////////////////////
60126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// ////////////////////////////////////////////////////////////////
60226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketistruct SimpleDummyRecorder {
60326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        sp<MediaSource> mSource;
60426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
60526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        SimpleDummyRecorder
60626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                (const sp<MediaSource> &source): mSource(source) {}
60726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
60826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        status_t start() { return mSource->start();}
60926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        status_t stop()  { return mSource->stop();}
61026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
61126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        // fakes reading from a media source
61226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        status_t readFromSource() {
61326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            MediaBuffer *buffer;
61426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            status_t err = mSource->read(&buffer);
61526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            if (err != OK) {
61626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                return err;
61726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            }
61826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buffer->release();
61926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buffer = NULL;
62026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            return OK;
62126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
62226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi};
62326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi///////////////////////////////////////////////////////////////////
62426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi//           TESTS
625557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// SurfaceMediaSourceTest class contains tests that fill the buffers
626557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// using the cpu calls
627557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// SurfaceMediaSourceGLTest class contains tests that fill the buffers
628557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// using the GL calls.
629557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// TODO: None of the tests actually verify the encoded images.. so at this point,
630557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// these are mostly functionality tests + visual inspection
631557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//////////////////////////////////////////////////////////////////////
632557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
633f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource
634557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
635557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketistatic int testId = 1;
636557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotOneBufferPass) {
637557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
63826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing OneBufferPass ******************************");
63926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
640557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
641557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
64226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    oneBufferPass(mYuvTexWidth, mYuvTexHeight);
64326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
64426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
64526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted
646557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
647557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) {
648557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
64926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing Wrong size BufferPass ******************************");
65026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
65126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    // setting the client side buffer size different than the server size
652557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_dimensions(mANW.get(),
653557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi             10, 10));
654557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
655557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
65626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
65726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ANativeWindowBuffer* anb;
65826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
659557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Note: make sure we get an ERROR back when dequeuing!
66026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
66126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
66226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
663f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
664557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
665557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest,  DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
666557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
66726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder *********************");
668557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
669557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
670b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi
671f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
67226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.start();
67326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
67426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 0;
67526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount < 300) {
67626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
67726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
67826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        ASSERT_EQ(NO_ERROR, writer.readFromSource());
67926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
68026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
68126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
68226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.stop();
68326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
68426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
685f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource
686557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
687557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest,  DISABLED_DummyLagEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
688557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
68926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************");
690b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi
691557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
692557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
693b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi
694f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
69526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.start();
69626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
69726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 1;
698f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    const int FRAMES_LAG = mSMS->getBufferCount() - 1;
69926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount <= 300) {
70026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
70126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        // Forcing the writer to lag behind a few frames
70226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        if (nFramesCount > FRAMES_LAG) {
70326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            ASSERT_EQ(NO_ERROR, writer.readFromSource());
70426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
70526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
70626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
70726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.stop();
70826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
70926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
710f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
71126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer
712557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyThreadedEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
713557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
71426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********");
715557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
716557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
71726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
718f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    DummyRecorder writer(mSMS);
71926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.start();
72026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
72126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 0;
72226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount <= 300) {
72326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
72426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
72526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
72626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
72726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.stop();
72826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
72926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
730557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine actual encoding using mediarecorder
731557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// We use the mediaserver to create a mediarecorder and send
732557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// it back to us. So SurfaceMediaSource lives in the same process
733557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// as the mediaserver.
734557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Very close to the actual camera, except that the
735557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// buffers are filled and queueud by the CPU instead of GL.
736557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuYV12BufferNpotWriteMediaServer) {
737557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
738557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Testing the whole pipeline with actual MediaRecorder ***********");
739557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** SurfaceMediaSource is same process as mediaserver    ***********");
740557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
741557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSource.mp4";
742557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
743557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    if (fd < 0) {
744557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
745557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
746557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK(fd >= 0);
747557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
748557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = SurfaceMediaSourceGLTest::setUpMediaRecorder(fd,
749557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            VIDEO_SOURCE_GRALLOC_BUFFER,
750557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth,
751557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mYuvTexHeight, 30);
752557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // get the reference to the surfacemediasource living in
753557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // mediaserver that is created by stagefrightrecorder
754557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<ISurfaceTexture> iST = mr->querySurfaceMediaSourceFromMediaServer();
755557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSTC = new SurfaceTextureClient(iST);
756557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mANW = mSTC;
757557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
758557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
759557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                                                HAL_PIXEL_FORMAT_YV12));
76026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
76126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 0;
76226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount <= 300) {
763557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassNoFill(mYuvTexWidth, mYuvTexHeight);
76426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
765557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
76626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
76726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
768557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU));
769557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Stopping MediaRecorder...");
770557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->stop());
771557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr.clear();
772557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    close(fd);
77326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
77426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
775557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//////////////////////////////////////////////////////////////////////
776557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// GL tests
777557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
778557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
779557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine whether we can choose the Recordable Android GLConfig
780557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// DummyRecorder used- no real encoding here
781557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWrite) {
782557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
783557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test to verify creating a surface w/ right config *********");
784557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
785557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
786557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSTC = new SurfaceTextureClient(mSMS);
787557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mANW = mSTC;
788557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
789557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    DummyRecorder writer(mSMS);
790557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    writer.start();
791557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
792557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLint numConfigs = 0;
793557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mSMSGlConfig,
794557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            1, &numConfigs));
795557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
796557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
797557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSmsEglSurface = eglCreateWindowSurface(mEglDisplay, mSMSGlConfig,
798557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                                mANW.get(), NULL);
799557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
800557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_NE(EGL_NO_SURFACE, mSmsEglSurface) ;
801557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
802557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mSmsEglSurface, mSmsEglSurface,
803557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglContext));
804557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
80526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
806557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int32_t nFramesCount = 0;
807557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    while (nFramesCount <= 300) {
808557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassGL();
809557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        nFramesCount++;
810557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
811557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
812557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
813557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL));
814557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    writer.stop();
815557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
816557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine whether we can render GL buffers in to the surface
817557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// created with the native window handle
818557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, RenderingToRecordableEGLSurfaceWorks) {
819557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
820557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("RenderingToRecordableEGLSurfaceWorks *********************");
821557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Do the producer side of things
822557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0.6, 0.6, 0.6, 0.6);
823557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
824557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
825557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glEnable(GL_SCISSOR_TEST);
826557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(4, 4, 4, 4);
827557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(1.0, 0.0, 0.0, 1.0);
828557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
829557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
830557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(24, 48, 4, 4);
831557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0.0, 1.0, 0.0, 1.0);
832557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
833557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
834557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(37, 17, 4, 4);
835557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0.0, 0.0, 1.0, 1.0);
836557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
837557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
838557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
839557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
840557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
841557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
842557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
843557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 4,  7, 255,   0,   0, 255));
844557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(25, 51,   0, 255,   0, 255));
845557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(40, 19,   0,   0, 255, 255));
846557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153));
847557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153));
848557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(13,  8, 153, 153, 153, 153));
849557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(46,  3, 153, 153, 153, 153));
850557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153));
851557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153));
852557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153));
853557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153));
854557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153));
855557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153));
856557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153));
857557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153));
858557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153));
859557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
860557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
861557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine the actual encoding with GL buffers
862557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource
863557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// The same pattern is rendered every frame
864557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaSameImageEachBufNpotWrite) {
865557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
866557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Testing the whole pipeline with actual Recorder ***********");
867557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** GL Filling the buffers ***********");
868557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Note: No need to set the colorformat for the buffers. The colorformat is
869557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // in the GRAlloc buffers itself.
870557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
871557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSourceGL.mp4";
872557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
873557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    if (fd < 0) {
874557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
875557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
876557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK(fd >= 0);
877557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
878557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER,
879557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30);
880557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
881557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // get the reference to the surfacemediasource living in
882557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // mediaserver that is created by stagefrightrecorder
883557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    setUpEGLSurfaceFromMediaRecorder(mr);
884557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
885557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int32_t nFramesCount = 0;
886557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    while (nFramesCount <= 300) {
887557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassGL();
888557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        nFramesCount++;
889557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
890557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
891557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
892557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL));
893557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Stopping MediaRecorder...");
894557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->stop());
895557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr.clear();
896557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    close(fd);
897557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
898557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
899557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine the actual encoding from the GL Buffers
900557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource
901557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// A different pattern is rendered every frame
902557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaDiffImageEachBufNpotWrite) {
903557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
904557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Testing the whole pipeline with actual Recorder ***********");
905557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Diff GL Filling the buffers ***********");
906557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Note: No need to set the colorformat for the buffers. The colorformat is
907557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // in the GRAlloc buffers itself.
908557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
909557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSourceGLDiff.mp4";
910557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
911557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    if (fd < 0) {
912557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
913557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
914557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK(fd >= 0);
915557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
916557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER,
917557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30);
918557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
919557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // get the reference to the surfacemediasource living in
920557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // mediaserver that is created by stagefrightrecorder
921557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    setUpEGLSurfaceFromMediaRecorder(mr);
922557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
923557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int32_t nFramesCount = 0;
924557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    while (nFramesCount <= 300) {
925557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassGL(nFramesCount);
926557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        nFramesCount++;
927557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
928557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
929557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
930557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL));
931557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Stopping MediaRecorder...");
932557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->stop());
933557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr.clear();
934557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    close(fd);
935557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
93626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} // namespace android
937