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

This helper structure holds the relevant values for tracking the region of
interest in a media file, called a segment.

The structure can be used for two purposes:

  * performing seeks (handling seek events)
  * tracking playback regions (handling newsegment events)

The segment is usually configured by the application with a seek event which
is propagated upstream and eventually handled by an element that performs the seek.

The configured segment is then propagated back downstream with a newsegment event.
This information is then used to clip media to the segment boundaries.

A segment structure is initialized with 'GI.Gst.Structs.Segment.segmentInit', which takes a 'GI.Gst.Enums.Format'
that will be used as the format of the segment values. The segment will be configured
with a start value of 0 and a stop\/duration of -1, which is undefined. The default
rate and applied_rate is 1.0.

The public duration field contains the duration of the segment. When using
the segment for seeking, the start and time members should normally be left
to their default 0 value. The stop position is left to -1 unless explicitly
configured to a different value after a seek event.

The current position in the segment should be set by changing the position
member in the structure.

For elements that perform seeks, the current segment should be updated with the
'GI.Gst.Structs.Segment.segmentDoSeek' and the values from the seek event. This method will update
all the segment fields. The position field will contain the new playback position.
If the start_type was different from GST_SEEK_TYPE_NONE, playback continues from
the position position, possibly with updated flags or rate.

For elements that want to use 'GI.Gst.Structs.Segment.Segment' to track the playback region,
update the segment fields with the information from the newsegment event.
The 'GI.Gst.Structs.Segment.segmentClip' method can be used to check and clip
the media data to the segment boundaries.

For elements that want to synchronize to the pipeline clock, 'GI.Gst.Structs.Segment.segmentToRunningTime'
can be used to convert a timestamp to a value that can be used to synchronize
to the clock. This function takes into account the base as well as
any rate or applied_rate conversions.

For elements that need to perform operations on media data in stream_time,
'GI.Gst.Structs.Segment.segmentToStreamTime' can be used to convert a timestamp and the segment
info to stream time (which is always between 0 and the duration of the stream).
-}

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

