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 17db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <inttypes.h> 18db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <fcntl.h> 19db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <stdlib.h> 20db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <string.h> 21db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <sys/time.h> 22c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen#include <sys/types.h> 23c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen#include <sys/stat.h> 24db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn 25bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber//#define LOG_NDEBUG 0 26bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber#define LOG_TAG "stagefright" 27bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber#include <media/stagefright/foundation/ADebug.h> 28bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 2926a417f68526fee861bb527f1a4e3ed548979f93Colin Cross#include "jpeg.h" 30a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber#include "SineSource.h" 31a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/ProcessState.h> 34d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/DataSource.h> 35d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/MediaExtractor.h> 36d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/MediaSource.h> 375fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/ICrypto.h> 381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h> 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h> 405fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/foundation/ABuffer.h> 41348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber#include <media/stagefright/foundation/ALooper.h> 425fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/foundation/AMessage.h> 435fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/foundation/AUtils.h> 44ba40190c5e8d9bfe5b814984c6861809fea064bdPawin Vongmasa#include "include/NuCachedSource2.h" 45a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber#include <media/stagefright/AudioPlayer.h> 46d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/stagefright/DataSourceFactory.h> 47777893a928680f09e306b4b9efc1d5cf4479a9daAndreas Huber#include <media/stagefright/JPEGSource.h> 48d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/stagefright/InterfaceUtils.h> 495fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/MediaCodec.h> 505fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/MediaCodecList.h> 5118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 521c70247536457f7b7fa84daa3482bd3d3b44e225Andreas Huber#include <media/stagefright/MediaErrors.h> 53d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/stagefright/MediaExtractorFactory.h> 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 555fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/SimpleDecodingSource.h> 565fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar#include <media/stagefright/Utils.h> 575c1e3581978164d169050686c73810ce59304471Andreas Huber#include <media/mediametadataretriever.h> 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber#include <media/stagefright/foundation/hexdump.h> 600da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#include <media/stagefright/MPEG2TSWriter.h> 6119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber#include <media/stagefright/MPEG4Writer.h> 6219c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 63f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber#include <private/media/VideoFrame.h> 64f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 65c85a986af84962515c10499faab3dc8f9a0948d4Ying Wang#include <gui/GLConsumer.h> 661a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h> 67df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/SurfaceComposerClient.h> 68c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 699c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa#include <android/hardware/media/omx/1.0/IOmx.h> 709c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberusing namespace android; 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic long gNumRepetitions; 7438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huberstatic long gMaxNumFrames; // 0 means decode all available. 7580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huberstatic long gReproduceBug; // if not -1. 765c1e3581978164d169050686c73810ce59304471Andreas Huberstatic bool gPreferSoftwareCodec; 77cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dongstatic bool gForceToUseHardwareCodec; 78a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huberstatic bool gPlaybackAudio; 7919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huberstatic bool gWriteMP4; 80fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huberstatic bool gDisplayHistogram; 814d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissenstatic bool showProgress = true; 8219c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huberstatic String8 gWriteMP4Filename; 834f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kimstatic String8 gComponentNameOverride; 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 85c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huberstatic sp<ANativeWindow> gSurface; 86c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatic int64_t getNowUs() { 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct timeval tv; 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber gettimeofday(&tv, NULL); 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 91d2858f047b2c52d719719532f24899c0e03c2099Andreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll; 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 94fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huberstatic int CompareIncreasing(const int64_t *a, const int64_t *b) { 95fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber return (*a) < (*b) ? -1 : (*a) > (*b) ? 1 : 0; 96fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber} 97fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 98fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huberstatic void displayDecodeHistogram(Vector<int64_t> *decodeTimesUs) { 99fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("decode times:\n"); 100fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 101fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber decodeTimesUs->sort(CompareIncreasing); 102fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 103fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber size_t n = decodeTimesUs->size(); 104fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t minUs = decodeTimesUs->itemAt(0); 105fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t maxUs = decodeTimesUs->itemAt(n - 1); 106fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 107377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("min decode time %" PRId64 " us (%.2f secs)\n", minUs, minUs / 1E6); 108377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("max decode time %" PRId64 " us (%.2f secs)\n", maxUs, maxUs / 1E6); 109fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 110fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber size_t counts[100]; 111fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber for (size_t i = 0; i < 100; ++i) { 112fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber counts[i] = 0; 113fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 114fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 115fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber for (size_t i = 0; i < n; ++i) { 116fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t x = decodeTimesUs->itemAt(i); 117fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 118fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber size_t slot = ((x - minUs) * 100) / (maxUs - minUs); 119fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (slot == 100) { slot = 99; } 120fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 121fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber ++counts[slot]; 122fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 123fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 124fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber for (size_t i = 0; i < 100; ++i) { 125fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber int64_t slotUs = minUs + (i * (maxUs - minUs) / 100); 126fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 127fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber double fps = 1E6 / slotUs; 128377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("[%.2f fps]: %zu\n", fps, counts[i]); 129fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 130fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber} 131fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 1328a674dcc94936e2306121016ab258b4c00cc9d98James Dongstatic void displayAVCProfileLevelIfPossible(const sp<MetaData>& meta) { 1338a674dcc94936e2306121016ab258b4c00cc9d98James Dong uint32_t type; 1348a674dcc94936e2306121016ab258b4c00cc9d98James Dong const void *data; 1358a674dcc94936e2306121016ab258b4c00cc9d98James Dong size_t size; 1368a674dcc94936e2306121016ab258b4c00cc9d98James Dong if (meta->findData(kKeyAVCC, &type, &data, &size)) { 1378a674dcc94936e2306121016ab258b4c00cc9d98James Dong const uint8_t *ptr = (const uint8_t *)data; 1388a674dcc94936e2306121016ab258b4c00cc9d98James Dong CHECK(size >= 7); 1398a674dcc94936e2306121016ab258b4c00cc9d98James Dong CHECK(ptr[0] == 1); // configurationVersion == 1 1408a674dcc94936e2306121016ab258b4c00cc9d98James Dong uint8_t profile = ptr[1]; 1418a674dcc94936e2306121016ab258b4c00cc9d98James Dong uint8_t level = ptr[3]; 1428a674dcc94936e2306121016ab258b4c00cc9d98James Dong fprintf(stderr, "AVC video profile %d and level %d\n", profile, level); 1438a674dcc94936e2306121016ab258b4c00cc9d98James Dong } 1448a674dcc94936e2306121016ab258b4c00cc9d98James Dong} 1458a674dcc94936e2306121016ab258b4c00cc9d98James Dong 146ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kangstatic void dumpSource(const sp<MediaSource> &source, const String8 &filename) { 147d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber FILE *out = fopen(filename.string(), "wb"); 148d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 149d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber CHECK_EQ((status_t)OK, source->start()); 150d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 151d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber status_t err; 152d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber for (;;) { 1531889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase *mbuf; 154d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber err = source->read(&mbuf); 155d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 156d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber if (err == INFO_FORMAT_CHANGED) { 157d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber continue; 158d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } else if (err != OK) { 159d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber break; 160d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } 161d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 162d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber CHECK_EQ( 163d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber fwrite((const uint8_t *)mbuf->data() + mbuf->range_offset(), 164d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 1, 165d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber mbuf->range_length(), 166d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber out), 167b8c35f94470d1518e2def0582aaec4e038c92af0Colin Cross mbuf->range_length()); 168d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 169d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber mbuf->release(); 170d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber mbuf = NULL; 171d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } 172d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 173d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber CHECK_EQ((status_t)OK, source->stop()); 174d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 175d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber fclose(out); 176d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber out = NULL; 177d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber} 178d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 179ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kangstatic void playSource(sp<MediaSource> &source) { 180693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MetaData> meta = source->getFormat(); 181693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 182125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber const char *mime; 183125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 184125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber 185ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang sp<MediaSource> rawSource; 186125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mime)) { 187125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource = source; 188125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } else { 189cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong int flags = 0; 190cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong if (gPreferSoftwareCodec) { 1915fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar flags |= MediaCodecList::kPreferSoftwareCodecs; 192cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong } 193cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong if (gForceToUseHardwareCodec) { 194cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong CHECK(!gPreferSoftwareCodec); 1955fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar flags |= MediaCodecList::kHardwareCodecsOnly; 196cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong } 1974f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim rawSource = SimpleDecodingSource::Create( 1984f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim source, flags, gSurface, 1994f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim gComponentNameOverride.isEmpty() ? nullptr : gComponentNameOverride.c_str(), 2004f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim !gComponentNameOverride.isEmpty()); 201125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber if (rawSource == NULL) { 202125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber return; 203125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber } 2048a674dcc94936e2306121016ab258b4c00cc9d98James Dong displayAVCProfileLevelIfPossible(meta); 205693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 207c225da975515892952602cd3b1e24efc0cceaa4dAndreas Huber source.clear(); 208c225da975515892952602cd3b1e24efc0cceaa4dAndreas Huber 209139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = rawSource->start(); 210139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 211139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 212139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber fprintf(stderr, "rawSource returned error %d (0x%08x)\n", err, err); 213139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return; 214139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 215693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 216a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio) { 217a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber AudioPlayer *player = new AudioPlayer(NULL); 218a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->setSource(rawSource); 21964105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber rawSource.clear(); 220a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 221a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player->start(true /* sourceAlreadyStarted */); 222a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 223a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber status_t finalStatus; 224a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber while (!player->reachedEOS(&finalStatus)) { 225a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber usleep(100000ll); 226a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 227a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 228a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber delete player; 229a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber player = NULL; 23064105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber 23164105f956f15969dbe1ec7319f6caa2a984e588bAndreas Huber return; 232a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (gReproduceBug >= 3 && gReproduceBug <= 5) { 233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findInt64(kKeyDuration, &durationUs)); 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2365228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber status_t err; 2371889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase *buffer; 2385228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber MediaSource::ReadOptions options; 2395228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber int64_t seekTimeUs = -1; 2405228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber for (;;) { 241125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber err = rawSource->read(&buffer, &options); 2425228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.clearSeekTo(); 2435228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2445228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool shouldSeek = false; 2457f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 246bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK(buffer == NULL); 2477f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 2487f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 2497f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 2507f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } else if (err != OK) { 2515228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("reached EOF.\n"); 2525228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2535228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = true; 2545228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } else { 25548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t timestampUs; 2563d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen CHECK(buffer->meta_data().findInt64(kKeyTime, ×tampUs)); 2575228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2585228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber bool failed = false; 259af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 2605228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (seekTimeUs >= 0) { 26148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber int64_t diff = timestampUs - seekTimeUs; 2625228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 263af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (diff < 0) { 264af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber diff = -diff; 265af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 266af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 267af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if ((gReproduceBug == 4 && diff > 500000) 268af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber || (gReproduceBug == 5 && timestampUs < 0)) { 269af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber printf("wanted: %.2f secs, got: %.2f secs\n", 270af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs / 1E6, timestampUs / 1E6); 2715228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2725228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber printf("ERROR: "); 2735228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber failed = true; 2745228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2755228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2765228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 277377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("buffer has timestamp %" PRId64 " us (%.2f secs)\n", 27848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber timestampUs, timestampUs / 1E6); 2795228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2805228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer->release(); 2815228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber buffer = NULL; 2825228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2835228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (failed) { 2845228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber break; 2855228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2865228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2875228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber shouldSeek = ((double)rand() / RAND_MAX) < 0.1; 288af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber 289af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber if (gReproduceBug == 3) { 290af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber shouldSeek = false; 291af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber } 2925228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 2935228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2945228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs = -1; 2955228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 2965228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber if (shouldSeek) { 297af6757c1de099b5352a52b8ed4a67af40f49fc78Andreas Huber seekTimeUs = (rand() * (float)durationUs) / RAND_MAX; 2985228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber options.setSeekTo(seekTimeUs); 2995228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 300377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("seeking to %" PRId64 " us (%.2f secs)\n", 3015228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber seekTimeUs, seekTimeUs / 1E6); 3025228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 3035228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 3045228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 305125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 3065228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 3075228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber return; 3085228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber } 3095228dd1b7468bfc86a807a299f515d33048f96acAndreas Huber 3102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int n = 0; 311693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t startTime = getNowUs(); 312693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long numIterationsLeft = gNumRepetitions; 3142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaSource::ReadOptions options; 315dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber 31636e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t sumDecodeUs = 0; 3177f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber int64_t totalBytes = 0; 31836e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 319fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber Vector<int64_t> decodeTimesUs; 320fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 3212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber while (numIterationsLeft-- > 0) { 32238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber long numFrames = 0; 32338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 3241889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase *buffer; 3252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 32736e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t startDecodeUs = getNowUs(); 328125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber status_t err = rawSource->read(&buffer, &options); 32936e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber int64_t delayDecodeUs = getNowUs() - startDecodeUs; 33036e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 3312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.clearSeekTo(); 3322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (err != OK) { 334bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK(buffer == NULL); 3357f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 3367f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber if (err == INFO_FORMAT_CHANGED) { 3377f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber printf("format changed.\n"); 3387f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber continue; 3397f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber } 3407f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber 3412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 3422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 344fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (buffer->range_length() > 0) { 345fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (gDisplayHistogram && n > 0) { 346fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber // Ignore the first time since it includes some setup 347fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber // cost. 348fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber decodeTimesUs.push(delayDecodeUs); 349fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 350fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 3514d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen if (showProgress && (n++ % 16) == 0) { 352fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber printf("."); 353fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber fflush(stdout); 354fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 3552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 3562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 35736e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber sumDecodeUs += delayDecodeUs; 3587f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber totalBytes += buffer->range_length(); 35936e3ee0094e845ed9d2a1c755addecfde9db3a68Andreas Huber 3602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 3612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 36238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber 36338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber ++numFrames; 36438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (gMaxNumFrames > 0 && numFrames == gMaxNumFrames) { 36538b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber break; 36638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 36780011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber 36880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber if (gReproduceBug == 1 && numFrames == 40) { 36980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber printf("seeking past the end now."); 370a8a371c8a0d88d144d095404673d00cae6464fdeAndreas Huber options.setSeekTo(0x7fffffffL); 371e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber } else if (gReproduceBug == 2 && numFrames == 40) { 372e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber printf("seeking to 5 secs."); 373e07db23c4935e47ecedfec7537ba95163e5836e5Andreas Huber options.setSeekTo(5000000); 37480011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } 375693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 376693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3774d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen if (showProgress) { 3784d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen printf("$"); 3794d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen fflush(stdout); 3804d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen } 3812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 3822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber options.setSeekTo(0); 383693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 3842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 385125ef261deb4efbb50cc41c60902dea48d8d4187Andreas Huber rawSource->stop(); 386693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber printf("\n"); 387693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 388693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber int64_t delay = getNowUs() - startTime; 3897f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber if (!strncasecmp("video/", mime, 6)) { 3907f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f fps\n", n * 1E6 / delay); 391693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 3927f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. time to decode one buffer %.2f usecs\n", 3937f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber (double)sumDecodeUs / n); 3947f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 3957f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("decoded a total of %d frame(s).\n", n); 396fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 397fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber if (gDisplayHistogram) { 398fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber displayDecodeHistogram(&decodeTimesUs); 399fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 4007f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } else if (!strncasecmp("audio/", mime, 6)) { 4017f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // Frame count makes less sense for audio, as the output buffer 4027f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber // sizes may be different across decoders. 4037f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber printf("avg. %.2f KB/sec\n", totalBytes / 1024 * 1E6 / delay); 4047f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber 405377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("decoded a total of %" PRId64 " bytes\n", totalBytes); 4067f498b90a4300ef9badf14d202b0a67c26e20931Andreas Huber } 407693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 408693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 409bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber//////////////////////////////////////////////////////////////////////////////// 410bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 411bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstruct DetectSyncSource : public MediaSource { 412ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang explicit DetectSyncSource(const sp<MediaSource> &source); 413bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 414bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual status_t start(MetaData *params = NULL); 415bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual status_t stop(); 416bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual sp<MetaData> getFormat(); 417bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 418bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber virtual status_t read( 4191889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **buffer, const ReadOptions *options); 420bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 421bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberprivate: 422ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber enum StreamType { 423ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber AVC, 424ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber MPEG4, 425ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber H263, 426ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber OTHER, 427ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber }; 428ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 429ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang sp<MediaSource> mSource; 430ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber StreamType mStreamType; 431fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber bool mSawFirstIDRFrame; 432bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 433bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DetectSyncSource); 434bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber}; 435bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 436ba8128f9db82da66f28c6e6740d4721d80da954eDongwon KangDetectSyncSource::DetectSyncSource(const sp<MediaSource> &source) 437bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber : mSource(source), 438fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mStreamType(OTHER), 439fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mSawFirstIDRFrame(false) { 440bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber const char *mime; 441bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK(mSource->getFormat()->findCString(kKeyMIMEType, &mime)); 442bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 443ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) { 444ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mStreamType = AVC; 445ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)) { 446ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mStreamType = MPEG4; 447ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK(!"sync frame detection not implemented yet for MPEG4"); 448ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_H263)) { 449ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mStreamType = H263; 450ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK(!"sync frame detection not implemented yet for H.263"); 451ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 452bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 453bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 454bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatus_t DetectSyncSource::start(MetaData *params) { 455fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mSawFirstIDRFrame = false; 456fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 457bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return mSource->start(params); 458bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 459bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 460bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatus_t DetectSyncSource::stop() { 461bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return mSource->stop(); 462bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 463bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 464bbc38312e4521cfd4299203591ef366b7624f043Andreas Hubersp<MetaData> DetectSyncSource::getFormat() { 465bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return mSource->getFormat(); 466bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 467bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 4681889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kangstatic bool isIDRFrame(MediaBufferBase *buffer) { 469bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber const uint8_t *data = 470bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber (const uint8_t *)buffer->data() + buffer->range_offset(); 471bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber size_t size = buffer->range_length(); 472bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber for (size_t i = 0; i + 3 < size; ++i) { 473bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber if (!memcmp("\x00\x00\x01", &data[i], 3)) { 474bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber uint8_t nalType = data[i + 3] & 0x1f; 475bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber if (nalType == 5) { 476bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return true; 477bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 478bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 479bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 480bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 481bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return false; 482bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 483bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 484bbc38312e4521cfd4299203591ef366b7624f043Andreas Huberstatus_t DetectSyncSource::read( 4851889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **buffer, const ReadOptions *options) { 486fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber for (;;) { 487fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber status_t err = mSource->read(buffer, options); 488bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 489fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (err != OK) { 490fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber return err; 491fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 492bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 493fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (mStreamType == AVC) { 494fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber bool isIDR = isIDRFrame(*buffer); 4953d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen (*buffer)->meta_data().setInt32(kKeyIsSyncFrame, isIDR); 496fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (isIDR) { 497fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber mSawFirstIDRFrame = true; 498fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 499fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } else { 5003d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen (*buffer)->meta_data().setInt32(kKeyIsSyncFrame, true); 501fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 502fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 503fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber if (mStreamType != AVC || mSawFirstIDRFrame) { 504fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber break; 505fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 506fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 507fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber // Ignore everything up to the first IDR frame. 508fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber (*buffer)->release(); 509fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber *buffer = NULL; 510bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber } 511bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 512bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber return OK; 513bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber} 514bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 515bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber//////////////////////////////////////////////////////////////////////////////// 516bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 517ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huberstatic void writeSourcesToMP4( 518ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang Vector<sp<MediaSource> > &sources, bool syncInfoPresent) { 5190da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#if 0 52019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber sp<MPEG4Writer> writer = 52119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber new MPEG4Writer(gWriteMP4Filename.string()); 5220da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#else 523c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen int fd = open(gWriteMP4Filename.string(), O_CREAT | O_LARGEFILE | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); 524c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen if (fd < 0) { 525c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen fprintf(stderr, "couldn't open file"); 526c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen return; 527c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen } 5280da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber sp<MPEG2TSWriter> writer = 529c6ac859f5a82ea8642bc6351a45508a15f224f32Marco Nelissen new MPEG2TSWriter(fd); 5300da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#endif 53119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 532bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber // at most one minute. 533bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber writer->setMaxFileDuration(60000000ll); 534bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 535ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber for (size_t i = 0; i < sources.size(); ++i) { 536ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang sp<MediaSource> source = sources.editItemAt(i); 537ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 538ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK_EQ(writer->addSource( 539ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber syncInfoPresent ? source : new DetectSyncSource(source)), 540ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber (status_t)OK); 541ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 54219c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 54319c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber sp<MetaData> params = new MetaData; 544de05c8eab188e98798f2b9c3dfac53dbc18ef584ztenghui params->setInt32(kKeyRealTimeRecording, false); 545bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK_EQ(writer->start(params.get()), (status_t)OK); 54619c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 54719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber while (!writer->reachedEOS()) { 54819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber usleep(100000); 54919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } 55019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber writer->stop(); 55119c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber} 55219c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 553ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kangstatic void performSeekTest(const sp<MediaSource> &source) { 554bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK_EQ((status_t)OK, source->start()); 55566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 55666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber int64_t durationUs; 55766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(source->getFormat()->findInt64(kKeyDuration, &durationUs)); 55866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 55966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber for (int64_t seekTimeUs = 0; seekTimeUs <= durationUs; 56066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber seekTimeUs += 60000ll) { 56166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber MediaSource::ReadOptions options; 56266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber options.setSeekTo( 56366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber seekTimeUs, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 56466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 5651889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase *buffer; 56666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber status_t err; 56766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber for (;;) { 56866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber err = source->read(&buffer, &options); 56966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 57066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber options.clearSeekTo(); 57166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 57266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (err == INFO_FORMAT_CHANGED) { 57366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer == NULL); 57466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber continue; 57566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 57666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 57766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (err != OK) { 57866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer == NULL); 57966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 58066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 58166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 58266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (buffer->range_length() > 0) { 58366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 58466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 58566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 58666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber CHECK(buffer != NULL); 58766d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 58866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer->release(); 58966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer = NULL; 59066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 59166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 59266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber if (err == OK) { 59366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber int64_t timeUs; 5943d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen CHECK(buffer->meta_data().findInt64(kKeyTime, &timeUs)); 59566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 596377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("%" PRId64 "\t%" PRId64 "\t%" PRId64 "\n", 597377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT seekTimeUs, timeUs, seekTimeUs - timeUs); 59866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 59966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer->release(); 60066d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber buffer = NULL; 60166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } else { 60266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber printf("ERROR\n"); 60366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 60466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 60566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 60666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 607bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber CHECK_EQ((status_t)OK, source->stop()); 60866d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber} 60966d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 6102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatic void usage(const char *me) { 61171bd6f8faf362659d3a9052549607039585f4922Jean-Michel Trivi fprintf(stderr, "usage: %s [options] [input_filename]\n", me); 6122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -h(elp)\n"); 6132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -a(udio)\n"); 6142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -n repetitions\n"); 6152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber fprintf(stderr, " -l(ist) components\n"); 61638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber fprintf(stderr, " -m max-number-of-frames-to-decode in each pass\n"); 61780011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber fprintf(stderr, " -b bug to reproduce\n"); 61818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber fprintf(stderr, " -p(rofiles) dump decoder profiles supported\n"); 6191b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); 6205c1e3581978164d169050686c73810ce59304471Andreas Huber fprintf(stderr, " -s(oftware) prefer software codec\n"); 621cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong fprintf(stderr, " -r(hardware) force to use hardware codec\n"); 622a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, " -o playback audio\n"); 62319c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber fprintf(stderr, " -w(rite) filename (write to .mp4 file)\n"); 62466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber fprintf(stderr, " -k seek test\n"); 62596310bd5caa54a4ced01d3fca684a8f89799fefdWonsik Kim fprintf(stderr, " -N(ame) of the component\n"); 626fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber fprintf(stderr, " -x display a histogram of decoding times/fps " 627fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber "(video only)\n"); 6284d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen fprintf(stderr, " -q don't show progress indicator\n"); 629c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber fprintf(stderr, " -S allocate buffers from a surface\n"); 63016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber fprintf(stderr, " -T allocate buffers from a surface texture\n"); 63171bd6f8faf362659d3a9052549607039585f4922Jean-Michel Trivi fprintf(stderr, " -d(ump) output_filename (raw stream data to a file)\n"); 63271bd6f8faf362659d3a9052549607039585f4922Jean-Michel Trivi fprintf(stderr, " -D(ump) output_filename (decoded PCM data to a file)\n"); 6332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 6342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 6355fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnarstatic void dumpCodecProfiles(bool queryDecoders) { 6361ab12519ec3d4922d1980f975fc884908879e0f0James Dong const char *kMimeTypes[] = { 6371ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_VIDEO_AVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 6381ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_VIDEO_H263, MEDIA_MIMETYPE_AUDIO_AAC, 6391ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_AUDIO_AMR_NB, MEDIA_MIMETYPE_AUDIO_AMR_WB, 6401ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_AUDIO_MPEG, MEDIA_MIMETYPE_AUDIO_G711_MLAW, 6411ab12519ec3d4922d1980f975fc884908879e0f0James Dong MEDIA_MIMETYPE_AUDIO_G711_ALAW, MEDIA_MIMETYPE_AUDIO_VORBIS, 642a29c2b203d8bea8c21564765da5c9d7087448340Ronghua Wu MEDIA_MIMETYPE_VIDEO_VP8, MEDIA_MIMETYPE_VIDEO_VP9, 643a29c2b203d8bea8c21564765da5c9d7087448340Ronghua Wu MEDIA_MIMETYPE_VIDEO_DOLBY_VISION 6441ab12519ec3d4922d1980f975fc884908879e0f0James Dong }; 6451ab12519ec3d4922d1980f975fc884908879e0f0James Dong 646209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong const char *codecType = queryDecoders? "decoder" : "encoder"; 647209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong printf("%s profiles:\n", codecType); 6481ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6495fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<IMediaCodecList> list = MediaCodecList::getInstance(); 6505fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar size_t numCodecs = list->countCodecs(); 6515fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar 6521ab12519ec3d4922d1980f975fc884908879e0f0James Dong for (size_t k = 0; k < sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); ++k) { 6531ab12519ec3d4922d1980f975fc884908879e0f0James Dong printf("type '%s':\n", kMimeTypes[k]); 6541ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6555fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar for (size_t index = 0; index < numCodecs; ++index) { 6565fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<MediaCodecInfo> info = list->getCodecInfo(index); 6575fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar if (info == NULL || info->isEncoder() != !queryDecoders) { 6585fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar continue; 6595fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar } 6605fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar sp<MediaCodecInfo::Capabilities> caps = info->getCapabilitiesFor(kMimeTypes[k]); 6615fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar if (caps == NULL) { 6625fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar continue; 6635fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar } 664209ec37b27a4fb6c92005c91ecf993ec19a3d430James Dong printf(" %s '%s' supports ", 6655fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar codecType, info->getCodecName()); 6661ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6675fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar Vector<MediaCodecInfo::ProfileLevel> profileLevels; 6685fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar caps->getSupportedProfileLevels(&profileLevels); 6695fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar if (profileLevels.size() == 0) { 6705fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar printf("NOTHING.\n"); 6715fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar continue; 6721ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6731ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6745fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar for (size_t j = 0; j < profileLevels.size(); ++j) { 6755fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar const MediaCodecInfo::ProfileLevel &profileLevel = profileLevels[j]; 6761ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6775fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar printf("%s%u/%u", j > 0 ? ", " : "", 6785fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar profileLevel.mProfile, profileLevel.mLevel); 6791ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6801ab12519ec3d4922d1980f975fc884908879e0f0James Dong 6811ab12519ec3d4922d1980f975fc884908879e0f0James Dong printf("\n"); 6821ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6831ab12519ec3d4922d1980f975fc884908879e0f0James Dong } 6841ab12519ec3d4922d1980f975fc884908879e0f0James Dong} 6851ab12519ec3d4922d1980f975fc884908879e0f0James Dong 68620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint main(int argc, char **argv) { 68720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber android::ProcessState::self()->startThreadPool(); 68820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6890024245e134467d120b40099da16c467dc365e76Andreas Huber bool audioOnly = false; 6902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool listComponents = false; 69118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber bool dumpProfiles = false; 6925c1e3581978164d169050686c73810ce59304471Andreas Huber bool extractThumbnail = false; 69366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber bool seekTest = false; 694c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber bool useSurfaceAlloc = false; 69516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber bool useSurfaceTexAlloc = false; 696d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber bool dumpStream = false; 697c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen bool dumpPCMStream = false; 698d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber String8 dumpStreamFilename; 6992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber gNumRepetitions = 1; 70038b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = 0; 70180011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = -1; 7025c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = false; 703cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong gForceToUseHardwareCodec = false; 704a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 70519c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber gWriteMP4 = false; 706fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber gDisplayHistogram = false; 7072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 708348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber sp<ALooper> looper; 709348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber 7102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int res; 71196310bd5caa54a4ced01d3fca684a8f89799fefdWonsik Kim while ((res = getopt(argc, argv, "haqn:lm:b:ptsrow:kN:xSTd:D:")) >= 0) { 7122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (res) { 7132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'a': 7142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 7152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber audioOnly = true; 7162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 7172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 7194d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen case 'q': 7204d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen { 7214d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen showProgress = false; 7224d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen break; 7234d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen } 7244d81d15fdaf302d20740bcaaa3100b62dd49e243Marco Nelissen 725d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber case 'd': 726d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber { 727d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber dumpStream = true; 728d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber dumpStreamFilename.setTo(optarg); 729d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber break; 730d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } 731d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber 732c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen case 'D': 733c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen { 734c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen dumpPCMStream = true; 735c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen audioOnly = true; 736c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen dumpStreamFilename.setTo(optarg); 737c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen break; 738c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen } 739c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen 74096310bd5caa54a4ced01d3fca684a8f89799fefdWonsik Kim case 'N': 7414f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim { 7424f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim gComponentNameOverride.setTo(optarg); 7434f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim break; 7444f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim } 7454f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim 7462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'l': 7472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 7482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber listComponents = true; 7492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 7502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 75238b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber case 'm': 7532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'n': 75480011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber case 'b': 7552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 7562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber char *end; 7572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber long x = strtol(optarg, &end, 10); 7582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 7592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (*end != '\0' || end == optarg || x <= 0) { 7602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber x = 1; 7612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 76338b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber if (res == 'n') { 76438b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gNumRepetitions = x; 76580011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else if (res == 'm') { 76638b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber gMaxNumFrames = x; 76780011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber } else { 76880011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber CHECK_EQ(res, 'b'); 76980011fe130bc966aa357ed2b3dcc80cde2d0bb82Andreas Huber gReproduceBug = x; 77038b610fe53bb27946826d3f175f6fbe613f270daAndreas Huber } 7712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 7722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 7732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 77419c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber case 'w': 77519c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber { 77619c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber gWriteMP4 = true; 77719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber gWriteMP4Filename.setTo(optarg); 77819c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber break; 77919c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } 78019c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber 78118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber case 'p': 78218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber { 78318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber dumpProfiles = true; 78418291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber break; 78518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 78618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 7875c1e3581978164d169050686c73810ce59304471Andreas Huber case 't': 7885c1e3581978164d169050686c73810ce59304471Andreas Huber { 7895c1e3581978164d169050686c73810ce59304471Andreas Huber extractThumbnail = true; 7905c1e3581978164d169050686c73810ce59304471Andreas Huber break; 7915c1e3581978164d169050686c73810ce59304471Andreas Huber } 7925c1e3581978164d169050686c73810ce59304471Andreas Huber 7935c1e3581978164d169050686c73810ce59304471Andreas Huber case 's': 7945c1e3581978164d169050686c73810ce59304471Andreas Huber { 7955c1e3581978164d169050686c73810ce59304471Andreas Huber gPreferSoftwareCodec = true; 7965c1e3581978164d169050686c73810ce59304471Andreas Huber break; 7975c1e3581978164d169050686c73810ce59304471Andreas Huber } 7985c1e3581978164d169050686c73810ce59304471Andreas Huber 799cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong case 'r': 800cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong { 801cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong gForceToUseHardwareCodec = true; 802cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong break; 803cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong } 804cfc7a7feb81b946341bc01ade68291bf8b6e1037James Dong 805a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber case 'o': 806a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber { 807a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = true; 808a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber break; 809a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 810a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 81166d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber case 'k': 81266d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber { 81366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber seekTest = true; 81466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber break; 81566d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } 81666d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber 817fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber case 'x': 818fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber { 819fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber gDisplayHistogram = true; 820fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber break; 821fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber } 822fed975bb3775ebdac136b21e01a9d49aec5b4d23Andreas Huber 823c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber case 'S': 824c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber { 825c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber useSurfaceAlloc = true; 826c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber break; 827c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber } 828c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 82916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber case 'T': 83016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber { 83116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber useSurfaceTexAlloc = true; 83216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber break; 83316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } 83416f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 8352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case '?': 8362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case 'h': 8372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 8382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 8392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber usage(argv[0]); 8402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber exit(1); 8412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 8422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 8432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 8442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 8452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 846a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (gPlaybackAudio && !audioOnly) { 847a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber // This doesn't make any sense if we're decoding the video track. 848a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber gPlaybackAudio = false; 849a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 850a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 8512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argc -= optind; 8522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber argv += optind; 8532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 8545c1e3581978164d169050686c73810ce59304471Andreas Huber if (extractThumbnail) { 8555c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 8565c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 8575c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaPlayerService> service = 8585c1e3581978164d169050686c73810ce59304471Andreas Huber interface_cast<IMediaPlayerService>(binder); 8595c1e3581978164d169050686c73810ce59304471Andreas Huber 8605c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(service.get() != NULL); 8615c1e3581978164d169050686c73810ce59304471Andreas Huber 8625c1e3581978164d169050686c73810ce59304471Andreas Huber sp<IMediaMetadataRetriever> retriever = 8638d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten service->createMetadataRetriever(); 8645c1e3581978164d169050686c73810ce59304471Andreas Huber 8655c1e3581978164d169050686c73810ce59304471Andreas Huber CHECK(retriever != NULL); 8665c1e3581978164d169050686c73810ce59304471Andreas Huber 8675c1e3581978164d169050686c73810ce59304471Andreas Huber for (int k = 0; k < argc; ++k) { 8685c1e3581978164d169050686c73810ce59304471Andreas Huber const char *filename = argv[k]; 8695c1e3581978164d169050686c73810ce59304471Andreas Huber 870515e855eae78aa495da58356486aaa666cb57fd1James Dong bool failed = true; 871f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 872f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber int fd = open(filename, O_RDONLY | O_LARGEFILE); 873f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber CHECK_GE(fd, 0); 874f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 875f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber off64_t fileSize = lseek64(fd, 0, SEEK_END); 876f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber CHECK_GE(fileSize, 0ll); 877f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 878f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber CHECK_EQ(retriever->setDataSource(fd, 0, fileSize), (status_t)OK); 879f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 880f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber close(fd); 881f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber fd = -1; 882f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber 88316afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong sp<IMemory> mem = 88416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong retriever->getFrameAtTime(-1, 88524c15776247c46e34562100213035bb7aaffe013Chong Zhang MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC, 88624c15776247c46e34562100213035bb7aaffe013Chong Zhang HAL_PIXEL_FORMAT_RGB_565, 88724c15776247c46e34562100213035bb7aaffe013Chong Zhang false /*metaOnly*/); 8885c1e3581978164d169050686c73810ce59304471Andreas Huber 8891b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 890515e855eae78aa495da58356486aaa666cb57fd1James Dong failed = false; 89116afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong printf("getFrameAtTime(%s) => OK\n", filename); 892f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 893f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber VideoFrame *frame = (VideoFrame *)mem->pointer(); 894f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 89526a417f68526fee861bb527f1a4e3ed548979f93Colin Cross CHECK_EQ(writeJpegFile("/sdcard/out.jpg", 8963f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang frame->getFlattenedData(), 89726a417f68526fee861bb527f1a4e3ed548979f93Colin Cross frame->mWidth, frame->mHeight), 0); 898515e855eae78aa495da58356486aaa666cb57fd1James Dong } 899515e855eae78aa495da58356486aaa666cb57fd1James Dong 900515e855eae78aa495da58356486aaa666cb57fd1James Dong { 9011b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber mem = retriever->extractAlbumArt(); 9021b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber 9031b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber if (mem != NULL) { 904515e855eae78aa495da58356486aaa666cb57fd1James Dong failed = false; 9051b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber printf("extractAlbumArt(%s) => OK\n", filename); 9061b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 9071b950bcd3c11a17186cf971e23f5ec829d092ed5Andreas Huber } 908515e855eae78aa495da58356486aaa666cb57fd1James Dong 909515e855eae78aa495da58356486aaa666cb57fd1James Dong if (failed) { 910515e855eae78aa495da58356486aaa666cb57fd1James Dong printf("both getFrameAtTime and extractAlbumArt " 911515e855eae78aa495da58356486aaa666cb57fd1James Dong "failed on file '%s'.\n", filename); 912515e855eae78aa495da58356486aaa666cb57fd1James Dong } 9135c1e3581978164d169050686c73810ce59304471Andreas Huber } 9145c1e3581978164d169050686c73810ce59304471Andreas Huber 9155c1e3581978164d169050686c73810ce59304471Andreas Huber return 0; 9165c1e3581978164d169050686c73810ce59304471Andreas Huber } 9175c1e3581978164d169050686c73810ce59304471Andreas Huber 91818291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (dumpProfiles) { 9195fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar dumpCodecProfiles(true /* queryDecoders */); 9205fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar dumpCodecProfiles(false /* queryDecoders */); 92118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } 92218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber 9232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (listComponents) { 924e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa using ::android::hardware::hidl_vec; 925e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa using ::android::hardware::hidl_string; 926e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa using namespace ::android::hardware::media::omx::V1_0; 927e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa sp<IOmx> omx = IOmx::getService(); 928e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa CHECK(omx.get() != nullptr); 929e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa 930e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa hidl_vec<IOmx::ComponentInfo> nodeList; 931e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa auto transStatus = omx->listNodes([]( 932e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa const auto& status, const auto& nodeList) { 933e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa CHECK(status == Status::OK); 934e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa for (const auto& info : nodeList) { 935e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa printf("%s\t Roles: ", info.mName.c_str()); 936e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa for (const auto& role : info.mRoles) { 937e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa printf("%s\t", role.c_str()); 938e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa } 939e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa } 940e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa }); 941e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa CHECK(transStatus.isOk()); 94220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 94320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 944c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber sp<SurfaceComposerClient> composerClient; 945c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber sp<SurfaceControl> control; 946c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 94716f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if ((useSurfaceAlloc || useSurfaceTexAlloc) && !audioOnly) { 94816f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if (useSurfaceAlloc) { 94916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber composerClient = new SurfaceComposerClient; 95016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK_EQ(composerClient->initCheck(), (status_t)OK); 95116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 95216f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber control = composerClient->createSurface( 95316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber String8("A Surface"), 95416f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 1280, 95516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 800, 95616f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber PIXEL_FORMAT_RGB_565, 95716f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 0); 95816f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 95916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(control != NULL); 96016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(control->isValid()); 96116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 962116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr SurfaceComposerClient::Transaction{} 963116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr .setLayer(control, INT_MAX) 964116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr .show(control) 965116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr .apply(); 96616f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 96716f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber gSurface = control->getSurface(); 96816f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(gSurface != NULL); 96916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } else { 97016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber CHECK(useSurfaceTexAlloc); 97116f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber 9723b35cb7736afb963e3941710d61c2c9849d35007Dan Stoza sp<IGraphicBufferProducer> producer; 9733b35cb7736afb963e3941710d61c2c9849d35007Dan Stoza sp<IGraphicBufferConsumer> consumer; 9743b35cb7736afb963e3941710d61c2c9849d35007Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 975db2722a319d91a869ebc4dd618edbef43fd5b738Dan Stoza sp<GLConsumer> texture = new GLConsumer(consumer, 0 /* tex */, 976db2722a319d91a869ebc4dd618edbef43fd5b738Dan Stoza GLConsumer::TEXTURE_EXTERNAL, true /* useFenceSync */, 977db2722a319d91a869ebc4dd618edbef43fd5b738Dan Stoza false /* isControlledByApp */); 9783b35cb7736afb963e3941710d61c2c9849d35007Dan Stoza gSurface = new Surface(producer); 97916f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } 980c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber } 981c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 9825fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar status_t err = OK; 98320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 98431de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar for (int k = 0; k < argc && err == OK; ++k) { 985bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber bool syncInfoPresent = true; 986bbc38312e4521cfd4299203591ef366b7624f043Andreas Huber 9872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber const char *filename = argv[k]; 98820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9891b86fe063badb5f28c467ade39be0f4008688947Andreas Huber sp<DataSource> dataSource = 990d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang DataSourceFactory::CreateFromURI(NULL /* httpService */, filename); 9910024245e134467d120b40099da16c467dc365e76Andreas Huber 99214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (strncasecmp(filename, "sine:", 5) && dataSource == NULL) { 993a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber fprintf(stderr, "Unable to create data source.\n"); 994a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber return 1; 995a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 996a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 9972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber bool isJPEG = false; 99820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t len = strlen(filename); 10002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (len >= 4 && !strcasecmp(filename + len - 4, ".jpg")) { 10012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber isJPEG = true; 10022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 100320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1004ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang Vector<sp<MediaSource> > mediaSources; 1005ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang sp<MediaSource> mediaSource; 100620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (isJPEG) { 10082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mediaSource = new JPEGSource(dataSource); 1009ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (gWriteMP4) { 1010ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSources.push(mediaSource); 1011ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1012a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } else if (!strncasecmp("sine:", filename, 5)) { 1013a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber char *end; 1014a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber long sampleRate = strtol(filename + 5, &end, 10); 1015a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 1016a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber if (end == filename + 5) { 1017a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber sampleRate = 44100; 1018a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber } 1019a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber mediaSource = new SineSource(sampleRate, 1); 1020ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (gWriteMP4) { 1021ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSources.push(mediaSource); 1022ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 10232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } else { 1024d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang sp<IMediaExtractor> extractor = MediaExtractorFactory::Create(dataSource); 1025348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber 102614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (extractor == NULL) { 102714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber fprintf(stderr, "could not create extractor.\n"); 102814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return -1; 102914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 10302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 103114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<MetaData> meta = extractor->getMetaData(); 1032fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 103314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (meta != NULL) { 103414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const char *mime; 1035fdfbc4615a49d89a3b23b525ab6612797d81e08aMarco Nelissen if (!meta->findCString(kKeyMIMEType, &mime)) { 1036fdfbc4615a49d89a3b23b525ab6612797d81e08aMarco Nelissen fprintf(stderr, "extractor did not provide MIME type.\n"); 1037fdfbc4615a49d89a3b23b525ab6612797d81e08aMarco Nelissen return -1; 1038fdfbc4615a49d89a3b23b525ab6612797d81e08aMarco Nelissen } 1039fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber 104014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) { 104114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber syncInfoPresent = false; 1042fed045821d5eae63b34549cb44b7d26602f5c543Andreas Huber } 1043b93ad64a423975748c7f5e1a5ea94ab8681bc899James Dong } 104420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber size_t numTracks = extractor->countTracks(); 104620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1047ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (gWriteMP4) { 1048ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber bool haveAudio = false; 1049ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber bool haveVideo = false; 1050ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber for (size_t i = 0; i < numTracks; ++i) { 1051d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang sp<MediaSource> source = CreateMediaSourceFromIMediaSource( 1052ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang extractor->getTrack(i)); 1053322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia if (source == nullptr) { 1054322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia fprintf(stderr, "skip NULL track %zu, track count %zu.\n", i, numTracks); 1055322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia continue; 1056322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia } 1057ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1058ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber const char *mime; 1059ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber CHECK(source->getFormat()->findCString( 1060ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber kKeyMIMEType, &mime)); 1061ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1062ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber bool useTrack = false; 1063ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (!haveAudio && !strncasecmp("audio/", mime, 6)) { 1064ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber haveAudio = true; 1065ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber useTrack = true; 1066ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else if (!haveVideo && !strncasecmp("video/", mime, 6)) { 1067ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber haveVideo = true; 1068ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber useTrack = true; 1069ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 107020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1071ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (useTrack) { 1072ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber mediaSources.push(source); 107320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1074ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (haveAudio && haveVideo) { 1075ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber break; 1076ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1077ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 10782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1079ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } else { 1080ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber sp<MetaData> meta; 1081ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber size_t i; 1082ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber for (i = 0; i < numTracks; ++i) { 1083ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber meta = extractor->getTrackMetaData( 1084ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber i, MediaExtractor::kIncludeExtensiveMetaData); 10852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1086409cfe09a03ba87bb8432ffd3276355b9f7a5734Marco Nelissen if (meta == NULL) { 10874f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim continue; 1088409cfe09a03ba87bb8432ffd3276355b9f7a5734Marco Nelissen } 1089ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber const char *mime; 1090ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber meta->findCString(kKeyMIMEType, &mime); 1091ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1092ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (audioOnly && !strncasecmp(mime, "audio/", 6)) { 1093ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber break; 1094ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1095ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1096ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (!audioOnly && !strncasecmp(mime, "video/", 6)) { 1097ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber break; 1098ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1099ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber 1100ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber meta = NULL; 11012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1102a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 1103ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (meta == NULL) { 1104ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber fprintf(stderr, 1105ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber "No suitable %s track found. The '-a' option will " 1106ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber "target audio tracks only, the default is to target " 1107ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber "video tracks only.\n", 1108ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber audioOnly ? "audio" : "video"); 1109ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber return -1; 1110ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 1111a98420e863c374d1f15309467f2a1fc58d979d3bAndreas Huber 1112ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber int64_t thumbTimeUs; 1113ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber if (meta->findInt64(kKeyThumbnailTime, &thumbTimeUs)) { 1114377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT printf("thumbnailTime: %" PRId64 " us (%.2f secs)\n", 1115ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber thumbTimeUs, thumbTimeUs / 1E6); 1116ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber } 11172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1118d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang mediaSource = CreateMediaSourceFromIMediaSource(extractor->getTrack(i)); 1119322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia if (mediaSource == nullptr) { 1120322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia fprintf(stderr, "skip NULL track %zu, total tracks %zu.\n", i, numTracks); 1121322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia return -1; 1122322db26b76f7511c6d73f34a92a4e54840fcb876Wei Jia } 11235c1e3581978164d169050686c73810ce59304471Andreas Huber } 112420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 112520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 112619c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber if (gWriteMP4) { 1127ea314ac049884b31c5a2a4fecc42e8a50f928a33Andreas Huber writeSourcesToMP4(mediaSources, syncInfoPresent); 1128d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber } else if (dumpStream) { 1129d10c07603a28429beb7471c0fb23a5f9ec90bf26Andreas Huber dumpSource(mediaSource, dumpStreamFilename); 1130c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen } else if (dumpPCMStream) { 1131ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang sp<MediaSource> decSource = SimpleDecodingSource::Create(mediaSource); 1132c434ac82b57108bd08f58612f6ac8cbc92dbd975Marco Nelissen dumpSource(decSource, dumpStreamFilename); 113366d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber } else if (seekTest) { 113466d6f1fcd9cb80a603b833e93779eb0dfb5e67eeAndreas Huber performSeekTest(mediaSource); 113519c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } else { 11365fb00a6d1f32523aa254fea95a7bee646f4ae9aeLajos Molnar playSource(mediaSource); 113719c9a1e2bb6ead5e1e895aea8be573fe0f8cc7bbAndreas Huber } 113820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 113920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 114016f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if ((useSurfaceAlloc || useSurfaceTexAlloc) && !audioOnly) { 1141c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber gSurface.clear(); 1142c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 114316f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber if (useSurfaceAlloc) { 114416f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber composerClient->dispose(); 114516f7863149b400ca52e2e3cb83e50534fee6b58bAndreas Huber } 1146c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber } 1147c83d4f56f9dd45f71c0f4673737f0ad1cce60abbAndreas Huber 114820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return 0; 114920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 1150