summaryrefslogtreecommitdiff
path: root/src/decoder.cc
diff options
context:
space:
mode:
authordeva <deva>2005-04-19 11:19:53 +0000
committerdeva <deva>2005-04-19 11:19:53 +0000
commit9ea1160395b119536ba2ee74a99a4aba73c55711 (patch)
tree1990b0af29bed250d1d5d429c1ee46dd59afc6b1 /src/decoder.cc
parent322d53169f05269c6150019cb7fc7cd85c024cc8 (diff)
Isolated the dv1394 code in its own file.
Diffstat (limited to 'src/decoder.cc')
-rw-r--r--src/decoder.cc116
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