Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Jerome Duval b2d63b
#if (!(defined(x64) || defined(__LP64__) || defined(LINUX) || defined(FREEBSD) || defined(HAIKU)))
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 "tproperty.h"
Toshihiro Shimizu 890ddd
#include "tsound.h"
Toshihiro Shimizu 890ddd
f9be2f
// movesettings deps, must be included before QuickTime includes
f9be2f
#include "texception.h"
f9be2f
#include "tpropertytype.h"
f9be2f
#include "tproperty.h"
f9be2f
f9be2f
// tipc includes
f9be2f
#include "tipc.h"
f9be2f
#include "tipcmsg.h"
f9be2f
#include "tipcsrv.h"
f9be2f
#include "t32bitsrv_wrap.h"
f9be2f
f9be2f
#include "t323gpmsg.h"
f9be2f
f9be2f
// following includes may include QuickTime
Campbell Barton d869b5
#if defined(_WIN32)
Toshihiro Shimizu 890ddd
#include "../image/3gp/tiio_3gp.h"
Campbell Barton d869b5
#elif defined(MACOSX)
Toshihiro Shimizu 890ddd
#include "../image/3gp/tiio_3gpM.h"
Toshihiro Shimizu 890ddd
#endif
f9be2f
#include "movsettings.h"
f9be2f
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
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 _3gp_io {
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void addParsers(tipc::Server *srv) {
Shinya Kitaoka 120a6e
  srv->addParser(new InitLW3gpParser);
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 CloseLW3gpParser);
Shinya Kitaoka 120a6e
  srv->addParser(new InitLR3gpParser);
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 CloseLR3gpParser);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
//    InitLWMov Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void InitLW3gpParser::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;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TUINT32 sampleRate;
Shinya Kitaoka 120a6e
  TINT32 sCount;
Shinya Kitaoka 120a6e
  int bps, chanCount;
Shinya Kitaoka 120a6e
  bool signedSample;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  msg >> id >> sampleRate >> bps >> chanCount >> sCount >> signedSample;
Shinya Kitaoka 120a6e
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);
Shinya Kitaoka 120a6e
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
//    CloseLW3gp Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CloseLW3gpParser::operator()(Message &msg) {
Shinya Kitaoka 120a6e
  unsigned int id;
Shinya Kitaoka 120a6e
  msg >> id >> clr;
Shinya Kitaoka 120a6e
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
//    InitLR3gp Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void InitLR3gpParser::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
    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;
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
  // 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
    }
Shinya Kitaoka 120a6e
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;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      shMsg << shMemId << frameCount * (int)sizeof(int) << reset;
Shinya Kitaoka 120a6e
      msgParser(shMsg);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      QString str;
Shinya Kitaoka 120a6e
      shMsg >> reset >> str;
Shinya Kitaoka 120a6e
      if (str != QString("ok")) goto err;
Shinya Kitaoka 120a6e
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();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        TLevel::Table *table = level->getTable();
Shinya Kitaoka 120a6e
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();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        shmem.unlock();
Shinya Kitaoka 120a6e
        shmem.detach();
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    msg << QString("ok") << frameCount;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
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
//    LRImageRead Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LRImageReadParser::operator()(Message &msg) {
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
    // 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
    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;
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
//    CloseLRMov Parser
Toshihiro Shimizu 890ddd
//************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void CloseLR3gpParser::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__