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