• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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