首页 > 其他分享 >liavif 封装

liavif 封装

时间:2024-07-11 13:08:45浏览次数:5  
标签:封装 frame davif liavif rgb result decoder image

{

#ifndef __DAVIF_H__
#define __DAVIF_H__
#include <defineds.h>
#include <iostream>
#include <string>
#include <string.h>
#include <queue>
using namespace std;

extern "C"
{
#include <avif/avif.h>
#include <SOIL2.h>
}


class EX_DLL davif
{
    avifDecoder * m_decoder;

    avifResult result;

public:

    davif();

    ~davif();

    avifResult load(std::string path);

    //please free rame pix data
    int get(avifRGBImage *frame);

    void free(avifRGBImage *frame);

    ///
    int saveImage(avifRGBImage *frame,const char *filename, int image_type = SOIL_SAVE_TYPE_PNG);

private:

    avifDecoder *createDecoder();

};

#endif // !__DAVIF_H__

}

{

#include "davif.h"


avifDecoder *davif::createDecoder()
{
    avifDecoder * decoder = avifDecoderCreate();

    if (decoder)
    {
        return decoder;
    }
    return nullptr;
}

davif::davif()
{
    m_decoder = this->createDecoder();

}

davif::~davif()
{
    
    avifDecoderDestroy(m_decoder);
}

avifResult davif::load(std::string path)
{
    avifResult result = avifDecoderSetIOFile(m_decoder, path.c_str());
    if (result != AVIF_RESULT_OK)
    {
        //fprintf(stderr, "Cannot open file for read: %s\n", path.c_str());
        return result;
    }
    printf("open file for read: %s\n", path.c_str());
    result = avifDecoderParse(m_decoder);
    if (result != AVIF_RESULT_OK)
    {
        //fprintf(stderr, "Failed to decode image: %s\n", avifResultToString(result));
        return result;
    }
    printf("decode image: %s\n", avifResultToString(result));

    //printf("Parsed AVIF: %ux%u (%ubpc)\n",
    //    m_decoder->image->width, m_decoder->image->height, m_decoder->image->depth);

    return AVIF_RESULT_OK;
}

void davif::free(avifRGBImage *frame)
{
    avifRGBImageFreePixels(frame);
    // Only use in conjunction with avifRGBImageAllocatePixels()
}

int davif::get(avifRGBImage *frame)
{
    result = avifDecoderNextImage(m_decoder);

    while (result == AVIF_RESULT_OK)
    {
        // Now available (for this frame):
        // * All decoder->image YUV pixel data (yuvFormat, yuvPlanes, yuvRange, yuvChromaSamplePosition, yuvRowBytes)
        // * decoder->image alpha data (alphaPlane, alphaRowBytes)
        // * this frame's sequence timing

        avifRGBImageSetDefaults(frame, m_decoder->image);
        // Override YUV(A)->RGB(A) defaults here:
        //   depth, format, chromaUpsampling, avoidLibYUV, ignoreAlpha, alphaPremultiplied, etc.

        // Alternative: set rgb.pixels and rgb.rowBytes yourself, which should match your chosen rgb.format
        // Be sure to use uint16_t* instead of uint8_t* for rgb.pixels/rgb.rowBytes if (rgb.depth > 8)
        result = avifRGBImageAllocatePixels(frame);
        if (result != AVIF_RESULT_OK)
        {
            printf("avifRGBImageAllocatePixels faild \n");
            return result;
        }

        result = avifImageYUVToRGB(m_decoder->image, frame);
        if (result != AVIF_RESULT_OK)
        {
            printf("avifImageYUVToRGB faild \n");
            return result;
        }

        // Now available:
        // * RGB(A) pixel data (rgb.pixels, rgb.rowBytes)

        if (frame->depth > 8)
        {
            uint16_t * firstPixel = (uint16_t *)frame->pixels;
        }
        else
        {
            uint8_t * firstPixel = frame->pixels;
        }
        frame->depth = frame->depth;
        frame->width = frame->width;
        frame->height = frame->height;
        frame->pixels = frame->pixels;
        return result;
    }
    return result;
}

int davif::saveImage(avifRGBImage *frame, const char *filename, int image_type)
{
    int re = SOIL_save_image(filename, image_type,
        frame->width, frame->height,
        SOIL_LOAD_RGBA, frame->pixels);

    return re;
}

}

 

