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 {
109e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi            LOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource");
110e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi            sp<SurfaceMediaSource> sms = new SurfaceMediaSource(
111e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi                    getSurfaceWidth(), getSurfaceHeight());
112e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi            sp<SurfaceTextureClient> stc = new SurfaceTextureClient(sms);
113e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi            sp<ANativeWindow> window = stc;
114557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
115e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi            mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
116e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi                    window.get(), NULL);
117557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
118557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
119557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
120557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
121557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mEglContext = eglCreateContext(mEglDisplay, mGlConfig, EGL_NO_CONTEXT,
122557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                getContextAttribs());
123557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
124557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
125557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
126557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
127557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                mEglContext));
128557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
129557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
130557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGLint w, h;
131557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &w));
132557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
133557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &h));
134557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
135557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        RecordProperty("EglSurfaceWidth", w);
136557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        RecordProperty("EglSurfaceHeight", h);
137557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
138557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glViewport(0, 0, w, h);
139557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
140557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
141557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
142557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void TearDown() {
143557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        // Display the result
144557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mDisplaySecs > 0 && mEglSurface != EGL_NO_SURFACE) {
145557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglSwapBuffers(mEglDisplay, mEglSurface);
146557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            sleep(mDisplaySecs);
147557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
148557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
149557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mComposerClient != NULL) {
150557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mComposerClient->dispose();
151557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
152557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mEglContext != EGL_NO_CONTEXT) {
153557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglDestroyContext(mEglDisplay, mEglContext);
154557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
155557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mEglSurface != EGL_NO_SURFACE) {
156557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglDestroySurface(mEglDisplay, mEglSurface);
157557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
158557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (mEglDisplay != EGL_NO_DISPLAY) {
159557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            eglTerminate(mEglDisplay);
160557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
161557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
162557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
163557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
164557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint const* getConfigAttribs() {
165557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("GLTest getConfigAttribs");
166557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        static EGLint sDefaultConfigAttribs[] = {
167557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
168557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
169557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_RED_SIZE, 8,
170557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_GREEN_SIZE, 8,
171557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_BLUE_SIZE, 8,
172557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_ALPHA_SIZE, 8,
173557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_DEPTH_SIZE, 16,
174557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_STENCIL_SIZE, 8,
175557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_NONE };
176557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
177557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return sDefaultConfigAttribs;
178557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
179557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
180557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint const* getContextAttribs() {
181557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        static EGLint sDefaultContextAttribs[] = {
182557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_CONTEXT_CLIENT_VERSION, 2,
183557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            EGL_NONE };
184557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
185557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return sDefaultContextAttribs;
186557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
187557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
188557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint getSurfaceWidth() {
189557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return 512;
190557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
191557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
192557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint getSurfaceHeight() {
193557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return 512;
194557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
195557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
196557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void loadShader(GLenum shaderType, const char* pSource, GLuint* outShader) {
197557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLuint shader = glCreateShader(shaderType);
198557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
199557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (shader) {
200557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glShaderSource(shader, 1, &pSource, NULL);
201557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
202557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glCompileShader(shader);
203557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
204557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            GLint compiled = 0;
205557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
206557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
207557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!compiled) {
208557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                GLint infoLen = 0;
209557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
210557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
211557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                if (infoLen) {
212557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    char* buf = (char*) malloc(infoLen);
213557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    if (buf) {
214557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        glGetShaderInfoLog(shader, infoLen, NULL, buf);
215557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        printf("Shader compile log:\n%s\n", buf);
216557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        free(buf);
217557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        FAIL();
218557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    }
219557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                } else {
220557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    char* buf = (char*) malloc(0x1000);
221557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    if (buf) {
222557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        glGetShaderInfoLog(shader, 0x1000, NULL, buf);
223557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        printf("Shader compile log:\n%s\n", buf);
224557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        free(buf);
225557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        FAIL();
226557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    }
227557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                }
228557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glDeleteShader(shader);
229557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                shader = 0;
230557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
231557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
232557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_TRUE(shader != 0);
233557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        *outShader = shader;
234557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
235557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
236557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void createProgram(const char* pVertexSource, const char* pFragmentSource,
237557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            GLuint* outPgm) {
238557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLuint vertexShader, fragmentShader;
239557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        {
240557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            SCOPED_TRACE("compiling vertex shader");
241557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            loadShader(GL_VERTEX_SHADER, pVertexSource, &vertexShader);
242557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (HasFatalFailure()) {
243557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                return;
244557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
245557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
246557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        {
247557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            SCOPED_TRACE("compiling fragment shader");
248557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            loadShader(GL_FRAGMENT_SHADER, pFragmentSource, &fragmentShader);
249557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (HasFatalFailure()) {
250557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                return;
251557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
252557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
253557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
254557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLuint program = glCreateProgram();
255557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
256557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (program) {
257557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glAttachShader(program, vertexShader);
258557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
259557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glAttachShader(program, fragmentShader);
260557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
261557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glLinkProgram(program);
262557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            GLint linkStatus = GL_FALSE;
263557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
264557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (linkStatus != GL_TRUE) {
265557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                GLint bufLength = 0;
266557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
267557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                if (bufLength) {
268557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    char* buf = (char*) malloc(bufLength);
269557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    if (buf) {
270557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        glGetProgramInfoLog(program, bufLength, NULL, buf);
271557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        printf("Program link log:\n%s\n", buf);
272557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        free(buf);
273557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                        FAIL();
274557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    }
275557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                }
276557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                glDeleteProgram(program);
277557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                program = 0;
278557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
279557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
280557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glDeleteShader(vertexShader);
281557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glDeleteShader(fragmentShader);
282557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        ASSERT_TRUE(program != 0);
283557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        *outPgm = program;
284557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
28526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
286557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    static int abs(int value) {
287557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        return value > 0 ? value : -value;
288557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
289557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
290557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ::testing::AssertionResult checkPixel(int x, int y, int r,
291557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            int g, int b, int a, int tolerance=2) {
292557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLubyte pixel[4];
293557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        String8 msg;
294557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
295557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLenum err = glGetError();
296557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (err != GL_NO_ERROR) {
297557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("error reading pixel: %#x", err);
298557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            while ((err = glGetError()) != GL_NO_ERROR) {
299557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += String8::format(", %#x", err);
300557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
301557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            fprintf(stderr, "pixel check failure: %s\n", msg.string());
302557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            return ::testing::AssertionFailure(
303557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    ::testing::Message(msg.string()));
304557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
305557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (r >= 0 && abs(r - int(pixel[0])) > tolerance) {
306557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("r(%d isn't %d)", pixel[0], r);
307557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
308557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (g >= 0 && abs(g - int(pixel[1])) > tolerance) {
309557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!msg.isEmpty()) {
310557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += " ";
311557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
312557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("g(%d isn't %d)", pixel[1], g);
313557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
314557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (b >= 0 && abs(b - int(pixel[2])) > tolerance) {
315557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!msg.isEmpty()) {
316557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += " ";
317557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
318557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("b(%d isn't %d)", pixel[2], b);
319557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
320557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (a >= 0 && abs(a - int(pixel[3])) > tolerance) {
321557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            if (!msg.isEmpty()) {
322557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                msg += " ";
323557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            }
324557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            msg += String8::format("a(%d isn't %d)", pixel[3], a);
325557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
326557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        if (!msg.isEmpty()) {
327557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            fprintf(stderr, "pixel check failure: %s\n", msg.string());
328557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            return ::testing::AssertionFailure(
329557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                    ::testing::Message(msg.string()));
330557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        } else {
331557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            return ::testing::AssertionSuccess();
332557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        }
333557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
334557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
335557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int mDisplaySecs;
336557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceComposerClient> mComposerClient;
337557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceControl> mSurfaceControl;
338557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
339557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLDisplay mEglDisplay;
340557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLSurface mEglSurface;
341557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLContext mEglContext;
342557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EGLConfig  mGlConfig;
343557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi};
344557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
345557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
346557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//    Class for  the NON-GL tests
347557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
348f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketiclass SurfaceMediaSourceTest : public ::testing::Test {
34926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketipublic:
35026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
351557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    SurfaceMediaSourceTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { }
35226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    void oneBufferPass(int width, int height );
353557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void oneBufferPassNoFill(int width, int height );
35426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    static void fillYV12Buffer(uint8_t* buf, int w, int h, int stride) ;
35526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    static void fillYV12BufferRect(uint8_t* buf, int w, int h,
35626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                        int stride, const android_native_rect_t& rect) ;
35726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketiprotected:
35826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
35926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    virtual void SetUp() {
360449eef989e3c4fe1c134926efe335617e8d12ae4James Dong        android::ProcessState::self()->startThreadPool();
361f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
362f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSMS->setSynchronousMode(true);
363f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSTC = new SurfaceTextureClient(mSMS);
36426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        mANW = mSTC;
365557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
36626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
367557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void TearDown() {
368557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSMS.clear();
369557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSTC.clear();
370557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mANW.clear();
37126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
37226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
373557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const int mYuvTexWidth;
374557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const int mYuvTexHeight;
375557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
376557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceMediaSource> mSMS;
377557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<SurfaceTextureClient> mSTC;
378557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<ANativeWindow> mANW;
379557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi};
380557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
381557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
382557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//    Class for  the GL tests
383557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi///////////////////////////////////////////////////////////////////////
384557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketiclass SurfaceMediaSourceGLTest : public GLTest {
385557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketipublic:
386557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
387557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    SurfaceMediaSourceGLTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { }
388557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual EGLint const* getConfigAttribs();
389557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void oneBufferPassGL(int num = 0);
390557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    static sp<MediaRecorder> setUpMediaRecorder(int fileDescriptor, int videoSource,
391557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        int outputFormat, int videoEncoder, int width, int height, int fps);
392557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketiprotected:
393557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
394557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    virtual void SetUp() {
395557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("SMS-GLTest::SetUp()");
396557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        android::ProcessState::self()->startThreadPool();
397557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
398557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mSTC = new SurfaceTextureClient(mSMS);
399557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        mANW = mSTC;
400557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
401557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        // Doing the setup related to the GL Side
402557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLTest::SetUp();
403557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
40426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
40526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    virtual void TearDown() {
406f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi        mSMS.clear();
40726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        mSTC.clear();
40826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        mANW.clear();
409557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        GLTest::TearDown();
41026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
41126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
412557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    void setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr);
413557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
414b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi    const int mYuvTexWidth;
415b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi    const int mYuvTexHeight;
41626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
417f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    sp<SurfaceMediaSource> mSMS;
41826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    sp<SurfaceTextureClient> mSTC;
41926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    sp<ANativeWindow> mANW;
42026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi};
42126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
422557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
423557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Methods in SurfaceMediaSourceGLTest
424557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
425557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiEGLint const* SurfaceMediaSourceGLTest::getConfigAttribs() {
426557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("SurfaceMediaSourceGLTest getConfigAttribs");
427557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    static EGLint sDefaultConfigAttribs[] = {
428557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
429557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
430557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_RED_SIZE, 8,
431557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_GREEN_SIZE, 8,
432557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_BLUE_SIZE, 8,
433557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_RECORDABLE_ANDROID, EGL_TRUE,
434557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        EGL_NONE };
435557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
436557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    return sDefaultConfigAttribs;
437557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
438557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
439557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// One pass of dequeuing and queuing a GLBuffer
440557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketivoid SurfaceMediaSourceGLTest::oneBufferPassGL(int num) {
441557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int d = num % 50;
442557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    float f = 0.2f; // 0.1f * d;
443557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
444557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0, 0.3, 0, 0.6);
445557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
446557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
447557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glEnable(GL_SCISSOR_TEST);
448557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(4 + d, 4 + d, 4, 4);
449557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(1.0 - f, f, f, 1.0);
450557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
451557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
452557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(24 + d, 48 + d, 4, 4);
453557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(f, 1.0 - f, f, 1.0);
454557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
455557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
456557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(37 + d, 17 + d, 4, 4);
457557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(f, f, 1.0 - f, 1.0);
458557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
459557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
460557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // The following call dequeues and queues the buffer
461e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    eglSwapBuffers(mEglDisplay, mEglSurface);
4623814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
463557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glDisable(GL_SCISSOR_TEST);
464557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
465557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
466557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Set up the MediaRecorder which runs in the same process as mediaserver
467557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketisp<MediaRecorder> SurfaceMediaSourceGLTest::setUpMediaRecorder(int fd, int videoSource,
468557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        int outputFormat, int videoEncoder, int width, int height, int fps) {
469557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = new MediaRecorder();
470557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoSource(videoSource);
471557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setOutputFormat(outputFormat);
472557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoEncoder(videoEncoder);
473557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setOutputFile(fd, 0, 0);
474557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoSize(width, height);
475557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->setVideoFrameRate(fps);
476557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr->prepare();
477557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Starting MediaRecorder...");
478557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->start());
479557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    return mr;
480557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
481557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
482557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// query the mediarecorder for a surfacemeidasource and create an egl surface with that
483557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketivoid SurfaceMediaSourceGLTest::setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr) {
484557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<ISurfaceTexture> iST = mr->querySurfaceMediaSourceFromMediaServer();
485557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSTC = new SurfaceTextureClient(iST);
486557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mANW = mSTC;
487557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
488e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
489557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                                mANW.get(), NULL);
490557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
491e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    ASSERT_NE(EGL_NO_SURFACE, mEglSurface) ;
492557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
493e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
494557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglContext));
495557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
496557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
497557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
498557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
499557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
500557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Methods in SurfaceMediaSourceTest
501557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
502557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
503557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// One pass of dequeuing and queuing the buffer. Fill it in with
504557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// cpu YV12 buffer
505f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPass(int width, int height ) {
50626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ANativeWindowBuffer* anb;
50726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
50826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_TRUE(anb != NULL);
50926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
51026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
51126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer()));
51226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
51326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    // Fill the buffer with the a checkerboard pattern
51426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    uint8_t* img = NULL;
51526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
516f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    SurfaceMediaSourceTest::fillYV12Buffer(img, width, height, buf->getStride());
51726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    buf->unlock();
51826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
51926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer()));
52026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
52126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
522557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dequeuing and queuing the buffer without really filling it in.
523557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketivoid SurfaceMediaSourceTest::oneBufferPassNoFill(int width, int height ) {
524557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ANativeWindowBuffer* anb;
525557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
526557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_TRUE(anb != NULL);
52726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
528557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
529557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer()));
530557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // We do not fill the buffer in. Just queue it back.
531557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer()));
53226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
53326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
53426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern
535f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) {
53626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int blockWidth = w > 16 ? w / 16 : 1;
53726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int blockHeight = h > 16 ? h / 16 : 1;
53826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int yuvTexOffsetY = 0;
53926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideY = stride;
54026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetV = yuvTexStrideY * h;
54126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf;
54226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2;
54326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideU = yuvTexStrideV;
54426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    for (int x = 0; x < w; x++) {
54526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        for (int y = 0; y < h; y++) {
54626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            int parityX = (x / blockWidth) & 1;
54726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            int parityY = (y / blockHeight) & 1;
54826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            unsigned char intensity = (parityX ^ parityY) ? 63 : 191;
54926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity;
55026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            if (x < w / 2 && y < h / 2) {
55126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity;
55226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                if (x * 2 < w / 2 && y * 2 < h / 2) {
55326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] =
55426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] =
55526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] =
55626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] =
55726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                        intensity;
55826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                }
55926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            }
56026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
56126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
56226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
56326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
56426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it.
565f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12BufferRect(uint8_t* buf, int w,
56626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                  int h, int stride, const android_native_rect_t& rect) {
56726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    const int yuvTexOffsetY = 0;
56826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideY = stride;
56926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetV = yuvTexStrideY * h;
57026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf;
57126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2;
57226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int yuvTexStrideU = yuvTexStrideV;
57326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    for (int x = 0; x < w; x++) {
57426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        for (int y = 0; y < h; y++) {
57526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            bool inside = rect.left <= x && x < rect.right &&
57626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                    rect.top <= y && y < rect.bottom;
57726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64;
57826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            if (x < w / 2 && y < h / 2) {
57926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                bool inside = rect.left <= 2*x && 2*x < rect.right &&
58026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                        rect.top <= 2*y && 2*y < rect.bottom;
58126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16;
58226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] =
58326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                                                inside ? 16 : 255;
58426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            }
58526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
58626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
587f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi}  ///////// End of class SurfaceMediaSourceTest
58826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
58926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi///////////////////////////////////////////////////////////////////
59026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Class to imitate the recording     /////////////////////////////
59126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// ////////////////////////////////////////////////////////////////
59226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketistruct SimpleDummyRecorder {
59326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        sp<MediaSource> mSource;
59426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
59526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        SimpleDummyRecorder
59626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                (const sp<MediaSource> &source): mSource(source) {}
59726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
59826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        status_t start() { return mSource->start();}
59926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        status_t stop()  { return mSource->stop();}
60026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
60126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        // fakes reading from a media source
60226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        status_t readFromSource() {
60326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            MediaBuffer *buffer;
60426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            status_t err = mSource->read(&buffer);
60526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            if (err != OK) {
60626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi                return err;
60726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            }
60826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buffer->release();
60926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            buffer = NULL;
61026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            return OK;
61126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
61226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi};
61326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi///////////////////////////////////////////////////////////////////
61426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi//           TESTS
615557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// SurfaceMediaSourceTest class contains tests that fill the buffers
616557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// using the cpu calls
617557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// SurfaceMediaSourceGLTest class contains tests that fill the buffers
618557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// using the GL calls.
619557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// TODO: None of the tests actually verify the encoded images.. so at this point,
620557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// these are mostly functionality tests + visual inspection
621557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//////////////////////////////////////////////////////////////////////
622557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
623f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource
624557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
625557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketistatic int testId = 1;
626557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotOneBufferPass) {
627557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
62826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing OneBufferPass ******************************");
62926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
630557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
631557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
63226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    oneBufferPass(mYuvTexWidth, mYuvTexHeight);
63326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
63426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
63526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted
636557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
637557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) {
638557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
63926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing Wrong size BufferPass ******************************");
64026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
64126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    // setting the client side buffer size different than the server size
642557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_dimensions(mANW.get(),
643557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi             10, 10));
644557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
645557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
64626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
64726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ANativeWindowBuffer* anb;
64826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
649557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Note: make sure we get an ERROR back when dequeuing!
65026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
65126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
65226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
653f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
654557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
655557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest,  DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
656557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
65726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder *********************");
658557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
659557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
660b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi
661f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
66226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.start();
66326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
66426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 0;
66526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount < 300) {
66626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
66726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
66826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        ASSERT_EQ(NO_ERROR, writer.readFromSource());
66926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
67026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
67126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
67226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.stop();
67326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
67426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
675f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource
676557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Dummy Encoder
677557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest,  DISABLED_DummyLagEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
678557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
67926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************");
680b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi
681557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
682557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
683b1f8c266e47554bc45632f021c9e409399e907e7Pannag Sanketi
684f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
68526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.start();
68626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
68726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 1;
688f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    const int FRAMES_LAG = mSMS->getBufferCount() - 1;
68926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount <= 300) {
69026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
69126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        // Forcing the writer to lag behind a few frames
69226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        if (nFramesCount > FRAMES_LAG) {
69326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi            ASSERT_EQ(NO_ERROR, writer.readFromSource());
69426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        }
69526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
69626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
69726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.stop();
69826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
69926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
700f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
70126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer
702557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyThreadedEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
703557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
70426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********");
705557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
706557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            HAL_PIXEL_FORMAT_YV12));
70726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
708f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi    DummyRecorder writer(mSMS);
70926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.start();
71026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
71126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 0;
71226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount <= 300) {
71326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
71426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
71526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
71626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
71726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    writer.stop();
71826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
71926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
720557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine actual encoding using mediarecorder
721557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// We use the mediaserver to create a mediarecorder and send
722557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// it back to us. So SurfaceMediaSource lives in the same process
723557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// as the mediaserver.
724557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Very close to the actual camera, except that the
725557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// buffers are filled and queueud by the CPU instead of GL.
726557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuYV12BufferNpotWriteMediaServer) {
727557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
728557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Testing the whole pipeline with actual MediaRecorder ***********");
729557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** SurfaceMediaSource is same process as mediaserver    ***********");
730557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
731557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSource.mp4";
732557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
733557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    if (fd < 0) {
734557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
735557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
736557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK(fd >= 0);
737557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
738557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = SurfaceMediaSourceGLTest::setUpMediaRecorder(fd,
739557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            VIDEO_SOURCE_GRALLOC_BUFFER,
740557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth,
741557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mYuvTexHeight, 30);
742557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // get the reference to the surfacemediasource living in
743557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // mediaserver that is created by stagefrightrecorder
744557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<ISurfaceTexture> iST = mr->querySurfaceMediaSourceFromMediaServer();
745557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSTC = new SurfaceTextureClient(iST);
746557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mANW = mSTC;
747557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
748557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
749557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                                                HAL_PIXEL_FORMAT_YV12));
75026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
75126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    int32_t nFramesCount = 0;
75226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    while (nFramesCount <= 300) {
753557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassNoFill(mYuvTexWidth, mYuvTexHeight);
75426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi        nFramesCount++;
755557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
75626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi    }
75726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
758557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU));
759557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Stopping MediaRecorder...");
760557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->stop());
761557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr.clear();
762557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    close(fd);
76326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}
76426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
765557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi//////////////////////////////////////////////////////////////////////
766557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// GL tests
767557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi/////////////////////////////////////////////////////////////////////
768557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
769557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine whether we can choose the Recordable Android GLConfig
770557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// DummyRecorder used- no real encoding here
771e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWriter) {
772557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
773e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    LOGV("Verify creating a surface w/ right config + dummy writer*********");
774557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
775557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
776557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mSTC = new SurfaceTextureClient(mSMS);
777557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mANW = mSTC;
778557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
779557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    DummyRecorder writer(mSMS);
780557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    writer.start();
781557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
782e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
783557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi                                mANW.get(), NULL);
784557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
785e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    ASSERT_NE(EGL_NO_SURFACE, mEglSurface) ;
786557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
787e753750a82a3dcffeb36c7661d1c7922fc082a35Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
788557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            mEglContext));
789557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
79026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi
791557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int32_t nFramesCount = 0;
792557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    while (nFramesCount <= 300) {
793557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassGL();
794557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        nFramesCount++;
795557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
796557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
797557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
7983814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
7993814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi            EGL_NO_CONTEXT));
8003814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
8013814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    eglDestroySurface(mEglDisplay, mEglSurface);
8023814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    mEglSurface = EGL_NO_SURFACE;
8033814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi
804557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    writer.stop();
805557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
806557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine whether we can render GL buffers in to the surface
807557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// created with the native window handle
808557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, RenderingToRecordableEGLSurfaceWorks) {
809557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
810557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("RenderingToRecordableEGLSurfaceWorks *********************");
811557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Do the producer side of things
812557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0.6, 0.6, 0.6, 0.6);
813557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
814557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
815557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glEnable(GL_SCISSOR_TEST);
816557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(4, 4, 4, 4);
817557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(1.0, 0.0, 0.0, 1.0);
818557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
819557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
820557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(24, 48, 4, 4);
821557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0.0, 1.0, 0.0, 1.0);
822557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
823557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
824557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glScissor(37, 17, 4, 4);
825557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClearColor(0.0, 0.0, 1.0, 1.0);
826557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
827557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
828557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
829557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
830557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
831557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
832557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
833557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 4,  7, 255,   0,   0, 255));
834557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(25, 51,   0, 255,   0, 255));
835557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(40, 19,   0,   0, 255, 255));
836557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153));
837557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153));
838557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(13,  8, 153, 153, 153, 153));
839557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(46,  3, 153, 153, 153, 153));
840557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153));
841557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153));
842557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153));
843557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153));
844557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153));
845557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153));
846557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153));
847557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153));
848557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153));
849557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
850557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
851557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine the actual encoding with GL buffers
852557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource
853557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// The same pattern is rendered every frame
854557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaSameImageEachBufNpotWrite) {
855557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
856557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Testing the whole pipeline with actual Recorder ***********");
857557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** GL Filling the buffers ***********");
858557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Note: No need to set the colorformat for the buffers. The colorformat is
859557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // in the GRAlloc buffers itself.
860557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
861557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSourceGL.mp4";
862557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
863557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    if (fd < 0) {
864557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
865557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
866557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK(fd >= 0);
867557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
868557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER,
869557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30);
870557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
871557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // get the reference to the surfacemediasource living in
872557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // mediaserver that is created by stagefrightrecorder
873557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    setUpEGLSurfaceFromMediaRecorder(mr);
874557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
875557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int32_t nFramesCount = 0;
876557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    while (nFramesCount <= 300) {
877557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassGL();
878557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        nFramesCount++;
879557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
880557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
881557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
8823814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
8833814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi            EGL_NO_CONTEXT));
8843814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
8853814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    eglDestroySurface(mEglDisplay, mEglSurface);
8863814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    mEglSurface = EGL_NO_SURFACE;
8873814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi
888557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Stopping MediaRecorder...");
889557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK_EQ(OK, mr->stop());
890557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    mr.clear();
891557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    close(fd);
892557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi}
893557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
894557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Test to examine the actual encoding from the GL Buffers
895557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource
896557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi// A different pattern is rendered every frame
897557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaDiffImageEachBufNpotWrite) {
898557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("Test # %d", testId++);
899557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Testing the whole pipeline with actual Recorder ***********");
900557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    LOGV("************** Diff GL Filling the buffers ***********");
901557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // Note: No need to set the colorformat for the buffers. The colorformat is
902557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // in the GRAlloc buffers itself.
903557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
904557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSourceGLDiff.mp4";
905557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
906557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    if (fd < 0) {
907557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
908557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
909557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    CHECK(fd >= 0);
910557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
911557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER,
912557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30);
913557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
914557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // get the reference to the surfacemediasource living in
915557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    // mediaserver that is created by stagefrightrecorder
916557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    setUpEGLSurfaceFromMediaRecorder(mr);
917557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
918557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    int32_t nFramesCount = 0;
919557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    while (nFramesCount <= 300) {
920557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        oneBufferPassGL(nFramesCount);
921557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        nFramesCount++;
922557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi        LOGV("framesCount = %d", nFramesCount);
923557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi    }
924557b7092cc9a1dfe766ac3d0421e1049c653c4aePannag Sanketi
9253814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
9263814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi            EGL_NO_CONTEXT));
9273814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
9283814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    eglDestroySurface(mEglDisplay, mEglSurface);
9293814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi    mEglSurface = EGL_NO_SURFACE;
9303814ff4b17165e86d1893fde53025c69583599b4Pannag Sanketi
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