Home | History | Annotate | Download | only in include
      1 /*
      2 // Copyright(c)2014 IntelCorporation
      3 //
      4 // LicensedundertheApacheLicense,Version2.0(the"License");
      5 // youmaynotusethisfileexceptincompliancewiththeLicense.
      6 // YoumayobtainacopyoftheLicenseat
      7 //
      8 // http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unlessrequiredbyapplicablelaworagreedtoinwriting,software
     11 // distributedundertheLicenseisdistributedonan"ASIS"BASIS,
     12 // WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
     13 // SeetheLicenseforthespecificlanguagegoverningpermissionsand
     14 // limitationsundertheLicense.
     15 */
     16 #ifndef VIRTUAL_DEVICE_H
     17 #define VIRTUAL_DEVICE_H
     18 
     19 #include <IDisplayDevice.h>
     20 #include <SimpleThread.h>
     21 #include <IVideoPayloadManager.h>
     22 #include <utils/Condition.h>
     23 #include <utils/Mutex.h>
     24 #include <utils/Vector.h>
     25 #include <utils/List.h>
     26 #ifdef INTEL_WIDI
     27 #include "IFrameServer.h"
     28 #endif
     29 #include <va/va.h>
     30 #include <va/va_vpp.h>
     31 
     32 namespace android {
     33 namespace intel {
     34 
     35 class Hwcomposer;
     36 class DisplayPlaneManager;
     37 class IVideoPayloadManager;
     38 class SoftVsyncObserver;
     39 
     40 #ifdef INTEL_WIDI
     41 class VirtualDevice : public IDisplayDevice, public BnFrameServer {
     42 #else
     43 class VirtualDevice : public IDisplayDevice, public RefBase{
     44 #endif
     45 protected:
     46     class VAMappedHandle;
     47     class VAMappedHandleObject;
     48     struct CachedBuffer : public android::RefBase {
     49         CachedBuffer(BufferManager *mgr, buffer_handle_t handle);
     50         ~CachedBuffer();
     51         BufferManager *manager;
     52         BufferMapper *mapper;
     53         VAMappedHandle *vaMappedHandle;
     54         buffer_handle_t cachedKhandle;
     55     };
     56     struct HeldDecoderBuffer : public android::RefBase {
     57         HeldDecoderBuffer(const sp<VirtualDevice>& vd, const android::sp<CachedBuffer>& cachedBuffer);
     58         virtual ~HeldDecoderBuffer();
     59         android::sp<VirtualDevice> vd;
     60         android::sp<CachedBuffer> cachedBuffer;
     61     };
     62 #ifdef INTEL_WIDI
     63     struct Configuration {
     64         sp<IFrameTypeChangeListener> typeChangeListener;
     65         sp<IFrameListener> frameListener;
     66         FrameProcessingPolicy policy;
     67         bool frameServerActive;
     68         bool extendedModeEnabled;
     69         bool forceNotifyFrameType;
     70         bool forceNotifyBufferInfo;
     71     };
     72 #endif
     73     class BufferList {
     74     public:
     75         BufferList(VirtualDevice& vd, const char* name, uint32_t limit, uint32_t format, uint32_t usage);
     76         buffer_handle_t get(uint32_t width, uint32_t height, sp<RefBase>* heldBuffer);
     77         void clear();
     78     private:
     79         struct HeldBuffer;
     80         VirtualDevice& mVd;
     81         const char* mName;
     82         android::List<buffer_handle_t> mAvailableBuffers;
     83         const uint32_t mLimit;
     84         const uint32_t mFormat;
     85         const uint32_t mUsage;
     86         uint32_t mBuffersToCreate;
     87         uint32_t mWidth;
     88         uint32_t mHeight;
     89     };
     90     struct Task;
     91     struct RenderTask;
     92     struct ComposeTask;
     93     struct EnableVspTask;
     94     struct DisableVspTask;
     95     struct BlitTask;
     96     struct FrameTypeChangedTask;
     97     struct BufferInfoChangedTask;
     98     struct OnFrameReadyTask;
     99 
    100     Mutex mConfigLock;
    101 #ifdef INTEL_WIDI
    102     Configuration mCurrentConfig;
    103     Configuration mNextConfig;
    104 #endif
    105     ssize_t mRgbLayer;
    106     ssize_t mYuvLayer;
    107     bool mProtectedMode;
    108 
    109     buffer_handle_t mExtLastKhandle;
    110     int64_t mExtLastTimestamp;
    111 
    112     int64_t mRenderTimestamp;
    113 
    114     Mutex mTaskLock; // for task queue and buffer lists
    115     BufferList mCscBuffers;
    116     BufferList mRgbUpscaleBuffers;
    117     DECLARE_THREAD(WidiBlitThread, VirtualDevice);
    118     Condition mRequestQueued;
    119     Condition mRequestDequeued;
    120     Vector< sp<Task> > mTasks;
    121 
    122     // fence info
    123     int mSyncTimelineFd;
    124     unsigned mNextSyncPoint;
    125     bool mExpectAcquireFences;
    126 #ifdef INTEL_WIDI
    127     FrameInfo mLastInputFrameInfo;
    128     FrameInfo mLastOutputFrameInfo;
    129 #endif
    130     int32_t mVideoFramerate;
    131 
    132     android::KeyedVector<buffer_handle_t, android::sp<CachedBuffer> > mMappedBufferCache;
    133     android::Mutex mHeldBuffersLock;
    134     android::KeyedVector<buffer_handle_t, android::sp<android::RefBase> > mHeldBuffers;
    135 
    136     // VSP
    137     bool mVspInUse;
    138     bool mVspEnabled;
    139     uint32_t mVspWidth;
    140     uint32_t mVspHeight;
    141     VADisplay va_dpy;
    142     VAConfigID va_config;
    143     VAContextID va_context;
    144     VASurfaceID va_blank_yuv_in;
    145     VASurfaceID va_blank_rgb_in;
    146     android::KeyedVector<buffer_handle_t, android::sp<VAMappedHandleObject> > mVaMapCache;
    147 
    148     bool mVspUpscale;
    149     bool mDebugVspClear;
    150     bool mDebugVspDump;
    151     uint32_t mDebugCounter;
    152 
    153 private:
    154     android::sp<CachedBuffer> getMappedBuffer(buffer_handle_t handle);
    155 
    156     bool sendToWidi(hwc_display_contents_1_t *display);
    157     bool queueCompose(hwc_display_contents_1_t *display);
    158     bool queueColorConvert(hwc_display_contents_1_t *display);
    159 #ifdef INTEL_WIDI
    160     bool handleExtendedMode(hwc_display_contents_1_t *display);
    161 
    162     void queueFrameTypeInfo(const FrameInfo& inputFrameInfo);
    163     void queueBufferInfo(const FrameInfo& outputFrameInfo);
    164 #endif
    165     void colorSwap(buffer_handle_t src, buffer_handle_t dest, uint32_t pixelCount);
    166     void vspPrepare(uint32_t width, uint32_t height);
    167     void vspEnable(uint32_t width, uint32_t height);
    168     void vspDisable();
    169     void vspCompose(VASurfaceID videoIn, VASurfaceID rgbIn, VASurfaceID videoOut,
    170                     const VARectangle* surface_region, const VARectangle* output_region);
    171 
    172     bool getFrameOfSize(uint32_t width, uint32_t height, const IVideoPayloadManager::MetaData& metadata, IVideoPayloadManager::Buffer& info);
    173     void setMaxDecodeResolution(uint32_t width, uint32_t height);
    174 
    175 public:
    176     VirtualDevice(Hwcomposer& hwc);
    177     virtual ~VirtualDevice();
    178     bool isFrameServerActive() const;
    179 
    180 public:
    181     virtual bool prePrepare(hwc_display_contents_1_t *display);
    182     virtual bool prepare(hwc_display_contents_1_t *display);
    183     virtual bool commit(hwc_display_contents_1_t *display,
    184                           IDisplayContext *context);
    185 
    186     virtual bool vsyncControl(bool enabled);
    187     virtual bool blank(bool blank);
    188     virtual bool getDisplaySize(int *width, int *height);
    189     virtual bool getDisplayConfigs(uint32_t *configs,
    190                                        size_t *numConfigs);
    191     virtual bool getDisplayAttributes(uint32_t config,
    192                                           const uint32_t *attributes,
    193                                           int32_t *values);
    194     virtual bool compositionComplete();
    195     virtual bool initialize();
    196     virtual void deinitialize();
    197     virtual bool isConnected() const;
    198     virtual const char* getName() const;
    199     virtual int getType() const;
    200     virtual void onVsync(int64_t timestamp);
    201     virtual void dump(Dump& d);
    202     virtual uint32_t getFpsDivider();
    203 #ifdef INTEL_WIDI
    204     // IFrameServer methods
    205     virtual android::status_t start(sp<IFrameTypeChangeListener> frameTypeChangeListener);
    206     virtual android::status_t stop(bool isConnected);
    207 	/* TODO: 64-bit - this handle of size 32-bit is a problem for 64-bit */
    208     virtual android::status_t notifyBufferReturned(int handle);
    209     virtual android::status_t setResolution(const FrameProcessingPolicy& policy, android::sp<IFrameListener> listener);
    210 #endif
    211     virtual bool setPowerMode(int mode);
    212     virtual int  getActiveConfig();
    213     virtual bool setActiveConfig(int index);
    214 
    215 protected:
    216     bool mInitialized;
    217     Hwcomposer& mHwc;
    218     IVideoPayloadManager *mPayloadManager;
    219     SoftVsyncObserver *mVsyncObserver;
    220     uint32_t mOrigContentWidth;
    221     uint32_t mOrigContentHeight;
    222     bool mFirstVideoFrame;
    223     bool mLastConnectionStatus;
    224     uint32_t mCachedBufferCapcity;
    225     uint32_t mDecWidth;
    226     uint32_t mDecHeight;
    227     bool mIsForceCloneMode;
    228     uint32_t mFpsDivider;
    229 };
    230 
    231 }
    232 }
    233 
    234 #endif /* VIRTUAL_DEVICE_H */
    235