/* * libiec61883 - Linux IEEE 1394 streaming media library. * Copyright (C) 2004 Dan Dennedy * * This example demonstrates creating a process to host plug control registers * used for connection management procedures as described in IEC 61883-1. * This can be expanded to run as a daemon, use syslog, and define some * interprocess communication for the addition and removal of plug control * registers. libiec61883 plug functions are not thread safe and manipulations * should be protected. * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "../src/iec61883.h" #include #include #include #include #include static int g_done = 0; static void sighandler (int sig) { g_done = 1; } int main (int argc, char *argv[]) { raw1394handle_t handle = raw1394_new_handle_on_port (0); if (handle) { int fd = raw1394_get_fd (handle); struct timeval tv; fd_set rfds; int result; signal (SIGINT, sighandler); signal (SIGTERM, sighandler); if ((result = iec61883_plug_impr_init (handle, IEC61883_DATARATE_400)) < 0) { fprintf (stderr, "iec61883_plug_impr_init failed: %d\n", result); raw1394_destroy_handle (handle); return 1; } if ((result = iec61883_plug_ipcr_add (handle, 1 /* online */)) < 0) { fprintf (stderr, "iec61883_plug_add_ipcr failed: %d\n", result); raw1394_destroy_handle (handle); return 1; } if ((result = iec61883_plug_ompr_init (handle, IEC61883_DATARATE_400, 63)) < 0) { fprintf (stderr, "iec61883_plug_ompr_init failed: %d\n", result); raw1394_destroy_handle (handle); return 1; } /* 968 = 5 transport stream packets + CIP header, payload is in quadlets */ /* even after reading the spec I still don't understand the overhead parameter. Besides, the iso packet headers, where does the overhead come from? */ if ((result = iec61883_plug_opcr_add (handle, 1 /* online */, IEC61883_OVERHEAD_512, 968/4)) < 0) { fprintf (stderr, "iec61883_plug_add_opcr failed: %d\n", result); raw1394_destroy_handle (handle); return 1; } do { FD_ZERO (&rfds); FD_SET (fd, &rfds); tv.tv_sec = 0; tv.tv_usec = 20000; if (select (fd + 1, &rfds, NULL, NULL, &tv) > 0) raw1394_loop_iterate (handle); } while (g_done == 0); fprintf (stderr, "done.\n"); iec61883_plug_impr_close (handle); iec61883_plug_ompr_close (handle); raw1394_destroy_handle (handle); } else { fprintf (stderr, "Failed to get libraw1394 handle\n"); return 1; } return 0; }