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