diff --git a/modules/hw/mmal/codec.c b/modules/hw/mmal/codec.c index 625e6ce583..99ff21ca70 100644 --- a/modules/hw/mmal/codec.c +++ b/modules/hw/mmal/codec.c @@ -71,7 +71,6 @@ struct decoder_sys_t { MMAL_PORT_T *output; MMAL_POOL_T *output_pool; /* only used for non-opaque mode */ MMAL_ES_FORMAT_T *output_format; - MMAL_QUEUE_T *decoded_pictures; vlc_sem_t sem; bool b_top_field_first; @@ -221,7 +220,6 @@ static int OpenDecoder(decoder_t *dec) } sys->input_pool = mmal_pool_create(sys->input->buffer_num, 0); - sys->decoded_pictures = mmal_queue_create(); if (sys->opaque) { dec->fmt_out.i_codec = VLC_CODEC_MMAL_OPAQUE; @@ -269,23 +267,6 @@ static void CloseDecoder(decoder_t *dec) if (sys->output_format) mmal_format_free(sys->output_format); - /* Free pictures which are decoded but have not yet been sent - * out to the core */ - while ((buffer = mmal_queue_get(sys->decoded_pictures))) { - picture_t *pic = (picture_t *)buffer->user_data; - picture_Release(pic); - - if (sys->output_pool) { - buffer->user_data = NULL; - buffer->alloc_size = 0; - buffer->data = NULL; - mmal_buffer_header_release(buffer); - } - } - - if (sys->decoded_pictures) - mmal_queue_destroy(sys->decoded_pictures); - if (sys->output_pool) mmal_pool_destroy(sys->output_pool); @@ -509,8 +490,7 @@ static void fill_output_port(decoder_t *dec) buffers_available = mmal_queue_length(sys->output_pool->queue); } else { max_buffers_in_transit = NUM_DECODER_BUFFER_HEADERS; - buffers_available = NUM_DECODER_BUFFER_HEADERS - atomic_load(&sys->output_in_transit) - - mmal_queue_length(sys->decoded_pictures); + buffers_available = NUM_DECODER_BUFFER_HEADERS - atomic_load(&sys->output_in_transit); } buffers_to_send = max_buffers_in_transit - atomic_load(&sys->output_in_transit); @@ -519,10 +499,9 @@ static void fill_output_port(decoder_t *dec) #ifndef NDEBUG msg_Dbg(dec, "Send %d buffers to output port (available: %d, " - "in_transit: %d, decoded: %d, buffer_num: %d)", + "in_transit: %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) @@ -543,21 +522,6 @@ static void flush_decoder(decoder_t *dec) while (atomic_load(&sys->output_in_transit) || atomic_load(&sys->input_in_transit)) vlc_sem_wait(&sys->sem); - - /* Free pictures which are decoded but have not yet been sent - * out to the core */ - while ((buffer = mmal_queue_get(sys->decoded_pictures))) { - picture_t *pic = (picture_t *)buffer->user_data; - picture_Release(pic); - - if (sys->output_pool) { - buffer->user_data = NULL; - buffer->alloc_size = 0; - buffer->data = NULL; - mmal_buffer_header_release(buffer); - } - } - msg_Dbg(dec, "Ports flushed, returning to normal operation"); } static int decode(decoder_t *dec, block_t *block) @@ -589,29 +553,8 @@ static int decode(decoder_t *dec, block_t *block) return VLCDEC_SUCCESS; } - /* - * Send output buffers - */ - picture_t *ret = NULL; - if (atomic_load(&sys->started)) { - buffer = mmal_queue_get(sys->decoded_pictures); - if (buffer) { - ret = (picture_t *)buffer->user_data; - ret->date = buffer->pts; - ret->b_progressive = sys->b_progressive; - ret->b_top_field_first = sys->b_top_field_first; - - if (sys->output_pool) { - buffer->data = NULL; - mmal_buffer_header_reset(buffer); - mmal_buffer_header_release(buffer); - } - } - + if (atomic_load(&sys->started)) fill_output_port(dec); - } - if (ret) - decoder_QueueVideo(dec, ret); /* * Process input @@ -700,10 +643,13 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) MMAL_ES_FORMAT_T *format; if (buffer->cmd == 0) { + picture = (picture_t *)buffer->user_data; if (buffer->length > 0) { - mmal_queue_put(sys->decoded_pictures, buffer); + picture->date = buffer->pts; + picture->b_progressive = sys->b_progressive; + picture->b_top_field_first = sys->b_top_field_first; + decoder_QueueVideo(dec, picture); } else { - picture = (picture_t *)buffer->user_data; picture_Release(picture); if (sys->output_pool) { buffer->user_data = NULL;