record.cpp revision 18291bc20e55e8f3fd5feb786771a8ed32c19c59
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> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MPEG4Extractor.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 91693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MPEG4Extractor> extractor = 92693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber new MPEG4Extractor(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