OMXBuffer.cpp revision d02c08671d666e12a94bcadd943787a9ab2ceea8
1/*
2 * Copyright 2016, 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_NDEBUG 0
18#define LOG_TAG "OMXBuffer"
19
20#include <media/MediaCodecBuffer.h>
21#include <media/OMXBuffer.h>
22#include <binder/IMemory.h>
23#include <binder/Parcel.h>
24#include <ui/GraphicBuffer.h>
25#include <utils/NativeHandle.h>
26
27namespace android {
28
29//static
30OMXBuffer OMXBuffer::sPreset(static_cast<sp<MediaCodecBuffer> >(NULL));
31
32OMXBuffer::OMXBuffer()
33    : mBufferType(kBufferTypeInvalid) {
34}
35
36OMXBuffer::OMXBuffer(const sp<MediaCodecBuffer>& codecBuffer)
37    : mBufferType(kBufferTypePreset),
38      mRangeLength(codecBuffer != NULL ? codecBuffer->size() : 0) {
39}
40
41OMXBuffer::OMXBuffer(const sp<IMemory> &mem)
42    : mBufferType(kBufferTypeSharedMem),
43      mMem(mem) {
44}
45
46OMXBuffer::OMXBuffer(const sp<GraphicBuffer> &gbuf)
47    : mBufferType(kBufferTypeANWBuffer),
48      mGraphicBuffer(gbuf) {
49}
50
51OMXBuffer::OMXBuffer(const sp<NativeHandle> &handle)
52    : mBufferType(kBufferTypeNativeHandle),
53      mNativeHandle(handle) {
54}
55
56OMXBuffer::~OMXBuffer() {
57}
58
59status_t OMXBuffer::writeToParcel(Parcel *parcel) const {
60    parcel->writeInt32(mBufferType);
61
62    switch(mBufferType) {
63        case kBufferTypePreset:
64        {
65            return parcel->writeUint32(mRangeLength);
66        }
67
68        case kBufferTypeSharedMem:
69        {
70            return parcel->writeStrongBinder(IInterface::asBinder(mMem));
71        }
72
73        case kBufferTypeANWBuffer:
74        {
75            return parcel->write(*mGraphicBuffer);
76        }
77
78        case kBufferTypeNativeHandle:
79        {
80            return parcel->writeNativeHandle(mNativeHandle->handle());
81        }
82
83        default:
84            return BAD_VALUE;
85    }
86    return BAD_VALUE;
87}
88
89status_t OMXBuffer::readFromParcel(const Parcel *parcel) {
90    BufferType bufferType = (BufferType) parcel->readInt32();
91
92    switch(bufferType) {
93        case kBufferTypePreset:
94        {
95            mRangeLength = parcel->readUint32();
96            break;
97        }
98
99        case kBufferTypeSharedMem:
100        {
101            mMem = interface_cast<IMemory>(parcel->readStrongBinder());
102            break;
103        }
104
105        case kBufferTypeANWBuffer:
106        {
107            sp<GraphicBuffer> buffer = new GraphicBuffer();
108
109            status_t err = parcel->read(*buffer);
110
111            if (err != OK) {
112                return err;
113            }
114
115            mGraphicBuffer = buffer;
116            break;
117        }
118
119        case kBufferTypeNativeHandle:
120        {
121            sp<NativeHandle> handle = NativeHandle::create(
122                    parcel->readNativeHandle(), true /* ownsHandle */);
123
124            mNativeHandle = handle;
125            break;
126        }
127
128        default:
129            return BAD_VALUE;
130    }
131
132    mBufferType = bufferType;
133    return OK;
134}
135
136} // namespace android
137
138
139
140
141