Switched added to hyperion-v4l2 to process the video stream as a 3D SBS or TAB

Former-commit-id: cdd121f172f4e42e301f63a3a2a51ec97ac97e3b
This commit is contained in:
johan 2014-02-04 21:53:36 +01:00
parent bad5b34796
commit 62c1d36195
4 changed files with 85 additions and 30 deletions

View File

@ -1 +1 @@
fb67681c8c942ffe2236a4ea3a41d4102c3fbb2e f3afa39f64294a9ce71af8e424e4bab72d2b29cb

View File

@ -42,10 +42,6 @@ V4L2Grabber::V4L2Grabber(
VideoStandard videoStandard, VideoStandard videoStandard,
int width, int width,
int height, int height,
int cropLeft,
int cropRight,
int cropTop,
int cropBottom,
int frameDecimation, int frameDecimation,
int horizontalPixelDecimation, int horizontalPixelDecimation,
int verticalPixelDecimation) : int verticalPixelDecimation) :
@ -56,13 +52,14 @@ V4L2Grabber::V4L2Grabber(
_pixelFormat(0), _pixelFormat(0),
_width(width), _width(width),
_height(height), _height(height),
_cropLeft(cropLeft), _cropLeft(0),
_cropRight(cropRight), _cropRight(0),
_cropTop(cropTop), _cropTop(0),
_cropBottom(cropBottom), _cropBottom(0),
_frameDecimation(std::max(1, frameDecimation)), _frameDecimation(std::max(1, frameDecimation)),
_horizontalPixelDecimation(std::max(1, horizontalPixelDecimation)), _horizontalPixelDecimation(std::max(1, horizontalPixelDecimation)),
_verticalPixelDecimation(std::max(1, verticalPixelDecimation)), _verticalPixelDecimation(std::max(1, verticalPixelDecimation)),
_mode3D(MODE_NONE),
_currentFrame(0), _currentFrame(0),
_callback(nullptr), _callback(nullptr),
_callbackArg(nullptr) _callbackArg(nullptr)
@ -77,6 +74,19 @@ V4L2Grabber::~V4L2Grabber()
close_device(); close_device();
} }
void V4L2Grabber::setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom)
{
_cropLeft = cropLeft;
_cropRight = cropRight;
_cropTop = cropTop;
_cropBottom = cropBottom;
}
void V4L2Grabber::set3D(Mode3D mode)
{
_mode3D = mode;
}
void V4L2Grabber::setCallback(V4L2Grabber::ImageCallback callback, void *arg) void V4L2Grabber::setCallback(V4L2Grabber::ImageCallback callback, void *arg)
{ {
_callback = callback; _callback = callback;
@ -659,14 +669,29 @@ bool V4L2Grabber::process_image(const void *p, int size)
void V4L2Grabber::process_image(const uint8_t * data) void V4L2Grabber::process_image(const uint8_t * data)
{ {
int width = (_width - _cropLeft - _cropRight + _horizontalPixelDecimation/2) / _horizontalPixelDecimation; int width = _width;
int height = (_height - _cropTop - _cropBottom + _verticalPixelDecimation/2) / _verticalPixelDecimation; int height = _height;
Image<ColorRgb> image(width, height); switch (_mode3D)
for (int ySource = _cropTop + _verticalPixelDecimation/2, yDest = 0; ySource < _height - _cropBottom; ySource += _verticalPixelDecimation, ++yDest)
{ {
for (int xSource = _cropLeft + _horizontalPixelDecimation/2, xDest = 0; xSource < _width - _cropRight; xSource += _horizontalPixelDecimation, ++xDest) case MODE_3DSBS:
width = _width/2;
break;
case MODE_3DTAB:
height = _height/2;
break;
default:
break;
}
// create output structure
int outputWidth = (width - _cropLeft - _cropRight + _horizontalPixelDecimation/2) / _horizontalPixelDecimation;
int outputHeight = (height - _cropTop - _cropBottom + _verticalPixelDecimation/2) / _verticalPixelDecimation;
Image<ColorRgb> image(outputWidth, outputHeight);
for (int ySource = _cropTop + _verticalPixelDecimation/2, yDest = 0; ySource < height - _cropBottom; ySource += _verticalPixelDecimation, ++yDest)
{
for (int xSource = _cropLeft + _horizontalPixelDecimation/2, xDest = 0; xSource < width - _cropRight; xSource += _horizontalPixelDecimation, ++xDest)
{ {
int index = (_width * ySource + xSource) * 2; int index = (_width * ySource + xSource) * 2;
uint8_t y = 0; uint8_t y = 0;

View File

@ -20,6 +20,10 @@ public:
PAL, NTSC, NO_CHANGE PAL, NTSC, NO_CHANGE
}; };
enum Mode3D {
MODE_NONE, MODE_3DSBS, MODE_3DTAB
};
public: public:
V4L2Grabber( V4L2Grabber(
const std::string & device, const std::string & device,
@ -27,15 +31,18 @@ public:
VideoStandard videoStandard, VideoStandard videoStandard,
int width, int width,
int height, int height,
int cropLeft,
int cropRight,
int cropTop,
int cropBottom,
int frameDecimation, int frameDecimation,
int horizontalPixelDecimation, int horizontalPixelDecimation,
int verticalPixelDecimation); int verticalPixelDecimation);
virtual ~V4L2Grabber(); virtual ~V4L2Grabber();
void setCropping(int cropLeft,
int cropRight,
int cropTop,
int cropBottom);
void set3D(Mode3D mode);
void setCallback(ImageCallback callback, void * arg); void setCallback(ImageCallback callback, void * arg);
void start(); void start();
@ -96,13 +103,15 @@ private:
uint32_t _pixelFormat; uint32_t _pixelFormat;
int _width; int _width;
int _height; int _height;
const int _cropLeft; int _cropLeft;
const int _cropRight; int _cropRight;
const int _cropTop; int _cropTop;
const int _cropBottom; int _cropBottom;
const int _frameDecimation; int _frameDecimation;
const int _horizontalPixelDecimation; int _horizontalPixelDecimation;
const int _verticalPixelDecimation; int _verticalPixelDecimation;
Mode3D _mode3D;
int _currentFrame; int _currentFrame;

View File

@ -54,6 +54,8 @@ int main(int argc, char** argv)
IntParameter & argFrameDecimation = parameters.add<IntParameter> ('f', "frame-decimator", "Decimation factor for the video frames [default=1]"); IntParameter & argFrameDecimation = parameters.add<IntParameter> ('f', "frame-decimator", "Decimation factor for the video frames [default=1]");
SwitchParameter<> & argScreenshot = parameters.add<SwitchParameter<>> (0x0, "screenshot", "Take a single screenshot, save it to file and quit"); SwitchParameter<> & argScreenshot = parameters.add<SwitchParameter<>> (0x0, "screenshot", "Take a single screenshot, save it to file and quit");
DoubleParameter & argSignalThreshold = parameters.add<DoubleParameter> ('t', "signal-threshold", "The signal threshold for detecting the presence of a signal. Value should be between 0.0 and 1.0."); DoubleParameter & argSignalThreshold = parameters.add<DoubleParameter> ('t', "signal-threshold", "The signal threshold for detecting the presence of a signal. Value should be between 0.0 and 1.0.");
SwitchParameter<> & arg3DSBS = parameters.add<SwitchParameter<>> (0x0, "3DSBS", "Interpret the incoming video stream as 3D side-by-side");
SwitchParameter<> & arg3DTAB = parameters.add<SwitchParameter<>> (0x0, "3DTAB", "Interpret the incoming video stream as 3D top-and-bottom");
StringParameter & argAddress = parameters.add<StringParameter> ('a', "address", "Set the address of the hyperion server [default: 127.0.0.1:19445]"); StringParameter & argAddress = parameters.add<StringParameter> ('a', "address", "Set the address of the hyperion server [default: 127.0.0.1:19445]");
IntParameter & argPriority = parameters.add<IntParameter> ('p', "priority", "Use the provided priority channel (the lower the number, the higher the priority) [default: 800]"); IntParameter & argPriority = parameters.add<IntParameter> ('p', "priority", "Use the provided priority channel (the lower the number, the higher the priority) [default: 800]");
SwitchParameter<> & argSkipReply = parameters.add<SwitchParameter<>> (0x0, "skip-reply", "Do not receive and check reply messages from Hyperion"); SwitchParameter<> & argSkipReply = parameters.add<SwitchParameter<>> (0x0, "skip-reply", "Do not receive and check reply messages from Hyperion");
@ -88,21 +90,38 @@ int main(int argc, char** argv)
if (!argCropTop.isSet()) argCropTop.setDefault(argCropHeight.getValue()); if (!argCropTop.isSet()) argCropTop.setDefault(argCropHeight.getValue());
if (!argCropBottom.isSet()) argCropBottom.setDefault(argCropHeight.getValue()); if (!argCropBottom.isSet()) argCropBottom.setDefault(argCropHeight.getValue());
// initialize the grabber
V4L2Grabber grabber( V4L2Grabber grabber(
argDevice.getValue(), argDevice.getValue(),
argInput.getValue(), argInput.getValue(),
argVideoStandard.getValue(), argVideoStandard.getValue(),
argWidth.getValue(), argWidth.getValue(),
argHeight.getValue(), argHeight.getValue(),
std::max(0, argCropLeft.getValue()),
std::max(0, argCropRight.getValue()),
std::max(0, argCropTop.getValue()),
std::max(0, argCropBottom.getValue()),
std::max(1, argFrameDecimation.getValue()), std::max(1, argFrameDecimation.getValue()),
std::max(1, argSizeDecimation.getValue()), std::max(1, argSizeDecimation.getValue()),
std::max(1, argSizeDecimation.getValue())); std::max(1, argSizeDecimation.getValue()));
// set cropping values
grabber.setCropping(
std::max(0, argCropLeft.getValue()),
std::max(0, argCropRight.getValue()),
std::max(0, argCropTop.getValue()),
std::max(0, argCropBottom.getValue()));
// set 3D mode if applicable
if (arg3DSBS.isSet())
{
grabber.set3D(V4L2Grabber::MODE_3DSBS);
}
else if (arg3DTAB.isSet())
{
grabber.set3D(V4L2Grabber::MODE_3DTAB);
}
// start the grabber
grabber.start(); grabber.start();
// run the grabber
if (argScreenshot.isSet()) if (argScreenshot.isSet())
{ {
grabber.setCallback(&saveScreenshot, nullptr); grabber.setCallback(&saveScreenshot, nullptr);
@ -114,6 +133,8 @@ int main(int argc, char** argv)
grabber.setCallback(&ImageHandler::imageCallback, &handler); grabber.setCallback(&ImageHandler::imageCallback, &handler);
grabber.capture(); grabber.capture();
} }
// stop the grabber
grabber.stop(); grabber.stop();
} }
catch (const std::runtime_error & e) catch (const std::runtime_error & e)