diff --git a/hs-ffmpeg.cabal b/hs-ffmpeg.cabal
--- a/hs-ffmpeg.cabal
+++ b/hs-ffmpeg.cabal
@@ -1,5 +1,5 @@
 name:           hs-ffmpeg
-version:        0.2.3
+version:        0.3.2
 cabal-version:  >= 1.6
 license:        BSD3
 author:         Vasyl Pasternak
@@ -7,29 +7,30 @@
 maintainer:     vasylpasternak@gmail.com
 description:    Bindings to FFMPEG library
 copyright:      (c) 2009 Vasyl Pasternak
+homepage:       http://patch-tag.com/r/VasylPasternak/hs-ffmpeg
+bug-reports:    http://code.google.com/p/hs-ffmpeg/issues/list
 stability:      alpha
 category:       Media
 
+
 build-type:     Simple
 extra-source-files: src/macros.hsc2hs.h
 
 library
-        build-depends:   base < 4, haskell98
+        build-depends:   base < 4, haskell98, bytestring
         hs-source-dirs:  src
         include-dirs:    /usr/local/include
                          src
         exposed-modules: Media.FFMpeg
-                         Media.FFMpeg.Types
                          Media.FFMpeg.Format
-                         Media.FFMpeg.Version
-                         Media.FFMpeg.Scale
-        other-modules:   Media.FFMpeg.Internals
-                         Media.FFMpeg.Internals.Types
-                         Media.FFMpeg.Internals.Utils
-                         Media.FFMpeg.Internals.AVFormat
-                         Media.FFMpeg.Internals.AVCodec
-                         Media.FFMpeg.Internals.SWScale
-        c-sources:       src/Media/FFMpeg/Internals/_c_utils.c
+                         Media.FFMpeg.SWScale
+                         Media.FFMpeg.Util
+                         Media.FFMpeg.Codec
+        other-modules:   Media.FFMpeg.UtilEnums_
+                         Media.FFMpeg.CodecEnums_
+                         Media.FFMpeg.SWScaleEnums_
+                         Media.FFMpeg.Common
+        c-sources:       src/Media/FFMpeg/_c_utils.c
         extra-lib-dirs:  /usr/local/lib
         extra-libraries: avformat, avcodec, avutil, avfilter,
                          avdevice, swscale, vorbisfile, vorbis, vorbisenc, 
diff --git a/src/Media/FFMpeg.hs b/src/Media/FFMpeg.hs
--- a/src/Media/FFMpeg.hs
+++ b/src/Media/FFMpeg.hs
@@ -6,11 +6,13 @@
 
 module Media.FFMpeg
     (
-     module Media.FFMpeg.Version
-    ,module Media.FFMpeg.Format
+     module Media.FFMpeg.Format
+    ,module Media.FFMpeg.Codec
+    ,module Media.FFMpeg.Util
     ) where
 
-import Media.FFMpeg.Version
 import Media.FFMpeg.Format
