stagefright.cpp revision a98420e863c374d1f15309467f2a1fc58d979d3b
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> 292ea76ead54982376e32ab196093babded80e05e4Andreas Huber#include <media/stagefright/CachingDataSource.h> 30bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 312ea76ead54982376e32ab196093babded80e05e4Andreas Huber#include <media/stagefright/HTTPDataSource.h> 32777893a928680f09e306b4b9efc1d5cf4479a9daAndreas Huber#include <media/stagefright/JPEGSource.h> 33693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaDebug.h> 3418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaExtractor.h> 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h> 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h> 39693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h> 405c1e3581978164d169050686c73810ce59304471Andreas Huber#include <media/mediametadataretriever.h> 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android; 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic long gNumRepetitions; 4538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huberstatic long gMaxNumFrames; // 0 means decode all available. 4680011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huberstatic long gReproduceBug; // if not -1. 475c1e3581978164d169050686c73810ce59304471Andreas Huberstatic bool gPreferSoftwareCodec; 48a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huberstatic bool gPlaybackAudio; 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic int64_t getNowUs() { 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct timeval tv; 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber gettimeofday(&tv, NULL); 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 54d2858f047b2c52d719719532f24899c0e03c2099Andreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll; 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic void playSource(OMXClient *client, const sp<MediaSource> &source) { 58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = source->getFormat(); 59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 60125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber const char *mime; 61125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 62125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber 63125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber sp<MediaSource> rawSource; 64125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mime)) { 65125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = source; 66125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } else { 67125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = OMXCodec::Create( 685c1e3581978164d169050686c73810ce59304471Andreas Huber client->interface(), meta, false /* createEncoder */, source, 695c1e3581978164d169050686c73810ce59304471Andreas Huber NULL /* matchComponentName */, 705c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec ? OMXCodec::kPreferSoftwareCodecs : 0); 71693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 72125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (rawSource == NULL) { 73125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber fprintf(stderr, "Failed to instantiate decoder for '%s'.\n", mime); 74125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber return; 75125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } 76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 78125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->start(); 79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 80a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio) { 81a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber AudioPlayer *player = new AudioPlayer(NULL); 82a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->setSource(rawSource); 83a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 84a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->start(true /* sourceAlreadyStarted */); 85a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 86a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber status_t finalStatus; 87a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber while (!player->reachedEOS(&finalStatus)) { 88a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber usleep(100000ll); 89a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 90a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 91a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber delete player; 92a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player = NULL; 93a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (gReproduceBug >= 3 && gReproduceBug <= 5) { 94bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 95bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt64(kKeyDuration, &durationUs)); 96bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 975228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber status_t err; 985228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaBuffer *buffer; 995228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaSource::ReadOptions options; 1005228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber int64_t seekTimeUs = -1; 1015228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber for (;;) { 102125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber err = rawSource->read(&buffer, &options); 1035228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.clearSeekTo(); 1045228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1055228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool shouldSeek = false; 1067f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1077f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber CHECK_EQ(buffer, NULL); 1087f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 1097f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 1107f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 1117f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } else if (err != OK) { 1125228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("reached EOF.\n"); 1135228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1145228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = true; 1155228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } else { 11648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t timestampUs; 11748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs)); 1185228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1195228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool failed = false; 120af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 1215228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (seekTimeUs >= 0) { 12248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t diff = timestampUs - seekTimeUs; 1235228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 124af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (diff < 0) { 125af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber diff = -diff; 126af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 127af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 128af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if ((gReproduceBug == 4 && diff > 500000) 129af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber || (gReproduceBug == 5 && timestampUs < 0)) { 130af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber printf("wanted: %.2f secs, got: %.2f secs\n", 131af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs / 1E6, timestampUs / 1E6); 1325228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1335228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("ERROR: "); 1345228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber failed = true; 1355228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1365228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1375228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1385228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("buffer has timestamp %lld us (%.2f secs)\n", 13948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber timestampUs, timestampUs / 1E6); 1405228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1415228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer->release(); 1425228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer = NULL; 1435228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1445228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (failed) { 1455228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber break; 1465228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1475228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1485228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = ((double)rand() / RAND_MAX) < 0.1; 149af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 150af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (gReproduceBug == 3) { 151af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber shouldSeek = false; 152af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 1535228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1545228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1555228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs = -1; 1565228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1575228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (shouldSeek) { 158af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs = (rand() * (float)durationUs) / RAND_MAX; 1595228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.setSeekTo(seekTimeUs); 1605228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1615228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("seeking to %lld us (%.2f secs)\n", 1625228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs, seekTimeUs / 1E6); 1635228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1645228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1655228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 166125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 1675228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1685228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber return; 1695228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1705228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int n = 0; 172693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t startTime = getNowUs(); 173693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long numIterationsLeft = gNumRepetitions; 1752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaSource::ReadOptions options; 176dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber 17736e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t sumDecodeUs = 0; 1787f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber int64_t totalBytes = 0; 17936e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 1802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber while (numIterationsLeft-- > 0) { 18138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber long numFrames = 0; 18238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 1832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer *buffer; 1842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 18636e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t startDecodeUs = getNowUs(); 187125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber status_t err = rawSource->read(&buffer, &options); 18836e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t delayDecodeUs = getNowUs() - startDecodeUs; 18936e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 1902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.clearSeekTo(); 1912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (err != OK) { 1932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK_EQ(buffer, NULL); 1947f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 1957f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1967f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 1977f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 1987f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } 1997f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 203ab0f94d68bcb74547c8191bd4c47a9ad1b7c7c48Andreas Huber if (buffer->range_length() > 0 && (n++ % 16) == 0) { 2042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("."); 2052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 2062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 20836e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber sumDecodeUs += delayDecodeUs; 2097f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber totalBytes += buffer->range_length(); 21036e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 2112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 2122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 21338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 21438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber ++numFrames; 21538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (gMaxNumFrames > 0 && numFrames == gMaxNumFrames) { 21638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber break; 21738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 21880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber 21980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber if (gReproduceBug == 1 && numFrames == 40) { 22080011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber printf("seeking past the end now."); 221a8a371c8a0d88d144d095404673d00cae6464fdeAndreas Huber options.setSeekTo(0x7fffffffL); 222e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber } else if (gReproduceBug == 2 && numFrames == 40) { 223e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber printf("seeking to 5 secs."); 224e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber options.setSeekTo(5000000); 22580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } 226693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 227693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("$"); 2292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 2302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.setSeekTo(0); 232693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 234125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 235693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 236693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 237693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t delay = getNowUs() - startTime; 2387f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber if (!strncasecmp("video/", mime, 6)) { 2397f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f fps\n", n * 1E6 / delay); 240693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2417f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. time to decode one buffer %.2f usecs\n", 2427f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber (double)sumDecodeUs / n); 2437f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 2447f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %d frame(s).\n", n); 2457f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } else if (!strncasecmp("audio/", mime, 6)) { 2467f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // Frame count makes less sense for audio, as the output buffer 2477f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // sizes may be different across decoders. 2487f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f KB/sec\n", totalBytes / 1024 * 1E6 / delay); 2497f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 2507f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %lld bytes\n", totalBytes); 2517f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } 252693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 253693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic void usage(const char *me) { 2552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, "usage: %s\n", me); 2562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -h(elp)\n"); 2572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -a(udio)\n"); 2582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -n repetitions\n"); 2592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -l(ist) components\n"); 26038b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber fprintf(stderr, " -m max-number-of-frames-to-decode in each pass\n"); 26180011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber fprintf(stderr, " -b bug to reproduce\n"); 26218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); 2631b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); 2645c1e3581978164d169050686c73810ce59304471Andreas Huber fprintf(stderr, " -s(oftware) prefer software codec\n"); 265a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, " -o playback audio\n"); 2662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 2672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint main(int argc, char **argv) { 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber android::ProcessState::self()->startThreadPool(); 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2710024245e134467d120b40099da16c467dc365e76Andreas Huber bool audioOnly = false; 2722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool listComponents = false; 27318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber bool dumpProfiles = false; 2745c1e3581978164d169050686c73810ce59304471Andreas Huber bool extractThumbnail = false; 2752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber gNumRepetitions = 1; 27638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = 0; 27780011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = -1; 2785c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = false; 279a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 2802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int res; 282a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber while ((res = getopt(argc, argv, "han:lm:b:ptso")) >= 0) { 2832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (res) { 2842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'a': 2852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber audioOnly = true; 2872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'l': 2912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber listComponents = true; 2932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 29638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber case 'm': 2972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'n': 29880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber case 'b': 2992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 3002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber char *end; 3012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long x = strtol(optarg, &end, 10); 3022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (*end != '\0' || end == optarg || x <= 0) { 3042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber x = 1; 3052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 30738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (res == 'n') { 30838b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gNumRepetitions = x; 30980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else if (res == 'm') { 31038b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = x; 31180011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else { 31280011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber CHECK_EQ(res, 'b'); 31380011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = x; 31438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 3152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 31818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber case 'p': 31918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { 32018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber dumpProfiles = true; 32118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber break; 32218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 32318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 3245c1e3581978164d169050686c73810ce59304471Andreas Huber case 't': 3255c1e3581978164d169050686c73810ce59304471Andreas Huber { 3265c1e3581978164d169050686c73810ce59304471Andreas Huber extractThumbnail = true; 3275c1e3581978164d169050686c73810ce59304471Andreas Huber break; 3285c1e3581978164d169050686c73810ce59304471Andreas Huber } 3295c1e3581978164d169050686c73810ce59304471Andreas Huber 3305c1e3581978164d169050686c73810ce59304471Andreas Huber case 's': 3315c1e3581978164d169050686c73810ce59304471Andreas Huber { 3325c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = true; 3335c1e3581978164d169050686c73810ce59304471Andreas Huber break; 3345c1e3581978164d169050686c73810ce59304471Andreas Huber } 3355c1e3581978164d169050686c73810ce59304471Andreas Huber 336a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber case 'o': 337a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber { 338a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = true; 339a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber break; 340a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 341a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 3422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case '?': 3432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'h': 3442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 3452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 3462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber usage(argv[0]); 3472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber exit(1); 3482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 353a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio && !audioOnly) { 354a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber // This doesn't make any sense if we're decoding the video track. 355a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 356a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 357a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 3582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argc -= optind; 3592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argv += optind; 3602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3615c1e3581978164d169050686c73810ce59304471Andreas Huber if (extractThumbnail) { 3625c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 3635c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 3645c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaPlayerService> service = 3655c1e3581978164d169050686c73810ce59304471Andreas Huber interface_cast<IMediaPlayerService>(binder); 3665c1e3581978164d169050686c73810ce59304471Andreas Huber 3675c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(service.get() != NULL); 3685c1e3581978164d169050686c73810ce59304471Andreas Huber 3695c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaMetadataRetriever> retriever = 3705c1e3581978164d169050686c73810ce59304471Andreas Huber service->createMetadataRetriever(getpid()); 3715c1e3581978164d169050686c73810ce59304471Andreas Huber 3725c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(retriever != NULL); 3735c1e3581978164d169050686c73810ce59304471Andreas Huber 3745c1e3581978164d169050686c73810ce59304471Andreas Huber for (int k = 0; k < argc; ++k) { 3755c1e3581978164d169050686c73810ce59304471Andreas Huber const char *filename = argv[k]; 3765c1e3581978164d169050686c73810ce59304471Andreas Huber 3775c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK_EQ(retriever->setDataSource(filename), OK); 3781b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber CHECK_EQ(retriever->setMode( 3791b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber METADATA_MODE_FRAME_CAPTURE_AND_METADATA_RETRIEVAL), 3801b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber OK); 3815c1e3581978164d169050686c73810ce59304471Andreas Huber 3825c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMemory> mem = retriever->captureFrame(); 3835c1e3581978164d169050686c73810ce59304471Andreas Huber 3841b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 3851b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("captureFrame(%s) => OK\n", filename); 3861b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } else { 3871b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber mem = retriever->extractAlbumArt(); 3881b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber 3891b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 3901b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("extractAlbumArt(%s) => OK\n", filename); 3911b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } else { 3921b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("both captureFrame and extractAlbumArt " 3931b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber "failed on file '%s'.\n", filename); 3941b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 3951b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 3965c1e3581978164d169050686c73810ce59304471Andreas Huber } 3975c1e3581978164d169050686c73810ce59304471Andreas Huber 3985c1e3581978164d169050686c73810ce59304471Andreas Huber return 0; 3995c1e3581978164d169050686c73810ce59304471Andreas Huber } 4005c1e3581978164d169050686c73810ce59304471Andreas Huber 40118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (dumpProfiles) { 40218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 40318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 40418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IMediaPlayerService> service = 40518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber interface_cast<IMediaPlayerService>(binder); 40618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 40718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(service.get() != NULL); 40818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 41018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(omx.get() != NULL); 41118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 41218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const char *kMimeTypes[] = { 41318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber MEDIA_MIMETYPE_VIDEO_AVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 41408a88e195d2b3697f2f967e9216491e8c5bd3c9eAndreas Huber MEDIA_MIMETYPE_VIDEO_H263, MEDIA_MIMETYPE_AUDIO_AAC, 41508a88e195d2b3697f2f967e9216491e8c5bd3c9eAndreas Huber MEDIA_MIMETYPE_AUDIO_AMR_NB, MEDIA_MIMETYPE_AUDIO_AMR_WB, 41608a88e195d2b3697f2f967e9216491e8c5bd3c9eAndreas Huber MEDIA_MIMETYPE_AUDIO_MPEG 41718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber }; 41818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 41918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t k = 0; k < sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); 42018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber ++k) { 42118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("type '%s':\n", kMimeTypes[k]); 42218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 42318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber Vector<CodecCapabilities> results; 42418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK_EQ(QueryCodecs(omx, kMimeTypes[k], 42518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber true, // queryDecoders 42618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber &results), OK); 42718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 42818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t i = 0; i < results.size(); ++i) { 42918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf(" decoder '%s' supports ", 43018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results[i].mComponentName.string()); 43118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 43218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (results[i].mProfileLevels.size() == 0) { 43318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("NOTHING.\n"); 43418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber continue; 43518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 43618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 43718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t j = 0; j < results[i].mProfileLevels.size(); ++j) { 43818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const CodecProfileLevel &profileLevel = 43918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results[i].mProfileLevels[j]; 44018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 44118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("%s%ld/%ld", j > 0 ? ", " : "", 44218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber profileLevel.mProfile, profileLevel.mLevel); 44318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 44418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 44518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("\n"); 44618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 44718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 44818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 44918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 4502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (listComponents) { 45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 45420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 455693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(service.get() != NULL); 45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 457318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 458693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(omx.get() != NULL); 45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 460134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<IOMX::ComponentInfo> list; 461318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber omx->listNodes(&list); 46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 463134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<IOMX::ComponentInfo>::iterator it = list.begin(); 46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 465134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber printf("%s\n", (*it).mName.string()); 46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource::RegisterDefaultSniffers(); 47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMXClient client; 47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = client.connect(); 47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (int k = 0; k < argc; ++k) { 4752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *filename = argv[k]; 47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4772ea76ead54982376e32ab196093babded80e05e4Andreas Huber sp<DataSource> dataSource; 4782ea76ead54982376e32ab196093babded80e05e4Andreas Huber if (!strncasecmp("http://", filename, 7)) { 4792ea76ead54982376e32ab196093babded80e05e4Andreas Huber dataSource = new HTTPDataSource(filename); 4805284bc4fe8e85bf61d7977cbcc75fd244a13d84cAndreas Huber if (((HTTPDataSource *)dataSource.get())->connect() != OK) { 4815284bc4fe8e85bf61d7977cbcc75fd244a13d84cAndreas Huber fprintf(stderr, "failed to connect to HTTP server.\n"); 4825284bc4fe8e85bf61d7977cbcc75fd244a13d84cAndreas Huber return -1; 4835284bc4fe8e85bf61d7977cbcc75fd244a13d84cAndreas Huber } 4845284bc4fe8e85bf61d7977cbcc75fd244a13d84cAndreas Huber dataSource = new CachingDataSource(dataSource, 32 * 1024, 20); 4852ea76ead54982376e32ab196093babded80e05e4Andreas Huber } else { 486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber dataSource = new FileSource(filename); 4872ea76ead54982376e32ab196093babded80e05e4Andreas Huber } 4880024245e134467d120b40099da16c467dc365e76Andreas Huber 489a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (dataSource == NULL) { 490a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, "Unable to create data source.\n"); 491a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber return 1; 492a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 493a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 4942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool isJPEG = false; 49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t len = strlen(filename); 4972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (len >= 4 && !strcasecmp(filename + len - 4, ".jpg")) { 4982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber isJPEG = true; 4992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 50020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaSource> mediaSource; 50220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (isJPEG) { 5042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = new JPEGSource(dataSource); 505a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (!strncasecmp("sine:", filename, 5)) { 506a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber char *end; 507a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber long sampleRate = strtol(filename + 5, &end, 10); 508a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 509a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (end == filename + 5) { 510a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber sampleRate = 44100; 511a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 512a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber mediaSource = new SineSource(sampleRate, 1); 5132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } else { 5142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 515b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong if (extractor == NULL) { 516a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, "could not create extractor.\n"); 517b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong return -1; 518b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong } 51920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t numTracks = extractor->countTracks(); 52120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MetaData> meta; 5232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t i; 5242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (i = 0; i < numTracks; ++i) { 5255c1e3581978164d169050686c73810ce59304471Andreas Huber meta = extractor->getTrackMetaData( 5265c1e3581978164d169050686c73810ce59304471Andreas Huber i, MediaExtractor::kIncludeExtensiveMetaData); 52720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *mime; 5292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->findCString(kKeyMIMEType, &mime); 53020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (audioOnly && !strncasecmp(mime, "audio/", 6)) { 5322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 5332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 5342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 5352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!audioOnly && !strncasecmp(mime, "video/", 6)) { 5362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 5372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 538a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 539a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber meta = NULL; 540a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 541a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 542a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (meta == NULL) { 543a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, 544a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber "No suitable %s track found. The '-a' option will " 545a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber "target audio tracks only, the default is to target " 546a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber "video tracks only.\n", 547a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber audioOnly ? "audio" : "video"); 548a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber return -1; 549693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 5502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 5515c1e3581978164d169050686c73810ce59304471Andreas Huber int64_t thumbTimeUs; 5525c1e3581978164d169050686c73810ce59304471Andreas Huber if (meta->findInt64(kKeyThumbnailTime, &thumbTimeUs)) { 5535c1e3581978164d169050686c73810ce59304471Andreas Huber printf("thumbnailTime: %lld us (%.2f secs)\n", 5545c1e3581978164d169050686c73810ce59304471Andreas Huber thumbTimeUs, thumbTimeUs / 1E6); 5555c1e3581978164d169050686c73810ce59304471Andreas Huber } 5565c1e3581978164d169050686c73810ce59304471Andreas Huber 5572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = extractor->getTrack(i); 55820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 55920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber playSource(&client, mediaSource); 56120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 56220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber client.disconnect(); 56420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 0; 56620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 567