record.cpp revision 66326a5ee0869f1ee4d136a477e6effba428b3cb
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>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaBufferGroup.h>
236d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber#include <media/stagefright/MediaDebug.h>
2418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h>
2666326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include <media/stagefright/MediaExtractor.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MPEG4Writer.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MmapSource.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
35e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#if 0
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass DummySource : public MediaSource {
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DummySource(int width, int height)
39693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        : mWidth(width),
40693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber          mHeight(height),
41693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber          mSize((width * height * 3) / 2) {
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mGroup.add_buffer(new MediaBuffer(mSize));
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
45693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual sp<MetaData> getFormat() {
46693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        sp<MetaData> meta = new MetaData;
47693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        meta->setInt32(kKeyWidth, mWidth);
48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        meta->setInt32(kKeyHeight, mHeight);
4918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber        meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
50693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
51693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return meta;
52693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
53693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
54693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual status_t start(MetaData *params) {
55693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual status_t stop() {
59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual status_t read(
63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            MediaBuffer **buffer, const MediaSource::ReadOptions *options) {
64693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        status_t err = mGroup.acquire_buffer(buffer);
65693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        if (err != OK) {
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return err;
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        char x = (char)((double)rand() / RAND_MAX * 255);
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        memset((*buffer)->data(), x, mSize);
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        (*buffer)->set_range(0, mSize);
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return OK;
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected:
77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    virtual ~DummySource() {}
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferGroup mGroup;
81693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int mWidth, mHeight;
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t mSize;
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DummySource(const DummySource &);
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DummySource &operator=(const DummySource &);
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MediaSource> createSource(const char *filename) {
89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MediaSource> source;
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9166326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber    sp<MediaExtractor> extractor =
9266326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber        MediaExtractor::Create(new MmapSource(filename));
93693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
94693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    size_t num_tracks = extractor->countTracks();
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> meta;
97693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    for (size_t i = 0; i < num_tracks; ++i) {
98693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        meta = extractor->getTrackMetaData(i);
996d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber        CHECK(meta.get() != NULL);
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const char *mime;
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (!meta->findCString(kKeyMIMEType, &mime)) {
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            continue;
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (strncasecmp(mime, "video/", 6)) {
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            continue;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        source = extractor->getTrack(i);
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        break;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    return source;
115693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
116693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
117693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberint main(int argc, char **argv) {
118693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    android::ProcessState::self()->startThreadPool();
119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1
121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    if (argc != 2) {
122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        fprintf(stderr, "usage: %s filename\n", argv[0]);
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return 1;
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMXClient client;
1276d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber    CHECK_EQ(client.connect(), OK);
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 0
130693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MediaSource> source = createSource(argv[1]);
131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    if (source == NULL) {
133693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        fprintf(stderr, "Unable to find a suitable video track.\n");
134693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return 1;
135693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MetaData> meta = source->getFormat();
138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<OMXCodec> decoder = OMXCodec::Create(
140693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            client.interface(), meta, false /* createEncoder */, source);
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    int width, height;
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool success = meta->findInt32(kKeyWidth, &width);
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    success = success && meta->findInt32(kKeyHeight, &height);
1456d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber    CHECK(success);
146693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#else
147693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int width = 320;
148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int height = 240;
149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MediaSource> decoder = new DummySource(width, height);
150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> enc_meta = new MetaData;
15318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber    // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
15418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber    enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enc_meta->setInt32(kKeyWidth, width);
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enc_meta->setInt32(kKeyHeight, height);
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
158693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<OMXCodec> encoder =
159693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        OMXCodec::Create(
160693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber                client.interface(), enc_meta, true /* createEncoder */, decoder);
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
162e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#if 0
163693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4");
164693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    writer->addSource(enc_meta, encoder);
165693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    writer->start();
166bf37f3364804f521cc61845b1f1ce16fe133814bAndreas Huber    sleep(20);
167bf37f3364804f521cc61845b1f1ce16fe133814bAndreas Huber    printf("stopping now.\n");
168693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    writer->stop();
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#else
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    encoder->start();
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *buffer;
1736d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber    while (encoder->read(&buffer) == OK) {
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        printf("got an output frame of size %d\n", buffer->range_length());
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer->release();
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer = NULL;
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    encoder->stop();
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    client.disconnect();
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if 0
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CameraSource *source = CameraSource::Create();
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    printf("source = %p\n", source);
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    for (int i = 0; i < 100; ++i) {
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        MediaBuffer *buffer;
19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = source->read(&buffer);
1936d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber        CHECK_EQ(err, OK);
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        printf("got a frame, data=%p, size=%d\n",
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber               buffer->data(), buffer->range_length());
19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer->release();
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        buffer = NULL;
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    delete source;
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    source = NULL;
20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif
20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return 0;
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
2087a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#else
209e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
210e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huberint main(int argc, char **argv) {
211e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    android::ProcessState::self()->startThreadPool();
212e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
213e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    OMXClient client;
214e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    CHECK_EQ(client.connect(), OK);
215e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
216e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    const int32_t kSampleRate = 22050;
217e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    const int32_t kNumChannels = 2;
218e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MediaSource> audioSource = new SineSource(kSampleRate, kNumChannels);
219e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
220e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#if 0
221e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MediaPlayerBase::AudioSink> audioSink;
222e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    AudioPlayer *player = new AudioPlayer(audioSink);
223e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    player->setSource(audioSource);
224e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    player->start();
225e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
226e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sleep(10);
227e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
228e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    player->stop();
229e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#endif
230e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
231e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MetaData> encMeta = new MetaData;
23218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber    encMeta->setCString(kKeyMIMEType,
23318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber            1 ? MEDIA_MIMETYPE_AUDIO_AMR_WB : MEDIA_MIMETYPE_AUDIO_AAC);
234e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encMeta->setInt32(kKeySampleRate, kSampleRate);
235e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encMeta->setInt32(kKeyChannelCount, kNumChannels);
236e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encMeta->setInt32(kKeyMaxInputSize, 8192);
237e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
238e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    sp<MediaSource> encoder =
239e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        OMXCodec::Create(client.interface(), encMeta, true, audioSource);
240e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
241e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encoder->start();
242e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
243e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    int32_t n = 0;
244e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    status_t err;
245e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    MediaBuffer *buffer;
246e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    while ((err = encoder->read(&buffer)) == OK) {
247e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        printf(".");
248e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        fflush(stdout);
249e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
250e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        buffer->release();
251e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        buffer = NULL;
252e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
253456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber        if (++n == 100) {
254e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber            break;
255e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber        }
256e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    }
257e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    printf("$\n");
258e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
259e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    encoder->stop();
260e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
261e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    client.disconnect();
262e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber
263e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    return 0;
264e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber}
2657a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#endif
266