{

davif davifs;
//H:/image/cfimage/26.avif
void HelloWorld::avif(string file)
{

    avifRGBImage rgb;
    memset(&rgb, 0, sizeof(rgb));

    cocos2d::log("avif version: %s\n", avifVersion());

    auto l = davifs.load(file);
    auto g = davifs.get(&rgb);

    cocos2d::log("avif file load: %d\n", l);
    cocos2d::log("avif file get: %d\n", g);

    char buf[1024] = { 0 };
    avifCodecVersions(buf);
    cocos2d::log("avif v: %s\n", buf);

    Texture2D *texture = new Texture2D();
    if (texture)
    {
        texture->autorelease();
    }
    auto data = rgb.pixels;
    auto width = rgb.width;
    auto height = rgb.height;

    cocos2d::log("avif file width : %d height : %d\n", width, height);

    texture->initWithData(data,
        width *  height * 4,
        Texture2D::PixelFormat::RGBA8888,
        width, height,
        Size(width, height));
    auto __s = Sprite::createWithTexture(texture);
    __s->setPosition(visibleSize / 2);
    __s->setScale(0.5f);
    this->addChild(__s);

    davifs.free(&rgb);
}

}

 

标签:封装,frame,davif,liavif,rgb,result,decoder,image
From: https://www.cnblogs.com/YZFHKMS-X/p/18295939

相关文章

  • 【uni-app+Vue3】 API请求封装:让接口调用更便捷
    前言:uni-app是一款基于Vue.js框架的跨平台开发工具,可以将代码编译成H5、小程序、App等不同平台的应用。在进行uni-app开发时,网络请求是必不可少的环节。为了方便开发,我们可以封装一些网络请求方法,以便在多个页面中复用,并且可以统一处理错误信息等问题,提高开发效率和代码质量。......
  • uniapp+vue3封装下拉框(支持单选、多选)
    子组件代码<template><viewclass="uni-select-dc"><viewref="select"class="uni-select-dc-select":class="{active:active}"@click.stop="handleSelect">......
  • uniapp 封装蓝牙-(给设备发指令,分包数据发送)
    注意事项:1、关键点:初始化蓝牙——》uni.openBluetoothAdapter获取本机蓝牙适配器状态——》uni.getBluetoothAdapterState开始搜索蓝牙设备——》uni.startBluetoothDevicesDiscovery监听蓝牙设备(或者蓝牙设备列表,找到需要的那个)——......
  • uniapp 二次封装ui组件加class样式或修改样式在微信小程序不生效的情况
    原因:首先不论是自定义组件还是ui组件,本质上的原因都是微信小程序默认的组件隔离策略导致的。微信小程序组件隔离文档参考组件样式隔离默认情况下,自定义组件的样式只受到自定义组件wxss的影响。除非以下两种情况:指定特殊的样式隔离选项 styleIsolation 。webvie......
  • C# 类、对象与封装
    目录前言一、类及其构成1、类和对象2、类的定义二、对象 1、对象声明2、为声明对象分配内存3、使用对象三、封装 前言把相关的数据(数据结构)和操作(算法)放在一起,构成一个有机的整体(对象),实现与外界相对分隔,这就叫“封装”一个对象。 设计者......
  • 九,MYSQL之存储过程,实际就是用slq写函数,封装方法
    目录一,概念    1,介绍.    2,特性    3,作用二,格式    简单的存储过程案例基本格式:三,变量    1,局部变量        2,变量赋值     3,会话变量 3,系统变量四,参数    1,in参数   ......
  • Android开发——使用Android Studio封装SDK(二) jar
    前言:什么叫SDK?  软件开发工具包(SoftwareDevelopmentKit,缩写SDK)一般是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。  Android常见的SDK有哪些形式?   (1).so库:是C或C++语言而打包成的库。   (2)......
  • 《框架封装 · 线程装饰器》
    ......
  • 使用Canvas封装图片压缩功能
    最近在学习和工作中遇到这样一个场景:如何将前端上传的图片进行压缩传递给服务端?因为此前从未了解过图片压缩的功能,所以也是带着好奇进行了一番学习,那么我的解决思路如下展示整体思路创建input框实现图片上传将上传的文件转成base64格式前端通过base64进行原始图片展示,并将此......
  • React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装
    文章目录前言CommonChart组件1.功能分析2.代码+详细注释3.使用到的全局hook代码4.使用方式5.效果展示总结前言Echarts图表在项目中经常用到,然而,重复编写初始化,更新,以及清除实例等动作对于开发人员来说是一种浪费时间和精力。因此,在这篇文章中,将封装一个“高......