liboverlay: Refactor, bug-fixes, upgrade.
* Fix memory leak during copying pipe objects.
* Remove unused / unnecessary code.
* setMemoryId API is merged with queueBuffer.
* setParameter API is setTransform now.
* Rotator upgraded to:
--Allow different rotator hardware types.
--Remove dependency on MDP code.
--Allocate memory only during first playback,
close when the associated pipe is closed.
* Have single commit implementation.
* Include new format types.
* Remove WAIT and CHANNEL enums and usage. Replace BypassPipe with
GenericPipe. Client expected to set alignments and parameters.
Add transform combination enums.
* Allow APIs to be called in any order. Do transform calcs in commit.
Move ext type setter and getter functions.
* Add calculations for 180 transform.
* Add secure session support in rotator
* Implement all rotations in terms of H flip, V flip and 90 rotation.
Change-Id: I34a9a2a0f1255b3467a0abbaa254d0b584e901ce
diff --git a/liboverlay/overlayUtils.h b/liboverlay/overlayUtils.h
index 7d964a9..f82fb88 100644
--- a/liboverlay/overlayUtils.h
+++ b/liboverlay/overlayUtils.h
@@ -35,14 +35,14 @@
#include <fcntl.h> // open, O_RDWR, etc
#include <hardware/hardware.h>
#include <hardware/gralloc.h> // buffer_handle_t
-#include <linux/msm_mdp.h> // MDP_OV_PLAY_NOWAIT etc ...
+#include <linux/msm_mdp.h> // flags
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <utils/Log.h>
-
+#include "gralloc_priv.h" //for interlace
/*
*
* Collection of utilities functions/structs/enums etc...
@@ -70,12 +70,6 @@
namespace utils {
struct Whf;
struct Dim;
-template <class T>
- inline void even_out(T& x) { if (x & 0x0001) --x; }
-
-inline uint32_t getBit(uint32_t x, uint32_t mask) {
- return (x & mask);
-}
inline uint32_t setBit(uint32_t x, uint32_t mask) {
return (x | mask);
@@ -89,7 +83,7 @@
* and assignment operator private
*
* Usage:
-* * class SomeClass : utils::NoCopy {...};
+* class SomeClass : utils::NoCopy {...};
*/
class NoCopy {
protected:
@@ -147,7 +141,14 @@
BARRIER_PORT = 2 };
inline uint32_t format3D(uint32_t x) { return x & 0xFF000; }
-inline uint32_t colorFormat(uint32_t x) { return x & 0xFFF; }
+inline uint32_t colorFormat(uint32_t fmt) {
+ /*TODO enable this block only if format has interlace / 3D info in top bits.
+ if(fmt & INTERLACE_MASK) {
+ fmt = fmt ^ HAL_PIXEL_FORMAT_INTERLACE;
+ }
+ fmt = fmt & 0xFFF;*/
+ return fmt;
+}
inline uint32_t format3DOutput(uint32_t x) {
return (x & 0xF000) >> SHIFT_OUT_3D; }
inline uint32_t format3DInput(uint32_t x) { return x & 0xF0000; }
@@ -160,12 +161,15 @@
bool send3DInfoPacket (uint32_t fmt);
bool enableBarrier (uint32_t orientation);
uint32_t getS3DFormat(uint32_t fmt);
+
template <int CHAN>
- bool getPositionS3D(const Whf& whf, Dim& out);
+bool getPositionS3D(const Whf& whf, Dim& out);
+
template <int CHAN>
- bool getCropS3D(const Dim& in, Dim& out, uint32_t fmt);
+bool getCropS3D(const Dim& in, Dim& out, uint32_t fmt);
+
template <class Type>
- void swapWidthHeight(Type& width, Type& height);
+void swapWidthHeight(Type& width, Type& height);
struct Dim {
Dim () : x(0), y(0),
@@ -193,13 +197,6 @@
return !operator==(d);
}
- void even_out() {
- utils::even_out(x);
- utils::even_out(y);
- utils::even_out(w);
- utils::even_out(h);
- }
-
void dump() const;
uint32_t x;
uint32_t y;
@@ -227,26 +224,12 @@
void dump() const;
uint32_t w;
uint32_t h;
- // FIXME need to be int32_t ?
uint32_t format;
uint32_t size;
};
enum { MAX_PATH_LEN = 256 };
-enum eParams {
- OVERLAY_DITHER,
- OVERLAY_TRANSFORM,
- OVERLAY_TRANSFORM_UI
-};
-
-struct Params{
- Params(eParams p, int v) : param(p), value(v) {}
- eParams param;
- int value;
-};
-
-
/**
* Rotator flags: not to be confused with orientation flags.
* Ususally, you want to open the rotator to make sure it is
@@ -267,19 +250,6 @@
ROT_FLAG_ENABLED = 1 // needed in rot
};
-/* Used for rotator open.
- * FIXME that is default, might be configs */
-enum { ROT_NUM_BUFS = 2 };
-
-/* Wait/No wait for waiting for vsync
- * WAIT - wait for vsync, ignore fb (no need to compose w/ fb)
- * NO_WAIT - do not wait for vsync and return immediatly since
- * we need to run composition code */
-enum eWait {
- WAIT,
- NO_WAIT
-};
-
/* The values for is_fg flag for control alpha and transp
* IS_FG_OFF means is_fg = 0
* IS_FG_SET means is_fg = 1
@@ -298,15 +268,17 @@
OV_MDP_FLAGS_NONE = 0,
OV_MDP_PIPE_SHARE = MDP_OV_PIPE_SHARE,
OV_MDP_DEINTERLACE = MDP_DEINTERLACE,
- OV_MDP_PLAY_NOWAIT = MDP_OV_PLAY_NOWAIT,
- OV_MDP_SECURE_OVERLAY_SESSION = MDP_SECURE_OVERLAY_SESSION
+ OV_MDP_PLAY_NOWAIT = MDP_OV_PLAY_NOWAIT, //deprecated
+ OV_MDP_SECURE_OVERLAY_SESSION = MDP_SECURE_OVERLAY_SESSION,
+ OV_MDP_SOURCE_ROTATED_90 = MDP_SOURCE_ROTATED_90,
+ OV_MDP_MEMORY_ID_TYPE_FB = MDP_MEMORY_ID_TYPE_FB,
};
enum eOverlayPipeType {
OV_PIPE_TYPE_NULL,
OV_PIPE_TYPE_BYPASS,
OV_PIPE_TYPE_GENERIC,
- OV_PIPE_TYPE_HDMI,
+ OV_PIPE_TYPE_VIDEO_EXT,
OV_PIPE_TYPE_M3D_EXTERNAL,
OV_PIPE_TYPE_M3D_PRIMARY,
OV_PIPE_TYPE_RGB,
@@ -327,24 +299,12 @@
OV_MDP_PIPE_VG
};
-/* Corresponds to pipes in eDest */
-enum eChannel {
- CHANNEL_0,
- CHANNEL_1,
- CHANNEL_2
-};
-
// Max pipes via overlay (VG0, VG1, RGB1)
enum { MAX_PIPES = 3 };
/* Used to identify destination channels and
* also 3D channels e.g. when in 3D mode with 2
* pipes opened and it is used in get crop/pos 3D
- *
- * PLEASE NOTE : DO NOT USE eDest FOR ARRAYS
- * i.e. args[OV_PIPE1] since it is a BIT MASK
- * use CHANNELS enum instead. Each OV_PIPEX is
- * not specific to a display (primary/external).
* */
enum eDest {
OV_PIPE0 = 1 << 0,
@@ -356,65 +316,51 @@
/* values for copybit_set_parameter(OVERLAY_TRANSFORM) */
enum eTransform {
/* No rot */
- OVERLAY_TRANSFORM_0 = 0x0,
- /* flip source image horizontally */
- OVERLAY_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H,
- /* flip source image vertically */
- OVERLAY_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V,
- /* rotate source image 90 degrees */
- OVERLAY_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90,
+ OVERLAY_TRANSFORM_0 = 0x0,
+ /* flip source image horizontally 0x1 */
+ OVERLAY_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H,
+ /* flip source image vertically 0x2 */
+ OVERLAY_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V,
/* rotate source image 180 degrees
* It is basically bit-or-ed H | V == 0x3 */
- OVERLAY_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180,
+ OVERLAY_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180,
+ /* rotate source image 90 degrees 0x4 */
+ OVERLAY_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90,
+ /* rotate source image 90 degrees and flip horizontally 0x5 */
+ OVERLAY_TRANSFORM_ROT_90_FLIP_H = HAL_TRANSFORM_ROT_90 |
+ HAL_TRANSFORM_FLIP_H,
+ /* rotate source image 90 degrees and flip vertically 0x6 */
+ OVERLAY_TRANSFORM_ROT_90_FLIP_V = HAL_TRANSFORM_ROT_90 |
+ HAL_TRANSFORM_FLIP_V,
/* rotate source image 270 degrees
* Basically 180 | 90 == 0x7 */
- OVERLAY_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270,
+ OVERLAY_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270,
/* rotate invalid like in Transform.h */
- OVERLAY_TRANSFORM_INV = 0x80
-};
-
-/* offset and fd are play info */
-struct PlayInfo {
- PlayInfo() : fd(-1), offset(0) {}
- PlayInfo(int _fd, uint32_t _offset) :
- fd(_fd), offset(_offset) {}
- bool operator==(const PlayInfo& p) {
- return (fd == p.fd && offset == p.offset);
- }
- int fd;
- uint32_t offset;
+ OVERLAY_TRANSFORM_INV = 0x80
};
// Used to consolidate pipe params
struct PipeArgs {
PipeArgs() : mdpFlags(OV_MDP_FLAGS_NONE),
- orientation(OVERLAY_TRANSFORM_0),
- wait(NO_WAIT),
zorder(Z_SYSTEM_ALLOC),
isFg(IS_FG_OFF),
rotFlags(ROT_FLAG_DISABLED){
}
- PipeArgs(eMdpFlags f, eTransform o,
- Whf _whf, eWait w,
+ PipeArgs(eMdpFlags f, Whf _whf,
eZorder z, eIsFg fg, eRotFlags r) :
mdpFlags(f),
- orientation(o),
whf(_whf),
- wait(w),
zorder(z),
isFg(fg),
rotFlags(r) {
}
- eMdpFlags mdpFlags; // for mdp_overlay flags PIPE_SHARE, NO_WAIT, etc
- eTransform orientation; // FIXME docs
+ eMdpFlags mdpFlags; // for mdp_overlay flags
Whf whf;
- eWait wait; // flags WAIT/NO_WAIT
eZorder zorder; // stage number
eIsFg isFg; // control alpha & transp
eRotFlags rotFlags;
- PlayInfo play;
};
enum eOverlayState{
@@ -464,21 +410,13 @@
WFD = 2
};
+//TODO Make this a part of some appropriate class
static int sExtType = HDMI; //HDMI or WFD
-
//Set by client as HDMI/WFD
-static inline void setExtType(const int& type) {
- if(type != HDMI || type != WFD) {
- ALOGE("%s: Unrecognized type %d", __func__, type);
- return;
- }
- sExtType = type;
-}
-
+void setExtType(const int& type);
//Return External panel type set by client.
-static inline int getExtType() {
- return sExtType;
-}
+int getExtType();
+
//Gets the FB number for the external type.
//As of now, HDMI always has fb1, WFD could use fb1 or fb2
@@ -503,6 +441,7 @@
}
// number of rgb pipes bufs (max)
+
// 2 for rgb0/1 double bufs
enum { RGB_PIPE_NUM_BUFS = 2 };
@@ -524,52 +463,17 @@
* rotation is 90, 180 etc
* It returns MDP related enum/define that match rot+flip*/
int getMdpOrient(eTransform rotation);
-uint32_t getSize(const Whf& whf);
-uint32_t getSizeByMdp(const Whf& whf);
const char* getFormatString(uint32_t format);
const char* getStateString(eOverlayState state);
-inline int setWait(eWait wait, int flags) {
- return (wait == WAIT) ?
- flags &= ~MDP_OV_PLAY_NOWAIT :
- flags |= MDP_OV_PLAY_NOWAIT;
-}
-/* possible overlay formats libhardware/include/hardware/hardware.h */
-enum eFormat {
- OVERLAY_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888,
- OVERLAY_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565,
- OVERLAY_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888,
- OVERLAY_FORMAT_YCbYCr_422_I = 0x14,
- OVERLAY_FORMAT_CbYCrY_422_I = 0x16,
- OVERLAY_FORMAT_DEFAULT = 99 // The actual color format is
- // determined by the overlay
-};
-
// Cannot use HW_OVERLAY_MAGNIFICATION_LIMIT, since at the time
// of integration, HW_OVERLAY_MAGNIFICATION_LIMIT was a define
enum { HW_OV_MAGNIFICATION_LIMIT = 20,
HW_OV_MINIFICATION_LIMIT = 8
};
-inline bool rotated(int orie) {
- return (orie == OVERLAY_TRANSFORM_ROT_90 ||
- orie == OVERLAY_TRANSFORM_ROT_270);
-}
-
-/* used by crop funcs in order to
- * normalizes the crop values to be all even */
-void normalizeCrop(uint32_t& xy, uint32_t& wh);
-
template <class T>
- inline void memset0(T& t) { ::memset(&t, 0, sizeof(T)); }
-
-template <class ROT, class MDP>
- inline void swapOVRotWidthHeight(ROT& rot, MDP& mdp)
- {
- mdp.swapSrcWH();
- mdp.swapSrcRectWH();
- rot.swapDstWH();
- }
+inline void memset0(T& t) { ::memset(&t, 0, sizeof(T)); }
template <class T> inline void swap ( T& a, T& b )
{
@@ -587,35 +491,6 @@
return a ? ((value + (a-1)) & ~(a-1)) : value;
}
-
-template <class MDP>
-inline utils::Dim getSrcRectDim(const MDP& ov) {
- return utils::Dim(ov.src_rect.x,
- ov.src_rect.y,
- ov.src_rect.w,
- ov.src_rect.h);
-}
-
-template <class MDP>
-inline utils::Whf getSrcWhf(const MDP& ov) {
- return utils::Whf(ov.src.width,
- ov.src.height,
- ov.src.format);
-}
-template <class MDP>
-inline void setSrcRectDim(MDP& ov, const utils::Dim& d) {
- ov.src_rect.x = d.x;
- ov.src_rect.y = d.y;
- ov.src_rect.w = d.w;
- ov.src_rect.h = d.h;
-}
-template <class MDP>
-inline void setSrcWhf(MDP& ov, const utils::Whf& whf) {
- ov.src.width = whf.w;
- ov.src.height = whf.h;
- ov.src.format = whf.format;
-}
-
enum eRotOutFmt {
ROT_OUT_FMT_DEFAULT,
ROT_OUT_FMT_Y_CRCB_H2V2
@@ -691,21 +566,30 @@
"MDP_RGB_565",
"MDP_XRGB_8888",
"MDP_Y_CBCR_H2V2",
+ "MDP_Y_CBCR_H2V2_ADRENO",
"MDP_ARGB_8888",
"MDP_RGB_888",
"MDP_Y_CRCB_H2V2",
"MDP_YCRYCB_H2V1",
"MDP_Y_CRCB_H2V1",
"MDP_Y_CBCR_H2V1",
+ "MDP_Y_CRCB_H1V2",
+ "MDP_Y_CBCR_H1V2",
"MDP_RGBA_8888",
"MDP_BGRA_8888",
"MDP_RGBX_8888",
"MDP_Y_CRCB_H2V2_TILE",
"MDP_Y_CBCR_H2V2_TILE",
"MDP_Y_CR_CB_H2V2",
+ "MDP_Y_CR_CB_GH2V2",
"MDP_Y_CB_CR_H2V2",
- "MDP_IMGTYPE_LIMIT",
+ "MDP_Y_CRCB_H1V1",
+ "MDP_Y_CBCR_H1V1",
+ "MDP_YCRCB_H1V1",
+ "MDP_YCBCR_H1V1",
"MDP_BGR_565",
+ "MDP_IMGTYPE_LIMIT",
+ "MDP_RGB_BORDERFILL",
"MDP_FB_FORMAT",
"MDP_IMGTYPE_LIMIT2"
};
@@ -746,15 +630,6 @@
return "BAD_STATE";
}
-inline uint32_t getSizeByMdp(const Whf& whf) {
- Whf _whf(whf);
- int fmt = getMdpFormat(whf.format);
- OVASSERT(-1 != fmt, "getSizeByMdp error in format %d",
- whf.format);
- _whf.format = fmt;
- return getSize(_whf);
-}
-
inline void Whf::dump() const {
ALOGE("== Dump WHF w=%d h=%d f=%d s=%d start/end ==",
w, h, format, size);
@@ -766,21 +641,21 @@
inline int getMdpOrient(eTransform rotation) {
ALOGE_IF(DEBUG_OVERLAY, "%s: rot=%d", __FUNCTION__, rotation);
- switch(int(rotation))
+ switch(rotation)
{
case OVERLAY_TRANSFORM_0 : return 0;
- case HAL_TRANSFORM_FLIP_V: return MDP_FLIP_UD;
- case HAL_TRANSFORM_FLIP_H: return MDP_FLIP_LR;
- case HAL_TRANSFORM_ROT_90: return MDP_ROT_90;
- case HAL_TRANSFORM_ROT_90|HAL_TRANSFORM_FLIP_V:
- return MDP_ROT_90|MDP_FLIP_LR;
- case HAL_TRANSFORM_ROT_90|HAL_TRANSFORM_FLIP_H:
- return MDP_ROT_90|MDP_FLIP_UD;
- case HAL_TRANSFORM_ROT_180: return MDP_ROT_180;
- case HAL_TRANSFORM_ROT_270: return MDP_ROT_270;
+ case OVERLAY_TRANSFORM_FLIP_V: return MDP_FLIP_UD;
+ case OVERLAY_TRANSFORM_FLIP_H: return MDP_FLIP_LR;
+ case OVERLAY_TRANSFORM_ROT_90: return MDP_ROT_90;
+ case OVERLAY_TRANSFORM_ROT_90_FLIP_V:
+ return MDP_ROT_90 | MDP_FLIP_UD;
+ case OVERLAY_TRANSFORM_ROT_90_FLIP_H:
+ return MDP_ROT_90 | MDP_FLIP_LR;
+ case OVERLAY_TRANSFORM_ROT_180: return MDP_ROT_180;
+ case OVERLAY_TRANSFORM_ROT_270: return MDP_ROT_270;
default:
- ALOGE("%s: invalid rotation value (value = 0x%x",
- __FUNCTION__, rotation);
+ ALOGE("%s: invalid rotation value (value = 0x%x",
+ __FUNCTION__, rotation);
}
return -1;
}
@@ -801,28 +676,11 @@
return -1;
}
-template<>
-struct RotOutFmt<ROT_OUT_FMT_DEFAULT>
-{
- static inline int fmt(uint32_t format) {
- return getRotOutFmt(format);
- }
-};
-
-template<>
-struct RotOutFmt<ROT_OUT_FMT_Y_CRCB_H2V2>
-{
- static inline int fmt(uint32_t) {
- return MDP_Y_CRCB_H2V2;
- }
-};
inline uint32_t getColorFormat(uint32_t format)
{
- //XXX: Earlier this used to mask the format
- //to check for interlaced or 3D. Just return
- //the format now
- return format;
+ return (format == HAL_PIXEL_FORMAT_YV12) ?
+ format : colorFormat(format);
}
// FB0
@@ -937,43 +795,6 @@
s, mFBWidth, mFBHeight, mFBbpp, mFBystride);
}
-inline void setSrcRectDim(const overlay::utils::Dim d,
- mdp_overlay& ov) {
- ov.src_rect.x = d.x;
- ov.src_rect.y = d.y;
- ov.src_rect.w = d.w;
- ov.src_rect.h = d.h;
-}
-
-inline void setDstRectDim(const overlay::utils::Dim d,
- mdp_overlay& ov) {
- ov.dst_rect.x = d.x;
- ov.dst_rect.y = d.y;
- ov.dst_rect.w = d.w;
- ov.dst_rect.h = d.h;
-}
-
-inline overlay::utils::Whf getSrcWhf(const mdp_overlay& ov) {
- return overlay::utils::Whf(ov.src.width,
- ov.src.height,
- ov.src.format);
-}
-
-inline overlay::utils::Dim getSrcRectDim(const mdp_overlay& ov) {
- return overlay::utils::Dim(ov.src_rect.x,
- ov.src_rect.y,
- ov.src_rect.w,
- ov.src_rect.h);
-}
-
-inline overlay::utils::Dim getDstRectDim(const mdp_overlay& ov) {
- return overlay::utils::Dim(ov.dst_rect.x,
- ov.dst_rect.y,
- ov.dst_rect.w,
- ov.dst_rect.h);
-}
-
-
} // namespace utils ends
//--------------------Class Res stuff (namespace overlay only) -----------
@@ -981,7 +802,7 @@
class Res {
public:
// /dev/graphics/fb%u
- static const char* const devTemplate;
+ static const char* const fbPath;
// /dev/msm_rotator
static const char* const rotPath;
// /sys/class/graphics/fb1/format_3d
@@ -1060,7 +881,9 @@
mPath[0] = 0;
}
-inline OvFD::~OvFD() { /* no op in the meantime */ }
+inline OvFD::~OvFD() {
+ //no op since copy() can be used to share fd, in 3d cases.
+}
inline bool OvFD::open(const char* const dev, int flags)
{