blob: 770468273f9e54849f0d1b8b95d5f34c5c2610a1 [file] [log] [blame]
// Copyright 2019 Joe Drago. All rights reserved.
// SPDX-License-Identifier: BSD-2-Clause
#include "avif/avif.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char * argv[])
{
const char * inputFilename = NULL;
if (argc < 2) {
return 0;
}
inputFilename = argv[1];
FILE * inputFile = fopen(inputFilename, "rb");
if (!inputFile) {
fprintf(stderr, "Cannot open file for read: %s\n", inputFilename);
return 1;
}
fseek(inputFile, 0, SEEK_END);
size_t inputFileSize = ftell(inputFile);
fseek(inputFile, 0, SEEK_SET);
if (inputFileSize < 1) {
fprintf(stderr, "File too small: %s\n", inputFilename);
fclose(inputFile);
return 1;
}
avifRWData raw = AVIF_DATA_EMPTY;
avifRWDataRealloc(&raw, inputFileSize);
if (fread(raw.data, 1, inputFileSize, inputFile) != inputFileSize) {
fprintf(stderr, "Failed to read %zu bytes: %s\n", inputFileSize, inputFilename);
fclose(inputFile);
avifRWDataFree(&raw);
return 1;
}
fclose(inputFile);
inputFile = NULL;
avifDecoder * decoder = avifDecoderCreate();
// avifDecoderSetSource(decoder, AVIF_DECODER_SOURCE_PRIMARY_ITEM);
avifResult result = avifDecoderParse(decoder, (avifROData *)&raw);
if (result == AVIF_RESULT_OK) {
for (int loop = 0; loop < 2; ++loop) {
printf("Image decoded: %s\n", inputFilename);
printf(" * %2.2f seconds, %d images\n", decoder->duration, decoder->imageCount);
int frameIndex = 0;
while (avifDecoderNextImage(decoder) == AVIF_RESULT_OK) {
printf(" * Decoded frame [%d] [pts %2.2f] [duration %2.2f] [keyframe:%s nearest:%u]: %dx%d\n",
frameIndex,
decoder->imageTiming.pts,
decoder->imageTiming.duration,
avifDecoderIsKeyframe(decoder, frameIndex) ? "true" : "false",
avifDecoderNearestKeyframe(decoder, frameIndex),
decoder->image->width,
decoder->image->height);
++frameIndex;
}
if (loop != 1) {
result = avifDecoderReset(decoder);
if (result == AVIF_RESULT_OK) {
printf("Decoder reset! Decoding one more time.\n");
} else {
printf("ERROR: Failed to reset decode: %s\n", avifResultToString(result));
break;
}
}
}
} else {
printf("ERROR: Failed to decode image: %s\n", avifResultToString(result));
}
#if 0
int frameIndex = 25;
if (avifDecoderNthImage(decoder, frameIndex) == AVIF_RESULT_OK) {
printf(" * Decoded frame [%d] [pts %2.2f] [duration %2.2f] [keyframe:%s nearest:%u]: %dx%d\n",
frameIndex,
decoder->imageTiming.pts,
decoder->imageTiming.duration,
avifDecoderIsKeyframe(decoder, frameIndex) ? "true" : "false",
avifDecoderNearestKeyframe(decoder, frameIndex),
decoder->image->width,
decoder->image->height);
}
#endif
avifRWDataFree(&raw);
avifDecoderDestroy(decoder);
return 0;
}