ion_buffer.h revision 044963e1dd0479035b6e5f2c6bd618bde7143710
1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_DVR_ION_BUFFER_H_ 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_DVR_ION_BUFFER_H_ 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <hardware/gralloc.h> 58a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus#include <log/log.h> 68a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus#include <ui/GraphicBuffer.h> 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// IonBuffer is an abstraction of Ion/Gralloc buffers. 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass IonBuffer { 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public: 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko IonBuffer(); 15044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai IonBuffer(uint32_t width, uint32_t height, uint32_t format, uint64_t usage); 16cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka IonBuffer(buffer_handle_t handle, uint32_t width, uint32_t height, 17044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint32_t stride, uint32_t format, uint64_t usage); 18cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka IonBuffer(buffer_handle_t handle, uint32_t width, uint32_t height, 19cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t layer_count, uint32_t stride, uint32_t layer_stride, 20044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint32_t format, uint64_t usage); 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ~IonBuffer(); 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko IonBuffer(IonBuffer&& other); 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko IonBuffer& operator=(IonBuffer&& other); 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Frees the underlying native handle and leaves the instance initialized to 27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // empty. 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko void FreeHandle(); 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Allocates a new native handle with the given parameters, freeing the 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // previous native handle if necessary. Returns 0 on success or a negative 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // errno code otherwise. If allocation fails the previous native handle is 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // left intact. 34044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai int Alloc(uint32_t width, uint32_t height, uint32_t format, uint64_t usage); 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Resets the underlying native handle and parameters, freeing the previous 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // native handle if necessary. 38cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka void Reset(buffer_handle_t handle, uint32_t width, uint32_t height, 39044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint32_t stride, uint32_t format, uint64_t usage); 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Like Reset but also registers the native handle, which is necessary for 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // native handles received over IPC. Returns 0 on success or a negative errno 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // code otherwise. If import fails the previous native handle is left intact. 44cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka int Import(buffer_handle_t handle, uint32_t width, uint32_t height, 45044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint32_t stride, uint32_t format, uint64_t usage); 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Like Reset but imports a native handle from raw fd and int arrays. Returns 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // 0 on success or a negative errno code otherwise. If import fails the 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // previous native handle is left intact. 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Import(const int* fd_array, int fd_count, const int* int_array, 51cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka int int_count, uint32_t width, uint32_t height, uint32_t stride, 52044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint32_t format, uint64_t usage); 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Duplicates the native handle underlying |other| and then imports it. This 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // is useful for creating multiple, independent views of the same Ion/Gralloc 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // buffer. Returns 0 on success or a negative errno code otherwise. If 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // duplication or import fail the previous native handle is left intact. 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Duplicate(const IonBuffer* other); 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 60cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka int Lock(uint32_t usage, int x, int y, int width, int height, void** address); 61cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka int LockYUV(uint32_t usage, int x, int y, int width, int height, 62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct android_ycbcr* yuv); 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Unlock(); 642655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka 652655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka const sp<GraphicBuffer>& buffer() const { return buffer_; } 662655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka buffer_handle_t handle() const { 672655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka return buffer_.get() ? buffer_->handle : nullptr; 682655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka } 69cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t width() const { return buffer_.get() ? buffer_->getWidth() : 0; } 70cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t height() const { return buffer_.get() ? buffer_->getHeight() : 0; } 71cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t layer_count() const { 722655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka return buffer_.get() ? buffer_->getLayerCount() : 0; 732655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka } 74cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t stride() const { return buffer_.get() ? buffer_->getStride() : 0; } 75cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t layer_stride() const { return 0; } 76cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t format() const { 77cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka return buffer_.get() ? buffer_->getPixelFormat() : 0; 78cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka } 79044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint64_t usage() const { 80044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai return buffer_.get() ? static_cast<uint64_t>(buffer_->getUsage()) : 0; 81044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai } 82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private: 848a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus sp<GraphicBuffer> buffer_; 85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko IonBuffer(const IonBuffer&) = delete; 87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko void operator=(const IonBuffer&) = delete; 88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}; 89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace dvr 91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace android 92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif // ANDROID_DVR_ION_BUFFER_H_ 94