class BufferItem : public Flattenable<BufferItem> {
friend class Flattenable<BufferItem>;
size_t getPodSize() const;
size_t getFlattenedSize() const;
size_t getFdCount() const;
status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;
status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);
BufferItem 继承了 Flattenable,它可以跨进程传递。
public:
// The default value of mBuf, used to indicate this doesn't correspond to a slot.
enum { INVALID_BUFFER_SLOT = -1 };
BufferItem();
~BufferItem();
BufferItem(const BufferItem&) = default;
BufferItem& operator=(const BufferItem&) = default;
static const char* scalingModeName(uint32_t scalingMode);
// mGraphicBuffer points to the buffer allocated for this slot, or is NULL
// if the buffer in this slot has been acquired in the past (see
// BufferSlot.mAcquireCalled).
sp<GraphicBuffer> mGraphicBuffer;
// mFence is a fence that will signal when the buffer is idle.
sp<Fence> mFence;
// The std::shared_ptr<FenceTime> wrapper around mFence.
std::shared_ptr<FenceTime> mFenceTime{FenceTime::NO_FENCE};
// mCrop is the current crop rectangle for this buffer slot.
Rect mCrop;
// mTransform is the current transform flags for this buffer slot.
// refer to NATIVE_WINDOW_TRANSFORM_* in <window.h>
uint32_t mTransform;
// mScalingMode is the current scaling mode for this buffer slot.
// refer to NATIVE_WINDOW_SCALING_* in <window.h>
uint32_t mScalingMode;
如果该 slot 之前已经 acquire 过了,即 mAcquireCalled 是 true,则 mGraphicBuffer 是空。因为消费者已经持有该指针,不需要再次传递。
mCrop 是 buffer 当前裁剪矩形。mTransform 是在 window.h 定义的枚举:
NATIVE_WINDOW_TRANSFORM_FLIP_HNATIVE_WINDOW_TRANSFORM_FLIP_VNATIVE_WINDOW_TRANSFORM_ROT_90NATIVE_WINDOW_TRANSFORM_ROT_180NATIVE_WINDOW_TRANSFORM_ROT_270NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAYmScalingMode 也是在 window.h 定义的枚举:
NATIVE_WINDOW_SCALING_MODE_FREEZENATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOWNATIVE_WINDOW_SCALING_MODE_SCALE_CROPNATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP