Commit 73a21604 authored by Julian Scheel's avatar Julian Scheel Committed by Jean-Baptiste Kempf

mmal: Use atomic operations for refcounting

Signed-off-by: default avatarJulian Scheel <julian@jusst.de>
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 228fcee6
...@@ -438,7 +438,7 @@ static int send_output_buffer(decoder_t *dec) ...@@ -438,7 +438,7 @@ static int send_output_buffer(decoder_t *dec)
ret = -1; ret = -1;
goto err; goto err;
} }
sys->output_in_transit++; atomic_fetch_add(&sys->output_in_transit, 1);
return ret; return ret;
...@@ -456,7 +456,7 @@ static void fill_output_port(decoder_t *dec) ...@@ -456,7 +456,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_to_send = max_buffers_in_transit - sys->output_in_transit; unsigned buffers_to_send = max_buffers_in_transit - atomic_load(&sys->output_in_transit);
unsigned i; unsigned i;
if (buffers_to_send > buffers_available) if (buffers_to_send > buffers_available)
...@@ -464,7 +464,7 @@ static void fill_output_port(decoder_t *dec) ...@@ -464,7 +464,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, sys->output_in_transit, buffers_to_send, buffers_available, atomic_load(&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)
...@@ -656,7 +656,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) ...@@ -656,7 +656,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--; atomic_fetch_sub(&sys->output_in_transit, 1);
} 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);
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_plugin.h> #include <vlc_plugin.h>
#include <vlc_filter.h> #include <vlc_filter.h>
#include <vlc_atomic.h>
#include "mmal_picture.h" #include "mmal_picture.h"
...@@ -382,7 +383,7 @@ static int send_output_buffer(filter_t *filter) ...@@ -382,7 +383,7 @@ static int send_output_buffer(filter_t *filter)
picture_Release(picture); picture_Release(picture);
ret = -1; ret = -1;
} else { } else {
sys->output_in_transit++; atomic_fetch_add(&sys->output_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond); vlc_cond_signal(&sys->buffer_cond);
} }
vlc_mutex_unlock(&sys->buffer_cond_mutex); vlc_mutex_unlock(&sys->buffer_cond_mutex);
...@@ -471,7 +472,7 @@ static picture_t *deinterlace(filter_t *filter, picture_t *picture) ...@@ -471,7 +472,7 @@ static picture_t *deinterlace(filter_t *filter, picture_t *picture)
msg_Err(filter, "Failed to send buffer to input port (status=%"PRIx32" %s)", msg_Err(filter, "Failed to send buffer to input port (status=%"PRIx32" %s)",
status, mmal_status_to_string(status)); status, mmal_status_to_string(status));
} else { } else {
sys->input_in_transit++; atomic_fetch_add(&sys->input_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond); vlc_cond_signal(&sys->buffer_cond);
} }
vlc_mutex_unlock(&sys->buffer_cond_mutex); vlc_mutex_unlock(&sys->buffer_cond_mutex);
...@@ -527,7 +528,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) ...@@ -527,7 +528,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
if (picture) if (picture)
picture_Release(picture); picture_Release(picture);
sys->input_in_transit--; atomic_fetch_sub(&sys->input_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond); vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_cond_mutex); vlc_mutex_unlock(&sys->buffer_cond_mutex);
} }
...@@ -548,7 +549,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) ...@@ -548,7 +549,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
buffer->user_data = NULL; buffer->user_data = NULL;
} }
sys->output_in_transit--; atomic_fetch_sub(&sys->output_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond); vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_cond_mutex); vlc_mutex_unlock(&sys->buffer_cond_mutex);
} else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) { } else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) {
......
...@@ -564,12 +564,10 @@ static void vd_display(vout_display_t *vd, picture_t *picture, ...@@ -564,12 +564,10 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
buffer->cmd = 0; buffer->cmd = 0;
buffer->length = sys->input->buffer_size; buffer->length = sys->input->buffer_size;
vlc_mutex_lock(&sys->buffer_mutex);
status = mmal_port_send_buffer(sys->input, buffer); status = mmal_port_send_buffer(sys->input, buffer);
if (status == MMAL_SUCCESS) if (status == MMAL_SUCCESS)
++sys->buffers_in_transit; atomic_fetch_add(&sys->buffers_in_transit, 1);
vlc_mutex_unlock(&sys->buffer_mutex);
if (status != MMAL_SUCCESS) { if (status != MMAL_SUCCESS) {
msg_Err(vd, "Failed to send buffer to input port. Frame dropped"); msg_Err(vd, "Failed to send buffer to input port. Frame dropped");
picture_Release(picture); picture_Release(picture);
...@@ -590,7 +588,7 @@ static void vd_display(vout_display_t *vd, picture_t *picture, ...@@ -590,7 +588,7 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
sys->next_phase_check = (sys->next_phase_check + 1) % PHASE_CHECK_INTERVAL; sys->next_phase_check = (sys->next_phase_check + 1) % PHASE_CHECK_INTERVAL;
vlc_mutex_lock(&sys->buffer_mutex); vlc_mutex_lock(&sys->buffer_mutex);
while (sys->buffers_in_transit >= MAX_BUFFERS_IN_TRANSIT) while (atomic_load(&sys->buffers_in_transit) >= MAX_BUFFERS_IN_TRANSIT)
vlc_cond_wait(&sys->buffer_cond, &sys->buffer_mutex); vlc_cond_wait(&sys->buffer_cond, &sys->buffer_mutex);
vlc_mutex_unlock(&sys->buffer_mutex); vlc_mutex_unlock(&sys->buffer_mutex);
} }
...@@ -688,7 +686,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) ...@@ -688,7 +686,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
picture_Release(picture); picture_Release(picture);
vlc_mutex_lock(&sys->buffer_mutex); vlc_mutex_lock(&sys->buffer_mutex);
--sys->buffers_in_transit; atomic_fetch_sub(&sys->buffers_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond); vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_mutex); vlc_mutex_unlock(&sys->buffer_mutex);
} }
......
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