/* * test-vaapipostproc.c - Testsuite for VAAPI Postprocessor * * Copyright (C) 2017 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA */ #include #include #include typedef struct _CustomData { GstElement *pipeline; GstElement *postproc; GMainLoop *loop; } AppData; static gboolean _check_passthrough_mode (gpointer user_data) { gboolean ret; AppData *data = (AppData *) user_data; ret = gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (data->postproc)); if (ret) gst_println ("Now this pipeline is on passthrough mode"); else gst_println ("Now this pipeline is NOT on passthrough mode"); return FALSE; } static void set_contrast (AppData * data) { static gfloat value = 1.0; value = value == 1.0 ? 0.5 : 1.0; g_object_set (data->postproc, "contrast", value, NULL); gst_println ("contrast value is changed to %f", value); g_timeout_add (300, _check_passthrough_mode, data); } static void change_size (AppData * data) { static gint i = 0; if (i == 0) { g_object_set (data->postproc, "width", 1280, "height", 720, NULL); gst_println ("frame size is changed to 1280x720"); i++; } else { g_object_set (data->postproc, "width", 0, "height", 0, NULL); gst_println ("frame size is changed to default"); i = 0; } g_timeout_add (300, _check_passthrough_mode, data); } /* Process keyboard input */ static gboolean handle_keyboard (GIOChannel * source, GIOCondition cond, AppData * data) { gchar *str = NULL; if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) { return TRUE; } switch (g_ascii_tolower (str[0])) { case 's':{ set_contrast (data); break; } case 'c':{ change_size (data); break; } case 'q': g_main_loop_quit (data->loop); break; default: break; } g_free (str); return TRUE; } int main (int argc, char *argv[]) { AppData data = { 0, }; GstStateChangeReturn ret; GIOChannel *io_stdin; /* Initialize GStreamer */ gst_init (&argc, &argv); /* Print usage map */ gst_println ("USAGE: Choose one of the following options, then press enter:\n" " 's' to set contrast\n" " 'c' to change size\n" " 'q' to quit\n"); data.pipeline = gst_parse_launch ("videotestsrc name=src ! vaapih264enc ! vaapih264dec ! vaapipostproc name=postproc ! vaapisink", NULL); data.postproc = gst_bin_get_by_name (GST_BIN (data.pipeline), "postproc"); /* Add a keyboard watch so we get notified of keystrokes */ io_stdin = g_io_channel_unix_new (fileno (stdin)); g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc) handle_keyboard, &data); /* Start playing */ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr ("Unable to set the pipeline to the playing state.\n"); gst_object_unref (data.pipeline); return -1; } g_timeout_add (300, _check_passthrough_mode, &data); /* Create a GLib Main Loop and set it to run */ data.loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (data.loop); /* Free resources */ g_main_loop_unref (data.loop); g_io_channel_unref (io_stdin); gst_element_set_state (data.pipeline, GST_STATE_NULL); gst_object_unref (data.postproc); gst_object_unref (data.pipeline); return 0; }