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); | 
