Commit 152c5ba4 authored by Julian Scheel's avatar Julian Scheel Committed by Rémi Denis-Courmont

mmal/codec: Explicitly count buffers in transit

The previous approach of calculating the buffers in transit was broken because
it assumed that buffers which were currently processed in the video output
stage are in transit. In fact only those buffers which are currently handed
off to the mmal output port of the video_decode plugin are to be counted as
buffers in transit. Fixing this avoids some framedrops due to missing/late
buffers.
Signed-off-by: default avatarJulian Scheel <julian@jusst.de>
Signed-off-by: default avatarRémi Denis-Courmont <remi@remlab.net>
parent 32249e3d
...@@ -74,6 +74,9 @@ struct decoder_sys_t { ...@@ -74,6 +74,9 @@ struct decoder_sys_t {
bool b_top_field_first; bool b_top_field_first;
bool b_progressive; bool b_progressive;
/* statistics */
int output_in_transit;
}; };
/* Utilities */ /* Utilities */
...@@ -440,6 +443,7 @@ static int send_output_buffer(decoder_t *dec) ...@@ -440,6 +443,7 @@ static int send_output_buffer(decoder_t *dec)
ret = -1; ret = -1;
goto err; goto err;
} }
sys->output_in_transit++;
out: out:
return ret; return ret;
...@@ -458,9 +462,7 @@ static void fill_output_port(decoder_t *dec) ...@@ -458,9 +462,7 @@ static void fill_output_port(decoder_t *dec)
unsigned max_buffers_in_transit = __MAX(sys->output_pool->headers_num, unsigned max_buffers_in_transit = __MAX(sys->output_pool->headers_num,
MIN_NUM_BUFFERS_IN_TRANSIT); MIN_NUM_BUFFERS_IN_TRANSIT);
unsigned buffers_available = mmal_queue_length(sys->output_pool->queue); unsigned buffers_available = mmal_queue_length(sys->output_pool->queue);
unsigned buffers_in_transit = sys->output_pool->headers_num - buffers_available - unsigned buffers_to_send = max_buffers_in_transit - sys->output_in_transit;
mmal_queue_length(sys->decoded_pictures);
unsigned buffers_to_send = max_buffers_in_transit - buffers_in_transit;
unsigned i; unsigned i;
if (buffers_to_send > buffers_available) if (buffers_to_send > buffers_available)
...@@ -468,7 +470,7 @@ static void fill_output_port(decoder_t *dec) ...@@ -468,7 +470,7 @@ static void fill_output_port(decoder_t *dec)
#ifndef NDEBUG #ifndef NDEBUG
msg_Dbg(dec, "Send %d buffers to output port (available: %d, in_transit: %d, buffer_num: %d)", msg_Dbg(dec, "Send %d buffers to output port (available: %d, in_transit: %d, buffer_num: %d)",
buffers_to_send, buffers_available, buffers_in_transit, buffers_to_send, buffers_available, sys->output_in_transit,
sys->output->buffer_num); sys->output->buffer_num);
#endif #endif
for (i = 0; i < buffers_to_send; ++i) for (i = 0; i < buffers_to_send; ++i)
...@@ -664,6 +666,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) ...@@ -664,6 +666,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
buffer->data = NULL; buffer->data = NULL;
mmal_buffer_header_release(buffer); mmal_buffer_header_release(buffer);
} }
sys->output_in_transit--;
} else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) { } else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) {
fmt = mmal_event_format_changed_get(buffer); fmt = mmal_event_format_changed_get(buffer);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment