module Media.Streaming.GStreamer.Core.Structure (
Structure,
structureEmpty,
structureToString,
structureFromString,
structureName,
structureHasName,
structureGetBool,
structureGetInt,
structureGetFourCC,
structureGetDouble,
structureGetString,
structureGetDate,
structureGetClockTime,
structureGetFraction,
StructureM,
structureCreate,
structureModify,
structureSetNameM,
structureRemoveFieldM,
structureSetBoolM,
structureSetIntM,
structureSetFourCCM,
structureSetDoubleM,
structureSetStringM,
structureSetDateM,
structureSetClockTimeM,
structureSetFractionM,
structureFixateFieldNearestIntM,
structureFixateFieldNearestDoubleM,
structureFixateFieldNearestFractionM,
structureFixateFieldBoolM
) where
import Data.Ratio ( (%)
, numerator
, denominator )
import Control.Monad (liftM)
import Media.Streaming.GStreamer.Core.Types
import System.Glib.UTFString
import System.Glib.FFI
import System.Glib.GTypeConstants
import System.Glib.GDateTime
import System.Glib.GType
import System.Glib.GValue
import System.Glib.GValueTypes
structureEmpty :: String
-> Structure
structureEmpty name =
unsafePerformIO $
withUTFString name gst_structure_empty_new >>=
takeStructure
structureToString :: Structure
-> String
structureToString structure =
unsafePerformIO $
(\(Structure arg1) -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_to_string argPtr1) structure >>=
readUTFString
structureFromString :: String
-> (Maybe Structure, Int)
structureFromString string =
unsafePerformIO $
withUTFString string $ \cString ->
alloca $ \endPtr ->
do structure <- gst_structure_from_string cString endPtr >>=
maybePeek takeStructure
end <- peek endPtr
offset <- g_utf8_pointer_to_offset cString end
return (structure, fromIntegral offset)
structureName :: Structure
-> String
structureName structure =
unsafePerformIO $
(\(Structure arg1) -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_name argPtr1) structure >>=
peekUTFString
structureHasName :: Structure
-> String
-> Bool
structureHasName structure name =
toBool $ unsafePerformIO $
withUTFString name $
(\(Structure arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_has_name argPtr1 arg2) structure
marshalStructureGet :: Storable a
=> (Structure -> CString -> Ptr a -> IO (CInt))
-> (a -> IO b)
-> Structure
-> String
-> Maybe b
marshalStructureGet getAction convert structure fieldname =
unsafePerformIO $
alloca $ \ptr ->
withUTFString fieldname $ \cFieldname ->
do result <- getAction structure cFieldname ptr
if toBool result
then liftM Just $ peek (castPtr ptr) >>= convert
else return Nothing
structureGetBool :: Structure
-> String
-> Maybe Bool
structureGetBool =
marshalStructureGet (\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_boolean argPtr1 arg2 arg3) $
return . toBool
structureGetInt :: Structure
-> String
-> Maybe Int
structureGetInt =
marshalStructureGet (\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_int argPtr1 arg2 arg3) $
return . fromIntegral
structureGetFourCC :: Structure
-> String
-> Maybe FourCC
structureGetFourCC =
marshalStructureGet (\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_fourcc argPtr1 arg2 arg3) $
return . fromIntegral
structureGetDouble :: Structure
-> String
-> Maybe Double
structureGetDouble =
marshalStructureGet (\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_double argPtr1 arg2 arg3) $
return . realToFrac
structureGetString :: Structure
-> String
-> Maybe String
structureGetString structure fieldname =
unsafePerformIO $
(withUTFString fieldname $ (\(Structure arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_string argPtr1 arg2) structure) >>=
maybePeek peekUTFString
structureGetDate :: Structure
-> String
-> Maybe GDate
structureGetDate =
marshalStructureGet (\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_date argPtr1 arg2 arg3) $
peek . castPtr
structureGetClockTime :: Structure
-> String
-> Maybe ClockTime
structureGetClockTime =
marshalStructureGet (\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_clock_time argPtr1 arg2 arg3) $
return . fromIntegral
structureGetFraction :: Structure
-> String
-> Maybe Fraction
structureGetFraction structure fieldname =
unsafePerformIO $
alloca $ \numPtr -> alloca $ \denPtr ->
withUTFString fieldname $ \cFieldname ->
do result <- (\(Structure arg1) arg2 arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_get_fraction argPtr1 arg2 arg3 arg4) structure cFieldname numPtr denPtr
if toBool result
then do num <- peek numPtr
den <- peek denPtr
return $ Just $ (fromIntegral num) % (fromIntegral den)
else return Nothing
marshalStructureModify :: IO (Ptr Structure)
-> StructureM a
-> (Structure, a)
marshalStructureModify mkStructure (StructureM action) =
unsafePerformIO $
do ptr <- mkStructure
structure <- liftM Structure $ newForeignPtr_ ptr
result <- action structure
structure' <- takeStructure ptr
return (structure', result)
structureCreate :: String
-> StructureM a
-> (Structure, a)
structureCreate name action =
marshalStructureModify
(withUTFString name gst_structure_empty_new)
action
structureModify :: Structure
-> StructureM a
-> (Structure, a)
structureModify structure action =
marshalStructureModify
((\(Structure arg1) -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_copy argPtr1) structure)
action
structureSetNameM :: String
-> StructureM ()
structureSetNameM name =
StructureM $ \structure ->
withUTFString name $ (\(Structure arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_set_name argPtr1 arg2) structure
structureRemoveFieldM :: String
-> StructureM ()
structureRemoveFieldM name =
StructureM $ \structure ->
withUTFString name $ (\(Structure arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_remove_field argPtr1 arg2) structure
marshalStructureSetM :: GType
-> (GValue -> a -> IO ())
-> String
-> a
-> StructureM ()
marshalStructureSetM valueType setGValue fieldname value =
StructureM $ \structure ->
withUTFString fieldname $ \cFieldname ->
allocaGValue $ \gValue ->
do valueInit gValue valueType
setGValue gValue value
(\(Structure arg1) arg2 (GValue arg3) -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_set_value argPtr1 arg2 arg3) structure cFieldname gValue
structureSetBoolM :: String
-> Bool
-> StructureM ()
structureSetBoolM =
marshalStructureSetM bool valueSetBool
structureSetIntM :: String
-> Int
-> StructureM ()
structureSetIntM =
marshalStructureSetM int valueSetInt
structureSetFourCCM :: String
-> FourCC
-> StructureM ()
structureSetFourCCM =
marshalStructureSetM fourcc $ \gValue fourcc ->
(\(GValue arg1) arg2 -> gst_value_set_fourcc arg1 arg2) gValue $ fromIntegral fourcc
structureSetDoubleM :: String
-> Double
-> StructureM ()
structureSetDoubleM =
marshalStructureSetM double valueSetDouble
structureSetStringM :: String
-> String
-> StructureM ()
structureSetStringM =
marshalStructureSetM string valueSetString
structureSetDateM :: String
-> GDate
-> StructureM ()
structureSetDateM =
marshalStructureSetM date $ \gValue date ->
with date $ ((\(GValue arg1) arg2 -> gst_value_set_date arg1 arg2) gValue) . castPtr
structureSetClockTimeM :: String
-> ClockTime
-> StructureM ()
structureSetClockTimeM =
marshalStructureSetM uint64 $ \gValue clockTime ->
(\(GValue arg1) arg2 -> g_value_set_uint64 arg1 arg2) gValue $ fromIntegral clockTime
structureSetFractionM :: String
-> Fraction
-> StructureM ()
structureSetFractionM =
marshalStructureSetM fraction $ \gValue fraction ->
(\(GValue arg1) arg2 arg3 -> gst_value_set_fraction arg1 arg2 arg3) gValue
(fromIntegral $ numerator fraction)
(fromIntegral $ denominator fraction)
marshalStructureFixateM :: (Structure -> CString -> a -> IO (CInt))
-> String
-> a
-> StructureM Bool
marshalStructureFixateM fixate fieldname target =
StructureM $ \structure ->
withUTFString fieldname $ \cFieldname ->
liftM toBool $
fixate structure cFieldname target
structureFixateFieldNearestIntM :: String
-> Int
-> StructureM Bool
structureFixateFieldNearestIntM =
marshalStructureFixateM $ \structure cFieldname target ->
(\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_fixate_field_nearest_int argPtr1 arg2 arg3)
structure
cFieldname
(fromIntegral target)
structureFixateFieldNearestDoubleM :: String
-> Double
-> StructureM Bool
structureFixateFieldNearestDoubleM =
marshalStructureFixateM $ \structure cFieldname target ->
(\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_fixate_field_nearest_double argPtr1 arg2 arg3)
structure
cFieldname
(realToFrac target)
structureFixateFieldNearestFractionM :: String
-> Fraction
-> StructureM Bool
structureFixateFieldNearestFractionM =
marshalStructureFixateM $ \structure cFieldname target ->
(\(Structure arg1) arg2 arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_fixate_field_nearest_fraction argPtr1 arg2 arg3 arg4)
structure
cFieldname
(fromIntegral $ numerator target)
(fromIntegral $ denominator target)
structureFixateFieldBoolM :: String
-> Bool
-> StructureM Bool
structureFixateFieldBoolM =
marshalStructureFixateM $ \structure cFieldname target ->
(\(Structure arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gst_structure_fixate_field_boolean argPtr1 arg2 arg3)
structure
cFieldname
(fromBool target)
fourcc = gst_fourcc_get_type
date = gst_date_get_type
fraction = gst_fraction_get_type
foreign import ccall safe "gst_structure_empty_new"
gst_structure_empty_new :: ((Ptr CChar) -> (IO (Ptr Structure)))
foreign import ccall safe "gst_structure_to_string"
gst_structure_to_string :: ((Ptr Structure) -> (IO (Ptr CChar)))
foreign import ccall safe "gst_structure_from_string"
gst_structure_from_string :: ((Ptr CChar) -> ((Ptr (Ptr CChar)) -> (IO (Ptr Structure))))
foreign import ccall safe "g_utf8_pointer_to_offset"
g_utf8_pointer_to_offset :: ((Ptr CChar) -> ((Ptr CChar) -> (IO CLong)))
foreign import ccall safe "gst_structure_get_name"
gst_structure_get_name :: ((Ptr Structure) -> (IO (Ptr CChar)))
foreign import ccall safe "gst_structure_has_name"
gst_structure_has_name :: ((Ptr Structure) -> ((Ptr CChar) -> (IO CInt)))
foreign import ccall safe "gst_structure_get_boolean"
gst_structure_get_boolean :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr CInt) -> (IO CInt))))
foreign import ccall safe "gst_structure_get_int"
gst_structure_get_int :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr CInt) -> (IO CInt))))
foreign import ccall safe "gst_structure_get_fourcc"
gst_structure_get_fourcc :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr CUInt) -> (IO CInt))))
foreign import ccall safe "gst_structure_get_double"
gst_structure_get_double :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr CDouble) -> (IO CInt))))
foreign import ccall safe "gst_structure_get_string"
gst_structure_get_string :: ((Ptr Structure) -> ((Ptr CChar) -> (IO (Ptr CChar))))
foreign import ccall safe "gst_structure_get_date"
gst_structure_get_date :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr (Ptr ())) -> (IO CInt))))
foreign import ccall safe "gst_structure_get_clock_time"
gst_structure_get_clock_time :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr CULLong) -> (IO CInt))))
foreign import ccall safe "gst_structure_get_fraction"
gst_structure_get_fraction :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr CInt) -> ((Ptr CInt) -> (IO CInt)))))
foreign import ccall safe "gst_structure_copy"
gst_structure_copy :: ((Ptr Structure) -> (IO (Ptr Structure)))
foreign import ccall safe "gst_structure_set_name"
gst_structure_set_name :: ((Ptr Structure) -> ((Ptr CChar) -> (IO ())))
foreign import ccall safe "gst_structure_remove_field"
gst_structure_remove_field :: ((Ptr Structure) -> ((Ptr CChar) -> (IO ())))
foreign import ccall safe "gst_structure_set_value"
gst_structure_set_value :: ((Ptr Structure) -> ((Ptr CChar) -> ((Ptr GValue) -> (IO ()))))
foreign import ccall safe "gst_value_set_fourcc"
gst_value_set_fourcc :: ((Ptr GValue) -> (CUInt -> (IO ())))
foreign import ccall safe "gst_value_set_date"
gst_value_set_date :: ((Ptr GValue) -> ((Ptr ()) -> (IO ())))
foreign import ccall safe "g_value_set_uint64"
g_value_set_uint64 :: ((Ptr GValue) -> (CULLong -> (IO ())))
foreign import ccall safe "gst_value_set_fraction"
gst_value_set_fraction :: ((Ptr GValue) -> (CInt -> (CInt -> (IO ()))))
foreign import ccall safe "gst_structure_fixate_field_nearest_int"
gst_structure_fixate_field_nearest_int :: ((Ptr Structure) -> ((Ptr CChar) -> (CInt -> (IO CInt))))
foreign import ccall safe "gst_structure_fixate_field_nearest_double"
gst_structure_fixate_field_nearest_double :: ((Ptr Structure) -> ((Ptr CChar) -> (CDouble -> (IO CInt))))
foreign import ccall safe "gst_structure_fixate_field_nearest_fraction"
gst_structure_fixate_field_nearest_fraction :: ((Ptr Structure) -> ((Ptr CChar) -> (CInt -> (CInt -> (IO CInt)))))
foreign import ccall safe "gst_structure_fixate_field_boolean"
gst_structure_fixate_field_boolean :: ((Ptr Structure) -> ((Ptr CChar) -> (CInt -> (IO CInt))))
foreign import ccall safe "gst_fourcc_get_type"
gst_fourcc_get_type :: CUInt
foreign import ccall safe "gst_date_get_type"
gst_date_get_type :: CUInt
foreign import ccall safe "gst_fraction_get_type"
gst_fraction_get_type :: CUInt