prepare bottom-up image handling

This commit is contained in:
Thinner77 2024-06-03 18:01:51 +02:00
parent 1fd40571af
commit ac9aaf4037
6 changed files with 30 additions and 8 deletions

View File

@ -31,7 +31,7 @@ public:
PixelFormat pixelFormat, uint8_t* sharedData, PixelFormat pixelFormat, uint8_t* sharedData,
int size, int width, int height, int lineLength, int size, int width, int height, int lineLength,
int cropLeft, int cropTop, int cropBottom, int cropRight, int cropLeft, int cropTop, int cropBottom, int cropRight,
VideoMode videoMode, FlipMode flipMode, int pixelDecimation); VideoMode videoMode, bool bottomUp, FlipMode flipMode, int pixelDecimation);
void process(); void process();
@ -55,7 +55,7 @@ private:
int _cropTop; int _cropTop;
int _cropBottom; int _cropBottom;
int _cropRight; int _cropRight;
bool _bottomUp;
FlipMode _flipMode; FlipMode _flipMode;
VideoMode _videoMode; VideoMode _videoMode;
bool _doTransform; bool _doTransform;
@ -96,14 +96,14 @@ public:
PixelFormat pixelFormat, uint8_t* sharedData, PixelFormat pixelFormat, uint8_t* sharedData,
int size, int width, int height, int lineLength, int size, int width, int height, int lineLength,
int cropLeft, int cropTop, int cropBottom, int cropRight, int cropLeft, int cropTop, int cropBottom, int cropRight,
VideoMode videoMode, FlipMode flipMode, int pixelDecimation) VideoMode videoMode, bool bottomUp, FlipMode flipMode, int pixelDecimation)
{ {
auto encThread = qobject_cast<EncoderThread*>(_thread); auto encThread = qobject_cast<EncoderThread*>(_thread);
if (encThread != nullptr) if (encThread != nullptr)
encThread->setup(pixelFormat, sharedData, encThread->setup(pixelFormat, sharedData,
size, width, height, lineLength, size, width, height, lineLength,
cropLeft, cropTop, cropBottom, cropRight, cropLeft, cropTop, cropBottom, cropRight,
videoMode, flipMode, pixelDecimation); videoMode, bottomUp, flipMode, pixelDecimation);
} }
bool isBusy() bool isBusy()

View File

@ -15,6 +15,7 @@ public:
void setVerticalPixelDecimation(int decimator) { _verticalDecimation = decimator; } void setVerticalPixelDecimation(int decimator) { _verticalDecimation = decimator; }
void setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom); void setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom);
void setVideoMode(VideoMode mode) { _videoMode = mode; } void setVideoMode(VideoMode mode) { _videoMode = mode; }
void setBottomUp(bool isBottomUp) { _bottomUp = isBottomUp; }
void setFlipMode(FlipMode mode) { _flipMode = mode; } void setFlipMode(FlipMode mode) { _flipMode = mode; }
void processImage(const uint8_t * data, int width, int height, int lineLength, PixelFormat pixelFormat, Image<ColorRgb> & outputImage) const; void processImage(const uint8_t * data, int width, int height, int lineLength, PixelFormat pixelFormat, Image<ColorRgb> & outputImage) const;
@ -26,6 +27,7 @@ private:
int _cropTop; int _cropTop;
int _cropBottom; int _cropBottom;
VideoMode _videoMode; VideoMode _videoMode;
bool _bottomUp;
FlipMode _flipMode; FlipMode _flipMode;
}; };

View File

