packages feed

hs-ffmpeg-0.2.3: src/Media/FFMpeg/Internals/Utils.hsc

-- -*- haskell -*- 
{-# LANGUAGE ForeignFunctionInterface #-}

{- | Module 'Media.FFMpeg.Internals.Utils' implements 
   utility functions from libAVUtil library
   
   (c) 2009 Vasyl Pasternak
 -}

module Media.FFMpeg.Internals.Utils 
    (
     PixelFormat (..)
    ,avMalloc
    ,avFree
    ,mkFinalizerPtr

    -- Buffer datatype
    ,Buffer
    ,withBuffer
    ,allocBuffer
    ,makeBuffer
    )where

import Foreign
import Media.FFMpeg.Internals.Types

#include "libavutil/avutil.h"
#include "macros.hsc2hs.h"

-- |PixelFormat enumeration
#{begin_enum PixelFormat, PIX_FMT_NONE}
#{add_enum PIX_FMT_YUV420P}
#{add_enum PIX_FMT_YUYV422}
#{add_enum PIX_FMT_RGB24}
#{add_enum PIX_FMT_BGR24}
#{add_enum PIX_FMT_YUV422P}
#{add_enum PIX_FMT_YUV444P}
#{add_enum PIX_FMT_YUV410P}
#{add_enum PIX_FMT_YUV411P}
#{add_enum PIX_FMT_GRAY8}
#{add_enum PIX_FMT_MONOWHITE}
#{add_enum PIX_FMT_MONOBLACK}
#{add_enum PIX_FMT_PAL8}
#{add_enum PIX_FMT_YUVJ420P}
#{add_enum PIX_FMT_YUVJ422P}
#{add_enum PIX_FMT_YUVJ444P}
#{add_enum PIX_FMT_XVMC_MPEG2_MC}
#{add_enum PIX_FMT_XVMC_MPEG2_IDCT}
#{add_enum PIX_FMT_UYVY422}
#{add_enum PIX_FMT_UYYVYY411}
#{add_enum PIX_FMT_BGR8}
#{add_enum PIX_FMT_BGR4}
#{add_enum PIX_FMT_BGR4_BYTE}
#{add_enum PIX_FMT_RGB8}
#{add_enum PIX_FMT_RGB4}
#{add_enum PIX_FMT_RGB4_BYTE}
#{add_enum PIX_FMT_NV12}
#{add_enum PIX_FMT_NV21}
#{add_enum PIX_FMT_ARGB}
#{add_enum PIX_FMT_RGBA}
#{add_enum PIX_FMT_ABGR}
#{add_enum PIX_FMT_BGRA}
#{add_enum PIX_FMT_GRAY16BE}
#{add_enum PIX_FMT_GRAY16LE}
#{add_enum PIX_FMT_YUV440P}
#{add_enum PIX_FMT_YUVJ440P}
#{add_enum PIX_FMT_YUVA420P}
#{add_enum PIX_FMT_VDPAU_H264}
#{add_enum PIX_FMT_VDPAU_MPEG1}
#{add_enum PIX_FMT_VDPAU_MPEG2}
#{add_enum PIX_FMT_VDPAU_WMV3}
#{add_enum PIX_FMT_VDPAU_VC1}
#{add_enum PIX_FMT_RGB48BE}
#{add_enum PIX_FMT_RGB48LE}
#{add_enum PIX_FMT_RGB565BE}
#{add_enum PIX_FMT_RGB565LE}
#{add_enum PIX_FMT_RGB555BE}
#{add_enum PIX_FMT_RGB555LE}
#{add_enum PIX_FMT_BGR565BE}
#{add_enum PIX_FMT_BGR565LE}
#{add_enum PIX_FMT_BGR555BE}
#{add_enum PIX_FMT_BGR555LE}
#{add_enum PIX_FMT_VAAPI_MOCO}
#{add_enum PIX_FMT_VAAPI_IDCT}
#{add_enum PIX_FMT_VAAPI_VLD}
#{add_enum PIX_FMT_NB}
#{add_enum PIX_FMT_RGB32}
#{add_enum PIX_FMT_RGB32_1}
#{add_enum PIX_FMT_BGR32}
#{add_enum PIX_FMT_BGR32_1}
#{add_enum PIX_FMT_GRAY16}
#{add_enum PIX_FMT_RGB48}
#{add_enum PIX_FMT_RGB565}
#{add_enum PIX_FMT_RGB555}
#{add_enum PIX_FMT_BGR565}
#{add_enum PIX_FMT_BGR555}
#{end_enum "Eq, Ord, Show"}

foreign import ccall "av_malloc" _malloc :: UInt -> IO VoidP
foreign import ccall "av_free" avFree :: Ptr a -> IO ()

avMalloc :: Integral a => a -> IO (Maybe VoidP)
avMalloc a = do 
  ptr <- _malloc (fromIntegral a)
  return $ if ptr == nullPtr then Nothing else Just ptr 

foreign import ccall "wrapper" mkFinalizerPtr :: 
    (Ptr a -> IO ()) -> IO (FunPtr (Ptr a -> IO ()))


-- |Buffer type. 
newtype Buffer = Buffer (ForeignPtr Buffer)

withBuffer :: Buffer -> (Ptr a -> IO b) -> IO b
withBuffer (Buffer b) clos = withForeignPtr b (clos . castPtr)

allocBuffer :: Int -> IO Buffer
allocBuffer size = do
  p <- throwIf (== nullPtr)
               (\_ -> "allocBuffer: failed to allocate buffer")
               (_malloc (fromIntegral size))
  finalizer <- mkFinalizerPtr avFree
  newForeignPtr finalizer p >>= return . Buffer . castForeignPtr

makeBuffer :: Ptr a -> IO Buffer
makeBuffer p = newForeignPtr_ p >>= return . Buffer . castForeignPtr