avif 0.1.0.1 → 0.1.0.2
raw patch · 4 files changed
+28/−29 lines, 4 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- Codec.Avif.FFI: avifDecoderReadMemory :: AvifDecoderPtr -> Ptr AvifImage -> Ptr UInt8 -> CSize -> IO AvifResult
+ Codec.Avif.FFI: avifDecoderReadMemory :: AvifDecoderPtr -> AvifImagePtr -> Ptr UInt8 -> CSize -> IO AvifResult
- Codec.Avif.FFI: avifEncoderWrite :: AvifEncoderPtr -> Ptr AvifImage -> Ptr AvifRwData -> IO AvifResult
+ Codec.Avif.FFI: avifEncoderWrite :: AvifEncoderPtr -> AvifImagePtr -> Ptr AvifRwData -> IO AvifResult
- Codec.Avif.FFI: avifImageDestroy :: Ptr AvifImage -> IO ()
+ Codec.Avif.FFI: avifImageDestroy :: FinalizerPtr ()
- Codec.Avif.FFI: avifImageRGBToYUV :: Ptr AvifImage -> Ptr AvifRGBImage -> IO AvifResult
+ Codec.Avif.FFI: avifImageRGBToYUV :: AvifImagePtr -> Ptr AvifRGBImage -> IO AvifResult
- Codec.Avif.FFI: avifImageYUVToRGB :: Ptr AvifImage -> Ptr AvifRGBImage -> IO AvifResult
+ Codec.Avif.FFI: avifImageYUVToRGB :: AvifImagePtr -> Ptr AvifRGBImage -> IO AvifResult
- Codec.Avif.FFI: avifRGBImageSetDefaults :: Ptr AvifRGBImage -> Ptr AvifImage -> IO ()
+ Codec.Avif.FFI: avifRGBImageSetDefaults :: Ptr AvifRGBImage -> AvifImagePtr -> IO ()
Files
- CHANGELOG.md +4/−0
- avif.cabal +2/−4
- src/Codec/Avif.chs +11/−14
- src/Codec/Avif/FFI.chs +11/−11
CHANGELOG.md view
@@ -1,5 +1,9 @@ # avif +# 0.1.0.2++ * Use finalizers under the hood+ ## 0.1.0.1 * Bundle test daa
avif.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.18 name: avif-version: 0.1.0.1+version: 0.1.0.2 license: AGPL-3 license-file: LICENSE copyright: Copyright: (c) 2021 Vanessa McHale@@ -25,7 +25,7 @@ hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall- build-depends: base >=4.7 && <5+ build-depends: base >=4.8 && <5 , bytestring , JuicyPixels , vector@@ -52,8 +52,6 @@ hs-source-dirs: test default-language: Haskell2010 ghc-options: -threaded -rtsopts "-with-rtsopts=-N -K1K" -Wall- -- libyuv is wrong?? lol- -- extra-libraries: jpeg build-depends: base, avif,
src/Codec/Avif.chs view
@@ -3,13 +3,11 @@ ) where import Codec.Avif.FFI-import Codec.Picture (Image (Image), PixelRGBA8, PixelYCbCr8)-import Control.Applicative (pure)+import Codec.Picture (Image (Image), PixelRGBA8) import Control.Exception (throwIO) import qualified Data.ByteString as BS import Data.ByteString.Internal (memcpy) import qualified Data.ByteString.Unsafe as BS-import Data.Functor ((<$>), (<$)) import Foreign.Ptr (castPtr) import Foreign.ForeignPtr (castForeignPtr, newForeignPtr, mallocForeignPtrBytes, withForeignPtr) import Foreign.Marshal (allocaBytes)@@ -18,8 +16,6 @@ #include <avif/avif.h> --- PixelYCbCr8?- throwRes :: AvifResult -> IO () throwRes AvifResultOk = pure (); throwRes err = throwIO err @@ -27,9 +23,10 @@ encode :: Image PixelRGBA8 -> BS.ByteString encode img = unsafePerformIO $ do avifImgPtr <- avifImageCreate (fromIntegral w) (fromIntegral h) 8 AvifPixelFormatYuv444+ avifImg <- castForeignPtr <$> newForeignPtr avifImageDestroy (castPtr avifImgPtr) res <- allocaBytes {# sizeof avifRGBImage #} $ \rgbImagePtr -> allocaBytes {# sizeof avifRWData #} $ \rwDataPtr -> do- avifRGBImageSetDefaults rgbImagePtr avifImgPtr+ avifRGBImageSetDefaults rgbImagePtr avifImg pxSz <- avifRGBImagePixelSize rgbImagePtr preEnc <- avifEncoderCreate@@ -37,21 +34,19 @@ withForeignPtr imgPtr $ \iPtr -> do - {# set avifRGBImage.height #} rgbImagePtr (fromIntegral h)- {# set avifRGBImage.width #} rgbImagePtr (fromIntegral w) {# set avifRGBImage.pixels #} rgbImagePtr (castPtr iPtr) {# set avifRGBImage.rowBytes #} rgbImagePtr (fromIntegral w*pxSz) - throwRes =<< avifImageRGBToYUV avifImgPtr rgbImagePtr+ throwRes =<< avifImageRGBToYUV avifImg rgbImagePtr - throwRes =<< avifEncoderWrite enc avifImgPtr rwDataPtr+ throwRes =<< avifEncoderWrite enc avifImg rwDataPtr sz <- {# get avifRWData->size #} rwDataPtr bs <- {# get avifRWData->data #} rwDataPtr BS.packCStringLen (castPtr bs, fromIntegral sz) - res <$ avifImageDestroy avifImgPtr+ pure res where (Image w h bytes) = img (imgPtr, _) = VS.unsafeToForeignPtr0 bytes@@ -61,8 +56,10 @@ decode bs = unsafePerformIO $ BS.unsafeUseAsCStringLen bs $ \(ptr, sz) -> do preDec <- avifDecoderCreate dec <- castForeignPtr <$> newForeignPtr avifDecoderDestroy (castPtr preDec)- avifImg <- avifImageCreateEmpty + avifImgPtr <- avifImageCreateEmpty+ avifImg <- castForeignPtr <$> newForeignPtr avifImageDestroy (castPtr avifImgPtr)+ throwRes =<< avifDecoderReadMemory dec avifImg (castPtr ptr) (fromIntegral sz) allocaBytes {# sizeof avifRGBImage #} $ \rgbImagePtr -> do@@ -76,10 +73,10 @@ pxPtr <- {# get avifRGBImage->pixels #} rgbImagePtr - let sz' = w * h * pxSz+ let sz' = w*h*pxSz outBytes <- mallocForeignPtrBytes (fromIntegral sz') withForeignPtr outBytes $ \outPtr -> do memcpy (castPtr outPtr) (castPtr pxPtr) (fromIntegral sz')- Image (fromIntegral w) (fromIntegral h) (VS.unsafeFromForeignPtr0 outBytes (fromIntegral sz')) <$ (avifRGBImageFreePixels rgbImagePtr *> avifImageDestroy avifImg)+ Image (fromIntegral w) (fromIntegral h) (VS.unsafeFromForeignPtr0 outBytes (fromIntegral sz')) <$ (avifRGBImageFreePixels rgbImagePtr)
src/Codec/Avif/FFI.chs view
@@ -21,7 +21,7 @@ import Control.Exception (Exception) import Data.Coerce (coerce)-import Data.Typeable (Typeable (..))+import Data.Typeable (Typeable) import Foreign.C.Types (CInt, CSize) import Foreign.Ptr (castPtr, Ptr) @@ -35,8 +35,9 @@ instance Exception AvifResult where --- {# pointer *LZ_Decoder as LZDecoderPtr foreign finalizer LZ_decompress_close as ^ -> LZDecoder #}-data AvifImage -- TODO: finalizer for AvifImage+{# pointer *avifImage as AvifImagePtr foreign finalizer avifImageDestroy as ^ -> AvifImage #}++data AvifImage data AvifEncoder data AvifDecoder data AvifRwData@@ -45,21 +46,20 @@ {# pointer *avifEncoder as AvifEncoderPtr foreign finalizer avifEncoderDestroy as ^ -> AvifEncoder #} {# pointer *avifDecoder as AvifDecoderPtr foreign finalizer avifDecoderDestroy as ^ -> AvifDecoder #} -{# fun avifImageCreate as ^ { `CInt', `CInt', `CInt', `AvifPixelFormat' } -> `Ptr AvifImage' castPtr #}-{# fun avifImageCreateEmpty as ^ { } -> `Ptr AvifImage' castPtr #}-{# fun avifImageDestroy as ^ { castPtr `Ptr AvifImage' } -> `()' #}+{# fun avifImageCreate as ^ { `CInt', `CInt', `CInt', `AvifPixelFormat' } -> `Ptr AvifImage' id #}+{# fun avifImageCreateEmpty as ^ { } -> `Ptr AvifImage' id #} {# fun avifEncoderCreate as ^ { } -> `Ptr AvifEncoder' castPtr #}-{# fun avifEncoderWrite as ^ { `AvifEncoderPtr', castPtr `Ptr AvifImage', castPtr `Ptr AvifRwData' } -> `AvifResult' #}+{# fun avifEncoderWrite as ^ { `AvifEncoderPtr', `AvifImagePtr', castPtr `Ptr AvifRwData' } -> `AvifResult' #} {# fun avifDecoderCreate as ^ { } -> `Ptr AvifDecoder' castPtr #}-{# fun avifDecoderReadMemory as ^ { `AvifDecoderPtr', castPtr `Ptr AvifImage', castPtr `Ptr UInt8', coerce `CSize' } -> `AvifResult' #}+{# fun avifDecoderReadMemory as ^ { `AvifDecoderPtr', `AvifImagePtr', castPtr `Ptr UInt8', coerce `CSize' } -> `AvifResult' #} -{# fun avifRGBImageSetDefaults as ^ { castPtr `Ptr AvifRGBImage', castPtr `Ptr AvifImage' } -> `()' #}+{# fun avifRGBImageSetDefaults as ^ { castPtr `Ptr AvifRGBImage', `AvifImagePtr' } -> `()' #} {# fun avifRGBImagePixelSize as ^ { castPtr `Ptr AvifRGBImage' } -> `UInt32' id #} -{# fun avifImageRGBToYUV as ^ { castPtr `Ptr AvifImage', castPtr `Ptr AvifRGBImage' } -> `AvifResult' #}-{# fun avifImageYUVToRGB as ^ { castPtr `Ptr AvifImage', castPtr `Ptr AvifRGBImage' } -> `AvifResult' #}+{# fun avifImageRGBToYUV as ^ { `AvifImagePtr', castPtr `Ptr AvifRGBImage' } -> `AvifResult' #}+{# fun avifImageYUVToRGB as ^ { `AvifImagePtr', castPtr `Ptr AvifRGBImage' } -> `AvifResult' #} {# fun avifRGBImageAllocatePixels as ^ { castPtr `Ptr AvifRGBImage' } -> `()' #} {# fun avifRGBImageFreePixels as ^ { castPtr `Ptr AvifRGBImage' } -> `()' #}