{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)

Provides useful functions and a base class for video filters.

The videofilter will by default enable QoS on the parent GstBaseTransform
to implement frame dropping.
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.GstVideo.Objects.VideoFilter
    (

-- * Exported types
    VideoFilter(..)                         ,
    IsVideoFilter                           ,
    toVideoFilter                           ,
    noVideoFilter                           ,


    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import qualified GI.GObject.Objects.Object as GObject.Object
import qualified GI.Gst.Objects.Element as Gst.Element
import qualified GI.Gst.Objects.Object as Gst.Object
import qualified GI.GstBase.Objects.BaseTransform as GstBase.BaseTransform

-- | Memory-managed wrapper type.
newtype VideoFilter = VideoFilter (ManagedPtr VideoFilter)
foreign import ccall "gst_video_filter_get_type"
    c_gst_video_filter_get_type :: IO GType

instance GObject VideoFilter where
    gobjectType = c_gst_video_filter_get_type


-- | Type class for types which can be safely cast to `VideoFilter`, for instance with `toVideoFilter`.
class (GObject o, O.IsDescendantOf VideoFilter o) => IsVideoFilter o
instance (GObject o, O.IsDescendantOf VideoFilter o) => IsVideoFilter o

instance O.HasParentTypes VideoFilter
type instance O.ParentTypes VideoFilter = '[GstBase.BaseTransform.BaseTransform, Gst.Element.Element, Gst.Object.Object, GObject.Object.Object]

-- | Cast to `VideoFilter`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toVideoFilter :: (MonadIO m, IsVideoFilter o) => o -> m VideoFilter
toVideoFilter = liftIO . unsafeCastTo VideoFilter

-- | A convenience alias for `Nothing` :: `Maybe` `VideoFilter`.
noVideoFilter :: Maybe VideoFilter
noVideoFilter = Nothing

#if ENABLE_OVERLOADING
type family ResolveVideoFilterMethod (t :: Symbol) (o :: *) :: * where
    ResolveVideoFilterMethod "abortState" o = Gst.Element.ElementAbortStateMethodInfo
    ResolveVideoFilterMethod "addControlBinding" o = Gst.Object.ObjectAddControlBindingMethodInfo
    ResolveVideoFilterMethod "addPad" o = Gst.Element.ElementAddPadMethodInfo
    ResolveVideoFilterMethod "addPropertyDeepNotifyWatch" o = Gst.Element.ElementAddPropertyDeepNotifyWatchMethodInfo
    ResolveVideoFilterMethod "addPropertyNotifyWatch" o = Gst.Element.ElementAddPropertyNotifyWatchMethodInfo
    ResolveVideoFilterMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveVideoFilterMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveVideoFilterMethod "callAsync" o = Gst.Element.ElementCallAsyncMethodInfo
    ResolveVideoFilterMethod "changeState" o = Gst.Element.ElementChangeStateMethodInfo
    ResolveVideoFilterMethod "continueState" o = Gst.Element.ElementContinueStateMethodInfo
    ResolveVideoFilterMethod "createAllPads" o = Gst.Element.ElementCreateAllPadsMethodInfo
    ResolveVideoFilterMethod "defaultError" o = Gst.Object.ObjectDefaultErrorMethodInfo
    ResolveVideoFilterMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveVideoFilterMethod "foreachPad" o = Gst.Element.ElementForeachPadMethodInfo
    ResolveVideoFilterMethod "foreachSinkPad" o = Gst.Element.ElementForeachSinkPadMethodInfo
    ResolveVideoFilterMethod "foreachSrcPad" o = Gst.Element.ElementForeachSrcPadMethodInfo
    ResolveVideoFilterMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveVideoFilterMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveVideoFilterMethod "hasActiveControlBindings" o = Gst.Object.ObjectHasActiveControlBindingsMethodInfo
    ResolveVideoFilterMethod "hasAncestor" o = Gst.Object.ObjectHasAncestorMethodInfo
    ResolveVideoFilterMethod "hasAsAncestor" o = Gst.Object.ObjectHasAsAncestorMethodInfo
    ResolveVideoFilterMethod "hasAsParent" o = Gst.Object.ObjectHasAsParentMethodInfo
    ResolveVideoFilterMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveVideoFilterMethod "isInPlace" o = GstBase.BaseTransform.BaseTransformIsInPlaceMethodInfo
    ResolveVideoFilterMethod "isLockedState" o = Gst.Element.ElementIsLockedStateMethodInfo
    ResolveVideoFilterMethod "isPassthrough" o = GstBase.BaseTransform.BaseTransformIsPassthroughMethodInfo
    ResolveVideoFilterMethod "isQosEnabled" o = GstBase.BaseTransform.BaseTransformIsQosEnabledMethodInfo
    ResolveVideoFilterMethod "iteratePads" o = Gst.Element.ElementIteratePadsMethodInfo
    ResolveVideoFilterMethod "iterateSinkPads" o = Gst.Element.ElementIterateSinkPadsMethodInfo
    ResolveVideoFilterMethod "iterateSrcPads" o = Gst.Element.ElementIterateSrcPadsMethodInfo
    ResolveVideoFilterMethod "link" o = Gst.Element.ElementLinkMethodInfo
    ResolveVideoFilterMethod "linkFiltered" o = Gst.Element.ElementLinkFilteredMethodInfo
    ResolveVideoFilterMethod "linkPads" o = Gst.Element.ElementLinkPadsMethodInfo
    ResolveVideoFilterMethod "linkPadsFiltered" o = Gst.Element.ElementLinkPadsFilteredMethodInfo
    ResolveVideoFilterMethod "linkPadsFull" o = Gst.Element.ElementLinkPadsFullMethodInfo
    ResolveVideoFilterMethod "lostState" o = Gst.Element.ElementLostStateMethodInfo
    ResolveVideoFilterMethod "messageFull" o = Gst.Element.ElementMessageFullMethodInfo
    ResolveVideoFilterMethod "messageFullWithDetails" o = Gst.Element.ElementMessageFullWithDetailsMethodInfo
    ResolveVideoFilterMethod "noMorePads" o = Gst.Element.ElementNoMorePadsMethodInfo
    ResolveVideoFilterMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveVideoFilterMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveVideoFilterMethod "postMessage" o = Gst.Element.ElementPostMessageMethodInfo
    ResolveVideoFilterMethod "provideClock" o = Gst.Element.ElementProvideClockMethodInfo
    ResolveVideoFilterMethod "query" o = Gst.Element.ElementQueryMethodInfo
    ResolveVideoFilterMethod "queryConvert" o = Gst.Element.ElementQueryConvertMethodInfo
    ResolveVideoFilterMethod "queryDuration" o = Gst.Element.ElementQueryDurationMethodInfo
    ResolveVideoFilterMethod "queryPosition" o = Gst.Element.ElementQueryPositionMethodInfo
    ResolveVideoFilterMethod "reconfigureSink" o = GstBase.BaseTransform.BaseTransformReconfigureSinkMethodInfo
    ResolveVideoFilterMethod "reconfigureSrc" o = GstBase.BaseTransform.BaseTransformReconfigureSrcMethodInfo
    ResolveVideoFilterMethod "ref" o = Gst.Object.ObjectRefMethodInfo
    ResolveVideoFilterMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveVideoFilterMethod "releaseRequestPad" o = Gst.Element.ElementReleaseRequestPadMethodInfo
    ResolveVideoFilterMethod "removeControlBinding" o = Gst.Object.ObjectRemoveControlBindingMethodInfo
    ResolveVideoFilterMethod "removePad" o = Gst.Element.ElementRemovePadMethodInfo
    ResolveVideoFilterMethod "removePropertyNotifyWatch" o = Gst.Element.ElementRemovePropertyNotifyWatchMethodInfo
    ResolveVideoFilterMethod "requestPad" o = Gst.Element.ElementRequestPadMethodInfo
    ResolveVideoFilterMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveVideoFilterMethod "seek" o = Gst.Element.ElementSeekMethodInfo
    ResolveVideoFilterMethod "seekSimple" o = Gst.Element.ElementSeekSimpleMethodInfo
    ResolveVideoFilterMethod "sendEvent" o = Gst.Element.ElementSendEventMethodInfo
    ResolveVideoFilterMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveVideoFilterMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveVideoFilterMethod "suggestNextSync" o = Gst.Object.ObjectSuggestNextSyncMethodInfo
    ResolveVideoFilterMethod "syncStateWithParent" o = Gst.Element.ElementSyncStateWithParentMethodInfo
    ResolveVideoFilterMethod "syncValues" o = Gst.Object.ObjectSyncValuesMethodInfo
    ResolveVideoFilterMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveVideoFilterMethod "unlink" o = Gst.Element.ElementUnlinkMethodInfo
    ResolveVideoFilterMethod "unlinkPads" o = Gst.Element.ElementUnlinkPadsMethodInfo
    ResolveVideoFilterMethod "unparent" o = Gst.Object.ObjectUnparentMethodInfo
    ResolveVideoFilterMethod "unref" o = Gst.Object.ObjectUnrefMethodInfo
    ResolveVideoFilterMethod "updateQos" o = GstBase.BaseTransform.BaseTransformUpdateQosMethodInfo
    ResolveVideoFilterMethod "updateSrcCaps" o = GstBase.BaseTransform.BaseTransformUpdateSrcCapsMethodInfo
    ResolveVideoFilterMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveVideoFilterMethod "getAllocator" o = GstBase.BaseTransform.BaseTransformGetAllocatorMethodInfo
    ResolveVideoFilterMethod "getBaseTime" o = Gst.Element.ElementGetBaseTimeMethodInfo
    ResolveVideoFilterMethod "getBufferPool" o = GstBase.BaseTransform.BaseTransformGetBufferPoolMethodInfo
    ResolveVideoFilterMethod "getBus" o = Gst.Element.ElementGetBusMethodInfo
    ResolveVideoFilterMethod "getClock" o = Gst.Element.ElementGetClockMethodInfo
    ResolveVideoFilterMethod "getCompatiblePad" o = Gst.Element.ElementGetCompatiblePadMethodInfo
    ResolveVideoFilterMethod "getCompatiblePadTemplate" o = Gst.Element.ElementGetCompatiblePadTemplateMethodInfo
    ResolveVideoFilterMethod "getContext" o = Gst.Element.ElementGetContextMethodInfo
    ResolveVideoFilterMethod "getContextUnlocked" o = Gst.Element.ElementGetContextUnlockedMethodInfo
    ResolveVideoFilterMethod "getContexts" o = Gst.Element.ElementGetContextsMethodInfo
    ResolveVideoFilterMethod "getControlBinding" o = Gst.Object.ObjectGetControlBindingMethodInfo
    ResolveVideoFilterMethod "getControlRate" o = Gst.Object.ObjectGetControlRateMethodInfo
    ResolveVideoFilterMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveVideoFilterMethod "getFactory" o = Gst.Element.ElementGetFactoryMethodInfo
    ResolveVideoFilterMethod "getGValueArray" o = Gst.Object.ObjectGetGValueArrayMethodInfo
    ResolveVideoFilterMethod "getMetadata" o = Gst.Element.ElementGetMetadataMethodInfo
    ResolveVideoFilterMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo
    ResolveVideoFilterMethod "getPadTemplate" o = Gst.Element.ElementGetPadTemplateMethodInfo
    ResolveVideoFilterMethod "getPadTemplateList" o = Gst.Element.ElementGetPadTemplateListMethodInfo
    ResolveVideoFilterMethod "getParent" o = Gst.Object.ObjectGetParentMethodInfo
    ResolveVideoFilterMethod "getPathString" o = Gst.Object.ObjectGetPathStringMethodInfo
    ResolveVideoFilterMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveVideoFilterMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveVideoFilterMethod "getRequestPad" o = Gst.Element.ElementGetRequestPadMethodInfo
    ResolveVideoFilterMethod "getStartTime" o = Gst.Element.ElementGetStartTimeMethodInfo
    ResolveVideoFilterMethod "getState" o = Gst.Element.ElementGetStateMethodInfo
    ResolveVideoFilterMethod "getStaticPad" o = Gst.Element.ElementGetStaticPadMethodInfo
    ResolveVideoFilterMethod "getValue" o = Gst.Object.ObjectGetValueMethodInfo
    ResolveVideoFilterMethod "setBaseTime" o = Gst.Element.ElementSetBaseTimeMethodInfo
    ResolveVideoFilterMethod "setBus" o = Gst.Element.ElementSetBusMethodInfo
    ResolveVideoFilterMethod "setClock" o = Gst.Element.ElementSetClockMethodInfo
    ResolveVideoFilterMethod "setContext" o = Gst.Element.ElementSetContextMethodInfo
    ResolveVideoFilterMethod "setControlBindingDisabled" o = Gst.Object.ObjectSetControlBindingDisabledMethodInfo
    ResolveVideoFilterMethod "setControlBindingsDisabled" o = Gst.Object.ObjectSetControlBindingsDisabledMethodInfo
    ResolveVideoFilterMethod "setControlRate" o = Gst.Object.ObjectSetControlRateMethodInfo
    ResolveVideoFilterMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveVideoFilterMethod "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    ResolveVideoFilterMethod "setGapAware" o = GstBase.BaseTransform.BaseTransformSetGapAwareMethodInfo
    ResolveVideoFilterMethod "setInPlace" o = GstBase.BaseTransform.BaseTransformSetInPlaceMethodInfo
    ResolveVideoFilterMethod "setLockedState" o = Gst.Element.ElementSetLockedStateMethodInfo
    ResolveVideoFilterMethod "setName" o = Gst.Object.ObjectSetNameMethodInfo
    ResolveVideoFilterMethod "setParent" o = Gst.Object.ObjectSetParentMethodInfo
    ResolveVideoFilterMethod "setPassthrough" o = GstBase.BaseTransform.BaseTransformSetPassthroughMethodInfo
    ResolveVideoFilterMethod "setPreferPassthrough" o = GstBase.BaseTransform.BaseTransformSetPreferPassthroughMethodInfo
    ResolveVideoFilterMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveVideoFilterMethod "setQosEnabled" o = GstBase.BaseTransform.BaseTransformSetQosEnabledMethodInfo
    ResolveVideoFilterMethod "setStartTime" o = Gst.Element.ElementSetStartTimeMethodInfo
    ResolveVideoFilterMethod "setState" o = Gst.Element.ElementSetStateMethodInfo
    ResolveVideoFilterMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveVideoFilterMethod t VideoFilter, O.MethodInfo info VideoFilter p) => OL.IsLabel t (VideoFilter -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

#endif

#if ENABLE_OVERLOADING
instance O.HasAttributeList VideoFilter
type instance O.AttributeList VideoFilter = VideoFilterAttributeList
type VideoFilterAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("qos", GstBase.BaseTransform.BaseTransformQosPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type instance O.SignalList VideoFilter = VideoFilterSignalList
type VideoFilterSignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("noMorePads", Gst.Element.ElementNoMorePadsSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo), '("padAdded", Gst.Element.ElementPadAddedSignalInfo), '("padRemoved", Gst.Element.ElementPadRemovedSignalInfo)] :: [(Symbol, *)])

#endif