hwc: implement new video API 77/162477/1
authorRoman Marchenko <r.marchenko@samsung.com>
Wed, 29 Nov 2017 13:29:08 +0000 (15:29 +0200)
committerKonstantin Drabeniuk <k.drabeniuk@samsung.com>
Fri, 1 Dec 2017 13:38:20 +0000 (15:38 +0200)
implement callback functions:
- output_hwc_get_video_supported_formats;
- output_hwc_create_video_window;
- hwc_window_video_get_available_properties;
- hwc_window_video_get_property;
- hwc_window_video_set_property.
remove  callback functions:
- hwc_window_video_get_supported_format.

Change-Id: I1459255760b5b9ee99bebfbfaa9f96ba371fad19
Signed-off-by: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
src/tdm_exynos.c
src/tdm_exynos.h
src/tdm_exynos_display.c
src/tdm_exynos_layer.c
src/tdm_exynos_layer.h
src/tdm_exynos_output.c
src/tdm_exynos_types.h
src/tdm_exynos_window.c

index 1d076405e80e52908035f60fa40140f434544745..55622d8951c88aa847305f7b14b25d2293a21021 100644 (file)
@@ -317,6 +317,8 @@ tdm_exynos_init(tdm_display *dpy, tdm_error *error)
                exynos_func_output.output_hwc_accept_changes = exynos_output_hwc_accept_changes;
                exynos_func_output.output_hwc_get_target_buffer_queue = exynos_output_hwc_get_target_buffer_queue;
                exynos_func_output.output_hwc_set_client_target_buffer = exynos_output_hwc_set_client_target_buffer;
+               exynos_func_output.output_hwc_get_video_supported_formats = exynos_output_hwc_get_video_supported_formats;
+               exynos_func_output.output_hwc_create_video_window = exynos_output_hwc_create_video_window;
 
                memset(&exynos_func_hwc_window, 0, sizeof(exynos_func_hwc_window));
                exynos_func_hwc_window.hwc_window_get_tbm_buffer_queue = exynos_hwc_window_get_tbm_buffer_queue;
@@ -328,7 +330,9 @@ tdm_exynos_init(tdm_display *dpy, tdm_error *error)
                exynos_func_hwc_window.hwc_window_set_flags = exynos_hwc_window_set_flags;
                exynos_func_hwc_window.hwc_window_unset_flags = exynos_hwc_window_unset_flags;
                exynos_func_hwc_window.hwc_window_video_get_capability = exynos_hwc_window_video_get_capability;
-               exynos_func_hwc_window.hwc_window_video_get_supported_format = exynos_hwc_window_video_get_supported_format;
+               exynos_func_hwc_window.hwc_window_video_get_available_properties = exynos_hwc_window_video_get_available_properties;
+               exynos_func_hwc_window.hwc_window_video_get_property = exynos_hwc_window_video_get_property;
+               exynos_func_hwc_window.hwc_window_video_set_property = exynos_hwc_window_video_set_property;
        }
 
        memset(&exynos_func_layer, 0, sizeof(exynos_func_layer));
index 212ac8fbf11d796e02208e12495f55ab9f9f37ca..76f5bf54e0c7be873feac30146af5bf79b8ed956 100644 (file)
@@ -67,6 +67,8 @@ tdm_error    exynos_output_hwc_accept_changes(tdm_output *output);
 tbm_surface_queue_h exynos_output_hwc_get_target_buffer_queue(tdm_output *output, tdm_error *error);
 tdm_error    exynos_output_hwc_set_client_target_buffer(tdm_output *output, tbm_surface_h buffer,
                                                                        tdm_hwc_region damage);
+tdm_error    exynos_output_hwc_get_video_supported_formats(tdm_output *output, const tbm_format **formats, int *count);
+tdm_hwc_window *exynos_output_hwc_create_video_window(tdm_output *output, tdm_error *error);
 tdm_error    exynos_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
 tdm_error    exynos_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value);
 tdm_error    exynos_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value);
@@ -85,9 +87,9 @@ tdm_error    exynos_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_win
 tdm_error    exynos_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags);
 tdm_error    exynos_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
                                                                                                        tdm_hwc_window_video_capability *video_capability);
