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 #ifndef _OMXBUFFER_H_ 18 #define _OMXBUFFER_H_ 19 20 #include <cutils/native_handle.h> 21 #include <media/IOMX.h> 22 #include <system/window.h> 23 #include <utils/StrongPointer.h> 24 #include <hidl/HidlSupport.h> 25 26 namespace android { 27 28 class OMXBuffer; 29 30 // This is needed temporarily for the OMX HIDL transition. 31 namespace hardware { namespace media { namespace omx { 32 namespace V1_0 { 33 struct CodecBuffer; 34 namespace implementation { 35 inline bool wrapAs(::android::hardware::media::omx::V1_0::CodecBuffer* t, 36 ::android::OMXBuffer const& l); 37 inline bool convertTo(::android::OMXBuffer* l, 38 ::android::hardware::media::omx::V1_0::CodecBuffer const& t); 39 } 40 namespace utils { 41 inline bool wrapAs(::android::hardware::media::omx::V1_0::CodecBuffer* t, 42 ::android::OMXBuffer const& l); 43 inline bool convertTo(::android::OMXBuffer* l, 44 ::android::hardware::media::omx::V1_0::CodecBuffer const& t); 45 } 46 }}}} 47 48 class GraphicBuffer; 49 class IMemory; 50 class MediaCodecBuffer; 51 class NativeHandle; 52 struct OMXNodeInstance; 53 using hardware::hidl_memory; 54 55 // TODO: After complete HIDL transition, this class would be replaced by 56 // CodecBuffer. 57 class OMXBuffer { 58 public: 59 // sPreset is used in places where we are referring to a pre-registered 60 // buffer on a port. It has type kBufferTypePreset and mRangeLength of 0. 61 static OMXBuffer sPreset; 62 63 // Default constructor, constructs a buffer of type kBufferTypeInvalid. 64 OMXBuffer(); 65 66 // Constructs a buffer of type kBufferTypePreset with mRangeOffset set to 67 // |codecBuffer|'s offset and mRangeLength set to |codecBuffer|'s size (or 0 68 // if |codecBuffer| is NULL). 69 OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer); 70 71 // Constructs a buffer of type kBufferTypePreset with specified mRangeOffset 72 // and mRangeLength. 73 OMXBuffer(OMX_U32 rangeOffset, OMX_U32 rangeLength); 74 75 // Constructs a buffer of type kBufferTypeSharedMem. 76 OMXBuffer(const sp<IMemory> &mem); 77 78 // Constructs a buffer of type kBufferTypeANWBuffer. 79 OMXBuffer(const sp<GraphicBuffer> &gbuf); 80 81 // Constructs a buffer of type kBufferTypeNativeHandle. 82 OMXBuffer(const sp<NativeHandle> &handle); 83 84 // Constructs a buffer of type kBufferTypeHidlMemory. 85 OMXBuffer(const hidl_memory &hidlMemory); 86 87 // Parcelling/Un-parcelling. 88 status_t writeToParcel(Parcel *parcel) const; 89 status_t readFromParcel(const Parcel *parcel); 90 91 ~OMXBuffer(); 92 93 private: 94 friend struct OMXNodeInstance; 95 96 // This is needed temporarily for OMX HIDL transition. 97 friend inline bool (::android::hardware::media::omx::V1_0::implementation:: 98 wrapAs)(::android::hardware::media::omx::V1_0::CodecBuffer* t, 99 OMXBuffer const& l); 100 friend inline bool (::android::hardware::media::omx::V1_0::implementation:: 101 convertTo)(OMXBuffer* l, 102 ::android::hardware::media::omx::V1_0::CodecBuffer const& t); 103 friend inline bool (::android::hardware::media::omx::V1_0::utils:: 104 wrapAs)(::android::hardware::media::omx::V1_0::CodecBuffer* t, 105 OMXBuffer const& l); 106 friend inline bool (::android::hardware::media::omx::V1_0::utils:: 107 convertTo)(OMXBuffer* l, 108 ::android::hardware::media::omx::V1_0::CodecBuffer const& t); 109 110 enum BufferType { 111 kBufferTypeInvalid = 0, 112 kBufferTypePreset, 113 kBufferTypeSharedMem, 114 kBufferTypeANWBuffer, // Use only for non-Treble 115 kBufferTypeNativeHandle, 116 kBufferTypeHidlMemory // Mapped to CodecBuffer::Type::SHARED_MEM. 117 }; 118 119 BufferType mBufferType; 120 121 // kBufferTypePreset 122 // If the port is operating in byte buffer mode, mRangeLength is the valid 123 // range length. Otherwise the range info should also be ignored. 124 OMX_U32 mRangeOffset; 125 OMX_U32 mRangeLength; 126 127 // kBufferTypeSharedMem 128 sp<IMemory> mMem; 129 130 // kBufferTypeANWBuffer 131 sp<GraphicBuffer> mGraphicBuffer; 132 133 // kBufferTypeNativeHandle 134 sp<NativeHandle> mNativeHandle; 135 136 // kBufferTypeHidlMemory 137 hidl_memory mHidlMemory; 138 139 // Move assignment 140 OMXBuffer &operator=(OMXBuffer&&); 141 142 // Deleted copy constructor and assignment. 143 OMXBuffer(const OMXBuffer&) = delete; 144 OMXBuffer& operator=(const OMXBuffer&) = delete; 145 }; 146 147 } // namespace android 148 149 #endif // _OMXBUFFER_H_ 150