SurfaceMediaSource_test.cpp revision 3399b7267185646c69b04352211fca4fad9d7547
13399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/* 23399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Copyright (C) 2011 The Android Open Source Project 33399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * 43399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Licensed under the Apache License, Version 2.0 (the "License"); 53399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * you may not use this file except in compliance with the License. 63399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * You may obtain a copy of the License at 73399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * 83399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * http://www.apache.org/licenses/LICENSE-2.0 93399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * 103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Unless required by applicable law or agreed to in writing, software 113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * distributed under the License is distributed on an "AS IS" BASIS, 123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * See the License for the specific language governing permissions and 143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * limitations under the License. 153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi */ 163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#define LOG_TAG "SurfaceEncoder_test" 183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// #define LOG_NDEBUG 0 193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <gtest/gtest.h> 213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/String8.h> 223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/Errors.h> 233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/SurfaceEncoder.h> 253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <gui/SurfaceTextureClient.h> 273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <ui/GraphicBuffer.h> 283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <surfaceflinger/ISurfaceComposer.h> 293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <surfaceflinger/Surface.h> 303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <surfaceflinger/SurfaceComposerClient.h> 313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <binder/ProcessState.h> 333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <ui/FramebufferNativeWindow.h> 343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MediaDebug.h> 363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MediaDefs.h> 373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MetaData.h> 383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MPEG4Writer.h> 393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/OMXClient.h> 403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/OMXCodec.h> 413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <OMX_Component.h> 423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include "DummyRecorder.h" 443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketinamespace android { 463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiclass SurfaceEncoderTest : public ::testing::Test { 493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketipublic: 503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SurfaceEncoderTest( ): mYuvTexWidth(64), mYuvTexHeight(66) { } 523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MPEG4Writer> setUpWriter(OMXClient &client ); 533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi void oneBufferPass(int width, int height ); 543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi static void fillYV12Buffer(uint8_t* buf, int w, int h, int stride) ; 553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi static void fillYV12BufferRect(uint8_t* buf, int w, int h, 563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int stride, const android_native_rect_t& rect) ; 573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiprotected: 583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi virtual void SetUp() { 603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSE = new SurfaceEncoder(mYuvTexWidth, mYuvTexHeight); 613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSE->setSynchronousMode(true); 623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSTC = new SurfaceTextureClient(mSE); 633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW = mSTC; 643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi virtual void TearDown() { 693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSE.clear(); 703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSTC.clear(); 713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW.clear(); 723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int mYuvTexWidth;// = 64; 753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int mYuvTexHeight;// = 66; 763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<SurfaceEncoder> mSE; 783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<SurfaceTextureClient> mSTC; 793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<ANativeWindow> mANW; 803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketivoid SurfaceEncoderTest::oneBufferPass(int width, int height ) { 843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("One Buffer Pass"); 853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_TRUE(anb != NULL); 883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer())); 913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Fill the buffer with the a checkerboard pattern 933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi uint8_t* img = NULL; 943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SurfaceEncoderTest::fillYV12Buffer(img, width, height, buf->getStride()); 963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf->unlock(); 973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer())); 993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketisp<MPEG4Writer> SurfaceEncoderTest::setUpWriter(OMXClient &client ) { 1023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Writing to a file 1033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const char *fileName = "/sdcard/outputSurfEnc.mp4"; 1043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MetaData> enc_meta = new MetaData; 1053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyBitRate, 300000); 1063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyFrameRate, 30); 1073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 1093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MetaData> meta = mSE->getFormat(); 1113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t width, height, stride, sliceHeight, colorFormat; 1133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyWidth, &width)); 1143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyHeight, &height)); 1153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyStride, &stride)); 1163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeySliceHeight, &sliceHeight)); 1173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyWidth, width); 1203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyHeight, height); 1213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyIFramesInterval, 1); 1223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyStride, stride); 1233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeySliceHeight, sliceHeight); 1243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // TODO: overwriting the colorformat since the format set by GRAlloc 1253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // could be wrong or not be read by OMX 1263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420Planar); 1273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // colorFormat); 1283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MediaSource> encoder = 1313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi OMXCodec::Create( 1323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi client.interface(), enc_meta, true /* createEncoder */, mSE); 1333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MPEG4Writer> writer = new MPEG4Writer(fileName); 1353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer->addSource(encoder); 1363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return writer; 1383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern 1413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketivoid SurfaceEncoderTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) { 1423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int blockWidth = w > 16 ? w / 16 : 1; 1433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int blockHeight = h > 16 ? h / 16 : 1; 1443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int yuvTexOffsetY = 0; 1453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideY = stride; 1463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 1473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 1483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 1493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideU = yuvTexStrideV; 1503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int x = 0; x < w; x++) { 1513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int y = 0; y < h; y++) { 1523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int parityX = (x / blockWidth) & 1; 1533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int parityY = (y / blockHeight) & 1; 1543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi unsigned char intensity = (parityX ^ parityY) ? 63 : 191; 1553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 1563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x < w / 2 && y < h / 2) { 1573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity; 1583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x * 2 < w / 2 && y * 2 < h / 2) { 1593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] = 1603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] = 1613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] = 1623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] = 1633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi intensity; 1643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it. 1713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketivoid SurfaceEncoderTest::fillYV12BufferRect(uint8_t* buf, int w, 1723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int h, int stride, const android_native_rect_t& rect) { 1733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int yuvTexOffsetY = 0; 1743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideY = stride; 1753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 1763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 1773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 1783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideU = yuvTexStrideV; 1793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int x = 0; x < w; x++) { 1803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int y = 0; y < h; y++) { 1813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool inside = rect.left <= x && x < rect.right && 1823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi rect.top <= y && y < rect.bottom; 1833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64; 1843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x < w / 2 && y < h / 2) { 1853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool inside = rect.left <= 2*x && 2*x < rect.right && 1863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi rect.top <= 2*y && 2*y < rect.bottom; 1873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16; 1883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] = 1893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi inside ? 16 : 255; 1903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} ///////// End of class SurfaceEncoderTest 1943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/////////////////////////////////////////////////////////////////// 1963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Class to imitate the recording ///////////////////////////// 1973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// //////////////////////////////////////////////////////////////// 1983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketistruct SimpleDummyRecorder { 1993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MediaSource> mSource; 2003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SimpleDummyRecorder 2023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi (const sp<MediaSource> &source): mSource(source) {} 2033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t start() { return mSource->start();} 2053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t stop() { return mSource->stop();} 2063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // fakes reading from a media source 2083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t readFromSource() { 2093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi MediaBuffer *buffer; 2103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t err = mSource->read(&buffer); 2113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (err != OK) { 2123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return err; 2133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer->release(); 2153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer = NULL; 2163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return OK; 2173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 2193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/////////////////////////////////////////////////////////////////// 2213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// TESTS 2223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceEncoder 2233399b7267185646c69b04352211fca4fad9d7547Pannag SanketiTEST_F(SurfaceEncoderTest, EncodingFromCpuFilledYV12BufferNpotOneBufferPass) { 2243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing OneBufferPass ******************************"); 2253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // OMX_COLOR_FormatYUV420Planar)); // )); 2293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted 2363399b7267185646c69b04352211fca4fad9d7547Pannag SanketiTEST_F(SurfaceEncoderTest, EncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) { 2373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing Wrong size BufferPass ******************************"); 2383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // setting the client side buffer size different than the server size 2403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 10, 10, HAL_PIXEL_FORMAT_YV12)); 2423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // OMX_COLOR_FormatYUV420Planar)); // )); 2433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 2473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // make sure we get an error back when dequeuing! 2493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 2503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// pass multiple buffers from the native_window the SurfaceEncoder 2543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 2553399b7267185646c69b04352211fca4fad9d7547Pannag SanketiTEST_F(SurfaceEncoderTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 2563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder *********************"); 2573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SimpleDummyRecorder writer(mSE); 2633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 2643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 2663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount < 300) { 2673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 2703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 2723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 2743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceEncoder 2773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 2783399b7267185646c69b04352211fca4fad9d7547Pannag SanketiTEST_F(SurfaceEncoderTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassLag) { 2793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************"); 2803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SimpleDummyRecorder writer(mSE); 2863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 2873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 1; 2893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int FRAMES_LAG = mSE->getBufferCount() - 1; 2903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 2913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Forcing the writer to lag behind a few frames 2933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (nFramesCount > FRAMES_LAG) { 2943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 2953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 2973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 2993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// pass multiple buffers from the native_window the SurfaceEncoder 3023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer 3033399b7267185646c69b04352211fca4fad9d7547Pannag SanketiTEST_F(SurfaceEncoderTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassThreaded) { 3043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********"); 3053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 3063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 3073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 3083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 3093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi DummyRecorder writer(mSE); 3113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 3123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 3143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 3153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 3163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 3183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 3203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Test to examine the actual encoding. Temporarily disabled till the 3233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// colorformat and encoding from GRAlloc data is resolved 3243399b7267185646c69b04352211fca4fad9d7547Pannag SanketiTEST_F(SurfaceEncoderTest, DISABLED_EncodingFromCpuFilledYV12BufferNpotWrite) { 3253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing the whole pipeline with actual Recorder"); 3263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 3273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); // OMX_COLOR_FormatYUV420Planar)); // )); 3283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 3293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 3303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi OMXClient client; 3323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, client.connect()); 3333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MPEG4Writer> writer = setUpWriter(client); 3353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int64_t start = systemTime(); 3363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, writer->start()); 3373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 3393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 3403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 3413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 3423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, writer->stop()); 3453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.clear(); 3463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int64_t end = systemTime(); 3473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi client.disconnect(); 3483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} // namespace android 352