stagefright.cpp revision bfa6b2d7a1be1832ac40ed90aece1834f720b5c6
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 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/ProcessState.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h> 262ea76ead54982376e32ab196093babded80e05e4Andreas Huber#include <media/stagefright/CachingDataSource.h> 27bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 282ea76ead54982376e32ab196093babded80e05e4Andreas Huber#include <media/stagefright/HTTPDataSource.h> 29777893a928680f09e306b4b9efc1d5cf4479a9daAndreas Huber#include <media/stagefright/JPEGSource.h> 30693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/MediaDebug.h> 3118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaExtractor.h> 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h> 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h> 36693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h> 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android; 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic long gNumRepetitions; 4138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huberstatic long gMaxNumFrames; // 0 means decode all available. 4280011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huberstatic long gReproduceBug; // if not -1. 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic int64_t getNowUs() { 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct timeval tv; 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber gettimeofday(&tv, NULL); 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000; 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstatic void playSource(OMXClient *client, const sp<MediaSource> &source) { 52693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = source->getFormat(); 53693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 54125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber const char *mime; 55125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 56125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber 57125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber sp<MediaSource> rawSource; 58125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mime)) { 59125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = source; 60125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } else { 61125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = OMXCodec::Create( 62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber client->interface(), meta, false /* createEncoder */, source); 63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 64125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (rawSource == NULL) { 65125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber fprintf(stderr, "Failed to instantiate decoder for '%s'.\n", mime); 66125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber return; 67125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } 68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 70125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->start(); 71693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 72af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (gReproduceBug >= 3 && gReproduceBug <= 5) { 73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt64(kKeyDuration, &durationUs)); 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 765228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber status_t err; 775228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaBuffer *buffer; 785228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaSource::ReadOptions options; 795228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber int64_t seekTimeUs = -1; 805228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber for (;;) { 81125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber err = rawSource->read(&buffer, &options); 825228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.clearSeekTo(); 835228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 845228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool shouldSeek = false; 857f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 867f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber CHECK_EQ(buffer, NULL); 877f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 887f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 897f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 907f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } else if (err != OK) { 915228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("reached EOF.\n"); 925228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 935228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = true; 945228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } else { 9548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t timestampUs; 9648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs)); 975228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 985228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool failed = false; 99af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 1005228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (seekTimeUs >= 0) { 10148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t diff = timestampUs - seekTimeUs; 1025228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 103af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (diff < 0) { 104af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber diff = -diff; 105af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 106af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 107af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if ((gReproduceBug == 4 && diff > 500000) 108af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber || (gReproduceBug == 5 && timestampUs < 0)) { 109af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber printf("wanted: %.2f secs, got: %.2f secs\n", 110af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs / 1E6, timestampUs / 1E6); 1115228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1125228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("ERROR: "); 1135228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber failed = true; 1145228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1155228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1165228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1175228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("buffer has timestamp %lld us (%.2f secs)\n", 11848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber timestampUs, timestampUs / 1E6); 1195228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1205228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer->release(); 1215228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer = NULL; 1225228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1235228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (failed) { 1245228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber break; 1255228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1265228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1275228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = ((double)rand() / RAND_MAX) < 0.1; 128af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 129af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (gReproduceBug == 3) { 130af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber shouldSeek = false; 131af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 1325228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1335228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1345228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs = -1; 1355228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1365228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (shouldSeek) { 137af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs = (rand() * (float)durationUs) / RAND_MAX; 1385228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.setSeekTo(seekTimeUs); 1395228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1405228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("seeking to %lld us (%.2f secs)\n", 1415228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs, seekTimeUs / 1E6); 1425228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1435228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1445228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 145125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 1465228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1475228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber return; 1485228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 1495228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 1502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int n = 0; 151693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t startTime = getNowUs(); 152693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long numIterationsLeft = gNumRepetitions; 1542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaSource::ReadOptions options; 155dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber 1562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber while (numIterationsLeft-- > 0) { 15738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber long numFrames = 0; 15838b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 1592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer *buffer; 1602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 162125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber status_t err = rawSource->read(&buffer, &options); 1632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.clearSeekTo(); 1642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (err != OK) { 1662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK_EQ(buffer, NULL); 1677f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 1687f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1697f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 1707f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 1717f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } 1727f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 1732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 1742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if ((n++ % 16) == 0) { 1772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("."); 1782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 1792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 1822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 18338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 18438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber ++numFrames; 18538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (gMaxNumFrames > 0 && numFrames == gMaxNumFrames) { 18638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber break; 18738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 18880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber 18980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber if (gReproduceBug == 1 && numFrames == 40) { 19080011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber printf("seeking past the end now."); 191a8a371c8a0d88d144d095404673d00cae6464fdeAndreas Huber options.setSeekTo(0x7fffffffL); 192e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber } else if (gReproduceBug == 2 && numFrames == 40) { 193e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber printf("seeking to 5 secs."); 194e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber options.setSeekTo(5000000); 19580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } 196693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 197693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 1982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("$"); 1992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 2002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.setSeekTo(0); 202693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 2032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 204125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 207693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t delay = getNowUs() - startTime; 208693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("avg. %.2f fps\n", n * 1E6 / delay); 209693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 210693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("decoded a total of %d frame(s).\n", n); 211693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic void usage(const char *me) { 2142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, "usage: %s\n", me); 2152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -h(elp)\n"); 2162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -a(udio)\n"); 2172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -n repetitions\n"); 2182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -l(ist) components\n"); 21938b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber fprintf(stderr, " -m max-number-of-frames-to-decode in each pass\n"); 22080011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber fprintf(stderr, " -b bug to reproduce\n"); 22118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); 2222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 2232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint main(int argc, char **argv) { 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber android::ProcessState::self()->startThreadPool(); 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2270024245e134467d120b40099da16c467dc365e76Andreas Huber bool audioOnly = false; 2282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool listComponents = false; 22918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber bool dumpProfiles = false; 2302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber gNumRepetitions = 1; 23138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = 0; 23280011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = -1; 2332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int res; 23518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber while ((res = getopt(argc, argv, "han:lm:b:p")) >= 0) { 2362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (res) { 2372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'a': 2382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber audioOnly = true; 2402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'l': 2442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber listComponents = true; 2462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 24938b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber case 'm': 2502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'n': 25180011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber case 'b': 2522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber char *end; 2542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long x = strtol(optarg, &end, 10); 2552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (*end != '\0' || end == optarg || x <= 0) { 2572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber x = 1; 2582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 26038b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (res == 'n') { 26138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gNumRepetitions = x; 26280011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else if (res == 'm') { 26338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = x; 26480011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else { 26580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber CHECK_EQ(res, 'b'); 26680011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = x; 26738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 2682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2702d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 27118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber case 'p': 27218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { 27318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber dumpProfiles = true; 27418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber break; 27518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 27618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 2772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case '?': 2782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'h': 2792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 2802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber usage(argv[0]); 2822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber exit(1); 2832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argc -= optind; 2892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argv += optind; 2902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 29118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (dumpProfiles) { 29218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 29318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 29418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IMediaPlayerService> service = 29518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber interface_cast<IMediaPlayerService>(binder); 29618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 29718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(service.get() != NULL); 29818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 30018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(omx.get() != NULL); 30118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 30218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const char *kMimeTypes[] = { 30318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber MEDIA_MIMETYPE_VIDEO_AVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 30418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber MEDIA_MIMETYPE_VIDEO_H263 30518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber }; 30618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 30718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t k = 0; k < sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); 30818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber ++k) { 30918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("type '%s':\n", kMimeTypes[k]); 31018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 31118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber Vector<CodecCapabilities> results; 31218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK_EQ(QueryCodecs(omx, kMimeTypes[k], 31318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber true, // queryDecoders 31418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber &results), OK); 31518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 31618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t i = 0; i < results.size(); ++i) { 31718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf(" decoder '%s' supports ", 31818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results[i].mComponentName.string()); 31918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 32018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (results[i].mProfileLevels.size() == 0) { 32118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("NOTHING.\n"); 32218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber continue; 32318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 32418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 32518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber for (size_t j = 0; j < results[i].mProfileLevels.size(); ++j) { 32618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber const CodecProfileLevel &profileLevel = 32718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber results[i].mProfileLevels[j]; 32818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 32918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("%s%ld/%ld", j > 0 ? ", " : "", 33018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber profileLevel.mProfile, profileLevel.mLevel); 33118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 33218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 33318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber printf("\n"); 33418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 33518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 33618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 33718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 3382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (listComponents) { 33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 343693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(service.get() != NULL); 34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 346693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(omx.get() != NULL); 34720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber List<String8> list; 349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber omx->listNodes(&list); 35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (List<String8>::iterator it = list.begin(); 35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber printf("%s\n", (*it).string()); 35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 35620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource::RegisterDefaultSniffers(); 35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 35920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMXClient client; 36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = client.connect(); 36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (int k = 0; k < argc; ++k) { 3632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *filename = argv[k]; 36420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3652ea76ead54982376e32ab196093babded80e05e4Andreas Huber sp<DataSource> dataSource; 3662ea76ead54982376e32ab196093babded80e05e4Andreas Huber if (!strncasecmp("http://", filename, 7)) { 3672ea76ead54982376e32ab196093babded80e05e4Andreas Huber dataSource = new HTTPDataSource(filename); 3682ea76ead54982376e32ab196093babded80e05e4Andreas Huber dataSource = new CachingDataSource(dataSource, 64 * 1024, 10); 3692ea76ead54982376e32ab196093babded80e05e4Andreas Huber } else { 370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber dataSource = new FileSource(filename); 3712ea76ead54982376e32ab196093babded80e05e4Andreas Huber } 3720024245e134467d120b40099da16c467dc365e76Andreas Huber 3732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool isJPEG = false; 37420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t len = strlen(filename); 3762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (len >= 4 && !strcasecmp(filename + len - 4, ".jpg")) { 3772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber isJPEG = true; 3782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaSource> mediaSource; 38120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (isJPEG) { 3832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = new JPEGSource(dataSource); 3842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } else { 3852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 38620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t numTracks = extractor->countTracks(); 38820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MetaData> meta; 3902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t i; 3912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (i = 0; i < numTracks; ++i) { 3922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta = extractor->getTrackMetaData(i); 39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *mime; 3952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->findCString(kKeyMIMEType, &mime); 39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (audioOnly && !strncasecmp(mime, "audio/", 6)) { 3982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 4002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 4012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!audioOnly && !strncasecmp(mime, "video/", 6)) { 4022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 4032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 404693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 4052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 4062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = extractor->getTrack(i); 40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber playSource(&client, mediaSource); 41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber client.disconnect(); 41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 0; 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 416