module GI.Gst.Structs.Segment
    (

-- * Exported types
    Segment(..)                             ,
    newZeroSegment                          ,
    noSegment                               ,


 -- * Methods
-- ** clip #method:clip#

#if ENABLE_OVERLOADING
    SegmentClipMethodInfo                   ,
#endif
    segmentClip                             ,


-- ** copy #method:copy#

#if ENABLE_OVERLOADING
    SegmentCopyMethodInfo                   ,
#endif
    segmentCopy                             ,


-- ** copyInto #method:copyInto#

#if ENABLE_OVERLOADING
    SegmentCopyIntoMethodInfo               ,
#endif
    segmentCopyInto                         ,


-- ** doSeek #method:doSeek#

#if ENABLE_OVERLOADING
    SegmentDoSeekMethodInfo                 ,
#endif
    segmentDoSeek                           ,


-- ** free #method:free#

#if ENABLE_OVERLOADING
    SegmentFreeMethodInfo                   ,
#endif
    segmentFree                             ,


-- ** init #method:init#

#if ENABLE_OVERLOADING
    SegmentInitMethodInfo                   ,
#endif
    segmentInit                             ,


-- ** isEqual #method:isEqual#

#if ENABLE_OVERLOADING
    SegmentIsEqualMethodInfo                ,
#endif
    segmentIsEqual                          ,


-- ** new #method:new#

    segmentNew                              ,


-- ** offsetRunningTime #method:offsetRunningTime#

#if ENABLE_OVERLOADING
    SegmentOffsetRunningTimeMethodInfo      ,
#endif
    segmentOffsetRunningTime                ,


-- ** positionFromRunningTime #method:positionFromRunningTime#

#if ENABLE_OVERLOADING
    SegmentPositionFromRunningTimeMethodInfo,
#endif
    segmentPositionFromRunningTime          ,


-- ** positionFromRunningTimeFull #method:positionFromRunningTimeFull#

#if ENABLE_OVERLOADING
    SegmentPositionFromRunningTimeFullMethodInfo,
#endif
    segmentPositionFromRunningTimeFull      ,


-- ** positionFromStreamTime #method:positionFromStreamTime#

#if ENABLE_OVERLOADING
    SegmentPositionFromStreamTimeMethodInfo ,
#endif
    segmentPositionFromStreamTime           ,


-- ** positionFromStreamTimeFull #method:positionFromStreamTimeFull#

#if ENABLE_OVERLOADING
    SegmentPositionFromStreamTimeFullMethodInfo,
#endif
    segmentPositionFromStreamTimeFull       ,


-- ** setRunningTime #method:setRunningTime#

#if ENABLE_OVERLOADING
    SegmentSetRunningTimeMethodInfo         ,
#endif
    segmentSetRunningTime                   ,


-- ** toPosition #method:toPosition#

#if ENABLE_OVERLOADING
    SegmentToPositionMethodInfo             ,
#endif
    segmentToPosition                       ,


-- ** toRunningTime #method:toRunningTime#

#if ENABLE_OVERLOADING
    SegmentToRunningTimeMethodInfo          ,
#endif
    segmentToRunningTime                    ,


-- ** toRunningTimeFull #method:toRunningTimeFull#

#if ENABLE_OVERLOADING
    SegmentToRunningTimeFullMethodInfo      ,
#endif
    segmentToRunningTimeFull                ,


-- ** toStreamTime #method:toStreamTime#

#if ENABLE_OVERLOADING
    SegmentToStreamTimeMethodInfo           ,
#endif
    segmentToStreamTime                     ,


-- ** toStreamTimeFull #method:toStreamTimeFull#

#if ENABLE_OVERLOADING
    SegmentToStreamTimeFullMethodInfo       ,
#endif
    segmentToStreamTimeFull                 ,




 -- * Properties
-- ** appliedRate #attr:appliedRate#
{- | the already applied rate to the segment
-}
    getSegmentAppliedRate                   ,
#if ENABLE_OVERLOADING
    segment_appliedRate                     ,
#endif
    setSegmentAppliedRate                   ,


-- ** base #attr:base#
{- | the running time (plus elapsed time, see offset) of the segment start
-}
    getSegmentBase                          ,
#if ENABLE_OVERLOADING
    segment_base                            ,
#endif
    setSegmentBase                          ,


-- ** duration #attr:duration#
{- | the duration of the stream
-}
    getSegmentDuration                      ,
#if ENABLE_OVERLOADING
    segment_duration                        ,
#endif
    setSegmentDuration                      ,


-- ** flags #attr:flags#
{- | flags for this segment
-}
    getSegmentFlags                         ,
#if ENABLE_OVERLOADING
    segment_flags                           ,
#endif
    setSegmentFlags                         ,


-- ** format #attr:format#
{- | the format of the segment values
-}
    getSegmentFormat                        ,
#if ENABLE_OVERLOADING
    segment_format                          ,
#endif
    setSegmentFormat                        ,


-- ** offset #attr:offset#
{- | the amount (in buffer timestamps) that has already been elapsed in
    the segment
-}
    getSegmentOffset                        ,
#if ENABLE_OVERLOADING
    segment_offset                          ,
#endif
    setSegmentOffset                        ,


-- ** position #attr:position#
{- | the buffer timestamp position in the segment (used internally by
    elements such as sources, demuxers or parsers to track progress)
-}
    getSegmentPosition                      ,
#if ENABLE_OVERLOADING
    segment_position                        ,
#endif
    setSegmentPosition                      ,


-- ** rate #attr:rate#
{- | the playback rate of the segment
-}
    getSegmentRate                          ,
#if ENABLE_OVERLOADING
    segment_rate                            ,
#endif
    setSegmentRate                          ,


-- ** start #attr:start#
{- | the start of the segment in buffer timestamp time (PTS)
-}
    getSegmentStart                         ,
#if ENABLE_OVERLOADING
    segment_start                           ,
#endif
    setSegmentStart                         ,


-- ** stop #attr:stop#
{- | the stop of the segment in buffer timestamp time (PTS)
-}
    getSegmentStop                          ,
#if ENABLE_OVERLOADING
    segment_stop                            ,
#endif
    setSegmentStop                          ,


-- ** time #attr:time#
{- | the stream time of the segment start
-}
    getSegmentTime                          ,
#if ENABLE_OVERLOADING
    segment_time                            ,
#endif
    setSegmentTime                          ,




    ) 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 {-# SOURCE #-} qualified GI.Gst.Enums as Gst.Enums
import {-# SOURCE #-} qualified GI.Gst.Flags as Gst.Flags

-- | Memory-managed wrapper type.
newtype Segment = Segment (ManagedPtr Segment)
foreign import ccall "gst_segment_get_type" c_gst_segment_get_type ::
    IO GType

instance BoxedObject Segment where
    boxedType _ = c_gst_segment_get_type

-- | Construct a `Segment` struct initialized to zero.
newZeroSegment :: MonadIO m => m Segment
newZeroSegment = liftIO $ callocBoxedBytes 120 >>= wrapBoxed Segment

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


-- | A convenience alias for `Nothing` :: `Maybe` `Segment`.
noSegment :: Maybe Segment
noSegment = Nothing

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

@
'Data.GI.Base.Attributes.get' segment #flags
@
-}
getSegmentFlags :: MonadIO m => Segment -> m [Gst.Flags.SegmentFlags]
getSegmentFlags s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO CUInt
    let val' = wordToGFlags val
    return val'

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

@
'Data.GI.Base.Attributes.set' segment [ #flags 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentFlags :: MonadIO m => Segment -> [Gst.Flags.SegmentFlags] -> m ()
setSegmentFlags s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = gflagsToWord val
    poke (ptr `plusPtr` 0) (val' :: CUInt)

#if ENABLE_OVERLOADING
data SegmentFlagsFieldInfo
instance AttrInfo SegmentFlagsFieldInfo where
    type AttrAllowedOps SegmentFlagsFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentFlagsFieldInfo = (~) [Gst.Flags.SegmentFlags]
    type AttrBaseTypeConstraint SegmentFlagsFieldInfo = (~) Segment
    type AttrGetType SegmentFlagsFieldInfo = [Gst.Flags.SegmentFlags]
    type AttrLabel SegmentFlagsFieldInfo = "flags"
    type AttrOrigin SegmentFlagsFieldInfo = Segment
    attrGet _ = getSegmentFlags
    attrSet _ = setSegmentFlags
    attrConstruct = undefined
    attrClear _ = undefined

segment_flags :: AttrLabelProxy "flags"
segment_flags = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #rate
@
-}
getSegmentRate :: MonadIO m => Segment -> m Double
getSegmentRate s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO CDouble
    let val' = realToFrac val
    return val'

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

@
'Data.GI.Base.Attributes.set' segment [ #rate 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentRate :: MonadIO m => Segment -> Double -> m ()
setSegmentRate s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = realToFrac val
    poke (ptr `plusPtr` 8) (val' :: CDouble)

#if ENABLE_OVERLOADING
data SegmentRateFieldInfo
instance AttrInfo SegmentRateFieldInfo where
    type AttrAllowedOps SegmentRateFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentRateFieldInfo = (~) Double
    type AttrBaseTypeConstraint SegmentRateFieldInfo = (~) Segment
    type AttrGetType SegmentRateFieldInfo = Double
    type AttrLabel SegmentRateFieldInfo = "rate"
    type AttrOrigin SegmentRateFieldInfo = Segment
    attrGet _ = getSegmentRate
    attrSet _ = setSegmentRate
    attrConstruct = undefined
    attrClear _ = undefined

segment_rate :: AttrLabelProxy "rate"
segment_rate = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #appliedRate
@
-}
getSegmentAppliedRate :: MonadIO m => Segment -> m Double
getSegmentAppliedRate s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO CDouble
    let val' = realToFrac val
    return val'

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

@
'Data.GI.Base.Attributes.set' segment [ #appliedRate 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentAppliedRate :: MonadIO m => Segment -> Double -> m ()
setSegmentAppliedRate s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = realToFrac val
    poke (ptr `plusPtr` 16) (val' :: CDouble)

#if ENABLE_OVERLOADING
data SegmentAppliedRateFieldInfo
instance AttrInfo SegmentAppliedRateFieldInfo where
    type AttrAllowedOps SegmentAppliedRateFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentAppliedRateFieldInfo = (~) Double
    type AttrBaseTypeConstraint SegmentAppliedRateFieldInfo = (~) Segment
    type AttrGetType SegmentAppliedRateFieldInfo = Double
    type AttrLabel SegmentAppliedRateFieldInfo = "applied_rate"
    type AttrOrigin SegmentAppliedRateFieldInfo = Segment
    attrGet _ = getSegmentAppliedRate
    attrSet _ = setSegmentAppliedRate
    attrConstruct = undefined
    attrClear _ = undefined

segment_appliedRate :: AttrLabelProxy "appliedRate"
segment_appliedRate = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #format
@
-}
getSegmentFormat :: MonadIO m => Segment -> m Gst.Enums.Format
getSegmentFormat s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 24) :: IO CUInt
    let val' = (toEnum . fromIntegral) val
    return val'

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

@
'Data.GI.Base.Attributes.set' segment [ #format 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentFormat :: MonadIO m => Segment -> Gst.Enums.Format -> m ()
setSegmentFormat s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = (fromIntegral . fromEnum) val
    poke (ptr `plusPtr` 24) (val' :: CUInt)

#if ENABLE_OVERLOADING
data SegmentFormatFieldInfo
instance AttrInfo SegmentFormatFieldInfo where
    type AttrAllowedOps SegmentFormatFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentFormatFieldInfo = (~) Gst.Enums.Format
    type AttrBaseTypeConstraint SegmentFormatFieldInfo = (~) Segment
    type AttrGetType SegmentFormatFieldInfo = Gst.Enums.Format
    type AttrLabel SegmentFormatFieldInfo = "format"
    type AttrOrigin SegmentFormatFieldInfo = Segment
    attrGet _ = getSegmentFormat
    attrSet _ = setSegmentFormat
    attrConstruct = undefined
    attrClear _ = undefined

segment_format :: AttrLabelProxy "format"
segment_format = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #base
@
-}
getSegmentBase :: MonadIO m => Segment -> m Word64
getSegmentBase s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 32) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #base 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentBase :: MonadIO m => Segment -> Word64 -> m ()
setSegmentBase s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 32) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentBaseFieldInfo
instance AttrInfo SegmentBaseFieldInfo where
    type AttrAllowedOps SegmentBaseFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentBaseFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentBaseFieldInfo = (~) Segment
    type AttrGetType SegmentBaseFieldInfo = Word64
    type AttrLabel SegmentBaseFieldInfo = "base"
    type AttrOrigin SegmentBaseFieldInfo = Segment
    attrGet _ = getSegmentBase
    attrSet _ = setSegmentBase
    attrConstruct = undefined
    attrClear _ = undefined

segment_base :: AttrLabelProxy "base"
segment_base = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #offset
@
-}
getSegmentOffset :: MonadIO m => Segment -> m Word64
getSegmentOffset s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 40) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #offset 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentOffset :: MonadIO m => Segment -> Word64 -> m ()
setSegmentOffset s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 40) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentOffsetFieldInfo
instance AttrInfo SegmentOffsetFieldInfo where
    type AttrAllowedOps SegmentOffsetFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentOffsetFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentOffsetFieldInfo = (~) Segment
    type AttrGetType SegmentOffsetFieldInfo = Word64
    type AttrLabel SegmentOffsetFieldInfo = "offset"
    type AttrOrigin SegmentOffsetFieldInfo = Segment
    attrGet _ = getSegmentOffset
    attrSet _ = setSegmentOffset
    attrConstruct = undefined
    attrClear _ = undefined

