[RK3288][Android6.0] Skia中的编解码小结

本文主要介绍了在Rockchip RK3288平台,搭载Android 6.0系统和3.10.92内核环境下,Skia库中的编解码实现。通过SkTRegistry模板类进行编解码器注册,例如JPEG的解码器注册。在创建过程中,解码部分的实现以JPEG为例,调用特定的factory创建SkJPEGImageDecoder实例。SkImageDecoder的子类需要实现编解码功能,尽管JPEG的decodeStream函数提供了软解码和硬解码选项,但在实际中似乎默认选择了软解码。文章还提到了Android图片编解码的其他实现方案。
摘要由CSDN通过智能技术生成

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

编解码器注册:

SKIA的编解码部分通过一个模板类来实现,这样做的为了实现不同类型的codec兼容
external\skia\include\core\SkTRegistry.h

template <typename T> class SkTRegistry : SkNoncopyable {
public:
    typedef T Factory;
    //fFact即传进去来的fact类型,其实它是一个函数指针,后面创建codec会调用。
    explicit SkTRegistry(T fact) : fFact(fact) {
#ifdef SK_BUILD_FOR_ANDROID
        // work-around for double-initialization bug
        {
            //gHead是链表头
            SkTRegistry* reg = gHead;
            //循环比较每个元素
            while (reg) {
                //找到就返回
                if (reg == this) {
                    return;
                }
                //比较下一个
                reg = reg->fChain;
            }
        }
#endif
        //没有找到则说明是没注册过
        fChain = gHead;
        //当前最新注册作为表头
        gHead  = this;
    }
    static const SkTRegistry* Head() { return gHead; }
    const SkTRegistry* next() const { return fChain; }
    const Factory& factory() const { return fFact; }
};

模板类被定义成如下type:
SkImageDecoder.h

typedef SkTRegistry<SkImageDecoder*(*)(SkStreamRewindable*)>        SkImageDecoder_DecodeReg;
typedef SkTRegistry<SkImageDecoder::Format(*)(SkStreamRewindable*)> SkImageDecoder_FormatReg;

SkImageEncoder.h

typedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;

调用例子,比如jpeg编解码模块的使用:
SkImageDecode

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值