Merge remote-tracking branch 'origin/5.5' into 5.6

Change-Id: I8e0f222f110cc23b426f2d68416f5cc3982e30f2
This commit is contained in:
Yoann Lopes
2015-11-20 16:20:51 +01:00
23 changed files with 321 additions and 65 deletions

View File

@@ -160,8 +160,6 @@ inline QSysInfo::MacVersion qt_OS_limit(QSysInfo::MacVersion osxVersion,
typedef QPair<qreal, qreal> AVFPSRange;
AVFPSRange qt_connection_framerates(AVCaptureConnection *videoConnection);
typedef QPair<int, int> AVFRational;
AVFRational qt_float_to_rational(qreal par, int limit);
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_7_0)

View File

@@ -36,6 +36,7 @@
#include <QtCore/qvector.h>
#include <QtCore/qpair.h>
#include <private/qmultimediautils_p.h>
#include <functional>
#include <algorithm>
@@ -77,42 +78,6 @@ AVFPSRange qt_connection_framerates(AVCaptureConnection *videoConnection)
return newRange;
}
AVFRational qt_float_to_rational(qreal par, int limit)
{
Q_ASSERT(limit > 0);
// In Qt we represent pixel aspect ratio
// as a rational number (we use QSize).
// AVFoundation describes dimensions in pixels
// and in pixels with width multiplied by PAR.
// Represent this PAR as a ratio.
int a = 0, b = 1, c = 1, d = 1;
qreal mid = 0.;
while (b <= limit && d <= limit) {
mid = qreal(a + c) / (b + d);
if (qAbs(par - mid) < 0.000001) {
if (b + d <= limit)
return AVFRational(a + c, b + d);
else if (d > b)
return AVFRational(c, d);
else
return AVFRational(a, b);
} else if (par > mid) {
a = a + c;
b = b + d;
} else {
c = a + c;
d = b + d;
}
}
if (b > limit)
return AVFRational(c, d);
return AVFRational(a, b);
}
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_7_0)
namespace {
@@ -264,10 +229,13 @@ QSize qt_device_format_pixel_aspect_ratio(AVCaptureDeviceFormat *format)
if (!res.width || !resPAR.width)
return QSize();
const AVFRational asRatio(qt_float_to_rational(resPAR.width > res.width
? res.width / qreal(resPAR.width)
: resPAR.width / qreal(res.width), 200));
return QSize(asRatio.first, asRatio.second);
int n, d;
qt_real_to_fraction(resPAR.width > res.width
? res.width / qreal(resPAR.width)
: resPAR.width / qreal(res.width),
&n, &d);
return QSize(n, d);
}
AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDevice,

View File

@@ -45,6 +45,7 @@
#include <QtCore/qvector.h>
#include <QtCore/qdebug.h>
#include <QtCore/qlist.h>
#include <private/qmultimediautils_p.h>
#include <algorithm>
@@ -129,8 +130,9 @@ CMTime qt_adjusted_frame_duration(AVFrameRateRange *range, qreal fps)
if (fps >= range.maxFrameRate)
return range.minFrameDuration;
const AVFRational timeAsRational(qt_float_to_rational(1. / fps, 1000));
return CMTimeMake(timeAsRational.first, timeAsRational.second);
int n, d;
qt_real_to_fraction(1. / fps, &n, &d);
return CMTimeMake(n, d);
}
void qt_set_framerate_limits(AVCaptureDevice *captureDevice,