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