Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Rozhuk Ivan ac51ab
#if (!(defined(x64) || defined(__LP64__) || defined(LINUX) || defined(FREEBSD)))
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Toonz stuff
Toshihiro Shimizu 890ddd
#include "tiio.h"
Toshihiro Shimizu 890ddd
#include "timage_io.h"
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "traster.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
#include "movsettings.h"
Toshihiro Shimizu 890ddd
#include "tproperty.h"
Toshihiro Shimizu 890ddd
#include "tsound.h"
Toshihiro Shimizu 890ddd
Campbell Barton d869b5
#if defined(_WIN32)
Toshihiro Shimizu 890ddd
#include "../image/mov/tiio_mov.h"
Campbell Barton d869b5
#elif defined(MACOSX)
Toshihiro Shimizu 890ddd
#include "../image/mov/tiio_movM.h"
Toshihiro Shimizu 890ddd
#include <applicationservices applicationservices.h=""></applicationservices>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Qt stuff
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
#include <qhash></qhash>
Toshihiro Shimizu 890ddd
#include <qsharedmemory></qsharedmemory>
Toshihiro Shimizu 890ddd
#include <qdebug></qdebug>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qlocalsocket></qlocalsocket>
Toshihiro Shimizu 890ddd
#include <qdatastream></qdatastream>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// tipc includes
Toshihiro Shimizu 890ddd
#include "tipc.h"
Toshihiro Shimizu 890ddd
#include "tipcmsg.h"
Toshihiro Shimizu 890ddd
#include "tipcsrv.h"
Toshihiro Shimizu 890ddd
#include "t32bitsrv_wrap.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "t32movmsg.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  Diagnostics stuff
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#define TIPC_DEBUG
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef TIPC_DEBUG
Toshihiro Shimizu 890ddd
#define tipc_debug(expr) expr
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define tipc_debug(expr)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef TIPC_DEBUG
Toshihiro Shimizu 890ddd
#include <qtime></qtime>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  Local namespace stuff
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
QHash<unsigned int,="" tlevelreaderp=""> readers;</unsigned>
Toshihiro Shimizu 890ddd
QHash<unsigned int,="" tlevelwriterp=""> writers;</unsigned>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace tipc;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace mov_io {
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void addParsers(tipc::Server *srv) {
Shinya Kitaoka 120a6e
  srv->addParser(new IsQTInstalledParser);
Shinya Kitaoka 120a6e
  srv->addParser(new DefaultMovPropsParser);
Shinya Kitaoka 120a6e
  srv->addParser(new OpenMovSettingsPopupParser);
Shinya Kitaoka 120a6e
  srv->addParser(new InitLWMovParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LWSetFrameRateParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LWImageWriteParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LWSaveSoundTrackParser);
Shinya Kitaoka 120a6e
  srv->addParser(new CloseLWMovParser);
Shinya Kitaoka 120a6e
  srv->addParser(new InitLRMovParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LRLoadInfoParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LREnableRandomAccessReadParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LRImageReadParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LRImageReadSHMParser);
Shinya Kitaoka 120a6e
  srv->addParser(new CloseLRMovParser);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Shinya Kitaoka 120a6e
  srv->addParser(new LRSetYMirrorParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LRSetLoadTimecodeParser);
Shinya Kitaoka 120a6e
  srv->addParser(new LRTimecodeParser);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    IsQTInstalled Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void IsQTInstalledParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  bool ret = Tiio::isQuicktimeInstalled();
Shinya Kitaoka 120a6e
  msg << clr << QString((ret) ? "yes" : "no");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    DefaultMovProps Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DefaultMovPropsParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  // Ensure the file path was passed - and retrieve it
Shinya Kitaoka 120a6e
  QString reply;
Shinya Kitaoka 120a6e
  msg >> reply >> clr;
Shinya Kitaoka 120a6e
  if (reply.isEmpty()) goto err;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Shinya Kitaoka 120a6e
  // Ensure that QuickTime is correctly running
Shinya Kitaoka 120a6e
  if (InitializeQTML(0) != noErr) goto err;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Success - retrieve the props
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    TPropertyGroup movProps;
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      // Low-level QuickTime stuff
Shinya Kitaoka 120a6e
      ComponentInstance ci = OpenDefaultComponent(StandardCompressionType,
Shinya Kitaoka 120a6e
                                                  StandardCompressionSubType);
Shinya Kitaoka 120a6e
      QTAtomContainer settings;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (SCGetSettingsAsAtomContainer(ci, &settings) != noErr) assert(false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      fromAtomsToProperties(settings, movProps);
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Write the retrieved properties
Shinya Kitaoka 120a6e
    TFilePath tfp(reply.toStdWString());
Shinya Kitaoka 120a6e
    TOStream os(tfp);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    movProps.saveData(os);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    msg << QString("ok");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
err:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("err");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    OpenMovSettingsPopup Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OpenMovSettingsPopupParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  // Open the properties file
Shinya Kitaoka 120a6e
  QString fp;
Shinya Kitaoka 120a6e
  msg >> fp >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Retrieve the properties
Shinya Kitaoka 120a6e
  TPropertyGroup *props = new TPropertyGroup;
Shinya Kitaoka 120a6e
  TFilePath tfp(fp.toStdWString());
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    TIStream is(tfp);
Shinya Kitaoka 120a6e
    props->loadData(is);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ProcessSerialNumber psn = {0, kCurrentProcess};
Shinya Kitaoka 120a6e
  TransformProcessType(&psn, kProcessTransformToForegroundApplication);
Shinya Kitaoka 120a6e
  SetFrontProcess(&psn);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  openMovSettingsPopup(props, true);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    TOStream os(tfp);  // Should NOT append
Shinya Kitaoka 120a6e
    props->saveData(os);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  delete props;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    InitLWMov Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void InitLWMovParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString fp, propsFp;
Shinya Kitaoka 120a6e
  msg >> id >> fp >> propsFp >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFilePath tfp(fp.toStdWString()), propsTFp(propsFp.toStdWString());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    TPropertyGroup *props = 0;
Shinya Kitaoka 120a6e
    if (!propsTFp.isEmpty()) {
Shinya Kitaoka 120a6e
      props = new TPropertyGroup;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      TIStream is(propsTFp);
Shinya Kitaoka 120a6e
      props->loadData(is);
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    writers.insert(id, TLevelWriterP(tfp, props));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    msg << QString("ok");
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LWsetFrameRate Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LWSetFrameRateParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  double fps;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg >> id >> fps >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  writers.find(id).value()->setFrameRate(fps);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LWImageWrite Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LWImageWriteParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  int frameIdx, lx, ly;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg >> id >> frameIdx >> lx >> ly;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Read the data through a shared memory segment
Shinya Kitaoka 120a6e
  TRaster32P ras(lx, ly);
Shinya Kitaoka 120a6e
  t32bitsrv::RasterExchanger<tpixel32> exch(ras);</tpixel32>
Shinya Kitaoka 120a6e
  tipc::readShMemBuffer(*stream(), msg, &exch);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Save the image
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    TImageWriterP iw(writers.find(id).value()->getFrameWriter(frameIdx + 1));
Shinya Kitaoka 120a6e
    iw->save(TRasterImageP(ras));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    msg << QString("ok");
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LWSaveSoundTrack Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LWSaveSoundTrackParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString shMemId;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TUINT32 sampleRate;
Shinya Kitaoka 120a6e
  TINT32 sCount;
Shinya Kitaoka 120a6e
  int bps, chanCount;
Shinya Kitaoka 120a6e
  bool signedSample;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg >> id >> sampleRate >> bps >> chanCount >> sCount >> signedSample;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Retrieve the soundtrack buffer
Shinya Kitaoka 120a6e
  TSoundTrackP st =
Shinya Kitaoka 120a6e
      TSoundTrack::create(sampleRate, bps, chanCount, sCount, signedSample);
Shinya Kitaoka 120a6e
  t32bitsrv::BufferExchanger exch((UCHAR *)st->getRawData());
Shinya Kitaoka 120a6e
  tipc::readShMemBuffer(*stream(), msg, &exch);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Write the soundtrack
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    writers.find(id).value()->saveSoundTrack(st.getPointer());
Shinya Kitaoka 120a6e
    msg << QString("ok");
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    CloseLWMov Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CloseLWMovParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  msg >> id >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    writers.take(id);
Shinya Kitaoka 120a6e
    msg << QString("ok");
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    InitLRMov Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void InitLRMovParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString fp, propsFp;
Shinya Kitaoka 120a6e
  msg >> id >> fp >> clr;
Shinya Kitaoka 120a6e
  assert(!fp.isEmpty());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFilePath tfp(fp.toStdWString());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    TLevelReaderP lrm(tfp);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Extract some info to be returned
Shinya Kitaoka 120a6e
    const TImageInfo *info = lrm->getImageInfo();
Shinya Kitaoka 120a6e
    if (!info) throw TImageException(tfp, "Couldn't retrieve image properties");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    int lx = info->m_lx, ly = info->m_ly;
Shinya Kitaoka 120a6e
    double frameRate = info->m_frameRate;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    tipc_debug(qDebug() << "Inserted image"
Shinya Kitaoka 120a6e
                        << QString::fromStdWString(tfp.getWideString()));
Shinya Kitaoka 120a6e
    readers.insert(id, lrm);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    msg << QString("ok") << lx << ly << frameRate;
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LRLoadInfo Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRLoadInfoParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  // Read command data
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString shMemId;
Shinya Kitaoka 120a6e
  msg >> id >> shMemId >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
  if (it == readers.end()) goto err;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Read level infos
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    TLevelP level;
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      level = it.value()->loadInfo();
Shinya Kitaoka 120a6e
    } catch (...) {
Shinya Kitaoka 120a6e
      goto err;
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    int frameCount = level->getFrameCount();
Shinya Kitaoka 120a6e
    if (!shMemId.isEmpty()) {
Shinya Kitaoka 120a6e
      // Create a shared memory segment to transfer the infos to
Shinya Kitaoka 120a6e
      tipc::DefaultMessageParser<shmem_request> msgParser;</shmem_request>
Shinya Kitaoka 120a6e
      Message shMsg;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      shMsg << shMemId << frameCount * (int)sizeof(int) << reset;
Shinya Kitaoka 120a6e
      msgParser(shMsg);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      QString str;
Shinya Kitaoka 120a6e
      shMsg >> reset >> str;
Shinya Kitaoka 120a6e
      if (str != QString("ok")) goto err;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // Copy level data to the shared memory segment
Shinya Kitaoka 120a6e
      {
Shinya Kitaoka 120a6e
        QSharedMemory shmem(shMemId);
Shinya Kitaoka 120a6e
        shmem.attach();
Shinya Kitaoka 120a6e
        shmem.lock();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
        TLevel::Table *table = level->getTable();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
        TLevel::Table::const_iterator jt;
Shinya Kitaoka 120a6e
        int *f = (int *)shmem.data();
Shinya Kitaoka 120a6e
        for (jt = table->begin(); jt != table->end(); ++jt, ++f)
Shinya Kitaoka 120a6e
          *f = jt->first.getNumber();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
        shmem.unlock();
Shinya Kitaoka 120a6e
        shmem.detach();
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    msg << QString("ok") << frameCount;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
err:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("err");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LREnableRandomAccessRead Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LREnableRandomAccessReadParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString str;
Shinya Kitaoka 120a6e
  msg >> id >> str >> clr;
Shinya Kitaoka 120a6e
  bool enable = (str == "true");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
  if (it == readers.end()) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  it.value()->enableRandomAccessRead(enable);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LRSetYMirror Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRSetYMirrorParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString str;
Shinya Kitaoka 120a6e
  msg >> id >> str >> clr;
Shinya Kitaoka 120a6e
  bool enable = (str == "true");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
  if (it == readers.end()) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  static_cast<tlevelreadermov *="">(it.value().getPointer())->setYMirror(enable);</tlevelreadermov>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LRSetLoadTimecode Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRSetLoadTimecodeParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  QString str;
Shinya Kitaoka 120a6e
  msg >> id >> str >> clr;
Shinya Kitaoka 120a6e
  bool enable = (str == "true");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
  if (it == readers.end()) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  static_cast<tlevelreadermov *="">(it.value().getPointer())</tlevelreadermov>
Shinya Kitaoka 120a6e
      ->setLoadTimecode(enable);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LRTimecode Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRTimecodeParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  int frameIdx;
Shinya Kitaoka 120a6e
  QString str;
Shinya Kitaoka 120a6e
  msg >> id >> frameIdx >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
  if (it == readers.end()) {
Shinya Kitaoka 120a6e
    msg << QString("err");
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  UCHAR hh, mm, ss, ff;
Shinya Kitaoka 120a6e
  static_cast<tlevelreadermov *="">(it.value().getPointer())</tlevelreadermov>
Shinya Kitaoka 120a6e
      ->timecode(frameIdx, hh, mm, ss, ff);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("ok") << hh << mm << ss << ff;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LRImageRead Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRImageReadParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  tipc_debug(QTime fTime; QTime irTime; QTime shTime; fTime.start(););
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    unsigned int id;
Shinya Kitaoka 120a6e
    int lx, ly, pixSize, frameIdx, x, y, shrinkX, shrinkY;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    msg >> id >> lx >> ly >> pixSize >> frameIdx >> x >> y >> shrinkX >>
Shinya Kitaoka 120a6e
        shrinkY >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    if (pixSize != 4) goto err;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
    if (it == readers.end()) goto err;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    tipc_debug(irTime.start());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Load the raster
Shinya Kitaoka 120a6e
    TRaster32P ras(lx, ly);
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      TImageReaderP ir(it.value()->getFrameReader(frameIdx + 1));
Shinya Kitaoka 120a6e
      ir->load(ras, TPoint(x, y), shrinkX, shrinkY);
Shinya Kitaoka 120a6e
    } catch (...) {
Shinya Kitaoka 120a6e
      goto err;
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    tipc_debug(qDebug() << "load time:" << irTime.elapsed());
Shinya Kitaoka 120a6e
    tipc_debug(shTime.start());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    t32bitsrv::RasterExchanger<tpixel32> exch(ras);</tpixel32>
Shinya Kitaoka 120a6e
    if (!tipc::writeShMemBuffer(*stream(), msg << clr,
Shinya Kitaoka 120a6e
                                lx * ly * sizeof(TPixel32), &exch))
Shinya Kitaoka 120a6e
      goto err;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    tipc_debug(qDebug() << "exchange time:" << shTime.elapsed());
Shinya Kitaoka 120a6e
    tipc_debug(qDebug() << "TLevelReaderMov::loadImage time:"
Shinya Kitaoka 120a6e
                        << fTime.elapsed());
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
err:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("err");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    LRImageReadSHM Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRImageReadSHMParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  tipc_debug(QTime fTime; QTime irTime; fTime.start(););
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  int lx, ly, frameIdx;
Shinya Kitaoka 120a6e
  QString shMemId;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  msg >> id >> lx >> ly >> frameIdx >> shMemId >> clr;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  tipc_debug(qDebug() << "LoadImageSHM data:" << id << lx << ly << frameIdx
Shinya Kitaoka 120a6e
                      << shMemId);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QHash<unsigned int,="" tlevelreaderp="">::iterator it = readers.find(id);</unsigned>
Shinya Kitaoka 120a6e
  if (it == readers.end()) goto err;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Attach the shared memory segment the raster
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    QSharedMemory shm(shMemId);
Shinya Kitaoka 120a6e
    shm.attach();
Shinya Kitaoka 120a6e
    if (!shm.isAttached()) goto err;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Load the raster
Shinya Kitaoka 120a6e
    TRaster32P ras(lx, ly, lx, (TPixel32 *)shm.data());
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      tipc_debug(qDebug() << "loading image...");
Shinya Kitaoka 120a6e
      tipc_debug(irTime.start());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      shm.lock();
Shinya Kitaoka 120a6e
      TImageReaderP ir(it.value()->getFrameReader(frameIdx + 1));
Shinya Kitaoka 120a6e
      ir->load(ras, TPoint(), 1, 1);
Shinya Kitaoka 120a6e
      shm.unlock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      tipc_debug(qDebug() << "load time:" << irTime.elapsed());
Shinya Kitaoka 120a6e
    } catch (TImageException e) {
Shinya Kitaoka 120a6e
      shm.unlock();
Shinya Kitaoka 120a6e
      tipc_debug(qDebug() << "Image Read Error:"
Shinya Kitaoka 120a6e
                          << QString::fromStdWString(e.getMessage()));
Shinya Kitaoka 120a6e
      goto err;
Shinya Kitaoka 120a6e
    } catch (...) {
Shinya Kitaoka 120a6e
      shm.unlock();
Shinya Kitaoka 120a6e
      tipc_debug(qDebug() << "Unknown Image Read Error");
Shinya Kitaoka 120a6e
      goto err;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  UCHAR hh, mm, ss, ff;
Shinya Kitaoka 120a6e
  TLevelReaderMov *lrm =
Shinya Kitaoka 120a6e
      static_cast<tlevelreadermov *="">(it.value().getPointer());</tlevelreadermov>
Shinya Kitaoka 120a6e
  lrm->loadedTimecode(hh, mm, ss, ff);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  tipc_debug(qDebug() << "TLevelReaderMov::loadImage time:" << fTime.elapsed());
Shinya Kitaoka 120a6e
  msg << hh << mm << ss << ff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
err:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  msg << QString("err");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    CloseLRMov Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CloseLRMovParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  msg >> id >> clr;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  readers.take(id);
Shinya Kitaoka 120a6e
  msg << QString("ok");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace mov_io
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // !x64 && !__LP64__