am 30e9c2d4: am db281311: Merge "Better diagnostics in the stagefright commandline tool, support for playing sine-tones using a filename of "sine:[samplingrate]", i.e. sine:44100. Support for playing audio through to the speakers by using "-o" in addition to "-a"." in

Merge commit '30e9c2d4db145e02b5312ce29606b03dd78349d3' into kraken

* commit '30e9c2d4db145e02b5312ce29606b03dd78349d3':
  Better diagnostics in the stagefright commandline tool, support for playing sine-tones using a filename of "sine:[samplingrate]", i.e. sine:44100. Support for playing audio through to the speakers by using "-o" in addition to "-a".
This commit is contained in:
Andreas Huber
2010-04-13 12:23:28 -07:00
committed by Android Git Automerger
3 changed files with 60 additions and 5 deletions

View File

@@ -5,7 +5,8 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \ LOCAL_SRC_FILES:= \
stagefright.cpp stagefright.cpp \
SineSource.cpp
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
libstagefright libmedia libutils libbinder libstagefright libmedia libutils libbinder

View File

@@ -20,9 +20,12 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include "SineSource.h"
#include <binder/IServiceManager.h> #include <binder/IServiceManager.h>
#include <binder/ProcessState.h> #include <binder/ProcessState.h>
#include <media/IMediaPlayerService.h> #include <media/IMediaPlayerService.h>
#include <media/stagefright/AudioPlayer.h>
#include <media/stagefright/CachingDataSource.h> #include <media/stagefright/CachingDataSource.h>
#include <media/stagefright/FileSource.h> #include <media/stagefright/FileSource.h>
#include <media/stagefright/HTTPDataSource.h> #include <media/stagefright/HTTPDataSource.h>
@@ -42,6 +45,7 @@ static long gNumRepetitions;
static long gMaxNumFrames; // 0 means decode all available. static long gMaxNumFrames; // 0 means decode all available.
static long gReproduceBug; // if not -1. static long gReproduceBug; // if not -1.
static bool gPreferSoftwareCodec; static bool gPreferSoftwareCodec;
static bool gPlaybackAudio;
static int64_t getNowUs() { static int64_t getNowUs() {
struct timeval tv; struct timeval tv;
@@ -73,7 +77,20 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) {
rawSource->start(); 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; int64_t durationUs;
CHECK(meta->findInt64(kKeyDuration, &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, " -p(rofiles) dump decoder profiles supported\n");
fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n");
fprintf(stderr, " -s(oftware) prefer software codec\n"); fprintf(stderr, " -s(oftware) prefer software codec\n");
fprintf(stderr, " -o playback audio\n");
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
@@ -258,9 +276,10 @@ int main(int argc, char **argv) {
gMaxNumFrames = 0; gMaxNumFrames = 0;
gReproduceBug = -1; gReproduceBug = -1;
gPreferSoftwareCodec = false; gPreferSoftwareCodec = false;
gPlaybackAudio = false;
int res; int res;
while ((res = getopt(argc, argv, "han:lm:b:pts")) >= 0) { while ((res = getopt(argc, argv, "han:lm:b:ptso")) >= 0) {
switch (res) { switch (res) {
case 'a': case 'a':
{ {
@@ -314,6 +333,12 @@ int main(int argc, char **argv) {
break; break;
} }
case 'o':
{
gPlaybackAudio = true;
break;
}
case '?': case '?':
case 'h': case 'h':
default: 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; argc -= optind;
argv += optind; argv += optind;
@@ -456,6 +486,11 @@ int main(int argc, char **argv) {
dataSource = new FileSource(filename); dataSource = new FileSource(filename);
} }
if (dataSource == NULL) {
fprintf(stderr, "Unable to create data source.\n");
return 1;
}
bool isJPEG = false; bool isJPEG = false;
size_t len = strlen(filename); size_t len = strlen(filename);
@@ -467,10 +502,18 @@ int main(int argc, char **argv) {
if (isJPEG) { if (isJPEG) {
mediaSource = new JPEGSource(dataSource); 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 { } else {
sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
if (extractor == NULL) { if (extractor == NULL) {
fprintf(stderr, "could not create data source\n"); fprintf(stderr, "could not create extractor.\n");
return -1; return -1;
} }
@@ -492,6 +535,17 @@ int main(int argc, char **argv) {
if (!audioOnly && !strncasecmp(mime, "video/", 6)) { if (!audioOnly && !strncasecmp(mime, "video/", 6)) {
break; 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; int64_t thumbTimeUs;

View File

@@ -102,7 +102,7 @@ status_t AudioPlayer::start(bool sourceAlreadyStarted) {
(numChannels == 2) (numChannels == 2)
? AudioSystem::CHANNEL_OUT_STEREO ? AudioSystem::CHANNEL_OUT_STEREO
: AudioSystem::CHANNEL_OUT_MONO, : AudioSystem::CHANNEL_OUT_MONO,
8192, 0, &AudioCallback, this, 0); 0, 0, &AudioCallback, this, 0);
if ((err = mAudioTrack->initCheck()) != OK) { if ((err = mAudioTrack->initCheck()) != OK) {
delete mAudioTrack; delete mAudioTrack;