diff options
author | James Dong <jdong@google.com> | 2010-09-21 11:41:16 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-09-21 11:41:16 -0700 |
commit | 5e64700bf7f53127d6dcf2e6207630c6fd161f8a (patch) | |
tree | 3dbe0c688f262114533f14dae50db794b43659b7 /cmds | |
parent | 0470949554faca4d7bb67b3b47e65ccc04c5194e (diff) | |
parent | 7e8a16e884632c85a54dc351c0b4f79aea116237 (diff) | |
download | frameworks_base-5e64700bf7f53127d6dcf2e6207630c6fd161f8a.zip frameworks_base-5e64700bf7f53127d6dcf2e6207630c6fd161f8a.tar.gz frameworks_base-5e64700bf7f53127d6dcf2e6207630c6fd161f8a.tar.bz2 |
am 7e8a16e8: am d3c9fce3: Merge "Allow record to set input color format as a command line option" into gingerbread
Merge commit '7e8a16e884632c85a54dc351c0b4f79aea116237'
* commit '7e8a16e884632c85a54dc351c0b4f79aea116237':
Allow record to set input color format as a command line option
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/stagefright/record.cpp | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp index c424281..b718299 100644 --- a/cmds/stagefright/record.cpp +++ b/cmds/stagefright/record.cpp @@ -36,24 +36,30 @@ static const int32_t kFramerate = 24; // fps static const int32_t kIFramesIntervalSec = 1; static const int32_t kVideoBitRate = 512 * 1024; static const int32_t kAudioBitRate = 12200; -static const int32_t kColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; static const int64_t kDurationUs = 10000000LL; // 10 seconds #if 1 class DummySource : public MediaSource { public: - DummySource(int width, int height) + DummySource(int width, int height, int colorFormat) : mWidth(width), mHeight(height), + mColorFormat(colorFormat), mSize((width * height * 3) / 2) { mGroup.add_buffer(new MediaBuffer(mSize)); + + // Check the color format to make sure + // that the buffer size mSize it set correctly above. + CHECK(colorFormat == OMX_COLOR_FormatYUV420SemiPlanar || + colorFormat == OMX_COLOR_FormatYUV420Planar); } virtual sp<MetaData> getFormat() { sp<MetaData> meta = new MetaData; meta->setInt32(kKeyWidth, mWidth); meta->setInt32(kKeyHeight, mHeight); + meta->setInt32(kKeyColorFormat, mColorFormat); meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); return meta; @@ -100,6 +106,7 @@ protected: private: MediaBufferGroup mGroup; int mWidth, mHeight; + int mColorFormat; size_t mSize; int64_t mNumFramesOutput;; @@ -139,20 +146,47 @@ sp<MediaSource> createSource(const char *filename) { return source; } +enum { + kYUV420SP = 0, + kYUV420P = 1, +}; + +// returns -1 if mapping of the given color is unsuccessful +// returns an omx color enum value otherwise +static int translateColorToOmxEnumValue(int color) { + switch (color) { + case kYUV420SP: + return OMX_COLOR_FormatYUV420SemiPlanar; + case kYUV420P: + return OMX_COLOR_FormatYUV420Planar; + default: + fprintf(stderr, "Unsupported color: %d\n", color); + return -1; + } +} + int main(int argc, char **argv) { android::ProcessState::self()->startThreadPool(); DataSource::RegisterDefaultSniffers(); #if 1 - if (argc != 2) { - fprintf(stderr, "usage: %s filename\n", argv[0]); + if (argc != 3) { + fprintf(stderr, "usage: %s <filename> <input_color_format>\n", argv[0]); + fprintf(stderr, " <input_color_format>: 0 (YUV420SP) or 1 (YUV420P)\n"); return 1; } + int colorFormat = translateColorToOmxEnumValue(atoi(argv[2])); + if (colorFormat == -1) { + fprintf(stderr, "input color format must be 0 (YUV420SP) or 1 (YUV420P)\n"); + return 1; + } OMXClient client; CHECK_EQ(client.connect(), OK); + status_t err = OK; + #if 0 sp<MediaSource> source = createSource(argv[1]); @@ -173,7 +207,7 @@ int main(int argc, char **argv) { #else int width = 720; int height = 480; - sp<MediaSource> decoder = new DummySource(width, height); + sp<MediaSource> decoder = new DummySource(width, height, colorFormat); #endif sp<MetaData> enc_meta = new MetaData; @@ -187,7 +221,7 @@ int main(int argc, char **argv) { enc_meta->setInt32(kKeyStride, width); enc_meta->setInt32(kKeySliceHeight, height); enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec); - enc_meta->setInt32(kKeyColorFormat, kColorFormat); + enc_meta->setInt32(kKeyColorFormat, colorFormat); sp<MediaSource> encoder = OMXCodec::Create( @@ -197,14 +231,14 @@ int main(int argc, char **argv) { sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4"); writer->addSource(encoder); writer->setMaxFileDuration(kDurationUs); - writer->start(); + CHECK_EQ(OK, writer->start()); while (!writer->reachedEOS()) { fprintf(stderr, "."); usleep(100000); } - writer->stop(); + err = writer->stop(); #else - encoder->start(); + CHECK_EQ(OK, encoder->start()); MediaBuffer *buffer; while (encoder->read(&buffer) == OK) { @@ -222,7 +256,7 @@ int main(int argc, char **argv) { buffer = NULL; } - encoder->stop(); + err = encoder->stop(); #endif printf("$\n"); @@ -247,12 +281,16 @@ int main(int argc, char **argv) { buffer = NULL; } - source->stop(); + err = source->stop(); delete source; source = NULL; #endif + if (err != OK && err != ERROR_END_OF_STREAM) { + fprintf(stderr, "record failed: %d\n", err); + return 1; + } return 0; } #else |