Browse Source

io_pipeline: Setup media links and formats (MR 13)

Yassine Oudjana 3 years ago
parent
commit
7dbc2288d0
1 changed files with 80 additions and 0 deletions
  1. 80 0
      src/io_pipeline.c

+ 80 - 0
src/io_pipeline.c

@@ -101,6 +101,33 @@ static bool want_focus = false;
 static MPPipeline *pipeline;
 static GSource *capture_source;
 
+static void
+mp_setup_media_link_pad_formats(struct device_info *dev_info,
+                                const struct mp_media_link_config media_links[],
+                                int num_media_links,
+                                MPMode *mode)
+{
+        const struct media_v2_entity *entities[2];
+        int ports[2];
+        for (int i = 0; i < num_media_links; i++) {
+                entities[0] = mp_device_find_entity(
+                        dev_info->device, (const char *)media_links[i].source_name);
+                entities[1] = mp_device_find_entity(
+                        dev_info->device, (const char *)media_links[i].target_name);
+                ports[0] = media_links[i].source_port;
+                ports[1] = media_links[i].target_port;
+
+                for (int j = 0; j < 2; j++)
+                        if (!mp_entity_pad_set_format(
+                                    dev_info->device, entities[j], ports[j], mode)) {
+                                g_printerr("Failed to set %s:%d format\n",
+                                           entities[j]->name,
+                                           ports[j]);
+                                exit(EXIT_FAILURE);
+                        }
+        }
+}
+
 static void
 setup_camera(MPDeviceList **device_list, const struct mp_camera_config *config)
 {
@@ -205,6 +232,11 @@ setup_camera(MPDeviceList **device_list, const struct mp_camera_config *config)
                 // the ov5640 driver where it won't allow setting the preview
                 // format initially.
                 MPMode mode = config->capture_mode;
+                if (config->num_media_links)
+                        mp_setup_media_link_pad_formats(dev_info,
+                                                        config->media_links,
+                                                        config->num_media_links,
+                                                        &mode);
                 mp_camera_set_mode(info->camera, &mode);
 
                 // Trigger continuous auto focus if the sensor supports it
@@ -344,6 +376,7 @@ static void
 capture(MPPipeline *pipeline, const void *data)
 {
         struct camera_info *info = &cameras[camera->index];
+        struct device_info *dev_info = &devices[info->device_index];
         uint32_t gain;
         float gain_norm;
 
@@ -365,6 +398,11 @@ capture(MPPipeline *pipeline, const void *data)
         mp_camera_stop_capture(info->camera);
 
         mode = camera->capture_mode;
+        if (camera->num_media_links)
+                mp_setup_media_link_pad_formats(dev_info,
+                                                camera->media_links,
+                                                camera->num_media_links,
+                                                &mode);
         mp_camera_set_mode(info->camera, &mode);
         just_switched_mode = true;
 
@@ -508,6 +546,7 @@ on_frame(MPBuffer buffer, void *_data)
 
                 if (captures_remaining == 0) {
                         struct camera_info *info = &cameras[camera->index];
+                        struct device_info *dev_info = &devices[info->device_index];
 
                         // Restore the auto exposure and gain if needed
                         if (!current_controls.exposure_is_manual) {
@@ -527,6 +566,12 @@ on_frame(MPBuffer buffer, void *_data)
                         mp_camera_stop_capture(info->camera);
 
                         mode = camera->preview_mode;
+                        if (camera->num_media_links)
+                                mp_setup_media_link_pad_formats(
+                                        dev_info,
+                                        camera->media_links,
+                                        camera->num_media_links,
+                                        &mode);
                         mp_camera_set_mode(info->camera, &mode);
                         just_switched_mode = true;
 
@@ -542,6 +587,25 @@ on_frame(MPBuffer buffer, void *_data)
         }
 }
 
+static void
+mp_setup_media_link(struct device_info *dev_info,
+                    const struct mp_media_link_config *cfg,
+                    bool enable)
+{
+        const struct media_v2_entity *source_entity =
+                mp_device_find_entity(dev_info->device, cfg->source_name);
+
+        const struct media_v2_entity *target_entity =
+                mp_device_find_entity(dev_info->device, cfg->target_name);
+
+        mp_device_setup_entity_link(dev_info->device,
+                                    source_entity->id,
+                                    target_entity->id,
+                                    cfg->source_port,
+                                    cfg->target_port,
+                                    enable);
+}
+
 static void
 update_state(MPPipeline *pipeline, const struct mp_io_pipeline_state *state)
 {
@@ -562,6 +626,11 @@ update_state(MPPipeline *pipeline, const struct mp_io_pipeline_state *state)
                                              info->pad_id,
                                              dev_info->interface_pad_id,
                                              false);
+
+                        // Disable media links
+                        for (int i = 0; i < camera->num_media_links; i++)
+                                mp_setup_media_link(
+                                        dev_info, &camera->media_links[i], false);
                 }
 
                 if (capture_source) {
@@ -580,7 +649,18 @@ update_state(MPPipeline *pipeline, const struct mp_io_pipeline_state *state)
                                              dev_info->interface_pad_id,
                                              true);
 
+                        // Enable media links
+                        for (int i = 0; i < camera->num_media_links; i++)
+                                mp_setup_media_link(
+                                        dev_info, &camera->media_links[i], true);
+
                         mode = camera->preview_mode;
+                        if (camera->num_media_links)
+                                mp_setup_media_link_pad_formats(
+                                        dev_info,
+                                        camera->media_links,
+                                        camera->num_media_links,
+                                        &mode);
                         mp_camera_set_mode(info->camera, &mode);
 
                         mp_camera_start_capture(info->camera);