#include "tdm_sprd.h"
#include "tdm_helper.h"
+#define NUM_LAYERS 2
+
typedef struct _tdm_sprd_capture_buffer {
tbm_surface_h buffer;
struct list_head link;
tbm_surface_info_s buf_info;
const tdm_output_mode *current_mode = NULL;
tbm_surface_h surface = NULL;
- tdm_layer **tdm_layer_array = NULL;
tdm_sprd_capture_composite *composite_data = NULL;
tdm_sprd_capture_pp_data ** pp_tasks = NULL;
- int layer_count = 0;
int int_err, i;
tdm_error tdm_err = TDM_ERROR_NONE;
+
if ((sprd_output_get_mode(capture_data->output_data, ¤t_mode)) != TDM_ERROR_NONE) {
TDM_ERR("can't get output mode");
return TDM_ERROR_OPERATION_FAILED;
int_err = tbm_surface_get_info(buffer, &buf_info);
RETURN_VAL_IF_FAIL(int_err == TBM_SURFACE_ERROR_NONE, TDM_ERROR_BAD_REQUEST);
- tdm_layer_array = sprd_output_get_layers(capture_data->output_data, &layer_count, &tdm_err);
- if (tdm_err != TDM_ERROR_NONE) {
- TDM_WRN("can't get layers list");
- goto fail;
- }
- if (layer_count == 0) {
- TDM_WRN("layer list is empty nothing to capture");
- goto fail;
- }
+
composite_data = calloc(1, sizeof(tdm_sprd_capture_composite));
if (composite_data == NULL) {
TDM_WRN("Out of memory");
composite_data->client_buffer = tdm_buffer_ref_backend(buffer);
LIST_ADD(&composite_data->link, &capture_data->composite_list);
- pp_tasks = calloc(layer_count, sizeof(tdm_sprd_capture_pp_data *));
+ pp_tasks = calloc(NUM_LAYERS, sizeof(tdm_sprd_capture_pp_data *));
if (pp_tasks == NULL) {
TDM_WRN("Out of memory");
tdm_err = TDM_ERROR_OUT_OF_MEMORY;
goto fail;
}
- for (i = 0; i < layer_count; ++i) {
+ for (i = 0; i < NUM_LAYERS; ++i) {
+ tdm_sprd_output_data *output_data = NULL;
+ tdm_sprd_layer_data *layer_data = NULL;
tdm_info_layer layer_info;
+
+ output_data = (tdm_sprd_output_data *)capture_data->output_data;
+ layer_data = sprd_output_data_get_layer_data(output_data, i);
+ if (!layer_data) continue;
+
CLEAR(layer_info);
- if (sprd_layer_get_info(tdm_layer_array[i], &layer_info) != TDM_ERROR_NONE) {
- TDM_WRN("can't get layer %p info. Skip", tdm_layer_array[i]);
+ if (sprd_layer_get_info(layer_data, &layer_info) != TDM_ERROR_NONE) {
+ TDM_WRN("can't get layer %p info. Skip", layer_data);
continue;
}
if (layer_info.src_config.pos.h == 0 || layer_info.src_config.pos.w == 0) {
- TDM_INFO("layer %p info is NULL. Skip", tdm_layer_array[i]);
+ TDM_INFO("layer %p info is NULL. Skip", layer_data);
continue;
}
- if (sprd_layer_get_buffer(tdm_layer_array[i], &surface) != TDM_ERROR_NONE) {
- TDM_WRN("can't get layer %p surface. Skip", tdm_layer_array[i]);
+ if (sprd_layer_get_buffer(layer_data, &surface) != TDM_ERROR_NONE) {
+ TDM_WRN("can't get layer %p surface. Skip", layer_data);
continue;
}
if (surface == NULL) {
- TDM_INFO("layer %p buffer is NULL. Skip", tdm_layer_array[i]);
+ TDM_INFO("layer %p buffer is NULL. Skip", layer_data);
continue;
}
tdm_buffer_ref_backend(surface);
- TDM_DBG("Get layer %p surface %p", tdm_layer_array[i], surface);
+ TDM_DBG("Get layer %p surface %p", layer_data, surface);
if (1) {
int output_width = current_mode->hdisplay;
}
int zpos;
- if (sprd_layer_get_zpos(tdm_layer_array[i], &zpos) != TDM_ERROR_NONE) {
- TDM_WRN("can't get layer %p zpos", tdm_layer_array[i]);
+ if (sprd_layer_get_zpos(layer_data, &zpos) != TDM_ERROR_NONE) {
+ TDM_WRN("can't get layer %p zpos", layer_data);
_tdm_sprd_capture_destroy_converter(&pp_tasks[i]);
tdm_buffer_unref_backend(surface);
tdm_buffer_unref_backend(temp_buffer);
}
composite_data->composite_buf_pp_task = pp_task;
}
- for (i = 0; i < layer_count; i++) {
+ for (i = 0; i < NUM_LAYERS; i++) {
if (pp_tasks[i]) {
tdm_err = sprd_pp_commit(pp_tasks[i]->pp_link);
if (tdm_err != TDM_ERROR_NONE) {
TDM_WRN("Can't capture layers");
goto fail;
}
- if (tdm_layer_array) {
- free(tdm_layer_array);
- }
if (pp_tasks) {
free(pp_tasks);
}
+
return TDM_ERROR_NONE;
+
fail:
if (pp_tasks) {
- for (i = 0; i < layer_count; ++i) {
+ for (i = 0; i < NUM_LAYERS; ++i) {
if (pp_tasks[i])
_tdm_sprd_capture_destroy_converter(&pp_tasks[i]);
}
}
free(composite_data);
}
- if (tdm_layer_array) {
- free(tdm_layer_array);
- }
+
return tdm_err;
}