diff options
author | deva <deva> | 2005-04-19 11:19:53 +0000 |
---|---|---|
committer | deva <deva> | 2005-04-19 11:19:53 +0000 |
commit | 9ea1160395b119536ba2ee74a99a4aba73c55711 (patch) | |
tree | 1990b0af29bed250d1d5d429c1ee46dd59afc6b1 /src/decoder.cc | |
parent | 322d53169f05269c6150019cb7fc7cd85c024cc8 (diff) |
Isolated the dv1394 code in its own file.
Diffstat (limited to 'src/decoder.cc')
-rw-r--r-- | src/decoder.cc | 116 |
1 files changed, 7 insertions, 109 deletions
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 <config.h> #ifdef USE_GUI +/* #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> -#include <libraw1394/raw1394.h> +*/ +#include <SDL/SDL.h> +#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 |