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> 20f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 215fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/foundation/ALooper.h> 225fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/foundation/AMessage.h> 23e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#include <media/stagefright/AudioPlayer.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/CameraSource.h> 25bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaBufferGroup.h> 2718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 285fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/MediaCodecSource.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 3066326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include <media/stagefright/MediaExtractor.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MPEG4Writer.h> 325fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/SimpleDecodingSource.h> 33e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#include <media/MediaPlayerInterface.h> 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android; 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3731de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnarstatic const int32_t kAudioBitRate = 12200; 3831de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar#if 0 39f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kFramerate = 24; // fps 40f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kIFramesIntervalSec = 1; 41f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int32_t kVideoBitRate = 512 * 1024; 42f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dongstatic const int64_t kDurationUs = 10000000LL; // 10 seconds 43f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass DummySource : public MediaSource { 45888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 47a73367993a9d53a4daceeb40ede183e60dd571e5James Dong DummySource(int width, int height, int colorFormat) 48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber : mWidth(width), 49693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mHeight(height), 50a73367993a9d53a4daceeb40ede183e60dd571e5James Dong mColorFormat(colorFormat), 51693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber mSize((width * height * 3) / 2) { 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mGroup.add_buffer(new MediaBuffer(mSize)); 53a73367993a9d53a4daceeb40ede183e60dd571e5James Dong 54a73367993a9d53a4daceeb40ede183e60dd571e5James Dong // Check the color format to make sure 55a73367993a9d53a4daceeb40ede183e60dd571e5James Dong // that the buffer size mSize it set correctly above. 56a73367993a9d53a4daceeb40ede183e60dd571e5James Dong CHECK(colorFormat == OMX_COLOR_FormatYUV420SemiPlanar || 57a73367993a9d53a4daceeb40ede183e60dd571e5James Dong colorFormat == OMX_COLOR_FormatYUV420Planar); 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual sp<MetaData> getFormat() { 61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = new MetaData; 62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber meta->setInt32(kKeyWidth, mWidth); 63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber meta->setInt32(kKeyHeight, mHeight); 64a73367993a9d53a4daceeb40ede183e60dd571e5James Dong meta->setInt32(kKeyColorFormat, mColorFormat); 6518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return meta; 68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 70693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual status_t start(MetaData *params) { 71888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber mNumFramesOutput = 0; 72693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual status_t stop() { 76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual status_t read( 80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber MediaBuffer **buffer, const MediaSource::ReadOptions *options) { 81888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber if (mNumFramesOutput == kFramerate * 10) { 82888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber // Stop returning data after 10 secs. 83888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber return ERROR_END_OF_STREAM; 84888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber } 85888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber 86888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber // printf("DummySource::read\n"); 87693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t err = mGroup.acquire_buffer(buffer); 88693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (err != OK) { 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber char x = (char)((double)rand() / RAND_MAX * 255); 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber memset((*buffer)->data(), x, mSize); 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->set_range(0, mSize); 95888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber (*buffer)->meta_data()->clear(); 96888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber (*buffer)->meta_data()->setInt64( 97888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber kKeyTime, (mNumFramesOutput * 1000000) / kFramerate); 98888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber ++mNumFramesOutput; 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 100888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber // printf("DummySource::read - returning buffer\n"); 101df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("DummySource::read - returning buffer"); 102693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return OK; 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected: 106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~DummySource() {} 107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBufferGroup mGroup; 110693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int mWidth, mHeight; 111a73367993a9d53a4daceeb40ede183e60dd571e5James Dong int mColorFormat; 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t mSize; 113888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber int64_t mNumFramesOutput;; 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DummySource(const DummySource &); 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DummySource &operator=(const DummySource &); 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 119693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MediaSource> createSource(const char *filename) { 120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MediaSource> source; 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12266326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber sp<MediaExtractor> extractor = 123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaExtractor::Create(new FileSource(filename)); 124b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong if (extractor == NULL) { 125b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong return NULL; 126b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong } 127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber size_t num_tracks = extractor->countTracks(); 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<MetaData> meta; 131693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber for (size_t i = 0; i < num_tracks; ++i) { 132693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber meta = extractor->getTrackMetaData(i); 1336d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber CHECK(meta.get() != NULL); 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const char *mime; 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!meta->findCString(kKeyMIMEType, &mime)) { 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber continue; 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (strncasecmp(mime, "video/", 6)) { 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber continue; 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 144693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber source = extractor->getTrack(i); 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber break; 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 148693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return source; 149693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 150693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 151a73367993a9d53a4daceeb40ede183e60dd571e5James Dongenum { 152a73367993a9d53a4daceeb40ede183e60dd571e5James Dong kYUV420SP = 0, 153a73367993a9d53a4daceeb40ede183e60dd571e5James Dong kYUV420P = 1, 154a73367993a9d53a4daceeb40ede183e60dd571e5James Dong}; 155a73367993a9d53a4daceeb40ede183e60dd571e5James Dong 156a73367993a9d53a4daceeb40ede183e60dd571e5James Dong// returns -1 if mapping of the given color is unsuccessful 157a73367993a9d53a4daceeb40ede183e60dd571e5James Dong// returns an omx color enum value otherwise 158a73367993a9d53a4daceeb40ede183e60dd571e5James Dongstatic int translateColorToOmxEnumValue(int color) { 159a73367993a9d53a4daceeb40ede183e60dd571e5James Dong switch (color) { 160a73367993a9d53a4daceeb40ede183e60dd571e5James Dong case kYUV420SP: 161a73367993a9d53a4daceeb40ede183e60dd571e5James Dong return OMX_COLOR_FormatYUV420SemiPlanar; 162a73367993a9d53a4daceeb40ede183e60dd571e5James Dong case kYUV420P: 163a73367993a9d53a4daceeb40ede183e60dd571e5James Dong return OMX_COLOR_FormatYUV420Planar; 164a73367993a9d53a4daceeb40ede183e60dd571e5James Dong default: 165a73367993a9d53a4daceeb40ede183e60dd571e5James Dong fprintf(stderr, "Unsupported color: %d\n", color); 166a73367993a9d53a4daceeb40ede183e60dd571e5James Dong return -1; 167a73367993a9d53a4daceeb40ede183e60dd571e5James Dong } 168a73367993a9d53a4daceeb40ede183e60dd571e5James Dong} 169a73367993a9d53a4daceeb40ede183e60dd571e5James Dong 170693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberint main(int argc, char **argv) { 171693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber android::ProcessState::self()->startThreadPool(); 172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 173f808c4cf1c3e2c6b18a2e9268bfa3cfc9ca793f8Andreas Huber DataSource::RegisterDefaultSniffers(); 174f808c4cf1c3e2c6b18a2e9268bfa3cfc9ca793f8Andreas Huber 175693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#if 1 176a73367993a9d53a4daceeb40ede183e60dd571e5James Dong if (argc != 3) { 177a73367993a9d53a4daceeb40ede183e60dd571e5James Dong fprintf(stderr, "usage: %s <filename> <input_color_format>\n", argv[0]); 178a73367993a9d53a4daceeb40ede183e60dd571e5James Dong fprintf(stderr, " <input_color_format>: 0 (YUV420SP) or 1 (YUV420P)\n"); 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 1; 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 182a73367993a9d53a4daceeb40ede183e60dd571e5James Dong int colorFormat = translateColorToOmxEnumValue(atoi(argv[2])); 183a73367993a9d53a4daceeb40ede183e60dd571e5James Dong if (colorFormat == -1) { 184a73367993a9d53a4daceeb40ede183e60dd571e5James Dong fprintf(stderr, "input color format must be 0 (YUV420SP) or 1 (YUV420P)\n"); 185a73367993a9d53a4daceeb40ede183e60dd571e5James Dong return 1; 186a73367993a9d53a4daceeb40ede183e60dd571e5James Dong } 187a73367993a9d53a4daceeb40ede183e60dd571e5James Dong status_t err = OK; 188a73367993a9d53a4daceeb40ede183e60dd571e5James Dong 18903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber#if 0 190693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MediaSource> source = createSource(argv[1]); 191693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 192693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber if (source == NULL) { 193693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber fprintf(stderr, "Unable to find a suitable video track.\n"); 194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return 1; 195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = source->getFormat(); 198693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1995fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<MediaSource> decoder = SimpleDecodingSource::Create(source); 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int width, height; 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool success = meta->findInt32(kKeyWidth, &width); 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber success = success && meta->findInt32(kKeyHeight, &height); 2046d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber CHECK(success); 205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#else 20603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber int width = 720; 207888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber int height = 480; 208a73367993a9d53a4daceeb40ede183e60dd571e5James Dong sp<MediaSource> decoder = new DummySource(width, height, colorFormat); 209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#endif 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2115fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<AMessage> enc_meta = new AMessage; 2125fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar // enc_meta->setString("mime", MEDIA_MIMETYPE_VIDEO_H263); 2135fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar // enc_meta->setString("mime", MEDIA_MIMETYPE_VIDEO_MPEG4); 2145fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar enc_meta->setString("mime", MEDIA_MIMETYPE_VIDEO_AVC); 2155fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar enc_meta->setInt32("width", width); 2165fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar enc_meta->setInt32("height", height); 2175fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar enc_meta->setInt32("sample-rate", kFramerate); 21846f80165c595d81dda68f8f3fea27f4fb04937ddLajos Molnar enc_meta->setInt32("bitrate", kVideoBitRate); 2195fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar // enc_meta->setInt32("stride", width); 2205fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar // enc_meta->setInt32("slice-height", height); 2215fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar enc_meta->setInt32("i-frame-interval", kIFramesIntervalSec); 2225fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar enc_meta->setInt32("color-format", colorFormat); 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 224bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber sp<MediaSource> encoder = 2255fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar MediaCodecSource::Create(looper, format, decoder); 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 227888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber#if 1 228693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4"); 229888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber writer->addSource(encoder); 230f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong writer->setMaxFileDuration(kDurationUs); 231f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK_EQ((status_t)OK, writer->start()); 232888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber while (!writer->reachedEOS()) { 233f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong fprintf(stderr, "."); 234888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber usleep(100000); 235888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber } 236a73367993a9d53a4daceeb40ede183e60dd571e5James Dong err = writer->stop(); 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#else 238f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK_EQ((status_t)OK, encoder->start()); 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer *buffer; 2416d43768514650d65f4f3695da4f7c3e2eefd483cAndreas Huber while (encoder->read(&buffer) == OK) { 242f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong printf("."); 243f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong fflush(stdout); 244888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber int32_t isSync; 245888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber if (!buffer->meta_data()->findInt32(kKeyIsSyncFrame, &isSync)) { 246888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber isSync = false; 247888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber } 248888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber 249888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber printf("got an output frame of size %d%s\n", buffer->range_length(), 250888f72a4628eed3c136ff2e346a15d129da0d520Andreas Huber isSync ? " (SYNC)" : ""); 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer->release(); 25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer = NULL; 25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 256a73367993a9d53a4daceeb40ede183e60dd571e5James Dong err = encoder->stop(); 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 259f74c8f9ee26c91b129fe9a1acc254471a9f30cb1James Dong printf("$\n"); 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#if 0 263ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala CameraSource *source = CameraSource::Create( 264ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala String16(argv[0], strlen(argv[0]))); 26503b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber source->start(); 26603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber printf("source = %p\n", source); 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (int i = 0; i < 100; ++i) { 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer *buffer; 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = source->read(&buffer); 272f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK_EQ(err, (status_t)OK); 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber printf("got a frame, data=%p, size=%d\n", 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer->data(), buffer->range_length()); 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer->release(); 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer = NULL; 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 281a73367993a9d53a4daceeb40ede183e60dd571e5James Dong err = source->stop(); 28203b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber delete source; 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber source = NULL; 28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 287a73367993a9d53a4daceeb40ede183e60dd571e5James Dong if (err != OK && err != ERROR_END_OF_STREAM) { 288a73367993a9d53a4daceeb40ede183e60dd571e5James Dong fprintf(stderr, "record failed: %d\n", err); 289a73367993a9d53a4daceeb40ede183e60dd571e5James Dong return 1; 290a73367993a9d53a4daceeb40ede183e60dd571e5James Dong } 29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 0; 29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 2937a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#else 294e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 295ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huberint main(int /* argc */, char ** /* argv */) { 296e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber android::ProcessState::self()->startThreadPool(); 297e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 298e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber const int32_t kSampleRate = 22050; 299e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber const int32_t kNumChannels = 2; 300e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber sp<MediaSource> audioSource = new SineSource(kSampleRate, kNumChannels); 301e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 302e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#if 0 303e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber sp<MediaPlayerBase::AudioSink> audioSink; 304e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber AudioPlayer *player = new AudioPlayer(audioSink); 305e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber player->setSource(audioSource); 306e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber player->start(); 307e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 308e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber sleep(10); 309e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 310e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber player->stop(); 311e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber#endif 312e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 3135fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<AMessage> encMeta = new AMessage; 3145fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar encMeta->setString("mime", 3152b1892db4a2ab47bfc09e59a4c11751aea99e4eaAndreas Huber 0 ? MEDIA_MIMETYPE_AUDIO_AMR_WB : MEDIA_MIMETYPE_AUDIO_AAC); 3165fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar encMeta->setInt32("sample-rate", kSampleRate); 3175fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar encMeta->setInt32("channel-count", kNumChannels); 3185fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar encMeta->setInt32("max-input-size", 8192); 3195fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar encMeta->setInt32("bitrate", kAudioBitRate); 3205fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar 3215fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<ALooper> looper = new ALooper; 3225fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar looper->setName("record"); 3235fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar looper->start(); 324e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 325b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<IMediaSource> encoder = 3265fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar MediaCodecSource::Create(looper, encMeta, audioSource); 327e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 328e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber encoder->start(); 329e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 330e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber int32_t n = 0; 331e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber status_t err; 332e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber MediaBuffer *buffer; 333e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber while ((err = encoder->read(&buffer)) == OK) { 334e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber printf("."); 335e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber fflush(stdout); 336e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 337e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber buffer->release(); 338e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber buffer = NULL; 339e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 340456db75516efc889e1ee4e5e16021e77c03b0941Andreas Huber if (++n == 100) { 341e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber break; 342e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 343e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber } 344e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber printf("$\n"); 345e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 346e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber encoder->stop(); 347e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber 348e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber return 0; 349e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber} 3507a6b9e2eca7d20457ace3538c689640e5bfda4f3Andreas Huber#endif 351