segment_offset :: AttrLabelProxy "offset"
segment_offset = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #start
@
-}
getSegmentStart :: MonadIO m => Segment -> m Word64
getSegmentStart s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 48) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #start 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentStart :: MonadIO m => Segment -> Word64 -> m ()
setSegmentStart s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 48) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentStartFieldInfo
instance AttrInfo SegmentStartFieldInfo where
    type AttrAllowedOps SegmentStartFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentStartFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentStartFieldInfo = (~) Segment
    type AttrGetType SegmentStartFieldInfo = Word64
    type AttrLabel SegmentStartFieldInfo = "start"
    type AttrOrigin SegmentStartFieldInfo = Segment
    attrGet _ = getSegmentStart
    attrSet _ = setSegmentStart
    attrConstruct = undefined
    attrClear _ = undefined

segment_start :: AttrLabelProxy "start"
segment_start = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #stop
@
-}
getSegmentStop :: MonadIO m => Segment -> m Word64
getSegmentStop s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 56) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #stop 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentStop :: MonadIO m => Segment -> Word64 -> m ()
setSegmentStop s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 56) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentStopFieldInfo
instance AttrInfo SegmentStopFieldInfo where
    type AttrAllowedOps SegmentStopFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentStopFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentStopFieldInfo = (~) Segment
    type AttrGetType SegmentStopFieldInfo = Word64
    type AttrLabel SegmentStopFieldInfo = "stop"
    type AttrOrigin SegmentStopFieldInfo = Segment
    attrGet _ = getSegmentStop
    attrSet _ = setSegmentStop
    attrConstruct = undefined
    attrClear _ = undefined

segment_stop :: AttrLabelProxy "stop"
segment_stop = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #time
@
-}
getSegmentTime :: MonadIO m => Segment -> m Word64
getSegmentTime s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 64) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #time 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentTime :: MonadIO m => Segment -> Word64 -> m ()
setSegmentTime s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 64) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentTimeFieldInfo
instance AttrInfo SegmentTimeFieldInfo where
    type AttrAllowedOps SegmentTimeFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentTimeFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentTimeFieldInfo = (~) Segment
    type AttrGetType SegmentTimeFieldInfo = Word64
    type AttrLabel SegmentTimeFieldInfo = "time"
    type AttrOrigin SegmentTimeFieldInfo = Segment
    attrGet _ = getSegmentTime
    attrSet _ = setSegmentTime
    attrConstruct = undefined
    attrClear _ = undefined

