{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- Provides a base class for demuxing tags at the beginning or end of a
-- stream and handles things like typefinding, querying, seeking, and
-- different modes of operation (chain-based, pull_range-based, and providing
-- downstream elements with random access if upstream supports that). The tag
-- is stripped from the output, and all offsets are adjusted for the tag
-- sizes, so that to the downstream element the stream will appear as if
-- there was no tag at all. Also, once the tag has been parsed, GstTagDemux
-- will try to determine the media type of the resulting stream and add a
-- source pad with the appropriate caps in order to facilitate auto-plugging.
-- 
-- == Deriving from GstTagDemux
-- 
-- Subclasses have to do four things:
-- 
--  * In their base init function, they must add a pad template for the sink
--    pad to the element class, describing the media type they can parse in
--    the caps of the pad template.
--  * In their class init function, they must override
--    GST_TAG_DEMUX_CLASS(demux_klass)->identify_tag with their own identify
--    function.
--  * In their class init function, they must override
--  GST_TAG_DEMUX_CLASS(demux_klass)->parse_tag with their own parse
--  function.
--  * In their class init function, they must also set
--    GST_TAG_DEMUX_CLASS(demux_klass)->min_start_size and\/or
--  GST_TAG_DEMUX_CLASS(demux_klass)->min_end_size to the minimum size required
--  for the identify function to decide whether the stream has a supported tag
--  or not. A class parsing ID3v1 tags, for example, would set min_end_size to
--  128 bytes.

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

module GI.GstTag.Objects.TagDemux
    ( 

-- * Exported types
    TagDemux(..)                            ,
    IsTagDemux                              ,
    toTagDemux                              ,
    noTagDemux                              ,


 -- * Methods
-- ** Overloaded methods #method:Overloaded methods#

#if defined(ENABLE_OVERLOADING)
    ResolveTagDemuxMethod                   ,
#endif




    ) 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.GI.Base.Signals as B.Signals
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

-- | Memory-managed wrapper type.
newtype TagDemux = TagDemux (ManagedPtr TagDemux)
    deriving (TagDemux -> TagDemux -> Bool
(TagDemux -> TagDemux -> Bool)
-> (TagDemux -> TagDemux -> Bool) -> Eq TagDemux
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TagDemux -> TagDemux -> Bool
$c/= :: TagDemux -> TagDemux -> Bool
== :: TagDemux -> TagDemux -> Bool
$c== :: TagDemux -> TagDemux -> Bool
Eq)
foreign import ccall "gst_tag_demux_get_type"
    c_gst_tag_demux_get_type :: IO GType

instance GObject TagDemux where
    gobjectType :: IO GType
gobjectType = IO GType
c_gst_tag_demux_get_type
    

-- | Convert 'TagDemux' to and from 'Data.GI.Base.GValue.GValue' with 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'.
instance B.GValue.IsGValue TagDemux where
    toGValue :: TagDemux -> IO GValue
toGValue o :: TagDemux
o = do
        GType
gtype <- IO GType
c_gst_tag_demux_get_type
        TagDemux -> (Ptr TagDemux -> IO GValue) -> IO GValue
forall a c.
(HasCallStack, ManagedPtrNewtype a) =>
a -> (Ptr a -> IO c) -> IO c
B.ManagedPtr.withManagedPtr TagDemux
o (GType
-> (GValue -> Ptr TagDemux -> IO ()) -> Ptr TagDemux -> IO GValue
forall a. GType -> (GValue -> a -> IO ()) -> a -> IO GValue
B.GValue.buildGValue GType
gtype GValue -> Ptr TagDemux -> IO ()
forall a. GObject a => GValue -> Ptr a -> IO ()
B.GValue.set_object)
        
    fromGValue :: GValue -> IO TagDemux
fromGValue gv :: GValue
gv = do
        Ptr TagDemux
ptr <- GValue -> IO (Ptr TagDemux)
forall b. GObject b => GValue -> IO (Ptr b)
B.GValue.get_object GValue
gv :: IO (Ptr TagDemux)
        (ManagedPtr TagDemux -> TagDemux) -> Ptr TagDemux -> IO TagDemux
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
B.ManagedPtr.newObject ManagedPtr TagDemux -> TagDemux
TagDemux Ptr TagDemux
ptr
        
    

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

instance O.HasParentTypes TagDemux
type instance O.ParentTypes TagDemux = '[Gst.Element.Element, Gst.Object.Object, GObject.Object.Object]

-- | Cast to `TagDemux`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toTagDemux :: (MonadIO m, IsTagDemux o) => o -> m TagDemux
toTagDemux :: o -> m TagDemux
toTagDemux = IO TagDemux -> m TagDemux
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO TagDemux -> m TagDemux)
-> (o -> IO TagDemux) -> o -> m TagDemux
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ManagedPtr TagDemux -> TagDemux) -> o -> IO TagDemux
forall o o'.
(HasCallStack, GObject o, GObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
unsafeCastTo ManagedPtr TagDemux -> TagDemux
TagDemux

-- | A convenience alias for `Nothing` :: `Maybe` `TagDemux`.
noTagDemux :: Maybe TagDemux
noTagDemux :: Maybe TagDemux
noTagDemux = Maybe TagDemux
forall a. Maybe a
Nothing

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

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

#endif

#if defined(ENABLE_OVERLOADING)
instance O.HasAttributeList TagDemux
type instance O.AttributeList TagDemux = TagDemuxAttributeList
type TagDemuxAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo)] :: [(Symbol, *)])
#endif

#if defined(ENABLE_OVERLOADING)
#endif

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

#endif