SurfaceMediaSource_test.cpp revision 0c5c7d2b119d2350c186ae9902919bcf28c3e277
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 173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// #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 261a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi#include <media/stagefright/SurfaceMediaSource.h> 270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <media/mediarecorder.h> 283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <gui/SurfaceTextureClient.h> 303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <ui/GraphicBuffer.h> 313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <surfaceflinger/ISurfaceComposer.h> 323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <surfaceflinger/Surface.h> 333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <surfaceflinger/SurfaceComposerClient.h> 343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <binder/ProcessState.h> 363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <ui/FramebufferNativeWindow.h> 373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MediaDebug.h> 390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <media/stagefright/MediaBufferGroup.h> 403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MediaDefs.h> 413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MetaData.h> 423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/OMXClient.h> 433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/OMXCodec.h> 443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <OMX_Component.h> 453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include "DummyRecorder.h" 473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketinamespace android { 503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiclass GLTest : public ::testing::Test { 520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiprotected: 530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLTest(): 550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglDisplay(EGL_NO_DISPLAY), 560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglSurface(EGL_NO_SURFACE), 570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglContext(EGL_NO_CONTEXT) { 580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual void SetUp() { 610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("GLTest::SetUp()"); 620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay); 650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint majorVersion; 670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint minorVersion; 680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion)); 690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi RecordProperty("EglVersionMajor", majorVersion); 710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi RecordProperty("EglVersionMajor", minorVersion); 720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint numConfigs = 0; 740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mGlConfig, 750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1, &numConfigs)); 760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi char* displaySecsEnv = getenv("GLTEST_DISPLAY_SECS"); 790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (displaySecsEnv != NULL) { 800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mDisplaySecs = atoi(displaySecsEnv); 810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mDisplaySecs < 0) { 820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mDisplaySecs = 0; 830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } else { 850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mDisplaySecs = 0; 860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mDisplaySecs > 0) { 890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mComposerClient = new SurfaceComposerClient; 900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSurfaceControl = mComposerClient->createSurface( 930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi String8("Test Surface"), 0, 940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi getSurfaceWidth(), getSurfaceHeight(), 950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi PIXEL_FORMAT_RGB_888, 0); 960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_TRUE(mSurfaceControl != NULL); 980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_TRUE(mSurfaceControl->isValid()); 990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi SurfaceComposerClient::openGlobalTransaction(); 1010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF)); 1020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 1030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi SurfaceComposerClient::closeGlobalTransaction(); 1040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<ANativeWindow> window = mSurfaceControl->getSurface(); 1060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig, 1070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi window.get(), NULL); 1080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } else { 1090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint pbufferAttribs[] = { 1100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_WIDTH, getSurfaceWidth(), 1110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_HEIGHT, getSurfaceHeight(), 1120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_NONE }; 1130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglSurface = eglCreatePbufferSurface(mEglDisplay, mGlConfig, 1150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi pbufferAttribs); 1160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 1180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_NE(EGL_NO_SURFACE, mEglSurface); 1190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglContext = eglCreateContext(mEglDisplay, mGlConfig, EGL_NO_CONTEXT, 1210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi getContextAttribs()); 1220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 1230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_NE(EGL_NO_CONTEXT, mEglContext); 1240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 1260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglContext)); 1270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 1280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint w, h; 1300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &w)); 1310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 1320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &h)); 1330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 1340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi RecordProperty("EglSurfaceWidth", w); 1350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi RecordProperty("EglSurfaceHeight", h); 1360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glViewport(0, 0, w, h); 1380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 1390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual void TearDown() { 1420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // Display the result 1430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mDisplaySecs > 0 && mEglSurface != EGL_NO_SURFACE) { 1440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglSwapBuffers(mEglDisplay, mEglSurface); 1450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sleep(mDisplaySecs); 1460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mComposerClient != NULL) { 1490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mComposerClient->dispose(); 1500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mEglContext != EGL_NO_CONTEXT) { 1520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglDestroyContext(mEglDisplay, mEglContext); 1530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mEglSurface != EGL_NO_SURFACE) { 1550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglDestroySurface(mEglDisplay, mEglSurface); 1560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (mEglDisplay != EGL_NO_DISPLAY) { 1580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, 1590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_NO_CONTEXT); 1600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglTerminate(mEglDisplay); 1610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 1630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual EGLint const* getConfigAttribs() { 1660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("GLTest getConfigAttribs"); 1670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi static EGLint sDefaultConfigAttribs[] = { 1680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 1690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 1700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_RED_SIZE, 8, 1710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_GREEN_SIZE, 8, 1720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_BLUE_SIZE, 8, 1730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_ALPHA_SIZE, 8, 1740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_DEPTH_SIZE, 16, 1750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_STENCIL_SIZE, 8, 1760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_NONE }; 1770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return sDefaultConfigAttribs; 1790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual EGLint const* getContextAttribs() { 1820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi static EGLint sDefaultContextAttribs[] = { 1830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_CONTEXT_CLIENT_VERSION, 2, 1840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_NONE }; 1850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return sDefaultContextAttribs; 1870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual EGLint getSurfaceWidth() { 1900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return 512; 1910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual EGLint getSurfaceHeight() { 1940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return 512; 1950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 1960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi void loadShader(GLenum shaderType, const char* pSource, GLuint* outShader) { 1980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLuint shader = glCreateShader(shaderType); 1990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (shader) { 2010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glShaderSource(shader, 1, &pSource, NULL); 2020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glCompileShader(shader); 2040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLint compiled = 0; 2060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 2070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (!compiled) { 2090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLint infoLen = 0; 2100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); 2110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (infoLen) { 2130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi char* buf = (char*) malloc(infoLen); 2140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (buf) { 2150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetShaderInfoLog(shader, infoLen, NULL, buf); 2160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi printf("Shader compile log:\n%s\n", buf); 2170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi free(buf); 2180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi FAIL(); 2190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } else { 2210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi char* buf = (char*) malloc(0x1000); 2220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (buf) { 2230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetShaderInfoLog(shader, 0x1000, NULL, buf); 2240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi printf("Shader compile log:\n%s\n", buf); 2250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi free(buf); 2260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi FAIL(); 2270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glDeleteShader(shader); 2300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi shader = 0; 2310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_TRUE(shader != 0); 2340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi *outShader = shader; 2350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 2370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi void createProgram(const char* pVertexSource, const char* pFragmentSource, 2380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLuint* outPgm) { 2390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLuint vertexShader, fragmentShader; 2400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi { 2410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi SCOPED_TRACE("compiling vertex shader"); 2420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi loadShader(GL_VERTEX_SHADER, pVertexSource, &vertexShader); 2430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (HasFatalFailure()) { 2440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return; 2450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi { 2480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi SCOPED_TRACE("compiling fragment shader"); 2490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi loadShader(GL_FRAGMENT_SHADER, pFragmentSource, &fragmentShader); 2500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (HasFatalFailure()) { 2510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return; 2520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 2550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLuint program = glCreateProgram(); 2560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (program) { 2580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glAttachShader(program, vertexShader); 2590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glAttachShader(program, fragmentShader); 2610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 2620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glLinkProgram(program); 2630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLint linkStatus = GL_FALSE; 2640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); 2650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (linkStatus != GL_TRUE) { 2660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLint bufLength = 0; 2670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); 2680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (bufLength) { 2690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi char* buf = (char*) malloc(bufLength); 2700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (buf) { 2710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glGetProgramInfoLog(program, bufLength, NULL, buf); 2720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi printf("Program link log:\n%s\n", buf); 2730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi free(buf); 2740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi FAIL(); 2750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glDeleteProgram(program); 2780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi program = 0; 2790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glDeleteShader(vertexShader); 2820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glDeleteShader(fragmentShader); 2830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_TRUE(program != 0); 2840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi *outPgm = program; 2850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi static int abs(int value) { 2880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return value > 0 ? value : -value; 2890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 2900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 2910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ::testing::AssertionResult checkPixel(int x, int y, int r, 2920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int g, int b, int a, int tolerance=2) { 2930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLubyte pixel[4]; 2940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi String8 msg; 2950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel); 2960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLenum err = glGetError(); 2970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (err != GL_NO_ERROR) { 2980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += String8::format("error reading pixel: %#x", err); 2990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi while ((err = glGetError()) != GL_NO_ERROR) { 3000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += String8::format(", %#x", err); 3010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi fprintf(stderr, "pixel check failure: %s\n", msg.string()); 3030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return ::testing::AssertionFailure( 3040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ::testing::Message(msg.string())); 3050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (r >= 0 && abs(r - int(pixel[0])) > tolerance) { 3070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += String8::format("r(%d isn't %d)", pixel[0], r); 3080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (g >= 0 && abs(g - int(pixel[1])) > tolerance) { 3100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (!msg.isEmpty()) { 3110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += " "; 3120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += String8::format("g(%d isn't %d)", pixel[1], g); 3140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (b >= 0 && abs(b - int(pixel[2])) > tolerance) { 3160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (!msg.isEmpty()) { 3170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += " "; 3180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += String8::format("b(%d isn't %d)", pixel[2], b); 3200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (a >= 0 && abs(a - int(pixel[3])) > tolerance) { 3220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (!msg.isEmpty()) { 3230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += " "; 3240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi msg += String8::format("a(%d isn't %d)", pixel[3], a); 3260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (!msg.isEmpty()) { 3280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi fprintf(stderr, "pixel check failure: %s\n", msg.string()); 3290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return ::testing::AssertionFailure( 3300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ::testing::Message(msg.string())); 3310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } else { 3320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return ::testing::AssertionSuccess(); 3330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int mDisplaySecs; 3370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<SurfaceComposerClient> mComposerClient; 3380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<SurfaceControl> mSurfaceControl; 3390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLDisplay mEglDisplay; 3410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLSurface mEglSurface; 3420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLContext mEglContext; 3430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLConfig mGlConfig; 3440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}; 3450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////// 3470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Class for the NON-GL tests 3480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////// 3491a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketiclass SurfaceMediaSourceTest : public ::testing::Test { 3503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketipublic: 3513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi SurfaceMediaSourceTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { } 3533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi void oneBufferPass(int width, int height ); 3540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi void oneBufferPassNoFill(int width, int height ); 3553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi static void fillYV12Buffer(uint8_t* buf, int w, int h, int stride) ; 3563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi static void fillYV12BufferRect(uint8_t* buf, int w, int h, 3573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int stride, const android_native_rect_t& rect) ; 3583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiprotected: 3593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi virtual void SetUp() { 361b6f2fced47866a5d095b2b18d2e28d7c4321e3a6James Dong android::ProcessState::self()->startThreadPool(); 3621a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); 3631a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS->setSynchronousMode(true); 3641a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSTC = new SurfaceTextureClient(mSMS); 3653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW = mSTC; 3660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 3673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual void TearDown() { 3690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSMS.clear(); 3700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSTC.clear(); 3710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mANW.clear(); 3723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi const int mYuvTexWidth; 3750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi const int mYuvTexHeight; 3760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<SurfaceMediaSource> mSMS; 3780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<SurfaceTextureClient> mSTC; 3790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<ANativeWindow> mANW; 3800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi}; 3810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////// 3830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Class for the GL tests 3840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/////////////////////////////////////////////////////////////////////// 3850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiclass SurfaceMediaSourceGLTest : public GLTest { 3860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketipublic: 3870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi SurfaceMediaSourceGLTest( ): mYuvTexWidth(176), mYuvTexHeight(144) { } 3890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual EGLint const* getConfigAttribs(); 3900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi void oneBufferPassGL(int num = 0); 3910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi static sp<MediaRecorder> setUpMediaRecorder(int fileDescriptor, int videoSource, 3920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int outputFormat, int videoEncoder, int width, int height, int fps); 3930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiprotected: 3940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 3950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi virtual void SetUp() { 3960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("SMS-GLTest::SetUp()"); 3970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi android::ProcessState::self()->startThreadPool(); 3980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); 3990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSTC = new SurfaceTextureClient(mSMS); 4000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mANW = mSTC; 4010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // Doing the setup related to the GL Side 4030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLTest::SetUp(); 4040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 4053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 4063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi virtual void TearDown() { 4071a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS.clear(); 4083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSTC.clear(); 4093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW.clear(); 4100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi GLTest::TearDown(); 4110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglDestroySurface(mEglDisplay, mSmsEglSurface); 4123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 4133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 4140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi void setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr); 4150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 416a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi const int mYuvTexWidth; 417a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi const int mYuvTexHeight; 4183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 4191a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi sp<SurfaceMediaSource> mSMS; 4203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<SurfaceTextureClient> mSTC; 4213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<ANativeWindow> mANW; 4220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLConfig mSMSGlConfig; 4230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLSurface mSmsEglSurface; 4243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 4253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 4260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////// 4270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Methods in SurfaceMediaSourceGLTest 4280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////// 4290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiEGLint const* SurfaceMediaSourceGLTest::getConfigAttribs() { 4300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("SurfaceMediaSourceGLTest getConfigAttribs"); 4310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi static EGLint sDefaultConfigAttribs[] = { 4320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 4330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 4340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_RED_SIZE, 8, 4350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_GREEN_SIZE, 8, 4360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_BLUE_SIZE, 8, 4370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_RECORDABLE_ANDROID, EGL_TRUE, 4380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGL_NONE }; 4390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi return sDefaultConfigAttribs; 4410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 4420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// One pass of dequeuing and queuing a GLBuffer 4440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketivoid SurfaceMediaSourceGLTest::oneBufferPassGL(int num) { 4450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int d = num % 50; 4460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi float f = 0.2f; // 0.1f * d; 4470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(0, 0.3, 0, 0.6); 4490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 4500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glEnable(GL_SCISSOR_TEST); 4520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glScissor(4 + d, 4 + d, 4, 4); 4530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(1.0 - f, f, f, 1.0); 4540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 4550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glScissor(24 + d, 48 + d, 4, 4); 4570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(f, 1.0 - f, f, 1.0); 4580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 4590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glScissor(37 + d, 17 + d, 4, 4); 4610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(f, f, 1.0 - f, 1.0); 4620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 4630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // The following call dequeues and queues the buffer 4650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi eglSwapBuffers(mEglDisplay, mSmsEglSurface); 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(); 4800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Starting MediaRecorder..."); 4810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi CHECK_EQ(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) { 4870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<ISurfaceTexture> iST = mr->querySurfaceMediaSourceFromMediaServer(); 4880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSTC = new SurfaceTextureClient(iST); 4890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mANW = mSTC; 4900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint numConfigs = 0; 4920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mSMSGlConfig, 4930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1, &numConfigs)); 4940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 4950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Native Window = %p, mSTC = %p", mANW.get(), mSTC.get()); 4970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 4980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSmsEglSurface = eglCreateWindowSurface(mEglDisplay, mSMSGlConfig, 4990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mANW.get(), NULL); 5000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 5010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_NE(EGL_NO_SURFACE, mSmsEglSurface) ; 5020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 5030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mSmsEglSurface, mSmsEglSurface, 5040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mEglContext)); 5050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 5060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 5070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 5080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 5090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////// 5100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Methods in SurfaceMediaSourceTest 5110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi///////////////////////////////////////////////////////////////////// 5120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 5130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// One pass of dequeuing and queuing the buffer. Fill it in with 5140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// cpu YV12 buffer 5151a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPass(int width, int height ) { 5163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 5173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 5183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_TRUE(anb != NULL); 5193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 5213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer())); 5223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Fill the buffer with the a checkerboard pattern 5243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi uint8_t* img = NULL; 5253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 5261a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SurfaceMediaSourceTest::fillYV12Buffer(img, width, height, buf->getStride()); 5273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf->unlock(); 5283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer())); 5303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 5313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dequeuing and queuing the buffer without really filling it in. 5330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPassNoFill(int width, int height ) { 5340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ANativeWindowBuffer* anb; 5350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 5360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_TRUE(anb != NULL); 5373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 5390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer())); 5400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // We do not fill the buffer in. Just queue it back. 5410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer())); 5423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 5433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern 5451a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) { 5463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int blockWidth = w > 16 ? w / 16 : 1; 5473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int blockHeight = h > 16 ? h / 16 : 1; 5483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int yuvTexOffsetY = 0; 5493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideY = stride; 5503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 5513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 5523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 5533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideU = yuvTexStrideV; 5543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int x = 0; x < w; x++) { 5553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int y = 0; y < h; y++) { 5563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int parityX = (x / blockWidth) & 1; 5573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int parityY = (y / blockHeight) & 1; 5583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi unsigned char intensity = (parityX ^ parityY) ? 63 : 191; 5593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 5603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x < w / 2 && y < h / 2) { 5613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity; 5623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x * 2 < w / 2 && y * 2 < h / 2) { 5633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] = 5643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] = 5653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] = 5663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] = 5673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi intensity; 5683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 5733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it. 5751a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12BufferRect(uint8_t* buf, int w, 5763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int h, int stride, const android_native_rect_t& rect) { 5773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int yuvTexOffsetY = 0; 5783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideY = stride; 5793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 5803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 5813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 5823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideU = yuvTexStrideV; 5833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int x = 0; x < w; x++) { 5843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int y = 0; y < h; y++) { 5853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool inside = rect.left <= x && x < rect.right && 5863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi rect.top <= y && y < rect.bottom; 5873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64; 5883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x < w / 2 && y < h / 2) { 5893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool inside = rect.left <= 2*x && 2*x < rect.right && 5903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi rect.top <= 2*y && 2*y < rect.bottom; 5913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16; 5923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] = 5933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi inside ? 16 : 255; 5943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 5971a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi} ///////// End of class SurfaceMediaSourceTest 5983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 5993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/////////////////////////////////////////////////////////////////// 6003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Class to imitate the recording ///////////////////////////// 6013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// //////////////////////////////////////////////////////////////// 6023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketistruct SimpleDummyRecorder { 6033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MediaSource> mSource; 6043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SimpleDummyRecorder 6063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi (const sp<MediaSource> &source): mSource(source) {} 6073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t start() { return mSource->start();} 6093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t stop() { return mSource->stop();} 6103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // fakes reading from a media source 6123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t readFromSource() { 6133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi MediaBuffer *buffer; 6143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t err = mSource->read(&buffer); 6153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (err != OK) { 6163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return err; 6173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 6183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer->release(); 6193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer = NULL; 6203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return OK; 6213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 6223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 6233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/////////////////////////////////////////////////////////////////// 6243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// TESTS 6250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// SurfaceMediaSourceTest class contains tests that fill the buffers 6260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// using the cpu calls 6270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// SurfaceMediaSourceGLTest class contains tests that fill the buffers 6280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// using the GL calls. 6290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// TODO: None of the tests actually verify the encoded images.. so at this point, 6300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// these are mostly functionality tests + visual inspection 6310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi////////////////////////////////////////////////////////////////////// 6320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 6331a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource 6340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder 6350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketistatic int testId = 1; 6360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotOneBufferPass) { 6370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 6383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing OneBufferPass ******************************"); 6393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(), 6410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi HAL_PIXEL_FORMAT_YV12)); 6423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 6433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 6443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted 6460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder 6470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) { 6480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 6493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing Wrong size BufferPass ******************************"); 6503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // setting the client side buffer size different than the server size 6520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_dimensions(mANW.get(), 6530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 10, 10)); 6540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(), 6550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi HAL_PIXEL_FORMAT_YV12)); 6563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 6583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // Note: make sure we get an ERROR back when dequeuing! 6603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 6613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 6623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6631a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 6640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder 6650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 6660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 6673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder *********************"); 6680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(), 6690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi HAL_PIXEL_FORMAT_YV12)); 670a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 6711a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SimpleDummyRecorder writer(mSMS); 6723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 6733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 6753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount < 300) { 6763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 6773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 6793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 6813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 6823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 6833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 6843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6851a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource 6860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Dummy Encoder 6870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyLagEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 6880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 6893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************"); 690a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 6910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(), 6920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi HAL_PIXEL_FORMAT_YV12)); 693a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 6941a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SimpleDummyRecorder writer(mSMS); 6953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 6963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 6973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 1; 6981a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi const int FRAMES_LAG = mSMS->getBufferCount() - 1; 6993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 7003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 7013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Forcing the writer to lag behind a few frames 7023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (nFramesCount > FRAMES_LAG) { 7033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 7043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 7053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 7063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 7073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 7083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 7093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 7101a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 7113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer 7120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_DummyThreadedEncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 7130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 7143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********"); 7150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(), 7160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi HAL_PIXEL_FORMAT_YV12)); 7173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 7181a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi DummyRecorder writer(mSMS); 7193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 7203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 7213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 7223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 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) { 7370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 7380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("************** Testing the whole pipeline with actual MediaRecorder ***********"); 7390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("************** 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) { 7440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGE("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 7540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<ISurfaceTexture> iST = mr->querySurfaceMediaSourceFromMediaServer(); 7550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSTC = new SurfaceTextureClient(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++; 7650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("framesCount = %d", nFramesCount); 7663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 7673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 7680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU)); 7690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Stopping MediaRecorder..."); 7700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi CHECK_EQ(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 7810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWrite) { 7820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 7830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test to verify creating a surface w/ right config *********"); 7840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 7850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); 7860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSTC = new SurfaceTextureClient(mSMS); 7870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mANW = mSTC; 7880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 7890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi DummyRecorder writer(mSMS); 7900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi writer.start(); 7910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 7920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EGLint numConfigs = 0; 7930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mSMSGlConfig, 7940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 1, &numConfigs)); 7950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 7960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 7970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mSmsEglSurface = eglCreateWindowSurface(mEglDisplay, mSMSGlConfig, 7980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mANW.get(), NULL); 7990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(EGL_SUCCESS, eglGetError()); 8000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_NE(EGL_NO_SURFACE, mSmsEglSurface) ; 8010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mSmsEglSurface, mSmsEglSurface, 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++; 8100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("framesCount = %d", nFramesCount); 8110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 8120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL)); 8140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi writer.stop(); 8150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 8160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine whether we can render GL buffers in to the surface 8170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// created with the native window handle 8180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, RenderingToRecordableEGLSurfaceWorks) { 8190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 8200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("RenderingToRecordableEGLSurfaceWorks *********************"); 8210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // Do the producer side of things 8220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(0.6, 0.6, 0.6, 0.6); 8230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 8240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glEnable(GL_SCISSOR_TEST); 8260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glScissor(4, 4, 4, 4); 8270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(1.0, 0.0, 0.0, 1.0); 8280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 8290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glScissor(24, 48, 4, 4); 8310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(0.0, 1.0, 0.0, 1.0); 8320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 8330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glScissor(37, 17, 4, 4); 8350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClearColor(0.0, 0.0, 1.0, 1.0); 8360c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi glClear(GL_COLOR_BUFFER_BIT); 8370c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8380c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153)); 8390c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153)); 8400c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153)); 8410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153)); 8420c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8430c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 4, 7, 255, 0, 0, 255)); 8440c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(25, 51, 0, 255, 0, 255)); 8450c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(40, 19, 0, 0, 255, 255)); 8460c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153)); 8470c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153)); 8480c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(13, 8, 153, 153, 153, 153)); 8490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(46, 3, 153, 153, 153, 153)); 8500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153)); 8510c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153)); 8520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153)); 8530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153)); 8540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153)); 8550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153)); 8560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153)); 8570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153)); 8580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153)); 8590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 8600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine the actual encoding with GL buffers 8620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource 8630c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// The same pattern is rendered every frame 8640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaSameImageEachBufNpotWrite) { 8650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 8660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("************** Testing the whole pipeline with actual Recorder ***********"); 8670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("************** GL Filling the buffers ***********"); 8680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // Note: No need to set the colorformat for the buffers. The colorformat is 8690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // in the GRAlloc buffers itself. 8700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi const char *fileName = "/sdcard/outputSurfEncMSourceGL.mp4"; 8720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int fd = open(fileName, O_RDWR | O_CREAT, 0744); 8730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (fd < 0) { 8740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd); 8750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 8760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi CHECK(fd >= 0); 8770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER, 8790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30); 8800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // get the reference to the surfacemediasource living in 8820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // mediaserver that is created by stagefrightrecorder 8830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi setUpEGLSurfaceFromMediaRecorder(mr); 8840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int32_t nFramesCount = 0; 8860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi while (nFramesCount <= 300) { 8870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi oneBufferPassGL(); 8880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi nFramesCount++; 8890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("framesCount = %d", nFramesCount); 8900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 8910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL)); 8930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Stopping MediaRecorder..."); 8940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi CHECK_EQ(OK, mr->stop()); 8950c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mr.clear(); 8960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi close(fd); 8970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 8980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 8990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Test to examine the actual encoding from the GL Buffers 9000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// Actual encoder, Actual GL Buffers Filled SurfaceMediaSource 9010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi// A different pattern is rendered every frame 9020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag SanketiTEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaDiffImageEachBufNpotWrite) { 9030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Test # %d", testId++); 9040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("************** Testing the whole pipeline with actual Recorder ***********"); 9050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("************** Diff GL Filling the buffers ***********"); 9060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // Note: No need to set the colorformat for the buffers. The colorformat is 9070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // in the GRAlloc buffers itself. 9080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 9090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi const char *fileName = "/sdcard/outputSurfEncMSourceGLDiff.mp4"; 9100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int fd = open(fileName, O_RDWR | O_CREAT, 0744); 9110c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi if (fd < 0) { 9120c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd); 9130c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 9140c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi CHECK(fd >= 0); 9150c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 9160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi sp<MediaRecorder> mr = setUpMediaRecorder(fd, VIDEO_SOURCE_GRALLOC_BUFFER, 9170c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi OUTPUT_FORMAT_MPEG_4, VIDEO_ENCODER_H264, mYuvTexWidth, mYuvTexHeight, 30); 9180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 9190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // get the reference to the surfacemediasource living in 9200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi // mediaserver that is created by stagefrightrecorder 9210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi setUpEGLSurfaceFromMediaRecorder(mr); 9220c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 9230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int32_t nFramesCount = 0; 9240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi while (nFramesCount <= 300) { 9250c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi oneBufferPassGL(nFramesCount); 9260c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi nFramesCount++; 9270c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("framesCount = %d", nFramesCount); 9280c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 9290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 9300c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL)); 9310c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi LOGV("Stopping MediaRecorder..."); 9320c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi CHECK_EQ(OK, mr->stop()); 9330c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mr.clear(); 9340c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi close(fd); 9350c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 9363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} // namespace android 937