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

Extra buffer metadata describing the GstVideoTimeCode of the frame.

Each frame is assumed to have its own timecode, i.e. they are not
automatically incremented\/interpolated.

/Since: 1.10/
-}

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

module GI.GstVideo.Structs.VideoTimeCodeMeta
    (

-- * Exported types
    VideoTimeCodeMeta(..)                   ,
    newZeroVideoTimeCodeMeta                ,
    noVideoTimeCodeMeta                     ,


 -- * Methods
-- ** getInfo #method:getInfo#

    videoTimeCodeMetaGetInfo                ,




 -- * Properties
-- ** meta #attr:meta#
{- | parent 'GI.Gst.Structs.Meta.Meta'
-}
    getVideoTimeCodeMetaMeta                ,
#if ENABLE_OVERLOADING
    videoTimeCodeMeta_meta                  ,
#endif


-- ** tc #attr:tc#
{- | the GstVideoTimeCode to attach
-}
    getVideoTimeCodeMetaTc                  ,
#if ENABLE_OVERLOADING
    videoTimeCodeMeta_tc                    ,
#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.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.Gst.Structs.Meta as Gst.Meta
import qualified GI.Gst.Structs.MetaInfo as Gst.MetaInfo
import {-# SOURCE #-} qualified GI.GstVideo.Structs.VideoTimeCode as GstVideo.VideoTimeCode

-- | Memory-managed wrapper type.
newtype VideoTimeCodeMeta = VideoTimeCodeMeta (ManagedPtr VideoTimeCodeMeta)
instance WrappedPtr VideoTimeCodeMeta where
    wrappedPtrCalloc = callocBytes 64
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 64 >=> wrapPtr VideoTimeCodeMeta)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `VideoTimeCodeMeta` struct initialized to zero.
newZeroVideoTimeCodeMeta :: MonadIO m => m VideoTimeCodeMeta
newZeroVideoTimeCodeMeta = liftIO $ wrappedPtrCalloc >>= wrapPtr VideoTimeCodeMeta

instance tag ~ 'AttrSet => Constructible VideoTimeCodeMeta tag where
    new _ attrs = do
        o <- newZeroVideoTimeCodeMeta
        GI.Attributes.set o attrs
        return o


-- | A convenience alias for `Nothing` :: `Maybe` `VideoTimeCodeMeta`.
noVideoTimeCodeMeta :: Maybe VideoTimeCodeMeta
noVideoTimeCodeMeta = Nothing

{- |
Get the value of the “@meta@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' videoTimeCodeMeta #meta
@
-}
getVideoTimeCodeMetaMeta :: MonadIO m => VideoTimeCodeMeta -> m Gst.Meta.Meta
getVideoTimeCodeMetaMeta s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 0 :: (Ptr Gst.Meta.Meta)
    val' <- (newPtr Gst.Meta.Meta) val
    return val'

#if ENABLE_OVERLOADING
data VideoTimeCodeMetaMetaFieldInfo
instance AttrInfo VideoTimeCodeMetaMetaFieldInfo where
    type AttrAllowedOps VideoTimeCodeMetaMetaFieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint VideoTimeCodeMetaMetaFieldInfo = (~) (Ptr Gst.Meta.Meta)
    type AttrBaseTypeConstraint VideoTimeCodeMetaMetaFieldInfo = (~) VideoTimeCodeMeta
    type AttrGetType VideoTimeCodeMetaMetaFieldInfo = Gst.Meta.Meta
    type AttrLabel VideoTimeCodeMetaMetaFieldInfo = "meta"
    type AttrOrigin VideoTimeCodeMetaMetaFieldInfo = VideoTimeCodeMeta
    attrGet _ = getVideoTimeCodeMetaMeta
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

videoTimeCodeMeta_meta :: AttrLabelProxy "meta"
videoTimeCodeMeta_meta = AttrLabelProxy

#endif


{- |
Get the value of the “@tc@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' videoTimeCodeMeta #tc
@
-}
getVideoTimeCodeMetaTc :: MonadIO m => VideoTimeCodeMeta -> m GstVideo.VideoTimeCode.VideoTimeCode
getVideoTimeCodeMetaTc s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 16 :: (Ptr GstVideo.VideoTimeCode.VideoTimeCode)
    val' <- (newBoxed GstVideo.VideoTimeCode.VideoTimeCode) val
    return val'

#if ENABLE_OVERLOADING
data VideoTimeCodeMetaTcFieldInfo
instance AttrInfo VideoTimeCodeMetaTcFieldInfo where
    type AttrAllowedOps VideoTimeCodeMetaTcFieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint VideoTimeCodeMetaTcFieldInfo = (~) (Ptr GstVideo.VideoTimeCode.VideoTimeCode)
    type AttrBaseTypeConstraint VideoTimeCodeMetaTcFieldInfo = (~) VideoTimeCodeMeta
    type AttrGetType VideoTimeCodeMetaTcFieldInfo = GstVideo.VideoTimeCode.VideoTimeCode
    type AttrLabel VideoTimeCodeMetaTcFieldInfo = "tc"
    type AttrOrigin VideoTimeCodeMetaTcFieldInfo = VideoTimeCodeMeta
    attrGet _ = getVideoTimeCodeMetaTc
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

videoTimeCodeMeta_tc :: AttrLabelProxy "tc"
videoTimeCodeMeta_tc = AttrLabelProxy

#endif



#if ENABLE_OVERLOADING
instance O.HasAttributeList VideoTimeCodeMeta
type instance O.AttributeList VideoTimeCodeMeta = VideoTimeCodeMetaAttributeList
type VideoTimeCodeMetaAttributeList = ('[ '("meta", VideoTimeCodeMetaMetaFieldInfo), '("tc", VideoTimeCodeMetaTcFieldInfo)] :: [(Symbol, *)])
#endif

-- method VideoTimeCodeMeta::get_info
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "MetaInfo"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_video_time_code_meta_get_info" gst_video_time_code_meta_get_info ::
    IO (Ptr Gst.MetaInfo.MetaInfo)

{- |
/No description available in the introspection data./
-}
videoTimeCodeMetaGetInfo ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Gst.MetaInfo.MetaInfo
videoTimeCodeMetaGetInfo  = liftIO $ do
    result <- gst_video_time_code_meta_get_info
    checkUnexpectedReturnNULL "videoTimeCodeMetaGetInfo" result
    result' <- (newPtr Gst.MetaInfo.MetaInfo) result
    return result'

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type family ResolveVideoTimeCodeMetaMethod (t :: Symbol) (o :: *) :: * where
    ResolveVideoTimeCodeMetaMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveVideoTimeCodeMetaMethod t VideoTimeCodeMeta, O.MethodInfo info VideoTimeCodeMeta p) => OL.IsLabel t (VideoTimeCodeMeta -> 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