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/overlayRotator.h b/liboverlay/overlayRotator.h
index bd2fd7e..36fe581 100644
--- a/liboverlay/overlayRotator.h
+++ b/liboverlay/overlayRotator.h
@@ -43,22 +43,14 @@
public:
enum { TYPE_MDP, TYPE_MDSS };
virtual ~Rotator();
- virtual bool init() = 0;
- virtual bool close() = 0;
virtual void setSource(const utils::Whf& wfh) = 0;
virtual void setFlags(const utils::eMdpFlags& flags) = 0;
virtual void setTransform(const utils::eTransform& rot) = 0;
- virtual void setRotatorUsed(const bool& rotUsed) = 0;
virtual bool commit() = 0;
- virtual void setRotations(uint32_t r) = 0;
- virtual void setSrcFB() = 0;
virtual void setDownscale(int ds) = 0;
virtual int getDstMemId() const = 0;
virtual uint32_t getDstOffset() const = 0;
virtual uint32_t getDstFormat() const = 0;
- virtual void setEnable() = 0;
- virtual void setDisable() = 0;
- virtual bool enabled () const = 0;
virtual uint32_t getSessId() const = 0;
virtual bool queueBuffer(int fd, uint32_t offset) = 0;
virtual void dump() const = 0;
@@ -116,22 +108,14 @@
class MdpRot : public Rotator {
public:
virtual ~MdpRot();
- virtual bool init();
- virtual bool close();
virtual void setSource(const utils::Whf& wfh);
virtual void setFlags(const utils::eMdpFlags& flags);
virtual void setTransform(const utils::eTransform& rot);
- virtual void setRotatorUsed(const bool& rotUsed);
virtual bool commit();
- virtual void setRotations(uint32_t r);
- virtual void setSrcFB();
virtual void setDownscale(int ds);
virtual int getDstMemId() const;
virtual uint32_t getDstOffset() const;
virtual uint32_t getDstFormat() const;
- virtual void setEnable();
- virtual void setDisable();
- virtual bool enabled () const;
virtual uint32_t getSessId() const;
virtual bool queueBuffer(int fd, uint32_t offset);
virtual void dump() const;
@@ -139,6 +123,10 @@
private:
explicit MdpRot();
+ bool init();
+ bool close();
+ void setRotations(uint32_t r);
+ bool enabled () const;
/* remap rot buffers */
bool remap(uint32_t numbufs);
bool open_i(uint32_t numbufs, uint32_t bufsz);
@@ -178,22 +166,14 @@
class MdssRot : public Rotator {
public:
virtual ~MdssRot();
- virtual bool init();
- virtual bool close();
virtual void setSource(const utils::Whf& wfh);
virtual void setFlags(const utils::eMdpFlags& flags);
virtual void setTransform(const utils::eTransform& rot);
- virtual void setRotatorUsed(const bool& rotUsed);
virtual bool commit();
- virtual void setRotations(uint32_t r);
- virtual void setSrcFB();
virtual void setDownscale(int ds);
virtual int getDstMemId() const;
virtual uint32_t getDstOffset() const;
virtual uint32_t getDstFormat() const;
- virtual void setEnable();
- virtual void setDisable();
- virtual bool enabled () const;
virtual uint32_t getSessId() const;
virtual bool queueBuffer(int fd, uint32_t offset);
virtual void dump() const;
@@ -201,6 +181,10 @@
private:
explicit MdssRot();
+ bool init();
+ bool close();
+ void setRotations(uint32_t r);
+ bool enabled () const;
/* remap rot buffers */
bool remap(uint32_t numbufs);
bool open_i(uint32_t numbufs, uint32_t bufsz);
@@ -228,6 +212,28 @@
friend Rotator* Rotator::getRotator();
};
+// Holder of rotator objects. Manages lifetimes
+class RotMgr {
+public:
+ //Maximum sessions based on VG pipes, since rotator is used only for videos.
+ //Even though we can have 4 mixer stages, that much may be unnecessary.
+ enum { MAX_ROT_SESS = 3 };
+ RotMgr();
+ ~RotMgr();
+ void configBegin();
+ void configDone();
+ overlay::Rotator *getNext();
+ void clear(); //Removes all instances
+ /* Returns rot dump.
+ * Expects a NULL terminated buffer of big enough size.
+ */
+ void getDump(char *buf, size_t len);
+private:
+ overlay::Rotator *mRot[MAX_ROT_SESS];
+ int mUseCount;
+};
+
+
} // overlay
#endif // OVERlAY_ROTATOR_H