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 17bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber//#define LOG_NDEBUG 0 18bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber#define LOG_TAG "stagefright" 19bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber#include <media/stagefright/foundation/ADebug.h> 20bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/time.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdlib.h> 242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <string.h> 252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <unistd.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2726a417f68526fee861bb527f1a4e3ed548979f93Colin Cross#include "jpeg.h" 28a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber#include "SineSource.h" 29a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/ProcessState.h> 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h> 33348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber#include <media/stagefright/foundation/ALooper.h> 34a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include "include/LiveSession.h" 35ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber#include "include/NuCachedSource2.h" 36a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber#include <media/stagefright/AudioPlayer.h> 371c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber#include <media/stagefright/DataSource.h> 38777893a928680f09e306b4b9efc1d5cf4479a9daAndreas Huber#include <media/stagefright/JPEGSource.h> 3918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 401c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber#include <media/stagefright/MediaErrors.h> 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaExtractor.h> 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h> 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h> 45693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <media/stagefright/OMXCodec.h> 465c1e3581978164d169050686c73810ce59304471Andreas Huber#include <media/mediametadataretriever.h> 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber#include <media/stagefright/foundation/hexdump.h> 490da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#include <media/stagefright/MPEG2TSWriter.h> 5019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber#include <media/stagefright/MPEG4Writer.h> 5119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 52f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber#include <private/media/VideoFrame.h> 53f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 54bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber#include <fcntl.h> 55bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 56c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber#include <gui/SurfaceTextureClient.h> 57df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/SurfaceComposerClient.h> 58c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android; 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic long gNumRepetitions; 6238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huberstatic long gMaxNumFrames; // 0 means decode all available. 6380011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huberstatic long gReproduceBug; // if not -1. 645c1e3581978164d169050686c73810ce59304471Andreas Huberstatic bool gPreferSoftwareCodec; 65cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dongstatic bool gForceToUseHardwareCodec; 66a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huberstatic bool gPlaybackAudio; 6719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huberstatic bool gWriteMP4; 68fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huberstatic bool gDisplayHistogram; 6919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huberstatic String8 gWriteMP4Filename; 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 71c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huberstatic sp<ANativeWindow> gSurface; 72c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic int64_t getNowUs() { 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct timeval tv; 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber gettimeofday(&tv, NULL); 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 77d2858f047b2c52d719719532f24899c0e03c2099Andreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll; 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 80fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huberstatic int CompareIncreasing(const int64_t *a, const int64_t *b) { 81fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber return (*a) < (*b) ? -1 : (*a) > (*b) ? 1 : 0; 82fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber} 83fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 84fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huberstatic void displayDecodeHistogram(Vector<int64_t> *decodeTimesUs) { 85fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("decode times:\n"); 86fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 87fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber decodeTimesUs->sort(CompareIncreasing); 88fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 89fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber size_t n = decodeTimesUs->size(); 90fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t minUs = decodeTimesUs->itemAt(0); 91fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t maxUs = decodeTimesUs->itemAt(n - 1); 92fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 93fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("min decode time %lld us (%.2f secs)\n", minUs, minUs / 1E6); 94fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("max decode time %lld us (%.2f secs)\n", maxUs, maxUs / 1E6); 95fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 96fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber size_t counts[100]; 97fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber for (size_t i = 0; i < 100; ++i) { 98fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber counts[i] = 0; 99fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 100fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 101fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber for (size_t i = 0; i < n; ++i) { 102fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t x = decodeTimesUs->itemAt(i); 103fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 104fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber size_t slot = ((x - minUs) * 100) / (maxUs - minUs); 105fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (slot == 100) { slot = 99; } 106fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 107fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber ++counts[slot]; 108fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 109fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 110fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber for (size_t i = 0; i < 100; ++i) { 111fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t slotUs = minUs + (i * (maxUs - minUs) / 100); 112fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 113fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber double fps = 1E6 / slotUs; 114fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("[%.2f fps]: %d\n", fps, counts[i]); 115fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 116fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber} 117fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 1188a674dcc94936e2306121016ab258b4c00cc9d98James Dongstatic void displayAVCProfileLevelIfPossible(const sp<MetaData>& meta) { 1198a674dcc94936e2306121016ab258b4c00cc9d98James Dong uint32_t type; 1208a674dcc94936e2306121016ab258b4c00cc9d98James Dong const void *data; 1218a674dcc94936e2306121016ab258b4c00cc9d98James Dong size_t size; 1228a674dcc94936e2306121016ab258b4c00cc9d98James Dong if (meta->findData(kKeyAVCC, &type, &data, &size)) { 1238a674dcc94936e2306121016ab258b4c00cc9d98James Dong const uint8_t *ptr = (const uint8_t *)data; 1248a674dcc94936e2306121016ab258b4c00cc9d98James Dong CHECK(size >= 7); 1258a674dcc94936e2306121016ab258b4c00cc9d98James Dong CHECK(ptr[0] == 1); // configurationVersion == 1 1268a674dcc94936e2306121016ab258b4c00cc9d98James Dong uint8_t profile = ptr[1]; 1278a674dcc94936e2306121016ab258b4c00cc9d98James Dong uint8_t level = ptr[3]; 1288a674dcc94936e2306121016ab258b4c00cc9d98James Dong fprintf(stderr, "AVC video profile %d and level %d\n", profile, level); 1298a674dcc94936e2306121016ab258b4c00cc9d98James Dong } 1308a674dcc94936e2306121016ab258b4c00cc9d98James Dong} 1318a674dcc94936e2306121016ab258b4c00cc9d98James Dong 132d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huberstatic void dumpSource(const sp<MediaSource> &source, const String8 &filename) { 133d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber FILE *out = fopen(filename.string(), "wb"); 134d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 135d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber CHECK_EQ((status_t)OK, source->start()); 136d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 137d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber status_t err; 138d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber for (;;) { 139d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber MediaBuffer *mbuf; 140d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber err = source->read(&mbuf); 141d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 142d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber if (err == INFO_FORMAT_CHANGED) { 143d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber continue; 144d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } else if (err != OK) { 145d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber break; 146d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } 147d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 148d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber CHECK_EQ( 149d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber fwrite((const uint8_t *)mbuf->data() + mbuf->range_offset(), 150d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 1, 151d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber mbuf->range_length(), 152d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber out), 153d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber (ssize_t)mbuf->range_length()); 154d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 155d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber mbuf->release(); 156d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber mbuf = NULL; 157d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } 158d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 159d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber CHECK_EQ((status_t)OK, source->stop()); 160d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 161d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber fclose(out); 162d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber out = NULL; 163d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber} 164d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 165c225da975515892952602cd3b1e24efc0cceaa4dAndreas Huberstatic void playSource(OMXClient *client, sp<MediaSource> &source) { 166693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = source->getFormat(); 167693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 168125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber const char *mime; 169125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 170125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber 171125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber sp<MediaSource> rawSource; 172125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mime)) { 173125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = source; 174125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } else { 175cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong int flags = 0; 176cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong if (gPreferSoftwareCodec) { 177cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong flags |= OMXCodec::kPreferSoftwareCodecs; 178cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong } 179cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong if (gForceToUseHardwareCodec) { 180cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong CHECK(!gPreferSoftwareCodec); 181cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong flags |= OMXCodec::kHardwareCodecsOnly; 182cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong } 183125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = OMXCodec::Create( 1845c1e3581978164d169050686c73810ce59304471Andreas Huber client->interface(), meta, false /* createEncoder */, source, 1855c1e3581978164d169050686c73810ce59304471Andreas Huber NULL /* matchComponentName */, 186cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong flags, 187c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber gSurface); 188693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 189125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (rawSource == NULL) { 190125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber fprintf(stderr, "Failed to instantiate decoder for '%s'.\n", mime); 191125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber return; 192125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } 1938a674dcc94936e2306121016ab258b4c00cc9d98James Dong displayAVCProfileLevelIfPossible(meta); 194693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 195693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 196c225da975515892952602cd3b1e24efc0cceaa4dAndreas Huber source.clear(); 197c225da975515892952602cd3b1e24efc0cceaa4dAndreas Huber 198139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = rawSource->start(); 199139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 200139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 201139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber fprintf(stderr, "rawSource returned error %d (0x%08x)\n", err, err); 202139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return; 203139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 205a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio) { 206a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber AudioPlayer *player = new AudioPlayer(NULL); 207a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->setSource(rawSource); 20864105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber rawSource.clear(); 209a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 210a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->start(true /* sourceAlreadyStarted */); 211a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 212a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber status_t finalStatus; 213a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber while (!player->reachedEOS(&finalStatus)) { 214a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber usleep(100000ll); 215a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 216a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 217a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber delete player; 218a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player = NULL; 21964105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber 22064105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber return; 221a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (gReproduceBug >= 3 && gReproduceBug <= 5) { 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt64(kKeyDuration, &durationUs)); 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2255228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber status_t err; 2265228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaBuffer *buffer; 2275228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaSource::ReadOptions options; 2285228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber int64_t seekTimeUs = -1; 2295228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber for (;;) { 230125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber err = rawSource->read(&buffer, &options); 2315228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.clearSeekTo(); 2325228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2335228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool shouldSeek = false; 2347f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 235bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK(buffer == NULL); 2367f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2377f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 2387f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 2397f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } else if (err != OK) { 2405228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("reached EOF.\n"); 2415228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2425228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = true; 2435228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } else { 24448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t timestampUs; 24548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs)); 2465228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2475228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool failed = false; 248af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 2495228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (seekTimeUs >= 0) { 25048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t diff = timestampUs - seekTimeUs; 2515228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 252af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (diff < 0) { 253af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber diff = -diff; 254af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 255af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 256af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if ((gReproduceBug == 4 && diff > 500000) 257af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber || (gReproduceBug == 5 && timestampUs < 0)) { 258af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber printf("wanted: %.2f secs, got: %.2f secs\n", 259af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs / 1E6, timestampUs / 1E6); 2605228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2615228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("ERROR: "); 2625228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber failed = true; 2635228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2645228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2655228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2665228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("buffer has timestamp %lld us (%.2f secs)\n", 26748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber timestampUs, timestampUs / 1E6); 2685228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2695228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer->release(); 2705228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer = NULL; 2715228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2725228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (failed) { 2735228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber break; 2745228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2755228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2765228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = ((double)rand() / RAND_MAX) < 0.1; 277af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 278af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (gReproduceBug == 3) { 279af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber shouldSeek = false; 280af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 2815228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2825228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2835228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs = -1; 2845228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2855228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (shouldSeek) { 286af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs = (rand() * (float)durationUs) / RAND_MAX; 2875228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.setSeekTo(seekTimeUs); 2885228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2895228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("seeking to %lld us (%.2f secs)\n", 2905228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs, seekTimeUs / 1E6); 2915228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2925228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2935228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 294125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 2955228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2965228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber return; 2975228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2985228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int n = 0; 300693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t startTime = getNowUs(); 301693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long numIterationsLeft = gNumRepetitions; 3032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaSource::ReadOptions options; 304dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber 30536e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t sumDecodeUs = 0; 3067f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber int64_t totalBytes = 0; 30736e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 308fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber Vector<int64_t> decodeTimesUs; 309fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 3102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber while (numIterationsLeft-- > 0) { 31138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber long numFrames = 0; 31238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 3132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer *buffer; 3142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 31636e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t startDecodeUs = getNowUs(); 317125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber status_t err = rawSource->read(&buffer, &options); 31836e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t delayDecodeUs = getNowUs() - startDecodeUs; 31936e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 3202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.clearSeekTo(); 3212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (err != OK) { 323bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK(buffer == NULL); 3247f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 3257f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 3267f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 3277f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 3287f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } 3297f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 3302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 333fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (buffer->range_length() > 0) { 334fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (gDisplayHistogram && n > 0) { 335fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber // Ignore the first time since it includes some setup 336fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber // cost. 337fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber decodeTimesUs.push(delayDecodeUs); 338fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 339fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 340fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if ((n++ % 16) == 0) { 341fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("."); 342fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber fflush(stdout); 343fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 3442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 34636e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber sumDecodeUs += delayDecodeUs; 3477f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber totalBytes += buffer->range_length(); 34836e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 3492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 3502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 35138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 35238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber ++numFrames; 35338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (gMaxNumFrames > 0 && numFrames == gMaxNumFrames) { 35438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber break; 35538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 35680011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber 35780011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber if (gReproduceBug == 1 && numFrames == 40) { 35880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber printf("seeking past the end now."); 359a8a371c8a0d88d144d095404673d00cae6464fdeAndreas Huber options.setSeekTo(0x7fffffffL); 360e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber } else if (gReproduceBug == 2 && numFrames == 40) { 361e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber printf("seeking to 5 secs."); 362e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber options.setSeekTo(5000000); 36380011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } 364693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 365693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber printf("$"); 3672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fflush(stdout); 3682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.setSeekTo(0); 370693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 3712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 372125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 373693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 374693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t delay = getNowUs() - startTime; 3767f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber if (!strncasecmp("video/", mime, 6)) { 3777f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f fps\n", n * 1E6 / delay); 378693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3797f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. time to decode one buffer %.2f usecs\n", 3807f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber (double)sumDecodeUs / n); 3817f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 3827f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %d frame(s).\n", n); 383fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 384fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (gDisplayHistogram) { 385fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber displayDecodeHistogram(&decodeTimesUs); 386fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 3877f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } else if (!strncasecmp("audio/", mime, 6)) { 3887f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // Frame count makes less sense for audio, as the output buffer 3897f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // sizes may be different across decoders. 3907f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f KB/sec\n", totalBytes / 1024 * 1E6 / delay); 3917f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 3927f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %lld bytes\n", totalBytes); 3937f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } 394693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 395693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 396bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber//////////////////////////////////////////////////////////////////////////////// 397bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 398bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstruct DetectSyncSource : public MediaSource { 399bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber DetectSyncSource(const sp<MediaSource> &source); 400bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 401bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual status_t start(MetaData *params = NULL); 402bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual status_t stop(); 403bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual sp<MetaData> getFormat(); 404bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 405bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual status_t read( 406bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber MediaBuffer **buffer, const ReadOptions *options); 407bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 408bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberprivate: 409ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber enum StreamType { 410ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber AVC, 411ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber MPEG4, 412ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber H263, 413ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber OTHER, 414ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber }; 415ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 416bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber sp<MediaSource> mSource; 417ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber StreamType mStreamType; 418fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber bool mSawFirstIDRFrame; 419bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 420bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DetectSyncSource); 421bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber}; 422bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 423bbc38312e4521cfd4299203591ef366b7624f043Andreas HuberDetectSyncSource::DetectSyncSource(const sp<MediaSource> &source) 424bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber : mSource(source), 425fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mStreamType(OTHER), 426fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mSawFirstIDRFrame(false) { 427bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber const char *mime; 428bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK(mSource->getFormat()->findCString(kKeyMIMEType, &mime)); 429bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 430ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) { 431ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mStreamType = AVC; 432ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)) { 433ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mStreamType = MPEG4; 434ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK(!"sync frame detection not implemented yet for MPEG4"); 435ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_H263)) { 436ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mStreamType = H263; 437ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK(!"sync frame detection not implemented yet for H.263"); 438ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 439bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 440bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 441bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatus_t DetectSyncSource::start(MetaData *params) { 442fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mSawFirstIDRFrame = false; 443fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 444bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return mSource->start(params); 445bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 446bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 447bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatus_t DetectSyncSource::stop() { 448bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return mSource->stop(); 449bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 450bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 451bbc38312e4521cfd4299203591ef366b7624f043Andreas Hubersp<MetaData> DetectSyncSource::getFormat() { 452bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return mSource->getFormat(); 453bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 454bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 455bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatic bool isIDRFrame(MediaBuffer *buffer) { 456bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber const uint8_t *data = 457bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber (const uint8_t *)buffer->data() + buffer->range_offset(); 458bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber size_t size = buffer->range_length(); 459bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber for (size_t i = 0; i + 3 < size; ++i) { 460bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber if (!memcmp("\x00\x00\x01", &data[i], 3)) { 461bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber uint8_t nalType = data[i + 3] & 0x1f; 462bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber if (nalType == 5) { 463bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return true; 464bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 465bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 466bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 467bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 468bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return false; 469bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 470bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 471bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatus_t DetectSyncSource::read( 472bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 473fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber for (;;) { 474fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber status_t err = mSource->read(buffer, options); 475bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 476fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (err != OK) { 477fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber return err; 478fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 479bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 480fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (mStreamType == AVC) { 481fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber bool isIDR = isIDRFrame(*buffer); 482fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame, isIDR); 483fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (isIDR) { 484fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mSawFirstIDRFrame = true; 485fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 486fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } else { 487fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame, true); 488fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 489fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 490fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (mStreamType != AVC || mSawFirstIDRFrame) { 491fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber break; 492fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 493fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 494fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber // Ignore everything up to the first IDR frame. 495fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber (*buffer)->release(); 496fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber *buffer = NULL; 497bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 498bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 499bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return OK; 500bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 501bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 502bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber//////////////////////////////////////////////////////////////////////////////// 503bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 504ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huberstatic void writeSourcesToMP4( 505ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber Vector<sp<MediaSource> > &sources, bool syncInfoPresent) { 5060da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#if 0 50719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber sp<MPEG4Writer> writer = 50819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber new MPEG4Writer(gWriteMP4Filename.string()); 5090da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#else 5100da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber sp<MPEG2TSWriter> writer = 5110da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber new MPEG2TSWriter(gWriteMP4Filename.string()); 5120da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#endif 51319c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 514bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber // at most one minute. 515bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber writer->setMaxFileDuration(60000000ll); 516bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 517ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber for (size_t i = 0; i < sources.size(); ++i) { 518ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber sp<MediaSource> source = sources.editItemAt(i); 519ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 520ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK_EQ(writer->addSource( 521ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber syncInfoPresent ? source : new DetectSyncSource(source)), 522ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber (status_t)OK); 523ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 52419c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 52519c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber sp<MetaData> params = new MetaData; 526bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber params->setInt32(kKeyNotRealTime, true); 527bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK_EQ(writer->start(params.get()), (status_t)OK); 52819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 52919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber while (!writer->reachedEOS()) { 53019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber usleep(100000); 53119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } 53219c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber writer->stop(); 53319c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber} 53419c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 53566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huberstatic void performSeekTest(const sp<MediaSource> &source) { 536bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK_EQ((status_t)OK, source->start()); 53766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 53866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber int64_t durationUs; 53966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(source->getFormat()->findInt64(kKeyDuration, &durationUs)); 54066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 54166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber for (int64_t seekTimeUs = 0; seekTimeUs <= durationUs; 54266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber seekTimeUs += 60000ll) { 54366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber MediaSource::ReadOptions options; 54466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber options.setSeekTo( 54566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber seekTimeUs, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 54666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 54766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber MediaBuffer *buffer; 54866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber status_t err; 54966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber for (;;) { 55066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber err = source->read(&buffer, &options); 55166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 55266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber options.clearSeekTo(); 55366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 55466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (err == INFO_FORMAT_CHANGED) { 55566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer == NULL); 55666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber continue; 55766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 55866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 55966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (err != OK) { 56066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer == NULL); 56166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 56266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 56366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 56466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (buffer->range_length() > 0) { 56566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 56666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 56766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 56866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer != NULL); 56966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 57066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer->release(); 57166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer = NULL; 57266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 57366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 57466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (err == OK) { 57566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber int64_t timeUs; 57666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs)); 57766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 57866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber printf("%lld\t%lld\t%lld\n", seekTimeUs, timeUs, seekTimeUs - timeUs); 57966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 58066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer->release(); 58166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer = NULL; 58266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } else { 58366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber printf("ERROR\n"); 58466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 58566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 58666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 58766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 588bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK_EQ((status_t)OK, source->stop()); 58966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber} 59066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 5912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic void usage(const char *me) { 5922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, "usage: %s\n", me); 5932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -h(elp)\n"); 5942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -a(udio)\n"); 5952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -n repetitions\n"); 5962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -l(ist) components\n"); 59738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber fprintf(stderr, " -m max-number-of-frames-to-decode in each pass\n"); 59880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber fprintf(stderr, " -b bug to reproduce\n"); 59918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); 6001b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); 6015c1e3581978164d169050686c73810ce59304471Andreas Huber fprintf(stderr, " -s(oftware) prefer software codec\n"); 602cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong fprintf(stderr, " -r(hardware) force to use hardware codec\n"); 603a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, " -o playback audio\n"); 60419c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber fprintf(stderr, " -w(rite) filename (write to .mp4 file)\n"); 60566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber fprintf(stderr, " -k seek test\n"); 606fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber fprintf(stderr, " -x display a histogram of decoding times/fps " 607fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber "(video only)\n"); 608c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber fprintf(stderr, " -S allocate buffers from a surface\n"); 60916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber fprintf(stderr, " -T allocate buffers from a surface texture\n"); 610d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber fprintf(stderr, " -d(ump) filename (raw stream data to a file)\n"); 611c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen fprintf(stderr, " -D(ump) filename (decoded PCM data to a file)\n"); 6122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 6132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 6141ab12519ec3d4922d1980f975fc884908879e0f0James Dongstatic void dumpCodecProfiles(const sp<IOMX>& omx, bool queryDecoders) { 6151ab12519ec3d4922d1980f975fc884908879e0f0James Dong const char *kMimeTypes[] = { 6161ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_VIDEO_AVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 6171ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_VIDEO_H263, MEDIA_MIMETYPE_AUDIO_AAC, 6181ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_AUDIO_AMR_NB, MEDIA_MIMETYPE_AUDIO_AMR_WB, 6191ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_AUDIO_MPEG, MEDIA_MIMETYPE_AUDIO_G711_MLAW, 6201ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_AUDIO_G711_ALAW, MEDIA_MIMETYPE_AUDIO_VORBIS, 6211ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_VIDEO_VPX 6221ab12519ec3d4922d1980f975fc884908879e0f0James Dong }; 6231ab12519ec3d4922d1980f975fc884908879e0f0James Dong 624209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong const char *codecType = queryDecoders? "decoder" : "encoder"; 625209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong printf("%s profiles:\n", codecType); 6261ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6271ab12519ec3d4922d1980f975fc884908879e0f0James Dong for (size_t k = 0; k < sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); ++k) { 6281ab12519ec3d4922d1980f975fc884908879e0f0James Dong printf("type '%s':\n", kMimeTypes[k]); 6291ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6301ab12519ec3d4922d1980f975fc884908879e0f0James Dong Vector<CodecCapabilities> results; 6311ab12519ec3d4922d1980f975fc884908879e0f0James Dong // will retrieve hardware and software codecs 6321ab12519ec3d4922d1980f975fc884908879e0f0James Dong CHECK_EQ(QueryCodecs(omx, kMimeTypes[k], 6331ab12519ec3d4922d1980f975fc884908879e0f0James Dong queryDecoders, 6341ab12519ec3d4922d1980f975fc884908879e0f0James Dong &results), (status_t)OK); 6351ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6361ab12519ec3d4922d1980f975fc884908879e0f0James Dong for (size_t i = 0; i < results.size(); ++i) { 637209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong printf(" %s '%s' supports ", 638209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong codecType, results[i].mComponentName.string()); 6391ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6401ab12519ec3d4922d1980f975fc884908879e0f0James Dong if (results[i].mProfileLevels.size() == 0) { 6411ab12519ec3d4922d1980f975fc884908879e0f0James Dong printf("NOTHING.\n"); 6421ab12519ec3d4922d1980f975fc884908879e0f0James Dong continue; 6431ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6441ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6451ab12519ec3d4922d1980f975fc884908879e0f0James Dong for (size_t j = 0; j < results[i].mProfileLevels.size(); ++j) { 6461ab12519ec3d4922d1980f975fc884908879e0f0James Dong const CodecProfileLevel &profileLevel = 6471ab12519ec3d4922d1980f975fc884908879e0f0James Dong results[i].mProfileLevels[j]; 6481ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6491ab12519ec3d4922d1980f975fc884908879e0f0James Dong printf("%s%ld/%ld", j > 0 ? ", " : "", 6501ab12519ec3d4922d1980f975fc884908879e0f0James Dong profileLevel.mProfile, profileLevel.mLevel); 6511ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6521ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6531ab12519ec3d4922d1980f975fc884908879e0f0James Dong printf("\n"); 6541ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6551ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6561ab12519ec3d4922d1980f975fc884908879e0f0James Dong} 6571ab12519ec3d4922d1980f975fc884908879e0f0James Dong 65820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint main(int argc, char **argv) { 65920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber android::ProcessState::self()->startThreadPool(); 66020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6610024245e134467d120b40099da16c467dc365e76Andreas Huber bool audioOnly = false; 6622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool listComponents = false; 66318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber bool dumpProfiles = false; 6645c1e3581978164d169050686c73810ce59304471Andreas Huber bool extractThumbnail = false; 66566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber bool seekTest = false; 666c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber bool useSurfaceAlloc = false; 66716f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber bool useSurfaceTexAlloc = false; 668d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber bool dumpStream = false; 669c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen bool dumpPCMStream = false; 670d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber String8 dumpStreamFilename; 6712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber gNumRepetitions = 1; 67238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = 0; 67380011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = -1; 6745c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = false; 675cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong gForceToUseHardwareCodec = false; 676a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 67719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber gWriteMP4 = false; 678fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber gDisplayHistogram = false; 6792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 680348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber sp<ALooper> looper; 681a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<LiveSession> liveSession; 682348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber 6832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int res; 684c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen while ((res = getopt(argc, argv, "han:lm:b:ptsrow:kxSTd:D:")) >= 0) { 6852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (res) { 6862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'a': 6872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 6882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber audioOnly = true; 6892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 6902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 6912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 692d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber case 'd': 693d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber { 694d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber dumpStream = true; 695d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber dumpStreamFilename.setTo(optarg); 696d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber break; 697d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } 698d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 699c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen case 'D': 700c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen { 701c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen dumpPCMStream = true; 702c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen audioOnly = true; 703c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen dumpStreamFilename.setTo(optarg); 704c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen break; 705c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen } 706c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen 7072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'l': 7082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 7092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber listComponents = true; 7102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 7112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 71338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber case 'm': 7142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'n': 71580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber case 'b': 7162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 7172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber char *end; 7182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long x = strtol(optarg, &end, 10); 7192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 7202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (*end != '\0' || end == optarg || x <= 0) { 7212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber x = 1; 7222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 72438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (res == 'n') { 72538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gNumRepetitions = x; 72680011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else if (res == 'm') { 72738b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = x; 72880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else { 72980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber CHECK_EQ(res, 'b'); 73080011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = x; 73138b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 7322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 7332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 73519c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber case 'w': 73619c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber { 73719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber gWriteMP4 = true; 73819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber gWriteMP4Filename.setTo(optarg); 73919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber break; 74019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } 74119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 74218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber case 'p': 74318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { 74418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber dumpProfiles = true; 74518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber break; 74618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 74718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 7485c1e3581978164d169050686c73810ce59304471Andreas Huber case 't': 7495c1e3581978164d169050686c73810ce59304471Andreas Huber { 7505c1e3581978164d169050686c73810ce59304471Andreas Huber extractThumbnail = true; 7515c1e3581978164d169050686c73810ce59304471Andreas Huber break; 7525c1e3581978164d169050686c73810ce59304471Andreas Huber } 7535c1e3581978164d169050686c73810ce59304471Andreas Huber 7545c1e3581978164d169050686c73810ce59304471Andreas Huber case 's': 7555c1e3581978164d169050686c73810ce59304471Andreas Huber { 7565c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = true; 7575c1e3581978164d169050686c73810ce59304471Andreas Huber break; 7585c1e3581978164d169050686c73810ce59304471Andreas Huber } 7595c1e3581978164d169050686c73810ce59304471Andreas Huber 760cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong case 'r': 761cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong { 762cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong gForceToUseHardwareCodec = true; 763cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong break; 764cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong } 765cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong 766a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber case 'o': 767a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber { 768a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = true; 769a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber break; 770a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 771a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 77266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber case 'k': 77366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber { 77466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber seekTest = true; 77566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 77666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 77766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 778fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber case 'x': 779fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber { 780fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber gDisplayHistogram = true; 781fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber break; 782fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 783fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 784c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber case 'S': 785c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber { 786c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber useSurfaceAlloc = true; 787c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber break; 788c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber } 789c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 79016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber case 'T': 79116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber { 79216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber useSurfaceTexAlloc = true; 79316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber break; 79416f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } 79516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 7962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case '?': 7972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'h': 7982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 7992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 8002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber usage(argv[0]); 8012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber exit(1); 8022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 8032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 8042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 8052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 8062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 807a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio && !audioOnly) { 808a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber // This doesn't make any sense if we're decoding the video track. 809a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 810a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 811a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 8122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argc -= optind; 8132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argv += optind; 8142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 8155c1e3581978164d169050686c73810ce59304471Andreas Huber if (extractThumbnail) { 8165c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 8175c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 8185c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaPlayerService> service = 8195c1e3581978164d169050686c73810ce59304471Andreas Huber interface_cast<IMediaPlayerService>(binder); 8205c1e3581978164d169050686c73810ce59304471Andreas Huber 8215c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(service.get() != NULL); 8225c1e3581978164d169050686c73810ce59304471Andreas Huber 8235c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaMetadataRetriever> retriever = 8245c1e3581978164d169050686c73810ce59304471Andreas Huber service->createMetadataRetriever(getpid()); 8255c1e3581978164d169050686c73810ce59304471Andreas Huber 8265c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(retriever != NULL); 8275c1e3581978164d169050686c73810ce59304471Andreas Huber 8285c1e3581978164d169050686c73810ce59304471Andreas Huber for (int k = 0; k < argc; ++k) { 8295c1e3581978164d169050686c73810ce59304471Andreas Huber const char *filename = argv[k]; 8305c1e3581978164d169050686c73810ce59304471Andreas Huber 831515e855eae78aa495da58356486aaa666cb57fd1James Dong bool failed = true; 832f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 833f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber int fd = open(filename, O_RDONLY | O_LARGEFILE); 834f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber CHECK_GE(fd, 0); 835f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 836f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber off64_t fileSize = lseek64(fd, 0, SEEK_END); 837f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber CHECK_GE(fileSize, 0ll); 838f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 839f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber CHECK_EQ(retriever->setDataSource(fd, 0, fileSize), (status_t)OK); 840f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 841f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber close(fd); 842f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber fd = -1; 843f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 84416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong sp<IMemory> mem = 84516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong retriever->getFrameAtTime(-1, 84616afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 8475c1e3581978164d169050686c73810ce59304471Andreas Huber 8481b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 849515e855eae78aa495da58356486aaa666cb57fd1James Dong failed = false; 85016afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong printf("getFrameAtTime(%s) => OK\n", filename); 851f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 852f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber VideoFrame *frame = (VideoFrame *)mem->pointer(); 853f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 85426a417f68526fee861bb527f1a4e3ed548979f93Colin Cross CHECK_EQ(writeJpegFile("/sdcard/out.jpg", 85526a417f68526fee861bb527f1a4e3ed548979f93Colin Cross (uint8_t *)frame + sizeof(VideoFrame), 85626a417f68526fee861bb527f1a4e3ed548979f93Colin Cross frame->mWidth, frame->mHeight), 0); 857515e855eae78aa495da58356486aaa666cb57fd1James Dong } 858515e855eae78aa495da58356486aaa666cb57fd1James Dong 859515e855eae78aa495da58356486aaa666cb57fd1James Dong { 8601b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber mem = retriever->extractAlbumArt(); 8611b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber 8621b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 863515e855eae78aa495da58356486aaa666cb57fd1James Dong failed = false; 8641b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("extractAlbumArt(%s) => OK\n", filename); 8651b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 8661b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 867515e855eae78aa495da58356486aaa666cb57fd1James Dong 868515e855eae78aa495da58356486aaa666cb57fd1James Dong if (failed) { 869515e855eae78aa495da58356486aaa666cb57fd1James Dong printf("both getFrameAtTime and extractAlbumArt " 870515e855eae78aa495da58356486aaa666cb57fd1James Dong "failed on file '%s'.\n", filename); 871515e855eae78aa495da58356486aaa666cb57fd1James Dong } 8725c1e3581978164d169050686c73810ce59304471Andreas Huber } 8735c1e3581978164d169050686c73810ce59304471Andreas Huber 8745c1e3581978164d169050686c73810ce59304471Andreas Huber return 0; 8755c1e3581978164d169050686c73810ce59304471Andreas Huber } 8765c1e3581978164d169050686c73810ce59304471Andreas Huber 87718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (dumpProfiles) { 87818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 87918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 88018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber sp<IMediaPlayerService> service = 88118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber interface_cast<IMediaPlayerService>(binder); 88218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 88318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(service.get() != NULL); 88418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 885318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 88618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber CHECK(omx.get() != NULL); 8871ab12519ec3d4922d1980f975fc884908879e0f0James Dong dumpCodecProfiles(omx, true /* queryDecoders */); 8881ab12519ec3d4922d1980f975fc884908879e0f0James Dong dumpCodecProfiles(omx, false /* queryDecoders */); 88918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 89018291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 8912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (listComponents) { 89220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 89320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 89420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 89520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 896693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(service.get() != NULL); 89720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 898318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IOMX> omx = service->getOMX(); 899693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber CHECK(omx.get() != NULL); 90020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 901134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber List<IOMX::ComponentInfo> list; 902318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber omx->listNodes(&list); 90320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 904134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber for (List<IOMX::ComponentInfo>::iterator it = list.begin(); 90520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber it != list.end(); ++it) { 906df57a0d6d3b0609e69ff79afa63fe44dfa91f6f5Jean-Michel Trivi printf("%s\t Roles: ", (*it).mName.string()); 907df57a0d6d3b0609e69ff79afa63fe44dfa91f6f5Jean-Michel Trivi for (List<String8>::iterator itRoles = (*it).mRoles.begin() ; 908df57a0d6d3b0609e69ff79afa63fe44dfa91f6f5Jean-Michel Trivi itRoles != (*it).mRoles.end() ; ++itRoles) { 909df57a0d6d3b0609e69ff79afa63fe44dfa91f6f5Jean-Michel Trivi printf("%s\t", (*itRoles).string()); 910df57a0d6d3b0609e69ff79afa63fe44dfa91f6f5Jean-Michel Trivi } 911df57a0d6d3b0609e69ff79afa63fe44dfa91f6f5Jean-Michel Trivi printf("\n"); 91220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 91320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 91420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 915c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber sp<SurfaceComposerClient> composerClient; 916c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber sp<SurfaceControl> control; 917c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 91816f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if ((useSurfaceAlloc || useSurfaceTexAlloc) && !audioOnly) { 91916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if (useSurfaceAlloc) { 92016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber composerClient = new SurfaceComposerClient; 92116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK_EQ(composerClient->initCheck(), (status_t)OK); 92216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 92316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber control = composerClient->createSurface( 92416f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber String8("A Surface"), 92516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 1280, 92616f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 800, 92716f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber PIXEL_FORMAT_RGB_565, 92816f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 0); 92916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 93016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(control != NULL); 93116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(control->isValid()); 93216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 9332df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian SurfaceComposerClient::openGlobalTransaction(); 93493d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK); 93516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK_EQ(control->show(), (status_t)OK); 9362df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 93716f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 93816f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber gSurface = control->getSurface(); 93916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(gSurface != NULL); 94016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } else { 94116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(useSurfaceTexAlloc); 94216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 94316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber sp<SurfaceTexture> texture = new SurfaceTexture(0 /* tex */); 94416f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber gSurface = new SurfaceTextureClient(texture); 94516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } 94693d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber 94793d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ((status_t)OK, 94893d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber native_window_api_connect( 94993d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber gSurface.get(), NATIVE_WINDOW_API_MEDIA)); 950c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber } 951c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 95220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource::RegisterDefaultSniffers(); 95320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 95420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber OMXClient client; 95520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = client.connect(); 95620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (int k = 0; k < argc; ++k) { 958bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber bool syncInfoPresent = true; 959bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 9602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *filename = argv[k]; 96120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9621c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber sp<DataSource> dataSource = DataSource::CreateFromURI(filename); 9630024245e134467d120b40099da16c467dc365e76Andreas Huber 964ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (strncasecmp(filename, "sine:", 5) 965ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber && strncasecmp(filename, "httplive://", 11) 966ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber && dataSource == NULL) { 967a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, "Unable to create data source.\n"); 968a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber return 1; 969a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 970a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 9712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool isJPEG = false; 97220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t len = strlen(filename); 9742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (len >= 4 && !strcasecmp(filename + len - 4, ".jpg")) { 9752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber isJPEG = true; 9762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 97720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 978ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber Vector<sp<MediaSource> > mediaSources; 9792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MediaSource> mediaSource; 98020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (isJPEG) { 9822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = new JPEGSource(dataSource); 983ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (gWriteMP4) { 984ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSources.push(mediaSource); 985ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 986a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (!strncasecmp("sine:", filename, 5)) { 987a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber char *end; 988a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber long sampleRate = strtol(filename + 5, &end, 10); 989a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 990a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (end == filename + 5) { 991a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber sampleRate = 44100; 992a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 993a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber mediaSource = new SineSource(sampleRate, 1); 994ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (gWriteMP4) { 995ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSources.push(mediaSource); 996ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 9972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } else { 998348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber sp<MediaExtractor> extractor; 999348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber 10002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (!strncasecmp("httplive://", filename, 11)) { 1001ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber String8 uri("http://"); 1002ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber uri.append(filename + 11); 1003ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1004a44153c1a57202fb538659eb50706e60454d6273Andreas Huber if (looper == NULL) { 1005a44153c1a57202fb538659eb50706e60454d6273Andreas Huber looper = new ALooper; 1006a44153c1a57202fb538659eb50706e60454d6273Andreas Huber looper->start(); 1007a44153c1a57202fb538659eb50706e60454d6273Andreas Huber } 1008a44153c1a57202fb538659eb50706e60454d6273Andreas Huber liveSession = new LiveSession; 1009a44153c1a57202fb538659eb50706e60454d6273Andreas Huber looper->registerHandler(liveSession); 1010a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 1011a44153c1a57202fb538659eb50706e60454d6273Andreas Huber liveSession->connect(uri.string()); 1012a44153c1a57202fb538659eb50706e60454d6273Andreas Huber dataSource = liveSession->getDataSource(); 1013ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1014ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber extractor = 1015ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber MediaExtractor::Create( 1016ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber dataSource, MEDIA_MIMETYPE_CONTAINER_MPEG2TS); 1017ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1018ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber syncInfoPresent = false; 1019348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber } else { 1020348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber extractor = MediaExtractor::Create(dataSource); 10212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1022348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber if (extractor == NULL) { 1023348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber fprintf(stderr, "could not create extractor.\n"); 1024348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber return -1; 1025348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber } 1026fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 1027fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber sp<MetaData> meta = extractor->getMetaData(); 1028fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 1029fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (meta != NULL) { 1030fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber const char *mime; 1031fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1032fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 1033fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) { 1034fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber syncInfoPresent = false; 1035fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 1036fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 1037b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong } 103820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t numTracks = extractor->countTracks(); 104020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1041ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (gWriteMP4) { 1042ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber bool haveAudio = false; 1043ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber bool haveVideo = false; 1044ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber for (size_t i = 0; i < numTracks; ++i) { 1045ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber sp<MediaSource> source = extractor->getTrack(i); 1046ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1047ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber const char *mime; 1048ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK(source->getFormat()->findCString( 1049ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber kKeyMIMEType, &mime)); 1050ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1051ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber bool useTrack = false; 1052ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (!haveAudio && !strncasecmp("audio/", mime, 6)) { 1053ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber haveAudio = true; 1054ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber useTrack = true; 1055ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else if (!haveVideo && !strncasecmp("video/", mime, 6)) { 1056ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber haveVideo = true; 1057ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber useTrack = true; 1058ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 105920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1060ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (useTrack) { 1061ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSources.push(source); 106220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1063ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (haveAudio && haveVideo) { 1064ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber break; 1065ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1066ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 10672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1068ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else { 1069ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber sp<MetaData> meta; 1070ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber size_t i; 1071ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber for (i = 0; i < numTracks; ++i) { 1072ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber meta = extractor->getTrackMetaData( 1073ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber i, MediaExtractor::kIncludeExtensiveMetaData); 10742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1075ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber const char *mime; 1076ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber meta->findCString(kKeyMIMEType, &mime); 1077ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1078ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (audioOnly && !strncasecmp(mime, "audio/", 6)) { 1079ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber break; 1080ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1081ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1082ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (!audioOnly && !strncasecmp(mime, "video/", 6)) { 1083ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber break; 1084ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1085ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1086ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber meta = NULL; 10872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1088a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 1089ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (meta == NULL) { 1090ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber fprintf(stderr, 1091ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber "No suitable %s track found. The '-a' option will " 1092ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber "target audio tracks only, the default is to target " 1093ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber "video tracks only.\n", 1094ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber audioOnly ? "audio" : "video"); 1095ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber return -1; 1096ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1097a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 1098ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber int64_t thumbTimeUs; 1099ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (meta->findInt64(kKeyThumbnailTime, &thumbTimeUs)) { 1100ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber printf("thumbnailTime: %lld us (%.2f secs)\n", 1101ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber thumbTimeUs, thumbTimeUs / 1E6); 1102ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 11032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1104ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSource = extractor->getTrack(i); 11055c1e3581978164d169050686c73810ce59304471Andreas Huber } 110620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 110720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 110819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber if (gWriteMP4) { 1109ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber writeSourcesToMP4(mediaSources, syncInfoPresent); 1110d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } else if (dumpStream) { 1111d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber dumpSource(mediaSource, dumpStreamFilename); 1112c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen } else if (dumpPCMStream) { 1113c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen OMXClient client; 1114c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen CHECK_EQ(client.connect(), (status_t)OK); 1115c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen 1116c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen sp<MediaSource> decSource = 1117c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen OMXCodec::Create( 1118c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen client.interface(), 1119c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen mediaSource->getFormat(), 1120c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen false, 1121c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen mediaSource, 1122c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen 0, 1123c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen 0); 1124c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen 1125c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen dumpSource(decSource, dumpStreamFilename); 112666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } else if (seekTest) { 112766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber performSeekTest(mediaSource); 112819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } else { 112919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber playSource(&client, mediaSource); 113019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } 113120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 113220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 113316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if ((useSurfaceAlloc || useSurfaceTexAlloc) && !audioOnly) { 113493d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ((status_t)OK, 113593d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber native_window_api_disconnect( 113693d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber gSurface.get(), NATIVE_WINDOW_API_MEDIA)); 113793d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber 1138c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber gSurface.clear(); 1139c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 114016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if (useSurfaceAlloc) { 114116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber composerClient->dispose(); 114216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } 1143c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber } 1144c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 114520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber client.disconnect(); 114620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 114720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 0; 114820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 1149