summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/frame.cc24
-rw-r--r--lib/frame.h35
-rw-r--r--lib/frame_stream.h6
-rw-r--r--lib/libdv_wrapper.cc68
-rw-r--r--lib/libdv_wrapper.h8
5 files changed, 113 insertions, 28 deletions
diff --git a/lib/frame.cc b/lib/frame.cc
index caab521..b3ad28f 100644
--- a/lib/frame.cc
+++ b/lib/frame.cc
@@ -30,6 +30,30 @@
#include <memory.h>
#include <stdlib.h>
+Frame::Frame(char *vframe, int vframesize, int vformat,
+ char *aframe, int aframesize, int aformat)
+{
+ // Video
+ this->vframe = vframe;
+ this->vframesize = vframesize;
+ this->vformat = vformat;
+
+ // Audio
+ this->aframe = aframe;
+ this->aframesize = aframesize;
+ this->aformat = aformat;
+}
+
+
+
+
+
+
+
+
+/**
+ * Old frame code... to be removed shortly
+ */
Frame::Frame(unsigned char *d, int sz)
{
if(sz) data = new unsigned char[sz];
diff --git a/lib/frame.h b/lib/frame.h
index 66c2ce7..ecfa308 100644
--- a/lib/frame.h
+++ b/lib/frame.h
@@ -28,14 +28,45 @@
#ifndef __FRAME_H__
#define __FRAME_H__
-#define START_USE_FRAME(x) x->usage++
-#define STOP_USE_FRAME(x) if(--x->usage == 0) delete x; x = NULL
+//#define START_USE_FRAME(x) x->usage++
+//#define STOP_USE_FRAME(x) if(--x->usage == 0) delete x; x = NULL
// Definition of vector
#include <vector>
+// VIDEO FORMATS
+#define VF_NONE 0x00
+#define VF_DV 0x01
+#define VF_YUV422 0x02
+#define VF_YV12 0x03
+#define VF_RGB 0x04
+#define VF_BRG0 0x05
+
+// AUDIO FORMATS
+#define AF_NONE 0x00 // Dummy
+#define AF_DV 0x01 // Audio data is in the DV video frame
+#define AF_PCM_48KHZ_16BIT 0x02 // Raw pcm data in 48khz and 16bit
+#define AF_MP3 0x03 // Lame encoded audio
+
class Frame {
public:
+ Frame(char *aframe, int aframesize, int aformat,
+ char *vframe, int vframesize, int vformat);
+
+ // Video
+ char* vframe;
+ int vframesize;
+ int vformat;
+
+ // Audio
+ char *aframe;
+ int aframesize;
+ int aformat;
+
+ /**
+ * Old frame code... to be removed shortly
+ */
+public:
Frame(unsigned char *d, int sz = 0);
~Frame();
diff --git a/lib/frame_stream.h b/lib/frame_stream.h
index bc0b9a2..32fea15 100644
--- a/lib/frame_stream.h
+++ b/lib/frame_stream.h
@@ -26,14 +26,16 @@
*/
#include "config.h"
#ifndef __MIAV_FRAME_STREAM_H__
-#define __MIAV_FRAME_STREAM_H__
+#define __MIAV_FRAME_STREAM_H_
+
+#include "frame.h"
class frame_stream {
public:
frame_stream() {}
virtual ~frame_stream() {}
- virtual unsigned char *readFrame() = 0;
+ virtual Frame *readFrame() = 0;
};
diff --git a/lib/libdv_wrapper.cc b/lib/libdv_wrapper.cc
index df624b6..cb9cc7c 100644
--- a/lib/libdv_wrapper.cc
+++ b/lib/libdv_wrapper.cc
@@ -40,6 +40,7 @@ LibDVWrapper::LibDVWrapper(DV::Quality quality,
setSampling(sampling);
yuv[0] = yuv[1] = yuv[2] = NULL;
+ pitches[0] = pitches[1] = pitches[2] = 0;
width = 720;
height = 576;
@@ -73,56 +74,83 @@ void LibDVWrapper::setSampling(DV::Sampling sampling)
decoder->sampling = (dv_sample_t)sampling;
}
-void LibDVWrapper::setOutputBuffer(char *output, DV::ColorSpace c)
+Frame *LibDVWrapper::decode(Frame *input, DV::ColorSpace c)
{
- colorspace = c;
+ if(input->vformat != VF_DV) {
+ fprintf(stderr, "Wrong format in LibDVWrapper, expected VF_DV, got: %i\n", input->vformat);
+ return NULL;
+ }
+
+ /*
+ if(first) {
+ dv_parse_header(decoder, (const uint8_t*)input);
+ //dv_parse_packs(decoder, frame->data); // Not needed anyway!
+ decoder->std = e_dv_std_iec_61834;
+ decoder->num_dif_seqs = 12;
+ first = false;
+ }
+ */
+
+
+ int size = 0;
+ char* buf = NULL;
+ int type = VF_NONE;
+ DV::ColorSpace colorspace = c;
switch(colorspace) {
case DV::YUV:
#ifdef COLORSPACE_YV12
- yuv[0] = (unsigned char*)output;
+ size = width*height*2;
+ buf = (char*)malloc(size);
+ type = VF_YV12;
+ yuv[0] = (unsigned char*)buf;
yuv[1] = (unsigned char*)yuv[0] + (width * height);
yuv[2] = (unsigned char*)yuv[1] + (width * height / 4);
pitches[0] = width;
pitches[1] = width / 2;
pitches[2] = width / 2;
#else
- yuv[0] = (unsigned char*)output;
+ printf("!\n");
+ size = width*height*2;
+ buf = (char*)malloc(size);
+ type = VF_YUV422;
+ yuv[0] = (unsigned char*)buf;
+ yuv[1] = yuv[2] = NULL;
pitches[0] = width * 2;
+ pitches[1] = pitches[2] = 0;
#endif
break;
case DV::RGB:
- yuv[0] = (unsigned char*)output;
+ size = width*height*3;
+ buf = (char*)malloc(size);
+ type = VF_RGB;
+ yuv[0] = (unsigned char*)buf;
yuv[1] = yuv[2] = NULL;
pitches[0] = width * 3;
+ pitches[1] = pitches[2] = 0;
break;
case DV::BGR0:
- yuv[0] = (unsigned char*)output;
+ size = width*height*4;
+ buf = (char*)malloc(size);
+ type = VF_BRG0;
+ yuv[0] = (unsigned char*)buf;
yuv[1] = yuv[2] = NULL;
pitches[0] = width * 4;
+ pitches[1] = pitches[2] = 0;
break;
}
-}
-
-void LibDVWrapper::decode(char *input)
-{
- if(!yuv[0]) return; // outputbuffer not set!
- /*
- if(first) {
- dv_parse_header(decoder, (const uint8_t*)input);
- //dv_parse_packs(decoder, frame->data); // Not needed anyway!
- decoder->std = e_dv_std_iec_61834;
- decoder->num_dif_seqs = 12;
- first = false;
- }
- */
dv_decode_full_frame(decoder,
(const uint8_t*)input,
(dv_color_space_t)colorspace,
yuv,
pitches);
+ // memset(buf, 1, width*height);
+ // memset(buf+width*height, 100, width*height/2);
+ // memset(buf+width*height+width*height/2, 200, width*height/2);
+ Frame *frame = new Frame(buf, size, type, NULL, 0, AF_NONE);
+ return frame;
}
diff --git a/lib/libdv_wrapper.h b/lib/libdv_wrapper.h
index 16a7d94..bde5620 100644
--- a/lib/libdv_wrapper.h
+++ b/lib/libdv_wrapper.h
@@ -31,6 +31,8 @@
#include <libdv/dv.h>
#include <libdv/dv_types.h>
+#include "frame.h"
+
namespace DV {
/*
#define DV_QUALITY_COLOR 1 // Clear this bit to make monochrome
@@ -104,9 +106,7 @@ public:
void setSystem(DV::System system);
void setSampling(DV::Sampling sampling);
- void setOutputBuffer(char *output, DV::ColorSpace colorspace = DV::YUV);
-
- void decode(char *input);
+ Frame *decode(Frame *input, DV::ColorSpace colorspace = DV::YUV);
private:
bool first;
@@ -116,7 +116,7 @@ private:
unsigned char* yuv[3];
dv_decoder_t *decoder;
- DV::ColorSpace colorspace;
+ // DV::ColorSpace colorspace;
};
#endif/*__MIAV_LIBDV_WRAPPER_H__*/