+import Media.FFMpeg.Codec
+import Media.FFMpeg.Util
 
 
diff --git a/src/Media/FFMpeg/Codec.hsc b/src/Media/FFMpeg/Codec.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/Codec.hsc
@@ -0,0 +1,407 @@
+-- -*- haskell -*-
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+{- |Module 'Media.FFMpeg.Codec' implements bindings to AVCodec library
+
+   (c) 2009 Vasyl Pasternak
+ -}
+
+module Media.FFMpeg.Codec 
+    (
+     libAVCodecVersion
+
+    ,module Media.FFMpeg.CodecEnums_
+
+    ,WithCodecId (..)
+    ,WithCodecType (..)
+    ,WithVideoProps (..)
+    ,WithAudioProps (..)
+
+    ,CodecContext
+    ,toCodecContext
+
+    ,Codec
+    ,openCodec
+    ,findDecoder
+    ,decodeVideo
+    ,decodeAudio
+    ,decodeAudioPacket
+    ,maxAudioFrameSize
+    ,decodeAudioPacket'
+
+    ,CommonPicture (..)
+    ,pictureGetSize
+
+    ,Frame
+    ,allocFrame
+
+    ,Packet
+    ,allocPacket
+    ,newPacket
+    ,cleanPacket
+    ,dupPacket
+    ,packetGetStreamIndex
+    ,packetGetSize
+    ,packetGetBuffer
+    ,packetSetBuffer
+    )where
+
+#include "libavcodec/avcodec.h"
+
+import Foreign
+import Foreign.C.Types
+import Foreign.C.String
+import Control.Monad (liftM)
+import Text.Printf
+import Data.Version
+import Data.ByteString (ByteString, append, packCStringLen)
+
+import Media.FFMpeg.Common
+import Media.FFMpeg.Util
+import Media.FFMpeg.CodecEnums_
+
+libAVCodecVersion :: Version
+libAVCodecVersion = Version {
+                      versionBranch = [
+                       #{const LIBAVCODEC_VERSION_MAJOR},
+                       #{const LIBAVCODEC_VERSION_MINOR},
+                       #{const LIBAVCODEC_VERSION_MICRO}
+                      ],
+                      versionTags = []
+                    }
+
+--
+-- | properties classes
+--
+class WithCodecId a where
+    getCodecId :: a -> CodecId
+
+class WithCodecType a where
+    getCodecType :: a -> CodecType
+
+class WithVideoProps a where
+    getVideoWidth :: a -> Int
+    getVideoHeight :: a -> Int
+    getPixelFormat :: a -> PixelFormat
+
+class WithAudioProps a where
+    getAudioSampleRate :: a -> Int
+    getAudioChannels :: a -> Int
+    getAudioSampleFormat :: a -> SampleFormat
+
+-- 
+-- | CodecContext -- wrapper to AVCodecContext
+--
+newtype CodecContext = CodecContext (ForeignPtr CodecContext)
+
+instance ExternalPointer CodecContext where
+    withThis (CodecContext ctx) io = withForeignPtr ctx (io . castPtr)
+
+--
+-- | convert poiner to CodecContext
+toCodecContext :: Ptr a -> IO CodecContext
+toCodecContext =  liftM CodecContext . newForeignPtr_ . castPtr
+
+_unsafeGetValue :: ExternalPointer p => p -> (Ptr a -> IO b) -> b
+_unsafeGetValue extp io = unsafePerformIO $ withThis extp io
+
+instance WithCodecId CodecContext where
+    getCodecId ctx = _unsafeGetValue ctx $ \ctx' ->
+                     liftM cToEnum 
+                     (#{peek AVCodecContext, codec_id} ctx' :: IO #{type enum CodecID})
+
+instance WithCodecType CodecContext where
+    getCodecType ctx = _unsafeGetValue ctx $ \ctx' ->
+                       liftM cToEnum 
+                       (#{peek AVCodecContext, codec_type} ctx' :: IO #{type enum CodecType})
+
+instance WithVideoProps CodecContext where
+    getVideoWidth ctx = _unsafeGetValue ctx $ \ctx' ->
+                        liftM cToInt 
+                                  (#{peek AVCodecContext, width} ctx' :: IO CInt)
+                        
+
+    getVideoHeight ctx = _unsafeGetValue ctx $ \ctx' -> 
+                         liftM cToInt 
+                                   (#{peek AVCodecContext, height} ctx' :: IO CInt)
+
+    getPixelFormat ctx = _unsafeGetValue ctx $ \ctx' -> 
+                         liftM cToEnum
+                               (#{peek AVCodecContext, pix_fmt} ctx' :: IO #{type enum PixelFormat})
+
+instance WithAudioProps CodecContext where
+    getAudioSampleRate ctx = _unsafeGetValue ctx $ \ctx' ->
+                             liftM cToInt (#{peek AVCodecContext, sample_rate} ctx' :: IO CInt)
+
+    getAudioChannels ctx = _unsafeGetValue ctx $ \ctx' ->
+                           liftM cToInt (#{peek AVCodecContext, channels} ctx' :: IO CInt)
+
+    getAudioSampleFormat ctx = _unsafeGetValue ctx $ \ctx' ->
+                               liftM cToEnum 
+                                         (#{peek AVCodecContext, sample_fmt} ctx' :: IO #{type enum SampleFormat})
+
+--
+-- | Codec - implementation of AVCodec
+--
+newtype Codec = Codec (Ptr Codec)
+
+instance ExternalPointer Codec where
+    withThis (Codec c) io = io (castPtr c)
+
+instance WithCodecId Codec where
+    getCodecId c = _unsafeGetValue c $ \c' ->
+                   liftM cToEnum 
+                   (#{peek AVCodec, id} c' :: IO #{type enum CodecID})
+
+instance WithCodecType Codec where
+    getCodecType c = _unsafeGetValue c $ \c' ->
+                     liftM cToEnum
+                     (#{peek AVCodec, type} c' :: IO #{type enum CodecType})
+
+--
+-- | openCodec - opens codec due to CodecContext
+--
+foreign import ccall "avcodec_open" _avcodec_open :: Ptr () -> Ptr () -> IO CInt
+foreign import ccall "avcodec_close" _avcodec_close :: Ptr () -> IO ()
+
+openCodec :: CodecContext -> Codec -> IO ()
+openCodec ctx @ (CodecContext ct) codec =
+    withThis ctx $ \ctx' ->
+        withThis codec $ \codec' -> do
+          throwIf_ (<0)
+                   (printf "openCodec: fails to open codec '%s' - errocode %d\n" (show (getCodecId codec)) . cToInt)  
+                   (_avcodec_open ctx' codec')
+          finalizer <- mkFinalizerPtr _avcodec_close
+          addForeignPtrFinalizer finalizer (castForeignPtr ct)
+
+--
+-- |findDecoder - finds decoder by CodecId
+--
+foreign import ccall "avcodec_find_decoder" _avcodec_find_decoder :: 
+    #{type enum CodecID} -> IO (Ptr ())
+
+findDecoder :: CodecId -> IO (Maybe Codec)
+findDecoder cid = do
+  liftM (maybe Nothing (Just . Codec . castPtr) . justPtr)
+        (_avcodec_find_decoder (cFromEnum cid))
+
+
+--
+-- |decodeVideo -- decodes video frame, returns True if
+-- complete picture is decompressed
+--
+foreign import ccall "avcodec_decode_video2" _avcodec_decode_video :: 
+    Ptr () -> Ptr () -> (Ptr CInt) -> Ptr () -> IO CInt
+
+decodeVideo :: CodecContext -> Frame -> Packet -> IO Bool
+decodeVideo ctx frm pkt =
+    withThis ctx $ \ctx' -> 
+    withThis frm $ \frm' -> 
+    withThis pkt $ \pkt' ->
+    alloca $ \gotPic' -> do
+      throwIf (<0)
+              (printf "decodeVideo: failed to decode video packet: %d" . cToInt)
+              (_avcodec_decode_video ctx' frm' gotPic' pkt')
+      liftM (>0) (peek gotPic')
+
+
+--
+-- |decodeAudio - decodes audio frame to the existing buffer
+-- return (ReadBytes, DecodedBytes)
+--
+foreign import ccall "avcodec_decode_audio3" _avcodec_decode_audio :: 
+    Ptr () -> Ptr () -> (Ptr CInt) -> Ptr () -> IO CInt
+
+decodeAudio :: CodecContext -> Buffer -> Packet -> IO (Int, Int)
+decodeAudio ctx buf pkt = 
+    withThis ctx $ \ctx' -> 
+    withThis buf $ \buf' ->
+    withThis pkt $ \pkt' -> 
+    with bufSize $ \frm_size -> do
+      result <- throwIf (<0)
+                (printf "decodeAudio: decode packet failed. Return value is %d" . cToInt)
+                (liftM cToInt $ _avcodec_decode_audio ctx' buf' frm_size pkt')
+      liftM ((,) result . cToInt) $ peek frm_size
+    where bufSize = cFromInt $ bufferSize buf :: CInt
+
+
+--
+-- | decodeAudio is very complex to use, the another version of the 
+-- same function is decode audio packet. It decodes packets into a list of
+-- buffers with max size is set to 'size'. 
+--
+
+decodeAudioPacket :: Int -> CodecContext -> Packet -> IO ByteString
+decodeAudioPacket buffSize ctx pkt = dupPacket pkt >> fillBuffer 
+    where 
+      shiftPacket size = packetSetBuffer pkt =<< 
+                         shiftBuffer size (packetGetBuffer pkt)
+      copyToByteString buf size = 
+          withBuffer buf $ \buf' ->
+              packCStringLen (castPtr buf', size)
+
+      fillBuffer = do
+        buf <- allocBuffer buffSize
+        (r, w) <- decodeAudio ctx buf pkt
+        result <- copyToByteString buf w
+        if r < (packetGetSize pkt) then do
+                    shiftPacket r
+                    rest <- fillBuffer
+                    return $  result `append` rest
+                  else return $ result
+      
+
+maxAudioFrameSize :: Int
+maxAudioFrameSize = #{const AVCODEC_MAX_AUDIO_FRAME_SIZE}
+
+--
+-- | decodeAudioPacket' - defaults the buffer size to 2048
+--
+decodeAudioPacket' :: CodecContext -> Packet -> IO ByteString
+decodeAudioPacket' = decodeAudioPacket maxAudioFrameSize
+
+--
+-- |AVPicture
+--
+
+foreign import ccall "avpicture_fill" _avpicture_fill ::
+    Ptr () -> Ptr () -> CInt -> CInt -> CInt -> IO CInt
+
+class ExternalPointer pic => CommonPicture pic where
+    pictureFill :: pic -> Buffer -> PixelFormat -> Int -> Int -> IO ()
+    pictureFill pic buf pf w h =
+        withThis pic $ \pic' -> 
+        withThis buf $ \buf' ->
+        _avpicture_fill (castPtr pic') 
+             (castPtr buf')
+             (cFromEnum pf)
+             (cFromInt w) (cFromInt h) >> 
+        return ()
+
+    pictureGetSlice :: pic -> Ptr ()
+    pictureGetSlice pic = 
+        castPtr (_unsafeGetValue pic $ 
+                 return . (`plusPtr` #{offset AVPicture, data}))
+         
+    pictureGetStride :: pic -> Ptr ()
+    pictureGetStride pic = 
+        castPtr (_unsafeGetValue pic $
+                 return . (`plusPtr` #{offset AVPicture, linesize}))
+
+--
+-- |pictureGetSize -- calculate the size of the picture in bytes
+--
+foreign import ccall "avpicture_get_size" _avpicture_get_size :: 
+    #{type enum PixelFormat} -> CInt -> CInt -> IO CInt
+
+pictureGetSize :: PixelFormat -> Int -> Int -> Int
+pictureGetSize pf w h = cToInt $ unsafePerformIO 
+                        (_avpicture_get_size (cFromEnum pf) (cFromInt w) (cFromInt h))
+
+--
+-- |Frame - implementation of AVFrame
+--
+
+newtype Frame = Frame (ForeignPtr Frame)
+
+instance ExternalPointer Frame where
+    withThis (Frame f) io = withForeignPtr f (io . castPtr)
+
+instance CommonPicture Frame
+
+--
+-- |allocFrame - allocate frame structure
+--
+foreign import ccall "avcodec_alloc_frame" _avcodec_alloc_frame :: IO (Ptr ())
+
+allocFrame :: IO Frame
+allocFrame = do
+  p <- throwIf (== nullPtr)
+               (\_ -> "allocFrame: failed to allocate frame")
+               _avcodec_alloc_frame
+  liftM (Frame . castForeignPtr) $ newAvForeignPtr p
+
+--
+-- | Packet -- binding to AVPacket
+--
+
+newtype Packet = Packet (ForeignPtr Packet)
+
+instance ExternalPointer Packet where
+    withThis (Packet pkt) io = withForeignPtr pkt (io . castPtr)
+
+--
+-- |allocPacket -- allocates packet structure, but don't allocates the
+-- packet.data
+--
+
+foreign import ccall "av_init_packet" _av_init_packet :: Ptr () -> IO ()
+foreign import ccall "b_free_packet" _b_free_packet :: Ptr () -> IO ()
+
+
+allocPacket :: IO Packet
+allocPacket = do
+  p <- mallocBytes #{size AVPacket}
+  _av_init_packet p
+  pkt <- newAvForeignPtr p
+  deinit <- mkFinalizerPtr _b_free_packet 
+  addForeignPtrFinalizer deinit pkt
+  return (Packet $ castForeignPtr pkt)
+
+--
+-- |newPacket -- allocates packet with data
+-- 
+foreign import ccall "av_new_packet" _av_new_packet :: Ptr () -> CInt -> IO CInt
+
+newPacket :: Int -> IO Packet
+newPacket s = do
+  p <- mallocBytes #{size AVPacket}
+  throwIf (/= 0)
+          (printf "newPacket: error allocating new packet with size %d - %d" s . cToInt)
+          (_av_new_packet p (cFromInt s))
+  pkt <- newAvForeignPtr p
+  deinit <- mkFinalizerPtr _b_free_packet
+  addForeignPtrFinalizer deinit pkt
+  return (Packet $ castForeignPtr pkt)
+
+--
+-- | cleanPacket - cleans the packet manually
+--
+cleanPacket :: Packet -> IO ()
+cleanPacket pkt = withThis pkt _b_free_packet
+
+
+--
+-- | dupPacket -- if packet doesn't own the buffer, than it 
+-- creates new buffer, and copies data there
+--
+foreign import ccall "av_dup_packet" _av_dup_packet :: Ptr ()-> IO CInt
+
+dupPacket :: Packet -> IO ()
+dupPacket pkt = 
+    withThis pkt $ \pkt' -> 
+        throwIf (< 0)
+                (printf "dupPacket: failed to dup packet: %d" . cToInt)
+                (_av_dup_packet pkt') >> return ()
+
+packetGetStreamIndex :: Packet -> Int
+packetGetStreamIndex pkt = _unsafeGetValue pkt $ \pkt' ->
+                           liftM cToInt (#{peek AVPacket, stream_index} pkt' :: IO CInt)
+
+packetGetSize :: Packet -> Int
+packetGetSize pkt = _unsafeGetValue pkt $ \pkt' ->
+                    liftM cToInt (#{peek AVPacket, size} pkt' :: IO CInt)
+
+packetGetBuffer :: Packet -> Buffer
+packetGetBuffer pkt = 
+    _unsafeGetValue pkt $ \pkt' -> 
+        (#{peek AVPacket, data} pkt' :: IO (Ptr ())) >>= 
+        castBufferSize (packetGetSize pkt)
+
+packetSetBuffer :: Packet -> Buffer -> IO ()
+packetSetBuffer pkt buf = 
+    withBuffer buf $ \buf' ->
+    withThis pkt $ \pkt' -> do
+                            let bufSize = bufferSize buf
+                            #{poke AVPacket, size} pkt' ((cFromInt bufSize) :: CInt)
+                            #{poke AVPacket, data} pkt' (castPtr buf')
diff --git a/src/Media/FFMpeg/CodecEnums_.hsc b/src/Media/FFMpeg/CodecEnums_.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/CodecEnums_.hsc
@@ -0,0 +1,299 @@
+---- -*- haskell -*- 
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+{- | Module 'Media.FFMpeg.CodecEnums_' implements 
+    enumerations from libavcodec
+   
+   (c) 2009 Vasyl Pasternak
+ -}
+
+
+module Media.FFMpeg.CodecEnums_
+    (
+     CodecType (..)
+    ,SampleFormat (..)
+    ,CodecId (..)
+    ) where
+
+#include "libavcodec/avcodec.h"
+#include "macros.hsc2hs.h"
+
+--
+-- | CodecType
+--
+#{begin_enum CodecType, CODEC_TYPE_UNKNOWN}
+#{add_enum CODEC_TYPE_VIDEO}
+#{add_enum CODEC_TYPE_AUDIO}
+#{add_enum CODEC_TYPE_DATA}
+#{add_enum CODEC_TYPE_SUBTITLE}
+#{add_enum CODEC_TYPE_ATTACHMENT}
+#{add_enum CODEC_TYPE_NB}
+#{end_enum "Eq,Ord,Show"}
+
+-- 
+-- | SampleFormat
+--
+#{begin_enum SampleFormat, SAMPLE_FMT_NONE}
+#{add_enum SAMPLE_FMT_U8}
+#{add_enum SAMPLE_FMT_S16}
+#{add_enum SAMPLE_FMT_S32}
+#{add_enum SAMPLE_FMT_FLT}
+#{add_enum SAMPLE_FMT_DBL}
+#{add_enum SAMPLE_FMT_NB}
+#{end_enum "Eq,Ord,Show"}
+
+--
+-- | CodecId
+--
+#{begin_enum CodecId, CODEC_ID_NONE}
+#{add_enum CODEC_ID_MPEG1VIDEO}
+#{add_enum CODEC_ID_MPEG2VIDEO}
+#{add_enum CODEC_ID_MPEG2VIDEO_XVMC}
+#{add_enum CODEC_ID_H261}
+#{add_enum CODEC_ID_H263}
+#{add_enum CODEC_ID_RV10}
+#{add_enum CODEC_ID_RV20}
+#{add_enum CODEC_ID_MJPEG}
+#{add_enum CODEC_ID_MJPEGB}
+#{add_enum CODEC_ID_LJPEG}
+#{add_enum CODEC_ID_SP5X}
+#{add_enum CODEC_ID_JPEGLS}
+#{add_enum CODEC_ID_MPEG4}
+#{add_enum CODEC_ID_RAWVIDEO}
+#{add_enum CODEC_ID_MSMPEG4V1}
+#{add_enum CODEC_ID_MSMPEG4V2}
+#{add_enum CODEC_ID_MSMPEG4V3}
+#{add_enum CODEC_ID_WMV1}
+#{add_enum CODEC_ID_WMV2}
+#{add_enum CODEC_ID_H263P}
+#{add_enum CODEC_ID_H263I}
+#{add_enum CODEC_ID_FLV1}
+#{add_enum CODEC_ID_SVQ1}
+#{add_enum CODEC_ID_SVQ3}
+#{add_enum CODEC_ID_DVVIDEO}
+#{add_enum CODEC_ID_HUFFYUV}
+#{add_enum CODEC_ID_CYUV}
+#{add_enum CODEC_ID_H264}
+#{add_enum CODEC_ID_INDEO3}
+#{add_enum CODEC_ID_VP3}
+#{add_enum CODEC_ID_THEORA}
+#{add_enum CODEC_ID_ASV1}
+#{add_enum CODEC_ID_ASV2}
+#{add_enum CODEC_ID_FFV1}
+#{add_enum CODEC_ID_4XM}
+#{add_enum CODEC_ID_VCR1}
+#{add_enum CODEC_ID_CLJR}
+#{add_enum CODEC_ID_MDEC}
+#{add_enum CODEC_ID_ROQ}
+#{add_enum CODEC_ID_INTERPLAY_VIDEO}
+#{add_enum CODEC_ID_XAN_WC3}
+#{add_enum CODEC_ID_XAN_WC4}
+#{add_enum CODEC_ID_RPZA}
+#{add_enum CODEC_ID_CINEPAK}
+#{add_enum CODEC_ID_WS_VQA}
+#{add_enum CODEC_ID_MSRLE}
+#{add_enum CODEC_ID_MSVIDEO1}
+#{add_enum CODEC_ID_IDCIN}
+#{add_enum CODEC_ID_8BPS}
+#{add_enum CODEC_ID_SMC}
+#{add_enum CODEC_ID_FLIC}
+#{add_enum CODEC_ID_TRUEMOTION1}
+#{add_enum CODEC_ID_VMDVIDEO}
+#{add_enum CODEC_ID_MSZH}
+#{add_enum CODEC_ID_ZLIB}
+#{add_enum CODEC_ID_QTRLE}
+#{add_enum CODEC_ID_SNOW}
+#{add_enum CODEC_ID_TSCC}
+#{add_enum CODEC_ID_ULTI}
+#{add_enum CODEC_ID_QDRAW}
+#{add_enum CODEC_ID_VIXL}
+#{add_enum CODEC_ID_QPEG}
+#{add_enum CODEC_ID_XVID}
+#{add_enum CODEC_ID_PNG}
+#{add_enum CODEC_ID_PPM}
+#{add_enum CODEC_ID_PBM}
+#{add_enum CODEC_ID_PGM}
+#{add_enum CODEC_ID_PGMYUV}
+#{add_enum CODEC_ID_PAM}
+#{add_enum CODEC_ID_FFVHUFF}
+#{add_enum CODEC_ID_RV30}
+#{add_enum CODEC_ID_RV40}
+#{add_enum CODEC_ID_VC1}
+#{add_enum CODEC_ID_WMV3}
+#{add_enum CODEC_ID_LOCO}
+#{add_enum CODEC_ID_WNV1}
+#{add_enum CODEC_ID_AASC}
+#{add_enum CODEC_ID_INDEO2}
+#{add_enum CODEC_ID_FRAPS}
+#{add_enum CODEC_ID_TRUEMOTION2}
+#{add_enum CODEC_ID_BMP}
+#{add_enum CODEC_ID_CSCD}
+#{add_enum CODEC_ID_MMVIDEO}
+#{add_enum CODEC_ID_ZMBV}
+#{add_enum CODEC_ID_AVS}
+#{add_enum CODEC_ID_SMACKVIDEO}
+#{add_enum CODEC_ID_NUV}
+#{add_enum CODEC_ID_KMVC}
+#{add_enum CODEC_ID_FLASHSV}
+#{add_enum CODEC_ID_CAVS}
+#{add_enum CODEC_ID_JPEG2000}
+#{add_enum CODEC_ID_VMNC}
+#{add_enum CODEC_ID_VP5}
+#{add_enum CODEC_ID_VP6}
+#{add_enum CODEC_ID_VP6F}
+#{add_enum CODEC_ID_TARGA}
+#{add_enum CODEC_ID_DSICINVIDEO}
+#{add_enum CODEC_ID_TIERTEXSEQVIDEO}
+#{add_enum CODEC_ID_TIFF}
+#{add_enum CODEC_ID_GIF}
+#{add_enum CODEC_ID_FFH264}
+#{add_enum CODEC_ID_DXA}
+#{add_enum CODEC_ID_DNXHD}
+#{add_enum CODEC_ID_THP}
+#{add_enum CODEC_ID_SGI}
+#{add_enum CODEC_ID_C93}
+#{add_enum CODEC_ID_BETHSOFTVID}
+#{add_enum CODEC_ID_PTX}
+#{add_enum CODEC_ID_TXD}
+#{add_enum CODEC_ID_VP6A}
+#{add_enum CODEC_ID_AMV}
+#{add_enum CODEC_ID_VB}
+#{add_enum CODEC_ID_PCX}
+#{add_enum CODEC_ID_SUNRAST}
+#{add_enum CODEC_ID_INDEO4}
+#{add_enum CODEC_ID_INDEO5}
+#{add_enum CODEC_ID_MIMIC}
+#{add_enum CODEC_ID_RL2}
+#{add_enum CODEC_ID_8SVX_EXP}
+#{add_enum CODEC_ID_8SVX_FIB}
+#{add_enum CODEC_ID_ESCAPE124}
+#{add_enum CODEC_ID_DIRAC}
+#{add_enum CODEC_ID_BFI}
+#{add_enum CODEC_ID_CMV}
+#{add_enum CODEC_ID_MOTIONPIXELS}
+#{add_enum CODEC_ID_TGV}
+#{add_enum CODEC_ID_TGQ}
+#{add_enum CODEC_ID_TQI}
+#{add_enum CODEC_ID_AURA}
+#{add_enum CODEC_ID_AURA2}
+#{add_enum CODEC_ID_PCM_S16LE}
+#{add_enum CODEC_ID_PCM_S16BE}
+#{add_enum CODEC_ID_PCM_U16LE}
+#{add_enum CODEC_ID_PCM_U16BE}
+#{add_enum CODEC_ID_PCM_S8}
+#{add_enum CODEC_ID_PCM_U8}
+#{add_enum CODEC_ID_PCM_MULAW}
+#{add_enum CODEC_ID_PCM_ALAW}
+#{add_enum CODEC_ID_PCM_S32LE}
+#{add_enum CODEC_ID_PCM_S32BE}
+#{add_enum CODEC_ID_PCM_U32LE}
+#{add_enum CODEC_ID_PCM_U32BE}
+#{add_enum CODEC_ID_PCM_S24LE}
+#{add_enum CODEC_ID_PCM_S24BE}
+#{add_enum CODEC_ID_PCM_U24LE}
+#{add_enum CODEC_ID_PCM_U24BE}
+#{add_enum CODEC_ID_PCM_S24DAUD}
+#{add_enum CODEC_ID_PCM_ZORK}
+#{add_enum CODEC_ID_PCM_S16LE_PLANAR}
+#{add_enum CODEC_ID_PCM_DVD}
+#{add_enum CODEC_ID_PCM_F32BE}
+#{add_enum CODEC_ID_PCM_F32LE}
+#{add_enum CODEC_ID_PCM_F64BE}
+#{add_enum CODEC_ID_PCM_F64LE}
+#{add_enum CODEC_ID_ADPCM_IMA_QT}
+#{add_enum CODEC_ID_ADPCM_IMA_WAV}
+#{add_enum CODEC_ID_ADPCM_IMA_DK3}
+#{add_enum CODEC_ID_ADPCM_IMA_DK4}
+#{add_enum CODEC_ID_ADPCM_IMA_WS}
+#{add_enum CODEC_ID_ADPCM_IMA_SMJPEG}
+#{add_enum CODEC_ID_ADPCM_MS}
+#{add_enum CODEC_ID_ADPCM_4XM}
+#{add_enum CODEC_ID_ADPCM_XA}
+#{add_enum CODEC_ID_ADPCM_ADX}
+#{add_enum CODEC_ID_ADPCM_EA}
+#{add_enum CODEC_ID_ADPCM_G726}
+#{add_enum CODEC_ID_ADPCM_CT}
+#{add_enum CODEC_ID_ADPCM_SWF}
+#{add_enum CODEC_ID_ADPCM_YAMAHA}
+#{add_enum CODEC_ID_ADPCM_SBPRO_4}
+#{add_enum CODEC_ID_ADPCM_SBPRO_3}
+#{add_enum CODEC_ID_ADPCM_SBPRO_2}
+#{add_enum CODEC_ID_ADPCM_THP}
+#{add_enum CODEC_ID_ADPCM_IMA_AMV}
+#{add_enum CODEC_ID_ADPCM_EA_R1}
+#{add_enum CODEC_ID_ADPCM_EA_R3}
+#{add_enum CODEC_ID_ADPCM_EA_R2}
+#{add_enum CODEC_ID_ADPCM_IMA_EA_SEAD}
+#{add_enum CODEC_ID_ADPCM_IMA_EA_EACS}
+#{add_enum CODEC_ID_ADPCM_EA_XAS}
+#{add_enum CODEC_ID_ADPCM_EA_MAXIS_XA}
+#{add_enum CODEC_ID_ADPCM_IMA_ISS}
+#{add_enum CODEC_ID_AMR_NB}
+#{add_enum CODEC_ID_AMR_WB}
+#{add_enum CODEC_ID_RA_144}
+#{add_enum CODEC_ID_RA_288}
+#{add_enum CODEC_ID_ROQ_DPCM}
+#{add_enum CODEC_ID_INTERPLAY_DPCM}
+#{add_enum CODEC_ID_XAN_DPCM}
+#{add_enum CODEC_ID_SOL_DPCM}
+#{add_enum CODEC_ID_MP2}
+#{add_enum CODEC_ID_MP3}
+#{add_enum CODEC_ID_AAC}
+#{add_enum CODEC_ID_AC3}
+#{add_enum CODEC_ID_DTS}
+#{add_enum CODEC_ID_VORBIS}
+#{add_enum CODEC_ID_DVAUDIO}
+#{add_enum CODEC_ID_WMAV1}
+#{add_enum CODEC_ID_WMAV2}
+#{add_enum CODEC_ID_MACE3}
+#{add_enum CODEC_ID_MACE6}
+#{add_enum CODEC_ID_VMDAUDIO}
+#{add_enum CODEC_ID_SONIC}
+#{add_enum CODEC_ID_SONIC_LS}
+#{add_enum CODEC_ID_FLAC}
+#{add_enum CODEC_ID_MP3ADU}
+#{add_enum CODEC_ID_MP3ON4}
+#{add_enum CODEC_ID_SHORTEN}
+#{add_enum CODEC_ID_ALAC}
+#{add_enum CODEC_ID_WESTWOOD_SND1}
+#{add_enum CODEC_ID_GSM}
+#{add_enum CODEC_ID_QDM2}
+#{add_enum CODEC_ID_COOK}
+#{add_enum CODEC_ID_TRUESPEECH}
+#{add_enum CODEC_ID_TTA}
+#{add_enum CODEC_ID_SMACKAUDIO}
+#{add_enum CODEC_ID_QCELP}
+#{add_enum CODEC_ID_WAVPACK}
+#{add_enum CODEC_ID_DSICINAUDIO}
+#{add_enum CODEC_ID_IMC}
+#{add_enum CODEC_ID_MUSEPACK7}
+#{add_enum CODEC_ID_MLP}
+#{add_enum CODEC_ID_GSM_MS}
+#{add_enum CODEC_ID_ATRAC3}
+#{add_enum CODEC_ID_VOXWARE}
+#{add_enum CODEC_ID_APE}
+#{add_enum CODEC_ID_NELLYMOSER}
+#{add_enum CODEC_ID_MUSEPACK8}
+#{add_enum CODEC_ID_SPEEX}
+#{add_enum CODEC_ID_WMAVOICE}
+#{add_enum CODEC_ID_WMAPRO}
+#{add_enum CODEC_ID_WMALOSSLESS}
+#{add_enum CODEC_ID_ATRAC3P}
+#{add_enum CODEC_ID_EAC3}
+#{add_enum CODEC_ID_SIPR}
+#{add_enum CODEC_ID_MP1}
+#{add_enum CODEC_ID_TWINVQ}
+#{add_enum CODEC_ID_TRUEHD}
+#{add_enum CODEC_ID_DVD_SUBTITLE}
+#{add_enum CODEC_ID_DVB_SUBTITLE}
+#{add_enum CODEC_ID_TEXT}
+#{add_enum CODEC_ID_XSUB}
+#{add_enum CODEC_ID_SSA}
+#{add_enum CODEC_ID_MOV_TEXT}
+#{add_enum CODEC_ID_TTF}
+#{add_enum CODEC_ID_PROBE}
+#{add_enum CODEC_ID_MPEG2TS}
+#{end_enum "Eq,Ord,Show"}
+
+
+
diff --git a/src/Media/FFMpeg/Common.hsc b/src/Media/FFMpeg/Common.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/Common.hsc
@@ -0,0 +1,51 @@
+-- -*- haskell -*-
+{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
+
+{- |Module 'Media.FFMpeg.Common' common definitions and helpers
+
+   (c) 2009 Vasyl Pasternak
+ -}
+
+module Media.FFMpeg.Common 
+    (
+     ExternalPointer (..)
+    ,cToInt
+    ,cFromInt
+    ,cToEnum
+    ,cFromEnum
+    ,justPtr
+    ,combineBitMasks
+    )where
+
+-- 
+-- |ExternalPointer class, used to define method withThis
+-- similar to 'Foreign.Marshal.Utils.with' but without need Storable specifier
+--
+
+import Foreign.Ptr (Ptr, nullPtr)
+import Data.Bits (Bits, (.|.))
+
+class ExternalPointer a where
+    withThis :: a -> (Ptr b -> IO c) -> IO c
+
+--
+-- Some conversion functions
+--
+cToInt :: (Integral a) => a -> Int
+cToInt = fromIntegral
+
+cFromInt :: (Num a) => Int -> a 
+cFromInt = fromIntegral
+
+cToEnum :: (Integral a, Enum b) => a -> b
+cToEnum = toEnum . fromIntegral
+
+cFromEnum :: (Enum a, Num b) => a -> b
+cFromEnum = fromIntegral . fromEnum
+
+justPtr :: Ptr a -> Maybe (Ptr a)
+justPtr p | p == nullPtr  = Nothing
+          | otherwise = Just p
+
+combineBitMasks :: (Enum a, Bits b) => [a] -> b
+combineBitMasks = foldl (.|.) 0 . map cFromEnum
diff --git a/src/Media/FFMpeg/Format.hsc b/src/Media/FFMpeg/Format.hsc
--- a/src/Media/FFMpeg/Format.hsc
+++ b/src/Media/FFMpeg/Format.hsc
@@ -1,5 +1,5 @@
 -- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
 
 {- |Module 'Media.FFMpeg.Format' implements bindings to AVFormat library
 
@@ -8,24 +8,158 @@
 
 module Media.FFMpeg.Format 
     (
-     registerAll
+     libAVFormatVersion
+    ,registerAll
     ,withFFMpeg
-    ,module Media.FFMpeg.Internals
+
+    ,FormatContext
+    ,findStreamInfo
+    ,dumpFormat
+    ,newContext
+    ,openInputFile
+
+    ,Stream
+    ,getStreams
+    ,getCodecContext
+    ,readFrame
     ) where
 
+#include "libavformat/avformat.h"
+
 import Foreign
+import Foreign.C.Types
 import Foreign.C.String
-import Media.FFMpeg.Internals
-import Text.Printf
+import Data.Version
+import Control.Monad (liftM)
+import Text.Printf (printf)
 
-#include "libavformat/avformat.h"
+import Media.FFMpeg.Common
+import Media.FFMpeg.Util
+import Media.FFMpeg.Codec
 
--- | import defines
-foreign import ccall "av_register_all" registerAll :: IO ()
+libAVFormatVersion :: Version
+libAVFormatVersion = Version {
+                       versionBranch = [
+                        #{const LIBAVFORMAT_VERSION_MAJOR},
+                        #{const LIBAVFORMAT_VERSION_MINOR},
+                        #{const LIBAVFORMAT_VERSION_MICRO}
+                       ],
+                       versionTags = []
+                     }
 
 
+--
+-- | registerAll, this should be the first instruction in before working wiht
+-- ffmpeg library
+--
+foreign import ccall "av_register_all" registerAll :: IO ()
+
+--
+-- | control helper
+--
 withFFMpeg :: IO a -> IO a
-withFFMpeg clos = registerAll >> clos
+withFFMpeg io = registerAll >> io
 
 
+-- |FormatContext - wrapper to AVFormatContext
+newtype FormatContext = FormatContext (ForeignPtr FormatContext)
 
+instance ExternalPointer FormatContext where
+    withThis (FormatContext fmt) io = withForeignPtr fmt (io . castPtr)
+
+--
+-- | findStreamInfo
+foreign import ccall "av_find_stream_info" _find_stream_info :: Ptr () -> IO CInt
+
+findStreamInfo :: FormatContext -> IO ()
+findStreamInfo fmt = 
+    withThis fmt $ \fmt' -> 
+        throwIf_ (< 0) 
+                     (printf "findStreamInfo: failed with error code %d\n" . cToInt) 
+                     (_find_stream_info fmt')
+
+-- 
+-- | dumpFormat - outputs the format into console
+--
+foreign import ccall "dump_format" _dump_format :: 
+    Ptr () -> CInt -> CString -> CInt -> IO ()
+
+dumpFormat :: FormatContext -> String -> IO ()
+dumpFormat fmt s =
+    withThis fmt $ \fmt' ->
+        withCString s $ \s' ->
+            _dump_format fmt' 0 s' 0
+
+
+--
+-- | newContext - allocates new FormatContext
+--
+foreign import ccall "avformat_alloc_context" _alloc_context :: IO (Ptr ())
+
+newContext :: IO FormatContext
+newContext = do 
+  p <- throwIf (== nullPtr) 
+               (\_ -> "allocContext: failed to allocate context") 
+               _alloc_context
+  liftM (FormatContext . castForeignPtr) $ newAvForeignPtr p
+
+--
+-- |openInputFile -- opens media file
+--
+foreign import ccall "av_open_input_file" _open_file :: 
+    Ptr (Ptr ()) -> CString -> Ptr () -> CInt -> Ptr () -> IO CInt
+
+foreign import ccall "av_close_input_file" _close_file ::
+    Ptr a -> IO ()
+
+openInputFile :: String -> IO FormatContext
+openInputFile name = 
+    withCString name $ \s ->
+        alloca $ \pp -> do
+          throwIf_ (/=0) 
+                       (printf "openInputFile: fail to open %s - errorcode %d\n" name . cToInt) $
+                       _open_file pp s nullPtr 0 nullPtr
+          ptr <- peek pp
+          liftM (FormatContext . castForeignPtr) $ newFinForeignPtr _close_file ptr
+
+
+--
+-- |Stream - wrapper to AVStream
+--
+newtype Stream = Stream (Ptr Stream)
+
+instance ExternalPointer Stream where
+    withThis (Stream s) io = io (castPtr s)
+
+--
+-- |getStreams -- retrieve all streams from the FormatContext
+--
+getStreams :: FormatContext -> [Stream]
+getStreams fmt = unsafePerformIO $
+                 withThis fmt $ \fmt' -> do
+                   count <- liftM fromIntegral $ 
+                            (#{peek AVFormatContext, nb_streams} fmt' :: IO CUInt)
+                   let streamsPtr = fmt' `plusPtr` #{offset AVFormatContext, streams}
+                   liftM (map Stream) $ peekArray count streamsPtr
+
+--
+-- |getCodecContext - reads codec context from the stream structure
+--
+getCodecContext :: Stream -> Maybe CodecContext
+getCodecContext s = unsafePerformIO $ 
+                    withThis s $ \s' -> do
+                      p <- liftM justPtr $ (#{peek AVStream, codec} s' :: IO (Ptr ()))
+                      maybe (return Nothing) (liftM Just . toCodecContext) p
+                           
+
+--
+-- |readFrame - reads frame from file, return False if error of EOF occured,
+-- True otherwise
+--
+foreign import ccall "av_read_frame" _read_frame :: Ptr () -> Ptr () -> IO CInt
+
+readFrame :: FormatContext -> Packet -> IO Bool
+readFrame fmt pkt = 
+    withThis fmt $ \fmt' ->
+        withThis pkt $ \pkt' ->
+            liftM (>= 0) $ _read_frame fmt' pkt'
diff --git a/src/Media/FFMpeg/Internals.hsc b/src/Media/FFMpeg/Internals.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals.hsc
+++ /dev/null
@@ -1,20 +0,0 @@
--- -*- haskell -*-
-
-{- |The module 'Media.FFMpeg.Internals' implements helpers and
-   internal data representaion for the rest of 'hs-ffmpeg' library
-   
-   (c) 2009 Vasyl Pasternak
- -}
-module Media.FFMpeg.Internals 
-    (
-     module Media.FFMpeg.Internals.Types
-    ,module Media.FFMpeg.Internals.Utils
-    ,module Media.FFMpeg.Internals.AVFormat
-    ,module Media.FFMpeg.Internals.AVCodec
-    ) where
-
-import Media.FFMpeg.Internals.Types
-import Media.FFMpeg.Internals.Utils
-import Media.FFMpeg.Internals.AVFormat
-import Media.FFMpeg.Internals.AVCodec hiding (toCodecContext)
-
diff --git a/src/Media/FFMpeg/Internals/AVCodec.hsc b/src/Media/FFMpeg/Internals/AVCodec.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals/AVCodec.hsc
+++ /dev/null
@@ -1,541 +0,0 @@
--- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
-
-{- | Module 'Media.FFMpeg.Internals.AVFormat' implements 
-   avformat header (its structures and datatypes) along with 
-   getters and setters to work with them
-   
-   (c) 2009 Vasyl Pasternak
- -}
-
-module Media.FFMpeg.Internals.AVCodec
-    (
-     -- Enumerations
-     CodecType (..)
-    ,CodecId (..)
-     
-    ,WithCodecType (..)
-    ,WithCodecId (..)
-    ,WithVideoProps (..)
-
-    -- CodecContext 
-    ,CodecContext
-    ,withCodecContext
-    ,toCodecContext
-    ,openCodec
-    ,decodeVideo
-     
-    -- Codec
-    ,Codec 
-    ,withCodec
-    ,findDecoder
-     
-    -- Frame
-    ,Frame
-    ,withFrame
-    ,allocFrame
-
-    -- Picture
-    ,CommonPicture (..)
-    ,pictureGetSize
-
-    -- Packet
-    ,Packet
-    ,withPacket
-    ,allocPacket
-    ,cleanPacket
-    ,getStreamIndex
-    )where
-
-import Foreign
-import Foreign.C.String
-import Control.Monad (liftM)
-import Text.Printf
-import Media.FFMpeg.Internals.Types
-import Media.FFMpeg.Internals.Utils
-
-#include "libavcodec/avcodec.h"
-#include "macros.hsc2hs.h"
-
-
--- |Different enumerations
--- |CodecType
-#{begin_enum CodecType, CODEC_TYPE_UNKNOWN}
-#{add_enum CODEC_TYPE_VIDEO}
-#{add_enum CODEC_TYPE_AUDIO}
-#{add_enum CODEC_TYPE_DATA}
-#{add_enum CODEC_TYPE_SUBTITLE}
-#{add_enum CODEC_TYPE_ATTACHMENT}
-#{add_enum CODEC_TYPE_NB}
-#{end_enum "Eq,Ord,Show"}
-
--- | CodecId
-#{begin_enum CodecId, CODEC_ID_NONE}
-#{add_enum CODEC_ID_MPEG1VIDEO}
-#{add_enum CODEC_ID_MPEG2VIDEO}
-#{add_enum CODEC_ID_MPEG2VIDEO_XVMC}
-#{add_enum CODEC_ID_H261}
-#{add_enum CODEC_ID_H263}
-#{add_enum CODEC_ID_RV10}
-#{add_enum CODEC_ID_RV20}
-#{add_enum CODEC_ID_MJPEG}
-#{add_enum CODEC_ID_MJPEGB}
-#{add_enum CODEC_ID_LJPEG}
-#{add_enum CODEC_ID_SP5X}
-#{add_enum CODEC_ID_JPEGLS}
-#{add_enum CODEC_ID_MPEG4}
-#{add_enum CODEC_ID_RAWVIDEO}
-#{add_enum CODEC_ID_MSMPEG4V1}
-#{add_enum CODEC_ID_MSMPEG4V2}
-#{add_enum CODEC_ID_MSMPEG4V3}
-#{add_enum CODEC_ID_WMV1}
-#{add_enum CODEC_ID_WMV2}
-#{add_enum CODEC_ID_H263P}
-#{add_enum CODEC_ID_H263I}
-#{add_enum CODEC_ID_FLV1}
-#{add_enum CODEC_ID_SVQ1}
-#{add_enum CODEC_ID_SVQ3}
-#{add_enum CODEC_ID_DVVIDEO}
-#{add_enum CODEC_ID_HUFFYUV}
-#{add_enum CODEC_ID_CYUV}
-#{add_enum CODEC_ID_H264}
-#{add_enum CODEC_ID_INDEO3}
-#{add_enum CODEC_ID_VP3}
-#{add_enum CODEC_ID_THEORA}
-#{add_enum CODEC_ID_ASV1}
-#{add_enum CODEC_ID_ASV2}
-#{add_enum CODEC_ID_FFV1}
-#{add_enum CODEC_ID_4XM}
-#{add_enum CODEC_ID_VCR1}
-#{add_enum CODEC_ID_CLJR}
-#{add_enum CODEC_ID_MDEC}
-#{add_enum CODEC_ID_ROQ}
-#{add_enum CODEC_ID_INTERPLAY_VIDEO}
-#{add_enum CODEC_ID_XAN_WC3}
-#{add_enum CODEC_ID_XAN_WC4}
-#{add_enum CODEC_ID_RPZA}
-#{add_enum CODEC_ID_CINEPAK}
-#{add_enum CODEC_ID_WS_VQA}
-#{add_enum CODEC_ID_MSRLE}
-#{add_enum CODEC_ID_MSVIDEO1}
-#{add_enum CODEC_ID_IDCIN}
-#{add_enum CODEC_ID_8BPS}
-#{add_enum CODEC_ID_SMC}
-#{add_enum CODEC_ID_FLIC}
-#{add_enum CODEC_ID_TRUEMOTION1}
-#{add_enum CODEC_ID_VMDVIDEO}
-#{add_enum CODEC_ID_MSZH}
-#{add_enum CODEC_ID_ZLIB}
-#{add_enum CODEC_ID_QTRLE}
-#{add_enum CODEC_ID_SNOW}
-#{add_enum CODEC_ID_TSCC}
-#{add_enum CODEC_ID_ULTI}
-#{add_enum CODEC_ID_QDRAW}
-#{add_enum CODEC_ID_VIXL}
-#{add_enum CODEC_ID_QPEG}
-#{add_enum CODEC_ID_XVID}
-#{add_enum CODEC_ID_PNG}
-#{add_enum CODEC_ID_PPM}
-#{add_enum CODEC_ID_PBM}
-#{add_enum CODEC_ID_PGM}
-#{add_enum CODEC_ID_PGMYUV}
-#{add_enum CODEC_ID_PAM}
-#{add_enum CODEC_ID_FFVHUFF}
-#{add_enum CODEC_ID_RV30}
-#{add_enum CODEC_ID_RV40}
-#{add_enum CODEC_ID_VC1}
-#{add_enum CODEC_ID_WMV3}
-#{add_enum CODEC_ID_LOCO}
-#{add_enum CODEC_ID_WNV1}
-#{add_enum CODEC_ID_AASC}
-#{add_enum CODEC_ID_INDEO2}
-#{add_enum CODEC_ID_FRAPS}
-#{add_enum CODEC_ID_TRUEMOTION2}
-#{add_enum CODEC_ID_BMP}
-#{add_enum CODEC_ID_CSCD}
-#{add_enum CODEC_ID_MMVIDEO}
-#{add_enum CODEC_ID_ZMBV}
-#{add_enum CODEC_ID_AVS}
-#{add_enum CODEC_ID_SMACKVIDEO}
-#{add_enum CODEC_ID_NUV}
-#{add_enum CODEC_ID_KMVC}
-#{add_enum CODEC_ID_FLASHSV}
-#{add_enum CODEC_ID_CAVS}
-#{add_enum CODEC_ID_JPEG2000}
-#{add_enum CODEC_ID_VMNC}
-#{add_enum CODEC_ID_VP5}
-#{add_enum CODEC_ID_VP6}
-#{add_enum CODEC_ID_VP6F}
-#{add_enum CODEC_ID_TARGA}
-#{add_enum CODEC_ID_DSICINVIDEO}
-#{add_enum CODEC_ID_TIERTEXSEQVIDEO}
-#{add_enum CODEC_ID_TIFF}
-#{add_enum CODEC_ID_GIF}
-#{add_enum CODEC_ID_FFH264}
-#{add_enum CODEC_ID_DXA}
-#{add_enum CODEC_ID_DNXHD}
-#{add_enum CODEC_ID_THP}
-#{add_enum CODEC_ID_SGI}
-#{add_enum CODEC_ID_C93}
-#{add_enum CODEC_ID_BETHSOFTVID}
-#{add_enum CODEC_ID_PTX}
-#{add_enum CODEC_ID_TXD}
-#{add_enum CODEC_ID_VP6A}
-#{add_enum CODEC_ID_AMV}
-#{add_enum CODEC_ID_VB}
-#{add_enum CODEC_ID_PCX}
-#{add_enum CODEC_ID_SUNRAST}
-#{add_enum CODEC_ID_INDEO4}
-#{add_enum CODEC_ID_INDEO5}
-#{add_enum CODEC_ID_MIMIC}
-#{add_enum CODEC_ID_RL2}
-#{add_enum CODEC_ID_8SVX_EXP}
-#{add_enum CODEC_ID_8SVX_FIB}
-#{add_enum CODEC_ID_ESCAPE124}
-#{add_enum CODEC_ID_DIRAC}
-#{add_enum CODEC_ID_BFI}
-#{add_enum CODEC_ID_CMV}
-#{add_enum CODEC_ID_MOTIONPIXELS}
-#{add_enum CODEC_ID_TGV}
-#{add_enum CODEC_ID_TGQ}
-#{add_enum CODEC_ID_TQI}
-#{add_enum CODEC_ID_AURA}
-#{add_enum CODEC_ID_AURA2}
-#{add_enum CODEC_ID_PCM_S16LE}
-#{add_enum CODEC_ID_PCM_S16BE}
-#{add_enum CODEC_ID_PCM_U16LE}
-#{add_enum CODEC_ID_PCM_U16BE}
-#{add_enum CODEC_ID_PCM_S8}
-#{add_enum CODEC_ID_PCM_U8}
-#{add_enum CODEC_ID_PCM_MULAW}
-#{add_enum CODEC_ID_PCM_ALAW}
-#{add_enum CODEC_ID_PCM_S32LE}
-#{add_enum CODEC_ID_PCM_S32BE}
-#{add_enum CODEC_ID_PCM_U32LE}
-#{add_enum CODEC_ID_PCM_U32BE}
-#{add_enum CODEC_ID_PCM_S24LE}
-#{add_enum CODEC_ID_PCM_S24BE}
-#{add_enum CODEC_ID_PCM_U24LE}
-#{add_enum CODEC_ID_PCM_U24BE}
-#{add_enum CODEC_ID_PCM_S24DAUD}
-#{add_enum CODEC_ID_PCM_ZORK}
-#{add_enum CODEC_ID_PCM_S16LE_PLANAR}
-#{add_enum CODEC_ID_PCM_DVD}
-#{add_enum CODEC_ID_PCM_F32BE}
-#{add_enum CODEC_ID_PCM_F32LE}
-#{add_enum CODEC_ID_PCM_F64BE}
-#{add_enum CODEC_ID_PCM_F64LE}
-#{add_enum CODEC_ID_ADPCM_IMA_QT}
-#{add_enum CODEC_ID_ADPCM_IMA_WAV}
-#{add_enum CODEC_ID_ADPCM_IMA_DK3}
-#{add_enum CODEC_ID_ADPCM_IMA_DK4}
-#{add_enum CODEC_ID_ADPCM_IMA_WS}
-#{add_enum CODEC_ID_ADPCM_IMA_SMJPEG}
-#{add_enum CODEC_ID_ADPCM_MS}
-#{add_enum CODEC_ID_ADPCM_4XM}
-#{add_enum CODEC_ID_ADPCM_XA}
-#{add_enum CODEC_ID_ADPCM_ADX}
-#{add_enum CODEC_ID_ADPCM_EA}
-#{add_enum CODEC_ID_ADPCM_G726}
-#{add_enum CODEC_ID_ADPCM_CT}
-#{add_enum CODEC_ID_ADPCM_SWF}
-#{add_enum CODEC_ID_ADPCM_YAMAHA}
-#{add_enum CODEC_ID_ADPCM_SBPRO_4}
-#{add_enum CODEC_ID_ADPCM_SBPRO_3}
-#{add_enum CODEC_ID_ADPCM_SBPRO_2}
-#{add_enum CODEC_ID_ADPCM_THP}
-#{add_enum CODEC_ID_ADPCM_IMA_AMV}
-#{add_enum CODEC_ID_ADPCM_EA_R1}
-#{add_enum CODEC_ID_ADPCM_EA_R3}
-#{add_enum CODEC_ID_ADPCM_EA_R2}
-#{add_enum CODEC_ID_ADPCM_IMA_EA_SEAD}
-#{add_enum CODEC_ID_ADPCM_IMA_EA_EACS}
-#{add_enum CODEC_ID_ADPCM_EA_XAS}
-#{add_enum CODEC_ID_ADPCM_EA_MAXIS_XA}
-#{add_enum CODEC_ID_ADPCM_IMA_ISS}
-#{add_enum CODEC_ID_AMR_NB}
-#{add_enum CODEC_ID_AMR_WB}
-#{add_enum CODEC_ID_RA_144}
-#{add_enum CODEC_ID_RA_288}
-#{add_enum CODEC_ID_ROQ_DPCM}
-#{add_enum CODEC_ID_INTERPLAY_DPCM}
-#{add_enum CODEC_ID_XAN_DPCM}
-#{add_enum CODEC_ID_SOL_DPCM}
-#{add_enum CODEC_ID_MP2}
-#{add_enum CODEC_ID_MP3}
-#{add_enum CODEC_ID_AAC}
-#{add_enum CODEC_ID_AC3}
-#{add_enum CODEC_ID_DTS}
-#{add_enum CODEC_ID_VORBIS}
-#{add_enum CODEC_ID_DVAUDIO}
-#{add_enum CODEC_ID_WMAV1}
-#{add_enum CODEC_ID_WMAV2}
-#{add_enum CODEC_ID_MACE3}
-#{add_enum CODEC_ID_MACE6}
-#{add_enum CODEC_ID_VMDAUDIO}
-#{add_enum CODEC_ID_SONIC}
-#{add_enum CODEC_ID_SONIC_LS}
-#{add_enum CODEC_ID_FLAC}
-#{add_enum CODEC_ID_MP3ADU}
-#{add_enum CODEC_ID_MP3ON4}
-#{add_enum CODEC_ID_SHORTEN}
-#{add_enum CODEC_ID_ALAC}
-#{add_enum CODEC_ID_WESTWOOD_SND1}
-#{add_enum CODEC_ID_GSM}
-#{add_enum CODEC_ID_QDM2}
-#{add_enum CODEC_ID_COOK}
-#{add_enum CODEC_ID_TRUESPEECH}
-#{add_enum CODEC_ID_TTA}
-#{add_enum CODEC_ID_SMACKAUDIO}
-#{add_enum CODEC_ID_QCELP}
-#{add_enum CODEC_ID_WAVPACK}
-#{add_enum CODEC_ID_DSICINAUDIO}
-#{add_enum CODEC_ID_IMC}
-#{add_enum CODEC_ID_MUSEPACK7}
-#{add_enum CODEC_ID_MLP}
-#{add_enum CODEC_ID_GSM_MS}
-#{add_enum CODEC_ID_ATRAC3}
-#{add_enum CODEC_ID_VOXWARE}
-#{add_enum CODEC_ID_APE}
-#{add_enum CODEC_ID_NELLYMOSER}
-#{add_enum CODEC_ID_MUSEPACK8}
-#{add_enum CODEC_ID_SPEEX}
-#{add_enum CODEC_ID_WMAVOICE}
-#{add_enum CODEC_ID_WMAPRO}
-#{add_enum CODEC_ID_WMALOSSLESS}
-#{add_enum CODEC_ID_ATRAC3P}
-#{add_enum CODEC_ID_EAC3}
-#{add_enum CODEC_ID_SIPR}
-#{add_enum CODEC_ID_MP1}
-#{add_enum CODEC_ID_TWINVQ}
-#{add_enum CODEC_ID_TRUEHD}
-#{add_enum CODEC_ID_DVD_SUBTITLE}
-#{add_enum CODEC_ID_DVB_SUBTITLE}
-#{add_enum CODEC_ID_TEXT}
-#{add_enum CODEC_ID_XSUB}
-#{add_enum CODEC_ID_SSA}
-#{add_enum CODEC_ID_MOV_TEXT}
-#{add_enum CODEC_ID_TTF}
-#{add_enum CODEC_ID_PROBE}
-#{add_enum CODEC_ID_MPEG2TS}
-#{end_enum "Eq,Ord,Show"}
-
-
-class WithCodecId a where
-    getCodecId :: a -> CodecId
-
-class WithCodecType a where
-    getCodecType :: a -> CodecType
-
-class WithVideoProps a where
-    getVideoWidth :: a -> Int
-    getVideoHeight :: a -> Int
-    getPixelFormat :: a -> PixelFormat
-
--- |CodecContext - wrapper to AVCodecContext
-newtype CodecContext = CodecContext (ForeignPtr CodecContext)
-
-withCodecContext :: CodecContext -> (Ptr a -> IO b) -> IO b
-withCodecContext (CodecContext ctx) clos = withForeignPtr ctx (clos . castPtr)
-
-toCodecContext :: Ptr a -> IO CodecContext
-toCodecContext p =  liftM CodecContext $ (newForeignPtr_ . castPtr) p
-
-instance WithCodecId CodecContext where
-    getCodecId ctx = 
-        unsafePerformIO $
-        withCodecContext ctx $ \ctx' -> 
-            do
-              val <- #{peek AVCodecContext, codec_id} ctx' :: IO #{type enum CodecID}
-              return $ (toEnum . fromIntegral) val
-
-instance WithCodecType CodecContext where
-    getCodecType ctx = 
-        unsafePerformIO $
-        withCodecContext ctx $ \ctx' -> 
-            do
-              val <- #{peek AVCodecContext, codec_type} ctx' :: IO #{type enum CodecType}
-              return $ (toEnum . fromIntegral) val
-
-instance WithVideoProps CodecContext where
-    getVideoWidth ctx = 
-        unsafePerformIO $
-        withCodecContext ctx $ \ctx' ->
-            liftM fromIntegral $ (#{peek AVCodecContext, width} ctx'  :: IO #{type int})
-
-    getVideoHeight ctx =
-        unsafePerformIO $
-        withCodecContext ctx $ \ctx' -> 
-            liftM fromIntegral $ (#{peek AVCodecContext, height} ctx' :: IO #{type int})
-
-    getPixelFormat ctx = 
-        unsafePerformIO $ 
-        withCodecContext ctx $ \ctx' ->
-            do
-              val <- #{peek AVCodecContext, pix_fmt} ctx' :: IO #{type enum PixelFormat}
-              return $ (toEnum . fromIntegral) val
-
--- |CodecContext function
-foreign import ccall "avcodec_open" _open :: VoidP -> VoidP -> IO SInt
-foreign import ccall "avcodec_close" _close :: VoidP -> IO ()
-
-openCodec :: CodecContext -> Codec -> IO ()
-openCodec ctx@(CodecContext ct) c = 
-    withCodecContext ctx $ \ctx' ->
-        withCodec c $ \c' -> do
-          throwIf_ (<0)
-                   (printf "openCodec: fails to open codec '%s' - errorcode %d\n" (show $ getCodecId c)) $ _open ctx' c'
-          finalizer <- mkFinalizerPtr _close
-          addForeignPtrFinalizer finalizer (castForeignPtr ct)
-
-
--- |CodecContext getters/setters
-
-                               
-
--- |Codec - implementation of AVCodec
-newtype Codec = Codec (Ptr Codec)
-
-withCodec :: Codec -> (Ptr a -> IO b) -> IO b
-withCodec (Codec c) clos = clos (castPtr c)
-
-
--- |Codec getters/setters
-instance WithCodecId Codec where
-    getCodecId ctx = 
-        unsafePerformIO $
-        withCodec ctx $ \ctx' -> 
-            do
-              val <- #{peek AVCodec, id} ctx' :: IO #{type enum CodecID}
-              return $ (toEnum . fromIntegral) val
-
-instance WithCodecType Codec where
-    getCodecType ctx = 
-        unsafePerformIO $
-        withCodec ctx $ \ctx' -> 
-            do
-              val <- #{peek AVCodec, type} ctx' :: IO #{type enum CodecType}
-              return $ (toEnum . fromIntegral) val
-
-
--- |Codec functions
-
-foreign import ccall "avcodec_find_decoder" _find_decoder :: #{type enum CodecID} -> IO VoidP
-
-findDecoder :: CodecId -> IO (Maybe Codec)
-findDecoder cid = do
-  res <- _find_decoder (fromIntegral $ fromEnum cid)
-  if res == nullPtr then return Nothing else return $ Just $ Codec $ castPtr res
-
-
-foreign import ccall "avcodec_decode_video2" _decode_video :: 
-    VoidP -> VoidP -> (Ptr SInt) -> VoidP -> IO SInt
-
--- | returns True if complete picture is decompressed
-decodeVideo :: CodecContext -> Frame -> Packet -> IO Bool
-decodeVideo ctx frm pkt = 
-    withCodecContext ctx $ \ctx' ->
-        withFrame frm $ \frm' ->
-            withPacket pkt $ \pkt' ->
-                alloca $ \gotPic' -> do
-                  throwIf (<0)
-                          (printf "decodeVideo: failed to decode video packet: %d")
-                          (_decode_video ctx' frm' gotPic' pkt')
-                  peek gotPic' >>= return . (>0)
-
-
--- |AVFrame implementation
-newtype Frame = Frame (ForeignPtr Frame)
-
-withFrame :: Frame -> (Ptr a -> IO b) -> IO b
-withFrame (Frame f) clos = withForeignPtr f (clos . castPtr)
-
-foreign import ccall "avcodec_alloc_frame" _alloc_frame :: IO VoidP
-
-allocFrame :: IO Frame
-allocFrame = do
-  p <- throwIf (== nullPtr)
-               (\_ -> "allocFrame: failed to allocate frame")
-               _alloc_frame
-  finalizer <- mkFinalizerPtr avFree
-  newForeignPtr finalizer p >>= return . Frame . castForeignPtr
-
-instance CommonPicture Frame where
-    withCPicture = withFrame
-
-
--- |AVPicture 
-
-
-foreign import ccall "avpicture_fill" _picture_fill ::
-    VoidP -> VoidP -> #{type int} -> #{type int} -> #{type int} -> IO #{type int}
-
-type CPicture = VoidP
-
-class CommonPicture a where
-    withCPicture :: a -> (CPicture -> IO b) -> IO b
-
-    pictureFill :: a -> Buffer -> PixelFormat -> Int -> Int -> IO ()
-    pictureFill pic buff pf w h = 
-        withCPicture pic $ \pic' ->
-            withBuffer buff $ \buff' -> 
-                _picture_fill pic' (castPtr buff') 
-                     (fromIntegral $ fromEnum pf)
-                     (fromIntegral w)
-                     (fromIntegral h) >> return ()
-    
-    getPictureSlice :: a -> PictureSlice
-    getPictureSlice pic =
-        unsafePerformIO $
-        withCPicture pic $ \pic' ->
-            return $ castPtr $ pic' `plusPtr` #{offset AVPicture, data}
-
-    getPictureStride :: a -> PictureStride
-    getPictureStride pic = 
-        unsafePerformIO $
-        withCPicture pic $ \pic' ->
-            return $ castPtr $ pic' `plusPtr` #{offset AVPicture, linesize}
-
-
--- |Other functions
- 
-foreign import ccall "avpicture_get_size" _picture_get_size :: 
-    #{type enum PixelFormat} -> #{type int} -> #{type int} -> IO (#{type int})
-
-pictureGetSize :: PixelFormat -> Int -> Int -> IO Int
-pictureGetSize pf w h = do
-  liftM fromIntegral $ 
-        (_picture_get_size ((fromIntegral . fromEnum) pf) (fromIntegral w) (fromIntegral h) :: IO (#{type int}))
- 
-
--- |AVPacket
-
-newtype Packet = Packet (ForeignPtr Packet)
-
-withPacket :: Packet -> (Ptr a -> IO b) -> IO b
-withPacket (Packet p) clos = withForeignPtr p (clos . castPtr)
-
-foreign import ccall "av_init_packet" _init_packet :: VoidP -> IO ()
-foreign import ccall "b_free_packet" _free_packet :: VoidP -> IO ()
-
-allocPacket :: IO Packet
-allocPacket = do
-  p <- mallocBytes #{size AVPacket}
-  _init_packet p
-  fp <- newForeignPtr finalizerFree p
-  deinit <- mkFinalizerPtr _free_packet
-  addForeignPtrFinalizer deinit fp 
-  return $ Packet $ castForeignPtr fp
-
-cleanPacket :: Packet -> IO ()
-cleanPacket pkt = withPacket pkt _free_packet
-
-
--- | AVPacket getters/setters
-
-getStreamIndex :: Packet -> Int
-getStreamIndex pkt = 
-    unsafePerformIO $
-    withPacket pkt $ \pkt' ->
-        liftM fromIntegral $ 
-              (#{peek AVPacket, stream_index} pkt' :: IO #{type int})
diff --git a/src/Media/FFMpeg/Internals/AVFormat.hsc b/src/Media/FFMpeg/Internals/AVFormat.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals/AVFormat.hsc
+++ /dev/null
@@ -1,142 +0,0 @@
--- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
-
-{- | Module 'Media.FFMpeg.Internals.AVFormat' implements 
-   avformat header (its structures and datatypes) along with 
-   getters and setters to work with them
-   
-   (c) 2009 Vasyl Pasternak
- -}
-
-module Media.FFMpeg.Internals.AVFormat 
-    (
-     -- FormatContext 
-     FormatContext
-    ,withFormatContext
-    ,newContext
-    ,openInputFile
-    ,getStreams
-    ,findStreamInfo
-    ,dumpFormat
-
-    -- Stream
-    ,Stream
-    ,withStream
-    ,getCodecContext
-
-    -- Other
-    ,readFrame
-    )where
-
-import Foreign
-import Foreign.C.String
-import Control.Monad (liftM)
-import Text.Printf
-import Media.FFMpeg.Internals.Types
-import Media.FFMpeg.Internals.Utils
-import Media.FFMpeg.Internals.AVCodec
-
-#include "libavformat/avformat.h"
-
-
--- |FormatContext - wrapper to AVFormatContext
-newtype FormatContext = FormatContext (ForeignPtr FormatContext)
-
-withFormatContext :: FormatContext -> (Ptr a -> IO b) -> IO b
-withFormatContext (FormatContext fmt) clos = withForeignPtr fmt (clos . castPtr)
-
-
--- |Different functions on FormatContext
-
-foreign import ccall "av_find_stream_info" _find_stream_info :: VoidP -> IO SInt
-
-findStreamInfo :: FormatContext -> IO ()
-findStreamInfo fmt = 
-    withFormatContext fmt $ \fmt' -> 
-        throwIf_ (< 0) (printf "findStreamInfo: failed with error code %d\n") 
-                     (_find_stream_info fmt')
-                 
-
-foreign import ccall "dump_format" _dump_format :: VoidP -> SInt -> CString -> SInt -> IO ()
-
-dumpFormat :: FormatContext -> String -> IO ()
-dumpFormat fmt s =
-    withFormatContext fmt $ \fmt' ->
-        withCString s $ \s' ->
-            _dump_format fmt' 0 s' 0
-
-
-
--- |Stream -- wrapper to AVStream
-newtype Stream = Stream (Ptr Stream)
-
-withStream :: Stream -> (VoidP -> IO a) -> IO a
-withStream (Stream s) clos = clos (castPtr s)
-
-
--- |Foreign declarations
-
-foreign import ccall "avformat_alloc_context" _alloc_context :: IO VoidP
-
-foreign import ccall "av_open_input_file" _open_file :: 
-    Ptr (VoidP) -> CString -> VoidP -> SInt -> VoidP -> IO SInt
-
-foreign import ccall "av_close_input_file" _close_file ::
-    Ptr a -> IO ()
-
-
--- |FormatContext functions
-
--- |Empty context creation
-newContext :: IO FormatContext
-newContext = do 
-  p <- throwIf (== nullPtr) 
-               (\_ -> "allocContext: failed to allocate context") 
-               _alloc_context
-  finalizer <- mkFinalizerPtr avFree
-  newForeignPtr finalizer p >>= return . FormatContext . castForeignPtr
-  
-
--- |Open input file
-openInputFile :: String -> IO FormatContext
-openInputFile name = 
-    withCString name $ \s ->
-        alloca $ \ (pp :: (Ptr VoidP)) -> do
-          throwIf_ (/=0) 
-                       (printf "openInputFile: fail to open %s - errorcode %d\n" name) $
-                       _open_file pp s nullPtr 0 nullPtr
-          ptr <- peek pp
-          finalizer <- mkFinalizerPtr _close_file
-          newForeignPtr finalizer ptr >>= return . FormatContext . castForeignPtr
-
-
--- | FormatContext getters/setters
-
--- |Get streams from FormatContext. Pure, because it is
--- field of already allocated structure
-getStreams :: FormatContext -> [Stream]
-getStreams fmt = unsafePerformIO $
-                 withFormatContext fmt $ \fmt' -> do
-                   count <- liftM fromIntegral $ 
-                            (#{peek AVFormatContext, nb_streams} fmt' :: IO UInt)
-                   let streamList = fmt' `plusPtr` #{offset AVFormatContext, streams} 
-                   peekArray count streamList >>= return . map Stream 
-                 
-
--- | Stream getters/setters
-
-getCodecContext :: Stream -> Maybe CodecContext
-getCodecContext s = unsafePerformIO $
-                    withStream s $ \s' -> do
-                      p <- #{peek AVStream, codec} s' :: IO VoidP
-                      if p == nullPtr then return Nothing else liftM Just $ toCodecContext p
-
-foreign import ccall "av_read_frame" _read_frame :: VoidP -> VoidP -> IO SInt
-
--- |returns False if error or EOF occured, True otherwise
-readFrame :: FormatContext -> Packet -> IO Bool
-readFrame ctx pkt = 
-    withFormatContext ctx $ \ctx' ->
-        withPacket pkt $ \pkt' -> do
-          ret <- _read_frame ctx' pkt'
-          return $ ret >= 0
diff --git a/src/Media/FFMpeg/Internals/SWScale.hsc b/src/Media/FFMpeg/Internals/SWScale.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals/SWScale.hsc
+++ /dev/null
@@ -1,87 +0,0 @@
--- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
-
-{- | Module 'Media.FFMpeg.Internals.SWScale' implements 
-   swscale header (its structures and datatypes) along with 
-   getters and setters to work with them
-   
-   (c) 2009 Vasyl Pasternak
- -}
-
-module Media.FFMpeg.Internals.SWScale
-    (
-    -- Enumerations
-    ScaleAlgorithm (..)
-
-    -- Context
-    ,Context
-    ,getContext
-    ,scale
-    ) where
-
-import Foreign
-import Foreign.C.String
-import Control.Monad (liftM)
-import Text.Printf
-import Media.FFMpeg.Internals.Types
-import Media.FFMpeg.Internals.Utils
-
-#include "libswscale/swscale.h"
-#include "macros.hsc2hs.h"
-
-
--- |Enumerations
-#{begin_enum ScaleAlgorithm, SWS_FAST_BILINEAR}
-#{add_enum SWS_BICUBIC}
-#{add_enum SWS_X}
-#{add_enum SWS_POINT}
-#{add_enum SWS_AREA}
-#{add_enum SWS_BICUBLIN}
-#{add_enum SWS_GAUSS}
-#{add_enum SWS_SINC}
-#{add_enum SWS_LANCZOS}
-#{add_enum SWS_SPLINE}
-#{end_enum "Eq,Ord,Show"}
-
--- |SwsContext
-
-newtype Context = Context (ForeignPtr Context)
-
-withContext :: Context -> (Ptr a -> IO b) -> IO b
-withContext (Context ctx) clos = withForeignPtr ctx (clos . castPtr)
-
-foreign import ccall "sws_freeContext" _free_context :: VoidP -> IO ()
-
-foreign import ccall "sws_getContext" _get_context :: 
-    SInt -> SInt -> #{type enum PixelFormat} -> 
-    SInt -> SInt -> #{type enum PixelFormat} ->
-    SInt -> VoidP -> VoidP -> VoidP -> IO VoidP
-
-combineBitMasks :: (Enum a, Bits b) => [a] -> b
-combineBitMasks = foldl (.|.) 0 . map (fromIntegral . fromEnum)
-
-getContext :: (Int, Int, PixelFormat) ->
-              (Int, Int, PixelFormat) ->
-              [ScaleAlgorithm] -> IO Context
-getContext (srcW, srcH, srcPf) (dstW, dstH, dstPf) flags = do
-  ret <- throwIf (== nullPtr) 
-         (\_ -> "getContext: failed to create SWScale context") $
-         _get_context (fromIntegral srcW) (fromIntegral srcH) (fromIntegral $ fromEnum srcPf)
-              (fromIntegral dstW) (fromIntegral dstH) (fromIntegral $ fromEnum dstPf) 
-              (combineBitMasks flags) nullPtr nullPtr nullPtr 
-  finalizer <- mkFinalizerPtr _free_context
-  newForeignPtr finalizer ret >>= return . Context . castForeignPtr
-
-foreign import ccall "sws_scale" _sws_scale ::
-    VoidP -> VoidP -> VoidP -> SInt -> SInt -> VoidP -> VoidP -> IO SInt
-
-scale :: Context -> PictureSlice -> PictureStride -> Int -> Int -> 
-         PictureSlice -> PictureStride -> IO ()
-scale ctx srcSlice srcStride srcSliceY srcSliceH dstSlice dstStride = 
-    withContext ctx $ \ctx' -> 
-        _sws_scale ctx' srcSlice srcStride 
-             (fromIntegral srcSliceY) 
-             (fromIntegral srcSliceH) 
-             dstSlice dstStride >> 
-         return ()
-
diff --git a/src/Media/FFMpeg/Internals/Types.hsc b/src/Media/FFMpeg/Internals/Types.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals/Types.hsc
+++ /dev/null
@@ -1,25 +0,0 @@
--- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-{- |The 'Media.FFMpeg.Internals.Types' module defines types and 
-   structures from the ffmpeg library
-   
-   (c) 2009 Vasyl Pasternak
- -}
-module Media.FFMpeg.Internals.Types
-    (
-     UInt
-    ,VoidP
-    ,SInt
-    ,PictureSlice
-    ,PictureStride
-    ) where
-
-import Foreign
-
-type UInt = #{type unsigned int}
-type SInt = #{type int}
-type VoidP = Ptr ()
-
-type PictureSlice = Ptr ()
-type PictureStride = Ptr ()
diff --git a/src/Media/FFMpeg/Internals/Utils.hsc b/src/Media/FFMpeg/Internals/Utils.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals/Utils.hsc
+++ /dev/null
@@ -1,126 +0,0 @@
--- -*- 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
diff --git a/src/Media/FFMpeg/Internals/_c_utils.c b/src/Media/FFMpeg/Internals/_c_utils.c
deleted file mode 100644
--- a/src/Media/FFMpeg/Internals/_c_utils.c
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-#include <libavcodec/avcodec.h>
-
-void b_free_packet (AVPacket* pkt){ av_free_packet (pkt);}
-
diff --git a/src/Media/FFMpeg/SWScale.hsc b/src/Media/FFMpeg/SWScale.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/SWScale.hsc
@@ -0,0 +1,86 @@
+-- -*- haskell -*-
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+{- |Module 'Media.FFMpeg.SWScale' implements bindings to SWScale library
+
+   (c) 2009 Vasyl Pasternak
+ -}
+
+module Media.FFMpeg.SWScale 
+    (
+     libSWScaleVersion
+    ,module Media.FFMpeg.SWScaleEnums_
+
+    ,Context
+    ,scale
+    ,getContext
+
+    )where
+
+#include "libswscale/swscale.h"
+
+import Data.Version
+import Foreign
+import Foreign.C.Types
+import Control.Monad (liftM)
+
+import Media.FFMpeg.Common
+import Media.FFMpeg.Util
+import Media.FFMpeg.SWScaleEnums_
+
+libSWScaleVersion :: Version
+libSWScaleVersion = Version {
+                      versionBranch = [
+                       #{const LIBSWSCALE_VERSION_MAJOR},
+                       #{const LIBSWSCALE_VERSION_MINOR},
+                       #{const LIBSWSCALE_VERSION_MICRO}
+                      ],
+                      versionTags = []
+                    }
+
+-- 
+-- |Context -- SwsContext implementation 
+--
+newtype Context = Context (ForeignPtr Context)
+
+instance ExternalPointer Context where
+    withThis (Context ctx) io = withForeignPtr ctx (io . castPtr)
+
+
+--
+-- |getContext - return SWScale context
+--
+
+foreign import ccall "sws_getContext" _sws_getContext :: 
+    CInt -> CInt -> #{type enum PixelFormat} -> 
+    CInt -> CInt -> #{type enum PixelFormat} ->
+    CInt -> Ptr () -> Ptr () -> Ptr () -> IO (Ptr ())
+
+foreign import ccall "sws_freeContext" _sws_freeContext :: Ptr () -> IO ()
+
+getContext :: (Int, Int, PixelFormat) ->
+              (Int, Int, PixelFormat) ->
+              [ScaleAlgorithm] -> IO Context
+getContext  (srcW, srcH, srcPf) (dstW, dstH, dstPf) flags = do
+  ret <- throwIf (==nullPtr)
+         (\_ -> "getContext: failed to create SWScale context")
+         (_sws_getContext (cFromInt srcW) (cFromInt srcH) (cFromEnum srcPf)
+           (cFromInt dstW) (cFromInt dstH) (cFromEnum dstPf)
+           (combineBitMasks flags) nullPtr nullPtr nullPtr)
+  liftM (Context . castForeignPtr) $ newFinForeignPtr _sws_freeContext ret
+           
+
+--
+-- | scale - a scale function
+--
+
+foreign import ccall "sws_scale" _sws_scale ::
+    Ptr () -> Ptr () -> Ptr () -> CInt -> CInt -> Ptr () -> Ptr () -> IO CInt
+
+scale :: Context -> Ptr () -> Ptr () -> Int -> Int -> Ptr () -> Ptr () -> IO ()
+scale ctx srcSlice srcStride srcSliceY srcSliceH dstSlice dstStride =
+    withThis ctx $ \ctx' ->
+        _sws_scale ctx' srcSlice srcStride 
+             (cFromInt srcSliceY) (cFromInt srcSliceH)
+             dstSlice dstStride >> return ()
+
diff --git a/src/Media/FFMpeg/SWScaleEnums_.hsc b/src/Media/FFMpeg/SWScaleEnums_.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/SWScaleEnums_.hsc
@@ -0,0 +1,31 @@
+-- -*- haskell -*- 
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+{- | Module 'Media.FFMpeg.SWScaleEnums_' implements 
+   enumeration from libswscale
+   
+   (c) 2009 Vasyl Pasternak
+ -}
+
+
+module Media.FFMpeg.SWScaleEnums_
+    (
+     ScaleAlgorithm (..)
+    ) where
+
+#include "libswscale/swscale.h"
+#include "macros.hsc2hs.h"
+
+-- |ScaleAlgorithm Enumeration
+#{begin_enum ScaleAlgorithm, SWS_FAST_BILINEAR}
+#{add_enum SWS_BICUBIC}
+#{add_enum SWS_X}
+#{add_enum SWS_POINT}
+#{add_enum SWS_AREA}
+#{add_enum SWS_BICUBLIN}
+#{add_enum SWS_GAUSS}
+#{add_enum SWS_SINC}
+#{add_enum SWS_LANCZOS}
+#{add_enum SWS_SPLINE}
+#{end_enum "Eq,Ord,Show"}
+
diff --git a/src/Media/FFMpeg/Scale.hs b/src/Media/FFMpeg/Scale.hs
deleted file mode 100644
--- a/src/Media/FFMpeg/Scale.hs
+++ /dev/null
@@ -1,14 +0,0 @@
--- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
-
-{- |Module 'Media.FFMpeg.Scale' implements bindings to SWScale library
-
-   (c) 2009 Vasyl Pasternak
- -}
-
-module Media.FFMpeg.Scale 
-    (
-     module Media.FFMpeg.Internals.SWScale
-    ) where
-
-import Media.FFMpeg.Internals.SWScale
diff --git a/src/Media/FFMpeg/Types.hsc b/src/Media/FFMpeg/Types.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Types.hsc
+++ /dev/null
@@ -1,12 +0,0 @@
--- -*- haskell -*-
-
-{- |Module 'Media.FFMpeg.Types' defines common types of the ffmpeg library
- -}
-
-module Media.FFMpeg.Types 
-    (
-    ) where
-
-import Media.FFMpeg.Internals
-import Foreign
-
diff --git a/src/Media/FFMpeg/Util.hsc b/src/Media/FFMpeg/Util.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/Util.hsc
@@ -0,0 +1,126 @@
+-- -*- haskell -*-
+{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables #-}
+
+{- |Module 'Media.FFMpeg.Util' implements bindings to AVUtil library
+
+   (c) 2009 Vasyl Pasternak
+ -}
+
+module Media.FFMpeg.Util 
+    (
+     module Media.FFMpeg.UtilEnums_
+
+    ,avMalloc
+    ,avFree
+
+    ,mkFinalizerPtr
+    ,avFinalizer
+    ,newAvForeignPtr
+    ,newFinForeignPtr
+
+    ,Buffer
+    ,bufferSize
+    ,allocBuffer
+    ,shiftBuffer
+    ,castBuffer
+    ,castBufferSize
+    ,withBuffer
+    ,unsafeBufferSetSize
+    )where
+
+import Foreign
+import Foreign.C.Types
+import Control.Monad (liftM)
+import Text.Printf
+
+import Media.FFMpeg.Common
+import Media.FFMpeg.UtilEnums_
+
+#include "libavutil/avutil.h"
+
+
+--
+-- |avFree
+-- 
+foreign import ccall "av_free" avFree :: Ptr a -> IO ()
+
+
+--
+-- |avMalloc 
+-- 
+foreign import ccall "av_malloc" _malloc :: CUInt -> IO (Ptr())
+
+avMalloc :: Integral a => a -> IO (Maybe (Ptr()))
+avMalloc a = do 
+  ptr <- _malloc (fromIntegral a)
+  return $ if ptr == nullPtr then Nothing else Just ptr 
+
+--
+-- |mkFinalizerPtr
+--
+foreign import ccall "wrapper" mkFinalizerPtr :: 
+    (Ptr a -> IO ()) -> IO (FunPtr (Ptr a -> IO ()))
+
+--
+-- |avFinalizer -- finalizer function pointer to avFree
+--
+avFinalizer :: IO (FunPtr (Ptr a -> IO ()))
+avFinalizer = mkFinalizerPtr avFree
+
+--
+-- |newAvForeignPtr create new foreign ptr with avFinalizer
+-- 
+newAvForeignPtr :: Ptr a -> IO (ForeignPtr a)
+newAvForeignPtr p = avFinalizer >>= \f -> newForeignPtr f p
+
+newFinForeignPtr :: (Ptr a -> IO ()) -> Ptr a -> IO (ForeignPtr a)
+newFinForeignPtr f p = mkFinalizerPtr f >>= \f' -> newForeignPtr f' p
+
+--
+-- |Buffer type
+--
+data Buffer = Buffer Int (ForeignPtr Buffer) 
+
+instance ExternalPointer Buffer where
+    withThis (Buffer _ b) io = withForeignPtr b (io . castPtr)
+
+bufferSize :: Buffer -> Int
+bufferSize (Buffer s _) = s
+
+shiftBuffer :: Int -> Buffer -> IO Buffer
+shiftBuffer l buf 
+    | l > bsize = error $
+                    printf "shiftBuffer: buffer is to narrow, size is %d, shift %d\n" 
+                           bsize l
+    | otherwise = withThis buf $ castBufferSize (bsize - l) . (`plusPtr` l) 
+    where bsize = bufferSize buf
+        
+
+--
+-- Allocate buffer with specified size
+--
+allocBuffer :: Int -> IO Buffer
+allocBuffer size = do
+  p <- throwIf 
+       (== nullPtr)
+       (\_ -> "allocBuffer: failed to allocate memory block")
+       (_malloc (fromIntegral size))
+  liftM (Buffer size . castForeignPtr) $ newAvForeignPtr p
+
+-- |Cast pointer to buffer with size (unsafe op)
+castBufferSize :: Int -> Ptr a -> IO Buffer
+castBufferSize s = liftM (Buffer s . castForeignPtr) . newForeignPtr_
+
+-- |Cast pointer to buffer (unsafe operation)
+castBuffer :: Ptr a -> IO Buffer
+castBuffer = castBufferSize (-1)
+
+-- |operations with buffer
+withBuffer :: ExternalPointer p => p -> (Ptr a -> IO b) -> IO b
+withBuffer = withThis
+
+-- | Very unsafe operation, allows to set size to the 
+-- existing buffer. Use very carefully
+unsafeBufferSetSize :: Buffer -> Int -> Buffer
+unsafeBufferSetSize (Buffer s b) ns = Buffer ns b
+
diff --git a/src/Media/FFMpeg/UtilEnums_.hsc b/src/Media/FFMpeg/UtilEnums_.hsc
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/UtilEnums_.hsc
@@ -0,0 +1,86 @@
+-- -*- haskell -*- 
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+{- | Module 'Media.FFMpeg.UtilEnums_' implements 
+    enumerations from libavutil
+   
+   (c) 2009 Vasyl Pasternak
+ -}
+
+
+module Media.FFMpeg.UtilEnums_
+    (
+     PixelFormat (..)
+    ) where
+
+#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"}
diff --git a/src/Media/FFMpeg/Version.hsc b/src/Media/FFMpeg/Version.hsc
deleted file mode 100644
--- a/src/Media/FFMpeg/Version.hsc
+++ /dev/null
@@ -1,46 +0,0 @@
--- -*- haskell -*-
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-{- |'Media.FFMpeg.Version' - FFMpeg version information -}
-
-module Media.FFMpeg.Version
-    (
-     libAVCodecVersion
-    ,libAVFormatVersion
-    ) where
-
-#include "libavformat/avformat.h"
-#include "libavcodec/avcodec.h"
-#include "libswscale/swscale.h"
-
-import Data.Version
-
-libAVFormatVersion :: Version
-libAVFormatVersion = Version {
-                       versionBranch = [
-                        #{const LIBAVFORMAT_VERSION_MAJOR},
-                        #{const LIBAVFORMAT_VERSION_MINOR},
-                        #{const LIBAVFORMAT_VERSION_MICRO}
-                       ],
-                       versionTags = []
-                     }
-
-libAVCodecVersion :: Version
-libAVCodecVersion = Version {
-                      versionBranch = [
-                       #{const LIBAVCODEC_VERSION_MAJOR},
-                       #{const LIBAVCODEC_VERSION_MINOR},
-                       #{const LIBAVCODEC_VERSION_MICRO}
-                      ],
-                      versionTags = []
-                    }
-
-libSWScaleVersion :: Version
-libSWScaleVersion = Version {
-                      versionBranch = [
-                       #{const LIBSWSCALE_VERSION_MAJOR},
-                       #{const LIBSWSCALE_VERSION_MINOR},
-                       #{const LIBSWSCALE_VERSION_MICRO}
-                      ],
-                      versionTags = []
-                    }
diff --git a/src/Media/FFMpeg/_c_utils.c b/src/Media/FFMpeg/_c_utils.c
new file mode 100644
--- /dev/null
+++ b/src/Media/FFMpeg/_c_utils.c
@@ -0,0 +1,6 @@
+
+#include <libavcodec/avcodec.h>
+
+void b_free_packet (AVPacket * pkt){
+  av_free_packet (pkt);
+}
