diff options
Diffstat (limited to 'client')
| -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) | 
