diff options
-rw-r--r-- | client/decoder.cc | 20 | ||||
-rw-r--r-- | client/decoder.h | 5 | ||||
-rw-r--r-- | client/mainwindow.cc | 6 | ||||
-rw-r--r-- | client/miav_client.cc | 4 | ||||
-rw-r--r-- | client/player.cc | 55 | ||||
-rw-r--r-- | client/player.h | 17 | ||||
-rw-r--r-- | client/videowidget.cc | 15 | ||||
-rw-r--r-- | client/xvaccelrenderer.cc | 10 | ||||
-rw-r--r-- | client/xvaccelrenderer.h | 5 |
9 files changed, 116 insertions, 21 deletions
diff --git a/client/decoder.cc b/client/decoder.cc index d4d1d15..e181516 100644 --- a/client/decoder.cc +++ b/client/decoder.cc @@ -28,14 +28,30 @@ #include "info.h" +#include "dv.h" +//#include "dvfile.h" +#include "dv1394.h" + Decoder::Decoder() -{} +{ + frame = NULL; +} Decoder::~Decoder() {} void Decoder::run() { - // MIaV::info->info("The decoder thread is running."); + dv1394 reader; + + reader.connect(); + + while(1) { + frame = reader.readFrame(); + } } +unsigned char *Decoder::getFrame() +{ + return frame; +} diff --git a/client/decoder.h b/client/decoder.h index 78caa59..ca684ed 100644 --- a/client/decoder.h +++ b/client/decoder.h @@ -35,7 +35,12 @@ public: Decoder(); ~Decoder(); + unsigned char *getFrame(); + void run(); + +private: + unsigned char *frame; }; #endif/*__MIAV_DECODER_H__*/ diff --git a/client/mainwindow.cc b/client/mainwindow.cc index c3b8649..c3d29ba 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -48,7 +48,6 @@ QPushButton *MainWindow::createButton(char* icon) Qt::KeepAspectRatio:Qt::KeepAspectRatioByExpanding; pixmap = pixmap.scaled(w,h, aspect, Qt::SmoothTransformation); - QPushButton *btn = new QPushButton(); btn->setIconSize(QSize(50,50)); @@ -62,8 +61,6 @@ MainWindow::MainWindow(): QWidget() { MIaV::info->log("Starting MIaV v. %s.", VERSION); - resize(800, 600); - // Create the overlaying splashscreen SplashScreen splash(this); /* @@ -127,7 +124,8 @@ MainWindow::MainWindow(): QWidget() // Create statusbar show(); - // setWindowState(Qt::WindowFullScreen); + //setWindowState(Qt::WindowFullScreen); + resize(800, 600); MIaV::info->log("MIaV is ready."); } diff --git a/client/miav_client.cc b/client/miav_client.cc index ff38f09..376a27e 100644 --- a/client/miav_client.cc +++ b/client/miav_client.cc @@ -48,11 +48,11 @@ int main(int argc, char *argv[]) MainWindow mainwindow; Decoder decoder; - Player player(mainwindow.getVideo()); + Player player(mainwindow.getVideo(), &decoder); NetworkSender sender; decoder.start(); - player.start(500); // 25 frames / second + player.start(40); // 100: 10fps, 40: 25fps sender.start(); return app.exec(); diff --git a/client/player.cc b/client/player.cc index fad7df4..1edf2cb 100644 --- a/client/player.cc +++ b/client/player.cc @@ -26,23 +26,35 @@ */ #include "player.h" -static unsigned char yuv[720*576*4]; +#define WIDTH 720 +#define HEIGHT 576 + +static unsigned char yuv_buf[WIDTH*HEIGHT*3]; static int num = 0; +static bool first = true; -Player::Player(VideoWidget *w) +Player::Player(VideoWidget *w, Decoder *d) { widget = w; + decoder = d; - render.init(widget, 720, 576);//widget->getWidth(), widget->getHeight() + render.init(widget, WIDTH, HEIGHT);//widget->getWidth(), widget->getHeight() connect(this, SIGNAL(timeout()), this, SLOT(show_frame())); + /* for(int x = 1; x < 720; x++) for(int y = 1; y < 576; y++) { yuv[x + y * 576 * 1] = x % 720 * 255; yuv[x + y * 576 * 2] = y % 576 * 255; yuv[x + y * 576 * 3] = (unsigned char)x % y; } + */ + + dvdecoder = dv_decoder_new(FALSE/*this value is unused*/, FALSE, FALSE); + dvdecoder->quality = DV_QUALITY_BEST; + + // reader.connect(); } Player::~Player() @@ -52,10 +64,45 @@ Player::~Player() void Player::show_frame() { + uint8_t *frame; fprintf(stderr, "Frame!%d\n", num++); + + frame = decoder->getFrame(); + + if(!frame) return; + if(first) { +#ifdef COLORSPACE_YV12 + yuv[0] = yuv_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] = yuv_buf; + pitches[0] = WIDTH * 2; +#endif + + dv_parse_header(dvdecoder, frame); + //dv_parse_packs(decoder, frame->data); // Not needed anyway! + + dvdecoder->system = e_dv_system_625_50; // PAL lines, PAL framerate + dvdecoder->sampling = e_dv_sample_422; // 4 bytes y, 2 bytes u, 2 bytes v + dvdecoder->std = e_dv_std_iec_61834; + dvdecoder->num_dif_seqs = 12; + first = false; + } + + dv_decode_full_frame(dvdecoder, + frame, + e_dv_color_yuv, + yuv, + pitches); + render.width = widget->getWidth(); render.height = widget->getHeight(); - render.display(yuv, 720, 576);//widget->width(), widget->height()); + render.display(yuv_buf, WIDTH, HEIGHT);//widget->width(), widget->height()); + } diff --git a/client/player.h b/client/player.h index 59e1f70..d3db533 100644 --- a/client/player.h +++ b/client/player.h @@ -30,23 +30,38 @@ #include <QTimer> #include "videowidget.h" +#include "decoder.h" + +#include "dv1394.h" #include <X11/Xlib.h> #include <X11/extensions/Xvlib.h> +// Use libdv +#include <libdv/dv.h> +#include <libdv/dv_types.h> + #include "xvaccelrenderer.h" class Player : public QTimer { Q_OBJECT public: - Player(VideoWidget *widget); + Player(VideoWidget *widget, Decoder *decoder); ~Player(); public slots: void show_frame(); private: + // dv1394 reader; + + int pitches[3]; + unsigned char* yuv[3]; + + dv_decoder_t *dvdecoder; + + Decoder *decoder; VideoWidget *widget; XvAccelRender render; diff --git a/client/videowidget.cc b/client/videowidget.cc index edabf71..f6fc430 100644 --- a/client/videowidget.cc +++ b/client/videowidget.cc @@ -51,9 +51,24 @@ VideoWidget::~VideoWidget() { } +//static QWidget *realparent; void VideoWidget::mouseReleaseEvent(QMouseEvent *event) { /* + fprintf(stderr, "Fullscreen\n"); + + if(isFullScreen()) { + // setWindowState(Qt::WindowNoState); + setParent(realparent); + showNormal(); + } else { + realparent = parentWidget(); + setParent(NULL); + showFullScreen(); + // setWindowState(Qt::WindowFullScreen); + } + */ + /* if(!parent) { // We are a fullscreen window QString ids; setenv("SDL_WINDOWID", ids.setNum(oldWindow->winId()).toStdString().c_str(), 1); diff --git a/client/xvaccelrenderer.cc b/client/xvaccelrenderer.cc index 188574e..f030642 100644 --- a/client/xvaccelrenderer.cc +++ b/client/xvaccelrenderer.cc @@ -28,10 +28,6 @@ // Use this define for verbose output #define VERBOSE_XV -// Use this define for YV12 colorspace, default is YUY2 -//#define COLORSPACE_YV12 - - //static uint8_t GUI_XvSync(void); @@ -118,7 +114,7 @@ uint8_t XvAccelRender::GUI_XvDisplay(uint8_t * src, uint32_t w, uint32_t h) #else XvPutImage(xv_display, xv_port, xv_win, xv_gc, xvimage, 0, 0, w, h, // src - 0, 0, w / 3, h / 3 // dst + 0, 0, w, h // dst ); #endif @@ -226,11 +222,11 @@ uint8_t XvAccelRender::GUI_XvInit(QWidget * window, uint32_t w, uint32_t h) } #ifdef COLORSPACE_YV12 #ifdef VERBOSE_XV - printf("\n Xv YV12 found at port :%d, format : %ld", port, xv_format); + printf("\n Xv YV12 found at port :%d, format : %d", port, xv_format); #endif #else #ifdef VERBOSE_XV - printf("\n Xv YUY2 found at port :%d, format : %ld", port, xv_format); + printf("\n Xv YUY2 found at port :%d, format : %d", port, xv_format); #endif #endif diff --git a/client/xvaccelrenderer.h b/client/xvaccelrenderer.h index 588516f..69745d6 100644 --- a/client/xvaccelrenderer.h +++ b/client/xvaccelrenderer.h @@ -15,10 +15,13 @@ #include <X11/extensions/XShm.h> #include <errno.h> +// Use this define for YV12 colorspace, default is YUY2 +//#define COLORSPACE_YV12 + //typedef unsigned long int QWidget; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; -typedef unsigned long int uint32_t; +typedef unsigned int uint32_t; #define ADM_assert(x) assert(x) |