这是我的情况:
我想调用FFmpeg的av_free_packet
函数:
// avformat.h
static inline void av_free_packet(AVPacket *pkt)
{
if (pkt && pkt->destruct)
pkt->destruct(pkt);
}
但不幸的是,这个函数是static inline
的,因此在链接库中并没有真正出现。
然而,这是一个非常简单的函数,我可以在Haskell中重新实现它。而这正是我无法弄清楚如何做的。下面是我的部分尝试 (.hsc):
av_free_packet :: Ptr AVPacket -> IO ()
av_free_packet pkt =
when (nullPtr /= pkt) $ do
destruct <- (#peek AVPacket, destruct) pkt :: IO (FunPtr (Ptr AVPacket -> IO ()))
when (nullFunPtr /= destruct) $ funPtrToFun destruct pkt
funPtrToFun :: FunPtr a -> a
funPtrToFun = ?
目前来说,我可以通过在C语言中实现该函数(只需调用原始函数)来解决问题,但我觉得以某种方式调用函数指针应该也是可行的。