sf2.cpp revision 729de186450f78c099637e1fce743fe531862c52
18eb69d60c09c1c4683066a94c889df28d0e9d233James Dong/* 28eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Copyright (C) 2010 The Android Open Source Project 38eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 48eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 58eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * you may not use this file except in compliance with the License. 68eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * You may obtain a copy of the License at 78eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 88eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * http://www.apache.org/licenses/LICENSE-2.0 98eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 108eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Unless required by applicable law or agreed to in writing, software 118eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * distributed under the License is distributed on an "AS IS" BASIS, 128eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * See the License for the specific language governing permissions and 148eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * limitations under the License. 158eb69d60c09c1c4683066a94c889df28d0e9d233James Dong */ 168eb69d60c09c1c4683066a94c889df28d0e9d233James Dong 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/ProcessState.h> 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h> 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/DataSource.h> 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaBuffer.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaExtractor.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaSource.h> 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 321065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/NativeWindowWrapper.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/Utils.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/ISurfaceComposer.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/SurfaceComposerClient.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "include/ESDS.h" 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huberusing namespace android; 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct Controller : public AHandler { 431065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber Controller(const char *uri, bool decodeAudio, 441065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber const sp<Surface> &surface, bool renderToSurface) 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mURI(uri), 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeAudio(decodeAudio), 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSurface(surface), 481065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber mRenderToSurface(renderToSurface), 49729de186450f78c099637e1fce743fe531862c52Andreas Huber mCodec(new ACodec), 50729de186450f78c099637e1fce743fe531862c52Andreas Huber mIsVorbis(false) { 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mDecodeAudio || mSurface == NULL); 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void startAsync() { 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Controller() { 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg) { 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 1 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper = looper(); 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#else 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper = new ALooper; 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->setName("sf2 decode looper"); 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->start(); 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<DataSource> dataSource = 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DataSource::CreateFromURI(mURI.c_str()); 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaExtractor> extractor = 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaExtractor::Create(dataSource); 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strncasecmp(mDecodeAudio ? "audio/" : "video/", 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mime, 6)) { 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource = extractor->getTrack(i); 89729de186450f78c099637e1fce743fe531862c52Andreas Huber 90729de186450f78c099637e1fce743fe531862c52Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 91729de186450f78c099637e1fce743fe531862c52Andreas Huber mIsVorbis = true; 92729de186450f78c099637e1fce743fe531862c52Andreas Huber } else { 93729de186450f78c099637e1fce743fe531862c52Andreas Huber mIsVorbis = false; 94729de186450f78c099637e1fce743fe531862c52Andreas Huber } 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource != NULL); 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mSource->start(), (status_t)OK); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->registerHandler(mCodec); 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->setNotificationMessage( 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatCodecNotify, id())); 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> format = makeFormat(mSource->getFormat()); 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSurface != NULL) { 1101065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber format->setObject( 1111065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber "native-window", new NativeWindowWrapper(mSurface)); 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->initiateSetup(format); 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSDIndex = 0; 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStartTimeUs = ALooper::GetNowUs(); 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNumOutputBuffersReceived = 0; 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived = 0; 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = NULL; 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFinalResult = OK; 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSeekState = SEEK_NONE; 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // (new AMessage(kWhatSeek, id()))->post(5000000ll); 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSeek: 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber printf("+"); 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fflush(stdout); 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSeekState == SEEK_NONE 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || mSeekState == SEEK_FLUSH_COMPLETED); 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mLeftOverBuffer != NULL) { 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer->release(); 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = NULL; 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSeekState = SEEK_FLUSHING; 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSeekTimeUs = 30000000ll; 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->signalFlush(); 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStop: 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mLeftOverBuffer != NULL) { 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer->release(); 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = NULL; 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mSource->stop(), (status_t)OK); 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource.clear(); 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->initiateShutdown(); 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatCodecNotify: 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onFillThisBuffer(msg); 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatDrainThisBuffer) { 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mNumOutputBuffersReceived++ % 16) == 0) { 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber printf("."); 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fflush(stdout); 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onDrainThisBuffer(msg); 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber printf("$\n"); 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t delayUs = ALooper::GetNowUs() - mStartTimeUs; 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mDecodeAudio) { 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber printf("%lld bytes received. %.2f KB/sec\n", 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived, 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived * 1E6 / 1024 / delayUs); 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber printf("%d frames decoded, %.2f fps. %lld bytes " 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "received. %.2f KB/sec\n", 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNumOutputBuffersReceived, 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNumOutputBuffersReceived * 1E6 / delayUs, 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived, 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived * 1E6 / 1024 / delayUs); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStop, id()))->post(); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSeekState = SEEK_FLUSH_COMPLETED; 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->signalResume(); 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatSeek, id()))->post(5000000ll); 200777833cde11bfe8bae9c99aba8eeec33755ab264Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)ACodec::kWhatShutdownCompleted); 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->unregisterHandler(mCodec->id()); 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mDecodeLooper != looper()) { 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->stop(); 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->stop(); 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatStart = 'strt', 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatStop = 'stop', 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatCodecNotify = 'noti', 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatSeek = 'seek', 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ALooper> mDecodeLooper; 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mURI; 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDecodeAudio; 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<Surface> mSurface; 2341065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber bool mRenderToSurface; 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ACodec> mCodec; 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaSource> mSource; 237729de186450f78c099637e1fce743fe531862c52Andreas Huber bool mIsVorbis; 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Vector<sp<ABuffer> > mCSD; 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t mCSDIndex; 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaBuffer *mLeftOverBuffer; 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t mFinalResult; 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mStartTimeUs; 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mNumOutputBuffersReceived; 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mTotalBytesReceived; 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum SeekState { 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SEEK_NONE, 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SEEK_FLUSHING, 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SEEK_FLUSH_COMPLETED, 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SeekState mSeekState; 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mSeekTimeUs; 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> makeFormat(const sp<MetaData> &meta) { 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCSD.isEmpty()); 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage; 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setString("mime", mime); 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strncasecmp("video/", mime, 6)) { 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, height; 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("width", width); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("height", height); 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!strncasecmp("audio/", mime, 6)); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("channel-count", numChannels); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("sample-rate", sampleRate); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t type; 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const void *data; 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t size; 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (meta->findData(kKeyAVCC, &type, &data, &size)) { 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Parse the AVCDecoderConfigurationRecord 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const uint8_t *ptr = (const uint8_t *)data; 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 7); 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((unsigned)ptr[0], 1u); // configurationVersion == 1 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint8_t profile = ptr[1]; 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint8_t level = ptr[3]; 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There is decodable content out there that fails the following 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // assertion, let's be lenient for now... 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK((ptr[4] >> 2) == 0x3f); // reserved 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t lengthSize = 1 + (ptr[4] & 3); 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // commented out check below as H264_QVGA_500_NO_AUDIO.3gp 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // violates it... 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK((ptr[5] >> 5) == 7); // reserved 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t numSeqParameterSets = ptr[5] & 31; 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += 6; 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= 6; 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = new ABuffer(1024); 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, 0); 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < numSeqParameterSets; ++i) { 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 2); 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t length = U16_AT(ptr); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += 2; 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= 2; 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= length); 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size(), "\x00\x00\x00\x01", 4); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size() + 4, ptr, length); 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, buffer->size() + 4 + length); 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += length; 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= length; 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->meta()->setInt32("csd", true); 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSD.push(buffer); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer = new ABuffer(1024); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, 0); 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 1); 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t numPictureParameterSets = *ptr; 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++ptr; 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber --size; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < numPictureParameterSets; ++i) { 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 2); 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t length = U16_AT(ptr); 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += 2; 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= 2; 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= length); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size(), "\x00\x00\x00\x01", 4); 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size() + 4, ptr, length); 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, buffer->size() + 4 + length); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += length; 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= length; 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->meta()->setInt32("csd", true); 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSD.push(buffer); 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("csd", buffer); 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (meta->findData(kKeyESDS, &type, &data, &size)) { 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ESDS esds((const char *)data, size); 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(esds.InitCheck(), (status_t)OK); 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const void *codec_specific_data; 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t codec_specific_data_size; 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber esds.getCodecSpecificInfo( 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &codec_specific_data, &codec_specific_data_size); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = new ABuffer(codec_specific_data_size); 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data(), codec_specific_data, 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber codec_specific_data_size); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->meta()->setInt32("csd", true); 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSD.push(buffer); 380729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) { 381729de186450f78c099637e1fce743fe531862c52Andreas Huber sp<ABuffer> buffer = new ABuffer(size); 382729de186450f78c099637e1fce743fe531862c52Andreas Huber memcpy(buffer->data(), data, size); 383729de186450f78c099637e1fce743fe531862c52Andreas Huber 384729de186450f78c099637e1fce743fe531862c52Andreas Huber buffer->meta()->setInt32("csd", true); 385729de186450f78c099637e1fce743fe531862c52Andreas Huber mCSD.push(buffer); 386729de186450f78c099637e1fce743fe531862c52Andreas Huber 387729de186450f78c099637e1fce743fe531862c52Andreas Huber CHECK(meta->findData(kKeyVorbisBooks, &type, &data, &size)); 388729de186450f78c099637e1fce743fe531862c52Andreas Huber 389729de186450f78c099637e1fce743fe531862c52Andreas Huber buffer = new ABuffer(size); 390729de186450f78c099637e1fce743fe531862c52Andreas Huber memcpy(buffer->data(), data, size); 391729de186450f78c099637e1fce743fe531862c52Andreas Huber 392729de186450f78c099637e1fce743fe531862c52Andreas Huber buffer->meta()->setInt32("csd", true); 393729de186450f78c099637e1fce743fe531862c52Andreas Huber mCSD.push(buffer); 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (meta->findInt32(kKeyMaxInputSize, &maxInputSize)) { 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("max-input-size", maxInputSize); 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return msg; 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onFillThisBuffer(const sp<AMessage> &msg) { 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSeekState == SEEK_FLUSHING) { 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> outBuffer = static_cast<ABuffer *>(obj.get()); 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCSDIndex < mCSD.size()) { 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer = mCSD.editItemAt(mCSDIndex++); 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->meta()->setInt64("timeUs", 0); 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t sizeLeft = outBuffer->capacity(); 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->setRange(0, 0); 423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t n = 0; 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaBuffer *inBuffer; 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mLeftOverBuffer != NULL) { 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer = mLeftOverBuffer; 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = NULL; 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (mFinalResult != OK) { 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaSource::ReadOptions options; 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSeekState == SEEK_FLUSH_COMPLETED) { 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber options.setSeekTo(mSeekTimeUs); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSeekState = SEEK_NONE; 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mSource->read(&inBuffer, &options); 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFinalResult = err; 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 448729de186450f78c099637e1fce743fe531862c52Andreas Huber size_t sizeNeeded = inBuffer->range_length(); 449729de186450f78c099637e1fce743fe531862c52Andreas Huber if (mIsVorbis) { 450729de186450f78c099637e1fce743fe531862c52Andreas Huber // Vorbis data is suffixed with the number of 451729de186450f78c099637e1fce743fe531862c52Andreas Huber // valid samples on the page. 452729de186450f78c099637e1fce743fe531862c52Andreas Huber sizeNeeded += sizeof(int32_t); 453729de186450f78c099637e1fce743fe531862c52Andreas Huber } 454729de186450f78c099637e1fce743fe531862c52Andreas Huber 455729de186450f78c099637e1fce743fe531862c52Andreas Huber if (sizeNeeded > sizeLeft) { 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (outBuffer->size() == 0) { 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGE("Unable to fit even a single input buffer of size %d.", 458729de186450f78c099637e1fce743fe531862c52Andreas Huber sizeNeeded); 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(outBuffer->size(), 0u); 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = inBuffer; 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++n; 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (outBuffer->size() == 0) { 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(inBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->meta()->setInt64("timeUs", timeUs); 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(outBuffer->data() + outBuffer->size(), 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (const uint8_t *)inBuffer->data() 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber + inBuffer->range_offset(), 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer->range_length()); 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 480729de186450f78c099637e1fce743fe531862c52Andreas Huber if (mIsVorbis) { 481729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numPageSamples; 482729de186450f78c099637e1fce743fe531862c52Andreas Huber if (!inBuffer->meta_data()->findInt32( 483729de186450f78c099637e1fce743fe531862c52Andreas Huber kKeyValidSamples, &numPageSamples)) { 484729de186450f78c099637e1fce743fe531862c52Andreas Huber numPageSamples = -1; 485729de186450f78c099637e1fce743fe531862c52Andreas Huber } 486729de186450f78c099637e1fce743fe531862c52Andreas Huber 487729de186450f78c099637e1fce743fe531862c52Andreas Huber memcpy(outBuffer->data() 488729de186450f78c099637e1fce743fe531862c52Andreas Huber + outBuffer->size() + inBuffer->range_length(), 489729de186450f78c099637e1fce743fe531862c52Andreas Huber &numPageSamples, sizeof(numPageSamples)); 490729de186450f78c099637e1fce743fe531862c52Andreas Huber } 491729de186450f78c099637e1fce743fe531862c52Andreas Huber 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->setRange( 493729de186450f78c099637e1fce743fe531862c52Andreas Huber 0, outBuffer->size() + sizeNeeded); 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 495729de186450f78c099637e1fce743fe531862c52Andreas Huber sizeLeft -= sizeNeeded; 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer->release(); 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer = NULL; 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5001065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; // Don't coalesce 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("coalesced %d input buffers", n); 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (outBuffer->size() == 0) { 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_NE(mFinalResult, (status_t)OK); 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", mFinalResult); 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", outBuffer); 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onDrainThisBuffer(const sp<AMessage> &msg) { 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived += buffer->size(); 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5281065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (mRenderToSurface) { 5291065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber reply->setInt32("render", 1); 5301065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5311065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Controller); 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 538f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void usage(const char *me) { 539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, "usage: %s\n", me); 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, " -h(elp)\n"); 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, " -a(udio)\n"); 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, 5441065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber " -S(urface) Allocate output buffers on a surface.\n" 5451065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber " -R(ender) Render surface-allocated buffers.\n"); 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huberint main(int argc, char **argv) { 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber android::ProcessState::self()->startThreadPool(); 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool decodeAudio = false; 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool useSurface = false; 5531065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber bool renderToSurface = false; 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int res; 5561065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber while ((res = getopt(argc, argv, "haSR")) >= 0) { 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (res) { 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case 'a': 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber decodeAudio = true; 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5621065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber case 'S': 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber useSurface = true; 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5661065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber case 'R': 5671065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber renderToSurface = true; 5681065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 5691065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case '?': 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case 'h': 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber usage(argv[0]); 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 1; 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber argc -= optind; 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber argv += optind; 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (argc != 1) { 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber usage(argv[-optind]); 585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 1; 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DataSource::RegisterDefaultSniffers(); 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ALooper> looper = new ALooper; 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper->setName("sf2"); 592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<SurfaceComposerClient> composerClient; 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<SurfaceControl> control; 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<Surface> surface; 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!decodeAudio && useSurface) { 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber composerClient = new SurfaceComposerClient; 599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(composerClient->initCheck(), (status_t)OK); 600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber control = composerClient->createSurface( 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber String8("A Surface"), 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1280, 605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 800, 606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PIXEL_FORMAT_RGB_565, 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0); 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(control != NULL); 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(control->isValid()); 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6122df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian SurfaceComposerClient::openGlobalTransaction(); 61393d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK); 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(control->show(), (status_t)OK); 6152df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber surface = control->getSurface(); 618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(surface != NULL); 61993d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber 62093d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ((status_t)OK, 62193d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber native_window_api_connect( 62293d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber surface.get(), NATIVE_WINDOW_API_MEDIA)); 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6251065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<Controller> controller = 6261065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber new Controller(argv[0], decodeAudio, surface, renderToSurface); 6271065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper->registerHandler(controller); 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber controller->startAsync(); 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(looper->start(true /* runOnCallingThread */), (status_t)OK); 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper->unregisterHandler(controller->id()); 635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!decodeAudio && useSurface) { 63793d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ((status_t)OK, 63893d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber native_window_api_disconnect( 63993d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber surface.get(), NATIVE_WINDOW_API_MEDIA)); 64093d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber composerClient->dispose(); 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 0; 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 647