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