00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "itemfactory.h"
00023
00024 #include <typeinfo>
00025
00026 #include <QVApplication>
00027
00028 #include <QVProcessingBlock>
00029
00030 #include <QVPointBlock>
00031
00032 #include <QVImageCanvas>
00033 #include <QVNumericPlot>
00034 #include <QVHistogramPlot>
00035 #include <QVFunctionPlot>
00036 #include <QVCPUPlot>
00037
00038 #include <QVSynchronizerBlock>
00039
00040 #ifdef QVIPP
00041 #include <QVGraphsBlock>
00042 #include <QVFilterSelectorBlock>
00043 #include <QVYUV4MPEG2WriterBlock>
00044 #include <QVYUV4MPEG2ReaderBlock>
00045 #include <QVImageRetarderBlock>
00046 #include <QVImageMeansBlock>
00047 #endif
00048
00049 #ifdef QVMPLAYER
00050 #include <QVMPlayerReaderBlock>
00051 #endif
00052
00054 ItemFactory::ItemFactory(): QObject()
00055 {
00056 inputItems.insert("Input node", QList<QString>());
00057 #ifdef QVMPLAYER
00058 inputItems["Input node"].append("QVMPlayerReaderBlock");
00059 #endif
00060 #ifdef QVIPP
00061 inputItems["Input node"].append("QVYUV4MPEG2ReaderBlock");
00062 #endif
00063 inputItems["Input node"].append("QVPointBlock");
00064
00065 outputItems.insert("Output node", QList<QString>());
00066 outputItems["Output node"].append("QVImageCanvas");
00067 outputItems["Output node"].append("QVNumericPlot");
00068 outputItems["Output node"].append("QVHistogramPlot");
00069 outputItems["Output node"].append("QVFunctionPlot");
00070 outputItems["Output node"].append("QVCPUPlot");
00071 #ifdef QVIPP
00072 outputItems["Output node"].append("QVYUV4MPEG2WriterBlock");
00073 #endif
00074 outputItems["Output node"].append("QVSynchronizer");
00075
00076 middleItems.insert("QVision block", QList<QString>());
00077 #ifdef QVIPP
00078 middleItems["QVision block"].append("QVGraphsBlock");
00079 middleItems["QVision block"].append("QVFilterSelectorBlock<uchar,1>");
00080 middleItems["QVision block"].append("QVFilterSelectorBlock<uchar,3>");
00081 middleItems["QVision block"].append("QVImageRetarderBlock<uchar,3>");
00082 middleItems["QVision block"].append("QVImageRetarderBlock<uchar,1>");
00083 middleItems["QVision block"].append("QVImageMeans<uChar,1>");
00084 middleItems["QVision block"].append("QVImageMeans<uChar,3>");
00085
00086
00087 QMap<QString, QString> ippBlocks = getQVIPPBlocksNames();
00088 foreach(QString ippGroup, ippBlocks.keys())
00089 {
00090 middleItems.insert(ippGroup, QList<QString>());
00091 foreach(QString qvippBlockName, ippBlocks.values(ippGroup))
00092 middleItems[ippGroup].append(qvippBlockName);
00093 }
00094 #endif
00095
00096
00097
00098
00099
00100
00101
00102 }
00103
00104 QMap<QString, QList<QString> > ItemFactory::getItemTypes() const
00105 {
00106 QMap<QString, QList<QString> > items = inputItems;
00107
00108 foreach(QString group, middleItems.keys()) {
00109 if (items.contains(group))
00110 items[group] = items.value(group) + middleItems.value(group);
00111 else
00112 items.insert(group, middleItems.value(group));
00113 }
00114
00115 foreach(QString group, outputItems.keys()) {
00116 if (items.contains(group))
00117 items[group] = items.value(group) + outputItems.value(group);
00118 else
00119 items.insert(group, outputItems.value(group));
00120 }
00121
00122 return items;
00123 }
00124
00125 QMap<QString, QList<QString> > ItemFactory::getInputItemTypes() const
00126 {
00127 return inputItems;
00128 }
00129
00130 QMap<QString, QList<QString> > ItemFactory::getMiddleItemTypes() const
00131 {
00132 return middleItems;
00133 }
00134
00135 QMap<QString, QList<QString> > ItemFactory::getOutputItemTypes() const
00136 {
00137 return outputItems;
00138 }
00139
00140 QVPropertyContainer *ItemFactory::createContainer(QString type, QString name) const
00141 {
00142 #ifdef QVIPP
00143 QVPropertyContainer *qvippBlock = newQVIPPBlock(type, name);
00144 if (qvippBlock != NULL)
00145 return qvippBlock;
00146 #endif
00147
00148
00149
00150
00151
00152
00153
00154 if (type == "QVImageCanvas") return new QVImageCanvas(name);
00155 else if (type == "QVNumericPlot") return new QVNumericPlot(name);
00156 else if (type == "QVHistogramPlot") return new QVHistogramPlot(name);
00157 else if (type == "QVFunctionPlot") return new QVFunctionPlot(name);
00158 else if (type == "QVCPUPlot") return new QVCPUPlot(name);
00159
00160 else if (type == "QVPointBlock") return new QVPointBlock(name);
00161 else if (type == "QVSynchronizer") return new QVSynchronizer(name);
00162 else if (type == "QVCPUPlot") return new QVCPUPlot(name);
00163 #ifdef QVMPLAYER
00164 else if (type == "QVMPlayerReaderBlock") {
00165 QVMPlayerReaderBlock* mpc = new QVMPlayerReaderBlock(name);
00166 if (mpc->getPropertyValue<QString>("URL").isEmpty())
00167 mpc->setPropertyValue("URL", QString("http://perception.inf.um.es/public_data/videos/misc/penguin.dv"));
00168 return mpc;
00169 }
00170 #endif
00171 #ifdef QVIPP
00172 else if (type == "QVYUV4MPEG2ReaderBlock") {
00173 QVYUV4MPEG2ReaderBlock* mpc = new QVYUV4MPEG2ReaderBlock(name);
00174 if (mpc->getPropertyValue<QString>("URL").isEmpty())
00175 mpc->setPropertyValue("URL", QString("http://perception.inf.um.es/public_data/videos/misc/penguin.dv"));
00176 return mpc;
00177 }
00178 else if (type == "QVYUV4MPEG2Camera") return new QVYUV4MPEG2ReaderBlock(name);
00179 else if (type == "QVYUV4MPEG2WriterBlock") return new QVYUV4MPEG2WriterBlock(name);
00180 else if (type == "QVImageRetarderBlock<uchar,3>") return new QVImageRetarderBlock<uchar, 3>(name);
00181 else if (type == "QVImageRetarderBlock<uchar,1>") return new QVImageRetarderBlock<uchar, 1>(name);
00182 else if (type == "QVImageMeans<uChar,1>") return new QVImageMeans<uChar, 1>(name);
00183 else if (type == "QVFilterSelectorBlock<uchar,1>") return new QVFilterSelectorBlock<uchar, 1>(name);
00184 else if (type == "QVFilterSelectorBlock<uchar,3>") return new QVFilterSelectorBlock<uchar, 3>(name);
00185 else if (type == "QVGraphsBlock") return new QVGraphsBlock(name);
00186 #endif
00187 else if (userBlocks.contains(type)) {
00188 QVProcessingBlock * newBlock = (QVProcessingBlock *)QMetaType::construct(userBlocks.value(type), (void *)0);
00189 newBlock->setName(name);
00190 return newBlock;
00191 }
00192 return 0;
00193 }
00194
00195 bool ItemFactory::deleteContainer(QVPropertyContainer *cont) const
00196 {
00197
00198 QString type = typeName(cont);
00199
00200
00201
00202
00203
00204
00205
00206 delete cont;
00207
00208 return TRUE;
00209 }
00210
00211 QString ItemFactory::containerType(QVPropertyContainer *cont) const
00212 {
00213
00214 return QString(typeName(cont));
00215 }
00216
00217 const QString ItemFactory::registerUserBlock(QVProcessingBlock * block)
00218 {
00219 const char * choptypeidname = typeName(block);
00220
00221
00222 QString typeString(choptypeidname);
00223 int type = QMetaType::type(choptypeidname);
00224
00225
00226 bool middleItemsContainsType = false;
00227 foreach(QList<QString> groupItems, middleItems.values())
00228 if (groupItems.contains(typeString)) {
00229 middleItemsContainsType = true;
00230 break;
00231 }
00232 if ( (type != 0) && (!middleItemsContainsType) ) {
00233 if (!middleItems.contains("User block")) middleItems.insert("User block", QList<QString>());
00234 middleItems["User block"].append(typeString);
00235 userBlocks.insert(typeString, type);
00236 return typeString;
00237 }
00238 return QString();
00239 }
00240
00241 bool ItemFactory::isUserType(QString type) const
00242 {
00243 return userBlocks.contains(type);
00244 }
00245
00246 const char *ItemFactory::typeName(QVPropertyContainer *cont) const
00247 {
00248 char *qvippBlockName = NULL;
00249 if (qvippBlockName != NULL)
00250 return qvippBlockName;
00251
00252 if(dynamic_cast<QVImageCanvas*>(cont) != NULL) return "QVImageCanvas";
00253 else if(dynamic_cast<QVNumericPlot*>(cont) != NULL) return "QVNumericPlot";
00254 else if(dynamic_cast<QVHistogramPlot*>(cont) != NULL) return "QVHistogramPlot";
00255 else if(dynamic_cast<QVFunctionPlot*>(cont) != NULL) return "QVFunctionPlot";
00256 else if(dynamic_cast<QVCPUPlot*>(cont) != NULL) return "QVCPUPlot";
00257 else if(dynamic_cast<QVPointBlock*>(cont) != NULL) return "QVPointBlock";
00258 else if(dynamic_cast<QVSynchronizer*>(cont) != NULL) return "QVSynchronizer";
00259 #ifdef QVIPP
00260 else if(dynamic_cast<QVGraphsBlock*>(cont) != NULL) return "QVGraphsBlock";
00261 else if(dynamic_cast<QVYUV4MPEG2ReaderBlock*>(cont) != NULL) return "QVYUV4MPEG2Camera";
00262 else if(dynamic_cast<QVYUV4MPEG2WriterBlock*>(cont) != NULL) return "QVYUV4MPEG2WriterBlock";
00263 else if(dynamic_cast<QVFilterSelectorBlock<uchar,1>*>(cont) != NULL) return "QVFilterSelectorBlock<uchar,1>";
00264 else if(dynamic_cast<QVFilterSelectorBlock<uchar,3>*>(cont) != NULL) return "QVFilterSelectorBlock<uchar,3>";
00265 else if(dynamic_cast<QVImageRetarderBlock<uchar,3>*>(cont) != NULL) return "QVImageRetarderBlock<uchar,3>";
00266 else if(dynamic_cast<QVImageRetarderBlock<uchar,1>*>(cont) != NULL) return "QVImageRetarderBlock<uchar,1>";
00267 else if(dynamic_cast<QVImageMeans<uChar,1>*>(cont) != NULL) return "QVImageMeans<uChar,1>";
00268 else if(dynamic_cast<QVImageMeans<uChar,3>*>(cont) != NULL) return "QVImageMeans<uChar,3>";
00269 #endif
00270
00271
00272 const char * typeidname = typeid(*cont).name();
00273
00274
00275 int i = 0;
00276 while ( (typeidname[i] != '\0') && ((typeidname[i] == '0') || (typeidname[i] == '1') || (typeidname[i] == '2') || (typeidname[i] == '3') ||
00277 (typeidname[i] == '4') || (typeidname[i] == '5') || (typeidname[i] == '6') || (typeidname[i] == '7') || (typeidname[i] == '8') ||
00278 (typeidname[i] == '9')) ) {
00279 i++;
00280 }
00281 return (typeidname + i*(sizeof(char)));
00282 }
00283
00284