diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index ae9d749fc9..da1e36cae4 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -188,8 +188,9 @@ static av_cold int ffmmal_close_decoder(AVCodecContext *avctx) static void input_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { if (!buffer->cmd) { - AVBufferRef *buf = buffer->user_data; - av_buffer_unref(&buf); + FFBufferEntry *entry = buffer->user_data; + av_buffer_unref(&entry->ref); + av_free(entry); } mmal_buffer_header_release(buffer); } @@ -535,19 +536,19 @@ static int ffmmal_fill_input_port(AVCodecContext *avctx) mbuffer->flags = buffer->flags; mbuffer->data = buffer->data; mbuffer->length = buffer->length; - mbuffer->user_data = buffer->ref; + mbuffer->user_data = buffer; mbuffer->alloc_size = ctx->decoder->input[0]->buffer_size; - if ((status = mmal_port_send_buffer(ctx->decoder->input[0], mbuffer))) { - mmal_buffer_header_release(mbuffer); - av_buffer_unref(&buffer->ref); - } - // Remove from start of the list ctx->waiting_buffers = buffer->next; if (ctx->waiting_buffers_tail == buffer) ctx->waiting_buffers_tail = NULL; - av_free(buffer); + + if ((status = mmal_port_send_buffer(ctx->decoder->input[0], mbuffer))) { + mmal_buffer_header_release(mbuffer); + av_buffer_unref(&buffer->ref); + av_free(buffer); + } if (status) { av_log(avctx, AV_LOG_ERROR, "MMAL error %d when sending input\n", (int)status);