goto FAIL;
}
+ // use libswscale to transform the frame into an image of wanted format
img_convert_ctx = sws_getContext(frame->width, frame->height, frame->format, frame->width, frame->height, pix_fmt, SWS_BICUBIC, NULL, NULL, NULL);
-
- if (NULL == img_convert_ctx) {
+ if (!img_convert_ctx) {
heif_error("sws_getContext fail");
goto FAIL;
}
heif_retvm_if_failed(media_data->data, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid media_data->data");
heif_retvm_if_failed(media_data->size > 0, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid media_data->size");
+ // the packet should be released by av_packet_unref or av_packet_free
_pkt = av_packet_alloc();
heif_retvm_if_failed(_pkt, LIBHEIF_ERROR_INVALID_OPERATION, "av_packet_alloc fail");
- // this buffer should be released by av_packet_unref or av_packet_free
pkt_buf = av_memdup(media_data->data, media_data->size);
- heif_retvm_if_failed(pkt_buf, LIBHEIF_ERROR_INVALID_OPERATION, "av_memdup fail");
+ if (!pkt_buf) {
+ heif_error("av_memdup fail");
+ goto FAIL;
+ }
if (av_packet_from_data(_pkt, pkt_buf, media_data->size) < 0) {
heif_error("av_packet_from_data fail");
- g_free(pkt_buf);
- av_packet_free(&_pkt);
- return LIBHEIF_ERROR_INVALID_OPERATION;
+ goto FAIL;
}
*pkt = _pkt;
return LIBHEIF_ERROR_NONE;
+
+FAIL:
+ if (pkt_buf)
+ av_free(pkt_buf);
+ av_packet_free(&_pkt);
+
+ return LIBHEIF_ERROR_INVALID_OPERATION;
}
static int __ffmpeg_get_decoder(int codec_id, _ffmpeg_decoder_t *decoder)
// hevc decoder doesn't support any other fmt.
decoder->ctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
- decoder->ctx->thread_count = 1; // sw decoding should set '1' because ffmpeg is thread-unsafety
+ // sw decoding should set '1' because ffmpeg is thread-unsafety
+ decoder->ctx->thread_count = 1;
heif_debug_fleave();