diff options
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/stagefright/Android.mk | 3 | ||||
-rw-r--r-- | cmds/stagefright/stagefright.cpp | 60 |
2 files changed, 59 insertions, 4 deletions
diff --git a/cmds/stagefright/Android.mk b/cmds/stagefright/Android.mk index 52f767e..34648b5 100644 --- a/cmds/stagefright/Android.mk +++ b/cmds/stagefright/Android.mk @@ -5,7 +5,8 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ - stagefright.cpp + stagefright.cpp \ + SineSource.cpp LOCAL_SHARED_LIBRARIES := \ libstagefright libmedia libutils libbinder diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp index fec9e1a..4405da6 100644 --- a/cmds/stagefright/stagefright.cpp +++ b/cmds/stagefright/stagefright.cpp @@ -20,9 +20,12 @@ #include <string.h> #include <unistd.h> +#include "SineSource.h" + #include <binder/IServiceManager.h> #include <binder/ProcessState.h> #include <media/IMediaPlayerService.h> +#include <media/stagefright/AudioPlayer.h> #include <media/stagefright/CachingDataSource.h> #include <media/stagefright/FileSource.h> #include <media/stagefright/HTTPDataSource.h> @@ -42,6 +45,7 @@ static long gNumRepetitions; static long gMaxNumFrames; // 0 means decode all available. static long gReproduceBug; // if not -1. static bool gPreferSoftwareCodec; +static bool gPlaybackAudio; static int64_t getNowUs() { struct timeval tv; @@ -73,7 +77,20 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) { rawSource->start(); - if (gReproduceBug >= 3 && gReproduceBug <= 5) { + if (gPlaybackAudio) { + AudioPlayer *player = new AudioPlayer(NULL); + player->setSource(rawSource); + + player->start(true /* sourceAlreadyStarted */); + + status_t finalStatus; + while (!player->reachedEOS(&finalStatus)) { + usleep(100000ll); + } + + delete player; + player = NULL; + } else if (gReproduceBug >= 3 && gReproduceBug <= 5) { int64_t durationUs; CHECK(meta->findInt64(kKeyDuration, &durationUs)); @@ -245,6 +262,7 @@ static void usage(const char *me) { fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); fprintf(stderr, " -s(oftware) prefer software codec\n"); + fprintf(stderr, " -o playback audio\n"); } int main(int argc, char **argv) { @@ -258,9 +276,10 @@ int main(int argc, char **argv) { gMaxNumFrames = 0; gReproduceBug = -1; gPreferSoftwareCodec = false; + gPlaybackAudio = false; int res; - while ((res = getopt(argc, argv, "han:lm:b:pts")) >= 0) { + while ((res = getopt(argc, argv, "han:lm:b:ptso")) >= 0) { switch (res) { case 'a': { @@ -314,6 +333,12 @@ int main(int argc, char **argv) { break; } + case 'o': + { + gPlaybackAudio = true; + break; + } + case '?': case 'h': default: @@ -325,6 +350,11 @@ int main(int argc, char **argv) { } } + if (gPlaybackAudio && !audioOnly) { + // This doesn't make any sense if we're decoding the video track. + gPlaybackAudio = false; + } + argc -= optind; argv += optind; @@ -456,6 +486,11 @@ int main(int argc, char **argv) { dataSource = new FileSource(filename); } + if (dataSource == NULL) { + fprintf(stderr, "Unable to create data source.\n"); + return 1; + } + bool isJPEG = false; size_t len = strlen(filename); @@ -467,10 +502,18 @@ int main(int argc, char **argv) { if (isJPEG) { mediaSource = new JPEGSource(dataSource); + } else if (!strncasecmp("sine:", filename, 5)) { + char *end; + long sampleRate = strtol(filename + 5, &end, 10); + + if (end == filename + 5) { + sampleRate = 44100; + } + mediaSource = new SineSource(sampleRate, 1); } else { sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); if (extractor == NULL) { - fprintf(stderr, "could not create data source\n"); + fprintf(stderr, "could not create extractor.\n"); return -1; } @@ -492,6 +535,17 @@ int main(int argc, char **argv) { if (!audioOnly && !strncasecmp(mime, "video/", 6)) { break; } + + meta = NULL; + } + + if (meta == NULL) { + fprintf(stderr, + "No suitable %s track found. The '-a' option will " + "target audio tracks only, the default is to target " + "video tracks only.\n", + audioOnly ? "audio" : "video"); + return -1; } int64_t thumbTimeUs; |