Loading cmds/stagefright/record.cpp +49 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -100,6 +106,7 @@ protected: private: MediaBufferGroup mGroup; int mWidth, mHeight; int mColorFormat; size_t mSize; int64_t mNumFramesOutput;; Loading Loading @@ -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]); Loading @@ -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; Loading @@ -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( Loading @@ -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) { Loading @@ -222,7 +256,7 @@ int main(int argc, char **argv) { buffer = NULL; } encoder->stop(); err = encoder->stop(); #endif printf("$\n"); Loading @@ -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 Loading Loading
cmds/stagefright/record.cpp +49 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -100,6 +106,7 @@ protected: private: MediaBufferGroup mGroup; int mWidth, mHeight; int mColorFormat; size_t mSize; int64_t mNumFramesOutput;; Loading Loading @@ -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]); Loading @@ -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; Loading @@ -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( Loading @@ -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) { Loading @@ -222,7 +256,7 @@ int main(int argc, char **argv) { buffer = NULL; } encoder->stop(); err = encoder->stop(); #endif printf("$\n"); Loading @@ -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 Loading