MCPcopy Create free account
hub / github.com/AOMediaCodec/libavif / avifEncoderFinish

Function avifEncoderFinish

src/write.c:3152–3859  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3150}
3151
3152avifResult avifEncoderFinish(avifEncoder * encoder, avifRWData * output)
3153{
3154 avifDiagnosticsClearError(&encoder->diag);
3155 if (encoder->data->items.count == 0) {
3156 return AVIF_RESULT_NO_CONTENT;
3157 }
3158
3159 const avifCodecType codecType = avifEncoderGetCodecType(encoder);
3160 if (codecType == AVIF_CODEC_TYPE_UNKNOWN) {
3161 return AVIF_RESULT_NO_CODEC_AVAILABLE;
3162 }
3163
3164 // -----------------------------------------------------------------------
3165 // Finish up encoding
3166
3167 for (uint32_t itemIndex = 0; itemIndex < encoder->data->items.count; ++itemIndex) {
3168 avifEncoderItem * item = &encoder->data->items.item[itemIndex];
3169 if (item->codec) {
3170 if (!item->codec->encodeFinish(item->codec, item->encodeOutput)) {
3171 return avifGetErrorForItemCategory(item->itemCategory);
3172 }
3173
3174 if (item->encodeOutput->samples.count != encoder->data->frames.count) {
3175 return avifGetErrorForItemCategory(item->itemCategory);
3176 }
3177
3178 if ((item->extraLayerCount > 0) && (item->encodeOutput->samples.count != item->extraLayerCount + 1)) {
3179 // Check whether user has sent enough frames to encoder.
3180 avifDiagnosticsPrintf(&encoder->diag,
3181 "Expected %u frames given to avifEncoderAddImage() to encode this layered image according to extraLayerCount, but got %u frames.",
3182 item->extraLayerCount + 1,
3183 item->encodeOutput->samples.count);
3184 return AVIF_RESULT_INVALID_ARGUMENT;
3185 }
3186 }
3187 }
3188
3189 // -----------------------------------------------------------------------
3190 // Harvest configuration properties from sequence headers
3191
3192 for (uint32_t itemIndex = 0; itemIndex < encoder->data->items.count; ++itemIndex) {
3193 avifEncoderItem * item = &encoder->data->items.item[itemIndex];
3194 if (item->encodeOutput->samples.count > 0) {
3195 const avifEncodeSample * firstSample = &item->encodeOutput->samples.sample[0];
3196 avifSequenceHeader sequenceHeader;
3197 AVIF_CHECKERR(avifSequenceHeaderParse(&sequenceHeader, (const avifROData *)&firstSample->data, codecType),
3198 avifGetErrorForItemCategory(item->itemCategory));
3199 item->av1C = sequenceHeader.av1C;
3200 }
3201 }
3202
3203 // -----------------------------------------------------------------------
3204 // Begin write stream
3205
3206#if defined(AVIF_ENABLE_EXPERIMENTAL_MINI)
3207 // Decide whether to go for a reduced MinimizedImageBox or a full regular MetaBox.
3208 if ((encoder->headerFormat & AVIF_HEADER_MINI) && avifEncoderIsMiniCompatible(encoder)) {
3209 AVIF_CHECKRES(avifEncoderWriteFileTypeBoxAndMiniBox(encoder, output));

Callers 15

WriteAvifGridFunction · 0.85
avifEncoderWriteFunction · 0.85
GetIoStatsFromEncodeFunction · 0.85
EncodeAsGridFunction · 0.85
EncodeDecodeGridValidFunction · 0.85
EncodeDecodeGridFunction · 0.85
TESTFunction · 0.85
EncodeDecodeAnimationFunction · 0.85
TEST_PFunction · 0.85
TestEncodeDecodeFunction · 0.85
EncodeAnimationFunction · 0.85

Calls 15

avifEncoderGetCodecTypeFunction · 0.85
avifDiagnosticsPrintfFunction · 0.85
avifSequenceHeaderParseFunction · 0.85
avifRWStreamStartFunction · 0.85
avifRWStreamWriteBoxFunction · 0.85
avifRWStreamWriteCharsFunction · 0.85
avifRWStreamWriteU32Function · 0.85
avifRWStreamFinishBoxFunction · 0.85
avifRWStreamWriteFullBoxFunction · 0.85

Tested by 14

GetIoStatsFromEncodeFunction · 0.68
EncodeAsGridFunction · 0.68
EncodeDecodeGridValidFunction · 0.68
EncodeDecodeGridFunction · 0.68
TESTFunction · 0.68
EncodeDecodeAnimationFunction · 0.68
TEST_PFunction · 0.68
TestEncodeDecodeFunction · 0.68
EncodeAnimationFunction · 0.68
EncodeAnimationFunction · 0.68
TESTFunction · 0.68
TEST_FFunction · 0.68