diff options
Diffstat (limited to 'src/dv1394.cc')
-rw-r--r-- | src/dv1394.cc | 150 |
1 files changed, 44 insertions, 106 deletions
diff --git a/src/dv1394.cc b/src/dv1394.cc index 270da2e..fe06a4d 100644 --- a/src/dv1394.cc +++ b/src/dv1394.cc @@ -24,14 +24,8 @@ * along with MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <config.h> #include "dv1394.h" -#ifdef USE_GUI - -#include "dv.h" - - #include <stdlib.h> #include <memory.h> #include <stdio.h> @@ -39,76 +33,31 @@ #include <sys/stat.h> #include <fcntl.h> #include <errno.h> +#include <sys/poll.h> +#include "dv.h" - -/** - * Callback function for the firewire interface. - */ -static int raw_reader( raw1394handle_t handle, int channel, size_t length, quadlet_t *data ) +static int write_frame(unsigned char *data, int len, int complete, + void *callback_data) { - static char *framedata = NULL; - - // Only process packets with reasonable length. - if ( length > 16 ) - { - unsigned char * p = ( unsigned char* ) & data[ 3 ]; - int section_type = p[ 0 ] >> 5; // section type is in bits 5 - 7 - int dif_sequence = p[ 1 ] >> 4; // dif sequence number is in bits 4 - 7 - int dif_block = p[ 2 ]; - - if ( section_type == 0 && dif_sequence == 0 ) - { - if ( framedata != NULL ) - { - raw1394_set_userdata(handle, (void *)framedata); - framedata = NULL; - } - } - - if(!framedata) - { - framedata = (char *)malloc(DVPACKAGE_SIZE); // dvframe.h - if(!framedata) - { - // We're fucked - fprintf(stderr, "Framedata allocation error: %s.\n", strerror( errno ) ); fflush(stderr); - exit(1); - } - } - - switch ( section_type ) - { - case 0: // 1 Header block - // p[3] |= 0x80; // hack to force PAL data - memcpy( framedata + dif_sequence * 150 * 80, p, 480 ); - break; - - case 1: // 2 Subcode blocks - memcpy( framedata + dif_sequence * 150 * 80 + ( 1 + dif_block ) * 80, p, 480 ); - break; - - case 2: // 3 VAUX blocks - memcpy( framedata + dif_sequence * 150 * 80 + ( 3 + dif_block ) * 80, p, 480 ); - break; - - case 3: // 9 Audio blocks interleaved with video - memcpy( framedata + dif_sequence * 150 * 80 + ( 6 + dif_block * 16 ) * 80, p, 480 ); - break; - - case 4: // 135 Video blocks interleaved with audio - memcpy( framedata + dif_sequence * 150 * 80 + ( 7 + ( dif_block / 15 ) + dif_block ) * 80, p, 480 ); - break; - - default: // we can't handle any other data - break; - } - } - return 0; + class dv1394 *dv = (class dv1394*)callback_data; + + if (complete == 0) { + fprintf (stderr, "Error: incomplete frame received!\n"); + return 0; + } + //return (fwrite (data, len, 1, f) < 1) ? -1 : 0; + unsigned char *ptr = (unsigned char *)malloc(len); + memcpy(ptr, data, len); + + dv->ptr = ptr; + + return 1; } dv1394::dv1394(Info *i, int p, int c) { + printf("dv1394::dv1394()\n"); info = i; port = p; channel = c; @@ -116,60 +65,49 @@ dv1394::dv1394(Info *i, int p, int c) dv1394::~dv1394() { + printf("dv1394::~dv1394()\n"); + iec61883_dv_fb_close (frame); // Close firewire connection. - if(handle) raw1394_destroy_handle(handle); + if(handle) raw1394_destroy_handle (handle); } bool dv1394::connect() { - int n_ports; - struct raw1394_portinfo pinf[ 16 ]; + printf("dv1394::connect()\n"); - // Get handle to firewire channels - handle = raw1394_new_handle(); - if(!handle) { - info->error("raw1394 - failed to get handle: %s.", strerror( errno ) ); - return false; - } + handle = raw1394_new_handle_on_port(port); + printf(" handle: %p\n", handle); - // how many adapters are hooked in? - if((n_ports = raw1394_get_port_info(handle, pinf, 16)) < 0 ) { - info->error("raw1394 - failed to get port info: %s.", strerror( errno ) ); - raw1394_destroy_handle(handle); - handle = NULL; - return false; - } + frame = iec61883_dv_fb_init(handle, write_frame, this); + printf(" frame: %p\n", frame); - // Tell raw1394 which host adapter to use - if(raw1394_set_port(handle, port) < 0 ) { - info->error("raw1394 - failed to set port: %s.", strerror( errno ) ); - raw1394_destroy_handle(handle); - handle = NULL; + if(frame && iec61883_dv_fb_start(frame, channel) == 0) { + // ok + printf("frame ok\n"); + } else { + // fail + printf("frame fail\n"); return false; - } + } - raw1394_set_iso_handler( handle, channel, raw_reader); - raw1394_set_userdata( handle, ( void* ) NULL); - raw1394_start_iso_rcv( handle, channel); - return true; } unsigned char *dv1394::readFrame() { - // Firewire port not correctly opened. - if(!handle) return NULL; - - unsigned char *ptr; - while(1) { - raw1394_loop_iterate(handle); - ptr = (unsigned char *)raw1394_get_userdata(handle); - if(ptr) { - raw1394_set_userdata(handle, NULL); - break; + struct pollfd pfd; + pfd.fd = raw1394_get_fd(handle); + pfd.events = POLLIN | POLLPRI; + pfd.revents = 0; + + ptr = NULL; + + while(ptr == NULL) { + if(poll (&pfd, 1, 50) > 0 && (pfd.revents & POLLIN)) { + raw1394_loop_iterate(handle); } } + return ptr; } -#endif/*USE_GUI*/ |