-tdm_error    exynos_hwc_window_video_get_supported_format(tdm_hwc_window *hwc_window,
-                                                                                                                 const tbm_format **formats,
-                                                                                                                 int *count);
+tdm_error    exynos_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window, const tdm_prop **props, int *count);
+tdm_error    exynos_hwc_window_video_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value);
+tdm_error    exynos_hwc_window_video_set_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value value);
 void         exynos_pp_destroy(tdm_pp *pp);
 tdm_error    exynos_pp_set_info(tdm_pp *pp, tdm_info_pp *info);
 tdm_error    exynos_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst);
index c378df4e25174461cd8602408541fdc4d5d1dcce..7d5024e979cdc3717382245a0f18613c5fc7fef7 100644 (file)
@@ -341,6 +341,10 @@ tdm_exynos_display_destroy_output_list(tdm_exynos_data *exynos_data)
                        tdm_exynos_layer_data *l = NULL, *ll = NULL;
                        LIST_FOR_EACH_ENTRY_SAFE(l, ll, &o->layer_list, link) {
                                LIST_DEL(&l->link);
+                               if (l->formats)
+                                       free(l->formats);
+                               if (l->props)
+                                       free(l->props);
                                free(l);
                        }
                }
index 259567d1664f94a0d1c872cc4bcd41df54026166..09e591c87d80555bd7156dd608b64f7287d6cfb1 100644 (file)
@@ -378,3 +378,89 @@ failed_get:
        *out_format_count = 0;
        return ret;
 }
