diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 7 | ||||
-rw-r--r-- | src/decoder.cc | 116 | ||||
-rw-r--r-- | src/decoder.h | 3 | ||||
-rw-r--r-- | src/dv1394.cc | 94 | ||||
-rw-r--r-- | src/dv1394.h | 17 | ||||
-rw-r--r-- | src/mov_encoder.cc | 1 |
6 files changed, 92 insertions, 146 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 4f0ffa2..0dc09d4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,7 +27,8 @@ miav_SOURCES = $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; fi ) \ mov_encoder.cc \ img_encoder.cc \ server.cc \ - error.cc + error.cc \ + dv1394.cc EXTRA_DIST = \ miav.conf \ @@ -54,7 +55,9 @@ EXTRA_DIST = \ thread.h \ util.h \ videowidget.h \ - debug.h + debug.h \ + dv.h \ + dv1394.cc miav_LDADD := $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList o; fi ) \ -lavcodec -lavformat 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 diff --git a/src/decoder.h b/src/decoder.h index 649fda8..267c8aa 100644 --- a/src/decoder.h +++ b/src/decoder.h @@ -30,8 +30,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -//#include <avformat.h> -#include <SDL/SDL.h> #include "queue.h" #include "encoder.h" @@ -40,7 +38,6 @@ #include "thread.h" #include "frame.h" - class Decoder : public Thread { public: Decoder(Error* err, diff --git a/src/dv1394.cc b/src/dv1394.cc index ea702a6..8d62605 100644 --- a/src/dv1394.cc +++ b/src/dv1394.cc @@ -26,42 +26,22 @@ #include <config.h> #include "dv1394.h" -init { - // FIXME: Read port and channel data from config. - int port = 0; - int channel = 63; // 63 is default channel... sucks. +#include "dv.h" - 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 ); - } +#include <stdlib.h> +#include <memory.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> - raw1394_set_iso_handler( handle, channel, raw_reader); - raw1394_set_userdata( handle, ( void* ) NULL); - raw1394_start_iso_rcv( handle, channel); -} +/** + * Callback function for the firewire interface. + */ static int raw_reader( raw1394handle_t handle, int channel, size_t length, quadlet_t *data ) { static char *framedata = NULL; @@ -122,3 +102,55 @@ static int raw_reader( raw1394handle_t handle, int channel, size_t length, quadl } return 0; } + +dv1394::dv1394(Error *e, int port, int channel) +{ + errobj = e; + int n_ports; + struct raw1394_portinfo pinf[ 16 ]; + + // 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 hooked 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::~dv1394() +{ +} + +unsigned char *dv1394::readFrame() +{ + unsigned char *ptr; + while(1) { + raw1394_loop_iterate(handle); + ptr = (unsigned char *)raw1394_get_userdata(handle); + if(ptr) { + raw1394_set_userdata(handle, NULL); + break; + } + } + return ptr; +} + diff --git a/src/dv1394.h b/src/dv1394.h index 47d9e56..d05a7aa 100644 --- a/src/dv1394.h +++ b/src/dv1394.h @@ -26,4 +26,21 @@ #include <config.h> #ifndef __MIAV_DV1394_H__ #define __MIAV_DV1394_H__ + +#include <libraw1394/raw1394.h> + +#include "error.h" + +class dv1394 { +public: + dv1394(Error *e = NULL, int port = 0, int channel = 63); // 63 is default channel... sucks. + ~dv1394(); + + unsigned char *readFrame(); + +private: + raw1394handle_t handle; + Error *errobj; +}; + #endif/*__MIAV_DV1394_H__*/ diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index edfafb7..2f1810f 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -40,7 +40,6 @@ MovEncoder::MovEncoder(const char *filename) fprintf(stderr, "Could not alloc output format context\n"); exit(1); } - ALLOC(dcc, "mov_encoder, efc"); efc->oformat = guess_format("mpeg", NULL, NULL); //efc->oformat = guess_format(NULL, filename, NULL); |