From 8ed72d0bf435366bc2badae3af6146bc40006cb3 Mon Sep 17 00:00:00 2001 From: Dario Faggioli Date: Thu, 14 May 2009 00:48:53 +0200 Subject: [PATCH] A new video playing demo has been added. This realizes video playing with an external program (mplayer) and it is realized by means of two processes. Another example, this time using pthreads will come in short while. --- demo/Makefile.omk | 4 +- demo/video/Makefile | 14 +++++ demo/video/Makefile.omk | 6 ++ demo/video/play.c | 132 ++++++++++++++++++++++++++++++++++++++++ demo/video/play.h | 25 ++++++++ 5 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 demo/video/Makefile create mode 100644 demo/video/Makefile.omk create mode 100644 demo/video/play.c create mode 100644 demo/video/play.h diff --git a/demo/Makefile.omk b/demo/Makefile.omk index 93267e3..d4a819e 100644 --- a/demo/Makefile.omk +++ b/demo/Makefile.omk @@ -1,6 +1,8 @@ -default_CONFIG = CONFIG_DEMO_CAMERA=n CONFIG_DEMO_DCAMERA=y +default_CONFIG = CONFIG_DEMO_VIDEO=y CONFIG_DEMO_CAMERA=n CONFIG_DEMO_DCAMERA=y SUBDIRS=$(SUBDIRS-y) +SUBDIRS-$(CONFIG_DEMO_VIDEO) += video SUBDIRS-$(CONFIG_DEMO_CAMERA) += camera SUBDIRS-$(CONFIG_DEMO_DCAMERA) += dcamera + diff --git a/demo/video/Makefile b/demo/video/Makefile new file mode 100644 index 0000000..b22a357 --- /dev/null +++ b/demo/video/Makefile @@ -0,0 +1,14 @@ +# Generic directory or leaf node makefile for OCERA make framework + +ifndef MAKERULES_DIR +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) ) +endif + +ifeq ($(MAKERULES_DIR),) +all : default +.DEFAULT:: + @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n" +else +include $(MAKERULES_DIR)/Makefile.rules +endif + diff --git a/demo/video/Makefile.omk b/demo/video/Makefile.omk new file mode 100644 index 0000000..404f40a --- /dev/null +++ b/demo/video/Makefile.omk @@ -0,0 +1,6 @@ +FRSH_LIBS = frsh +lib_LOADLIBES+= m pthread rt $(FRSH_LIBS) + +bin_PROGRAMS = fplayer +fplayer_SOURCES = play.c play.h + diff --git a/demo/video/play.c b/demo/video/play.c new file mode 100644 index 0000000..259c018 --- /dev/null +++ b/demo/video/play.c @@ -0,0 +1,132 @@ +#include "play.h" + +frsh_rel_time_t player_budget, player_period; +frsh_contract_t player_contract; +frsh_thread_id_t player_thread; +frsh_vres_id_t player_vres; + +sem_t *player_stopper; +int stopper_fd; + +void player(struct player_args *args) +{ + char cmd[255]; + + fprintf(stdout, "== Waiting for being bound...\n"); + + sem_wait(player_stopper); + munmap(player_stopper, sizeof(sem_t)); + + fprintf(stdout, + "== Starting playing %s, with %d/%d CPU bandwidth\n", + args->file, args->budget, args->period); + + snprintf(cmd, 255, "mplayer %s", args->file); + fprintf(stdout, "== Issuing command:\n %s\n", cmd); + + execlp("mplayer", "mplayer", "-fs", "-zoom", args->file, (char*) NULL); +} + +int main(int argc, char *argv[]) +{ + struct player_args args; + int player_status; + pid_t player_pid; + int opt, terror; + + if (argc < 7) { +err_usage: + fprintf(stderr, "USAGE:\n" + "%s -b budget_usec -p period_usec -f file\n\n", + argv[0]); + error(EXIT_FAILURE, EINVAL, "Wrong argument count"); + } + + while ((opt = getopt(argc, argv, "b:p:f:")) != -1) { + switch (opt) { + case 'b': + args.budget = atoi(optarg); + break; + case 'p': + args.period = atoi(optarg); + break; + case 'f': + strncpy(args.file, optarg, sizeof(args.file)); + break; + default: + goto err_usage; + } + } + + PXW(frsh_init()); + + stopper_fd = shm_open("/stopper", O_CREAT|O_EXCL|O_RDWR, S_IRWXU); + if (stopper_fd < 0) assert_perror(errno); + + terror = ftruncate(stopper_fd, sizeof(sem_t)); + if (terror) { + shm_unlink("/stopper"); + assert_perror(errno); + } + + player_stopper = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, + MAP_SHARED, stopper_fd, 0); + if (player_stopper == MAP_FAILED) { + shm_unlink("/stopper"); + assert_perror(errno); + } + + terror = close(stopper_fd); + if (terror) { + shm_unlink("/stopper"); + assert_perror(errno); + } + + sem_init(player_stopper, 1, 0); + fprintf(stderr, "FRSH initialized\n"); + + player_budget = fosa_usec_to_rel_time(args.budget); + player_period = fosa_usec_to_rel_time(args.period); + PXW(frsh_contract_init(&player_contract)); + PXW(frsh_contract_set_basic_params(&player_contract, + &player_budget, + &player_period, + FRSH_WT_INDETERMINATE, + FRSH_CT_REGULAR)); + PXW(frsh_contract_set_resource_and_label(&player_contract, + FRSH_RT_PROCESSOR, + 0, + "PLAYER_CONTRACT")); + fprintf(stdout, "Player contract initialized\n"); + + PXW(frsh_contract_negotiate(&player_contract, &player_vres)); + fprintf(stdout, "Player contract negotiated\n"); + + terror = player_pid = fork(); + if (terror < 0) { + /* error */ + assert_perror(errno); + } else if (!terror) { + /* child process: */ + player(&args); + } + + player_thread.linux_pid = player_thread.linux_tid = player_pid; + PXW(frsh_thread_bind(player_vres, player_thread)); + fprintf(stdout, "Player thread bound to its contract\n"); + + sem_post(player_stopper); + munmap(player_stopper, sizeof(sem_t)); + shm_unlink("/stopper"); + + waitpid(player_pid, &player_status, 0); + if (WIFEXITED(player_status)) + fprintf(stdout, "Playback finished normally\n"); + else if (WIFSIGNALED(player_status)) + fprintf(stdout, "Playback aborted\n"); + + PXW(frsh_contract_cancel(player_vres)); + + exit(EXIT_SUCCESS); +} + diff --git a/demo/video/play.h b/demo/video/play.h new file mode 100644 index 0000000..93a84f0 --- /dev/null +++ b/demo/video/play.h @@ -0,0 +1,25 @@ +#ifndef _PLAY_H_ +#define _PLAY_H_ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include + +#include + +struct player_args { + int budget, period; + char file[128]; +}; + +void player(struct player_args *args); + +#endif /* _PLAY_H_ */ + -- 2.39.2