1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson/*
2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * Copyright (C) 2009 The Android Open Source Project
3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *
4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * Licensed under the Apache License, Version 2.0 (the "License");
5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * you may not use this file except in compliance with the License.
6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * You may obtain a copy of the License at
7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *
8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *      http://www.apache.org/licenses/LICENSE-2.0
9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *
10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * Unless required by applicable law or agreed to in writing, software
11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * distributed under the License is distributed on an "AS IS" BASIS,
12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * See the License for the specific language governing permissions and
14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson * limitations under the License.
15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson */
16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef MEDIA_BUFFER_GROUP_H_
18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define MEDIA_BUFFER_GROUP_H_
20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <media/stagefright/MediaBuffer.h>
22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <utils/Errors.h>
23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <utils/threads.h>
24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace android {
26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass MediaBuffer;
28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass MetaData;
29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass MediaBufferGroup : public MediaBufferObserver {
31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonpublic:
32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    MediaBufferGroup();
33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    ~MediaBufferGroup();
34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    void add_buffer(MediaBuffer *buffer);
36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    // If nonBlocking is false, it blocks until a buffer is available and
38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    // passes it to the caller in *buffer, while returning OK.
39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    // The returned buffer will have a reference count of 1.
40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    // If nonBlocking is true and a buffer is not immediately available,
41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    // buffer is set to NULL and it returns WOULD_BLOCK.
42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    status_t acquire_buffer(MediaBuffer **buffer, bool nonBlocking = false);
43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonprotected:
45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    virtual void signalBufferReturned(MediaBuffer *buffer);
46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonprivate:
48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    friend class MediaBuffer;
49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    Mutex mLock;
51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    Condition mCondition;
52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    MediaBuffer *mFirstBuffer, *mLastBuffer;
54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    MediaBufferGroup(const MediaBufferGroup &);
56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    MediaBufferGroup &operator=(const MediaBufferGroup &);
57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace android
60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif  // MEDIA_BUFFER_GROUP_H_
62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson