From 9ea1160395b119536ba2ee74a99a4aba73c55711 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 19 Apr 2005 11:19:53 +0000 Subject: Isolated the dv1394 code in its own file. --- src/decoder.cc | 116 ++++----------------------------------------------------- 1 file changed, 7 insertions(+), 109 deletions(-) (limited to 'src/decoder.cc') diff --git a/src/decoder.cc b/src/decoder.cc index d8ae2f5..7b4720e 100644 --- a/src/decoder.cc +++ b/src/decoder.cc @@ -22,12 +22,15 @@ */ #include #ifdef USE_GUI +/* #include #include #include #include -#include +*/ +#include +#include "dv1394.h" #include "dv.h" #include "decoder.h" @@ -48,111 +51,15 @@ Decoder::Decoder(Error* err, player_queue = gplayer_queue; mutex = gmutex; running = grunning; - - // Initialize libdv } Decoder::~Decoder() { - // Close libdv -} - -static int raw_reader( raw1394handle_t handle, int channel, size_t length, quadlet_t *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 - 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; } - void Decoder::decode() { - // FIXME: Read port and channel data from config. - int port = 0; - int channel = 63; // 63 is default channel... sucks. - - int n_ports; - struct raw1394_portinfo pinf[ 16 ]; - raw1394handle_t handle; - - // Get handle to firewire channels - handle = raw1394_new_handle(); - if(!handle) { - fprintf( stderr, "raw1394 - failed to get handle: %s.\n", strerror( errno ) ); - exit( EXIT_FAILURE ); - } - - // how many adapters are hook in? - if((n_ports = raw1394_get_port_info(handle, pinf, 16)) < 0 ) { - fprintf( stderr, "raw1394 - failed to get port info: %s.\n", strerror( errno ) ); - raw1394_destroy_handle( handle ); - exit( EXIT_FAILURE ); - } - - // Tell raw1394 which host adapter to use - if(raw1394_set_port(handle, port) < 0 ) { - errobj->pushError("Error while opening codec for input stream."); - fprintf( stderr, "raw1394 - failed to set port: %s.\n", strerror( errno ) ); - exit( EXIT_FAILURE ); - } - - raw1394_set_iso_handler( handle, channel, raw_reader); - raw1394_set_userdata( handle, ( void* ) NULL); - raw1394_start_iso_rcv( handle, channel); + dv1394 dv_stream = dv1394(); // Use default port and channel. while(*running) { uint8_t *ptr; @@ -160,16 +67,7 @@ void Decoder::decode() SDL_Event user_event; // Read a dvframe - while(1) { - raw1394_loop_iterate(handle); - ptr = (uint8_t *)raw1394_get_userdata(handle); - if(ptr) { - raw1394_set_userdata(handle, NULL); - break; - } - len = DVPACKAGE_SIZE; - } - Frame *frame = new Frame((void*)ptr, len); + Frame *frame = new Frame(dv_stream.readFrame(), DVPACKAGE_SIZE); pthread_mutex_lock(mutex); encode_queue->push(frame); @@ -186,7 +84,7 @@ void Decoder::decode() SDL_PushEvent(&user_event); // Free framedata. - free(ptr); + // free(ptr); } // Kick the others so they wake up with empty queues -- cgit v1.2.3