#ifndef __MEDIA_INFO_H__ #define __MEDIA_INFO_H__ #ifndef MSM_MEDIA_ALIGN #define MSM_MEDIA_ALIGN(__sz, __align) (((__align) & ((__align) - 1)) ?\ ((((__sz) + (__align) - 1) / (__align)) * (__align)) :\ (((__sz) + (__align) - 1) & (~((__align) - 1)))) #endif #ifndef MSM_MEDIA_ROUNDUP #define MSM_MEDIA_ROUNDUP(__sz, __r) (((__sz) + ((__r) - 1)) / (__r)) #endif #ifndef MSM_MEDIA_MAX #define MSM_MEDIA_MAX(__a, __b) ((__a) > (__b)?(__a):(__b)) #endif enum color_fmts { /* Venus NV12: * YUV 4:2:0 image with a plane of 8 bit Y samples followed * by an interleaved U/V plane containing 8 bit 2x2 subsampled * colour difference samples. * * <-------- Y/UV_Stride --------> * <------- Width -------> * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * U V U V U V U V U V U V . . . . ^ * U V U V U V U V U V U V . . . . | * U V U V U V U V U V U V . . . . | * U V U V U V U V U V U V . . . . UV_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . --> Buffer size alignment * * Y_Stride : Width aligned to 128 * UV_Stride : Width aligned to 128 * Y_Scanlines: Height aligned to 32 * UV_Scanlines: Height/2 aligned to 16 * Extradata: Arbitrary (software-imposed) padding * Total size = align((Y_Stride * Y_Scanlines * + UV_Stride * UV_Scanlines * + max(Extradata, Y_Stride * 8), 4096) */ COLOR_FMT_NV12, /* Venus NV21: * YUV 4:2:0 image with a plane of 8 bit Y samples followed * by an interleaved V/U plane containing 8 bit 2x2 subsampled * colour difference samples. * * <-------- Y/UV_Stride --------> * <------- Width -------> * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * V U V U V U V U V U V U . . . . ^ * V U V U V U V U V U V U . . . . | * V U V U V U V U V U V U . . . . | * V U V U V U V U V U V U . . . . UV_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . --> Padding & Buffer size alignment * * Y_Stride : Width aligned to 128 * UV_Stride : Width aligned to 128 * Y_Scanlines: Height aligned to 32 * UV_Scanlines: Height/2 aligned to 16 * Extradata: Arbitrary (software-imposed) padding * Total size = align((Y_Stride * Y_Scanlines * + UV_Stride * UV_Scanlines * + max(Extradata, Y_Stride * 8), 4096) */ COLOR_FMT_NV21, /* Venus NV12_MVTB: * Two YUV 4:2:0 images/views one after the other * in a top-bottom layout, same as NV12 * with a plane of 8 bit Y samples followed * by an interleaved U/V plane containing 8 bit 2x2 subsampled * colour difference samples. * * * <-------- Y/UV_Stride --------> * <------- Width -------> * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ ^ * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | | * . . . . . . . . . . . . . . . . | View_1 * . . . . . . . . . . . . . . . . | | * . . . . . . . . . . . . . . . . | | * . . . . . . . . . . . . . . . . V | * U V U V U V U V U V U V . . . . ^ | * U V U V U V U V U V U V . . . . | | * U V U V U V U V U V U V . . . . | | * U V U V U V U V U V U V . . . . UV_Scanlines | * . . . . . . . . . . . . . . . . | | * . . . . . . . . . . . . . . . . V V * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ ^ * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | | * . . . . . . . . . . . . . . . . | View_2 * . . . . . . . . . . . . . . . . | | * . . . . . . . . . . . . . . . . | | * . . . . . . . . . . . . . . . . V | * U V U V U V U V U V U V . . . . ^ | * U V U V U V U V U V U V . . . . | | * U V U V U V U V U V U V . . . . | | * U V U V U V U V U V U V . . . . UV_Scanlines | * . . . . . . . . . . . . . . . . | | * . . . . . . . . . . . . . . . . V V * . . . . . . . . . . . . . . . . --> Buffer size alignment * * Y_Stride : Width aligned to 128 * UV_Stride : Width aligned to 128 * Y_Scanlines: Height aligned to 32 * UV_Scanlines: Height/2 aligned to 16 * View_1 begin at: 0 (zero) * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines * Extradata: Arbitrary (software-imposed) padding * Total size = align((2*(Y_Stride * Y_Scanlines) * + 2*(UV_Stride * UV_Scanlines) + Extradata), 4096) */ COLOR_FMT_NV12_MVTB, /* * The buffer can be of 2 types: * (1) Venus NV12 UBWC Progressive * (2) Venus NV12 UBWC Interlaced * * (1) Venus NV12 UBWC Progressive Buffer Format: * Compressed Macro-tile format for NV12. * Contains 4 planes in the following order - * (A) Y_Meta_Plane * (B) Y_UBWC_Plane * (C) UV_Meta_Plane * (D) UV_UBWC_Plane * * Y_Meta_Plane consists of meta information to decode compressed * tile data in Y_UBWC_Plane. * Y_UBWC_Plane consists of Y data in compressed macro-tile format. * UBWC decoder block will use the Y_Meta_Plane data together with * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples. * * UV_Meta_Plane consists of meta information to decode compressed * tile data in UV_UBWC_Plane. * UV_UBWC_Plane consists of UV data in compressed macro-tile format. * UBWC decoder block will use UV_Meta_Plane data together with * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2 * subsampled color difference samples. * * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable * and randomly accessible. There is no dependency between tiles. * * <----- Y_Meta_Stride ----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Height | * M M M M M M M M M M M M . . | Meta_Y_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <--Compressed tile Y Stride---> * <------- Width -------> * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * <----- UV_Meta_Stride ----> * M M M M M M M M M M M M . . ^ * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . M_UV_Scanlines * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * <--Compressed tile UV Stride---> * U* V* U* V* U* V* U* V* . . . . ^ * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . UV_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * * Y_Stride = align(Width, 128) * UV_Stride = align(Width, 128) * Y_Scanlines = align(Height, 32) * UV_Scanlines = align(Height/2, 16) * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096) * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096) * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16) * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096) * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16) * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size + * Y_Meta_Plane_size + UV_Meta_Plane_size * + max(Extradata, Y_Stride * 48), 4096) * * * (2) Venus NV12 UBWC Interlaced Buffer Format: * Compressed Macro-tile format for NV12 interlaced. * Contains 8 planes in the following order - * (A) Y_Meta_Top_Field_Plane * (B) Y_UBWC_Top_Field_Plane * (C) UV_Meta_Top_Field_Plane * (D) UV_UBWC_Top_Field_Plane * (E) Y_Meta_Bottom_Field_Plane * (F) Y_UBWC_Bottom_Field_Plane * (G) UV_Meta_Bottom_Field_Plane * (H) UV_UBWC_Bottom_Field_Plane * Y_Meta_Top_Field_Plane consists of meta information to decode * compressed tile data for Y_UBWC_Top_Field_Plane. * Y_UBWC_Top_Field_Plane consists of Y data in compressed macro-tile * format for top field of an interlaced frame. * UBWC decoder block will use the Y_Meta_Top_Field_Plane data together * with Y_UBWC_Top_Field_Plane data to produce loss-less uncompressed * 8 bit Y samples for top field of an interlaced frame. * * UV_Meta_Top_Field_Plane consists of meta information to decode * compressed tile data in UV_UBWC_Top_Field_Plane. * UV_UBWC_Top_Field_Plane consists of UV data in compressed macro-tile * format for top field of an interlaced frame. * UBWC decoder block will use UV_Meta_Top_Field_Plane data together * with UV_UBWC_Top_Field_Plane data to produce loss-less uncompressed * 8 bit subsampled color difference samples for top field of an * interlaced frame. * * Each tile in Y_UBWC_Top_Field_Plane/UV_UBWC_Top_Field_Plane is * independently decodable and randomly accessible. There is no * dependency between tiles. * * Y_Meta_Bottom_Field_Plane consists of meta information to decode * compressed tile data for Y_UBWC_Bottom_Field_Plane. * Y_UBWC_Bottom_Field_Plane consists of Y data in compressed macro-tile * format for bottom field of an interlaced frame. * UBWC decoder block will use the Y_Meta_Bottom_Field_Plane data * together with Y_UBWC_Bottom_Field_Plane data to produce loss-less * uncompressed 8 bit Y samples for bottom field of an interlaced frame. * * UV_Meta_Bottom_Field_Plane consists of meta information to decode * compressed tile data in UV_UBWC_Bottom_Field_Plane. * UV_UBWC_Bottom_Field_Plane consists of UV data in compressed * macro-tile format for bottom field of an interlaced frame. * UBWC decoder block will use UV_Meta_Bottom_Field_Plane data together * with UV_UBWC_Bottom_Field_Plane data to produce loss-less * uncompressed 8 bit subsampled color difference samples for bottom * field of an interlaced frame. * * Each tile in Y_UBWC_Bottom_Field_Plane/UV_UBWC_Bottom_Field_Plane is * independently decodable and randomly accessible. There is no * dependency between tiles. * * <-----Y_TF_Meta_Stride----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Half_height | * M M M M M M M M M M M M . . | Meta_Y_TF_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <-Compressed tile Y_TF Stride-> * <------- Width -------> * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Half_height | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_TF_Scanlines * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * <----UV_TF_Meta_Stride----> * M M M M M M M M M M M M . . ^ * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . M_UV_TF_Scanlines * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * <-Compressed tile UV_TF Stride-> * U* V* U* V* U* V* U* V* . . . . ^ * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . UV_TF_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * <-----Y_BF_Meta_Stride----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Half_height | * M M M M M M M M M M M M . . | Meta_Y_BF_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <-Compressed tile Y_BF Stride-> * <------- Width -------> * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Half_height | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_BF_Scanlines * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * <----UV_BF_Meta_Stride----> * M M M M M M M M M M M M . . ^ * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . M_UV_BF_Scanlines * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * <-Compressed tile UV_BF Stride-> * U* V* U* V* U* V* U* V* . . . . ^ * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . UV_BF_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * * Half_height = (Height+1)>>1 * Y_TF_Stride = align(Width, 128) * UV_TF_Stride = align(Width, 128) * Y_TF_Scanlines = align(Half_height, 32) * UV_TF_Scanlines = align((Half_height+1)/2, 32) * Y_UBWC_TF_Plane_size = align(Y_TF_Stride * Y_TF_Scanlines, 4096) * UV_UBWC_TF_Plane_size = align(UV_TF_Stride * UV_TF_Scanlines, 4096) * Y_TF_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) * Y_TF_Meta_Scanlines = align(roundup(Half_height, Y_TileHeight), 16) * Y_TF_Meta_Plane_size = * align(Y_TF_Meta_Stride * Y_TF_Meta_Scanlines, 4096) * UV_TF_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) * UV_TF_Meta_Scanlines = align(roundup(Half_height, UV_TileHeight), 16) * UV_TF_Meta_Plane_size = * align(UV_TF_Meta_Stride * UV_TF_Meta_Scanlines, 4096) * Y_BF_Stride = align(Width, 128) * UV_BF_Stride = align(Width, 128) * Y_BF_Scanlines = align(Half_height, 32) * UV_BF_Scanlines = align((Half_height+1)/2, 32) * Y_UBWC_BF_Plane_size = align(Y_BF_Stride * Y_BF_Scanlines, 4096) * UV_UBWC_BF_Plane_size = align(UV_BF_Stride * UV_BF_Scanlines, 4096) * Y_BF_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) * Y_BF_Meta_Scanlines = align(roundup(Half_height, Y_TileHeight), 16) * Y_BF_Meta_Plane_size = * align(Y_BF_Meta_Stride * Y_BF_Meta_Scanlines, 4096) * UV_BF_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) * UV_BF_Meta_Scanlines = align(roundup(Half_height, UV_TileHeight), 16) * UV_BF_Meta_Plane_size = * align(UV_BF_Meta_Stride * UV_BF_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align( Y_UBWC_TF_Plane_size + UV_UBWC_TF_Plane_size + * Y_TF_Meta_Plane_size + UV_TF_Meta_Plane_size + * Y_UBWC_BF_Plane_size + UV_UBWC_BF_Plane_size + * Y_BF_Meta_Plane_size + UV_BF_Meta_Plane_size + * + max(Extradata, Y_TF_Stride * 48), 4096) */ COLOR_FMT_NV12_UBWC, /* Venus NV12 10-bit UBWC: * Compressed Macro-tile format for NV12. * Contains 4 planes in the following order - * (A) Y_Meta_Plane * (B) Y_UBWC_Plane * (C) UV_Meta_Plane * (D) UV_UBWC_Plane * * Y_Meta_Plane consists of meta information to decode compressed * tile data in Y_UBWC_Plane. * Y_UBWC_Plane consists of Y data in compressed macro-tile format. * UBWC decoder block will use the Y_Meta_Plane data together with * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples. * * UV_Meta_Plane consists of meta information to decode compressed * tile data in UV_UBWC_Plane. * UV_UBWC_Plane consists of UV data in compressed macro-tile format. * UBWC decoder block will use UV_Meta_Plane data together with * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2 * subsampled color difference samples. * * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable * and randomly accessible. There is no dependency between tiles. * * <----- Y_Meta_Stride -----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Height | * M M M M M M M M M M M M . . | Meta_Y_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <--Compressed tile Y Stride---> * <------- Width -------> * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * <----- UV_Meta_Stride ----> * M M M M M M M M M M M M . . ^ * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . M_UV_Scanlines * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * <--Compressed tile UV Stride---> * U* V* U* V* U* V* U* V* . . . . ^ * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . UV_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * * * Y_Stride = align(Width * 4/3, 128) * UV_Stride = align(Width * 4/3, 128) * Y_Scanlines = align(Height, 32) * UV_Scanlines = align(Height/2, 16) * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096) * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096) * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16) * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096) * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16) * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size + * Y_Meta_Plane_size + UV_Meta_Plane_size * + max(Extradata, Y_Stride * 48), 4096) */ COLOR_FMT_NV12_BPP10_UBWC, /* Venus RGBA8888 format: * Contains 1 plane in the following order - * (A) RGBA plane * * <-------- RGB_Stride --------> * <------- Width -------> * R R R R R R R R R R R R . . . . ^ ^ * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . Height | * R R R R R R R R R R R R . . . . | RGB_Scanlines * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * * RGB_Stride = align(Width * 4, 128) * RGB_Scanlines = align(Height, 32) * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) * Extradata = 8k * * Total size = align(RGB_Plane_size + Extradata, 4096) */ COLOR_FMT_RGBA8888, /* Venus RGBA8888 UBWC format: * Contains 2 planes in the following order - * (A) Meta plane * (B) RGBA plane * * <--- RGB_Meta_Stride ----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Height | * M M M M M M M M M M M M . . | Meta_RGB_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <-------- RGB_Stride --------> * <------- Width -------> * R R R R R R R R R R R R . . . . ^ ^ * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . Height | * R R R R R R R R R R R R . . . . | RGB_Scanlines * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * * RGB_Stride = align(Width * 4, 128) * RGB_Scanlines = align(Height, 32) * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64) * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16) * RGB_Meta_Plane_size = align(RGB_Meta_Stride * * RGB_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size + * Extradata, 4096) */ COLOR_FMT_RGBA8888_UBWC, /* Venus RGBA1010102 UBWC format: * Contains 2 planes in the following order - * (A) Meta plane * (B) RGBA plane * * <--- RGB_Meta_Stride ----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Height | * M M M M M M M M M M M M . . | Meta_RGB_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <-------- RGB_Stride --------> * <------- Width -------> * R R R R R R R R R R R R . . . . ^ ^ * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . Height | * R R R R R R R R R R R R . . . . | RGB_Scanlines * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * * RGB_Stride = align(Width * 4, 256) * RGB_Scanlines = align(Height, 16) * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64) * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16) * RGB_Meta_Plane_size = align(RGB_Meta_Stride * * RGB_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size + * Extradata, 4096) */ COLOR_FMT_RGBA1010102_UBWC, /* Venus RGB565 UBWC format: * Contains 2 planes in the following order - * (A) Meta plane * (B) RGB plane * * <--- RGB_Meta_Stride ----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Height | * M M M M M M M M M M M M . . | Meta_RGB_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <-------- RGB_Stride --------> * <------- Width -------> * R R R R R R R R R R R R . . . . ^ ^ * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . Height | * R R R R R R R R R R R R . . . . | RGB_Scanlines * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . | | * R R R R R R R R R R R R . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * * RGB_Stride = align(Width * 2, 128) * RGB_Scanlines = align(Height, 16) * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64) * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16) * RGB_Meta_Plane_size = align(RGB_Meta_Stride * * RGB_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size + * Extradata, 4096) */ COLOR_FMT_RGB565_UBWC, /* P010 UBWC: * Compressed Macro-tile format for NV12. * Contains 4 planes in the following order - * (A) Y_Meta_Plane * (B) Y_UBWC_Plane * (C) UV_Meta_Plane * (D) UV_UBWC_Plane * * Y_Meta_Plane consists of meta information to decode compressed * tile data in Y_UBWC_Plane. * Y_UBWC_Plane consists of Y data in compressed macro-tile format. * UBWC decoder block will use the Y_Meta_Plane data together with * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples. * * UV_Meta_Plane consists of meta information to decode compressed * tile data in UV_UBWC_Plane. * UV_UBWC_Plane consists of UV data in compressed macro-tile format. * UBWC decoder block will use UV_Meta_Plane data together with * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2 * subsampled color difference samples. * * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable * and randomly accessible. There is no dependency between tiles. * * <----- Y_Meta_Stride -----> * <-------- Width ------> * M M M M M M M M M M M M . . ^ ^ * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . Height | * M M M M M M M M M M M M . . | Meta_Y_Scanlines * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . | | * M M M M M M M M M M M M . . V | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . V * <--Compressed tile Y Stride---> * <------- Width -------> * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * . . . . . . . . . . . . . . . . V * <----- UV_Meta_Stride ----> * M M M M M M M M M M M M . . ^ * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . | * M M M M M M M M M M M M . . M_UV_Scanlines * . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * <--Compressed tile UV Stride---> * U* V* U* V* U* V* U* V* . . . . ^ * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . | * U* V* U* V* U* V* U* V* . . . . UV_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k * * * Y_Stride = align(Width * 2, 256) * UV_Stride = align(Width * 2, 256) * Y_Scanlines = align(Height, 16) * UV_Scanlines = align(Height/2, 16) * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096) * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096) * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16) * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096) * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16) * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096) * Extradata = 8k * * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size + * Y_Meta_Plane_size + UV_Meta_Plane_size * + max(Extradata, Y_Stride * 48), 4096) */ COLOR_FMT_P010_UBWC, /* Venus P010: * YUV 4:2:0 image with a plane of 10 bit Y samples followed * by an interleaved U/V plane containing 10 bit 2x2 subsampled * colour difference samples. * * <-------- Y/UV_Stride --------> * <------- Width -------> * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * U V U V U V U V U V U V . . . . ^ * U V U V U V U V U V U V . . . . | * U V U V U V U V U V U V . . . . | * U V U V U V U V U V U V . . . . UV_Scanlines * . . . . . . . . . . . . . . . . | * . . . . . . . . . . . . . . . . V * . . . . . . . . . . . . . . . . --> Buffer size alignment * * Y_Stride : Width * 2 aligned to 128 * UV_Stride : Width * 2 aligned to 128 * Y_Scanlines: Height aligned to 32 * UV_Scanlines: Height/2 aligned to 16 * Extradata: Arbitrary (software-imposed) padding * Total size = align((Y_Stride * Y_Scanlines * + UV_Stride * UV_Scanlines * + max(Extradata, Y_Stride * 8), 4096) */ COLOR_FMT_P010, }; #define COLOR_FMT_RGBA1010102_UBWC COLOR_FMT_RGBA1010102_UBWC #define COLOR_FMT_RGB565_UBWC COLOR_FMT_RGB565_UBWC #define COLOR_FMT_P010_UBWC COLOR_FMT_P010_UBWC #define COLOR_FMT_P010 COLOR_FMT_P010 /* * Function arguments: * @color_fmt * @width * Progressive: width * Interlaced: width */ static unsigned int VENUS_Y_STRIDE(int color_fmt, int width) { unsigned int stride = 0; if (!width) return 0; switch (color_fmt) { case COLOR_FMT_NV21: case COLOR_FMT_NV12: case COLOR_FMT_NV12_MVTB: case COLOR_FMT_NV12_UBWC: stride = MSM_MEDIA_ALIGN(width, 128); break; case COLOR_FMT_NV12_BPP10_UBWC: stride = MSM_MEDIA_ALIGN(width, 192); stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256); break; case COLOR_FMT_P010_UBWC: stride = MSM_MEDIA_ALIGN(width * 2, 256); break; case COLOR_FMT_P010: stride = MSM_MEDIA_ALIGN(width * 2, 128); break; } return stride; } /* * Function arguments: * @color_fmt * @width * Progressive: width * Interlaced: width */ static unsigned int VENUS_UV_STRIDE(int color_fmt, int width) { unsigned int stride = 0; if (!width) return 0; switch (color_fmt) { case COLOR_FMT_NV21: case COLOR_FMT_NV12: case COLOR_FMT_NV12_MVTB: case COLOR_FMT_NV12_UBWC: stride = MSM_MEDIA_ALIGN(width, 128); break; case COLOR_FMT_NV12_BPP10_UBWC: stride = MSM_MEDIA_ALIGN(width, 192); stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256); break; case COLOR_FMT_P010_UBWC: stride = MSM_MEDIA_ALIGN(width * 2, 256); break; case COLOR_FMT_P010: stride = MSM_MEDIA_ALIGN(width * 2, 128); break; } return stride; } /* * Function arguments: * @color_fmt * @height * Progressive: height * Interlaced: (height+1)>>1 */ static unsigned int VENUS_Y_SCANLINES(int color_fmt, int height) { unsigned int sclines = 0; if (!height) return 0; switch (color_fmt) { case COLOR_FMT_NV21: case COLOR_FMT_NV12: case COLOR_FMT_NV12_MVTB: case COLOR_FMT_NV12_UBWC: case COLOR_FMT_P010: sclines = MSM_MEDIA_ALIGN(height, 32); break; case COLOR_FMT_NV12_BPP10_UBWC: case COLOR_FMT_P010_UBWC: sclines = MSM_MEDIA_ALIGN(height, 16); break; } return sclines; } /* * Function arguments: * @color_fmt * @height * Progressive: height * Interlaced: (height+1)>>1 */ static unsigned int VENUS_UV_SCANLINES(int color_fmt, int height) { unsigned int sclines = 0; if (!height) return 0; switch (color_fmt) { case COLOR_FMT_NV21: case COLOR_FMT_NV12: case COLOR_FMT_NV12_MVTB: case COLOR_FMT_NV12_BPP10_UBWC: case COLOR_FMT_P010_UBWC: case COLOR_FMT_P010: sclines = MSM_MEDIA_ALIGN((height + 1) >> 1, 16); break; case COLOR_FMT_NV12_UBWC: sclines = MSM_MEDIA_ALIGN((height + 1) >> 1, 32); break; } return sclines; } /* * Function arguments: * @color_fmt * @width * Progressive: width * Interlaced: width */ static unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width) { int y_tile_width = 0, y_meta_stride; if (!width) return 0; switch (color_fmt) { case COLOR_FMT_NV12_UBWC: case COLOR_FMT_P010_UBWC: y_tile_width = 32; break; case COLOR_FMT_NV12_BPP10_UBWC: y_tile_width = 48; break; default: return 0; } y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width); return MSM_MEDIA_ALIGN(y_meta_stride, 64); } /* * Function arguments: * @color_fmt * @height * Progressive: height * Interlaced: (height+1)>>1 */ static unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height) { int y_tile_height = 0, y_meta_scanlines; if (!height) return 0; switch (color_fmt) { case COLOR_FMT_NV12_UBWC: y_tile_height = 8; break; case COLOR_FMT_NV12_BPP10_UBWC: case COLOR_FMT_P010_UBWC: y_tile_height = 4; break; default: return 0; } y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height); return MSM_MEDIA_ALIGN(y_meta_scanlines, 16); } /* * Function arguments: * @color_fmt * @width * Progressive: width * Interlaced: width */ static unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width) { int uv_tile_width = 0, uv_meta_stride; if (!width) return 0; switch (color_fmt) { case COLOR_FMT_NV12_UBWC: case COLOR_FMT_P010_UBWC: uv_tile_width = 16; break; case COLOR_FMT_NV12_BPP10_UBWC: uv_tile_width = 24; break; default: return 0; } uv_meta_stride = MSM_MEDIA_ROUNDUP((width+1)>>1, uv_tile_width); return MSM_MEDIA_ALIGN(uv_meta_stride, 64); } /* * Function arguments: * @color_fmt * @height * Progressive: height * Interlaced: (height+1)>>1 */ static unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height) { int uv_tile_height = 0, uv_meta_scanlines; if (!height) return 0; switch (color_fmt) { case COLOR_FMT_NV12_UBWC: uv_tile_height = 8; break; case COLOR_FMT_NV12_BPP10_UBWC: case COLOR_FMT_P010_UBWC: uv_tile_height = 4; break; default: return 0; } uv_meta_scanlines = MSM_MEDIA_ROUNDUP((height+1)>>1, uv_tile_height); return MSM_MEDIA_ALIGN(uv_meta_scanlines, 16); } static unsigned int VENUS_RGB_STRIDE(int color_fmt, int width) { unsigned int alignment = 0, bpp = 4; if (!width) return 0; switch (color_fmt) { case COLOR_FMT_RGBA8888: alignment = 128; break; case COLOR_FMT_RGB565_UBWC: alignment = 256; bpp = 2; break; case COLOR_FMT_RGBA8888_UBWC: case COLOR_FMT_RGBA1010102_UBWC: alignment = 256; break; default: return 0; } return MSM_MEDIA_ALIGN(width * bpp, alignment); } static unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height) { unsigned int alignment = 0; if (!height) return 0; switch (color_fmt) { case COLOR_FMT_RGBA8888: alignment = 32; break; case COLOR_FMT_RGBA8888_UBWC: case COLOR_FMT_RGBA1010102_UBWC: case COLOR_FMT_RGB565_UBWC: alignment = 16; break; default: return 0; } return MSM_MEDIA_ALIGN(height, alignment); } static unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width) { int rgb_meta_stride; if (!width) return 0; switch (color_fmt) { case COLOR_FMT_RGBA8888_UBWC: case COLOR_FMT_RGBA1010102_UBWC: case COLOR_FMT_RGB565_UBWC: rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, 16); return MSM_MEDIA_ALIGN(rgb_meta_stride, 64); } return 0; } static unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height) { int rgb_meta_scanlines; if (!height) return 0; switch (color_fmt) { case COLOR_FMT_RGBA8888_UBWC: case COLOR_FMT_RGBA1010102_UBWC: case COLOR_FMT_RGB565_UBWC: rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, 4); return MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16); } return 0; } #endif