summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am7
-rw-r--r--src/decoder.cc116
-rw-r--r--src/decoder.h3
-rw-r--r--src/dv1394.cc94
-rw-r--r--src/dv1394.h17
-rw-r--r--src/mov_encoder.cc1
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);