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