1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtMultimedia module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #include "qvideosurfaceformat.h"
43 
44 #include <qdebug.h>
45 #include <qmetatype.h>
46 #include <qpair.h>
47 #include <qvariant.h>
48 #include <qvector.h>
49 
50 QT_BEGIN_NAMESPACE
51 
52 class QVideoSurfaceFormatPrivate : public QSharedData
53 {
54 public:
QVideoSurfaceFormatPrivate()55     QVideoSurfaceFormatPrivate()
56         : pixelFormat(QVideoFrame::Format_Invalid)
57         , handleType(QAbstractVideoBuffer::NoHandle)
58         , scanLineDirection(QVideoSurfaceFormat::TopToBottom)
59         , pixelAspectRatio(1, 1)
60         , ycbcrColorSpace(QVideoSurfaceFormat::YCbCr_Undefined)
61         , frameRate(0.0)
62     {
63     }
64 
QVideoSurfaceFormatPrivate(const QSize & size,QVideoFrame::PixelFormat format,QAbstractVideoBuffer::HandleType type)65     QVideoSurfaceFormatPrivate(
66             const QSize &size,
67             QVideoFrame::PixelFormat format,
68             QAbstractVideoBuffer::HandleType type)
69         : pixelFormat(format)
70         , handleType(type)
71         , scanLineDirection(QVideoSurfaceFormat::TopToBottom)
72         , frameSize(size)
73         , pixelAspectRatio(1, 1)
74         , ycbcrColorSpace(QVideoSurfaceFormat::YCbCr_Undefined)
75         , viewport(QPoint(0, 0), size)
76         , frameRate(0.0)
77     {
78     }
79 
QVideoSurfaceFormatPrivate(const QVideoSurfaceFormatPrivate & other)80     QVideoSurfaceFormatPrivate(const QVideoSurfaceFormatPrivate &other)
81         : QSharedData(other)
82         , pixelFormat(other.pixelFormat)
83         , handleType(other.handleType)
84         , scanLineDirection(other.scanLineDirection)
85         , frameSize(other.frameSize)
86         , pixelAspectRatio(other.pixelAspectRatio)
87         , ycbcrColorSpace(other.ycbcrColorSpace)
88         , viewport(other.viewport)
89         , frameRate(other.frameRate)
90         , propertyNames(other.propertyNames)
91         , propertyValues(other.propertyValues)
92     {
93     }
94 
operator ==(const QVideoSurfaceFormatPrivate & other) const95     bool operator ==(const QVideoSurfaceFormatPrivate &other) const
96     {
97         if (pixelFormat == other.pixelFormat
98             && handleType == other.handleType
99             && scanLineDirection == other.scanLineDirection
100             && frameSize == other.frameSize
101             && pixelAspectRatio == other.pixelAspectRatio
102             && viewport == other.viewport
103             && frameRatesEqual(frameRate, other.frameRate)
104             && ycbcrColorSpace == other.ycbcrColorSpace
105             && propertyNames.count() == other.propertyNames.count()) {
106             for (int i = 0; i < propertyNames.count(); ++i) {
107                 int j = other.propertyNames.indexOf(propertyNames.at(i));
108 
109                 if (j == -1 || propertyValues.at(i) != other.propertyValues.at(j))
110                     return false;
111             }
112             return true;
113         } else {
114             return false;
115         }
116     }
117 
frameRatesEqual(qreal r1,qreal r2)118     inline static bool frameRatesEqual(qreal r1, qreal r2)
119     {
120         return qAbs(r1 - r2) <= 0.00001 * qMin(qAbs(r1), qAbs(r2));
121     }
122 
123     QVideoFrame::PixelFormat pixelFormat;
124     QAbstractVideoBuffer::HandleType handleType;
125     QVideoSurfaceFormat::Direction scanLineDirection;
126     QSize frameSize;
127     QSize pixelAspectRatio;
128     QVideoSurfaceFormat::YCbCrColorSpace ycbcrColorSpace;
129     QRect viewport;
130     qreal frameRate;
131     QList<QByteArray> propertyNames;
132     QList<QVariant> propertyValues;
133 };
134 
135 /*!
136     \class QVideoSurfaceFormat
137     \brief The QVideoSurfaceFormat class specifies the stream format of a video presentation
138     surface.
139     \since 4.6
140 
141     A video surface presents a stream of video frames.  The surface's format describes the type of
142     the frames and determines how they should be presented.
143 
144     The core properties of a video stream required to setup a video surface are the pixel format
145     given by pixelFormat(), and the frame dimensions given by frameSize().
146 
147     If the surface is to present frames using a frame's handle a surface format will also include
148     a handle type which is given by the handleType() function.
149 
150     The region of a frame that is actually displayed on a video surface is given by the viewport().
151     A stream may have a viewport less than the entire region of a frame to allow for videos smaller
152     than the nearest optimal size of a video frame.  For example the width of a frame may be
153     extended so that the start of each scan line is eight byte aligned.
154 
155     Other common properties are the pixelAspectRatio(), scanLineDirection(), and frameRate().
156     Additionally a stream may have some additional type specific properties which are listed by the
157     dynamicPropertyNames() function and can be accessed using the property(), and setProperty()
158     functions.
159 */
160 
161 /*!
162     \enum QVideoSurfaceFormat::Direction
163 
164     Enumerates the layout direction of video scan lines.
165 
166     \value TopToBottom Scan lines are arranged from the top of the frame to the bottom.
167     \value BottomToTop Scan lines are arranged from the bottom of the frame to the top.
168 */
169 
170 /*!
171     \enum QVideoSurfaceFormat::YCbCrColorSpace
172 
173     Enumerates the Y'CbCr color space of video frames.
174 
175     \value YCbCr_Undefined
176     No color space is specified.
177 
178     \value YCbCr_BT601
179     A Y'CbCr color space defined by ITU-R recommendation BT.601
180     with Y value range from 16 to 235, and Cb/Cr range from 16 to 240.
181     Used in standard definition video.
182 
183     \value YCbCr_BT709
184     A Y'CbCr color space defined by ITU-R BT.709 with the same values range as YCbCr_BT601.  Used
185     for HDTV.
186 
187     \value YCbCr_xvYCC601
188     The BT.601 color space with the value range extended to 0 to 255.
189     It is backward compatibile with BT.601 and uses values outside BT.601 range to represent
190     wider colors range.
191 
192     \value YCbCr_xvYCC709
193     The BT.709 color space with the value range extended to 0 to 255.
194 
195     \value YCbCr_JPEG
196     The full range Y'CbCr color space used in JPEG files.
197 */
198 
199 /*!
200     Constructs a null video stream format.
201 */
202 
QVideoSurfaceFormat()203 QVideoSurfaceFormat::QVideoSurfaceFormat()
204     : d(new QVideoSurfaceFormatPrivate)
205 {
206 }
207 
208 /*!
209     Contructs a description of stream which receives stream of \a type buffers with given frame
210     \a size and pixel \a format.
211 */
212 
QVideoSurfaceFormat(const QSize & size,QVideoFrame::PixelFormat format,QAbstractVideoBuffer::HandleType type)213 QVideoSurfaceFormat::QVideoSurfaceFormat(
214         const QSize& size, QVideoFrame::PixelFormat format, QAbstractVideoBuffer::HandleType type)
215     : d(new QVideoSurfaceFormatPrivate(size, format, type))
216 {
217 }
218 
219 /*!
220     Constructs a copy of \a other.
221 */
222 
QVideoSurfaceFormat(const QVideoSurfaceFormat & other)223 QVideoSurfaceFormat::QVideoSurfaceFormat(const QVideoSurfaceFormat &other)
224     : d(other.d)
225 {
226 }
227 
228 /*!
229     Assigns the values of \a other to a video stream description.
230 */
231 
operator =(const QVideoSurfaceFormat & other)232 QVideoSurfaceFormat &QVideoSurfaceFormat::operator =(const QVideoSurfaceFormat &other)
233 {
234     d = other.d;
235 
236     return *this;
237 }
238 
239 /*!
240     Destroys a video stream description.
241 */
242 
~QVideoSurfaceFormat()243 QVideoSurfaceFormat::~QVideoSurfaceFormat()
244 {
245 }
246 
247 /*!
248     Identifies if a video surface format has a valid pixel format and frame size.
249 
250     Returns true if the format is valid, and false otherwise.
251 */
252 
isValid() const253 bool QVideoSurfaceFormat::isValid() const
254 {
255     return d->pixelFormat != QVideoFrame::Format_Invalid && d->frameSize.isValid();
256 }
257 
258 /*!
259     Returns true if \a other is the same as a video format, and false if they are the different.
260 */
261 
operator ==(const QVideoSurfaceFormat & other) const262 bool QVideoSurfaceFormat::operator ==(const QVideoSurfaceFormat &other) const
263 {
264     return d == other.d || *d == *other.d;
265 }
266 
267 /*!
268     Returns true if \a other is different to a video format, and false if they are the same.
269 */
270 
operator !=(const QVideoSurfaceFormat & other) const271 bool QVideoSurfaceFormat::operator !=(const QVideoSurfaceFormat &other) const
272 {
273     return d != other.d && !(*d == *other.d);
274 }
275 
276 /*!
277     Returns the pixel format of frames in a video stream.
278 */
279 
pixelFormat() const280 QVideoFrame::PixelFormat QVideoSurfaceFormat::pixelFormat() const
281 {
282     return d->pixelFormat;
283 }
284 
285 /*!
286     Returns the type of handle the surface uses to present the frame data.
287 
288     If the handle type is QAbstractVideoBuffer::NoHandle buffers with any handle type are valid
289     provided they can be \l {QAbstractVideoBuffer::map()}{mapped} with the
290     QAbstractVideoBuffer::ReadOnly flag.  If the handleType() is not QAbstractVideoBuffer::NoHandle
291     then the handle type of the buffer be the same as that of the surface format.
292 */
293 
handleType() const294 QAbstractVideoBuffer::HandleType QVideoSurfaceFormat::handleType() const
295 {
296     return d->handleType;
297 }
298 
299 /*!
300     Returns the size of frames in a video stream.
301 
302     \sa frameWidth(), frameHeight()
303 */
304 
frameSize() const305 QSize QVideoSurfaceFormat::frameSize() const
306 {
307     return d->frameSize;
308 }
309 
310 /*!
311     Returns the width of frames in a video stream.
312 
313     \sa frameSize(), frameHeight()
314 */
315 
frameWidth() const316 int QVideoSurfaceFormat::frameWidth() const
317 {
318     return d->frameSize.width();
319 }
320 
321 /*!
322     Returns the height of frame in a video stream.
323 */
324 
frameHeight() const325 int QVideoSurfaceFormat::frameHeight() const
326 {
327     return d->frameSize.height();
328 }
329 
330 /*!
331     Sets the size of frames in a video stream to \a size.
332 
333     This will reset the viewport() to fill the entire frame.
334 */
335 
setFrameSize(const QSize & size)336 void QVideoSurfaceFormat::setFrameSize(const QSize &size)
337 {
338     d->frameSize = size;
339     d->viewport = QRect(QPoint(0, 0), size);
340 }
341 
342 /*!
343     \overload
344 
345     Sets the \a width and \a height of frames in a video stream.
346 
347     This will reset the viewport() to fill the entire frame.
348 */
349 
setFrameSize(int width,int height)350 void QVideoSurfaceFormat::setFrameSize(int width, int height)
351 {
352     d->frameSize = QSize(width, height);
353     d->viewport = QRect(0, 0, width, height);
354 }
355 
356 /*!
357     Returns the viewport of a video stream.
358 
359     The viewport is the region of a video frame that is actually displayed.
360 
361     By default the viewport covers an entire frame.
362 */
363 
viewport() const364 QRect QVideoSurfaceFormat::viewport() const
365 {
366     return d->viewport;
367 }
368 
369 /*!
370     Sets the viewport of a video stream to \a viewport.
371 */
372 
setViewport(const QRect & viewport)373 void QVideoSurfaceFormat::setViewport(const QRect &viewport)
374 {
375     d->viewport = viewport;
376 }
377 
378 /*!
379     Returns the direction of scan lines.
380 */
381 
scanLineDirection() const382 QVideoSurfaceFormat::Direction QVideoSurfaceFormat::scanLineDirection() const
383 {
384     return d->scanLineDirection;
385 }
386 
387 /*!
388     Sets the \a direction of scan lines.
389 */
390 
setScanLineDirection(Direction direction)391 void QVideoSurfaceFormat::setScanLineDirection(Direction direction)
392 {
393     d->scanLineDirection = direction;
394 }
395 
396 /*!
397     Returns the frame rate of a video stream in frames per second.
398 */
399 
frameRate() const400 qreal QVideoSurfaceFormat::frameRate() const
401 {
402     return d->frameRate;
403 }
404 
405 /*!
406     Sets the frame \a rate of a video stream in frames per second.
407 */
408 
setFrameRate(qreal rate)409 void QVideoSurfaceFormat::setFrameRate(qreal rate)
410 {
411     d->frameRate = rate;
412 }
413 
414 /*!
415     Returns a video stream's pixel aspect ratio.
416 */
417 
pixelAspectRatio() const418 QSize QVideoSurfaceFormat::pixelAspectRatio() const
419 {
420     return d->pixelAspectRatio;
421 }
422 
423 /*!
424     Sets a video stream's pixel aspect \a ratio.
425 */
426 
setPixelAspectRatio(const QSize & ratio)427 void QVideoSurfaceFormat::setPixelAspectRatio(const QSize &ratio)
428 {
429     d->pixelAspectRatio = ratio;
430 }
431 
432 /*!
433     \overload
434 
435     Sets the \a horizontal and \a vertical elements of a video stream's pixel aspect ratio.
436 */
437 
setPixelAspectRatio(int horizontal,int vertical)438 void QVideoSurfaceFormat::setPixelAspectRatio(int horizontal, int vertical)
439 {
440     d->pixelAspectRatio = QSize(horizontal, vertical);
441 }
442 
443 /*!
444     Returns the Y'CbCr color space of a video stream.
445 */
446 
yCbCrColorSpace() const447 QVideoSurfaceFormat::YCbCrColorSpace QVideoSurfaceFormat::yCbCrColorSpace() const
448 {
449     return d->ycbcrColorSpace;
450 }
451 
452 /*!
453     Sets the Y'CbCr color \a space of a video stream.
454     It is only used with raw YUV frame types.
455 */
456 
setYCbCrColorSpace(QVideoSurfaceFormat::YCbCrColorSpace space)457 void QVideoSurfaceFormat::setYCbCrColorSpace(QVideoSurfaceFormat::YCbCrColorSpace space)
458 {
459     d->ycbcrColorSpace = space;
460 }
461 
462 /*!
463     Returns a suggested size in pixels for the video stream.
464 
465     This is the size of the viewport scaled according to the pixel aspect ratio.
466 */
467 
sizeHint() const468 QSize QVideoSurfaceFormat::sizeHint() const
469 {
470     QSize size = d->viewport.size();
471 
472     if (d->pixelAspectRatio.height() != 0)
473         size.setWidth(size.width() * d->pixelAspectRatio.width() / d->pixelAspectRatio.height());
474 
475     return size;
476 }
477 
478 /*!
479     Returns a list of video format dynamic property names.
480 */
481 
propertyNames() const482 QList<QByteArray> QVideoSurfaceFormat::propertyNames() const
483 {
484     return (QList<QByteArray>()
485             << "handleType"
486             << "pixelFormat"
487             << "frameSize"
488             << "frameWidth"
489             << "viewport"
490             << "scanLineDirection"
491             << "frameRate"
492             << "pixelAspectRatio"
493             << "sizeHint"
494             << "yCbCrColorSpace")
495             + d->propertyNames;
496 }
497 
498 /*!
499     Returns the value of the video format's \a name property.
500 */
501 
property(const char * name) const502 QVariant QVideoSurfaceFormat::property(const char *name) const
503 {
504     if (qstrcmp(name, "handleType") == 0) {
505         return QVariant::fromValue(d->handleType);
506     } else if (qstrcmp(name, "pixelFormat") == 0) {
507         return QVariant::fromValue(d->pixelFormat);
508     } else if (qstrcmp(name, "handleType") == 0) {
509         return QVariant::fromValue(d->handleType);
510     } else if (qstrcmp(name, "frameSize") == 0) {
511         return d->frameSize;
512     } else if (qstrcmp(name, "frameWidth") == 0) {
513         return d->frameSize.width();
514     } else if (qstrcmp(name, "frameHeight") == 0) {
515         return d->frameSize.height();
516     } else if (qstrcmp(name, "viewport") == 0) {
517         return d->viewport;
518     } else if (qstrcmp(name, "scanLineDirection") == 0) {
519         return QVariant::fromValue(d->scanLineDirection);
520     } else if (qstrcmp(name, "frameRate") == 0) {
521         return QVariant::fromValue(d->frameRate);
522     } else if (qstrcmp(name, "pixelAspectRatio") == 0) {
523         return QVariant::fromValue(d->pixelAspectRatio);
524     } else if (qstrcmp(name, "sizeHint") == 0) {
525         return sizeHint();
526     } else if (qstrcmp(name, "yCbCrColorSpace") == 0) {
527         return QVariant::fromValue(d->ycbcrColorSpace);
528     } else {
529         int id = 0;
530         for (; id < d->propertyNames.count() && d->propertyNames.at(id) != name; ++id) {}
531 
532         return id < d->propertyValues.count()
533                 ? d->propertyValues.at(id)
534                 : QVariant();
535     }
536 }
537 
538 /*!
539     Sets the video format's \a name property to \a value.
540 */
541 
setProperty(const char * name,const QVariant & value)542 void QVideoSurfaceFormat::setProperty(const char *name, const QVariant &value)
543 {
544     if (qstrcmp(name, "handleType") == 0) {
545         // read only.
546     } else if (qstrcmp(name, "pixelFormat") == 0) {
547         // read only.
548     } else if (qstrcmp(name, "frameSize") == 0) {
549         if (value.canConvert<QSize>()) {
550             d->frameSize = qvariant_cast<QSize>(value);
551             d->viewport = QRect(QPoint(0, 0), d->frameSize);
552         }
553     } else if (qstrcmp(name, "frameWidth") == 0) {
554         // read only.
555     } else if (qstrcmp(name, "frameHeight") == 0) {
556         // read only.
557     } else if (qstrcmp(name, "viewport") == 0) {
558         if (value.canConvert<QRect>())
559             d->viewport = qvariant_cast<QRect>(value);
560     } else if (qstrcmp(name, "scanLineDirection") == 0) {
561         if (value.canConvert<Direction>())
562             d->scanLineDirection = qvariant_cast<Direction>(value);
563     } else if (qstrcmp(name, "frameRate") == 0) {
564         if (value.canConvert<qreal>())
565             d->frameRate = qvariant_cast<qreal>(value);
566     } else if (qstrcmp(name, "pixelAspectRatio") == 0) {
567         if (value.canConvert<QSize>())
568             d->pixelAspectRatio = qvariant_cast<QSize>(value);
569     } else if (qstrcmp(name, "sizeHint") == 0) {
570         // read only.
571     } else if (qstrcmp(name, "yCbCrColorSpace") == 0) {
572           if (value.canConvert<YCbCrColorSpace>())
573               d->ycbcrColorSpace = qvariant_cast<YCbCrColorSpace>(value);
574     } else {
575         int id = 0;
576         for (; id < d->propertyNames.count() && d->propertyNames.at(id) != name; ++id) {}
577 
578         if (id < d->propertyValues.count()) {
579             if (value.isNull()) {
580                 d->propertyNames.removeAt(id);
581                 d->propertyValues.removeAt(id);
582             } else {
583                 d->propertyValues[id] = value;
584             }
585         } else if (!value.isNull()) {
586             d->propertyNames.append(QByteArray(name));
587             d->propertyValues.append(value);
588         }
589     }
590 }
591 
592 
593 #ifndef QT_NO_DEBUG_STREAM
operator <<(QDebug dbg,const QVideoSurfaceFormat & f)594 QDebug operator<<(QDebug dbg, const QVideoSurfaceFormat &f)
595 {
596     QString typeName;
597     switch (f.pixelFormat()) {
598     case QVideoFrame::Format_Invalid:
599         typeName = QLatin1String("Format_Invalid");
600         break;
601     case QVideoFrame::Format_ARGB32:
602         typeName = QLatin1String("Format_ARGB32");
603         break;
604     case QVideoFrame::Format_ARGB32_Premultiplied:
605         typeName = QLatin1String("Format_ARGB32_Premultiplied");
606         break;
607     case QVideoFrame::Format_RGB32:
608         typeName = QLatin1String("Format_RGB32");
609         break;
610     case QVideoFrame::Format_RGB24:
611         typeName = QLatin1String("Format_RGB24");
612         break;
613     case QVideoFrame::Format_RGB565:
614         typeName = QLatin1String("Format_RGB565");
615         break;
616     case QVideoFrame::Format_RGB555:
617         typeName = QLatin1String("Format_RGB555");
618         break;
619     case QVideoFrame::Format_ARGB8565_Premultiplied:
620         typeName = QLatin1String("Format_ARGB8565_Premultiplied");
621         break;
622     case QVideoFrame::Format_BGRA32:
623         typeName = QLatin1String("Format_BGRA32");
624         break;
625     case QVideoFrame::Format_BGRA32_Premultiplied:
626         typeName = QLatin1String("Format_BGRA32_Premultiplied");
627         break;
628     case QVideoFrame::Format_BGR32:
629         typeName = QLatin1String("Format_BGR32");
630         break;
631     case QVideoFrame::Format_BGR24:
632         typeName = QLatin1String("Format_BGR24");
633         break;
634     case QVideoFrame::Format_BGR565:
635         typeName = QLatin1String("Format_BGR565");
636         break;
637     case QVideoFrame::Format_BGR555:
638         typeName = QLatin1String("Format_BGR555");
639         break;
640     case QVideoFrame::Format_BGRA5658_Premultiplied:
641         typeName = QLatin1String("Format_BGRA5658_Premultiplied");
642         break;
643     case QVideoFrame::Format_AYUV444:
644         typeName = QLatin1String("Format_AYUV444");
645         break;
646     case QVideoFrame::Format_AYUV444_Premultiplied:
647         typeName = QLatin1String("Format_AYUV444_Premultiplied");
648         break;
649     case QVideoFrame::Format_YUV444:
650         typeName = QLatin1String("Format_YUV444");
651         break;
652     case QVideoFrame::Format_YUV420P:
653         typeName = QLatin1String("Format_YUV420P");
654         break;
655     case QVideoFrame::Format_YV12:
656         typeName = QLatin1String("Format_YV12");
657         break;
658     case QVideoFrame::Format_UYVY:
659         typeName = QLatin1String("Format_UYVY");
660         break;
661     case QVideoFrame::Format_YUYV:
662         typeName = QLatin1String("Format_YUYV");
663         break;
664     case QVideoFrame::Format_NV12:
665         typeName = QLatin1String("Format_NV12");
666         break;
667     case QVideoFrame::Format_NV21:
668         typeName = QLatin1String("Format_NV21");
669         break;
670     case QVideoFrame::Format_IMC1:
671         typeName = QLatin1String("Format_IMC1");
672         break;
673     case QVideoFrame::Format_IMC2:
674         typeName = QLatin1String("Format_IMC2");
675         break;
676     case QVideoFrame::Format_IMC3:
677         typeName = QLatin1String("Format_IMC3");
678         break;
679     case QVideoFrame::Format_IMC4:
680         typeName = QLatin1String("Format_IMC4");
681         break;
682     case QVideoFrame::Format_Y8:
683         typeName = QLatin1String("Format_Y8");
684         break;
685     case QVideoFrame::Format_Y16:
686         typeName = QLatin1String("Format_Y16");
687     default:
688         typeName = QString(QLatin1String("UserType(%1)" )).arg(int(f.pixelFormat()));
689     }
690 
691     dbg.nospace() << "QVideoSurfaceFormat(" << typeName;
692     dbg.nospace() << ", " << f.frameSize();
693     dbg.nospace() << ", viewport=" << f.viewport();
694     dbg.nospace() << ", pixelAspectRatio=" << f.pixelAspectRatio();
695     dbg.nospace() << ")";
696 
697     foreach(const QByteArray& propertyName, f.propertyNames())
698         dbg << "\n    " << propertyName.data() << " = " << f.property(propertyName.data());
699 
700     return dbg.space();
701 }
702 #endif
703 
704 QT_END_NAMESPACE
705