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