Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3c9fce3 authored by James Dong's avatar James Dong Committed by Android (Google) Code Review
Browse files

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

parents eb4d5b25 2749c177
Loading
Loading
Loading
Loading
+49 −11
Original line number Diff line number Diff line
@@ -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