typedef struct {
AVCodecContext *ctx;
AVCodec *codec;
- AVPacket pkt;
} _ffmpeg_decoder_t;
return LIBHEIF_ERROR_INVALID_OPERATION;
}
-static int __ffmpeg_send_media(_ffmpeg_decoder_t *decoder, heif_buffer_t *media_data)
+static int __ffmpeg_packet_alloc_from_data(AVPacket **pkt, heif_buffer_t *media_data)
{
+ AVPacket *_pkt;
uint8_t *pkt_buf;
- heif_retvm_if_failed(decoder, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid decoder");
+ heif_retvm_if_failed(pkt, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid pkt");
heif_retvm_if_failed(media_data, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid media_data");
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");
- av_packet_unref(&(decoder->pkt));
-
- av_init_packet(&(decoder->pkt));
+ _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
- pkt_buf = g_memdup(media_data->data, media_data->size);
+ // 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 (av_packet_from_data(&decoder->pkt, pkt_buf, media_data->size) < 0) {
+ 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;
}
+ *pkt = _pkt;
+
return LIBHEIF_ERROR_NONE;
}
heif_retm_if_failed(decoder);
- av_packet_unref(&_decoder->pkt);
if (_decoder->ctx) {
avcodec_close(_decoder->ctx);
av_freep(&_decoder->ctx);
static int __ffmpeg_decode_image(plugin_decode_h decoder, heif_buffer_t *media_data, heif_color_format_e colr_fmt, heif_image_t **decoded_image)
{
int ret = LIBHEIF_ERROR_NONE;
+ AVPacket *pkt = NULL;
AVFrame *frame = NULL;
_ffmpeg_decoder_t *_decoder = (_ffmpeg_decoder_t *)decoder;
heif_debug_fenter();
- ret = __ffmpeg_send_media(_decoder, media_data);
- if (ret != LIBHEIF_ERROR_NONE) {
- heif_error("__ffmpeg_send_media fail (%d)", ret);
- return LIBHEIF_ERROR_INVALID_OPERATION;
- }
+ ret = __ffmpeg_packet_alloc_from_data(&pkt, media_data);
+ heif_retvm_if_failed(ret == LIBHEIF_ERROR_NONE, ret, "__ffmpeg_packet_alloc_from_data fail (%d)", ret);
avcodec_flush_buffers(_decoder->ctx);
}
// decode
- if (avcodec_send_packet(_decoder->ctx, &_decoder->pkt) < 0) {
+ if (avcodec_send_packet(_decoder->ctx, pkt) < 0) {
heif_error("avcodec_send_packet fail");
ret = LIBHEIF_ERROR_INVALID_OPERATION;
goto END;
END:
av_frame_free(&frame);
+ av_packet_free(&pkt);
heif_debug_fleave();