|
|
@@ -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) |
|
|
static void input_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) |
|
|
{ |
|
|
{ |
|
|
if (!buffer->cmd) { |
|
|
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); |
|
|
mmal_buffer_header_release(buffer); |
|
|
} |
|
|
} |
|
|
@@ -535,19 +536,19 @@ static int ffmmal_fill_input_port(AVCodecContext *avctx) |
|
|
mbuffer->flags = buffer->flags; |
|
|
mbuffer->flags = buffer->flags; |
|
|
mbuffer->data = buffer->data; |
|
|
mbuffer->data = buffer->data; |
|
|
mbuffer->length = buffer->length; |
|
|
mbuffer->length = buffer->length; |
|
|
mbuffer->user_data = buffer->ref; |
|
|
|
|
|
|
|
|
mbuffer->user_data = buffer; |
|
|
mbuffer->alloc_size = ctx->decoder->input[0]->buffer_size; |
|
|
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 |
|
|
// Remove from start of the list |
|
|
ctx->waiting_buffers = buffer->next; |
|
|
ctx->waiting_buffers = buffer->next; |
|
|
if (ctx->waiting_buffers_tail == buffer) |
|
|
if (ctx->waiting_buffers_tail == buffer) |
|
|
ctx->waiting_buffers_tail = NULL; |
|
|
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) { |
|
|
if (status) { |
|
|
av_log(avctx, AV_LOG_ERROR, "MMAL error %d when sending input\n", (int)status); |
|
|
av_log(avctx, AV_LOG_ERROR, "MMAL error %d when sending input\n", (int)status); |
|
|
|