diff options
author | Andreas Huber <andih@google.com> | 2010-01-14 11:31:22 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-01-14 14:09:17 -0800 |
commit | e42fdb5442d09ff6b8c82520b497f56cf14673ef (patch) | |
tree | d2a30ee3036df8ae20b9796043f8063591f756da /cmds | |
parent | faddd5d7d63d217a3e5201b6e7f476f1a0152a94 (diff) | |
download | frameworks_base-e42fdb5442d09ff6b8c82520b497f56cf14673ef.zip frameworks_base-e42fdb5442d09ff6b8c82520b497f56cf14673ef.tar.gz frameworks_base-e42fdb5442d09ff6b8c82520b497f56cf14673ef.tar.bz2 |
Upgrade for the stagefright commandline tool to support extracting thumbnails and to optionally prefer software codecs.
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/stagefright/stagefright.cpp | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp index ad6540a..e65cdf1 100644 --- a/cmds/stagefright/stagefright.cpp +++ b/cmds/stagefright/stagefright.cpp @@ -34,12 +34,14 @@ #include <media/stagefright/MetaData.h> #include <media/stagefright/OMXClient.h> #include <media/stagefright/OMXCodec.h> +#include <media/mediametadataretriever.h> using namespace android; static long gNumRepetitions; static long gMaxNumFrames; // 0 means decode all available. static long gReproduceBug; // if not -1. +static bool gPreferSoftwareCodec; static int64_t getNowUs() { struct timeval tv; @@ -59,7 +61,9 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) { rawSource = source; } else { rawSource = OMXCodec::Create( - client->interface(), meta, false /* createEncoder */, source); + client->interface(), meta, false /* createEncoder */, source, + NULL /* matchComponentName */, + gPreferSoftwareCodec ? OMXCodec::kPreferSoftwareCodecs : 0); if (rawSource == NULL) { fprintf(stderr, "Failed to instantiate decoder for '%s'.\n", mime); @@ -219,6 +223,8 @@ static void usage(const char *me) { fprintf(stderr, " -m max-number-of-frames-to-decode in each pass\n"); fprintf(stderr, " -b bug to reproduce\n"); fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); + fprintf(stderr, " -t(humbnail) extract video thumbnail\n"); + fprintf(stderr, " -s(oftware) prefer software codec\n"); } int main(int argc, char **argv) { @@ -227,12 +233,14 @@ int main(int argc, char **argv) { bool audioOnly = false; bool listComponents = false; bool dumpProfiles = false; + bool extractThumbnail = false; gNumRepetitions = 1; gMaxNumFrames = 0; gReproduceBug = -1; + gPreferSoftwareCodec = false; int res; - while ((res = getopt(argc, argv, "han:lm:b:p")) >= 0) { + while ((res = getopt(argc, argv, "han:lm:b:pts")) >= 0) { switch (res) { case 'a': { @@ -274,6 +282,18 @@ int main(int argc, char **argv) { break; } + case 't': + { + extractThumbnail = true; + break; + } + + case 's': + { + gPreferSoftwareCodec = true; + break; + } + case '?': case 'h': default: @@ -288,6 +308,34 @@ int main(int argc, char **argv) { argc -= optind; argv += optind; + if (extractThumbnail) { + sp<IServiceManager> sm = defaultServiceManager(); + sp<IBinder> binder = sm->getService(String16("media.player")); + sp<IMediaPlayerService> service = + interface_cast<IMediaPlayerService>(binder); + + CHECK(service.get() != NULL); + + sp<IMediaMetadataRetriever> retriever = + service->createMetadataRetriever(getpid()); + + CHECK(retriever != NULL); + + for (int k = 0; k < argc; ++k) { + const char *filename = argv[k]; + + CHECK_EQ(retriever->setDataSource(filename), OK); + CHECK_EQ(retriever->setMode(METADATA_MODE_FRAME_CAPTURE_ONLY), OK); + + sp<IMemory> mem = retriever->captureFrame(); + + printf("captureFrame(%s) => %s\n", + filename, mem != NULL ? "OK" : "FAILED"); + } + + return 0; + } + if (dumpProfiles) { sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder = sm->getService(String16("media.player")); @@ -389,7 +437,8 @@ int main(int argc, char **argv) { sp<MetaData> meta; size_t i; for (i = 0; i < numTracks; ++i) { - meta = extractor->getTrackMetaData(i); + meta = extractor->getTrackMetaData( + i, MediaExtractor::kIncludeExtensiveMetaData); const char *mime; meta->findCString(kKeyMIMEType, &mime); @@ -403,6 +452,12 @@ int main(int argc, char **argv) { } } + int64_t thumbTimeUs; + if (meta->findInt64(kKeyThumbnailTime, &thumbTimeUs)) { + printf("thumbnailTime: %lld us (%.2f secs)\n", + thumbTimeUs, thumbTimeUs / 1E6); + } + mediaSource = extractor->getTrack(i); } |