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