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)
ret = -1;
goto err;
}
sys->output_in_transit++;
atomic_fetch_add(&sys->output_in_transit, 1);
return ret;
......@@ -456,7 +456,7 @@ static void fill_output_port(decoder_t *dec)
unsigned max_buffers_in_transit = __MAX(sys->output_pool->headers_num,
MIN_NUM_BUFFERS_IN_TRANSIT);
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;
if (buffers_to_send > buffers_available)
......@@ -464,7 +464,7 @@ static void fill_output_port(decoder_t *dec)
#ifndef NDEBUG
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);
#endif
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)
buffer->data = NULL;
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) {
fmt = mmal_event_format_changed_get(buffer);
......
......@@ -30,6 +30,7 @@
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_filter.h>
#include <vlc_atomic.h>
#include "mmal_picture.h"
......@@ -382,7 +383,7 @@ static int send_output_buffer(filter_t *filter)
picture_Release(picture);
ret = -1;
} else {
sys->output_in_transit++;
atomic_fetch_add(&sys->output_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
}
vlc_mutex_unlock(&sys->buffer_cond_mutex);
......@@ -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)",
status, mmal_status_to_string(status));
} else {
sys->input_in_transit++;
atomic_fetch_add(&sys->input_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
}
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)
if (picture)
picture_Release(picture);
sys->input_in_transit--;
atomic_fetch_sub(&sys->input_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
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)
buffer->user_data = NULL;
}
sys->output_in_transit--;
atomic_fetch_sub(&sys->output_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_cond_mutex);
} else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) {
......
......@@ -564,12 +564,10 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
buffer->cmd = 0;
buffer->length = sys->input->buffer_size;
vlc_mutex_lock(&sys->buffer_mutex);
status = mmal_port_send_buffer(sys->input, buffer);
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) {
msg_Err(vd, "Failed to send buffer to input port. Frame dropped");
picture_Release(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;
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_mutex_unlock(&sys->buffer_mutex);
}
......@@ -688,7 +686,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
picture_Release(picture);
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_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