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