SurfaceMediaSource_test.cpp revision a361483bb5dbd3bbf132c5b99b2df7d197c3fc50
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 171a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi#define LOG_TAG "SurfaceMediaSource_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 241a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi#include <media/stagefright/SurfaceMediaSource.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 481a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketiclass SurfaceMediaSourceTest : public ::testing::Test { 493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketipublic: 503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 511a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SurfaceMediaSourceTest( ): 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() { 601a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); 611a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS->setSynchronousMode(true); 621a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSTC = new SurfaceTextureClient(mSMS); 633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW = mSTC; 643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi virtual void TearDown() { 691a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS.clear(); 703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSTC.clear(); 713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW.clear(); 723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 74a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi const int mYuvTexWidth; 75a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi const int mYuvTexHeight; 763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 771a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi sp<SurfaceMediaSource> mSMS; 783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<SurfaceTextureClient> mSTC; 793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<ANativeWindow> mANW; 803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 831a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::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)); 951a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SurfaceMediaSourceTest::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 1011a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketisp<MPEG4Writer> SurfaceMediaSourceTest::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 1101a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi sp<MetaData> meta = mSMS->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 1283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MediaSource> encoder = 1303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi OMXCodec::Create( 1311a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi client.interface(), enc_meta, true /* createEncoder */, mSMS); 1323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MPEG4Writer> writer = new MPEG4Writer(fileName); 1343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer->addSource(encoder); 1353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return writer; 1373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern 1401a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) { 1413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int blockWidth = w > 16 ? w / 16 : 1; 1423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int blockHeight = h > 16 ? h / 16 : 1; 1433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int yuvTexOffsetY = 0; 1443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideY = stride; 1453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 1463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 1473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 1483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideU = yuvTexStrideV; 1493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int x = 0; x < w; x++) { 1503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int y = 0; y < h; y++) { 1513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int parityX = (x / blockWidth) & 1; 1523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int parityY = (y / blockHeight) & 1; 1533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi unsigned char intensity = (parityX ^ parityY) ? 63 : 191; 1543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 1553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x < w / 2 && y < h / 2) { 1563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity; 1573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x * 2 < w / 2 && y * 2 < h / 2) { 1583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] = 1593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] = 1603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] = 1613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] = 1623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi intensity; 1633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it. 1701a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12BufferRect(uint8_t* buf, int w, 1713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int h, int stride, const android_native_rect_t& rect) { 1723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const int yuvTexOffsetY = 0; 1733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideY = stride; 1743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 1753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 1763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 1773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int yuvTexStrideU = yuvTexStrideV; 1783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int x = 0; x < w; x++) { 1793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi for (int y = 0; y < h; y++) { 1803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool inside = rect.left <= x && x < rect.right && 1813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi rect.top <= y && y < rect.bottom; 1823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64; 1833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (x < w / 2 && y < h / 2) { 1843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool inside = rect.left <= 2*x && 2*x < rect.right && 1853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi rect.top <= 2*y && 2*y < rect.bottom; 1863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16; 1873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] = 1883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi inside ? 16 : 255; 1893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 1921a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi} ///////// End of class SurfaceMediaSourceTest 1933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/////////////////////////////////////////////////////////////////// 1953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Class to imitate the recording ///////////////////////////// 1963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// //////////////////////////////////////////////////////////////// 1973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketistruct SimpleDummyRecorder { 1983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MediaSource> mSource; 1993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi SimpleDummyRecorder 2013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi (const sp<MediaSource> &source): mSource(source) {} 2023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t start() { return mSource->start();} 2043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t stop() { return mSource->stop();} 2053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // fakes reading from a media source 2073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t readFromSource() { 2083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi MediaBuffer *buffer; 2093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi status_t err = mSource->read(&buffer); 2103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (err != OK) { 2113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return err; 2123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer->release(); 2143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer = NULL; 2153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return OK; 2163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 2183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/////////////////////////////////////////////////////////////////// 2203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// TESTS 2211a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource 2221a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotOneBufferPass) { 2233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing OneBufferPass ******************************"); 2243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted 2341a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) { 2353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing Wrong size BufferPass ******************************"); 2363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // setting the client side buffer size different than the server size 2383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 10, 10, HAL_PIXEL_FORMAT_YV12)); 2403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 2443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // make sure we get an error back when dequeuing! 2463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 2473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2501a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 2513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 2521a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 2533399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder *********************"); 2543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 258a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 2591a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SimpleDummyRecorder writer(mSMS); 2603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 2613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 2633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount < 300) { 2643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 2673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 2693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 2713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2731a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource 2743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 2751a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassLag) { 2763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************"); 277a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 2783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 282a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 2831a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SimpleDummyRecorder writer(mSMS); 2843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 2853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 1; 2871a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi const int FRAMES_LAG = mSMS->getBufferCount() - 1; 2883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 2893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Forcing the writer to lag behind a few frames 2913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (nFramesCount > FRAMES_LAG) { 2923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 2933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 2953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 2973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2991a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 3003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer 3011a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassThreaded) { 3023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********"); 3033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 3043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 3053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 3063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 3073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3081a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi DummyRecorder writer(mSMS); 3093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 3103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 3123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 3133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 3143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 3163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 3183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Test to examine the actual encoding. Temporarily disabled till the 3213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// colorformat and encoding from GRAlloc data is resolved 3221a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuFilledYV12BufferNpotWrite) { 3233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing the whole pipeline with actual Recorder"); 3243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 325a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 3263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 3273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 3283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi OMXClient client; 3293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, client.connect()); 3303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MPEG4Writer> writer = setUpWriter(client); 3323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int64_t start = systemTime(); 3333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, writer->start()); 3343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 3363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 3373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 3383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 3393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, writer->stop()); 3423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.clear(); 3433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int64_t end = systemTime(); 3443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi client.disconnect(); 3453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} // namespace android 349