segment_time :: AttrLabelProxy "time"
segment_time = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #position
@
-}
getSegmentPosition :: MonadIO m => Segment -> m Word64
getSegmentPosition s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 72) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #position 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentPosition :: MonadIO m => Segment -> Word64 -> m ()
setSegmentPosition s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 72) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentPositionFieldInfo
instance AttrInfo SegmentPositionFieldInfo where
    type AttrAllowedOps SegmentPositionFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentPositionFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentPositionFieldInfo = (~) Segment
    type AttrGetType SegmentPositionFieldInfo = Word64
    type AttrLabel SegmentPositionFieldInfo = "position"
    type AttrOrigin SegmentPositionFieldInfo = Segment
    attrGet _ = getSegmentPosition
    attrSet _ = setSegmentPosition
    attrConstruct = undefined
    attrClear _ = undefined

segment_position :: AttrLabelProxy "position"
segment_position = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' segment #duration
@
-}
getSegmentDuration :: MonadIO m => Segment -> m Word64
getSegmentDuration s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 80) :: IO Word64
    return val

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

@
'Data.GI.Base.Attributes.set' segment [ #duration 'Data.GI.Base.Attributes.:=' value ]
@
-}
setSegmentDuration :: MonadIO m => Segment -> Word64 -> m ()
setSegmentDuration s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 80) (val :: Word64)

#if ENABLE_OVERLOADING
data SegmentDurationFieldInfo
instance AttrInfo SegmentDurationFieldInfo where
    type AttrAllowedOps SegmentDurationFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint SegmentDurationFieldInfo = (~) Word64
    type AttrBaseTypeConstraint SegmentDurationFieldInfo = (~) Segment
    type AttrGetType SegmentDurationFieldInfo = Word64
    type AttrLabel SegmentDurationFieldInfo = "duration"
    type AttrOrigin SegmentDurationFieldInfo = Segment
    attrGet _ = getSegmentDuration
    attrSet _ = setSegmentDuration
    attrConstruct = undefined
    attrClear _ = undefined

segment_duration :: AttrLabelProxy "duration"
segment_duration = AttrLabelProxy

#endif



#if ENABLE_OVERLOADING
instance O.HasAttributeList Segment
type instance O.AttributeList Segment = SegmentAttributeList
type SegmentAttributeList = ('[ '("flags", SegmentFlagsFieldInfo), '("rate", SegmentRateFieldInfo), '("appliedRate", SegmentAppliedRateFieldInfo), '("format", SegmentFormatFieldInfo), '("base", SegmentBaseFieldInfo), '("offset", SegmentOffsetFieldInfo), '("start", SegmentStartFieldInfo), '("stop", SegmentStopFieldInfo), '("time", SegmentTimeFieldInfo), '("position", SegmentPositionFieldInfo), '("duration", SegmentDurationFieldInfo)] :: [(Symbol, *)])
#endif

-- method Segment::new
-- method type : Constructor
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "Segment"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_new" gst_segment_new ::
    IO (Ptr Segment)

{- |
Allocate a new 'GI.Gst.Structs.Segment.Segment' structure and initialize it using
'GI.Gst.Structs.Segment.segmentInit'.

Free-function: gst_segment_free
-}
segmentNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Segment
    {- ^ __Returns:__ a new 'GI.Gst.Structs.Segment.Segment', free with 'GI.Gst.Structs.Segment.segmentFree'. -}
segmentNew  = liftIO $ do
    result <- gst_segment_new
    checkUnexpectedReturnNULL "segmentNew" result
    result' <- (wrapBoxed Segment) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Segment::clip
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "start", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the start position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "stop", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the stop position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "clip_start", argType = TBasicType TUInt64, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the clipped start position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "clip_stop", argType = TBasicType TUInt64, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the clipped stop position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_clip" gst_segment_clip ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- start : TBasicType TUInt64
    Word64 ->                               -- stop : TBasicType TUInt64
    Ptr Word64 ->                           -- clip_start : TBasicType TUInt64
    Ptr Word64 ->                           -- clip_stop : TBasicType TUInt64
    IO CInt

{- |
Clip the given /@start@/ and /@stop@/ values to the segment boundaries given
in /@segment@/. /@start@/ and /@stop@/ are compared and clipped to /@segment@/
start and stop values.

If the function returns 'False', /@start@/ and /@stop@/ are known to fall
outside of /@segment@/ and /@clipStart@/ and /@clipStop@/ are not updated.

When the function returns 'True', /@clipStart@/ and /@clipStop@/ will be
updated. If /@clipStart@/ or /@clipStop@/ are different from /@start@/ or /@stop@/
respectively, the region fell partially in the segment.

Note that when /@stop@/ is -1, /@clipStop@/ will be set to the end of the
segment. Depending on the use case, this may or may not be what you want.
-}
segmentClip ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@start@/: the start position in the segment -}
    -> Word64
    {- ^ /@stop@/: the stop position in the segment -}
    -> m ((Bool, Word64, Word64))
    {- ^ __Returns:__ 'True' if the given /@start@/ and /@stop@/ times fall partially or
    completely in /@segment@/, 'False' if the values are completely outside
    of the segment. -}
segmentClip segment format start stop = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    clipStart <- allocMem :: IO (Ptr Word64)
    clipStop <- allocMem :: IO (Ptr Word64)
    result <- gst_segment_clip segment' format' start stop clipStart clipStop
    let result' = (/= 0) result
    clipStart' <- peek clipStart
    clipStop' <- peek clipStop
    touchManagedPtr segment
    freeMem clipStart
    freeMem clipStop
    return (result', clipStart', clipStop')

#if ENABLE_OVERLOADING
data SegmentClipMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> Word64 -> m ((Bool, Word64, Word64))), MonadIO m) => O.MethodInfo SegmentClipMethodInfo Segment signature where
    overloadedMethod _ = segmentClip

#endif

-- method Segment::copy
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "Segment"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_copy" gst_segment_copy ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    IO (Ptr Segment)

{- |
Create a copy of given /@segment@/.

Free-function: gst_segment_free
-}
segmentCopy ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' -}
    -> m Segment
    {- ^ __Returns:__ a new 'GI.Gst.Structs.Segment.Segment', free with 'GI.Gst.Structs.Segment.segmentFree'. -}
segmentCopy segment = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    result <- gst_segment_copy segment'
    checkUnexpectedReturnNULL "segmentCopy" result
    result' <- (wrapBoxed Segment) result
    touchManagedPtr segment
    return result'

#if ENABLE_OVERLOADING
data SegmentCopyMethodInfo
instance (signature ~ (m Segment), MonadIO m) => O.MethodInfo SegmentCopyMethodInfo Segment signature where
    overloadedMethod _ = segmentCopy

