stagefright.cpp revision 1c70247536457f7b7fa84daa3482bd3d3b44e225
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/time.h> 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdlib.h> 202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <string.h> 212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <unistd.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber#include "SineSource.h" 24a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/ProcessState.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h> 28a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber#include <media/stagefright/AudioPlayer.h> 291c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber#include <media/stagefright/DataSource.h> 30777893a928680f09e306b4b9efc1d5cf4479a9daAndreas Huber#include <media/stagefright/JPEGSource.h> 31693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaDebug.h> 3218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 331c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber#include <media/stagefright/MediaErrors.h> 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaExtractor.h> 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h> 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h> 38693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h> 395c1e3581978164d169050686c73810ce59304471Andreas Huber#include <media/mediametadataretriever.h> 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android; 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic long gNumRepetitions; 4438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huberstatic long gMaxNumFrames; // 0 means decode all available. 4580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huberstatic long gReproduceBug; // if not -1. 465c1e3581978164d169050686c73810ce59304471Andreas Huberstatic bool gPreferSoftwareCodec; 47a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huberstatic bool gPlaybackAudio; 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic int64_t getNowUs() { 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct timeval tv; 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber gettimeofday(&tv, NULL); 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53d2858f047b2c52d719719532f24899c0e03c2099Andreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll; 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic void playSource(OMXClient *client, const sp<MediaSource> &source) { 57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = source->getFormat(); 58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 59125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber const char *mime; 60125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 61125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber 62125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber sp<MediaSource> rawSource; 63125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mime)) { 64125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = source; 65125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } else { 66125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = OMXCodec::Create( 675c1e3581978164d169050686c73810ce59304471Andreas Huber client->interface(), meta, false /* createEncoder */, source, 685c1e3581978164d169050686c73810ce59304471Andreas Huber NULL /* matchComponentName */, 695c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec ? OMXCodec::kPreferSoftwareCodecs : 0); 70693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 71125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (rawSource == NULL) { 72125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber fprintf(stderr, "Failed to instantiate decoder for '%s'.\n", mime); 73125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber return; 74125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 77139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = rawSource->start(); 78139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 79139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 80139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber fprintf(stderr, "rawSource returned error %d (0x%08x)\n", err, err); 81139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return; 82139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 83693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 84a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio) { 85a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber AudioPlayer *player = new AudioPlayer(NULL); 86a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->setSource(rawSource); 8764105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber rawSource.clear(); 88a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 89a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->start(true /* sourceAlreadyStarted */); 90a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 91a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber status_t finalStatus; 92a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber while (!player->reachedEOS(&finalStatus)) { 93a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber usleep(100000ll); 94a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 95a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 96a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber delete player; 97a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player = NULL; 9864105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber 9964105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber return; 100a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (gReproduceBug >= 3 && gReproduceBug <= 5) { 101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt64(kKeyDuration, &durationUs)); 103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1045228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber status_t err; 1055228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaBuffer *buffer; 1065228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaSource::ReadOptions options; 1075228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber int64_t seekTimeUs = -1; 1085228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber for (;;) { 109125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber err = rawSource->read(&buffer, &options); 1105228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.clearSeekTo(); 1115228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1125228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool shouldSeek = false; 1137f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1147f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber CHECK_EQ(buffer, NULL); 1157f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 1167f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 1177f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 1187f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } else if (err != OK) { 1195228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("reached EOF.\n"); 1205228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1215228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = true; 1225228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } else { 12348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t timestampUs; 12448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs)); 1255228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1265228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool failed = false; 127af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 1285228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (seekTimeUs >= 0) { 12948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t diff = timestampUs - seekTimeUs; 1305228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 131af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (diff < 0) { 132af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber diff = -diff; 133af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 134af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 135af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if ((gReproduceBug == 4 && diff > 500000) 136af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber || (gReproduceBug == 5 && timestampUs < 0)) { 137af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber printf("wanted: %.2f secs, got: %.2f secs\n", 138af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs / 1E6, timestampUs / 1E6); 1395228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1405228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("ERROR: "); 1415228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber failed = true; 1425228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1435228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1445228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1455228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("buffer has timestamp %lld us (%.2f secs)\n", 14648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber timestampUs, timestampUs / 1E6); 1475228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1485228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer->release(); 1495228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer = NULL; 1505228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1515228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (failed) { 1525228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber break; 1535228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1545228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1555228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = ((double)rand() / RAND_MAX) < 0.1; 156af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 157af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (gReproduceBug == 3) { 158af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber shouldSeek = false; 159af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 1605228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1615228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1625228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs = -1; 1635228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1645228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (shouldSeek) { 165af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs = (rand() * (float)durationUs) / RAND_MAX; 1665228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.setSeekTo(seekTimeUs); 1675228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1685228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("seeking to %lld us (%.2f secs)\n", 1695228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs, seekTimeUs / 1E6); 1705228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1715228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1725228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 173125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 1745228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1755228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber return; 1765228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1775228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int n = 0; 179693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t startTime = getNowUs(); 180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long numIterationsLeft = gNumRepetitions; 1822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaSource::ReadOptions options; 183dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber 18436e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t sumDecodeUs = 0; 1857f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber int64_t totalBytes = 0; 18636e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 1872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber while (numIterationsLeft-- > 0) { 18838b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber long numFrames = 0; 18938b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 1902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer *buffer; 1912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 19336e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t startDecodeUs = getNowUs(); 194125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber status_t err = rawSource->read(&buffer, &options); 19536e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t delayDecodeUs = getNowUs() - startDecodeUs; 19636e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 1972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.clearSeekTo(); 1982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (err != OK) { 2002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK_EQ(buffer, NULL); 2017f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2027f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 2037f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 2047f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 2057f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } 2067f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 210ab0f94d68bcb74547c8191bd4c47a9ad1b7c7c48Andreas Huber if (buffer->range_length() > 0 && (n++ % 16) == 0) { 2112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("."); 2122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 2132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 21536e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber sumDecodeUs += delayDecodeUs; 2167f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber totalBytes += buffer->range_length(); 21736e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 2182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 2192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 22038b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 22138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber ++numFrames; 22238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (gMaxNumFrames > 0 && numFrames == gMaxNumFrames) { 22338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber break; 22438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 22580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber 22680011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber if (gReproduceBug == 1 && numFrames == 40) { 22780011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber printf("seeking past the end now."); 228a8a371c8a0d88d144d095404673d00cae6464fdeAndreas Huber options.setSeekTo(0x7fffffffL); 229e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber } else if (gReproduceBug == 2 && numFrames == 40) { 230e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber printf("seeking to 5 secs."); 231e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber options.setSeekTo(5000000); 23280011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } 233693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 234693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("$"); 2362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 2372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.setSeekTo(0); 239693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 241125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 242693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 243693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 244693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t delay = getNowUs() - startTime; 2457f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber if (!strncasecmp("video/", mime, 6)) { 2467f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f fps\n", n * 1E6 / delay); 247693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2487f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. time to decode one buffer %.2f usecs\n", 2497f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber (double)sumDecodeUs / n); 2507f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 2517f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %d frame(s).\n", n); 2527f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } else if (!strncasecmp("audio/", mime, 6)) { 2537f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // Frame count makes less sense for audio, as the output buffer 2547f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // sizes may be different across decoders. 2557f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f KB/sec\n", totalBytes / 1024 * 1E6 / delay); 2567f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 2577f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %lld bytes\n", totalBytes); 2587f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } 259693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 260693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic void usage(const char *me) { 2622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, "usage: %s\n", me); 2632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -h(elp)\n"); 2642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -a(udio)\n"); 2652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -n repetitions\n"); 2662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -l(ist) components\n"); 26738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber fprintf(stderr, " -m max-number-of-frames-to-decode in each pass\n"); 26880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber fprintf(stderr, " -b bug to reproduce\n"); 26918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); 2701b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); 2715c1e3581978164d169050686c73810ce59304471Andreas Huber fprintf(stderr, " -s(oftware) prefer software codec\n"); 272a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, " -o playback audio\n"); 2732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 2742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint main(int argc, char **argv) { 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber android::ProcessState::self()->startThreadPool(); 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2780024245e134467d120b40099da16c467dc365e76Andreas Huber bool audioOnly = false; 2792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool listComponents = false; 28018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber bool dumpProfiles = false; 2815c1e3581978164d169050686c73810ce59304471Andreas Huber bool extractThumbnail = false; 2822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber gNumRepetitions = 1; 28338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = 0; 28480011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = -1; 2855c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = false; 286a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 2872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int res; 289a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber while ((res = getopt(argc, argv, "han:lm:b:ptso")) >= 0) { 2902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (res) { 2912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'a': 2922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber audioOnly = true; 2942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'l': 2982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber listComponents = true; 3002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 30338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber case 'm': 3042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'n': 30580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber case 'b': 3062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 3072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber char *end; 3082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long x = strtol(optarg, &end, 10); 3092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (*end != '\0' || end == optarg || x <= 0) { 3112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber x = 1; 3122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 31438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (res == 'n') { 31538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gNumRepetitions = x; 31680011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else if (res == 'm') { 31738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = x; 31880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else { 31980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber CHECK_EQ(res, 'b'); 32080011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = x; 32138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 3222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 32518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber case 'p': 32618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { 32718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber dumpProfiles = true; 32818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber break; 32918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 33018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 3315c1e3581978164d169050686c73810ce59304471Andreas Huber case 't': 3325c1e3581978164d169050686c73810ce59304471Andreas Huber { 3335c1e3581978164d169050686c73810ce59304471Andreas Huber extractThumbnail = true; 3345c1e3581978164d169050686c73810ce59304471Andreas Huber break; 3355c1e3581978164d169050686c73810ce59304471Andreas Huber } 3365c1e3581978164d169050686c73810ce59304471Andreas Huber 3375c1e3581978164d169050686c73810ce59304471Andreas Huber case 's': 3385c1e3581978164d169050686c73810ce59304471Andreas Huber { 3395c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = true; 3405c1e3581978164d169050686c73810ce59304471Andreas Huber break; 3415c1e3581978164d169050686c73810ce59304471Andreas Huber } 3425c1e3581978164d169050686c73810ce59304471Andreas Huber 343a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber case 'o': 344a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber { 345a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = true; 346a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber break; 347a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 348a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 3492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case '?': 3502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'h': 3512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 3522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 3532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber usage(argv[0]); 3542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber exit(1); 3552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 360a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio && !audioOnly) { 361a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber // This doesn't make any sense if we're decoding the video track. 362a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 363a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 364a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 3652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argc -= optind; 3662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argv += optind; 3672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3685c1e3581978164d169050686c73810ce59304471Andreas Huber if (extractThumbnail) { 3695c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 3705c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 3715c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaPlayerService> service = 3725c1e3581978164d169050686c73810ce59304471Andreas Huber interface_cast<IMediaPlayerService>(binder); 3735c1e3581978164d169050686c73810ce59304471Andreas Huber 3745c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(service.get() != NULL); 3755c1e3581978164d169050686c73810ce59304471Andreas Huber 3765c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaMetadataRetriever> retriever = 3775c1e3581978164d169050686c73810ce59304471Andreas Huber service->createMetadataRetriever(getpid()); 3785c1e3581978164d169050686c73810ce59304471Andreas Huber 3795c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(retriever != NULL); 3805c1e3581978164d169050686c73810ce59304471Andreas Huber 3815c1e3581978164d169050686c73810ce59304471Andreas Huber for (int k = 0; k < argc; ++k) { 3825c1e3581978164d169050686c73810ce59304471Andreas Huber const char *filename = argv[k]; 3835c1e3581978164d169050686c73810ce59304471Andreas Huber 3845c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK_EQ(retriever->setDataSource(filename), OK); 3851b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber CHECK_EQ(retriever->setMode( 3861b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber METADATA_MODE_FRAME_CAPTURE_AND_METADATA_RETRIEVAL), 3871b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber OK); 3885c1e3581978164d169050686c73810ce59304471Andreas Huber 3895c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMemory> mem = retriever->captureFrame(); 3905c1e3581978164d169050686c73810ce59304471Andreas Huber 3911b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 3921b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("captureFrame(%s) => OK\n", filename); 3931b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } else { 3941b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber mem = retriever->extractAlbumArt(); 3951b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber 3961b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 3971b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("extractAlbumArt(%s) => OK\n", filename); 3981b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } else { 3991b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("both captureFrame and extractAlbumArt " 4001b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber "failed on file '%s'.\n", filename); 4011b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 4021b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 4035c1e3581978164d169050686c73810ce59304471Andreas Huber } 4045c1e3581978164d169050686c73810ce59304471Andreas Huber 4055c1e3581978164d169050686c73810ce59304471Andreas Huber return 0; 4065c1e3581978164d169050686c73810ce59304471Andreas Huber } 4075c1e3581978164d169050686c73810ce59304471Andreas Huber 40818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (dumpProfiles) { 40918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 41018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 41118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IMediaPlayerService> service = 41218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber interface_cast<IMediaPlayerService>(binder); 41318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 41418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(service.get() != NULL); 41518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 41718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(omx.get() != NULL); 41818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 41918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const char *kMimeTypes[] = { 42018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber MEDIA_MIMETYPE_VIDEO_AVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 42108a88e195d2b3697f2f967e9216491e8c5bd3c9eAndreas Huber MEDIA_MIMETYPE_VIDEO_H263, MEDIA_MIMETYPE_AUDIO_AAC, 42208a88e195d2b3697f2f967e9216491e8c5bd3c9eAndreas Huber MEDIA_MIMETYPE_AUDIO_AMR_NB, MEDIA_MIMETYPE_AUDIO_AMR_WB, 42308a88e195d2b3697f2f967e9216491e8c5bd3c9eAndreas Huber MEDIA_MIMETYPE_AUDIO_MPEG 42418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber }; 42518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 42618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t k = 0; k < sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); 42718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber ++k) { 42818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("type '%s':\n", kMimeTypes[k]); 42918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 43018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber Vector<CodecCapabilities> results; 43118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK_EQ(QueryCodecs(omx, kMimeTypes[k], 43218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber true, // queryDecoders 43318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber &results), OK); 43418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 43518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t i = 0; i < results.size(); ++i) { 43618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf(" decoder '%s' supports ", 43718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results[i].mComponentName.string()); 43818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 43918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (results[i].mProfileLevels.size() == 0) { 44018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("NOTHING.\n"); 44118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber continue; 44218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 44318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 44418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t j = 0; j < results[i].mProfileLevels.size(); ++j) { 44518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const CodecProfileLevel &profileLevel = 44618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results[i].mProfileLevels[j]; 44718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 44818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("%s%ld/%ld", j > 0 ? ", " : "", 44918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber profileLevel.mProfile, profileLevel.mLevel); 45018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 45118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 45218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("\n"); 45318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 45418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 45518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 45618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 4572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (listComponents) { 45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 462693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(service.get() != NULL); 46320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 464318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 465693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(omx.get() != NULL); 46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 467134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<IOMX::ComponentInfo> list; 468318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber omx->listNodes(&list); 46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 470134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<IOMX::ComponentInfo>::iterator it = list.begin(); 47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 472134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber printf("%s\n", (*it).mName.string()); 47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource::RegisterDefaultSniffers(); 47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMXClient client; 47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = client.connect(); 48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (int k = 0; k < argc; ++k) { 4822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *filename = argv[k]; 48320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4841c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber sp<DataSource> dataSource = DataSource::CreateFromURI(filename); 4850024245e134467d120b40099da16c467dc365e76Andreas Huber 486a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (dataSource == NULL) { 487a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, "Unable to create data source.\n"); 488a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber return 1; 489a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 490a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 4912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool isJPEG = false; 49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t len = strlen(filename); 4942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (len >= 4 && !strcasecmp(filename + len - 4, ".jpg")) { 4952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber isJPEG = true; 4962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaSource> mediaSource; 49920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (isJPEG) { 5012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = new JPEGSource(dataSource); 502a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (!strncasecmp("sine:", filename, 5)) { 503a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber char *end; 504a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber long sampleRate = strtol(filename + 5, &end, 10); 505a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 506a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (end == filename + 5) { 507a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber sampleRate = 44100; 508a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 509a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber mediaSource = new SineSource(sampleRate, 1); 5102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } else { 5112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 512b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong if (extractor == NULL) { 513a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, "could not create extractor.\n"); 514b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong return -1; 515b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong } 51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t numTracks = extractor->countTracks(); 51820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MetaData> meta; 5202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t i; 5212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (i = 0; i < numTracks; ++i) { 5225c1e3581978164d169050686c73810ce59304471Andreas Huber meta = extractor->getTrackMetaData( 5235c1e3581978164d169050686c73810ce59304471Andreas Huber i, MediaExtractor::kIncludeExtensiveMetaData); 52420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *mime; 5262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->findCString(kKeyMIMEType, &mime); 52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (audioOnly && !strncasecmp(mime, "audio/", 6)) { 5292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 5302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 5312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 5322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!audioOnly && !strncasecmp(mime, "video/", 6)) { 5332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 5342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 535a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 536a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber meta = NULL; 537a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 538a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 539a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (meta == NULL) { 540a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, 541a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber "No suitable %s track found. The '-a' option will " 542a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber "target audio tracks only, the default is to target " 543a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber "video tracks only.\n", 544a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber audioOnly ? "audio" : "video"); 545a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber return -1; 546693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 5472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 5485c1e3581978164d169050686c73810ce59304471Andreas Huber int64_t thumbTimeUs; 5495c1e3581978164d169050686c73810ce59304471Andreas Huber if (meta->findInt64(kKeyThumbnailTime, &thumbTimeUs)) { 5505c1e3581978164d169050686c73810ce59304471Andreas Huber printf("thumbnailTime: %lld us (%.2f secs)\n", 5515c1e3581978164d169050686c73810ce59304471Andreas Huber thumbTimeUs, thumbTimeUs / 1E6); 5525c1e3581978164d169050686c73810ce59304471Andreas Huber } 5535c1e3581978164d169050686c73810ce59304471Andreas Huber 5542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = extractor->getTrack(i); 55520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 55620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber playSource(&client, mediaSource); 55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber client.disconnect(); 56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 0; 56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 564