+
+tdm_error
+exynos_layer_get_available_properties(tdm_layer *layer, const tdm_prop **out_props,
+                                                                         int *out_prop_count)
+{
+       tdm_exynos_layer_data *layer_data = layer;
+       tdm_exynos_data *exynos_data;
+       drmModePlanePtr plane = NULL;
+       drmModeObjectPropertiesPtr props = NULL;
+       int i;
+       tdm_error ret;
+       tdm_prop *tdm_props = NULL;
+       int prop_count;
+
+       RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(out_props, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(out_prop_count, TDM_ERROR_INVALID_PARAMETER);
+
+       if (layer_data->props) {
+               *out_props = layer_data->props;
+               *out_prop_count = layer_data->prop_count;
+
+               return TDM_ERROR_NONE;
+       }
+
+       exynos_data = layer_data->exynos_data;
+       plane = drmModeGetPlane(exynos_data->drm_fd, layer_data->plane_id);
+       if (!plane) {
+               TDM_ERR("get plane failed: %m");
+               ret = TDM_ERROR_OPERATION_FAILED;
+               goto failed_get;
+       }
+
+       props = drmModeObjectGetProperties(exynos_data->drm_fd, layer_data->plane_id,
+                                                                          DRM_MODE_OBJECT_PLANE);
+       if (!props) {
+               ret = TDM_ERROR_OPERATION_FAILED;
+               TDM_ERR("get plane properties failed: %m\n");
+               goto failed_get;
+       }
+
+       tdm_props = calloc(1, sizeof(tdm_prop) * props->count_props);
+       if (!tdm_props) {
+               ret = TDM_ERROR_OUT_OF_MEMORY;
+               TDM_ERR("alloc failed\n");
+               goto failed_get;
+       }
+
+       prop_count = 0;
+       for (i = 0; i < props->count_props; i++) {
+               drmModePropertyPtr prop = drmModeGetProperty(exynos_data->drm_fd,
+                                                                                                        props->props[i]);
+               if (!prop)
+                       continue;
+               if (!strncmp(prop->name, "type", TDM_NAME_LEN)) {
+                       drmModeFreeProperty(prop);
+                       continue;
+               }
+               if (!strncmp(prop->name, "zpos", TDM_NAME_LEN)) {
+                       drmModeFreeProperty(prop);
+                       continue;
+               }
+               snprintf(tdm_props[i].name, TDM_NAME_LEN, "%s", prop->name);
+               tdm_props[i].id = props->props[i];
+               prop_count++;
+               drmModeFreeProperty(prop);
+       }
+
+       drmModeFreeObjectProperties(props);
+       drmModeFreePlane(plane);
+
+       layer_data->props = tdm_props;
+       layer_data->prop_count = prop_count;
+
+       *out_props = layer_data->props;
+       *out_prop_count = layer_data->prop_count;
+
+       return TDM_ERROR_NONE;
+failed_get:
+       drmModeFreeObjectProperties(props);
+       drmModeFreePlane(plane);
+       *out_props = NULL;
+       *out_prop_count = 0;
+
+       return ret;
+}
index 8f9121e6a5676d0faaad64af7c2d4ae2ce660e3b..cad66b47a34eb5d400eb4aa502aaecc1cc3cff87 100644 (file)
@@ -6,5 +6,8 @@
 tdm_error
 tdm_exynos_layer_get_supported_format(tdm_layer *layer, const tbm_format **out_formats,
                                                                          int *out_format_count);
+tdm_error
+exynos_layer_get_available_properties(tdm_layer *layer, const tdm_prop **out_props,
+                                                                         int *out_prop_count);
 
 #endif /* _TDM_EXYNOS_LAYER_H_ */
index 667e4b4cce9eaf8688f11c393e60c3aacc0ecdbd..1633950afeecfdce7301b92cc835bf861592242d 100644 (file)
@@ -899,8 +899,7 @@ _find_maped_hwc_window_to_layer(struct list_head *hwc_wnds, int layer_zpos)
                        continue;
 
                if (hw->assigned_layer_zpos == layer_zpos &&
-                       (hw->validated_type == TDM_COMPOSITION_VIDEO ||
-                        hw->validated_type == TDM_COMPOSITION_DEVICE ||
+                       (hw->validated_type == TDM_COMPOSITION_DEVICE ||
                         hw->validated_type == TDM_COMPOSITION_CLIENT_CANDIDATE))
                        return hw;
        }
@@ -923,12 +922,19 @@ _tdm_exynos_display_prepare_commit(tdm_exynos_output_data *output_data) {
                _set_hwc_window_buffer_to_layer(layer, output_data->target_hwc_window);
        }
 
+       if (output_data->video_hwc_window) {
+               layer = _exynos_output_get_layer(output_data, output_data->video_hwc_window->assigned_layer_zpos);
+               _set_hwc_window_buffer_to_layer(layer, output_data->video_hwc_window);
+       }
+
        if (_are_windows_with_client_candidate_type(&output_data->hwc_window_list))
                return TDM_ERROR_NONE;
 
        LIST_FOR_EACH_ENTRY(layer, &output_data->layer_list, link) {
                if (output_data->need_target_window && layer->zpos == primary_layer_zpos)
                        continue;
+               if (output_data->video_hwc_window && layer->zpos == output_data->video_hwc_window->assigned_layer_zpos)
+                       continue;
 
                hw = _find_maped_hwc_window_to_layer(&output_data->hwc_window_list, layer->zpos);
                _set_hwc_window_buffer_to_layer(layer, hw);
@@ -1268,6 +1274,15 @@ tdm_error
 exynos_output_hwc_window_destroy(tdm_output *output, tdm_hwc_window *hwc_window)
 {
        tdm_exynos_hwc_window_data *exynos_hwc_window = hwc_window;
+       tdm_exynos_output_data *output_data;
+
+       RETURN_VAL_IF_FAIL(exynos_hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       output_data = exynos_hwc_window->output_data;
+       RETURN_VAL_IF_FAIL(output_data != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       if (output_data->video_hwc_window == exynos_hwc_window)
+               output_data->video_hwc_window = NULL;
 
        LIST_DEL(&exynos_hwc_window->link);
 
@@ -1289,8 +1304,6 @@ _comp_to_str(tdm_hwc_window_composition composition_type)
                return "DEVICE";
        else if (composition_type == TDM_COMPOSITION_CURSOR)
                return "CURSOR";
-       else if (composition_type == TDM_COMPOSITION_VIDEO)
-               return "VIDEO";
        else if (composition_type == TDM_COMPOSITION_NONE)
                        return "SKIP";
 
@@ -1312,30 +1325,11 @@ _get_number_of_visible_windows(struct list_head *hwc_window_list)
        return number;
 }
 
-static int
-_buttom_window_is_video(struct list_head *hwc_window_list)
-{
-       tdm_exynos_hwc_window_data *window = NULL;
-
-       LIST_FOR_EACH_ENTRY(window, hwc_window_list, link) {
-               if (window->client_type == TDM_COMPOSITION_NONE)
-                       continue;
-               if (window->client_type == TDM_COMPOSITION_VIDEO)
-                       return 1;
-               break;
-       }
-
-       return 0;
-}
-
 static int
 _top_window_should_be_placed_on_fb_layer(struct list_head *hwc_window_list)
 {
        int num_hwc_windows = _get_number_of_visible_windows(hwc_window_list);
 
-       if (_buttom_window_is_video(hwc_window_list))
-               num_hwc_windows--;
-
        return num_hwc_windows <= 1;
 }
 
@@ -1414,13 +1408,10 @@ _reset_windows_to_client(struct list_head *hwc_wnds)
 
                else if (hw->prev_validated_type == TDM_COMPOSITION_DEVICE)
                        hw->validated_type = TDM_COMPOSITION_CLIENT_CANDIDATE;
-
-               else if (hw->prev_validated_type == TDM_COMPOSITION_VIDEO)
-                       hw->validated_type = TDM_COMPOSITION_CLIENT_CANDIDATE;
        }
 }
 
-/* if we got at least one device/video -> client transition or we still have at
+/* if we got at least one device -> client transition or we still have at
  * least one window at the client_candidate state we reset all windows
  * to the client/client_candidate state as it's a reference implementation
  * of the driver */
@@ -1440,10 +1431,6 @@ _is_reset_to_client_needed(struct list_head *hwc_wnds)
                                hw->validated_type == TDM_COMPOSITION_CLIENT)
                        return 1;
 
-               if (hw->prev_validated_type == TDM_COMPOSITION_VIDEO &&
-                               hw->validated_type == TDM_COMPOSITION_CLIENT)
-                       return 1;
-
                if (hw->client_type == TDM_COMPOSITION_CLIENT_CANDIDATE)
                        return 1;
        }
