blob: 5a87f4ca2a6e38b221c1fcefcd1d398025c25a25 [file] [log] [blame]
Andreas Hubere46b7be2009-07-14 16:56:47 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huberda050cf22009-09-02 14:01:43 -070017#include "SineSource.h"
18
Andreas Hubere46b7be2009-07-14 16:56:47 -070019#include <binder/ProcessState.h>
Andreas Huberda050cf22009-09-02 14:01:43 -070020#include <media/stagefright/AudioPlayer.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070021#include <media/stagefright/CameraSource.h>
Andreas Huber27366fc2009-11-20 09:32:46 -080022#include <media/stagefright/FileSource.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070023#include <media/stagefright/MediaBufferGroup.h>
Andreas Hubere915a852009-08-28 13:32:48 -070024#include <media/stagefright/MediaDebug.h>
Andreas Hubere6c40962009-09-10 14:13:30 -070025#include <media/stagefright/MediaDefs.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070026#include <media/stagefright/MetaData.h>
Andreas Huber57515f32009-10-23 09:55:10 -070027#include <media/stagefright/MediaExtractor.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070028#include <media/stagefright/MPEG4Writer.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070029#include <media/stagefright/OMXClient.h>
Andreas Huberbe06d262009-08-14 14:37:10 -070030#include <media/stagefright/OMXCodec.h>
Andreas Huberda050cf22009-09-02 14:01:43 -070031#include <media/MediaPlayerInterface.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070032
33using namespace android;
34
Andreas Huberb482ce82009-10-29 12:02:48 -070035#if 1
Andreas Hubere46b7be2009-07-14 16:56:47 -070036class DummySource : public MediaSource {
Andreas Huberb482ce82009-10-29 12:02:48 -070037 static const int32_t kFramerate = 24; // fps
38
Andreas Hubere46b7be2009-07-14 16:56:47 -070039public:
40 DummySource(int width, int height)
Andreas Huberbe06d262009-08-14 14:37:10 -070041 : mWidth(width),
42 mHeight(height),
43 mSize((width * height * 3) / 2) {
Andreas Hubere46b7be2009-07-14 16:56:47 -070044 mGroup.add_buffer(new MediaBuffer(mSize));
45 }
46
Andreas Huberbe06d262009-08-14 14:37:10 -070047 virtual sp<MetaData> getFormat() {
48 sp<MetaData> meta = new MetaData;
49 meta->setInt32(kKeyWidth, mWidth);
50 meta->setInt32(kKeyHeight, mHeight);
Andreas Hubere6c40962009-09-10 14:13:30 -070051 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
Andreas Huberbe06d262009-08-14 14:37:10 -070052
53 return meta;
Andreas Hubere46b7be2009-07-14 16:56:47 -070054 }
55
Andreas Huberbe06d262009-08-14 14:37:10 -070056 virtual status_t start(MetaData *params) {
Andreas Huberb482ce82009-10-29 12:02:48 -070057 mNumFramesOutput = 0;
Andreas Huberbe06d262009-08-14 14:37:10 -070058 return OK;
59 }
60
61 virtual status_t stop() {
62 return OK;
63 }
64
65 virtual status_t read(
66 MediaBuffer **buffer, const MediaSource::ReadOptions *options) {
Andreas Huberb482ce82009-10-29 12:02:48 -070067 if (mNumFramesOutput == kFramerate * 10) {
68 // Stop returning data after 10 secs.
69 return ERROR_END_OF_STREAM;
70 }
71
72 // printf("DummySource::read\n");
Andreas Huberbe06d262009-08-14 14:37:10 -070073 status_t err = mGroup.acquire_buffer(buffer);
74 if (err != OK) {
Andreas Hubere46b7be2009-07-14 16:56:47 -070075 return err;
76 }
77
78 char x = (char)((double)rand() / RAND_MAX * 255);
79 memset((*buffer)->data(), x, mSize);
80 (*buffer)->set_range(0, mSize);
Andreas Huberb482ce82009-10-29 12:02:48 -070081 (*buffer)->meta_data()->clear();
82 (*buffer)->meta_data()->setInt64(
83 kKeyTime, (mNumFramesOutput * 1000000) / kFramerate);
84 ++mNumFramesOutput;
Andreas Hubere46b7be2009-07-14 16:56:47 -070085
Andreas Huberb482ce82009-10-29 12:02:48 -070086 // printf("DummySource::read - returning buffer\n");
87 // LOGI("DummySource::read - returning buffer");
Andreas Huberbe06d262009-08-14 14:37:10 -070088 return OK;
Andreas Hubere46b7be2009-07-14 16:56:47 -070089 }
90
Andreas Huberbe06d262009-08-14 14:37:10 -070091protected:
92 virtual ~DummySource() {}
93
Andreas Hubere46b7be2009-07-14 16:56:47 -070094private:
95 MediaBufferGroup mGroup;
Andreas Huberbe06d262009-08-14 14:37:10 -070096 int mWidth, mHeight;
Andreas Hubere46b7be2009-07-14 16:56:47 -070097 size_t mSize;
Andreas Huberb482ce82009-10-29 12:02:48 -070098 int64_t mNumFramesOutput;;
Andreas Hubere46b7be2009-07-14 16:56:47 -070099
100 DummySource(const DummySource &);
101 DummySource &operator=(const DummySource &);
102};
103
Andreas Huberbe06d262009-08-14 14:37:10 -0700104sp<MediaSource> createSource(const char *filename) {
105 sp<MediaSource> source;
Andreas Hubere46b7be2009-07-14 16:56:47 -0700106
Andreas Huber57515f32009-10-23 09:55:10 -0700107 sp<MediaExtractor> extractor =
Andreas Huber27366fc2009-11-20 09:32:46 -0800108 MediaExtractor::Create(new FileSource(filename));
James Donge4cfcb82010-02-04 18:08:06 -0800109 if (extractor == NULL) {
110 return NULL;
111 }
Andreas Hubere46b7be2009-07-14 16:56:47 -0700112
Andreas Huberbe06d262009-08-14 14:37:10 -0700113 size_t num_tracks = extractor->countTracks();
114
Andreas Hubere46b7be2009-07-14 16:56:47 -0700115 sp<MetaData> meta;
Andreas Huberbe06d262009-08-14 14:37:10 -0700116 for (size_t i = 0; i < num_tracks; ++i) {
117 meta = extractor->getTrackMetaData(i);
Andreas Hubere915a852009-08-28 13:32:48 -0700118 CHECK(meta.get() != NULL);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700119
120 const char *mime;
121 if (!meta->findCString(kKeyMIMEType, &mime)) {
122 continue;
123 }
124
125 if (strncasecmp(mime, "video/", 6)) {
126 continue;
127 }
128
Andreas Huberbe06d262009-08-14 14:37:10 -0700129 source = extractor->getTrack(i);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700130 break;
131 }
132
Andreas Huberbe06d262009-08-14 14:37:10 -0700133 return source;
134}
135
136int main(int argc, char **argv) {
137 android::ProcessState::self()->startThreadPool();
138
Andreas Huber3e1bdd32009-10-29 15:58:10 -0700139 DataSource::RegisterDefaultSniffers();
140
Andreas Huberbe06d262009-08-14 14:37:10 -0700141#if 1
142 if (argc != 2) {
143 fprintf(stderr, "usage: %s filename\n", argv[0]);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700144 return 1;
145 }
146
147 OMXClient client;
Andreas Hubere915a852009-08-28 13:32:48 -0700148 CHECK_EQ(client.connect(), OK);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700149
Andreas Huber71c27d92010-03-19 11:43:15 -0700150#if 0
Andreas Huberbe06d262009-08-14 14:37:10 -0700151 sp<MediaSource> source = createSource(argv[1]);
152
153 if (source == NULL) {
154 fprintf(stderr, "Unable to find a suitable video track.\n");
155 return 1;
156 }
157
158 sp<MetaData> meta = source->getFormat();
159
Andreas Huber91eb0352009-12-07 09:43:00 -0800160 sp<MediaSource> decoder = OMXCodec::Create(
Andreas Huberbe06d262009-08-14 14:37:10 -0700161 client.interface(), meta, false /* createEncoder */, source);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700162
163 int width, height;
164 bool success = meta->findInt32(kKeyWidth, &width);
165 success = success && meta->findInt32(kKeyHeight, &height);
Andreas Hubere915a852009-08-28 13:32:48 -0700166 CHECK(success);
Andreas Huberbe06d262009-08-14 14:37:10 -0700167#else
Andreas Huber71c27d92010-03-19 11:43:15 -0700168 int width = 720;
Andreas Huberb482ce82009-10-29 12:02:48 -0700169 int height = 480;
Andreas Huberbe06d262009-08-14 14:37:10 -0700170 sp<MediaSource> decoder = new DummySource(width, height);
171#endif
Andreas Hubere46b7be2009-07-14 16:56:47 -0700172
173 sp<MetaData> enc_meta = new MetaData;
Andreas Hubere6c40962009-09-10 14:13:30 -0700174 // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
Andreas Huber71c27d92010-03-19 11:43:15 -0700175 // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
176 enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700177 enc_meta->setInt32(kKeyWidth, width);
178 enc_meta->setInt32(kKeyHeight, height);
179
Andreas Huber91eb0352009-12-07 09:43:00 -0800180 sp<MediaSource> encoder =
Andreas Huberbe06d262009-08-14 14:37:10 -0700181 OMXCodec::Create(
182 client.interface(), enc_meta, true /* createEncoder */, decoder);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700183
Andreas Huberb482ce82009-10-29 12:02:48 -0700184#if 1
Andreas Huberbe06d262009-08-14 14:37:10 -0700185 sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4");
Andreas Huberb482ce82009-10-29 12:02:48 -0700186 writer->addSource(encoder);
Andreas Huberbe06d262009-08-14 14:37:10 -0700187 writer->start();
Andreas Huberb482ce82009-10-29 12:02:48 -0700188 while (!writer->reachedEOS()) {
189 usleep(100000);
190 }
Andreas Huberbe06d262009-08-14 14:37:10 -0700191 writer->stop();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700192#else
193 encoder->start();
194
195 MediaBuffer *buffer;
Andreas Hubere915a852009-08-28 13:32:48 -0700196 while (encoder->read(&buffer) == OK) {
Andreas Huberb482ce82009-10-29 12:02:48 -0700197 int32_t isSync;
198 if (!buffer->meta_data()->findInt32(kKeyIsSyncFrame, &isSync)) {
199 isSync = false;
200 }
201
202 printf("got an output frame of size %d%s\n", buffer->range_length(),
203 isSync ? " (SYNC)" : "");
Andreas Hubere46b7be2009-07-14 16:56:47 -0700204
205 buffer->release();
206 buffer = NULL;
207 }
208
209 encoder->stop();
210#endif
211
Andreas Hubere46b7be2009-07-14 16:56:47 -0700212 client.disconnect();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700213#endif
214
215#if 0
216 CameraSource *source = CameraSource::Create();
Andreas Huber71c27d92010-03-19 11:43:15 -0700217 source->start();
218
Andreas Hubere46b7be2009-07-14 16:56:47 -0700219 printf("source = %p\n", source);
220
221 for (int i = 0; i < 100; ++i) {
222 MediaBuffer *buffer;
223 status_t err = source->read(&buffer);
Andreas Hubere915a852009-08-28 13:32:48 -0700224 CHECK_EQ(err, OK);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700225
226 printf("got a frame, data=%p, size=%d\n",
227 buffer->data(), buffer->range_length());
228
229 buffer->release();
230 buffer = NULL;
231 }
232
Andreas Huber71c27d92010-03-19 11:43:15 -0700233 source->stop();
234
Andreas Hubere46b7be2009-07-14 16:56:47 -0700235 delete source;
236 source = NULL;
237#endif
238
239 return 0;
240}
Andreas Huber4c483422009-09-02 16:05:36 -0700241#else
Andreas Huberda050cf22009-09-02 14:01:43 -0700242
243int main(int argc, char **argv) {
244 android::ProcessState::self()->startThreadPool();
245
246 OMXClient client;
247 CHECK_EQ(client.connect(), OK);
248
249 const int32_t kSampleRate = 22050;
250 const int32_t kNumChannels = 2;
251 sp<MediaSource> audioSource = new SineSource(kSampleRate, kNumChannels);
252
253#if 0
254 sp<MediaPlayerBase::AudioSink> audioSink;
255 AudioPlayer *player = new AudioPlayer(audioSink);
256 player->setSource(audioSource);
257 player->start();
258
259 sleep(10);
260
261 player->stop();
262#endif
263
264 sp<MetaData> encMeta = new MetaData;
Andreas Hubere6c40962009-09-10 14:13:30 -0700265 encMeta->setCString(kKeyMIMEType,
266 1 ? MEDIA_MIMETYPE_AUDIO_AMR_WB : MEDIA_MIMETYPE_AUDIO_AAC);
Andreas Huberda050cf22009-09-02 14:01:43 -0700267 encMeta->setInt32(kKeySampleRate, kSampleRate);
268 encMeta->setInt32(kKeyChannelCount, kNumChannels);
269 encMeta->setInt32(kKeyMaxInputSize, 8192);
270
271 sp<MediaSource> encoder =
272 OMXCodec::Create(client.interface(), encMeta, true, audioSource);
273
274 encoder->start();
275
276 int32_t n = 0;
277 status_t err;
278 MediaBuffer *buffer;
279 while ((err = encoder->read(&buffer)) == OK) {
280 printf(".");
281 fflush(stdout);
282
283 buffer->release();
284 buffer = NULL;
285
Andreas Huberee606e62009-09-08 10:19:21 -0700286 if (++n == 100) {
Andreas Huberda050cf22009-09-02 14:01:43 -0700287 break;
288 }
289 }
290 printf("$\n");
291
292 encoder->stop();
293
294 client.disconnect();
295
296 return 0;
297}
Andreas Huber4c483422009-09-02 16:05:36 -0700298#endif