liavif 封装

{

#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);
}

}

 

posted @ 2024-07-11 13:02  YZFHKMS-X  阅读(8)  评论(0编辑  收藏  举报