Skip to content

Commit 7f90637

Browse files
authored
MF-grabber: Add support for bottom-up image handling (#1752)
* prepare bottom-up image handling * add default stride handling, code cleaning * fix code * move whole logic to MF-grabber * minor fix --------- Co-authored-by: Thinner77 <none>
1 parent 943f9e2 commit 7f90637

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

include/grabber/video/mediafoundation/MFGrabber.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class MFGrabber : public Grabber
4646
int numerator = 0;
4747
int denominator = 0;
4848
PixelFormat pf = PixelFormat::NO_CHANGE;
49+
long defstride = 0;
4950
GUID guid = GUID_NULL;
5051
};
5152

include/utils/PixelFormat.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,10 @@ inline QString pixelFormatToString(const PixelFormat& pixelFormat)
124124

125125
enum class FlipMode
126126
{
127+
NO_CHANGE,
127128
HORIZONTAL,
128129
VERTICAL,
129-
BOTH,
130-
NO_CHANGE
130+
BOTH
131131
};
132132

133133
inline FlipMode parseFlipMode(const QString& flipMode)

libsrc/grabber/video/mediafoundation/MFGrabber.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,18 @@ HRESULT MFGrabber::init_device(QString deviceName, DeviceProperties props)
363363
_height = props.height;
364364
_frameByteSize = _width * _height * 3;
365365
_lineLength = _width * 3;
366+
// adjust flipMode for bottom-up images
367+
if (props.defstride < 0)
368+
{
369+
if (_flipMode == FlipMode::NO_CHANGE)
370+
_flipMode = FlipMode::HORIZONTAL;
371+
else if (_flipMode == FlipMode::HORIZONTAL)
372+
_flipMode = FlipMode::NO_CHANGE;
373+
else if (_flipMode == FlipMode::VERTICAL)
374+
_flipMode = FlipMode::BOTH;
375+
else if (_flipMode == FlipMode::BOTH)
376+
_flipMode = FlipMode::VERTICAL;
377+
}
366378
}
367379

368380
// Cleanup
@@ -436,6 +448,14 @@ void MFGrabber::enumVideoCaptureDevices()
436448
properties.denominator = denominator;
437449
properties.pf = pixelformat;
438450
properties.guid = format;
451+
452+
HRESULT hr = pType->GetUINT32(MF_MT_DEFAULT_STRIDE, (UINT32*)&properties.defstride);
453+
if (FAILED(hr))
454+
{
455+
hr = MFGetStrideForBitmapInfoHeader(format.Data1, width, &properties.defstride);
456+
if (FAILED(hr))
457+
DebugIf (verbose, _log, "failed to get default stride");
458+
}
439459
devicePropertyList.append(properties);
440460

441461
DebugIf (verbose, _log, "%s %d x %d @ %d fps (%s)", QSTRING_CSTR(dev), properties.width, properties.height, properties.fps, QSTRING_CSTR(pixelFormatToString(properties.pf)));
@@ -797,7 +817,7 @@ QJsonArray MFGrabber::discover(const QJsonObject& params)
797817
resolution_default["width"] = 640;
798818
resolution_default["height"] = 480;
799819
resolution_default["fps"] = 25;
800-
format_default["format"] = "bgr24";
820+
format_default["format"] = "rgb24";
801821
format_default["resolution"] = resolution_default;
802822
video_inputs_default["inputIdx"] = 0;
803823
video_inputs_default["standards"] = "PAL";

0 commit comments

Comments
 (0)