SurfaceMediaSource_test.cpp revision b6f2fced47866a5d095b2b18d2e28d7c4321e3a6
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() { 60b6f2fced47866a5d095b2b18d2e28d7c4321e3a6James Dong android::ProcessState::self()->startThreadPool(); 611a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); 621a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS->setSynchronousMode(true); 631a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSTC = new SurfaceTextureClient(mSMS); 643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW = mSTC; 653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi virtual void TearDown() { 701a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi mSMS.clear(); 713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mSTC.clear(); 723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mANW.clear(); 733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 75a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi const int mYuvTexWidth; 76a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi const int mYuvTexHeight; 773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 781a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi sp<SurfaceMediaSource> mSMS; 793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<SurfaceTextureClient> mSTC; 803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<ANativeWindow> mANW; 813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}; 833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 841a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPass(int width, int height ) { 853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("One Buffer Pass"); 863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 883399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_TRUE(anb != NULL); 893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer())); 923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Fill the buffer with the a checkerboard pattern 943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi uint8_t* img = NULL; 953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 961a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SurfaceMediaSourceTest::fillYV12Buffer(img, width, height, buf->getStride()); 973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buf->unlock(); 983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer())); 1003399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1021a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketisp<MPEG4Writer> SurfaceMediaSourceTest::setUpWriter(OMXClient &client ) { 1033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Writing to a file 1043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const char *fileName = "/sdcard/outputSurfEnc.mp4"; 1053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MetaData> enc_meta = new MetaData; 1063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyBitRate, 300000); 1073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyFrameRate, 30); 1083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1093399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 1103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1111a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi sp<MetaData> meta = mSMS->getFormat(); 1123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t width, height, stride, sliceHeight, colorFormat; 1143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyWidth, &width)); 1153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyHeight, &height)); 1163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyStride, &stride)); 1173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeySliceHeight, &sliceHeight)); 1183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyWidth, width); 1213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyHeight, height); 1223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyIFramesInterval, 1); 1233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyStride, stride); 1243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeySliceHeight, sliceHeight); 1253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // TODO: overwriting the colorformat since the format set by GRAlloc 1263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // could be wrong or not be read by OMX 1273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi enc_meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420Planar); 1283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MediaSource> encoder = 1313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi OMXCodec::Create( 1321a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi client.interface(), enc_meta, true /* createEncoder */, mSMS); 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 1411a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::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. 1711a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSourceTest::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 } 1931a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi} ///////// End of class SurfaceMediaSourceTest 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 2221a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource 2231a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, 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 ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted 2351a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) { 2363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing Wrong size BufferPass ******************************"); 2373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // setting the client side buffer size different than the server size 2393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 10, 10, HAL_PIXEL_FORMAT_YV12)); 2413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 2433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ANativeWindowBuffer* anb; 2453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // make sure we get an error back when dequeuing! 2473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 2483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2511a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 2523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 2531a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 2543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder *********************"); 2553399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 259a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 2601a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SimpleDummyRecorder writer(mSMS); 2613399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 2623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 2643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount < 300) { 2653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 2683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 2703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 2723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2741a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource 2753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 2761a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassLag) { 2773399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************"); 278a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 2793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 2803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 2813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 2823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 283a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 2841a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi SimpleDummyRecorder writer(mSMS); 2853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 2863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 1; 2881a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi const int FRAMES_LAG = mSMS->getBufferCount() - 1; 2893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 2903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 2913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // Forcing the writer to lag behind a few frames 2923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (nFramesCount > FRAMES_LAG) { 2933399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 2943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2953399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 2963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 2973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 2983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3001a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 3013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer 3021a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassThreaded) { 3033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********"); 3043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 3053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 3063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 3073399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 3083399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3091a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi DummyRecorder writer(mSMS); 3103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.start(); 3113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 3133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 3143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 3153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 3173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.stop(); 3193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Test to examine the actual encoding. Temporarily disabled till the 3223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// colorformat and encoding from GRAlloc data is resolved 3231a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuFilledYV12BufferNpotWrite) { 3243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi LOGV("Testing the whole pipeline with actual Recorder"); 3253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 326a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 3273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 3283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 3293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi OMXClient client; 3303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, client.connect()); 3313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MPEG4Writer> writer = setUpWriter(client); 3333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int64_t start = systemTime(); 3343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, writer->start()); 3353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int32_t nFramesCount = 0; 3373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi while (nFramesCount <= 300) { 3383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 3393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi nFramesCount++; 3403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi CHECK_EQ(OK, writer->stop()); 3433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi writer.clear(); 3443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi int64_t end = systemTime(); 3453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi client.disconnect(); 3463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} // namespace android 350