@@ -1501,6 +1488,9 @@ _map_hwc_windows_to_layers(tdm_exynos_output_data *exynos_output)
                }
        }
 
+       if (exynos_output->video_hwc_window)
+               num_bottom_layer_with_primary--;
+
        if (num_unmarked_layers > num_bottom_layer_with_primary)
                need_target_window = 1;
 
@@ -1514,6 +1504,8 @@ _map_hwc_windows_to_layers(tdm_exynos_output_data *exynos_output)
        layer_zpos = -1;
        if (num_skip_layers > 0)
                layer_zpos += num_skip_layers;
+       if (exynos_output->video_hwc_window)
+               layer_zpos++;
        LIST_FOR_EACH_ENTRY(hw, &exynos_output->hwc_window_list, link) {
                if (hw->client_type == TDM_COMPOSITION_NONE)
                        continue;
@@ -1521,12 +1513,7 @@ _map_hwc_windows_to_layers(tdm_exynos_output_data *exynos_output)
                /* break if the remaining windows are already marked */
                if (hw->validated_type == TDM_COMPOSITION_DEVICE)
                        break;
-               if (hw->client_type == TDM_COMPOSITION_VIDEO && layer_zpos == 0) {
-                       hw->validated_type = TDM_COMPOSITION_VIDEO;
-                       hw->assigned_layer_zpos = layer_zpos;
-                       continue;
-               }
-               if ((hw->client_type == TDM_COMPOSITION_DEVICE || hw->client_type == TDM_COMPOSITION_VIDEO)
+               if ((hw->client_type == TDM_COMPOSITION_DEVICE)
                        && layer_zpos < max_hw_layer_zpos) {
                        /* check format */
                        if (IS_RGB(hw->info.src_config.format)) {
@@ -1547,6 +1534,7 @@ static int
 _need_map_hwc_windows_to_layers(tdm_exynos_output_data *exynos_output)
 {
        tdm_exynos_hwc_window_data *hw = NULL;
+       tdm_exynos_output_data *output_data;
        int primary_layer_zpos = _get_primary_layer_zpos(exynos_output);
        int hw_window_is_maped_on_primary_layer = 0;
        int need_target_window = 0;
@@ -1560,6 +1548,11 @@ _need_map_hwc_windows_to_layers(tdm_exynos_output_data *exynos_output)
                        return 1;
                if (hw->client_type == TDM_COMPOSITION_CLIENT)
                        need_target_window = 1;
+
+               output_data = hw->output_data;
+               if (output_data && output_data->video_hwc_window)
+                       if (output_data->video_hwc_window->assigned_layer_zpos == hw->assigned_layer_zpos)
+                               return 1;
        }
 
        if (need_target_window != exynos_output->need_target_window)
@@ -1582,7 +1575,6 @@ _print_validate_result(tdm_exynos_output_data *exynos_output)
                        continue;
 
                if (hw->validated_type == TDM_COMPOSITION_DEVICE ||
-                       hw->validated_type == TDM_COMPOSITION_VIDEO ||
                        hw->validated_type == TDM_COMPOSITION_CLIENT_CANDIDATE)
                        TDM_DBG(" window(%p) type: %s -> %s : is mapped to layer with %d zpos", hw,
                                        _comp_to_str(hw->client_type), _comp_to_str(hw->validated_type),
@@ -1780,3 +1772,51 @@ exynos_output_hwc_set_client_target_buffer(tdm_output *output, tbm_surface_h buf
        return TDM_ERROR_NONE;
 }
 
+tdm_hwc_window *
+exynos_output_hwc_create_video_window(tdm_output *output, tdm_error *error)
+{
+       tdm_exynos_hwc_window_data *exynos_hwc_window = NULL;
+       tdm_exynos_output_data *exynos_output = output;
+
+       if (error)
+               *error = TDM_ERROR_INVALID_PARAMETER;
+
+       RETURN_VAL_IF_FAIL(exynos_output != NULL, NULL);
+
+       if (error)
+               *error = TDM_ERROR_OPERATION_FAILED;
+
+       if (exynos_output->video_hwc_window)
+               return NULL;
+
+       exynos_hwc_window = _exynos_output_hwc_window_create(exynos_output, NULL, error);
+       if (exynos_hwc_window == NULL)
+               return NULL;
+
+       exynos_hwc_window->assigned_layer_zpos = 0;
+       exynos_output->video_hwc_window = exynos_hwc_window;
+
+       TDM_DBG("hwc_window(%p) video create", exynos_hwc_window);
+       if (error)
+               *error = TDM_ERROR_NONE;
+
+       return exynos_hwc_window;
+}
+
+tdm_error
+exynos_output_hwc_get_video_supported_formats(tdm_output *output,
+                                                                                        const tbm_format **formats,
+                                                                                        int *count)
+{
+       tdm_exynos_output_data *output_data = output;
+       tdm_exynos_layer_data * layer = NULL;
+
+       RETURN_VAL_IF_FAIL(output_data != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       /* now the video window supported only on the layer with index 0 */
+       layer = _exynos_output_get_layer(output_data, 0);
+
+       return tdm_exynos_layer_get_supported_format(layer, formats, count);
+}
index b7372f36ac2fcd4ef9be49693630862fb6d9fee0..ac3c6c765b55df0e4f355afd8351ab4ca26c7728 100644 (file)
@@ -144,6 +144,7 @@ struct _tdm_exynos_output_data {
        int hwc_enable;
 
        tdm_exynos_hwc_window_data *target_hwc_window;
+       tdm_exynos_hwc_window_data *video_hwc_window;
 
        int need_validate;
        int need_target_window;
@@ -171,6 +172,9 @@ struct _tdm_exynos_layer_data {
 
        tbm_format *formats;
        int format_count;
+
+       tdm_prop *props;
+       int prop_count;
 };
 
 struct _tdm_exynos_hwc_window_data {
index aca560809b26473fe82ac11a3bb5d310f81872e7..e427519c47c86f7ffe8ec1a86824baecd79a74c8 100644 (file)
@@ -22,6 +22,7 @@ exynos_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *er
        exynos_hwc_window = hwc_window;
        exynos_output = exynos_hwc_window->output_data;
        RETURN_VAL_IF_FAIL(exynos_output != NULL, NULL);
+       RETURN_VAL_IF_FAIL(exynos_output->video_hwc_window != exynos_hwc_window, NULL);
 
        int wight = exynos_hwc_window->info.src_config.size.h;
        int hight = exynos_hwc_window->info.src_config.size.v;
@@ -51,6 +52,7 @@ exynos_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos)
 
        exynos_output = exynos_hwc_window->output_data;
        RETURN_VAL_IF_FAIL(exynos_output != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(exynos_output->video_hwc_window != exynos_hwc_window, TDM_ERROR_INVALID_PARAMETER);
 
        if (exynos_hwc_window->zpos == zpos)
                return TDM_ERROR_NONE;
@@ -76,6 +78,7 @@ exynos_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
 
        RETURN_VAL_IF_FAIL(exynos_hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
        RETURN_VAL_IF_FAIL(exynos_output != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(exynos_output->video_hwc_window != exynos_hwc_window, TDM_ERROR_INVALID_PARAMETER);
 
        if (exynos_hwc_window->client_type == comp_type)
                return TDM_ERROR_NONE;
@@ -105,14 +108,22 @@ tdm_error
 exynos_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
 {
        tdm_exynos_hwc_window_data *exynos_hwc_window = hwc_window;
-       tdm_exynos_output_data *exynos_output = exynos_hwc_window->output_data;
+       tdm_exynos_output_data *exynos_output;
 
        RETURN_VAL_IF_FAIL(exynos_hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
+       exynos_output = exynos_hwc_window->output_data;
        RETURN_VAL_IF_FAIL(exynos_output != NULL, TDM_ERROR_INVALID_PARAMETER);
 
        if (!memcmp(&exynos_hwc_window->info, info, sizeof(tdm_hwc_window_info)))
                return TDM_ERROR_NONE;
 
+       if (exynos_output->video_hwc_window == exynos_hwc_window) {
+               tdm_exynos_layer_data *layer;
+               layer = _exynos_output_get_layer(exynos_output, exynos_hwc_window->assigned_layer_zpos);
+
+               return exynos_layer_set_info(layer, (tdm_info_layer *)info);
+       }
+
        exynos_hwc_window->info = *info;
        exynos_output->need_validate = 1;
 
@@ -172,31 +183,71 @@ exynos_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
                                                                           tdm_hwc_window_video_capability *video_capability)
 {
        tdm_exynos_hwc_window_data *exynos_hwc_window = hwc_window;
+       tdm_exynos_output_data *exynos_output;
 
        RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
+       exynos_output = exynos_hwc_window->output_data;
+       RETURN_VAL_IF_FAIL(exynos_output != NULL, TDM_ERROR_INVALID_PARAMETER);
        RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
-       RETURN_VAL_IF_FAIL(exynos_hwc_window->validated_type == TDM_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(exynos_output->video_hwc_window == exynos_hwc_window, TDM_ERROR_INVALID_PARAMETER);
 
        *video_capability = 0;
 
        return TDM_ERROR_NONE;
 }
 
+
 tdm_error
-exynos_hwc_window_video_get_supported_format(tdm_hwc_window *hwc_window,
-                                                                                        const tbm_format **formats,
-                                                                                        int *count)
+exynos_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
+                                                                                                 const tdm_prop **props, int *count)
 {
        tdm_exynos_hwc_window_data *exynos_hwc_window = hwc_window;
-       tdm_exynos_layer_data * layer = NULL;
+       tdm_exynos_output_data *output_data;
+       tdm_exynos_layer_data *layer_data;
 
        RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
-       RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
-       RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
-       RETURN_VAL_IF_FAIL(exynos_hwc_window->validated_type == TDM_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER);
 
-       /* now the video window supported only on the layer with index 0 */
-       layer = _exynos_output_get_layer(exynos_hwc_window->output_data, 0);
+       output_data = exynos_hwc_window->output_data;
+       RETURN_VAL_IF_FAIL(output_data != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(output_data->video_hwc_window == exynos_hwc_window, TDM_ERROR_INVALID_PARAMETER);
+
+       layer_data = _exynos_output_get_layer(output_data, exynos_hwc_window->assigned_layer_zpos);
 
-       return tdm_exynos_layer_get_supported_format(layer, formats, count);
+       return exynos_layer_get_available_properties(layer_data, props, count);
 }
+
+tdm_error
+exynos_hwc_window_video_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value)
+{
+       tdm_exynos_hwc_window_data *exynos_hwc_window = hwc_window;
+       tdm_exynos_output_data *output_data;
+       tdm_exynos_layer_data *layer_data;
+
+       RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       output_data = exynos_hwc_window->output_data;
+       RETURN_VAL_IF_FAIL(output_data != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(output_data->video_hwc_window == exynos_hwc_window, TDM_ERROR_INVALID_PARAMETER);
+
+       layer_data = _exynos_output_get_layer(output_data, exynos_hwc_window->assigned_layer_zpos);
+
+       return exynos_layer_get_property(layer_data, id, value);
+}
+
+tdm_error
+exynos_hwc_window_video_set_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value value)
+{
+       tdm_exynos_hwc_window_data *exynos_hwc_window = hwc_window;
+       tdm_exynos_output_data *output_data;
+       tdm_exynos_layer_data *layer_data;
+
+       RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       output_data = exynos_hwc_window->output_data;
+       RETURN_VAL_IF_FAIL(output_data != NULL, TDM_ERROR_INVALID_PARAMETER);
+       RETURN_VAL_IF_FAIL(output_data->video_hwc_window == exynos_hwc_window, TDM_ERROR_INVALID_PARAMETER);
+
+       layer_data = _exynos_output_get_layer(output_data, exynos_hwc_window->assigned_layer_zpos);
+
+       return exynos_layer_set_property(layer_data, id, value);
+}
\ No newline at end of file