Merge "Allow record to set input color format as a command line option" into gingerbread

This commit is contained in:
James Dong
2010-09-21 11:34:26 -07:00
committed by Android (Google) Code Review

View File

@ -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