diff options
| -rw-r--r-- | client/decoder.cc | 19 | ||||
| -rw-r--r-- | client/decoder.h | 8 | ||||
| -rw-r--r-- | client/miav_client.cc | 6 | ||||
| -rw-r--r-- | client/player.cc | 7 | ||||
| -rw-r--r-- | lib/libdv_wrapper.cc | 12 | ||||
| -rw-r--r-- | lib/libdv_wrapper.h | 1 | 
6 files changed, 34 insertions, 19 deletions
| diff --git a/client/decoder.cc b/client/decoder.cc index fd2464b..5c2cce5 100644 --- a/client/decoder.cc +++ b/client/decoder.cc @@ -42,7 +42,7 @@  Decoder::Decoder(): semaphore(1)  { -  frame  = NULL; +  frame = NULL;    running = true;    qApp->installEventFilter(this);  } @@ -62,14 +62,25 @@ void Decoder::run()  #endif/* READ_DV_FROM_FILE*/    while(running) { -    frame = new Frame(reader.readFrame()); +    char *tmp = (char*)reader.readFrame(); +    mutex.lock(); +    if(frame) free(frame); +    frame = tmp; +    mutex.unlock();    }    semaphore.release(); // Unlock the shutdown process  } -Frame *Decoder::getFrame() +char *Decoder::getFrame()  { -  return frame; +  char *tmp; + +  mutex.lock(); +  tmp = frame; +  frame = NULL; +  mutex.unlock(); + +  return tmp;  }  bool Decoder::eventFilter(QObject *o, QEvent *e) diff --git a/client/decoder.h b/client/decoder.h index 3a1b30f..6638189 100644 --- a/client/decoder.h +++ b/client/decoder.h @@ -29,7 +29,7 @@  #include <QThread>  #include <QSemaphore> -#include "frame.h" +#include <QMutex>  class Decoder : public QThread  { @@ -38,7 +38,7 @@ public:    Decoder();    ~Decoder(); -  Frame *getFrame(); +  char *getFrame();    void run(); @@ -47,9 +47,9 @@ protected:  private:    volatile bool running; -  volatile bool stopped; -  Frame *frame; +  char *frame;    QSemaphore semaphore; +  QMutex mutex;  };  #endif/*__MIAV_DECODER_H__*/ diff --git a/client/miav_client.cc b/client/miav_client.cc index 6122093..81cde56 100644 --- a/client/miav_client.cc +++ b/client/miav_client.cc @@ -47,12 +47,14 @@ int main(int argc, char *argv[])    MainWindow mainwindow; +  NetworkSender sender;    Decoder decoder;    Player player(mainwindow.getVideoWidget(), &decoder); -  NetworkSender sender; + +  int fps = 24;    decoder.start(); -  player.start(40); // 100: 10fps, 40: 25fps +  player.start(1000 / fps);    sender.start();    return app.exec(); diff --git a/client/player.cc b/client/player.cc index 1689dcf..a8f6152 100644 --- a/client/player.cc +++ b/client/player.cc @@ -29,8 +29,6 @@  #define WIDTH 720  #define HEIGHT 576 -//#define COLORSPACE_YV12 -  static int num = 0;  Player::Player(QWidget *w, Decoder *d) @@ -52,13 +50,14 @@ Player::~Player()  void Player::show_frame()  { -  Frame *frame; +  char *frame;    fprintf(stderr, "Frame!%d\n", num++);    frame = decoder->getFrame();    if(!frame) return; -  dvdecoder.decode((char*)frame->data); +  dvdecoder.decode(frame); +  free(frame);    render.width = widget->width();    render.height = widget->height(); diff --git a/lib/libdv_wrapper.cc b/lib/libdv_wrapper.cc index d570e2c..563c709 100644 --- a/lib/libdv_wrapper.cc +++ b/lib/libdv_wrapper.cc @@ -26,7 +26,7 @@   */  #include "libdv_wrapper.h" -static bool first = true; +//#define COLORSPACE_YV12  LibDVWrapper::LibDVWrapper(DV::Quality quality,                             DV::System system, @@ -39,8 +39,11 @@ LibDVWrapper::LibDVWrapper(DV::Quality quality,    setSystem(system);    setSampling(sampling); +  yuv[0] = yuv[1] = yuv[2] = NULL; +    width = 720;    height = 576; +  first = true;  } @@ -74,19 +77,18 @@ void LibDVWrapper::setOutputBuffer(char *output)      pitches[1] = width / 2;      pitches[2] = width / 2;  #else -    yuv[0] = (unsigned char*)output;//render.getDisplayData(); // Decode directly to the XVideo buffer +    yuv[0] = (unsigned char*)output;      pitches[0] = width * 2;  #endif  }  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->system = e_dv_system_625_50;  // PAL lines, PAL framerate -    //    decoder->sampling = e_dv_sample_422;  // 4 bytes y, 2 bytes u, 2 bytes v      decoder->std = e_dv_std_iec_61834;      decoder->num_dif_seqs = 12;      first = false; diff --git a/lib/libdv_wrapper.h b/lib/libdv_wrapper.h index 995e8d7..d98cae6 100644 --- a/lib/libdv_wrapper.h +++ b/lib/libdv_wrapper.h @@ -96,6 +96,7 @@ public:    void decode(char *input);  private: +  bool first;    int width, height;    int pitches[3]; | 
