rpicamsrc: Defer encoder creation until after caps are negotiated

This ensures the encoder is created with the profile
negotiated with downstream
This commit is contained in:
Jan Schmidt 2015-03-07 02:11:25 +11:00 committed by Tim-Philipp Müller
parent 3abe941e74
commit c3ad9c99a6

View file

@ -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");