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