From c3ad9c99a61957e98570bf4f67b69f19deccecf1 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Sat, 7 Mar 2015 02:11:25 +1100 Subject: [PATCH] rpicamsrc: Defer encoder creation until after caps are negotiated This ensures the encoder is created with the profile negotiated with downstream --- sys/rpicamsrc/RaspiCapture.c | 49 +++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/sys/rpicamsrc/RaspiCapture.c b/sys/rpicamsrc/RaspiCapture.c index 7412d19e37..f8b357643d 100644 --- a/sys/rpicamsrc/RaspiCapture.c +++ b/sys/rpicamsrc/RaspiCapture.c @@ -1466,20 +1466,21 @@ static MMAL_STATUS_T create_encoder_component(RASPIVID_STATE *state) static void destroy_encoder_component(RASPIVID_STATE *state) { /* Empty the buffer header q */ - while (mmal_queue_length(state->encoded_buffer_q)) { - MMAL_BUFFER_HEADER_T *buffer = mmal_queue_get(state->encoded_buffer_q); - mmal_buffer_header_release(buffer); - } - mmal_queue_destroy(state->encoded_buffer_q); - - // Get rid of any port buffers first - if (state->encoder_pool) - { - mmal_port_pool_destroy(state->encoder_component->output[0], state->encoder_pool); + if (state->encoded_buffer_q) { + while (mmal_queue_length(state->encoded_buffer_q)) { + MMAL_BUFFER_HEADER_T *buffer = mmal_queue_get(state->encoded_buffer_q); + mmal_buffer_header_release(buffer); + } } - if (state->encoder_component) - { + if (state->encoder_component) { + // Get rid of any port buffers first + if (state->encoder_pool) + { + mmal_port_pool_destroy(state->encoder_component->output[0], state->encoder_pool); + state->encoder_pool = NULL; + } + mmal_component_destroy(state->encoder_component); state->encoder_component = NULL; } @@ -1566,14 +1567,6 @@ raspi_capture_setup(RASPIVID_CONFIG *config) return NULL; } - if ((status = create_encoder_component(state)) != MMAL_SUCCESS) - { - vcos_log_error("%s: Failed to create encode component", __func__); - raspipreview_destroy(&state->config->preview_parameters); - destroy_camera_component(state); - return NULL; - } - state->encoded_buffer_q = mmal_queue_create(); return state; @@ -1587,6 +1580,12 @@ raspi_capture_start(RASPIVID_STATE *state) MMAL_PORT_T *preview_input_port = NULL; MMAL_PORT_T *encoder_input_port = NULL; + if ((status = create_encoder_component(state)) != MMAL_SUCCESS) + { + vcos_log_error("%s: Failed to create encode component", __func__); + return FALSE; + } + if (state->config->verbose) { dump_state(state); @@ -1737,6 +1736,11 @@ raspi_capture_stop(RASPIVID_STATE *state) // Disable all our ports that are not handled by connections check_disable_port(state->camera_still_port); check_disable_port(state->encoder_output_port); + + if (state->encoder_component) { + mmal_component_disable(state->encoder_component); + destroy_encoder_component(state); + } } void @@ -1761,6 +1765,11 @@ raspi_capture_free(RASPIVID_STATE *state) raspipreview_destroy(&state->config->preview_parameters); destroy_camera_component(state); + if (state->encoded_buffer_q) { + mmal_queue_destroy(state->encoded_buffer_q); + state->encoded_buffer_q = NULL; + } + if (state->config->verbose) fprintf(stderr, "Close down completed, all components disconnected, disabled and destroyed\n\n");