{-# OPTIONS -fglasgow-exts #-} module AVCodec where #include "ffmpeg/avcodec.h" #include "ffmpeg/avutil.h" import Data.Int import Data.Word import Foreign.Ptr import Foreign.C.String import Foreign.Storable -- * CodecType #enum Int32, , CODEC_TYPE_UNKNOWN, CODEC_TYPE_VIDEO, CODEC_TYPE_AUDIO, CODEC_TYPE_DATA, CODEC_TYPE_SUBTITLE -- * AVCodecContext newtype AVCodecContext = AVCodecContext (Ptr AVCodecContext) codecName :: AVCodecContext -> IO String codecName (AVCodecContext ccPtr) = peekCString (#{ptr AVCodecContext, codec_name} ccPtr) codecType :: AVCodecContext -> IO #{type enum CodecType} codecType (AVCodecContext ccPtr) = #{peek AVCodecContext, codec_type} ccPtr codecId :: AVCodecContext -> IO #{type enum CodecID} codecId (AVCodecContext ccPtr) = #{peek AVCodecContext, codec_id} ccPtr pictureWidth :: AVCodecContext -> IO Int pictureWidth (AVCodecContext ccPtr) = #{peek AVCodecContext, width} ccPtr pictureHeight :: AVCodecContext -> IO Int pictureHeight (AVCodecContext ccPtr) = #{peek AVCodecContext, height} ccPtr pixFmt :: AVCodecContext -> IO Int pixFmt (AVCodecContext ccPtr) = #{peek AVCodecContext, pix_fmt} ccPtr -- * newtype AVCodec = AVCodec (Ptr AVCodec) newtype AVPicture = AVPicture (Ptr AVPicture) -- * AVFrame newtype AVFrame = AVFrame (Ptr AVFrame) castAVFrameToAVPicture (AVFrame ptr) = (AVPicture (castPtr ptr)) frameData :: AVFrame -> IO (Ptr Word8) frameData (AVFrame ptr) = #{peek AVFrame, data} ptr foreign import ccall unsafe "avcodec_find_decoder" c_findDecoder :: #{type enum CodecID} -> IO AVCodec foreign import ccall unsafe "avcodec_open" open :: AVCodecContext -> AVCodec -> IO Int foreign import ccall unsafe "avcodec_alloc_frame" allocFrame :: IO AVFrame -- FIXME: could this be null ? foreign import ccall unsafe "avcodec_decode_video" decodeVideo :: AVCodecContext -> AVFrame -> Ptr Int -> Ptr Word8 -> Int -> IO Int foreign import ccall unsafe "img_convert" imgConvert :: AVPicture -> Int -> AVPicture -> Int -> Int -> Int -> IO Int foreign import ccall unsafe "avpicture_get_size" pictureGetSize :: Int -> Int -> Int -> Int foreign import ccall unsafe "avpicture_fill" pictureFill :: AVPicture -> Ptr Word8 -> Int -> Int -> Int -> IO Int foreign import ccall unsafe "avcodec_close" close :: AVCodecContext -> IO Int findDecoder :: #{type enum CodecID} -> IO (Maybe AVCodec) findDecoder codecId = do avcPtr@(AVCodec ptr) <- c_findDecoder codecId if ptr == nullPtr then return Nothing else return (Just avcPtr) -- * PixelFormat #enum Int, , PIX_FMT_NONE, PIX_FMT_YUV420P, PIX_FMT_YUYV422, PIX_FMT_RGB24, PIX_FMT_BGR24, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_RGB32, PIX_FMT_YUV410P, PIX_FMT_YUV411P, PIX_FMT_RGB565, PIX_FMT_RGB555, PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, PIX_FMT_MONOBLACK, PIX_FMT_PAL8, PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_XVMC_MPEG2_MC, PIX_FMT_XVMC_MPEG2_IDCT, PIX_FMT_UYVY422, PIX_FMT_UYYVYY411, PIX_FMT_NB