package version up to 1.18.2
[platform/core/uifw/libtdm.git] / tools / tdm_test_server.c
index 0045be5..535462f 100644 (file)
@@ -9,7 +9,7 @@
  *          Taeheon Kim <th908.kim@samsung.com>,
  *          YoungJun Cho <yj44.cho@samsung.com>,
  *          SooChan Lim <sc1.lim@samsung.com>,
- *          Boram Park <sc1.lim@samsung.com>
+ *          Boram Park <boram1288.park@samsung.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
 #include <tbm_surface.h>
 #include <tbm_surface_internal.h>
 
-#include <tdm.h>
-#include <tdm_log.h>
-#include <tdm_list.h>
-#include <tdm_helper.h>
-#include <tdm_backend.h>
+#include "tdm.h"
+#include "tdm_log.h"
+#include "tdm_list.h"
+#include "tdm_helper.h"
+#include "tdm_backend.h"
 
 #include "tdm_macro.h"
 #include "tdm_private.h"
@@ -105,7 +105,7 @@ static struct optstrings optstrs[] = {
        },
        {
                OPT_TST, "c", "catpure a output object or a layer object.\n\t\t'-l' is used to show the result on screen.",
-               "<output_idx>[,<layer_idx>]~<w>x<h>[+<x>+<y>][,<h>x<v>][@<format>][*<transform>]", NULL
+               "<output_idx>[,<layer_idx>]~<w>x<h>[+<x>+<y>][,<h>x<v>][@<format>][*<transform>][^stream]", NULL
        },
        {
                OPT_GEN, "w", "set the property of a object",
@@ -183,7 +183,6 @@ usage(char *app_name)
                printf("\t%s\n", usages[t].desc);
        }
        printf("\n");
-       exit(0);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -316,6 +315,7 @@ struct _tdm_test_server {
        tdm_display *display;
 };
 
+static void destroy(tdm_test_server *data);
 static void run_test(tdm_test_server *data);
 static void output_setup(tdm_test_server_output *o);
 static void layer_show_buffer(tdm_test_server_layer *l, tbm_surface_h b);
@@ -421,6 +421,13 @@ parse_arg_c(tdm_test_server_capture *c, char *arg)
                arg = end + 1;
                capture_info->transform = strtol(arg, &end, 10);
        }
+       if (*end == '^') {
+               arg = end + 1;
+               if (strtol(arg, &end, 10) > 0)
+                       capture_info->type = TDM_CAPTURE_TYPE_STREAM;
+               else
+                       capture_info->type = TDM_CAPTURE_TYPE_ONESHOT;
+       }
 }
 
 static void
@@ -510,6 +517,7 @@ parse_args(tdm_test_server *data, int argc, char *argv[])
 
        if (argc < 2) {
                usage(argv[0]);
+               destroy(data);
                exit(0);
        }
 
@@ -590,6 +598,7 @@ parse_args(tdm_test_server *data, int argc, char *argv[])
                        data->do_vblank = 1;
                } else {
                        usage(argv[0]);
+                       destroy(data);
                        exit(0);
                }
        }
@@ -630,6 +639,13 @@ interpret_args(tdm_test_server *data)
                TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
                for (i = 0; i < output_count; i++) {
+                       tdm_output *output = tdm_display_get_output(data->display, i, NULL);
+                       tdm_output_conn_status status;
+                       ret = tdm_output_get_conn_status(output, &status);
+                       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+
+                       if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
+                               continue;
                        o = calloc(1, sizeof * o);
                        TDM_EXIT_IF_FAIL(o != NULL);
                        o->data = data;
@@ -774,26 +790,50 @@ get_tts_buffer(tbm_surface_h b)
 }
 
 static void
