MediaBufferGroup.cpp revision c9a11abbb6b48604ea063daedd6118024cfbfa92
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com/* 2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Copyright (C) 2009 The Android Open Source Project 38cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * 4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * you may not use this file except in compliance with the License. 6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * You may obtain a copy of the License at 78cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * 8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * http://www.apache.org/licenses/LICENSE-2.0 98cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * 10cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Unless required by applicable law or agreed to in writing, software 118cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * distributed under the License is distributed on an "AS IS" BASIS, 128cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * See the License for the specific language governing permissions and 148cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com * limitations under the License. 158cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com */ 168cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 178cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#define LOG_TAG "MediaBufferGroup" 188cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include <utils/Log.h> 198cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 208cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include <media/stagefright/foundation/ADebug.h> 218cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include <media/stagefright/MediaBuffer.h> 22#include <media/stagefright/MediaBufferGroup.h> 23 24namespace android { 25 26MediaBufferGroup::MediaBufferGroup() 27 : mFirstBuffer(NULL), 28 mLastBuffer(NULL) { 29} 30 31MediaBufferGroup::~MediaBufferGroup() { 32 MediaBuffer *next; 33 for (MediaBuffer *buffer = mFirstBuffer; buffer != NULL; 34 buffer = next) { 35 next = buffer->nextBuffer(); 36 37 CHECK_EQ(buffer->refcount(), 0); 38 39 buffer->setObserver(NULL); 40 buffer->release(); 41 } 42} 43 44void MediaBufferGroup::add_buffer(MediaBuffer *buffer) { 45 Mutex::Autolock autoLock(mLock); 46 47 buffer->setObserver(this); 48 49 if (mLastBuffer) { 50 mLastBuffer->setNextBuffer(buffer); 51 } else { 52 mFirstBuffer = buffer; 53 } 54 55 mLastBuffer = buffer; 56} 57 58status_t MediaBufferGroup::acquire_buffer( 59 MediaBuffer **out, bool nonBlocking) { 60 Mutex::Autolock autoLock(mLock); 61 62 for (;;) { 63 for (MediaBuffer *buffer = mFirstBuffer; 64 buffer != NULL; buffer = buffer->nextBuffer()) { 65 if (buffer->refcount() == 0) { 66 buffer->add_ref(); 67 buffer->reset(); 68 69 *out = buffer; 70 goto exit; 71 } 72 } 73 74 if (nonBlocking) { 75 *out = NULL; 76 return WOULD_BLOCK; 77 } 78 79 // All buffers are in use. Block until one of them is returned to us. 80 mCondition.wait(mLock); 81 } 82 83exit: 84 return OK; 85} 86 87void MediaBufferGroup::signalBufferReturned(MediaBuffer *) { 88 Mutex::Autolock autoLock(mLock); 89 mCondition.signal(); 90} 91 92} // namespace android 93