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

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.
-}

module GI.GstVideo.Structs.VideoTimeCodeMeta
    ( 

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


 -- * Methods
-- ** getInfo #method:getInfo#
    videoTimeCodeMetaGetInfo                ,




 -- * Properties
-- ** meta #attr:meta#
    getVideoTimeCodeMetaMeta                ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    videoTimeCodeMeta_meta                  ,
#endif


-- ** tc #attr:tc#
    getVideoTimeCodeMetaTc                  ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    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.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
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 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

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


noVideoTimeCodeMeta :: Maybe VideoTimeCodeMeta
noVideoTimeCodeMeta = Nothing

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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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


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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
#endif

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

instance (info ~ ResolveVideoTimeCodeMetaMethod t VideoTimeCodeMeta, O.MethodInfo info VideoTimeCodeMeta p) => O.IsLabelProxy t (VideoTimeCodeMeta -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveVideoTimeCodeMetaMethod t VideoTimeCodeMeta, O.MethodInfo info VideoTimeCodeMeta p) => O.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

#endif