@ -40,7 +40,7 @@ void EncoderThread::setup(
PixelFormat pixelFormat, uint8_t* sharedData, PixelFormat pixelFormat, uint8_t* sharedData,
int size, int width, int height, int lineLength, int size, int width, int height, int lineLength,
int cropLeft, int cropTop, int cropBottom, int cropRight, int cropLeft, int cropTop, int cropBottom, int cropRight,
VideoMode videoMode, FlipMode flipMode, int pixelDecimation) VideoMode videoMode, bool bottomUp, FlipMode flipMode, int pixelDecimation)
{ {
_lineLength = lineLength; _lineLength = lineLength;
_pixelFormat = pixelFormat; _pixelFormat = pixelFormat;
@ -51,6 +51,7 @@ void EncoderThread::setup(
_cropTop = cropTop; _cropTop = cropTop;
_cropBottom = cropBottom; _cropBottom = cropBottom;
_cropRight = cropRight; _cropRight = cropRight;
_bottomUp = bottomUp;
_flipMode = flipMode; _flipMode = flipMode;
_videoMode = videoMode; _videoMode = videoMode;
_pixelDecimation = pixelDecimation; _pixelDecimation = pixelDecimation;
@ -81,6 +82,7 @@ void EncoderThread::setup(
#endif #endif
_imageResampler.setVideoMode(_videoMode); _imageResampler.setVideoMode(_videoMode);
_imageResampler.setBottomUp(_bottomUp);
_imageResampler.setFlipMode(_flipMode); _imageResampler.setFlipMode(_flipMode);
_imageResampler.setCropping(_cropLeft, _cropRight, _cropTop, _cropBottom); _imageResampler.setCropping(_cropLeft, _cropRight, _cropTop, _cropBottom);
_imageResampler.setHorizontalPixelDecimation(_pixelDecimation); _imageResampler.setHorizontalPixelDecimation(_pixelDecimation);

View File

@ -541,7 +541,7 @@ void MFGrabber::process_image(const void *frameImageBuffer, int size)
{ {
if (!_threadManager->_threads[i]->isBusy()) if (!_threadManager->_threads[i]->isBusy())
{ {
_threadManager->_threads[i]->setup(_pixelFormat, (uint8_t*)frameImageBuffer, size, _width, _height, _lineLength, _cropLeft, _cropTop, _cropBottom, _cropRight, _videoMode, _flipMode, _pixelDecimation); _threadManager->_threads[i]->setup(_pixelFormat, (uint8_t*)frameImageBuffer, size, _width, _height, _lineLength, _cropLeft, _cropTop, _cropBottom, _cropRight, _videoMode, (_pixelFormat == PixelFormat::BGR24), _flipMode, _pixelDecimation);
_threadManager->_threads[i]->process(); _threadManager->_threads[i]->process();
break; break;
} }

View File

@ -1046,7 +1046,7 @@ bool V4L2Grabber::process_image(const void *p, int size)
{ {
if (!_threadManager->_threads[i]->isBusy()) if (!_threadManager->_threads[i]->isBusy())
{ {
_threadManager->_threads[i]->setup(_pixelFormat, (uint8_t*)p, size, _width, _height, _lineLength, _cropLeft, _cropTop, _cropBottom, _cropRight, _videoMode, _flipMode, _pixelDecimation); _threadManager->_threads[i]->setup(_pixelFormat, (uint8_t*)p, size, _width, _height, _lineLength, _cropLeft, _cropTop, _cropBottom, _cropRight, _videoMode, false, _flipMode, _pixelDecimation);
_threadManager->_threads[i]->process(); _threadManager->_threads[i]->process();
result = true; result = true;
break; break;

View File

@ -10,6 +10,7 @@ ImageResampler::ImageResampler()
, _cropTop(0) , _cropTop(0)
, _cropBottom(0) , _cropBottom(0)
, _videoMode(VideoMode::VIDEO_2D) , _videoMode(VideoMode::VIDEO_2D)
, _bottomUp(false)
, _flipMode(FlipMode::NO_CHANGE) , _flipMode(FlipMode::NO_CHANGE)
{ {
} }
@ -53,7 +54,24 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
int xDestStart, xDestEnd; int xDestStart, xDestEnd;
int yDestStart, yDestEnd; int yDestStart, yDestEnd;
switch (_flipMode) FlipMode flipMode;
if (!_bottomUp)
{
flipMode = _flipMode;
}
else
{
if (_flipMode == FlipMode::NO_CHANGE)
flipMode = FlipMode::HORIZONTAL;
else if (_flipMode == FlipMode::HORIZONTAL)
flipMode = FlipMode::NO_CHANGE;
else if (_flipMode == FlipMode::VERTICAL)
flipMode = FlipMode::BOTH;
else if (_flipMode == FlipMode::BOTH)
flipMode = FlipMode::VERTICAL;
}
switch (flipMode)
{ {
case FlipMode::NO_CHANGE: case FlipMode::NO_CHANGE:
xDestStart = 0; xDestStart = 0;