00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <QString>
00026 #include <QUrl>
00027 #include <QTime>
00028
00029 #include <qvimageio.h>
00030
00031 #ifdef QVIPP
00032 #include <qvipp.h>
00033 #endif // QVIPP
00034
00035 #include <QVYUV4MPEG2Reader>
00036
00037 bool QVYUV4MPEG2Reader::open(const QString & url_string,
00038 unsigned int & suggested_cols, unsigned int & suggested_rows,
00039 unsigned int & suggested_fps, QVVideoReader::OpenOptions & suggested_options,
00040 QVVideoReader::TSourceMode & source_mode)
00041 {
00042
00043 source_mode = QVVideoReader::YUVMode;
00044
00045
00046 QUrl URL(url_string);
00047 QString fileName = URL.path();
00048
00049
00050 noLoop = (suggested_options & QVVideoReader::NoLoop);
00051 realTime = (suggested_options & QVVideoReader::RealTime);
00052
00053
00054 videoFile.setFileName(fileName);
00055 if (!videoFile.exists())
00056 {
00057 QString msg = QString("QVYUV4MPEG2Reader::open: File '") + fileName + "' doesn't seem to exist." ;
00058 qWarning() << msg;
00059 return FALSE;
00060 }
00061 else if (!videoFile.open(QIODevice::ReadOnly))
00062 {
00063 QString msg = QString("QVYUV4MPEG2Reader::open: Can't open file '") + fileName + "' in read mode." ;
00064 qWarning() << msg;
00065 return FALSE;
00066 }
00067 else if (!readYUV4MPEG2Header(videoFile, cols, rows, fps))
00068 {
00069 QString msg = QString("QVYUV4MPEG2Reader::open: File '") + fileName + "' doesn't seem to be a valid yuv4mpeg2 video file.";
00070 qWarning() << msg;
00071 return FALSE;
00072 }
00073 else
00074 {
00075
00076 if(realTime) {
00077 suggested_fps = fps;
00078 }
00079
00080
00081 header_size = videoFile.pos();
00082
00083
00084
00085
00086
00087
00088 suggested_cols = cols;
00089 suggested_rows = rows;
00090
00091 return TRUE;
00092 }
00093 }
00094
00095 bool QVYUV4MPEG2Reader::close()
00096 {
00097 videoFile.close();
00098 return TRUE;
00099 }
00100
00101 bool QVYUV4MPEG2Reader::grab(QVImage<uChar,1> &imgY, QVImage<uChar,1> &imgU, QVImage<uChar,1> &imgV)
00102 {
00103 QVImage<uChar,1> inp_imgY(cols,rows), inp_imgU(cols/2,rows/2), inp_imgV(cols/2,rows/2);
00104 bool ret_value = FALSE;
00105
00106 if (readYUV4MPEG2Frame(videoFile, inp_imgY, inp_imgU, inp_imgV))
00107 {
00108 ret_value = TRUE;
00109 }
00110 else if (videoFile.atEnd())
00111 {
00112 if (noLoop)
00113 return FALSE;
00114 else
00115 {
00116
00117 videoFile.reset();
00118 readYUV4MPEG2Frame(videoFile, inp_imgY, inp_imgU, inp_imgV);
00119 ret_value = TRUE;
00120 }
00121 }
00122 else {
00123 qFatal("QVYUV4MPEG2Reader::grab(): readYUV4MPEG2Frame() returned FALSE, and videoFile is not at end... aborting\n");
00124 }
00125
00126 imgY = inp_imgY;
00127 imgU = inp_imgU;
00128 imgV = inp_imgV;
00129
00130 return ret_value;
00131 }
00132
00133 int QVYUV4MPEG2Reader::getLength()
00134 {
00135 return (videoFile.size()-header_size)/(cols*rows + cols*rows/2 + 6);
00136 }
00137
00138 int QVYUV4MPEG2Reader::getPos()
00139 {
00140 return (videoFile.pos()-header_size)/(cols*rows + cols*rows/2 + 6);
00141 }
00142
00143 bool QVYUV4MPEG2Reader::seek(int pos)
00144 {
00145 videoFile.seek(header_size+pos*(cols*rows + cols*rows/2 + 6));
00146 return TRUE;
00147 }