#endif

-- method Segment::copy_into
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "src", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "dest", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_copy_into" gst_segment_copy_into ::
    Ptr Segment ->                          -- src : TInterface (Name {namespace = "Gst", name = "Segment"})
    Ptr Segment ->                          -- dest : TInterface (Name {namespace = "Gst", name = "Segment"})
    IO ()

{- |
Copy the contents of /@src@/ into /@dest@/.
-}
segmentCopyInto ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@src@/: a 'GI.Gst.Structs.Segment.Segment' -}
    -> Segment
    {- ^ /@dest@/: a 'GI.Gst.Structs.Segment.Segment' -}
    -> m ()
segmentCopyInto src dest = liftIO $ do
    src' <- unsafeManagedPtrGetPtr src
    dest' <- unsafeManagedPtrGetPtr dest
    gst_segment_copy_into src' dest'
    touchManagedPtr src
    touchManagedPtr dest
    return ()

#if ENABLE_OVERLOADING
data SegmentCopyIntoMethodInfo
instance (signature ~ (Segment -> m ()), MonadIO m) => O.MethodInfo SegmentCopyIntoMethodInfo Segment signature where
    overloadedMethod _ = segmentCopyInto

#endif

-- method Segment::do_seek
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "rate", argType = TBasicType TDouble, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the rate of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "flags", argType = TInterface (Name {namespace = "Gst", name = "SeekFlags"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the segment flags for the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "start_type", argType = TInterface (Name {namespace = "Gst", name = "SeekType"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the seek method", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "start", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the seek start value", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "stop_type", argType = TInterface (Name {namespace = "Gst", name = "SeekType"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the seek method", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "stop", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the seek stop value", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "update", argType = TBasicType TBoolean, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "boolean holding whether position was updated.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_do_seek" gst_segment_do_seek ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CDouble ->                              -- rate : TBasicType TDouble
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    CUInt ->                                -- flags : TInterface (Name {namespace = "Gst", name = "SeekFlags"})
    CUInt ->                                -- start_type : TInterface (Name {namespace = "Gst", name = "SeekType"})
    Word64 ->                               -- start : TBasicType TUInt64
    CUInt ->                                -- stop_type : TInterface (Name {namespace = "Gst", name = "SeekType"})
    Word64 ->                               -- stop : TBasicType TUInt64
    Ptr CInt ->                             -- update : TBasicType TBoolean
    IO CInt

{- |
Update the segment structure with the field values of a seek event (see
'GI.Gst.Structs.Event.eventNewSeek').

After calling this method, the segment field position and time will
contain the requested new position in the segment. The new requested
position in the segment depends on /@rate@/ and /@startType@/ and /@stopType@/.

For positive /@rate@/, the new position in the segment is the new /@segment@/
start field when it was updated with a /@startType@/ different from
@/GST_SEEK_TYPE_NONE/@. If no update was performed on /@segment@/ start position
(@/GST_SEEK_TYPE_NONE/@), /@start@/ is ignored and /@segment@/ position is
unmodified.

For negative /@rate@/, the new position in the segment is the new /@segment@/
stop field when it was updated with a /@stopType@/ different from
@/GST_SEEK_TYPE_NONE/@. If no stop was previously configured in the segment, the
duration of the segment will be used to update the stop position.
If no update was performed on /@segment@/ stop position (@/GST_SEEK_TYPE_NONE/@),
/@stop@/ is ignored and /@segment@/ position is unmodified.

The applied rate of the segment will be set to 1.0 by default.
If the caller can apply a rate change, it should update /@segment@/
rate and applied_rate after calling this function.

/@update@/ will be set to 'True' if a seek should be performed to the segment
position field. This field can be 'False' if, for example, only the /@rate@/
has been changed but not the playback position.
-}
segmentDoSeek ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Double
    {- ^ /@rate@/: the rate of the segment. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> [Gst.Flags.SeekFlags]
    {- ^ /@flags@/: the segment flags for the segment -}
    -> Gst.Enums.SeekType
    {- ^ /@startType@/: the seek method -}
    -> Word64
    {- ^ /@start@/: the seek start value -}
    -> Gst.Enums.SeekType
    {- ^ /@stopType@/: the seek method -}
    -> Word64
    {- ^ /@stop@/: the seek stop value -}
    -> m ((Bool, Bool))
    {- ^ __Returns:__ 'True' if the seek could be performed. -}
segmentDoSeek segment rate format flags startType start stopType stop = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let rate' = realToFrac rate
    let format' = (fromIntegral . fromEnum) format
    let flags' = gflagsToWord flags
    let startType' = (fromIntegral . fromEnum) startType
    let stopType' = (fromIntegral . fromEnum) stopType
    update <- allocMem :: IO (Ptr CInt)
    result <- gst_segment_do_seek segment' rate' format' flags' startType' start stopType' stop update
    let result' = (/= 0) result
    update' <- peek update
    let update'' = (/= 0) update'
    touchManagedPtr segment
    freeMem update
    return (result', update'')

#if ENABLE_OVERLOADING
data SegmentDoSeekMethodInfo
instance (signature ~ (Double -> Gst.Enums.Format -> [Gst.Flags.SeekFlags] -> Gst.Enums.SeekType -> Word64 -> Gst.Enums.SeekType -> Word64 -> m ((Bool, Bool))), MonadIO m) => O.MethodInfo SegmentDoSeekMethodInfo Segment signature where
    overloadedMethod _ = segmentDoSeek

#endif

-- method Segment::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_free" gst_segment_free ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    IO ()

{- |
Free the allocated segment /@segment@/.
-}
segmentFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' -}
    -> m ()
segmentFree segment = liftIO $ do
    segment' <- B.ManagedPtr.disownBoxed segment
    gst_segment_free segment'
    touchManagedPtr segment
    return ()

#if ENABLE_OVERLOADING
data SegmentFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo SegmentFreeMethodInfo Segment signature where
    overloadedMethod _ = segmentFree

#endif

-- method Segment::init
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_init" gst_segment_init ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    IO ()

{- |
The start\/position fields are set to 0 and the stop\/duration
fields are set to -1 (unknown). The default rate of 1.0 and no
flags are set.

Initialize /@segment@/ to its default values.
-}
segmentInit ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> m ()
segmentInit segment format = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    gst_segment_init segment' format'
    touchManagedPtr segment
    return ()

#if ENABLE_OVERLOADING
data SegmentInitMethodInfo
instance (signature ~ (Gst.Enums.Format -> m ()), MonadIO m) => O.MethodInfo SegmentInitMethodInfo Segment signature where
    overloadedMethod _ = segmentInit

#endif

-- method Segment::is_equal
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "s0", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "s1", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_is_equal" gst_segment_is_equal ::
    Ptr Segment ->                          -- s0 : TInterface (Name {namespace = "Gst", name = "Segment"})
    Ptr Segment ->                          -- s1 : TInterface (Name {namespace = "Gst", name = "Segment"})
    IO CInt

{- |
Checks for two segments being equal. Equality here is defined
as perfect equality, including floating point values.

/Since: 1.6/
-}
segmentIsEqual ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@s0@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Segment
    {- ^ /@s1@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the segments are equal, 'False' otherwise. -}
segmentIsEqual s0 s1 = liftIO $ do
    s0' <- unsafeManagedPtrGetPtr s0
    s1' <- unsafeManagedPtrGetPtr s1
    result <- gst_segment_is_equal s0' s1'
    let result' = (/= 0) result
    touchManagedPtr s0
    touchManagedPtr s1
    return result'

#if ENABLE_OVERLOADING
data SegmentIsEqualMethodInfo
instance (signature ~ (Segment -> m Bool), MonadIO m) => O.MethodInfo SegmentIsEqualMethodInfo Segment signature where
    overloadedMethod _ = segmentIsEqual

#endif

-- method Segment::offset_running_time
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "offset", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the offset to apply in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_offset_running_time" gst_segment_offset_running_time ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Int64 ->                                -- offset : TBasicType TInt64
    IO CInt

{- |
Adjust the values in /@segment@/ so that /@offset@/ is applied to all
future running-time calculations.

/Since: 1.2.3/
-}
segmentOffsetRunningTime ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Int64
    {- ^ /@offset@/: the offset to apply in the segment -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the segment could be updated successfully. If 'False' is
returned, /@offset@/ is not in /@segment@/. -}
segmentOffsetRunningTime segment format offset = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_offset_running_time segment' format' offset
    let result' = (/= 0) result
    touchManagedPtr segment
    return result'

#if ENABLE_OVERLOADING
data SegmentOffsetRunningTimeMethodInfo
instance (signature ~ (Gst.Enums.Format -> Int64 -> m Bool), MonadIO m) => O.MethodInfo SegmentOffsetRunningTimeMethodInfo Segment signature where
    overloadedMethod _ = segmentOffsetRunningTime

#endif

-- method Segment::position_from_running_time
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "running_time", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the running_time in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt64)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_position_from_running_time" gst_segment_position_from_running_time ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- running_time : TBasicType TUInt64
    IO Word64

{- |
Convert /@runningTime@/ into a position in the segment so that
'GI.Gst.Structs.Segment.segmentToRunningTime' with that position returns /@runningTime@/.

/Since: 1.8/
-}
segmentPositionFromRunningTime ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@runningTime@/: the running_time in the segment -}
    -> m Word64
    {- ^ __Returns:__ the position in the segment for /@runningTime@/. This function returns
-1 when /@runningTime@/ is -1 or when it is not inside /@segment@/. -}
segmentPositionFromRunningTime segment format runningTime = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_position_from_running_time segment' format' runningTime
    touchManagedPtr segment
    return result

#if ENABLE_OVERLOADING
data SegmentPositionFromRunningTimeMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m Word64), MonadIO m) => O.MethodInfo SegmentPositionFromRunningTimeMethodInfo Segment signature where
    overloadedMethod _ = segmentPositionFromRunningTime

#endif

-- method Segment::position_from_running_time_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "running_time", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the running-time", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "position", argType = TBasicType TUInt64, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the resulting position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_position_from_running_time_full" gst_segment_position_from_running_time_full ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- running_time : TBasicType TUInt64
    Ptr Word64 ->                           -- position : TBasicType TUInt64
    IO Int32

{- |
Translate /@runningTime@/ to the segment position using the currently configured
segment. Compared to 'GI.Gst.Structs.Segment.segmentPositionFromRunningTime' this function can
return negative segment position.

This function is typically used by elements that need to synchronize buffers
against the clock or each other.

/@runningTime@/ can be any value and the result of this function for values
outside of the segment is extrapolated.

When 1 is returned, /@runningTime@/ resulted in a positive position returned
in /@position@/.

When this function returns -1, the returned /@position@/ was \< 0, and the value
in the position variable should be negated to get the real negative segment
position.

/Since: 1.8/
-}
segmentPositionFromRunningTimeFull ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@runningTime@/: the running-time -}
    -> m ((Int32, Word64))
    {- ^ __Returns:__ a 1 or -1 on success, 0 on failure. -}
segmentPositionFromRunningTimeFull segment format runningTime = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    position <- allocMem :: IO (Ptr Word64)
    result <- gst_segment_position_from_running_time_full segment' format' runningTime position
    position' <- peek position
    touchManagedPtr segment
    freeMem position
    return (result, position')

#if ENABLE_OVERLOADING
data SegmentPositionFromRunningTimeFullMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m ((Int32, Word64))), MonadIO m) => O.MethodInfo SegmentPositionFromRunningTimeFullMethodInfo Segment signature where
    overloadedMethod _ = segmentPositionFromRunningTimeFull

#endif

-- method Segment::position_from_stream_time
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "stream_time", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the stream_time in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt64)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_position_from_stream_time" gst_segment_position_from_stream_time ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- stream_time : TBasicType TUInt64
    IO Word64

{- |
Convert /@streamTime@/ into a position in the segment so that
'GI.Gst.Structs.Segment.segmentToStreamTime' with that position returns /@streamTime@/.

/Since: 1.8/
-}
segmentPositionFromStreamTime ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@streamTime@/: the stream_time in the segment -}
    -> m Word64
    {- ^ __Returns:__ the position in the segment for /@streamTime@/. This function returns
-1 when /@streamTime@/ is -1 or when it is not inside /@segment@/. -}
segmentPositionFromStreamTime segment format streamTime = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_position_from_stream_time segment' format' streamTime
    touchManagedPtr segment
    return result

#if ENABLE_OVERLOADING
data SegmentPositionFromStreamTimeMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m Word64), MonadIO m) => O.MethodInfo SegmentPositionFromStreamTimeMethodInfo Segment signature where
    overloadedMethod _ = segmentPositionFromStreamTime

#endif

-- method Segment::position_from_stream_time_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "stream_time", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the stream-time", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "position", argType = TBasicType TUInt64, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the resulting position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_position_from_stream_time_full" gst_segment_position_from_stream_time_full ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- stream_time : TBasicType TUInt64
    Ptr Word64 ->                           -- position : TBasicType TUInt64
    IO Int32

{- |
Translate /@streamTime@/ to the segment position using the currently configured
segment. Compared to 'GI.Gst.Structs.Segment.segmentPositionFromStreamTime' this function can
return negative segment position.

This function is typically used by elements that need to synchronize buffers
against the clock or each other.

/@streamTime@/ can be any value and the result of this function for values outside
of the segment is extrapolated.

When 1 is returned, /@streamTime@/ resulted in a positive position returned
in /@position@/.

When this function returns -1, the returned /@position@/ should be negated
to get the real negative segment position.

/Since: 1.8/
-}
segmentPositionFromStreamTimeFull ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@streamTime@/: the stream-time -}
    -> m ((Int32, Word64))
    {- ^ __Returns:__ a 1 or -1 on success, 0 on failure. -}
