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