-exit_test(int sig)
+destroy(tdm_test_server *data)
 {
-       tdm_test_server *data = &tts_data;
        tdm_test_server_output *o = NULL, *oo = NULL;
        tdm_test_server_layer *l = NULL, *ll = NULL;
        tdm_test_server_pp *p = NULL, *pp = NULL;
        tdm_test_server_capture *c = NULL, *cc = NULL;
        tdm_test_server_prop *w = NULL, *ww = NULL;
+       tdm_error ret;
        int i;
 
-       printf("got signal: %d\n", sig);
+       LIST_FOR_EACH_ENTRY_SAFE(c, cc, &data->capture_list, link) {
+               LIST_DEL(&c->link);
+               tdm_capture_destroy(c->capture);
+               free(c);
+       }
 
-       LIST_FOR_EACH_ENTRY_SAFE(o, oo, &data->output_list, link) {
-               LIST_DEL(&o->link);
+       LIST_FOR_EACH_ENTRY_SAFE(p, pp, &data->pp_list, link) {
+               tdm_display_lock(data->display);
+               tdm_event_loop_source_remove(p->timer_source);
+               tdm_display_unlock(data->display);
 
+               tdm_pp_destroy(p->pp);
+       }
+
+       LIST_FOR_EACH_ENTRY_SAFE(o, oo, &data->output_list, link) {
                LIST_FOR_EACH_ENTRY_SAFE(l, ll, &o->layer_list, link) {
-                       LIST_DEL(&l->link);
+                       ret = tdm_layer_unset_buffer(l->layer);
+                       TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
+               }
+               ret = tdm_layer_commit(l->layer, NULL, NULL);
+               TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+       }
 
-                       tdm_layer_unset_buffer(l->layer);
+       LIST_FOR_EACH_ENTRY_SAFE(p, pp, &data->pp_list, link) {
+               LIST_DEL(&p->link);
+               for (i = 0; i < TDM_ARRAY_SIZE(p->bufs); i++)
+                       tbm_surface_destroy(p->bufs[i]);
+               free(p);
+       }
 
+       LIST_FOR_EACH_ENTRY_SAFE(o, oo, &data->output_list, link) {
+               LIST_DEL(&o->link);
+               LIST_FOR_EACH_ENTRY_SAFE(l, ll, &o->layer_list, link) {
+                       LIST_DEL(&l->link);
                        LIST_FOR_EACH_ENTRY_SAFE(w, ww, &l->prop_list, link) {
                                LIST_DEL(&w->link);
                                free(w);
@@ -802,9 +842,6 @@ exit_test(int sig)
                                tbm_surface_destroy(l->bufs[i]);
                        free(l);
                }
-
-               tdm_output_commit(o->output, 0, NULL, NULL);
-
                LIST_FOR_EACH_ENTRY_SAFE(w, ww, &o->prop_list, link) {
                        LIST_DEL(&w->link);
                        free(w);
@@ -813,26 +850,6 @@ exit_test(int sig)
                free(o);
        }
 
-
-       LIST_FOR_EACH_ENTRY_SAFE(p, pp, &data->pp_list, link) {
-               LIST_DEL(&p->link);
-
-               tdm_display_lock(data->display);
-               tdm_event_loop_source_remove(p->timer_source);
-               tdm_display_unlock(data->display);
-
-               tdm_pp_destroy(p->pp);
-               for (i = 0; i < TDM_ARRAY_SIZE(p->bufs); i++)
-                       tbm_surface_destroy(p->bufs[i]);
-               free(p);
-       }
-
-       LIST_FOR_EACH_ENTRY_SAFE(c, cc, &data->capture_list, link) {
-               LIST_DEL(&c->link);
-               tdm_capture_destroy(c->capture);
-               free(c);
-       }
-
        if (data->display)
                tdm_display_deinit(data->display);
 
@@ -847,8 +864,25 @@ main(int argc, char *argv[])
        int len = sizeof temp;
        tdm_error ret;
 
-       signal(SIGINT, exit_test);    /* 2 */
-       signal(SIGTERM, exit_test);   /* 15 */
+#if 1 /* for testing */
+       const char *s = (const char*)getenv("XDG_RUNTIME_DIR");
+       if (!s) {
+               char buf[32];
+               snprintf(buf, sizeof(buf), "/run");
+               int ret = setenv("XDG_RUNTIME_DIR", (const char*)buf, 1);
+               if (ret != 0)
+                       exit(0);
+       }
+
+       s = (const char*)getenv("TBM_DISPLAY_SERVER");
+       if (!s) {
+               char buf[32];
+               snprintf(buf, sizeof(buf), "1");
+               int ret = setenv("TBM_DISPLAY_SERVER", (const char*)buf, 1);
+               if (ret != 0)
+                       exit(0);
+       }
+#endif
 
        memset(data, 0, sizeof * data);
        LIST_INITHEAD(&data->output_list);
@@ -903,7 +937,7 @@ output_setup(tdm_test_server_output *o)
                }
                if (!best)
                        best = &modes[i];
-               if (modes[i].flags & TDM_OUTPUT_MODE_TYPE_PREFERRED)
+               if (modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED)
                        prefer = &modes[i];
        }
        if (!found && prefer) {
@@ -950,9 +984,9 @@ layer_get_buffer(tdm_test_server_layer *l)
        int i, size = TDM_ARRAY_SIZE(l->bufs);
        if (!l->bufs[0]) {
                for (i = 0; i < size; i++) {
-                       int width = (l->info.src_config.size.h)?:l->info.src_config.pos.w;
-                       int height = (l->info.src_config.size.v)?:l->info.src_config.pos.h;
-                       unsigned int format = (l->info.src_config.format)?:DEFAULT_FORMAT;
+                       int width = (l->info.src_config.size.h) ? : l->info.src_config.pos.w;
+                       int height = (l->info.src_config.size.v) ? : l->info.src_config.pos.h;
+                       unsigned int format = (l->info.src_config.format) ? : DEFAULT_FORMAT;
                        int flags = l->o->data->bflags;
                        tbm_surface_h b = buffer_allocate(width, height, format, flags);
                        TDM_EXIT_IF_FAIL(b != NULL);
@@ -970,7 +1004,7 @@ layer_get_buffer(tdm_test_server_layer *l)
 }
 
 static void
-layer_cb_commit(tdm_output *output, unsigned int sequence,
+layer_cb_commit(tdm_layer *layer, unsigned int sequence,
                                unsigned int tv_sec, unsigned int tv_usec,
                                void *user_data)
 {
@@ -989,6 +1023,8 @@ static void
 layer_cb_buffer_release(tbm_surface_h b, void *user_data)
 {
        tdm_test_server_buffer *tb = get_tts_buffer(b);
+       TDM_EXIT_IF_FAIL(tb != NULL);
+
        tb->in_use = 0;
        tdm_buffer_remove_release_handler(b, layer_cb_buffer_release, NULL);
        if (tb->done)
@@ -1009,12 +1045,13 @@ layer_show_buffer(tdm_test_server_layer *l, tbm_surface_h b)
        TDM_EXIT_IF_FAIL(tb != NULL);
 
        tb->in_use = 1;
-       tdm_buffer_add_release_handler(b, layer_cb_buffer_release, NULL);
+       ret = tdm_buffer_add_release_handler(b, layer_cb_buffer_release, NULL);
+       TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
        if (data->do_vblank)
-               ret = tdm_output_commit(l->o->output, 0, layer_cb_commit, l);
+               ret = tdm_layer_commit(l->layer, layer_cb_commit, l);
        else
-               ret = tdm_output_commit(l->o->output, 0, NULL, NULL);
+               ret = tdm_layer_commit(l->layer, NULL, NULL);
        TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
        printf("show:\tl(%p) b(%p)\n", l, b);
@@ -1073,9 +1110,9 @@ pp_get_buffer(tdm_test_server_pp *p)
        int i, size = TDM_ARRAY_SIZE(p->bufs);
        if (!p->bufs[0]) {
                for (i = 0; i < size; i++) {
-                       int width = (p->info.src_config.size.h)?:p->info.src_config.pos.w;
-                       int height = (p->info.src_config.size.v)?:p->info.src_config.pos.h;
-                       unsigned int format = (p->info.src_config.format)?:DEFAULT_FORMAT;
+                       int width = (p->info.src_config.size.h) ? : p->info.src_config.pos.w;
+                       int height = (p->info.src_config.size.v) ? : p->info.src_config.pos.h;
+                       unsigned int format = (p->info.src_config.format) ? : DEFAULT_FORMAT;
                        tbm_surface_h b = buffer_allocate(width, height, format, 0);
                        TDM_EXIT_IF_FAIL(b != NULL);
                        p->bufs[i] = b;
@@ -1083,6 +1120,10 @@ pp_get_buffer(tdm_test_server_pp *p)
        }
        for (i = 0; i < size; i++) {
                tdm_test_server_buffer *tb = get_tts_buffer(p->bufs[i]);
+
+               if (tb == NULL)
+                       continue;
+
                if (!tb->in_use) {
                        tdm_test_buffer_fill(p->bufs[i], p->data->b_fill);
                        return p->bufs[i];
@@ -1169,10 +1210,16 @@ pp_cb_timeout(void *user_data)
 static void
 pp_setup(tdm_test_server_pp *p, tbm_surface_h sb, tbm_surface_h db)
 {
-       tdm_test_server *data = p->l->o->data;
+       tdm_test_server *data;
        tbm_surface_info_s info;
        tdm_error ret;
 
+       if (!p || !p->l || !p->l->o || !p->l->o->data) {
+               TDM_ERR("invalid parameter failed");
+               exit(0);
+       }
+       data = p->l->o->data;
+
        p->pp = tdm_display_create_pp(data->display, &ret);
        TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
 
@@ -1209,8 +1256,7 @@ pp_setup(tdm_test_server_pp *p, tbm_surface_h sb, tbm_surface_h db)
        printf(" ! ");
        print_config(&p->info.dst_config);
        printf(" fps(%d) transform(%s)\n", p->fps, tdm_transform_str(p->info.transform));
-       if (p->l)
-               printf("\toutput_idx(%d) layer_idx(%d)\n", p->l->o->idx, p->l->idx);
+       printf("\toutput_idx(%d) layer_idx(%d)\n", p->l->o->idx, p->l->idx);
 
        layer_setup(p->l, db);
 
@@ -1282,12 +1328,18 @@ capture_attach(tdm_test_server_capture *c, tbm_surface_h b)
 static void
 capture_setup(tdm_test_server_capture *c, tbm_surface_h b)
 {
-       tdm_test_server *data = c->l->o->data;
+       tdm_test_server *data;
        tdm_output *output;
        tdm_layer *layer;
        tbm_surface_info_s info;
        tdm_error ret;
 
+       if (!c || !c->l || !c->l->o || !c->l->o->data) {
+               TDM_ERR("invalid parameter failed");
+               exit(0);
+       }
+       data = c->l->o->data;
+
        if (c->output_idx != -1 && c->layer_idx == -1) {
                output = tdm_display_get_output(data->display, c->output_idx, &ret);
                TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
@@ -1314,6 +1366,7 @@ capture_setup(tdm_test_server_capture *c, tbm_surface_h b)
                c->info.dst_config.size.v = info.height;
        }
        c->info.dst_config.format = info.format;
+       c->info.type = TDM_CAPTURE_TYPE_ONESHOT;
 
        ret = tdm_capture_set_info(c->capture, &c->info);
        TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
@@ -1324,8 +1377,7 @@ capture_setup(tdm_test_server_capture *c, tbm_surface_h b)
        printf("capture: o(%d) l(%d) ", c->output_idx, c->layer_idx);
        print_config(&c->info.dst_config);
        printf(" transform(%s)\n", tdm_transform_str(c->info.transform));
-       if (c->l)
-               printf("\toutput_idx(%d) layer_idx(%d)\n", c->l->o->idx, c->l->idx);
+       printf("\toutput_idx(%d) layer_idx(%d)\n", c->l->o->idx, c->l->idx);
 
        layer_setup(c->l, b);
 }
@@ -1381,8 +1433,12 @@ run_test(tdm_test_server *data)
 
        printf("enter test loop\n");
 
-       while (1)
-               tdm_display_handle_events(data->display);
+       while (1) {
+               ret = tdm_display_handle_events(data->display);
+               TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE);
+       }
+
+       destroy(data);
 
        return;
 no_pp: