module Media.Streaming.GStreamer.Core.Buffer (
Buffer,
BufferClass,
castToBuffer,
gTypeBuffer,
BufferFlags(..),
bufferOffsetNone,
bufferGetFlags,
bufferGetFlagsM,
bufferSetFlagsM,
bufferUnsetFlagsM,
bufferGetSize,
bufferGetSizeM,
unsafeBufferGetPtrM,
bufferGetTimestamp,
bufferGetTimestampM,
bufferSetTimestampM,
bufferGetDuration,
bufferGetDurationM,
bufferSetDurationM,
bufferGetCaps,
bufferGetCapsM,
bufferSetCapsM,
bufferGetOffset,
bufferGetOffsetM,
bufferSetOffsetM,
bufferGetOffsetEnd,
bufferGetOffsetEndM,
bufferSetOffsetEndM,
bufferIsDiscont,
bufferIsDiscontM,
bufferCreateEmpty,
bufferCreate,
bufferCreateSub,
bufferIsSpanFast,
bufferSpan,
bufferMerge
) where
import Control.Monad ( liftM
, when )
import Control.Monad.Trans
import Media.Streaming.GStreamer.Core.Types
import System.Glib.FFI
bufferGetFlags :: BufferClass bufferT
=> bufferT
-> [BufferFlags]
bufferGetFlags = mkMiniObjectGetFlags
bufferGetFlagsM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m [BufferFlags]
bufferGetFlagsM = mkMiniObjectGetFlagsM
bufferSetFlagsM :: (BufferClass bufferT, MonadIO m)
=> [BufferFlags]
-> MiniObjectT bufferT m ()
bufferSetFlagsM = mkMiniObjectSetFlagsM
bufferUnsetFlagsM :: (BufferClass bufferT, MonadIO m)
=> [BufferFlags]
-> MiniObjectT bufferT m ()
bufferUnsetFlagsM = mkMiniObjectUnsetFlagsM
bufferGetSize :: BufferClass bufferT
=> bufferT
-> Word
bufferGetSize buffer =
fromIntegral $ unsafePerformIO $
withMiniObject buffer (\ptr -> do {peekByteOff ptr 20 ::IO CUInt})
marshalBufferM :: (BufferClass bufferT, MonadIO m)
=> (Ptr Buffer -> IO a)
-> MiniObjectT bufferT m a
marshalBufferM action = do
ptr <- askMiniObjectPtr
liftIO $ action $ castPtr ptr
bufferGetSizeM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m Word
bufferGetSizeM =
liftM fromIntegral $
marshalBufferM (\ptr -> do {peekByteOff ptr 20 ::IO CUInt})
unsafeBufferGetPtrM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m (Ptr Word8)
unsafeBufferGetPtrM = do
ptr <- askMiniObjectPtr
liftIO $ liftM castPtr $
(\ptr -> do {peekByteOff ptr 16 ::IO (Ptr CUChar)}) ptr
marshalGetNum :: (BufferClass bufferT, Integral intT, Num numT)
=> (Ptr Buffer -> IO intT)
-> numT
-> bufferT
-> Maybe numT
marshalGetNum getAction invalid buffer =
let n = fromIntegral $ unsafePerformIO $
withMiniObject (toBuffer buffer) getAction
in if n /= invalid
then Just n
else Nothing
marshalGetNumM :: (BufferClass bufferT, Integral intT, Num numT, MonadIO m)
=> (Ptr Buffer -> IO intT)
-> numT
-> MiniObjectT bufferT m (Maybe numT)
marshalGetNumM getAction invalid =
marshalBufferM $ \bufferPtr -> do
n <- liftM fromIntegral $ getAction bufferPtr
return $ if n /= invalid
then Just n
else Nothing
marshalSetNumM :: (BufferClass bufferT, Integral intT, Num numT, MonadIO m)
=> (Ptr Buffer -> numT -> IO ())
-> intT
-> Maybe intT
-> MiniObjectT bufferT m ()
marshalSetNumM setAction invalid nM =
let n = case nM of
Just n' -> n'
Nothing -> invalid
in marshalBufferM $ flip setAction $ fromIntegral n
bufferGetTimestamp :: BufferClass bufferT
=> bufferT
-> Maybe ClockTime
bufferGetTimestamp =
marshalGetNum (\ptr -> do {peekByteOff ptr 24 ::IO CULLong}) clockTimeNone
bufferGetTimestampM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m (Maybe ClockTime)
bufferGetTimestampM =
marshalGetNumM (\ptr -> do {peekByteOff ptr 24 ::IO CULLong}) clockTimeNone
bufferSetTimestampM :: (BufferClass bufferT, MonadIO m)
=> Maybe ClockTime
-> MiniObjectT bufferT m ()
bufferSetTimestampM =
marshalSetNumM (\ptr val -> do {pokeByteOff ptr 24 (val::CULLong)}) clockTimeNone
bufferGetDuration :: BufferClass bufferT
=> bufferT
-> Maybe ClockTime
bufferGetDuration =
marshalGetNum (\ptr -> do {peekByteOff ptr 32 ::IO CULLong}) clockTimeNone
bufferGetDurationM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m (Maybe ClockTime)
bufferGetDurationM =
marshalGetNumM (\ptr -> do {peekByteOff ptr 32 ::IO CULLong}) clockTimeNone
bufferSetDurationM :: (BufferClass bufferT, MonadIO m)
=> Maybe ClockTime
-> MiniObjectT bufferT m ()
bufferSetDurationM =
marshalSetNumM (\ptr val -> do {pokeByteOff ptr 32 (val::CULLong)}) clockTimeNone
bufferGetCaps :: BufferClass bufferT
=> bufferT
-> Maybe Caps
bufferGetCaps buffer =
unsafePerformIO $
(\(Buffer arg1) -> withForeignPtr arg1 $ \argPtr1 ->gst_buffer_get_caps argPtr1) (toBuffer buffer) >>=
maybePeek takeCaps
bufferGetCapsM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m (Maybe Caps)
bufferGetCapsM = do
ptr <- askMiniObjectPtr
liftIO $ gst_buffer_get_caps (castPtr ptr) >>=
maybePeek takeCaps
where _ = (\(Buffer arg1) -> withForeignPtr arg1 $ \argPtr1 ->gst_buffer_get_caps argPtr1)
bufferSetCapsM :: (BufferClass bufferT, MonadIO m)
=> Maybe Caps
-> MiniObjectT bufferT m ()
bufferSetCapsM capsM = do
ptr <- askMiniObjectPtr
liftIO $ withForeignPtr (case capsM of
Just caps -> unCaps caps
Nothing -> nullForeignPtr)
(gst_buffer_set_caps $ castPtr ptr)
where _ = (\(Buffer arg1) (Caps arg2) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gst_buffer_set_caps argPtr1 argPtr2)
bufferGetOffset :: BufferClass bufferT
=> bufferT
-> Maybe Word64
bufferGetOffset =
marshalGetNum (\ptr -> do {peekByteOff ptr 44 ::IO CULLong}) bufferOffsetNone
bufferGetOffsetM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m (Maybe Word64)
bufferGetOffsetM =
marshalGetNumM (\ptr -> do {peekByteOff ptr 44 ::IO CULLong}) bufferOffsetNone
bufferSetOffsetM :: (BufferClass bufferT, MonadIO m)
=> Maybe Word64
-> MiniObjectT bufferT m ()
bufferSetOffsetM =
marshalSetNumM (\ptr val -> do {pokeByteOff ptr 44 (val::CULLong)}) bufferOffsetNone
bufferGetOffsetEnd :: BufferClass bufferT
=> bufferT
-> Maybe Word64
bufferGetOffsetEnd =
marshalGetNum (\ptr -> do {peekByteOff ptr 52 ::IO CULLong}) bufferOffsetNone
bufferGetOffsetEndM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m (Maybe Word64)
bufferGetOffsetEndM =
marshalGetNumM (\ptr -> do {peekByteOff ptr 52 ::IO CULLong}) bufferOffsetNone
bufferSetOffsetEndM :: (BufferClass bufferT, MonadIO m)
=> Maybe Word64
-> MiniObjectT bufferT m ()
bufferSetOffsetEndM =
marshalSetNumM (\ptr val -> do {pokeByteOff ptr 52 (val::CULLong)}) bufferOffsetNone
bufferIsDiscont :: BufferClass bufferT
=> bufferT
-> Bool
bufferIsDiscont =
(elem BufferDiscont) . bufferGetFlags
bufferIsDiscontM :: (BufferClass bufferT, MonadIO m)
=> MiniObjectT bufferT m Bool
bufferIsDiscontM =
liftM (elem BufferDiscont) $ bufferGetFlagsM
bufferCreateEmpty :: MonadIO m
=> MiniObjectT Buffer m a
-> m (Buffer, a)
bufferCreateEmpty =
marshalMiniObjectModify $ liftIO gst_buffer_new
bufferCreate :: MonadIO m
=> Word
-> MiniObjectT Buffer m a
-> m (Buffer, a)
bufferCreate size =
marshalMiniObjectModify $
liftIO $ gst_buffer_new_and_alloc $ fromIntegral size
bufferCreateSub :: BufferClass bufferT
=> bufferT
-> Word
-> Word
-> Maybe Buffer
bufferCreateSub parent offset size =
unsafePerformIO $
(\(Buffer arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_buffer_create_sub argPtr1 arg2 arg3) (toBuffer parent)
(fromIntegral offset)
(fromIntegral size) >>=
maybePeek takeMiniObject
bufferIsSpanFast :: (BufferClass bufferT1, BufferClass bufferT2)
=> bufferT1
-> bufferT2
-> Bool
bufferIsSpanFast buffer1 buffer2 =
toBool $ unsafePerformIO $
(\(Buffer arg1) (Buffer arg2) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gst_buffer_is_span_fast argPtr1 argPtr2) (toBuffer buffer1)
(toBuffer buffer2)
bufferSpan :: (BufferClass bufferT1, BufferClass bufferT2)
=> bufferT1
-> Word32
-> bufferT2
-> Word32
-> Maybe Buffer
bufferSpan buffer1 offset buffer2 len =
unsafePerformIO $
(\(Buffer arg1) arg2 (Buffer arg3) arg4 -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg3 $ \argPtr3 ->gst_buffer_span argPtr1 arg2 argPtr3 arg4) (toBuffer buffer1)
(fromIntegral offset)
(toBuffer buffer2)
(fromIntegral len) >>=
maybePeek takeMiniObject
bufferMerge :: (BufferClass bufferT1, BufferClass bufferT2)
=> bufferT1
-> bufferT2
-> Buffer
bufferMerge buffer1 buffer2 =
unsafePerformIO $
(\(Buffer arg1) (Buffer arg2) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gst_buffer_merge argPtr1 argPtr2) (toBuffer buffer1)
(toBuffer buffer2) >>=
takeMiniObject
foreign import ccall safe "gst_buffer_get_caps"
gst_buffer_get_caps :: ((Ptr Buffer) -> (IO (Ptr Caps)))
foreign import ccall safe "gst_buffer_set_caps"
gst_buffer_set_caps :: ((Ptr Buffer) -> ((Ptr Caps) -> (IO ())))
foreign import ccall safe "gst_buffer_new"
gst_buffer_new :: (IO (Ptr Buffer))
foreign import ccall safe "gst_buffer_new_and_alloc"
gst_buffer_new_and_alloc :: (CUInt -> (IO (Ptr Buffer)))
foreign import ccall safe "gst_buffer_create_sub"
gst_buffer_create_sub :: ((Ptr Buffer) -> (CUInt -> (CUInt -> (IO (Ptr Buffer)))))
foreign import ccall safe "gst_buffer_is_span_fast"
gst_buffer_is_span_fast :: ((Ptr Buffer) -> ((Ptr Buffer) -> (IO CInt)))
foreign import ccall safe "gst_buffer_span"
gst_buffer_span :: ((Ptr Buffer) -> (CUInt -> ((Ptr Buffer) -> (CUInt -> (IO (Ptr Buffer))))))
foreign import ccall safe "gst_buffer_merge"
gst_buffer_merge :: ((Ptr Buffer) -> ((Ptr Buffer) -> (IO (Ptr Buffer))))