segmentPositionFromStreamTimeFull segment format streamTime = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    position <- allocMem :: IO (Ptr Word64)
    result <- gst_segment_position_from_stream_time_full segment' format' streamTime position
    position' <- peek position
    touchManagedPtr segment
    freeMem position
    return (result, position')

#if ENABLE_OVERLOADING
data SegmentPositionFromStreamTimeFullMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m ((Int32, Word64))), MonadIO m) => O.MethodInfo SegmentPositionFromStreamTimeFullMethodInfo Segment signature where
    overloadedMethod _ = segmentPositionFromStreamTimeFull

#endif

-- method Segment::set_running_time
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "running_time", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the running_time in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_set_running_time" gst_segment_set_running_time ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- running_time : TBasicType TUInt64
    IO CInt

{- |
Adjust the start\/stop and base values of /@segment@/ such that the next valid
buffer will be one with /@runningTime@/.
-}
segmentSetRunningTime ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@runningTime@/: the running_time in the segment -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the segment could be updated successfully. If 'False' is
returned, /@runningTime@/ is -1 or not in /@segment@/. -}
segmentSetRunningTime segment format runningTime = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_set_running_time segment' format' runningTime
    let result' = (/= 0) result
    touchManagedPtr segment
    return result'

#if ENABLE_OVERLOADING
data SegmentSetRunningTimeMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m Bool), MonadIO m) => O.MethodInfo SegmentSetRunningTimeMethodInfo Segment signature where
    overloadedMethod _ = segmentSetRunningTime

#endif

-- method Segment::to_position
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "running_time", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the running_time in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt64)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_to_position" gst_segment_to_position ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- running_time : TBasicType TUInt64
    IO Word64

{-# DEPRECATED segmentToPosition ["Use 'GI.Gst.Structs.Segment.segmentPositionFromRunningTime' instead."] #-}
{- |
Convert /@runningTime@/ into a position in the segment so that
'GI.Gst.Structs.Segment.segmentToRunningTime' with that position returns /@runningTime@/.
-}
segmentToPosition ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@runningTime@/: the running_time in the segment -}
    -> m Word64
    {- ^ __Returns:__ the position in the segment for /@runningTime@/. This function returns
-1 when /@runningTime@/ is -1 or when it is not inside /@segment@/. -}
segmentToPosition segment format runningTime = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_to_position segment' format' runningTime
    touchManagedPtr segment
    return result

#if ENABLE_OVERLOADING
data SegmentToPositionMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m Word64), MonadIO m) => O.MethodInfo SegmentToPositionMethodInfo Segment signature where
    overloadedMethod _ = segmentToPosition

#endif

-- method Segment::to_running_time
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "position", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt64)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_to_running_time" gst_segment_to_running_time ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- position : TBasicType TUInt64
    IO Word64

{- |
Translate /@position@/ to the total running time using the currently configured
segment. Position is a value between /@segment@/ start and stop time.

This function is typically used by elements that need to synchronize to the
global clock in a pipeline. The running time is a constantly increasing value
starting from 0. When 'GI.Gst.Structs.Segment.segmentInit' is called, this value will reset to
0.

This function returns -1 if the position is outside of /@segment@/ start and stop.
-}
segmentToRunningTime ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@position@/: the position in the segment -}
    -> m Word64
    {- ^ __Returns:__ the position as the total running time or -1 when an invalid position
was given. -}
segmentToRunningTime segment format position = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_to_running_time segment' format' position
    touchManagedPtr segment
    return result

#if ENABLE_OVERLOADING
data SegmentToRunningTimeMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m Word64), MonadIO m) => O.MethodInfo SegmentToRunningTimeMethodInfo Segment signature where
    overloadedMethod _ = segmentToRunningTime

#endif

-- method Segment::to_running_time_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "position", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "running_time", argType = TBasicType TUInt64, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "result running-time", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_to_running_time_full" gst_segment_to_running_time_full ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- position : TBasicType TUInt64
    Ptr Word64 ->                           -- running_time : TBasicType TUInt64
    IO Int32

{- |
Translate /@position@/ to the total running time using the currently configured
segment. Compared to 'GI.Gst.Structs.Segment.segmentToRunningTime' this function can return
negative running-time.

This function is typically used by elements that need to synchronize buffers
against the clock or each other.

/@position@/ can be any value and the result of this function for values outside
of the segment is extrapolated.

When 1 is returned, /@position@/ resulted in a positive running-time returned
in /@runningTime@/.

When this function returns -1, the returned /@runningTime@/ should be negated
to get the real negative running time.

/Since: 1.6/
-}
segmentToRunningTimeFull ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@position@/: the position in the segment -}
    -> m ((Int32, Word64))
    {- ^ __Returns:__ a 1 or -1 on success, 0 on failure. -}
