hwc/overlay: Video on 4k2k external, 4k2k rotation.
-Add support for Video via overlay on 4k2k external panel.
-Add support for rotating videos on 4k2k panels. We use
pre-rotation in hwc to rotate a video into a single buffer,
irrespective of panel size. Then this buffer is fed to MDP.
Rotator objects are managed by the new RotMgr.
-Cleaup mdpcomp and overlay.
Change-Id: Ifb08534747e8e18b6c58dd8a3e1a9947409100f1
diff --git a/liboverlay/pipes/overlayGenPipe.cpp b/liboverlay/pipes/overlayGenPipe.cpp
index 486cfda..9108acd 100644
--- a/liboverlay/pipes/overlayGenPipe.cpp
+++ b/liboverlay/pipes/overlayGenPipe.cpp
@@ -34,7 +34,7 @@
namespace overlay {
GenericPipe::GenericPipe(int dpy) : mFbNum(dpy), mRot(0), mRotUsed(false),
- mRotDownscaleOpt(false), pipeState(CLOSED) {
+ mRotDownscaleOpt(false), mPreRotated(false), pipeState(CLOSED) {
init();
}
@@ -47,6 +47,7 @@
ALOGE_IF(DEBUG_OVERLAY, "GenericPipe init");
mRotUsed = false;
mRotDownscaleOpt = false;
+ mPreRotated = false;
if(mFbNum)
mFbNum = Overlay::getInstance()->getExtFbNum();
@@ -87,54 +88,31 @@
return ret;
}
-bool GenericPipe::setSource(
- const utils::PipeArgs& args)
-{
- utils::PipeArgs newargs(args);
- //Interlace video handling.
- if(newargs.whf.format & INTERLACE_MASK) {
- setMdpFlags(newargs.mdpFlags, utils::OV_MDP_DEINTERLACE);
- }
- utils::Whf whf(newargs.whf);
- //Extract HAL format from lower bytes. Deinterlace if interlaced.
- whf.format = utils::getColorFormat(whf.format);
- //Get MDP equivalent of HAL format.
- whf.format = utils::getMdpFormat(whf.format);
- newargs.whf = whf;
-
+void GenericPipe::setSource(const utils::PipeArgs& args) {
//Cache if user wants 0-rotation
- mRotUsed = newargs.rotFlags & utils::ROT_0_ENABLED;
- mRotDownscaleOpt = newargs.rotFlags & utils::ROT_DOWNSCALE_ENABLED;
-
- mRot->setSource(newargs.whf);
- mRot->setFlags(newargs.mdpFlags);
- return mCtrlData.ctrl.setSource(newargs);
+ mRotUsed = args.rotFlags & utils::ROT_0_ENABLED;
+ mRotDownscaleOpt = args.rotFlags & utils::ROT_DOWNSCALE_ENABLED;
+ mPreRotated = args.rotFlags & utils::ROT_PREROTATED;
+ if(mPreRotated) mRotUsed = false;
+ mRot->setSource(args.whf);
+ mRot->setFlags(args.mdpFlags);
+ mCtrlData.ctrl.setSource(args);
}
-bool GenericPipe::setCrop(
- const overlay::utils::Dim& d) {
- return mCtrlData.ctrl.setCrop(d);
+void GenericPipe::setCrop(const overlay::utils::Dim& d) {
+ mCtrlData.ctrl.setCrop(d);
}
-bool GenericPipe::setTransform(
- const utils::eTransform& orient)
-{
+void GenericPipe::setTransform(const utils::eTransform& orient) {
//Rotation could be enabled by user for zero-rot or the layer could have
//some transform. Mark rotation enabled in either case.
- mRotUsed |= (orient != utils::OVERLAY_TRANSFORM_0);
+ mRotUsed |= ((orient & utils::OVERLAY_TRANSFORM_ROT_90) && !mPreRotated);
mRot->setTransform(orient);
-
- return mCtrlData.ctrl.setTransform(orient);
+ mCtrlData.ctrl.setTransform(orient);
}
-bool GenericPipe::setPosition(const utils::Dim& d)
-{
- return mCtrlData.ctrl.setPosition(d);
-}
-
-void GenericPipe::setRotatorUsed(const bool& rotUsed) {
- mRot->setRotatorUsed(rotUsed);
- mCtrlData.ctrl.setRotatorUsed(rotUsed);
+void GenericPipe::setPosition(const utils::Dim& d) {
+ mCtrlData.ctrl.setPosition(d);
}
bool GenericPipe::commit() {
@@ -142,20 +120,16 @@
int downscale_factor = utils::ROT_DS_NONE;
if(mRotDownscaleOpt) {
- /* Can go ahead with calculation of downscale_factor since
- * we consider area when calculating it */
- downscale_factor = mCtrlData.ctrl.getDownscalefactor();
- if(downscale_factor)
- mRotUsed = true;
+ ovutils::Dim src(mCtrlData.ctrl.getCrop());
+ ovutils::Dim dst(mCtrlData.ctrl.getPosition());
+ downscale_factor = ovutils::getDownscaleFactor(
+ src.w, src.h, dst.w, dst.h);
+ mRotUsed |= (downscale_factor && !mPreRotated);
}
- setRotatorUsed(mRotUsed);
- mCtrlData.ctrl.doTransform();
-
- mCtrlData.ctrl.doDownscale(downscale_factor);
- mRot->setDownscale(downscale_factor);
if(mRotUsed) {
+ mRot->setDownscale(downscale_factor);
//If wanting to use rotator, start it.
if(!mRot->commit()) {
ALOGE("GenPipe Rotator commit failed");
@@ -170,9 +144,10 @@
* The output format of the rotator might be different depending on
* whether fastyuv mode is enabled in the rotator.
*/
- mCtrlData.ctrl.updateSrcformat(mRot->getDstFormat());
+ mCtrlData.ctrl.updateSrcFormat(mRot->getDstFormat());
}
+ mCtrlData.ctrl.setDownscale(downscale_factor);
ret = mCtrlData.ctrl.commit();
//If mdp commit fails, flush rotator session, memory, fd and create a hollow
@@ -220,11 +195,6 @@
return mCtrlData.ctrl.getFd();
}
-utils::ScreenInfo GenericPipe::getScreenInfo() const
-{
- return mCtrlData.ctrl.getScreenInfo();
-}
-
utils::Dim GenericPipe::getCrop() const
{
return mCtrlData.ctrl.getCrop();
diff --git a/liboverlay/pipes/overlayGenPipe.h b/liboverlay/pipes/overlayGenPipe.h
index 1d1be25..c71f8d2 100644
--- a/liboverlay/pipes/overlayGenPipe.h
+++ b/liboverlay/pipes/overlayGenPipe.h
@@ -43,48 +43,34 @@
explicit GenericPipe(int dpy);
/* dtor */
~GenericPipe();
- /* CTRL/DATA init. Not owning rotator, will not init it */
bool init();
- /* CTRL/DATA close. Not owning rotator, will not close it */
bool close();
-
/* Control APIs */
/* set source using whf, orient and wait flag */
- bool setSource(const utils::PipeArgs& args);
+ void setSource(const utils::PipeArgs& args);
/* set crop a.k.a the region of interest */
- bool setCrop(const utils::Dim& d);
+ void setCrop(const utils::Dim& d);
/* set orientation*/
- bool setTransform(const utils::eTransform& param);
+ void setTransform(const utils::eTransform& param);
/* set mdp posision using dim */
- bool setPosition(const utils::Dim& dim);
+ void setPosition(const utils::Dim& dim);
/* commit changes to the overlay "set"*/
bool commit();
-
/* Data APIs */
/* queue buffer to the overlay */
bool queueBuffer(int fd, uint32_t offset);
-
/* return cached startup args */
const utils::PipeArgs& getArgs() const;
-
- /* retrieve screen info */
- utils::ScreenInfo getScreenInfo() const;
-
/* retrieve cached crop data */
utils::Dim getCrop() const;
-
/* is closed */
bool isClosed() const;
-
/* is open */
bool isOpen() const;
-
/* return Ctrl fd. Used for S3D */
int getCtrlFd() const;
-
/* dump the state of the object */
void dump() const;
-
/* Return the dump in the specified buffer */
void getDump(char *buf, size_t len);
@@ -92,23 +78,17 @@
/* set Closed pipe */
bool setClosed();
- /* Set whether rotator can be used */
- void setRotatorUsed(const bool& rotUsed);
-
int mFbNum;
-
/* Ctrl/Data aggregator */
CtrlData mCtrlData;
-
Rotator* mRot;
-
//Whether rotator is used for 0-rot or otherwise
bool mRotUsed;
-
//Whether we will do downscale opt. This is just a request. If the frame is
//not a candidate, we might not do it.
bool mRotDownscaleOpt;
-
+ //Whether the source is prerotated.
+ bool mPreRotated;
/* Pipe open or closed */
enum ePipeState {
CLOSED,