Loading cmds/stagefright/codec.cpp +73 −31 Original line number Diff line number Diff line Loading @@ -35,7 +35,8 @@ static void usage(const char *me) { fprintf(stderr, "usage: %s [-a] use audio\n" "\t\t[-v] use video\n" "\t\t[-p] playback\n", me); "\t\t[-p] playback\n" "\t\t[-S] allocate buffers from a surface\n", me); exit(1); } Loading @@ -49,6 +50,9 @@ struct CodecState { Vector<sp<ABuffer> > mInBuffers; Vector<sp<ABuffer> > mOutBuffers; bool mSawOutputEOS; int64_t mNumBuffersDecoded; int64_t mNumBytesDecoded; bool mIsAudio; }; } // namespace android Loading @@ -57,9 +61,12 @@ static int decode( const android::sp<android::ALooper> &looper, const char *path, bool useAudio, bool useVideo) { bool useVideo, const android::sp<android::Surface> &surface) { using namespace android; static int64_t kTimeout = 500ll; sp<NuMediaExtractor> extractor = new NuMediaExtractor; if (extractor->setDataSource(path) != OK) { fprintf(stderr, "unable to instantiate extractor.\n"); Loading @@ -78,11 +85,12 @@ static int decode( AString mime; CHECK(format->findString("mime", &mime)); if (useAudio && !haveAudio && !strncasecmp(mime.c_str(), "audio/", 6)) { bool isAudio = !strncasecmp(mime.c_str(), "audio/", 6); bool isVideo = !strncasecmp(mime.c_str(), "video/", 6); if (useAudio && !haveAudio && isAudio) { haveAudio = true; } else if (useVideo && !haveVideo && !strncasecmp(mime.c_str(), "video/", 6)) { } else if (useVideo && !haveVideo && isVideo) { haveVideo = true; } else { continue; Loading @@ -96,13 +104,17 @@ static int decode( CodecState *state = &stateByTrack.editValueAt(stateByTrack.add(i, CodecState())); state->mNumBytesDecoded = 0; state->mNumBuffersDecoded = 0; state->mIsAudio = isAudio; state->mCodec = MediaCodec::CreateByType( looper, mime.c_str(), false /* encoder */); CHECK(state->mCodec != NULL); err = state->mCodec->configure( format, NULL /* surfaceTexture */, 0 /* flags */); format, isVideo ? surface : NULL, 0 /* flags */); CHECK_EQ(err, (status_t)OK); Loading @@ -122,6 +134,8 @@ static int decode( CHECK(!stateByTrack.isEmpty()); int64_t startTimeUs = ALooper::GetNowUs(); for (size_t i = 0; i < stateByTrack.size(); ++i) { CodecState *state = &stateByTrack.editValueAt(i); Loading @@ -137,13 +151,7 @@ static int decode( while (state->mCSDIndex < state->mCSD.size()) { size_t index; status_t err = codec->dequeueInputBuffer(&index); if (err == -EAGAIN) { usleep(10000); continue; } status_t err = codec->dequeueInputBuffer(&index, -1ll); CHECK_EQ(err, (status_t)OK); const sp<ABuffer> &srcBuffer = Loading Loading @@ -179,7 +187,7 @@ static int decode( for (;;) { size_t index; err = state->mCodec->dequeueInputBuffer(&index); err = state->mCodec->dequeueInputBuffer(&index, kTimeout); if (err == -EAGAIN) { continue; Loading @@ -204,7 +212,7 @@ static int decode( CodecState *state = &stateByTrack.editValueFor(trackIndex); size_t index; err = state->mCodec->dequeueInputBuffer(&index); err = state->mCodec->dequeueInputBuffer(&index, kTimeout); if (err == OK) { ALOGV("filling input buffer %d", index); Loading Loading @@ -261,12 +269,15 @@ static int decode( uint32_t flags; status_t err = state->mCodec->dequeueOutputBuffer( &index, &offset, &size, &presentationTimeUs, &flags, 10000ll); kTimeout); if (err == OK) { ALOGV("draining output buffer %d, time = %lld us", index, presentationTimeUs); ++state->mNumBuffersDecoded; state->mNumBytesDecoded += size; err = state->mCodec->releaseOutputBuffer(index); CHECK_EQ(err, (status_t)OK); Loading @@ -292,10 +303,27 @@ static int decode( } } int64_t elapsedTimeUs = ALooper::GetNowUs() - startTimeUs; for (size_t i = 0; i < stateByTrack.size(); ++i) { CodecState *state = &stateByTrack.editValueAt(i); CHECK_EQ((status_t)OK, state->mCodec->release()); if (state->mIsAudio) { printf("track %d: %lld bytes received. %.2f KB/sec\n", i, state->mNumBytesDecoded, state->mNumBytesDecoded * 1E6 / 1024 / elapsedTimeUs); } else { printf("track %d: %lld frames decoded, %.2f fps. %lld bytes " "received. %.2f KB/sec\n", i, state->mNumBuffersDecoded, state->mNumBuffersDecoded * 1E6 / elapsedTimeUs, state->mNumBytesDecoded, state->mNumBytesDecoded * 1E6 / 1024 / elapsedTimeUs); } } return 0; Loading @@ -309,9 +337,10 @@ int main(int argc, char **argv) { bool useAudio = false; bool useVideo = false; bool playback = false; bool useSurface = false; int res; while ((res = getopt(argc, argv, "havp")) >= 0) { while ((res = getopt(argc, argv, "havpS")) >= 0) { switch (res) { case 'a': { Loading @@ -331,6 +360,12 @@ int main(int argc, char **argv) { break; } case 'S': { useSurface = true; break; } case '?': case 'h': default: Loading Loading @@ -358,8 +393,12 @@ int main(int argc, char **argv) { sp<ALooper> looper = new ALooper; looper->start(); if (playback) { sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient; sp<SurfaceComposerClient> composerClient; sp<SurfaceControl> control; sp<Surface> surface; if (playback || (useSurface && useVideo)) { composerClient = new SurfaceComposerClient; CHECK_EQ(composerClient->initCheck(), (status_t)OK); ssize_t displayWidth = composerClient->getDisplayWidth(0); Loading @@ -367,8 +406,7 @@ int main(int argc, char **argv) { ALOGV("display is %ld x %ld\n", displayWidth, displayHeight); sp<SurfaceControl> control = composerClient->createSurface( control = composerClient->createSurface( String8("A Surface"), 0, displayWidth, Loading @@ -384,9 +422,11 @@ int main(int argc, char **argv) { CHECK_EQ(control->show(), (status_t)OK); SurfaceComposerClient::closeGlobalTransaction(); sp<Surface> surface = control->getSurface(); surface = control->getSurface(); CHECK(surface != NULL); } if (playback) { sp<SimplePlayer> player = new SimplePlayer; looper->registerHandler(player); Loading @@ -396,10 +436,12 @@ int main(int argc, char **argv) { sleep(60); player->stop(); player->reset(); } else { decode(looper, argv[0], useAudio, useVideo, surface); } if (playback || (useSurface && useVideo)) { composerClient->dispose(); } else { decode(looper, argv[0], useAudio, useVideo); } looper->stop(); Loading Loading
cmds/stagefright/codec.cpp +73 −31 Original line number Diff line number Diff line Loading @@ -35,7 +35,8 @@ static void usage(const char *me) { fprintf(stderr, "usage: %s [-a] use audio\n" "\t\t[-v] use video\n" "\t\t[-p] playback\n", me); "\t\t[-p] playback\n" "\t\t[-S] allocate buffers from a surface\n", me); exit(1); } Loading @@ -49,6 +50,9 @@ struct CodecState { Vector<sp<ABuffer> > mInBuffers; Vector<sp<ABuffer> > mOutBuffers; bool mSawOutputEOS; int64_t mNumBuffersDecoded; int64_t mNumBytesDecoded; bool mIsAudio; }; } // namespace android Loading @@ -57,9 +61,12 @@ static int decode( const android::sp<android::ALooper> &looper, const char *path, bool useAudio, bool useVideo) { bool useVideo, const android::sp<android::Surface> &surface) { using namespace android; static int64_t kTimeout = 500ll; sp<NuMediaExtractor> extractor = new NuMediaExtractor; if (extractor->setDataSource(path) != OK) { fprintf(stderr, "unable to instantiate extractor.\n"); Loading @@ -78,11 +85,12 @@ static int decode( AString mime; CHECK(format->findString("mime", &mime)); if (useAudio && !haveAudio && !strncasecmp(mime.c_str(), "audio/", 6)) { bool isAudio = !strncasecmp(mime.c_str(), "audio/", 6); bool isVideo = !strncasecmp(mime.c_str(), "video/", 6); if (useAudio && !haveAudio && isAudio) { haveAudio = true; } else if (useVideo && !haveVideo && !strncasecmp(mime.c_str(), "video/", 6)) { } else if (useVideo && !haveVideo && isVideo) { haveVideo = true; } else { continue; Loading @@ -96,13 +104,17 @@ static int decode( CodecState *state = &stateByTrack.editValueAt(stateByTrack.add(i, CodecState())); state->mNumBytesDecoded = 0; state->mNumBuffersDecoded = 0; state->mIsAudio = isAudio; state->mCodec = MediaCodec::CreateByType( looper, mime.c_str(), false /* encoder */); CHECK(state->mCodec != NULL); err = state->mCodec->configure( format, NULL /* surfaceTexture */, 0 /* flags */); format, isVideo ? surface : NULL, 0 /* flags */); CHECK_EQ(err, (status_t)OK); Loading @@ -122,6 +134,8 @@ static int decode( CHECK(!stateByTrack.isEmpty()); int64_t startTimeUs = ALooper::GetNowUs(); for (size_t i = 0; i < stateByTrack.size(); ++i) { CodecState *state = &stateByTrack.editValueAt(i); Loading @@ -137,13 +151,7 @@ static int decode( while (state->mCSDIndex < state->mCSD.size()) { size_t index; status_t err = codec->dequeueInputBuffer(&index); if (err == -EAGAIN) { usleep(10000); continue; } status_t err = codec->dequeueInputBuffer(&index, -1ll); CHECK_EQ(err, (status_t)OK); const sp<ABuffer> &srcBuffer = Loading Loading @@ -179,7 +187,7 @@ static int decode( for (;;) { size_t index; err = state->mCodec->dequeueInputBuffer(&index); err = state->mCodec->dequeueInputBuffer(&index, kTimeout); if (err == -EAGAIN) { continue; Loading @@ -204,7 +212,7 @@ static int decode( CodecState *state = &stateByTrack.editValueFor(trackIndex); size_t index; err = state->mCodec->dequeueInputBuffer(&index); err = state->mCodec->dequeueInputBuffer(&index, kTimeout); if (err == OK) { ALOGV("filling input buffer %d", index); Loading Loading @@ -261,12 +269,15 @@ static int decode( uint32_t flags; status_t err = state->mCodec->dequeueOutputBuffer( &index, &offset, &size, &presentationTimeUs, &flags, 10000ll); kTimeout); if (err == OK) { ALOGV("draining output buffer %d, time = %lld us", index, presentationTimeUs); ++state->mNumBuffersDecoded; state->mNumBytesDecoded += size; err = state->mCodec->releaseOutputBuffer(index); CHECK_EQ(err, (status_t)OK); Loading @@ -292,10 +303,27 @@ static int decode( } } int64_t elapsedTimeUs = ALooper::GetNowUs() - startTimeUs; for (size_t i = 0; i < stateByTrack.size(); ++i) { CodecState *state = &stateByTrack.editValueAt(i); CHECK_EQ((status_t)OK, state->mCodec->release()); if (state->mIsAudio) { printf("track %d: %lld bytes received. %.2f KB/sec\n", i, state->mNumBytesDecoded, state->mNumBytesDecoded * 1E6 / 1024 / elapsedTimeUs); } else { printf("track %d: %lld frames decoded, %.2f fps. %lld bytes " "received. %.2f KB/sec\n", i, state->mNumBuffersDecoded, state->mNumBuffersDecoded * 1E6 / elapsedTimeUs, state->mNumBytesDecoded, state->mNumBytesDecoded * 1E6 / 1024 / elapsedTimeUs); } } return 0; Loading @@ -309,9 +337,10 @@ int main(int argc, char **argv) { bool useAudio = false; bool useVideo = false; bool playback = false; bool useSurface = false; int res; while ((res = getopt(argc, argv, "havp")) >= 0) { while ((res = getopt(argc, argv, "havpS")) >= 0) { switch (res) { case 'a': { Loading @@ -331,6 +360,12 @@ int main(int argc, char **argv) { break; } case 'S': { useSurface = true; break; } case '?': case 'h': default: Loading Loading @@ -358,8 +393,12 @@ int main(int argc, char **argv) { sp<ALooper> looper = new ALooper; looper->start(); if (playback) { sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient; sp<SurfaceComposerClient> composerClient; sp<SurfaceControl> control; sp<Surface> surface; if (playback || (useSurface && useVideo)) { composerClient = new SurfaceComposerClient; CHECK_EQ(composerClient->initCheck(), (status_t)OK); ssize_t displayWidth = composerClient->getDisplayWidth(0); Loading @@ -367,8 +406,7 @@ int main(int argc, char **argv) { ALOGV("display is %ld x %ld\n", displayWidth, displayHeight); sp<SurfaceControl> control = composerClient->createSurface( control = composerClient->createSurface( String8("A Surface"), 0, displayWidth, Loading @@ -384,9 +422,11 @@ int main(int argc, char **argv) { CHECK_EQ(control->show(), (status_t)OK); SurfaceComposerClient::closeGlobalTransaction(); sp<Surface> surface = control->getSurface(); surface = control->getSurface(); CHECK(surface != NULL); } if (playback) { sp<SimplePlayer> player = new SimplePlayer; looper->registerHandler(player); Loading @@ -396,10 +436,12 @@ int main(int argc, char **argv) { sleep(60); player->stop(); player->reset(); } else { decode(looper, argv[0], useAudio, useVideo, surface); } if (playback || (useSurface && useVideo)) { composerClient->dispose(); } else { decode(looper, argv[0], useAudio, useVideo); } looper->stop(); Loading