1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright 2016, The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef _OMXBUFFER_H_
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define _OMXBUFFER_H_
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <cutils/native_handle.h>
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/IOMX.h>
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <system/window.h>
23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/StrongPointer.h>
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <hidl/HidlSupport.h>
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass OMXBuffer;
29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// This is needed temporarily for the OMX HIDL transition.
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace hardware { namespace media { namespace omx {
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace V1_0 {
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    struct CodecBuffer;
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace implementation {
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    inline bool wrapAs(::android::hardware::media::omx::V1_0::CodecBuffer* t,
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::OMXBuffer const& l);
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    inline bool convertTo(::android::OMXBuffer* l,
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::media::omx::V1_0::CodecBuffer const& t);
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace utils {
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    inline bool wrapAs(::android::hardware::media::omx::V1_0::CodecBuffer* t,
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::OMXBuffer const& l);
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    inline bool convertTo(::android::OMXBuffer* l,
44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::media::omx::V1_0::CodecBuffer const& t);
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}}}}
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass GraphicBuffer;
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass IMemory;
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass MediaCodecBuffer;
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass NativeHandle;
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct OMXNodeInstance;
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanusing hardware::hidl_memory;
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// TODO: After complete HIDL transition, this class would be replaced by
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// CodecBuffer.
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass OMXBuffer {
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic:
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // sPreset is used in places where we are referring to a pre-registered
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // buffer on a port. It has type kBufferTypePreset and mRangeLength of 0.
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static OMXBuffer sPreset;
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Default constructor, constructs a buffer of type kBufferTypeInvalid.
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer();
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Constructs a buffer of type kBufferTypePreset with mRangeOffset set to
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // |codecBuffer|'s offset and mRangeLength set to |codecBuffer|'s size (or 0
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // if |codecBuffer| is NULL).
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer);
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Constructs a buffer of type kBufferTypePreset with specified mRangeOffset
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // and mRangeLength.
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(OMX_U32 rangeOffset, OMX_U32 rangeLength);
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Constructs a buffer of type kBufferTypeSharedMem.
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(const sp<IMemory> &mem);
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Constructs a buffer of type kBufferTypeANWBuffer.
79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(const sp<GraphicBuffer> &gbuf);
80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Constructs a buffer of type kBufferTypeNativeHandle.
82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(const sp<NativeHandle> &handle);
83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Constructs a buffer of type kBufferTypeHidlMemory.
85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(const hidl_memory &hidlMemory);
86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Parcelling/Un-parcelling.
88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t writeToParcel(Parcel *parcel) const;
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t readFromParcel(const Parcel *parcel);
90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    ~OMXBuffer();
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend struct OMXNodeInstance;
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // This is needed temporarily for OMX HIDL transition.
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend inline bool (::android::hardware::media::omx::V1_0::implementation::
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            wrapAs)(::android::hardware::media::omx::V1_0::CodecBuffer* t,
99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            OMXBuffer const& l);
100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend inline bool (::android::hardware::media::omx::V1_0::implementation::
101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            convertTo)(OMXBuffer* l,
102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::media::omx::V1_0::CodecBuffer const& t);
103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend inline bool (::android::hardware::media::omx::V1_0::utils::
104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            wrapAs)(::android::hardware::media::omx::V1_0::CodecBuffer* t,
105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            OMXBuffer const& l);
106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend inline bool (::android::hardware::media::omx::V1_0::utils::
107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            convertTo)(OMXBuffer* l,
108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::media::omx::V1_0::CodecBuffer const& t);
109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    enum BufferType {
111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        kBufferTypeInvalid = 0,
112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        kBufferTypePreset,
113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        kBufferTypeSharedMem,
114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        kBufferTypeANWBuffer, // Use only for non-Treble
115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        kBufferTypeNativeHandle,
116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        kBufferTypeHidlMemory // Mapped to CodecBuffer::Type::SHARED_MEM.
117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    };
118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    BufferType mBufferType;
120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // kBufferTypePreset
122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // If the port is operating in byte buffer mode, mRangeLength is the valid
123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // range length. Otherwise the range info should also be ignored.
124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMX_U32 mRangeOffset;
125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMX_U32 mRangeLength;
126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // kBufferTypeSharedMem
128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<IMemory> mMem;
129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // kBufferTypeANWBuffer
131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<GraphicBuffer> mGraphicBuffer;
132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // kBufferTypeNativeHandle
134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<NativeHandle> mNativeHandle;
135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // kBufferTypeHidlMemory
137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    hidl_memory mHidlMemory;
138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Move assignment
140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer &operator=(OMXBuffer&&);
141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Deleted copy constructor and assignment.
143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer(const OMXBuffer&) = delete;
144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXBuffer& operator=(const OMXBuffer&) = delete;
145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}  // namespace android
148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif  // _OMXBUFFER_H_
150