segmentToRunningTimeFull segment format position = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    runningTime <- allocMem :: IO (Ptr Word64)
    result <- gst_segment_to_running_time_full segment' format' position runningTime
    runningTime' <- peek runningTime
    touchManagedPtr segment
    freeMem runningTime
    return (result, runningTime')

#if ENABLE_OVERLOADING
data SegmentToRunningTimeFullMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m ((Int32, Word64))), MonadIO m) => O.MethodInfo SegmentToRunningTimeFullMethodInfo Segment signature where
    overloadedMethod _ = segmentToRunningTimeFull

#endif

-- method Segment::to_stream_time
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "position", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt64)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_to_stream_time" gst_segment_to_stream_time ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- position : TBasicType TUInt64
    IO Word64

{- |
Translate /@position@/ to stream time using the currently configured
segment. The /@position@/ value must be between /@segment@/ start and
stop value.

This function is typically used by elements that need to operate on
the stream time of the buffers it receives, such as effect plugins.
In those use cases, /@position@/ is typically the buffer timestamp or
clock time that one wants to convert to the stream time.
The stream time is always between 0 and the total duration of the
media stream.

/Since: 1.8/
-}
segmentToStreamTime ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@position@/: the position in the segment -}
    -> m Word64
    {- ^ __Returns:__ the position in stream_time or -1 when an invalid position
was given. -}
segmentToStreamTime segment format position = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    result <- gst_segment_to_stream_time segment' format' position
    touchManagedPtr segment
    return result

#if ENABLE_OVERLOADING
data SegmentToStreamTimeMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m Word64), MonadIO m) => O.MethodInfo SegmentToStreamTimeMethodInfo Segment signature where
    overloadedMethod _ = segmentToStreamTime

#endif

-- method Segment::to_stream_time_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "segment", argType = TInterface (Name {namespace = "Gst", name = "Segment"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstSegment structure.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Format"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the format of the segment.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "position", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position in the segment", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "stream_time", argType = TBasicType TUInt64, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "result stream-time", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gst_segment_to_stream_time_full" gst_segment_to_stream_time_full ::
    Ptr Segment ->                          -- segment : TInterface (Name {namespace = "Gst", name = "Segment"})
    CUInt ->                                -- format : TInterface (Name {namespace = "Gst", name = "Format"})
    Word64 ->                               -- position : TBasicType TUInt64
    Ptr Word64 ->                           -- stream_time : TBasicType TUInt64
    IO Int32

{- |
Translate /@position@/ to the total stream time using the currently configured
segment. Compared to 'GI.Gst.Structs.Segment.segmentToStreamTime' this function can return
negative stream-time.

This function is typically used by elements that need to synchronize buffers
against the clock or each other.

/@position@/ can be any value and the result of this function for values outside
of the segment is extrapolated.

When 1 is returned, /@position@/ resulted in a positive stream-time returned
in /@streamTime@/.

When this function returns -1, the returned /@streamTime@/ should be negated
to get the real negative stream time.

/Since: 1.8/
-}
segmentToStreamTimeFull ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Segment
    {- ^ /@segment@/: a 'GI.Gst.Structs.Segment.Segment' structure. -}
    -> Gst.Enums.Format
    {- ^ /@format@/: the format of the segment. -}
    -> Word64
    {- ^ /@position@/: the position in the segment -}
    -> m ((Int32, Word64))
    {- ^ __Returns:__ a 1 or -1 on success, 0 on failure. -}
segmentToStreamTimeFull segment format position = liftIO $ do
    segment' <- unsafeManagedPtrGetPtr segment
    let format' = (fromIntegral . fromEnum) format
    streamTime <- allocMem :: IO (Ptr Word64)
    result <- gst_segment_to_stream_time_full segment' format' position streamTime
    streamTime' <- peek streamTime
    touchManagedPtr segment
    freeMem streamTime
    return (result, streamTime')

#if ENABLE_OVERLOADING
data SegmentToStreamTimeFullMethodInfo
instance (signature ~ (Gst.Enums.Format -> Word64 -> m ((Int32, Word64))), MonadIO m) => O.MethodInfo SegmentToStreamTimeFullMethodInfo Segment signature where
    overloadedMethod _ = segmentToStreamTimeFull

#endif

#if ENABLE_OVERLOADING
type family ResolveSegmentMethod (t :: Symbol) (o :: *) :: * where
    ResolveSegmentMethod "clip" o = SegmentClipMethodInfo
    ResolveSegmentMethod "copy" o = SegmentCopyMethodInfo
    ResolveSegmentMethod "copyInto" o = SegmentCopyIntoMethodInfo
    ResolveSegmentMethod "doSeek" o = SegmentDoSeekMethodInfo
    ResolveSegmentMethod "free" o = SegmentFreeMethodInfo
    ResolveSegmentMethod "init" o = SegmentInitMethodInfo
    ResolveSegmentMethod "isEqual" o = SegmentIsEqualMethodInfo
    ResolveSegmentMethod "offsetRunningTime" o = SegmentOffsetRunningTimeMethodInfo
    ResolveSegmentMethod "positionFromRunningTime" o = SegmentPositionFromRunningTimeMethodInfo
    ResolveSegmentMethod "positionFromRunningTimeFull" o = SegmentPositionFromRunningTimeFullMethodInfo
    ResolveSegmentMethod "positionFromStreamTime" o = SegmentPositionFromStreamTimeMethodInfo
    ResolveSegmentMethod "positionFromStreamTimeFull" o = SegmentPositionFromStreamTimeFullMethodInfo
    ResolveSegmentMethod "toPosition" o = SegmentToPositionMethodInfo
    ResolveSegmentMethod "toRunningTime" o = SegmentToRunningTimeMethodInfo
    ResolveSegmentMethod "toRunningTimeFull" o = SegmentToRunningTimeFullMethodInfo
    ResolveSegmentMethod "toStreamTime" o = SegmentToStreamTimeMethodInfo
    ResolveSegmentMethod "toStreamTimeFull" o = SegmentToStreamTimeFullMethodInfo
    ResolveSegmentMethod "setRunningTime" o = SegmentSetRunningTimeMethodInfo
    ResolveSegmentMethod l o = O.MethodResolutionFailed l o

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