static void fill_output_port(decoder_t *dec) { decoder_sys_t *sys = dec->p_sys; unsigned max_buffers_in_transit = 0; int buffers_available = 0; int buffers_to_send = 0; int i; if (sys->output_pool) { max_buffers_in_transit = __MAX(sys->output_pool->headers_num, MIN_NUM_BUFFERS_IN_TRANSIT); buffers_available = mmal_queue_length(sys->output_pool->queue); } else { max_buffers_in_transit = __MAX(sys->output->buffer_num, MIN_NUM_BUFFERS_IN_TRANSIT); buffers_available = NUM_DECODER_BUFFER_HEADERS - atomic_load(&sys->output_in_transit) - mmal_queue_length(sys->decoded_pictures); } buffers_to_send = max_buffers_in_transit - atomic_load(&sys->output_in_transit); if (buffers_to_send > buffers_available) buffers_to_send = buffers_available; #ifndef NDEBUG msg_Dbg(dec, "Send %d buffers to output port (available: %d, " "in_transit: %d, decoded: %d, buffer_num: %d)", buffers_to_send, buffers_available, atomic_load(&sys->output_in_transit), mmal_queue_length(sys->decoded_pictures), sys->output->buffer_num); #endif for (i = 0; i < buffers_to_send; ++i) if (send_output_buffer(dec) < 0) break; }
static void fill_output_port(filter_t *filter) { filter_sys_t *sys = filter->p_sys; /* allow at least 2 buffers in transit */ unsigned max_buffers_in_transit = __MAX(2, MIN_NUM_BUFFERS_IN_TRANSIT); int buffers_available = sys->output->buffer_num - atomic_load(&sys->output_in_transit) - mmal_queue_length(sys->filtered_pictures); int buffers_to_send = max_buffers_in_transit - sys->output_in_transit; int i; if (buffers_to_send > buffers_available) buffers_to_send = buffers_available; #ifndef NDEBUG msg_Dbg(filter, "Send %d buffers to output port (available: %d, in_transit: %d, buffer_num: %d)", buffers_to_send, buffers_available, sys->output_in_transit, sys->output->buffer_num); #endif for (i = 0; i < buffers_to_send; ++i) { if (send_output_buffer(filter) < 0) break; } }