sf2.cpp revision bf6c85a013fb14960bac147c1ffd0a02a8d5f148
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) { 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->unregisterHandler(mCodec->id()); 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mDecodeLooper != looper()) { 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDecodeLooper->stop(); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->stop(); 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatStart = 'strt', 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatStop = 'stop', 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatCodecNotify = 'noti', 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kWhatSeek = 'seek', 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ALooper> mDecodeLooper; 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mURI; 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDecodeAudio; 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<Surface> mSurface; 2321065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber bool mRenderToSurface; 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ACodec> mCodec; 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaSource> mSource; 235729de186450f78c099637e1fce743fe531862c52Andreas Huber bool mIsVorbis; 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Vector<sp<ABuffer> > mCSD; 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t mCSDIndex; 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaBuffer *mLeftOverBuffer; 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t mFinalResult; 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mStartTimeUs; 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mNumOutputBuffersReceived; 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mTotalBytesReceived; 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum SeekState { 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SEEK_NONE, 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SEEK_FLUSHING, 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SEEK_FLUSH_COMPLETED, 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber SeekState mSeekState; 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mSeekTimeUs; 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> makeFormat(const sp<MetaData> &meta) { 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCSD.isEmpty()); 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage; 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setString("mime", mime); 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strncasecmp("video/", mime, 6)) { 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, height; 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("width", width); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("height", height); 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!strncasecmp("audio/", mime, 6)); 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("channel-count", numChannels); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("sample-rate", sampleRate); 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t type; 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const void *data; 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t size; 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (meta->findData(kKeyAVCC, &type, &data, &size)) { 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Parse the AVCDecoderConfigurationRecord 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const uint8_t *ptr = (const uint8_t *)data; 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 7); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((unsigned)ptr[0], 1u); // configurationVersion == 1 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint8_t profile = ptr[1]; 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint8_t level = ptr[3]; 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There is decodable content out there that fails the following 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // assertion, let's be lenient for now... 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK((ptr[4] >> 2) == 0x3f); // reserved 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t lengthSize = 1 + (ptr[4] & 3); 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // commented out check below as H264_QVGA_500_NO_AUDIO.3gp 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // violates it... 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK((ptr[5] >> 5) == 7); // reserved 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t numSeqParameterSets = ptr[5] & 31; 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += 6; 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= 6; 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = new ABuffer(1024); 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, 0); 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < numSeqParameterSets; ++i) { 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 2); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t length = U16_AT(ptr); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += 2; 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= 2; 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= length); 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size(), "\x00\x00\x00\x01", 4); 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size() + 4, ptr, length); 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, buffer->size() + 4 + length); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += length; 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= length; 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->meta()->setInt32("csd", true); 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSD.push(buffer); 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer = new ABuffer(1024); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, 0); 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 1); 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t numPictureParameterSets = *ptr; 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++ptr; 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber --size; 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < numPictureParameterSets; ++i) { 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= 2); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t length = U16_AT(ptr); 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += 2; 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= 2; 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(size >= length); 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size(), "\x00\x00\x00\x01", 4); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data() + buffer->size() + 4, ptr, length); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->setRange(0, buffer->size() + 4 + length); 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ptr += length; 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size -= length; 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->meta()->setInt32("csd", true); 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSD.push(buffer); 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 361bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber msg->setBuffer("csd", buffer); 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (meta->findData(kKeyESDS, &type, &data, &size)) { 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ESDS esds((const char *)data, size); 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(esds.InitCheck(), (status_t)OK); 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const void *codec_specific_data; 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t codec_specific_data_size; 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber esds.getCodecSpecificInfo( 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &codec_specific_data, &codec_specific_data_size); 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = new ABuffer(codec_specific_data_size); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(buffer->data(), codec_specific_data, 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber codec_specific_data_size); 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->meta()->setInt32("csd", true); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCSD.push(buffer); 378729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) { 379729de186450f78c099637e1fce743fe531862c52Andreas Huber sp<ABuffer> buffer = new ABuffer(size); 380729de186450f78c099637e1fce743fe531862c52Andreas Huber memcpy(buffer->data(), data, size); 381729de186450f78c099637e1fce743fe531862c52Andreas Huber 382729de186450f78c099637e1fce743fe531862c52Andreas Huber buffer->meta()->setInt32("csd", true); 383729de186450f78c099637e1fce743fe531862c52Andreas Huber mCSD.push(buffer); 384729de186450f78c099637e1fce743fe531862c52Andreas Huber 385729de186450f78c099637e1fce743fe531862c52Andreas Huber CHECK(meta->findData(kKeyVorbisBooks, &type, &data, &size)); 386729de186450f78c099637e1fce743fe531862c52Andreas Huber 387729de186450f78c099637e1fce743fe531862c52Andreas Huber buffer = new ABuffer(size); 388729de186450f78c099637e1fce743fe531862c52Andreas Huber memcpy(buffer->data(), data, size); 389729de186450f78c099637e1fce743fe531862c52Andreas Huber 390729de186450f78c099637e1fce743fe531862c52Andreas Huber buffer->meta()->setInt32("csd", true); 391729de186450f78c099637e1fce743fe531862c52Andreas Huber mCSD.push(buffer); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (meta->findInt32(kKeyMaxInputSize, &maxInputSize)) { 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("max-input-size", maxInputSize); 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return msg; 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onFillThisBuffer(const sp<AMessage> &msg) { 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSeekState == SEEK_FLUSHING) { 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 411bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber sp<ABuffer> outBuffer; 412bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber CHECK(msg->findBuffer("buffer", &outBuffer)); 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCSDIndex < mCSD.size()) { 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer = mCSD.editItemAt(mCSDIndex++); 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->meta()->setInt64("timeUs", 0); 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t sizeLeft = outBuffer->capacity(); 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->setRange(0, 0); 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t n = 0; 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaBuffer *inBuffer; 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mLeftOverBuffer != NULL) { 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer = mLeftOverBuffer; 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = NULL; 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (mFinalResult != OK) { 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber MediaSource::ReadOptions options; 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSeekState == SEEK_FLUSH_COMPLETED) { 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber options.setSeekTo(mSeekTimeUs); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSeekState = SEEK_NONE; 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mSource->read(&inBuffer, &options); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFinalResult = err; 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 445729de186450f78c099637e1fce743fe531862c52Andreas Huber size_t sizeNeeded = inBuffer->range_length(); 446729de186450f78c099637e1fce743fe531862c52Andreas Huber if (mIsVorbis) { 447729de186450f78c099637e1fce743fe531862c52Andreas Huber // Vorbis data is suffixed with the number of 448729de186450f78c099637e1fce743fe531862c52Andreas Huber // valid samples on the page. 449729de186450f78c099637e1fce743fe531862c52Andreas Huber sizeNeeded += sizeof(int32_t); 450729de186450f78c099637e1fce743fe531862c52Andreas Huber } 451729de186450f78c099637e1fce743fe531862c52Andreas Huber 452729de186450f78c099637e1fce743fe531862c52Andreas Huber if (sizeNeeded > sizeLeft) { 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (outBuffer->size() == 0) { 45429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Unable to fit even a single input buffer of size %d.", 455729de186450f78c099637e1fce743fe531862c52Andreas Huber sizeNeeded); 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(outBuffer->size(), 0u); 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLeftOverBuffer = inBuffer; 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++n; 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (outBuffer->size() == 0) { 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(inBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->meta()->setInt64("timeUs", timeUs); 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(outBuffer->data() + outBuffer->size(), 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (const uint8_t *)inBuffer->data() 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber + inBuffer->range_offset(), 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer->range_length()); 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 477729de186450f78c099637e1fce743fe531862c52Andreas Huber if (mIsVorbis) { 478729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numPageSamples; 479729de186450f78c099637e1fce743fe531862c52Andreas Huber if (!inBuffer->meta_data()->findInt32( 480729de186450f78c099637e1fce743fe531862c52Andreas Huber kKeyValidSamples, &numPageSamples)) { 481729de186450f78c099637e1fce743fe531862c52Andreas Huber numPageSamples = -1; 482729de186450f78c099637e1fce743fe531862c52Andreas Huber } 483729de186450f78c099637e1fce743fe531862c52Andreas Huber 484729de186450f78c099637e1fce743fe531862c52Andreas Huber memcpy(outBuffer->data() 485729de186450f78c099637e1fce743fe531862c52Andreas Huber + outBuffer->size() + inBuffer->range_length(), 486729de186450f78c099637e1fce743fe531862c52Andreas Huber &numPageSamples, sizeof(numPageSamples)); 487729de186450f78c099637e1fce743fe531862c52Andreas Huber } 488729de186450f78c099637e1fce743fe531862c52Andreas Huber 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber outBuffer->setRange( 490729de186450f78c099637e1fce743fe531862c52Andreas Huber 0, outBuffer->size() + sizeNeeded); 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 492729de186450f78c099637e1fce743fe531862c52Andreas Huber sizeLeft -= sizeNeeded; 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer->release(); 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber inBuffer = NULL; 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4971065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; // Don't coalesce 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("coalesced %d input buffers", n); 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (outBuffer->size() == 0) { 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_NE(mFinalResult, (status_t)OK); 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", mFinalResult); 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 511bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber reply->setBuffer("buffer", outBuffer); 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onDrainThisBuffer(const sp<AMessage> &msg) { 516bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber sp<ABuffer> buffer; 517bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mTotalBytesReceived += buffer->size(); 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5241065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (mRenderToSurface) { 5251065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber reply->setInt32("render", 1); 5261065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5271065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Controller); 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void usage(const char *me) { 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, "usage: %s\n", me); 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, " -h(elp)\n"); 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, " -a(udio)\n"); 538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber fprintf(stderr, 5401065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber " -S(urface) Allocate output buffers on a surface.\n" 5411065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber " -R(ender) Render surface-allocated buffers.\n"); 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huberint main(int argc, char **argv) { 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber android::ProcessState::self()->startThreadPool(); 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool decodeAudio = false; 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool useSurface = false; 5491065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber bool renderToSurface = false; 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int res; 5521065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber while ((res = getopt(argc, argv, "haSR")) >= 0) { 553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (res) { 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case 'a': 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber decodeAudio = true; 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5581065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber case 'S': 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber useSurface = true; 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5621065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber case 'R': 5631065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber renderToSurface = true; 5641065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 5651065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case '?': 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case 'h': 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber usage(argv[0]); 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 1; 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber argc -= optind; 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber argv += optind; 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (argc != 1) { 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber usage(argv[-optind]); 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 1; 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DataSource::RegisterDefaultSniffers(); 585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ALooper> looper = new ALooper; 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper->setName("sf2"); 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<SurfaceComposerClient> composerClient; 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<SurfaceControl> control; 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<Surface> surface; 592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!decodeAudio && useSurface) { 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber composerClient = new SurfaceComposerClient; 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(composerClient->initCheck(), (status_t)OK); 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber control = composerClient->createSurface( 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber String8("A Surface"), 599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1280, 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 800, 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PIXEL_FORMAT_RGB_565, 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0); 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(control != NULL); 606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(control->isValid()); 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6082df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian SurfaceComposerClient::openGlobalTransaction(); 60993d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK); 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(control->show(), (status_t)OK); 6112df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber surface = control->getSurface(); 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(surface != NULL); 61593d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber 61693d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ((status_t)OK, 61793d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber native_window_api_connect( 61893d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber surface.get(), NATIVE_WINDOW_API_MEDIA)); 619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6211065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<Controller> controller = 6221065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber new Controller(argv[0], decodeAudio, surface, renderToSurface); 6231065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper->registerHandler(controller); 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber controller->startAsync(); 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(looper->start(true /* runOnCallingThread */), (status_t)OK); 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper->unregisterHandler(controller->id()); 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!decodeAudio && useSurface) { 63393d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber CHECK_EQ((status_t)OK, 63493d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber native_window_api_disconnect( 63593d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber surface.get(), NATIVE_WINDOW_API_MEDIA)); 63693d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huber 637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber composerClient->dispose(); 638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return 0; 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 643