SurfaceMediaSource_test.cpp revision 1a2fafbaa36390a06cc9a066fcbe147c8c47ea77
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
743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    const int mYuvTexWidth;//  = 64;
753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    const int mYuvTexHeight;// = 66;
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    // colorFormat);
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                                // OMX_COLOR_FormatYUV420Planar)); // ));
2293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(),
2303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN));
2313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    oneBufferPass(mYuvTexWidth, mYuvTexHeight);
2333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
2343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// Pass the buffer with the wrong height and weight and should not be accepted
2361a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest, EncodingFromCpuFilledYV12BufferNpotWrongSizeBufferPass) {
2373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    LOGV("Testing Wrong size BufferPass ******************************");
2383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    // setting the client side buffer size different than the server size
2403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(),
2413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi             10, 10, HAL_PIXEL_FORMAT_YV12));
2423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi                                // OMX_COLOR_FormatYUV420Planar)); // ));
2433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(),
2443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN));
2453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ANativeWindowBuffer* anb;
2473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    // make sure we get an error back when dequeuing!
2493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_NE(NO_ERROR, mANW->dequeueBuffer(mANW.get(), &anb));
2503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
2513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2531a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// pass multiple buffers from the native_window the SurfaceMediaSource
2543399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer
2551a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest,  EncodingFromCpuFilledYV12BufferNpotMultiBufferPass) {
2563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder *********************");
2573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(),
2583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            0, 0, HAL_PIXEL_FORMAT_YV12));
2593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(),
2603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN));
2611a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    SimpleDummyRecorder writer(mSMS);
2623399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.start();
2633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2643399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    int32_t nFramesCount = 0;
2653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    while (nFramesCount < 300) {
2663399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        oneBufferPass(mYuvTexWidth, mYuvTexHeight);
2673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2683399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        ASSERT_EQ(NO_ERROR, writer.readFromSource());
2693399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2703399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi        nFramesCount++;
2713399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    }
2723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    writer.stop();
2733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi}
2743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2751a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi// Delayed pass of multiple buffers from the native_window the SurfaceMediaSource
2763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi// A dummy writer is used to simulate actual MPEG4Writer
2771a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag SanketiTEST_F(SurfaceMediaSourceTest,  EncodingFromCpuFilledYV12BufferNpotMultiBufferPassLag) {
2783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    LOGV("Testing MultiBufferPass, Dummy Recorder Lagging **************");
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));
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(),
3253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi            0, 0, HAL_PIXEL_FORMAT_YV12)); // OMX_COLOR_FormatYUV420Planar)); // ));
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
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