Blob Blame Raw


#if (!(defined(x64) || defined(__LP64__) || defined(LINUX)))

//Toonz stuff
#include "tiio.h"
#include "timage_io.h"
#include "tlevel_io.h"
#include "trasterimage.h"
#include "traster.h"
#include "tstream.h"
#include "movsettings.h"
#include "tproperty.h"
#include "tsound.h"

#ifdef WIN32
#include "../image/3gp/tiio_3gp.h"
#elif MACOSX
#include "../image/3gp/tiio_3gpM.h"
#endif

//Qt stuff
#include <QString>
#include <QHash>
#include <QSharedMemory>
#include <QDebug>

#include <QLocalSocket>
#include <QDataStream>

//tipc includes
#include "tipc.h"
#include "tipcmsg.h"
#include "tipcsrv.h"
#include "t32bitsrv_wrap.h"

#include "t323gpmsg.h"

//---------------------------------------------------

//  Local namespace stuff

namespace
{
QHash<unsigned int, TLevelReaderP> readers;
QHash<unsigned int, TLevelWriterP> writers;
}

//---------------------------------------------------

using namespace tipc;

namespace _3gp_io
{

void addParsers(tipc::Server *srv)
{
	srv->addParser(new InitLW3gpParser);
	srv->addParser(new LWSetFrameRateParser);
	srv->addParser(new LWImageWriteParser);
	srv->addParser(new LWSaveSoundTrackParser);
	srv->addParser(new CloseLW3gpParser);
	srv->addParser(new InitLR3gpParser);
	srv->addParser(new LRLoadInfoParser);
	srv->addParser(new LREnableRandomAccessReadParser);
	srv->addParser(new LRImageReadParser);
	srv->addParser(new CloseLR3gpParser);
}

//************************************************************************
//    InitLWMov Parser
//************************************************************************

void InitLW3gpParser::operator()(Message &msg)
{
	unsigned int id;
	QString fp, propsFp;
	msg >> id >> fp >> propsFp >> clr;

	TFilePath tfp(fp.toStdWString()), propsTFp(propsFp.toStdWString());

	try {
		TPropertyGroup *props = 0;
		if (!propsTFp.isEmpty()) {
			props = new TPropertyGroup;

			TIStream is(propsTFp);
			props->loadData(is);
		}

		writers.insert(id, TLevelWriterP(tfp, props));

		msg << QString("ok");
	} catch (...) {
		msg << QString("err");
	}
}

//************************************************************************
//    LWsetFrameRate Parser
//************************************************************************

void LWSetFrameRateParser::operator()(Message &msg)
{
	unsigned int id;
	double fps;

	msg >> id >> fps >> clr;

	writers.find(id).value()->setFrameRate(fps);

	msg << QString("ok");
}

//************************************************************************
//    LWImageWrite Parser
//************************************************************************

void LWImageWriteParser::operator()(Message &msg)
{
	unsigned int id;
	int frameIdx, lx, ly;

	msg >> id >> frameIdx >> lx >> ly;

	//Read the data through a shared memory segment
	TRaster32P ras(lx, ly);
	t32bitsrv::RasterExchanger<TPixel32> exch(ras);
	tipc::readShMemBuffer(*stream(), msg, &exch);

	//Save the image
	try {
		TImageWriterP iw(writers.find(id).value()->getFrameWriter(frameIdx + 1));
		iw->save(TRasterImageP(ras));

		msg << QString("ok");
	} catch (...) {
		msg << QString("err");
	}
}

//************************************************************************
//    LWSaveSoundTrack Parser
//************************************************************************

void LWSaveSoundTrackParser::operator()(Message &msg)
{
	unsigned int id;
	QString shMemId;

	TUINT32 sampleRate;
	TINT32 sCount;
	int bps, chanCount;
	bool signedSample;

	msg >> id >> sampleRate >> bps >> chanCount >> sCount >> signedSample;

	//Retrieve the soundtrack buffer
	TSoundTrackP st = TSoundTrack::create(sampleRate, bps, chanCount, sCount, signedSample);
	t32bitsrv::BufferExchanger exch((UCHAR *)st->getRawData());
	tipc::readShMemBuffer(*stream(), msg, &exch);

	//Write the soundtrack
	try {
		writers.find(id).value()->saveSoundTrack(st.getPointer());
		msg << QString("ok");
	} catch (...) {
		msg << QString("err");
	}
}

//************************************************************************
//    CloseLW3gp Parser
//************************************************************************

void CloseLW3gpParser::operator()(Message &msg)
{
	unsigned int id;
	msg >> id >> clr;

	try {
		writers.take(id);
		msg << QString("ok");
	} catch (...) {
		msg << QString("err");
	}
}

//************************************************************************
//    InitLR3gp Parser
//************************************************************************

void InitLR3gpParser::operator()(Message &msg)
{
	unsigned int id;
	QString fp, propsFp;
	msg >> id >> fp >> clr;
	assert(!fp.isEmpty());

	TFilePath tfp(fp.toStdWString());

	try {
		TLevelReaderP lrm(tfp);

		//Extract some info to be returned
		const TImageInfo *info = lrm->getImageInfo();
		if (!info)
			throw TImageException(tfp, "Couldn't retrieve image properties");

		int lx = info->m_lx, ly = info->m_ly;
		double frameRate = info->m_frameRate;

		readers.insert(id, lrm);

		msg << QString("ok") << lx << ly << frameRate;
	} catch (...) {
		msg << QString("err");
	}
}

//************************************************************************
//    LRLoadInfo Parser
//************************************************************************

void LRLoadInfoParser::operator()(Message &msg)
{
	//Read command data
	unsigned int id;
	QString shMemId;
	msg >> id >> shMemId >> clr;

	QHash<unsigned int, TLevelReaderP>::iterator it = readers.find(id);
	if (it == readers.end())
		goto err;

	//Read level infos
	{
		TLevelP level;
		try {
			level = it.value()->loadInfo();
		} catch (...) {
			goto err;
		}

		int frameCount = level->getFrameCount();
		if (!shMemId.isEmpty()) {
			//Create a shared memory segment to transfer the infos to
			tipc::DefaultMessageParser<SHMEM_REQUEST> msgParser;
			Message shMsg;

			shMsg << shMemId << frameCount * (int)sizeof(int) << reset;
			msgParser(shMsg);

			QString str;
			shMsg >> reset >> str;
			if (str != QString("ok"))
				goto err;

			//Copy level data to the shared memory segment
			{
				QSharedMemory shmem(shMemId);
				shmem.attach();
				shmem.lock();

				TLevel::Table *table = level->getTable();

				TLevel::Table::const_iterator jt;
				int *f = (int *)shmem.data();
				for (jt = table->begin(); jt != table->end(); ++jt, ++f)
					*f = jt->first.getNumber();

				shmem.unlock();
				shmem.detach();
			}
		}

		msg << QString("ok") << frameCount;
	}

	return;

err:

	msg << QString("err");
}

//************************************************************************
//    LREnableRandomAccessRead Parser
//************************************************************************

void LREnableRandomAccessReadParser::operator()(Message &msg)
{
	unsigned int id;
	QString str;
	msg >> id >> str >> clr;
	bool enable = (str == "true");

	QHash<unsigned int, TLevelReaderP>::iterator it = readers.find(id);
	if (it == readers.end()) {
		msg << QString("err");
		return;
	}

	it.value()->enableRandomAccessRead(enable);

	msg << QString("ok");
}

//************************************************************************
//    LRImageRead Parser
//************************************************************************

void LRImageReadParser::operator()(Message &msg)
{
	{
		unsigned int id;
		int lx, ly, pixSize, frameIdx, x, y, shrinkX, shrinkY;

		msg >> id >> lx >> ly >> pixSize >> frameIdx >> x >> y >> shrinkX >> shrinkY >> clr;

		if (pixSize != 4)
			goto err;

		QHash<unsigned int, TLevelReaderP>::iterator it = readers.find(id);
		if (it == readers.end())
			goto err;

		//Load the raster
		TRaster32P ras(lx, ly);
		try {
			TImageReaderP ir(it.value()->getFrameReader(frameIdx + 1));
			ir->load(ras, TPoint(x, y), shrinkX, shrinkY);
		} catch (...) {
			goto err;
		}

		t32bitsrv::RasterExchanger<TPixel32> exch(ras);
		if (!tipc::writeShMemBuffer(*stream(), msg << clr, lx * ly * sizeof(TPixel32), &exch))
			goto err;
	}

	return;

err:

	msg << QString("err");
}

//************************************************************************
//    CloseLRMov Parser
//************************************************************************

void CloseLR3gpParser::operator()(Message &msg)
{
	unsigned int id;
	msg >> id >> clr;

	readers.take(id);
	msg << QString("ok");
}

} //namespace mov_io

#endif // !x64 && !__LP64__