我读了一些我在Android Oreo源代码中无法理解的代码。
首先,类 IOMXNode 有一个函数:
class IOMXNode : public IInterface {
public:
+-- 46 lines: DECLARE_HYBRID_META_INTERFACE(OMXNode, IOmxNode);-------------------------------------------------------------------------------------------------------------------------------
// Instructs the component to use the buffer passed in via |omxBuf| on the
// specified port. Returns in |*buffer| the buffer id that the component
// assigns to this buffer. |omxBuf| must be one of:
// 1) OMXBuffer::sPreset for meta-mode,
// 2) type kBufferTypeANWBuffer for non-meta-graphic buffer mode,
// 3) type kBufferTypeSharedMem for bytebuffer mode.
virtual status_t useBuffer(
OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) = 0;
useBuffer()有三个参数,其中一个是 const OMXBuffer& ,它定义如下:
class OMXBuffer {
public:
// sPreset is used in places where we are referring to a pre-registered
// buffer on a port. It has type kBufferTypePreset and mRangeLength of 0.
static OMXBuffer sPreset;
// Default constructor, constructs a buffer of type kBufferTypeInvalid.
OMXBuffer();
// Constructs a buffer of type kBufferTypePreset with mRangeOffset set to
// |codecBuffer|'s offset and mRangeLength set to |codecBuffer|'s size (or 0
// if |codecBuffer| is NULL).
OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer);
// Constructs a buffer of type kBufferTypePreset with specified mRangeOffset
// and mRangeLength.
OMXBuffer(OMX_U32 rangeOffset, OMX_U32 rangeLength);
// Constructs a buffer of type kBufferTypeSharedMem.
OMXBuffer(const sp<IMemory> &mem);
然后在某处调用此函数,如:
sp<IOMXNode> mOMXNode;
...
sp<IMemory> mem;
...
err = mOMXNode->useBuffer(portIndex, mem, &info.mBufferID);
那么,为什么sp<IMemory>
可以直接匹配函数 useBuffer()的第二个参数类型 const OMXBuffer&amp; ?
所有我可以将它放在一起的方式是,编译器使用sp<IMemory>
并构造 OMXBuffer ,然后匹配 useBuffer()第二个参数。
这是属于类型演绎还是其他我不知道的东西?
答案 0 :(得分:2)
重要的是这些(来自OMXBuffer
类):
// Constructs a buffer of type kBufferTypeSharedMem.
OMXBuffer(const sp<IMemory> &mem);
converting constructor可以从OMXBuffer
对象创建sp<IMemory>
对象。
这意味着真正发生的事情是
err = mOMXNode->useBuffer(portIndex, OMXBuffer(mem), &info.mBufferID);
即,从OMXBuffer
对象创建临时mem
对象。然后,对该临时OMXBuffer
对象的引用将传递给useBuffer
函数。一旦useBuffer
函数返回,临时OMXBuffer
对象就被破坏了。
答案 1 :(得分:0)
如果只使用一个参数定义了复制构造函数,那么它就是转换构造函数。
据说转换构造函数指定从其参数类型(如果有)到其类的类型的隐式转换
因此,当您将mem
传递给useBuffer作为第二个参数时,使用转换构造函数将其转换为OMXBuffer&
。