diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/frame.cc | 24 | ||||
-rw-r--r-- | lib/frame.h | 35 | ||||
-rw-r--r-- | lib/frame_stream.h | 6 | ||||
-rw-r--r-- | lib/libdv_wrapper.cc | 68 | ||||
-rw-r--r-- | lib/libdv_wrapper.h | 8 |
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__*/ |