AOMediaCodec / libavif

libavif - Library for encoding and decoding .avif files
Other
1.51k stars 191 forks source link

Avif-alpha is working as expected #2180

Open indolia111 opened 3 months ago

indolia111 commented 3 months ago

Here is the image which is correctly working in AVIF while in AVIF-alpha showing outlines on icons. image after avif-alpha: image image with avif: image

here is the code that i am using :

`IgcBufBase::Ptr IsrvImageRects::CreateAvifImage(IrsRasConst ras, int / format /, int ippEncoding, int quality, bool doAlpha, size_t * length) { IrsRas avifRas = CreateRasForAvif(ras, doAlpha); int depth = 8; int height = avifRas.rect().ht(); int width = avifRas.rect().wd(); avifPixelFormat format = AVIF_PIXEL_FORMAT_YUV420;

IrsTAccessConst<IgcDtBit8> pixels(avifRas);

avifRGBImage rgb;
avifImage * image = avifImageCreate(width, height, depth, format);
avifRGBImageSetDefaults(&rgb, image);
image->colorPrimaries = AVIF_COLOR_PRIMARIES_BT709;
image->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB;
image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601;
rgb.pixels=(uint8_t*)  pixels.ptr();
rgb.rowBytes=avifRas.numComps() * avifRas.rect().wd();

if (avifRas.numComps() == 4) {
    rgb.format = AVIF_RGB_FORMAT_RGBA;
} else {
    rgb.format = AVIF_RGB_FORMAT_RGB;
}

if (avifImageRGBToYUV(image, &rgb) != AVIF_RESULT_OK) {
    avifImageDestroy(image);
    throw new IgcEx_Unsupported("AVIF format - Problem in RGB(A) to YUV conversion", IGC_WHERE);
}

avifRWData encodedData = AVIF_DATA_EMPTY;
avifEncoder * encoder = NULL;
encoder = avifEncoderCreate();
encoder->codecChoice=AVIF_CODEC_CHOICE_AUTO;
encoder->maxThreads = 2;
encoder->speed = 8;
encoder->quality = quality;

if ( avifEncoderWrite(encoder, image, &encodedData) != AVIF_RESULT_OK) {
    avifEncoderDestroy(encoder);
    avifImageDestroy(image);
    throw new IgcEx_Unsupported("AVIF format - Encoding Failed", IGC_WHERE);
}

avifEncoderDestroy(encoder);
avifImageDestroy(image);

IgcBufSpec spec(encodedData.size);
IgcBufBase::Ptr buf = IgcBufBase::Create(spec);
memcpy(buf->buf(), encodedData.data,encodedData.size);

*length = encodedData.size;
avifRWDataFree(&encodedData);
return buf;

}`

wantehchang commented 3 months ago

Hi indolia111,

Your code looks correct to me. I am afraid that we will need the input RGBA image (perhaps as a PNG file) to debug this.