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