record.cpp revision f74c8f9ee26c91b129fe9a1acc254471a9f30cb1
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#include "SineSource.h"
18e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/ProcessState.h>
20e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#include <media/stagefright/AudioPlayer.h>
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/CameraSource.h>
22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaBufferGroup.h>
246d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber#include <media/stagefright/MediaDebug.h>
2518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h>
2766326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include <media/stagefright/MediaExtractor.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MPEG4Writer.h>
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h>
30693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h>
31e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#include <media/MediaPlayerInterface.h>
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android;
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kFramerate = 24;  // fps
36f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kIFramesIntervalSec = 1;
37f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kVideoBitRate = 512 * 1024;
38f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kAudioBitRate = 12200;
39f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
40f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int64_t kDurationUs = 10000000LL;  // 10 seconds
41f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong
42888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber#if 1
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass DummySource : public MediaSource {
44888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DummySource(int width, int height)
47693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        : mWidth(width),
48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber          mHeight(height),
49693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber          mSize((width * height * 3) / 2) {
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mGroup.add_buffer(new MediaBuffer(mSize));
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual sp<MetaData> getFormat() {
54693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        sp<MetaData> meta = new MetaData;
55693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        meta->setInt32(kKeyWidth, mWidth);
56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        meta->setInt32(kKeyHeight, mHeight);
5718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber        meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return meta;
60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual status_t start(MetaData *params) {
63888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        mNumFramesOutput = 0;
64693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
65693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual status_t stop() {
68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual status_t read(
72693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            MediaBuffer **buffer, const MediaSource::ReadOptions *options) {
73888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        if (mNumFramesOutput == kFramerate * 10) {
74888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber            // Stop returning data after 10 secs.
75888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber            return ERROR_END_OF_STREAM;
76888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        }
77888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber
78888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        // printf("DummySource::read\n");
79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = mGroup.acquire_buffer(buffer);
80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        char x = (char)((double)rand() / RAND_MAX * 255);
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        memset((*buffer)->data(), x, mSize);
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        (*buffer)->set_range(0, mSize);
87888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        (*buffer)->meta_data()->clear();
88888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        (*buffer)->meta_data()->setInt64(
89888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber                kKeyTime, (mNumFramesOutput * 1000000) / kFramerate);
90888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        ++mNumFramesOutput;
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        // printf("DummySource::read - returning buffer\n");
93888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        // LOGI("DummySource::read - returning buffer");
94693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
97693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected:
98693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual ~DummySource() {}
99693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferGroup mGroup;
102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int mWidth, mHeight;
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t mSize;
104888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber    int64_t mNumFramesOutput;;
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DummySource(const DummySource &);
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DummySource &operator=(const DummySource &);
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MediaSource> createSource(const char *filename) {
111693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MediaSource> source;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11366326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber    sp<MediaExtractor> extractor =
114bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        MediaExtractor::Create(new FileSource(filename));
115b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong    if (extractor == NULL) {
116b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong        return NULL;
117b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong    }
118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    size_t num_tracks = extractor->countTracks();
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> meta;
122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    for (size_t i = 0; i < num_tracks; ++i) {
123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        meta = extractor->getTrackMetaData(i);
1246d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber        CHECK(meta.get() != NULL);
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const char *mime;
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (!meta->findCString(kKeyMIMEType, &mime)) {
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            continue;
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (strncasecmp(mime, "video/", 6)) {
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            continue;
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        source = extractor->getTrack(i);
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        break;
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    return source;
140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
141693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberint main(int argc, char **argv) {
143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    android::ProcessState::self()->startThreadPool();
144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
145f808c4cf1c3e2c6b18a2e9268bfa3cfc9ca793f8Andreas Huber    DataSource::RegisterDefaultSniffers();
146f808c4cf1c3e2c6b18a2e9268bfa3cfc9ca793f8Andreas Huber
147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1
148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    if (argc != 2) {
149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        fprintf(stderr, "usage: %s filename\n", argv[0]);
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return 1;
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMXClient client;
1546d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber    CHECK_EQ(client.connect(), OK);
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber#if 0
157693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MediaSource> source = createSource(argv[1]);
158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    if (source == NULL) {
160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        fprintf(stderr, "Unable to find a suitable video track.\n");
161693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return 1;
162693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MetaData> meta = source->getFormat();
165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
166bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber    sp<MediaSource> decoder = OMXCodec::Create(
167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            client.interface(), meta, false /* createEncoder */, source);
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    int width, height;
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool success = meta->findInt32(kKeyWidth, &width);
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    success = success && meta->findInt32(kKeyHeight, &height);
1726d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber    CHECK(success);
173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#else
17403b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    int width = 720;
175888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber    int height = 480;
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MediaSource> decoder = new DummySource(width, height);
177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> enc_meta = new MetaData;
18018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber    // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
18103b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
18203b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enc_meta->setInt32(kKeyWidth, width);
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enc_meta->setInt32(kKeyHeight, height);
185f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    enc_meta->setInt32(kKeySampleRate, kFramerate);
186f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    enc_meta->setInt32(kKeyBitRate, kVideoBitRate);
187f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    enc_meta->setInt32(kKeyStride, width);
188f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    enc_meta->setInt32(kKeySliceHeight, height);
189f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec);
190f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    enc_meta->setInt32(kKeyColorFormat, kColorFormat);
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
192bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber    sp<MediaSource> encoder =
193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        OMXCodec::Create(
194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                client.interface(), enc_meta, true /* createEncoder */, decoder);
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
196888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber#if 1
197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4");
198888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber    writer->addSource(encoder);
199f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    writer->setMaxFileDuration(kDurationUs);
200693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    writer->start();
201888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber    while (!writer->reachedEOS()) {
202f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong        fprintf(stderr, ".");
203888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        usleep(100000);
204888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber    }
205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    writer->stop();
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#else
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    encoder->start();
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *buffer;
2106d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber    while (encoder->read(&buffer) == OK) {
211f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong        printf(".");
212f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong        fflush(stdout);
213888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        int32_t isSync;
214888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        if (!buffer->meta_data()->findInt32(kKeyIsSyncFrame, &isSync)) {
215888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber            isSync = false;
216888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        }
217888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber
218888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber        printf("got an output frame of size %d%s\n", buffer->range_length(),
219888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber               isSync ? " (SYNC)" : "");
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer->release();
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer = NULL;
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    encoder->stop();
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
228f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    printf("$\n");
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    client.disconnect();
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if 0
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CameraSource *source = CameraSource::Create();
23403b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    source->start();
23503b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    printf("source = %p\n", source);
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    for (int i = 0; i < 100; ++i) {
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        MediaBuffer *buffer;
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = source->read(&buffer);
2416d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber        CHECK_EQ(err, OK);
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        printf("got a frame, data=%p, size=%d\n",
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber               buffer->data(), buffer->range_length());
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer->release();
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer = NULL;
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    source->stop();
25103b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    delete source;
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    source = NULL;
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return 0;
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
2587a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#else
259e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
260e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huberint main(int argc, char **argv) {
261e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    android::ProcessState::self()->startThreadPool();
262e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
263e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    OMXClient client;
264e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    CHECK_EQ(client.connect(), OK);
265e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
266e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    const int32_t kSampleRate = 22050;
267e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    const int32_t kNumChannels = 2;
268e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MediaSource> audioSource = new SineSource(kSampleRate, kNumChannels);
269e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
270e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#if 0
271e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MediaPlayerBase::AudioSink> audioSink;
272e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    AudioPlayer *player = new AudioPlayer(audioSink);
273e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    player->setSource(audioSource);
274e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    player->start();
275e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
276e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sleep(10);
277e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
278e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    player->stop();
279e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#endif
280e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
281e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MetaData> encMeta = new MetaData;
28218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber    encMeta->setCString(kKeyMIMEType,
28318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber            1 ? MEDIA_MIMETYPE_AUDIO_AMR_WB : MEDIA_MIMETYPE_AUDIO_AAC);
284e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encMeta->setInt32(kKeySampleRate, kSampleRate);
285e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encMeta->setInt32(kKeyChannelCount, kNumChannels);
286e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encMeta->setInt32(kKeyMaxInputSize, 8192);
287f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong    encMeta->setInt32(kKeyBitRate, kAudioBitRate);
288e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
289e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MediaSource> encoder =
290e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        OMXCodec::Create(client.interface(), encMeta, true, audioSource);
291e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
292e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encoder->start();
293e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
294e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    int32_t n = 0;
295e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    status_t err;
296e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    MediaBuffer *buffer;
297e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    while ((err = encoder->read(&buffer)) == OK) {
298e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        printf(".");
299e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        fflush(stdout);
300e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
301e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        buffer->release();
302e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        buffer = NULL;
303e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
304456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber        if (++n == 100) {
305e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber            break;
306e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        }
307e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    }
308e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    printf("$\n");
309e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
310e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encoder->stop();
311e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
312e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    client.disconnect();
313e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
314e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    return 0;
315e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber}
3167a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#endif
317