SurfaceMediaSource_test.cpp revision f48987db6711512173327bc6ec8d253ba914dab1
126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi/* 226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * Copyright (C) 2011 The Android Open Source Project 326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * 426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * Licensed under the Apache License, Version 2.0 (the "License"); 526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * you may not use this file except in compliance with the License. 626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * You may obtain a copy of the License at 726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * 826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * http://www.apache.org/licenses/LICENSE-2.0 926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * 1026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * Unless required by applicable law or agreed to in writing, software 1126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * distributed under the License is distributed on an "AS IS" BASIS, 1226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * See the License for the specific language governing permissions and 1426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi * limitations under the License. 1526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi */ 1626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 17f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi#define LOG_TAG "SurfaceMediaSource_test" 1826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// #define LOG_NDEBUG 0 1926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 2026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <gtest/gtest.h> 2126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <utils/String8.h> 2226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <utils/Errors.h> 2326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 24f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi#include <media/stagefright/SurfaceMediaSource.h> 2526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 2626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <gui/SurfaceTextureClient.h> 2726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <ui/GraphicBuffer.h> 2826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <surfaceflinger/ISurfaceComposer.h> 2926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <surfaceflinger/Surface.h> 3026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <surfaceflinger/SurfaceComposerClient.h> 3126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 3226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <binder/ProcessState.h> 3326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <ui/FramebufferNativeWindow.h> 3426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 3526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MediaDebug.h> 3626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MediaDefs.h> 3726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MetaData.h> 3826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/MPEG4Writer.h> 3926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/OMXClient.h> 4026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <media/stagefright/OMXCodec.h> 4126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include <OMX_Component.h> 4226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 4326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi#include "DummyRecorder.h" 4426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 4526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketinamespace android { 4626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 4726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 48f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketiclass SurfaceMediaSourceTest : public ::testing::Test { 4926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketipublic: 5026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 51f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi SurfaceMediaSourceTest( ): mYuvTexWidth(64), mYuvTexHeight(66) { } 5226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<MPEG4Writer> setUpWriter(OMXClient &client ); 5326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi void oneBufferPass(int width, int height ); 5426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi static void fillYV12Buffer(uint8_t* buf, int w, int h, int stride) ; 5526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi static void fillYV12BufferRect(uint8_t* buf, int w, int h, 5626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int stride, const android_native_rect_t& rect) ; 5726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketiprotected: 5826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 5926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi virtual void SetUp() { 60f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); 61f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi mSMS->setSynchronousMode(true); 62f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi mSTC = new SurfaceTextureClient(mSMS); 6326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi mANW = mSTC; 6426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 6526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 6626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 6726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 6826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi virtual void TearDown() { 69f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi mSMS.clear(); 7026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi mSTC.clear(); 7126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi mANW.clear(); 7226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 7326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 7426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const int mYuvTexWidth;// = 64; 7526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const int mYuvTexHeight;// = 66; 7626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 77f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi sp<SurfaceMediaSource> mSMS; 7826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<SurfaceTextureClient> mSTC; 7926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<ANativeWindow> mANW; 8026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 8126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}; 8226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 83f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::oneBufferPass(int width, int height ) { 8426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("One Buffer Pass"); 8526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ANativeWindowBuffer* anb; 8626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 8726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_TRUE(anb != NULL); 8826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 8926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 9026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, mANW->lockBuffer(mANW.get(), buf->getNativeBuffer())); 9126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 9226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // Fill the buffer with the a checkerboard pattern 9326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi uint8_t* img = NULL; 9426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 95f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi SurfaceMediaSourceTest::fillYV12Buffer(img, width, height, buf->getStride()); 9626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf->unlock(); 9726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 9826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer())); 9926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 10026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 101f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketisp<MPEG4Writer> SurfaceMediaSourceTest::setUpWriter(OMXClient &client ) { 10226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // Writing to a file 10326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const char *fileName = "/sdcard/outputSurfEnc.mp4"; 10426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<MetaData> enc_meta = new MetaData; 10526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyBitRate, 300000); 10626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyFrameRate, 30); 10726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 10826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 10926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 110f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi sp<MetaData> meta = mSMS->getFormat(); 11126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 11226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int32_t width, height, stride, sliceHeight, colorFormat; 11326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK(meta->findInt32(kKeyWidth, &width)); 11426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK(meta->findInt32(kKeyHeight, &height)); 11526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK(meta->findInt32(kKeyStride, &stride)); 11626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK(meta->findInt32(kKeySliceHeight, &sliceHeight)); 11726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 11826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 11926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyWidth, width); 12026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyHeight, height); 12126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyIFramesInterval, 1); 12226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyStride, stride); 12326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeySliceHeight, sliceHeight); 12426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // TODO: overwriting the colorformat since the format set by GRAlloc 12526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // could be wrong or not be read by OMX 12626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi enc_meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420Planar); 12726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // colorFormat); 12826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 12926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 13026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<MediaSource> encoder = 13126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi OMXCodec::Create( 132f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi client.interface(), enc_meta, true /* createEncoder */, mSMS); 13326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 13426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<MPEG4Writer> writer = new MPEG4Writer(fileName); 13526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer->addSource(encoder); 13626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 13726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi return writer; 13826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 13926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 14026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Fill a YV12 buffer with a multi-colored checkerboard pattern 141f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12Buffer(uint8_t* buf, int w, int h, int stride) { 14226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const int blockWidth = w > 16 ? w / 16 : 1; 14326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const int blockHeight = h > 16 ? h / 16 : 1; 14426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const int yuvTexOffsetY = 0; 14526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexStrideY = stride; 14626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 14726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 14826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 14926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexStrideU = yuvTexStrideV; 15026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi for (int x = 0; x < w; x++) { 15126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi for (int y = 0; y < h; y++) { 15226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int parityX = (x / blockWidth) & 1; 15326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int parityY = (y / blockHeight) & 1; 15426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi unsigned char intensity = (parityX ^ parityY) ? 63 : 191; 15526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 15626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi if (x < w / 2 && y < h / 2) { 15726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity; 15826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi if (x * 2 < w / 2 && y * 2 < h / 2) { 15926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] = 16026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] = 16126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] = 16226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] = 16326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi intensity; 16426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 16526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 16626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 16726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 16826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 16926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 17026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Fill a YV12 buffer with red outside a given rectangle and green inside it. 171f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketivoid SurfaceMediaSourceTest::fillYV12BufferRect(uint8_t* buf, int w, 17226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int h, int stride, const android_native_rect_t& rect) { 17326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi const int yuvTexOffsetY = 0; 17426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexStrideY = stride; 17526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexOffsetV = yuvTexStrideY * h; 17626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 17726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h/2; 17826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int yuvTexStrideU = yuvTexStrideV; 17926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi for (int x = 0; x < w; x++) { 18026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi for (int y = 0; y < h; y++) { 18126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi bool inside = rect.left <= x && x < rect.right && 18226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi rect.top <= y && y < rect.bottom; 18326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = inside ? 240 : 64; 18426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi if (x < w / 2 && y < h / 2) { 18526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi bool inside = rect.left <= 2*x && 2*x < rect.right && 18626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi rect.top <= 2*y && 2*y < rect.bottom; 18726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = 16; 18826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] = 18926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi inside ? 16 : 255; 19026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 19126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 19226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 193f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi} ///////// End of class SurfaceMediaSourceTest 19426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 19526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi/////////////////////////////////////////////////////////////////// 19626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Class to imitate the recording ///////////////////////////// 19726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// //////////////////////////////////////////////////////////////// 19826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketistruct SimpleDummyRecorder { 19926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<MediaSource> mSource; 20026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 20126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi SimpleDummyRecorder 20226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi (const sp<MediaSource> &source): mSource(source) {} 20326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 20426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi status_t start() { return mSource->start();} 20526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi status_t stop() { return mSource->stop();} 20626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 20726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // fakes reading from a media source 20826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi status_t readFromSource() { 20926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi MediaBuffer *buffer; 21026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi status_t err = mSource->read(&buffer); 21126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi if (err != OK) { 21226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi return err; 21326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 21426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buffer->release(); 21526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi buffer = NULL; 21626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi return OK; 21726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 21826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi}; 21926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 22026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi/////////////////////////////////////////////////////////////////// 22126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// TESTS 222f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// Just pass one buffer from the native_window to the SurfaceMediaSource 223f48987db6711512173327bc6ec8d253ba914dab1Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotOneBufferPass) { 22426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("Testing OneBufferPass ******************************"); 22526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 22626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 22726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 22826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // OMX_COLOR_FormatYUV420Planar)); // )); 22926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 23026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 23126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 23226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 23326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 23426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 23526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted 236f48987db6711512173327bc6ec8d253ba914dab1Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) { 23726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("Testing Wrong size BufferPass ******************************"); 23826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 23926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // setting the client side buffer size different than the server size 24026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 24126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 10, 10, HAL_PIXEL_FORMAT_YV12)); 24226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // OMX_COLOR_FormatYUV420Planar)); // )); 24326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 24426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 24526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 24626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ANativeWindowBuffer* anb; 24726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 24826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // make sure we get an error back when dequeuing! 24926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb)); 25026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 25126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 25226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 253f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 25426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 255f48987db6711512173327bc6ec8d253ba914dab1Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPass) { 25626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder *********************"); 25726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 25826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 25926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 26026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 261f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi SimpleDummyRecorder writer(mSMS); 26226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.start(); 26326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 26426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int32_t nFramesCount = 0; 26526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi while (nFramesCount < 300) { 26626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 26726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 26826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 26926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 27026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi nFramesCount++; 27126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 27226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.stop(); 27326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 27426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 275f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource 27626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer 277f48987db6711512173327bc6ec8d253ba914dab1Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassLag) { 27826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************"); 27926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 28026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 28126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 28226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 283f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi SimpleDummyRecorder writer(mSMS); 28426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.start(); 28526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 28626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int32_t nFramesCount = 1; 287f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi const int FRAMES_LAG = mSMS->getBufferCount() - 1; 28826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi while (nFramesCount <= 300) { 28926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 29026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi // Forcing the writer to lag behind a few frames 29126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi if (nFramesCount > FRAMES_LAG) { 29226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, writer.readFromSource()); 29326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 29426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi nFramesCount++; 29526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 29626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.stop(); 29726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 29826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 299f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource 30026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// A dummy writer (MULTITHREADED) is used to simulate actual MPEG4Writer 301f48987db6711512173327bc6ec8d253ba914dab1Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotMultiBufferPassThreaded) { 30226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("Testing MultiBufferPass, Dummy Recorder Multi-Threaded **********"); 30326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 30426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); 30526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 30626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 30726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 308f48987db6711512173327bc6ec8d253ba914dab1Pannag Sanketi DummyRecorder writer(mSMS); 30926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.start(); 31026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 31126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int32_t nFramesCount = 0; 31226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi while (nFramesCount <= 300) { 31326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 31426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 31526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi nFramesCount++; 31626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 31726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.stop(); 31826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 31926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 32026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// Test to examine the actual encoding. Temporarily disabled till the 32126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi// colorformat and encoding from GRAlloc data is resolved 322f48987db6711512173327bc6ec8d253ba914dab1Pannag SanketiTEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuFilledYV12BufferNpotWrite) { 32326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi LOGV("Testing the whole pipeline with actual Recorder"); 32426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 32526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 0, 0, HAL_PIXEL_FORMAT_YV12)); // OMX_COLOR_FormatYUV420Planar)); // )); 32626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 32726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 32826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 32926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi OMXClient client; 33026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK_EQ(OK, client.connect()); 33126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 33226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi sp<MPEG4Writer> writer = setUpWriter(client); 33326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int64_t start = systemTime(); 33426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK_EQ(OK, writer->start()); 33526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 33626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int32_t nFramesCount = 0; 33726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi while (nFramesCount <= 300) { 33826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi oneBufferPass(mYuvTexWidth, mYuvTexHeight); 33926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi nFramesCount++; 34026a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi } 34126a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 34226a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi CHECK_EQ(OK, writer->stop()); 34326a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi writer.clear(); 34426a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi int64_t end = systemTime(); 34526a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi client.disconnect(); 34626a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} 34726a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 34826a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi 34926a197120c1bad8797f35e9b43482f5466280f8cPannag Sanketi} // namespace android 350