SurfaceMediaSource_test.cpp revision 88c3c4acb13a93209b3572fecd585099defec184
13399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/*
23399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Copyright (C) 2011 The Android Open Source Project
33399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *
43399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Licensed under the Apache License, Version 2.0 (the "License");
53399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * you may not use this file except in compliance with the License.
63399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * You may obtain a copy of the License at
73399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *
83399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *      http://www.apache.org/licenses/LICENSE-2.0
93399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *
103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Unless required by applicable law or agreed to in writing, software
113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * distributed under the License is distributed on an "AS IS" BASIS,
123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * See the License for the specific language governing permissions and
143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * limitations under the License.
153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi */
163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
17bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam//#define LOG_NDEBUG 0
180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#define LOG_TAG "SurfaceMediaSource_test"
193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <gtest/gtest.h>
213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/String8.h>
223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/Errors.h>
230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <fcntl.h>
240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <unistd.h>
253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2688c3c4acb13a93209b3572fecd585099defec184Mathias Agopian#include <GLES2/gl2.h>
2788c3c4acb13a93209b3572fecd585099defec184Mathias Agopian
281a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi#include <media/stagefright/SurfaceMediaSource.h>
290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <media/mediarecorder.h>
303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <ui/GraphicBuffer.h>
321a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h>
33df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/ISurfaceComposer.h>
34df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/Surface.h>
35df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/SurfaceComposerClient.h>
363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <binder/ProcessState.h>
383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <ui/FramebufferNativeWindow.h>
393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
40f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <media/stagefright/MediaBufferGroup.h>
423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MediaDefs.h>
433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MetaData.h>
443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/OMXClient.h>
453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/OMXCodec.h>
463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <OMX_Component.h>
473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include "DummyRecorder.h"
493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketinamespace android {
523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiclass GLTest : public ::testing::Test {
540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiprotected:
550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    GLTest():
570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mEglDisplay(EGL_NO_DISPLAY),
580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mEglSurface(EGL_NO_SURFACE),
590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mEglContext(EGL_NO_CONTEXT) {
600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual void SetUp() {
633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("GLTest::SetUp()");
640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGLint majorVersion;
690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGLint minorVersion;
700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        RecordProperty("EglVersionMajor", majorVersion);
730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        RecordProperty("EglVersionMajor", minorVersion);
740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGLint numConfigs = 0;
760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mGlConfig,
770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                1, &numConfigs));
780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        char* displaySecsEnv = getenv("GLTEST_DISPLAY_SECS");
810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (displaySecsEnv != NULL) {
820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mDisplaySecs = atoi(displaySecsEnv);
830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (mDisplaySecs < 0) {
840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                mDisplaySecs = 0;
850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        } else {
870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mDisplaySecs = 0;
880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (mDisplaySecs > 0) {
910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mComposerClient = new SurfaceComposerClient;
920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mSurfaceControl = mComposerClient->createSurface(
95a6195decfe4f9021bbbd7deb050495c33371366bJeff Brown                    String8("Test Surface"),
960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    getSurfaceWidth(), getSurfaceHeight(),
970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    PIXEL_FORMAT_RGB_888, 0);
980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_TRUE(mSurfaceControl != NULL);
1000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_TRUE(mSurfaceControl->isValid());
1010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            SurfaceComposerClient::openGlobalTransaction();
1030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
1040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
1050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            SurfaceComposerClient::closeGlobalTransaction();
1060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            sp<ANativeWindow> window = mSurfaceControl->getSurface();
1080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
1090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    window.get(), NULL);
1100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        } else {
1113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource");
1128ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            sp<IGraphicBufferProducer> sms = (new SurfaceMediaSource(
113bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam                    getSurfaceWidth(), getSurfaceHeight()))->getBufferQueue();
1141a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            sp<Surface> stc = new Surface(sms);
11521fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi            sp<ANativeWindow> window = stc;
1160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
11721fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi            mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
11821fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi                    window.get(), NULL);
1190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
1200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
1210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
1220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mEglContext = eglCreateContext(mEglDisplay, mGlConfig, EGL_NO_CONTEXT,
1240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                getContextAttribs());
1250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
1260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
1270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
1290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                mEglContext));
1300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
1310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGLint w, h;
1330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &w));
1340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
1350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &h));
1360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
1370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        RecordProperty("EglSurfaceWidth", w);
1380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        RecordProperty("EglSurfaceHeight", h);
1390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        glViewport(0, 0, w, h);
1410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
1420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
1430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual void TearDown() {
1450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        // Display the result
1460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (mDisplaySecs > 0 && mEglSurface != EGL_NO_SURFACE) {
1470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            eglSwapBuffers(mEglDisplay, mEglSurface);
1480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            sleep(mDisplaySecs);
1490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
1500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (mComposerClient != NULL) {
1520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mComposerClient->dispose();
1530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
1540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (mEglContext != EGL_NO_CONTEXT) {
1550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            eglDestroyContext(mEglDisplay, mEglContext);
1560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
1570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (mEglSurface != EGL_NO_SURFACE) {
1580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            eglDestroySurface(mEglDisplay, mEglSurface);
1590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
1600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (mEglDisplay != EGL_NO_DISPLAY) {
1610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            eglTerminate(mEglDisplay);
1620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
1630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(EGL_SUCCESS, eglGetError());
1640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
1650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual EGLint const* getConfigAttribs() {
1673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("GLTest getConfigAttribs");
1680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        static EGLint sDefaultConfigAttribs[] = {
1690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
1700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_RED_SIZE, 8,
1720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_GREEN_SIZE, 8,
1730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_BLUE_SIZE, 8,
1740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_ALPHA_SIZE, 8,
1750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_DEPTH_SIZE, 16,
1760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_STENCIL_SIZE, 8,
1770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_NONE };
1780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return sDefaultConfigAttribs;
1800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
1810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual EGLint const* getContextAttribs() {
1830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        static EGLint sDefaultContextAttribs[] = {
1840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_CONTEXT_CLIENT_VERSION, 2,
1850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            EGL_NONE };
1860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return sDefaultContextAttribs;
1880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
1890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual EGLint getSurfaceWidth() {
1910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return 512;
1920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
1930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual EGLint getSurfaceHeight() {
1950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return 512;
1960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
1970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    void loadShader(GLenum shaderType, const char* pSource, GLuint* outShader) {
1990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLuint shader = glCreateShader(shaderType);
2000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (shader) {
2020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glShaderSource(shader, 1, &pSource, NULL);
2030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glCompileShader(shader);
2050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            GLint compiled = 0;
2070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
2080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (!compiled) {
2100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                GLint infoLen = 0;
2110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
2120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                if (infoLen) {
2140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    char* buf = (char*) malloc(infoLen);
2150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    if (buf) {
2160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        glGetShaderInfoLog(shader, infoLen, NULL, buf);
2170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        printf("Shader compile log:\n%s\n", buf);
2180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        free(buf);
2190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        FAIL();
2200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    }
2210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                } else {
2220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    char* buf = (char*) malloc(0x1000);
2230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    if (buf) {
2240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        glGetShaderInfoLog(shader, 0x1000, NULL, buf);
2250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        printf("Shader compile log:\n%s\n", buf);
2260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        free(buf);
2270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        FAIL();
2280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    }
2290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                }
2300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                glDeleteShader(shader);
2310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                shader = 0;
2320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
2330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
2340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_TRUE(shader != 0);
2350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        *outShader = shader;
2360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
2370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
2380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    void createProgram(const char* pVertexSource, const char* pFragmentSource,
2390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            GLuint* outPgm) {
2400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLuint vertexShader, fragmentShader;
2410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        {
2420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            SCOPED_TRACE("compiling vertex shader");
2430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            loadShader(GL_VERTEX_SHADER, pVertexSource, &vertexShader);
2440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (HasFatalFailure()) {
2450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                return;
2460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
2470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
2480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        {
2490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            SCOPED_TRACE("compiling fragment shader");
2500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            loadShader(GL_FRAGMENT_SHADER, pFragmentSource, &fragmentShader);
2510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (HasFatalFailure()) {
2520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                return;
2530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
2540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
2550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
2560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLuint program = glCreateProgram();
2570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (program) {
2590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glAttachShader(program, vertexShader);
2600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glAttachShader(program, fragmentShader);
2620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError());
2630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glLinkProgram(program);
2640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            GLint linkStatus = GL_FALSE;
2650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
2660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (linkStatus != GL_TRUE) {
2670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                GLint bufLength = 0;
2680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
2690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                if (bufLength) {
2700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    char* buf = (char*) malloc(bufLength);
2710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    if (buf) {
2720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        glGetProgramInfoLog(program, bufLength, NULL, buf);
2730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        printf("Program link log:\n%s\n", buf);
2740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        free(buf);
2750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                        FAIL();
2760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    }
2770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                }
2780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                glDeleteProgram(program);
2790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                program = 0;
2800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
2810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
2820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        glDeleteShader(vertexShader);
2830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        glDeleteShader(fragmentShader);
2840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        ASSERT_TRUE(program != 0);
2850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        *outPgm = program;
2860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
2873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    static int abs(int value) {
2890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return value > 0 ? value : -value;
2900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
2910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
2920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ::testing::AssertionResult checkPixel(int x, int y, int r,
2930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            int g, int b, int a, int tolerance=2) {
2940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLubyte pixel[4];
2950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        String8 msg;
2960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
2970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLenum err = glGetError();
2980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (err != GL_NO_ERROR) {
2990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            msg += String8::format("error reading pixel: %#x", err);
3000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            while ((err = glGetError()) != GL_NO_ERROR) {
3010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                msg += String8::format(", %#x", err);
3020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
3030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            fprintf(stderr, "pixel check failure: %s\n", msg.string());
3040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            return ::testing::AssertionFailure(
3050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    ::testing::Message(msg.string()));
3060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
3070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (r >= 0 && abs(r - int(pixel[0])) > tolerance) {
3080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            msg += String8::format("r(%d isn't %d)", pixel[0], r);
3090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
3100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (g >= 0 && abs(g - int(pixel[1])) > tolerance) {
3110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (!msg.isEmpty()) {
3120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                msg += " ";
3130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
3140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            msg += String8::format("g(%d isn't %d)", pixel[1], g);
3150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
3160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (b >= 0 && abs(b - int(pixel[2])) > tolerance) {
3170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (!msg.isEmpty()) {
3180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                msg += " ";
3190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
3200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            msg += String8::format("b(%d isn't %d)", pixel[2], b);
3210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
3220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (a >= 0 && abs(a - int(pixel[3])) > tolerance) {
3230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            if (!msg.isEmpty()) {
3240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                msg += " ";
3250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            }
3260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            msg += String8::format("a(%d isn't %d)", pixel[3], a);
3270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
3280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        if (!msg.isEmpty()) {
3290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            fprintf(stderr, "pixel check failure: %s\n", msg.string());
3300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            return ::testing::AssertionFailure(
3310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                    ::testing::Message(msg.string()));
3320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        } else {
3330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            return ::testing::AssertionSuccess();
3340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        }
3350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
3360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int mDisplaySecs;
3380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<SurfaceComposerClient> mComposerClient;
3390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<SurfaceControl> mSurfaceControl;
3400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EGLDisplay mEglDisplay;
3420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EGLSurface mEglSurface;
3430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EGLContext mEglContext;
3440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EGLConfig  mGlConfig;
3450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi};
3460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////////
3480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi//    Class for  the NON-GL tests
3490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////////
3501a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketiclass SurfaceMediaSourceTest : public ::testing::Test {
3513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketipublic:
3523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
3530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    SurfaceMediaSourceTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { }
3543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    void oneBufferPass(int width, int height );
3550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    void oneBufferPassNoFill(int width, int height );
3563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    static void fillYV12Buffer(uint8_t* buf, int w, int h, int stride) ;
3573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    static void fillYV12BufferRect(uint8_t* buf, int w, int h,
3583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                        int stride, const android_native_rect_t& rect) ;
3593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiprotected:
3603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
3613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    virtual void SetUp() {
362b6f2fced47866a5d095b2b18d2e28d7c4321e3a6James Dong        android::ProcessState::self()->startThreadPool();
3631a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
364bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam
365abf0610a8cea021548f2909e1d47d656206f641cDaniel Lam        // Manual cast is required to avoid constructor ambiguity
3661a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        mSTC = new Surface(static_cast<sp<IGraphicBufferProducer> >( mSMS->getBufferQueue()));
3673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        mANW = mSTC;
3680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
3693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
3700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual void TearDown() {
3710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mSMS.clear();
3720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mSTC.clear();
3730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mANW.clear();
3743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
3753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
3760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    const int mYuvTexWidth;
3770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    const int mYuvTexHeight;
3780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<SurfaceMediaSource> mSMS;
3801a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    sp<Surface> mSTC;
3810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<ANativeWindow> mANW;
3820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi};
3830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////////
3850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi//    Class for  the GL tests
3860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////////
3870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiclass SurfaceMediaSourceGLTest : public GLTest {
3880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketipublic:
3890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    SurfaceMediaSourceGLTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { }
3910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual EGLint const* getConfigAttribs();
3920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    void oneBufferPassGL(int num = 0);
3930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    static sp<MediaRecorder> setUpMediaRecorder(int fileDescriptor, int videoSource,
3940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        int outputFormat, int videoEncoder, int width, int height, int fps);
3950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiprotected:
3960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
3970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    virtual void SetUp() {
3983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("SMS-GLTest::SetUp()");
3990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        android::ProcessState::self()->startThreadPool();
4000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
4011a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        mSTC = new Surface(static_cast<sp<IGraphicBufferProducer> >( mSMS->getBufferQueue()));
4020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        mANW = mSTC;
4030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        // Doing the setup related to the GL Side
4050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLTest::SetUp();
4060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
4073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
4083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    virtual void TearDown() {
4091a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi        mSMS.clear();
4103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        mSTC.clear();
4113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        mANW.clear();
4120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        GLTest::TearDown();
4133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
4143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
4150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    void setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr);
4160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
417a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi    const int mYuvTexWidth;
418a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi    const int mYuvTexHeight;
4193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
4201a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    sp<SurfaceMediaSource> mSMS;
4211a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    sp<Surface> mSTC;
4223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    sp<ANativeWindow> mANW;
4233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi};
4243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
4250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////
4260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Methods in SurfaceMediaSourceGLTest
4270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////
4280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiEGLint const* SurfaceMediaSourceGLTest::getConfigAttribs() {
4293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("SurfaceMediaSourceGLTest getConfigAttribs");
4300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    static EGLint sDefaultConfigAttribs[] = {
4310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
4320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
4330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_RED_SIZE, 8,
4340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_GREEN_SIZE, 8,
4350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_BLUE_SIZE, 8,
4360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_RECORDABLE_ANDROID, EGL_TRUE,
4370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        EGL_NONE };
4380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    return sDefaultConfigAttribs;
4400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
4410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// One pass of dequeuing and queuing a GLBuffer
4430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketivoid SurfaceMediaSourceGLTest::oneBufferPassGL(int num) {
4440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int d = num % 50;
4450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    float f = 0.2f; // 0.1f * d;
4460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(0, 0.3, 0, 0.6);
4480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
4490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glEnable(GL_SCISSOR_TEST);
4510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glScissor(4 + d, 4 + d, 4, 4);
4520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(1.0 - f, f, f, 1.0);
4530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
4540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glScissor(24 + d, 48 + d, 4, 4);
4560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(f, 1.0 - f, f, 1.0);
4570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
4580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glScissor(37 + d, 17 + d, 4, 4);
4600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(f, f, 1.0 - f, 1.0);
4610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
4620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // The following call dequeues and queues the buffer
46421fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    eglSwapBuffers(mEglDisplay, mEglSurface);
46531292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
4660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glDisable(GL_SCISSOR_TEST);
4670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
4680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Set up the MediaRecorder which runs in the same process as mediaserver
4700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketisp<MediaRecorder> SurfaceMediaSourceGLTest::setUpMediaRecorder(int fd, int videoSource,
4710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        int outputFormat, int videoEncoder, int width, int height, int fps) {
4720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<MediaRecorder> mr = new MediaRecorder();
4730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->setVideoSource(videoSource);
4740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->setOutputFormat(outputFormat);
4750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->setVideoEncoder(videoEncoder);
4760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->setOutputFile(fd, 0, 0);
4770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->setVideoSize(width, height);
4780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->setVideoFrameRate(fps);
4790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr->prepare();
4803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Starting MediaRecorder...");
481f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK_EQ((status_t)OK, mr->start());
4820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    return mr;
4830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
4840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// query the mediarecorder for a surfacemeidasource and create an egl surface with that
4860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketivoid SurfaceMediaSourceGLTest::setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr) {
4878ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    sp<IGraphicBufferProducer> iST = mr->querySurfaceMediaSourceFromMediaServer();
4881a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    mSTC = new Surface(iST);
4890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mANW = mSTC;
4900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
4919d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam    if (mEglSurface != EGL_NO_SURFACE) {
4929d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam        EXPECT_TRUE(eglDestroySurface(mEglDisplay, mEglSurface));
4939d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam        mEglSurface = EGL_NO_SURFACE;
4949d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam    }
49521fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
4960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                                mANW.get(), NULL);
4970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
49821fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    ASSERT_NE(EGL_NO_SURFACE, mEglSurface) ;
4990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
50021fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
5010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mEglContext));
5020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
5030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
5040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
5050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
5060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////
5070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Methods in SurfaceMediaSourceTest
5080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////
5090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
5100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// One pass of dequeuing and queuing the buffer. Fill it in with
5110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// cpu YV12 buffer
5121a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPass(int width, int height ) {
5133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ANativeWindowBuffer* anb;
5141e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), &anb));
5153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_TRUE(anb != NULL);
5163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    // Fill the buffer with the a checkerboard pattern
5193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    uint8_t* img = NULL;
5201e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
5213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
5221a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    SurfaceMediaSourceTest::fillYV12Buffer(img, width, height, buf->getStride());
5233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    buf->unlock();
5243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5251e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(),
5261e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            -1));
5273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
5283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dequeuing and queuing the buffer without really filling it in.
5300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPassNoFill(int width, int height ) {
5310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ANativeWindowBuffer* anb;
5321e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), &anb));
5330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_TRUE(anb != NULL);
5343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // We do not fill the buffer in. Just queue it back.
5361e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
5371e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(),
5381e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            -1));
5393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
5403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern
5421a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) {
5433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    const int blockWidth = w > 16 ? w / 16 : 1;
5443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    const int blockHeight = h > 16 ? h / 16 : 1;
5453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    const int yuvTexOffsetY = 0;
5463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexStrideY = stride;
5473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexOffsetV = yuvTexStrideY * h;
5483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf;
5493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2;
5503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexStrideU = yuvTexStrideV;
5513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    for (int x = 0; x < w; x++) {
5523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        for (int y = 0; y < h; y++) {
5533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            int parityX = (x / blockWidth) & 1;
5543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            int parityY = (y / blockHeight) & 1;
5553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            unsigned char intensity = (parityX ^ parityY) ? 63 : 191;
5563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity;
5573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            if (x < w / 2 && y < h / 2) {
5583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity;
5593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                if (x * 2 < w / 2 && y * 2 < h / 2) {
5603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                    buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] =
5613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                    buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] =
5623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                    buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] =
5633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                    buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] =
5643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                        intensity;
5653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                }
5663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            }
5673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        }
5683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
5693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
5703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it.
5721a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12BufferRect(uint8_t* buf, int w,
5733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                  int h, int stride, const android_native_rect_t& rect) {
5743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    const int yuvTexOffsetY = 0;
5753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexStrideY = stride;
5763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexOffsetV = yuvTexStrideY * h;
5773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf;
5783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2;
5793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int yuvTexStrideU = yuvTexStrideV;
5803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    for (int x = 0; x < w; x++) {
5813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        for (int y = 0; y < h; y++) {
5823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            bool inside = rect.left <= x && x < rect.right &&
5833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                    rect.top <= y && y < rect.bottom;
5843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64;
5853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            if (x < w / 2 && y < h / 2) {
5863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                bool inside = rect.left <= 2*x && 2*x < rect.right &&
5873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                        rect.top <= 2*y && 2*y < rect.bottom;
5883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16;
5893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] =
5903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                                                inside ? 16 : 255;
5913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            }
5923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        }
5933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
5941a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi}  ///////// End of class SurfaceMediaSourceTest
5953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
5963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi///////////////////////////////////////////////////////////////////
5973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Class to imitate the recording     /////////////////////////////
5983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// ////////////////////////////////////////////////////////////////
5993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketistruct SimpleDummyRecorder {
6003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        sp<MediaSource> mSource;
6013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        SimpleDummyRecorder
6033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                (const sp<MediaSource> &source): mSource(source) {}
6043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        status_t start() { return mSource->start();}
6063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        status_t stop()  { return mSource->stop();}
6073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        // fakes reading from a media source
6093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        status_t readFromSource() {
6103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            MediaBuffer *buffer;
6113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            status_t err = mSource->read(&buffer);
6123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            if (err != OK) {
6133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                return err;
6143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            }
6153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            buffer->release();
6163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            buffer = NULL;
6173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            return OK;
6183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        }
6193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi};
6203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi///////////////////////////////////////////////////////////////////
6213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi//           TESTS
6220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// SurfaceMediaSourceTest class contains tests that fill the buffers
6230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// using the cpu calls
6240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// SurfaceMediaSourceGLTest class contains tests that fill the buffers
6250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// using the GL calls.
6260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// TODO: None of the tests actually verify the encoded images.. so at this point,
6270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// these are mostly functionality tests + visual inspection
6280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi//////////////////////////////////////////////////////////////////////
6290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
6301a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource
6310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder
6320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketistatic int testId = 1;
6330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotOneBufferPass) {
6343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
6353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Testing OneBufferPass ******************************");
6363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
6380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            HAL_PIXEL_FORMAT_YV12));
6393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    oneBufferPass(mYuvTexWidth, mYuvTexHeight);
6403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
6413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted
6430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder
6440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) {
6453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
6463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Testing Wrong size BufferPass ******************************");
6473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    // setting the client side buffer size different than the server size
6490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_dimensions(mANW.get(),
6500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi             10, 10));
6510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
6520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            HAL_PIXEL_FORMAT_YV12));
6533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ANativeWindowBuffer* anb;
6553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // Note: make sure we get an ERROR back when dequeuing!
6571e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    ASSERT_NE(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), &anb));
6583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
6593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6601a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
6610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder
6620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest,  DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
6633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
6643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Testing MultiBufferPass, Dummy Recorder *********************");
6650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
6660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            HAL_PIXEL_FORMAT_YV12));
667a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi
6681a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
6693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.start();
6703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int32_t nFramesCount = 0;
6723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    while (nFramesCount < 300) {
6733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
6743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        ASSERT_EQ(NO_ERROR, writer.readFromSource());
6763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        nFramesCount++;
6783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
6793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.stop();
6803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
6813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6821a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource
6830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder
684bdddc659a941afdb7f4958f582c6901c07246097Daniel LamTEST_F(SurfaceMediaSourceTest,  DummyLagEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
6853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
6863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************");
687a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi
6880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
6890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            HAL_PIXEL_FORMAT_YV12));
690a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi
6911a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
6923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.start();
6933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
6943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int32_t nFramesCount = 1;
695bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam    const int FRAMES_LAG = SurfaceMediaSource::MIN_UNDEQUEUED_BUFFERS;
696bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam
6973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    while (nFramesCount <= 300) {
698bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam        ALOGV("Frame: %d", nFramesCount);
6993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
7003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        // Forcing the writer to lag behind a few frames
7013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        if (nFramesCount > FRAMES_LAG) {
7023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            ASSERT_EQ(NO_ERROR, writer.readFromSource());
7033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        }
7043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        nFramesCount++;
7053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
7063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.stop();
7073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
7083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7091a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
7103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer
711bdddc659a941afdb7f4958f582c6901c07246097Daniel LamTEST_F(SurfaceMediaSourceTest, DummyThreadedEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
7123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
7133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********");
7140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
7150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            HAL_PIXEL_FORMAT_YV12));
7163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7171a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    DummyRecorder writer(mSMS);
7183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.start();
7193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int32_t nFramesCount = 0;
7213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    while (nFramesCount <= 300) {
722bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam        ALOGV("Frame: %d", nFramesCount);
7233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
7243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        nFramesCount++;
7263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
7273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.stop();
7283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
7293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine actual encoding using mediarecorder
7310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// We use the mediaserver to create a mediarecorder and send
7320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// it back to us. So SurfaceMediaSource lives in the same process
7330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// as the mediaserver.
7340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Very close to the actual camera, except that the
7350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// buffers are filled and queueud by the CPU instead of GL.
7360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuYV12BufferNpotWriteMediaServer) {
7373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
7383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("************** Testing the whole pipeline with actual MediaRecorder ***********");
7393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("************** SurfaceMediaSource is same process as mediaserver    ***********");
7400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
7410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSource.mp4";
7420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
7430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    if (fd < 0) {
74429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
7450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
7460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    CHECK(fd >= 0);
7470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
7480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<MediaRecorder> mr = SurfaceMediaSourceGLTest::setUpMediaRecorder(fd,
7490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            VIDEO_SOURCE_GRALLOC_BUFFER,
7500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth,
7510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mYuvTexHeight, 30);
7520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // get the reference to the surfacemediasource living in
7530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // mediaserver that is created by stagefrightrecorder
7548ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    sp<IGraphicBufferProducer> iST = mr->querySurfaceMediaSourceFromMediaServer();
7551a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    mSTC = new Surface(iST);
7560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mANW = mSTC;
7570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
7580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(),
7590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                                                HAL_PIXEL_FORMAT_YV12));
7603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int32_t nFramesCount = 0;
7623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    while (nFramesCount <= 300) {
7630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        oneBufferPassNoFill(mYuvTexWidth, mYuvTexHeight);
7643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        nFramesCount++;
7653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("framesCount = %d", nFramesCount);
7663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
7673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU));
7693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Stopping MediaRecorder...");
770f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK_EQ((status_t)OK, mr->stop());
7710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr.clear();
7720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    close(fd);
7733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
7743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
7750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi//////////////////////////////////////////////////////////////////////
7760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// GL tests
7770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////
7780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
7790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine whether we can choose the Recordable Android GLConfig
7800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// DummyRecorder used- no real encoding here
78121fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWriter) {
7823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
7833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Verify creating a surface w/ right config + dummy writer*********");
7840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
7850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
7861a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    mSTC = new Surface(static_cast<sp<IGraphicBufferProducer> >( mSMS->getBufferQueue()));
7870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mANW = mSTC;
7880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
7890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    DummyRecorder writer(mSMS);
7900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    writer.start();
7910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
7929d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam    if (mEglSurface != EGL_NO_SURFACE) {
7939d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam        EXPECT_TRUE(eglDestroySurface(mEglDisplay, mEglSurface));
7949d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam        mEglSurface = EGL_NO_SURFACE;
7959d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam    }
7969d06df4ecfe39e7e46873f7cd75a71e32a01d4f7Daniel Lam
79721fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,
7980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi                                mANW.get(), NULL);
7990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
80021fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    ASSERT_NE(EGL_NO_SURFACE, mEglSurface) ;
8010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
80221fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
8030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            mEglContext));
8040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
8053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
8060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int32_t nFramesCount = 0;
8070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    while (nFramesCount <= 300) {
8080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        oneBufferPassGL();
8090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        nFramesCount++;
8103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("framesCount = %d", nFramesCount);
8110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
8120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
81331292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
81431292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi            EGL_NO_CONTEXT));
81531292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
81631292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    eglDestroySurface(mEglDisplay, mEglSurface);
81731292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    mEglSurface = EGL_NO_SURFACE;
81831292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi
8190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    writer.stop();
8200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
8210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine whether we can render GL buffers in to the surface
8220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// created with the native window handle
8230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, RenderingToRecordableEGLSurfaceWorks) {
8243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
8253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RenderingToRecordableEGLSurfaceWorks *********************");
8260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // Do the producer side of things
8270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(0.6, 0.6, 0.6, 0.6);
8280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
8290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glEnable(GL_SCISSOR_TEST);
8310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glScissor(4, 4, 4, 4);
8320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(1.0, 0.0, 0.0, 1.0);
8330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
8340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glScissor(24, 48, 4, 4);
8360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(0.0, 1.0, 0.0, 1.0);
8370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
8380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glScissor(37, 17, 4, 4);
8400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClearColor(0.0, 0.0, 1.0, 1.0);
8410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    glClear(GL_COLOR_BUFFER_BIT);
8420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
8440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
8450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
8460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
8470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 4,  7, 255,   0,   0, 255));
8490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(25, 51,   0, 255,   0, 255));
8500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(40, 19,   0,   0, 255, 255));
8510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153));
8520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153));
8530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(13,  8, 153, 153, 153, 153));
8540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(46,  3, 153, 153, 153, 153));
8550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153));
8560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153));
8570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153));
8580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153));
8590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153));
8600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153));
8610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153));
8620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153));
8630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153));
8640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
8650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine the actual encoding with GL buffers
8670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource
8680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// The same pattern is rendered every frame
8690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaSameImageEachBufNpotWrite) {
8703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
8713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("************** Testing the whole pipeline with actual Recorder ***********");
8723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("************** GL Filling the buffers ***********");
8730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // Note: No need to set the colorformat for the buffers. The colorformat is
8740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // in the GRAlloc buffers itself.
8750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSourceGL.mp4";
8770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
8780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    if (fd < 0) {
87929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
8800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
8810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    CHECK(fd >= 0);
8820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER,
8840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30);
8850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // get the reference to the surfacemediasource living in
8870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // mediaserver that is created by stagefrightrecorder
8880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    setUpEGLSurfaceFromMediaRecorder(mr);
8890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
8900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int32_t nFramesCount = 0;
8910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    while (nFramesCount <= 300) {
8920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        oneBufferPassGL();
8930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        nFramesCount++;
8943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("framesCount = %d", nFramesCount);
8950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
8960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
89731292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
89831292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi            EGL_NO_CONTEXT));
89931292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
90031292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    eglDestroySurface(mEglDisplay, mEglSurface);
90131292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    mEglSurface = EGL_NO_SURFACE;
90231292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi
9033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Stopping MediaRecorder...");
904f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK_EQ((status_t)OK, mr->stop());
9050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr.clear();
9060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    close(fd);
9070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
9080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
9090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine the actual encoding from the GL Buffers
9100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource
9110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// A different pattern is rendered every frame
9120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaDiffImageEachBufNpotWrite) {
9133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Test # %d", testId++);
9143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("************** Testing the whole pipeline with actual Recorder ***********");
9153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("************** Diff GL Filling the buffers ***********");
9160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // Note: No need to set the colorformat for the buffers. The colorformat is
9170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // in the GRAlloc buffers itself.
9180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
9190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    const char *fileName = "/sdcard/outputSurfEncMSourceGLDiff.mp4";
9200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int fd = open(fileName, O_RDWR | O_CREAT, 0744);
9210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    if (fd < 0) {
92229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
9230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
9240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    CHECK(fd >= 0);
9250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
9260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER,
9270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30);
9280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
9290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // get the reference to the surfacemediasource living in
9300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    // mediaserver that is created by stagefrightrecorder
9310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    setUpEGLSurfaceFromMediaRecorder(mr);
9320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
9330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    int32_t nFramesCount = 0;
9340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    while (nFramesCount <= 300) {
9350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        oneBufferPassGL(nFramesCount);
9360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        nFramesCount++;
9373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("framesCount = %d", nFramesCount);
9380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
9390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
94031292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
94131292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi            EGL_NO_CONTEXT));
94231292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    ASSERT_EQ(EGL_SUCCESS, eglGetError());
94331292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    eglDestroySurface(mEglDisplay, mEglSurface);
94431292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi    mEglSurface = EGL_NO_SURFACE;
94531292d99f62a812af691e67e8e732c6ae582ee08Pannag Sanketi
9463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Stopping MediaRecorder...");
947f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK_EQ((status_t)OK, mr->stop());
9480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    mr.clear();
9490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    close(fd);
9500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}
9513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} // namespace android
952