This is an automatic generated email to let you know that the following patch were queued at the http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:
Subject: qv4l2: support the new transfer function field Author: Hans Verkuil <[email protected]> Date: Sat Jun 6 10:45:23 2015 +0200 Add support for the new transfer function field. Signed-off-by: Hans Verkuil <[email protected]> utils/qv4l2/capture-win-gl.cpp | 41 ++++++++++++++++++++++++--------------- utils/qv4l2/capture-win-gl.h | 7 ++++- utils/qv4l2/capture-win-qt.h | 3 +- utils/qv4l2/capture-win.cpp | 1 + utils/qv4l2/capture-win.h | 3 +- utils/qv4l2/general-tab.cpp | 35 ++++++++++++++++++++++++++++++++++ utils/qv4l2/general-tab.h | 3 ++ utils/qv4l2/qv4l2.cpp | 25 +++++++++++++++++++++++- utils/qv4l2/qv4l2.h | 4 +++ utils/qv4l2/tpg-tab.cpp | 15 ++++++++++++++ 10 files changed, 116 insertions(+), 21 deletions(-) --- http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=348c54b6ff089a13729b34ff7cbbbb6af0cf4420 diff --git a/utils/qv4l2/capture-win-gl.cpp b/utils/qv4l2/capture-win-gl.cpp index 790686a..6129dbd 100644 --- a/utils/qv4l2/capture-win-gl.cpp +++ b/utils/qv4l2/capture-win-gl.cpp @@ -92,10 +92,12 @@ bool CaptureWinGL::isSupported() #endif } -void CaptureWinGL::setColorspace(unsigned colorspace, unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) +void CaptureWinGL::setColorspace(unsigned colorspace, unsigned xfer_func, + unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) { #ifdef HAVE_QTGL - m_videoSurface.setColorspace(colorspace, ycbcr_enc, quantization, is_sdtv); + m_videoSurface.setColorspace(colorspace, xfer_func, + ycbcr_enc, quantization, is_sdtv); #endif } @@ -134,6 +136,7 @@ CaptureWinGLEngine::CaptureWinGLEngine() : m_WCrop(0), m_HCrop(0), m_colorspace(V4L2_COLORSPACE_REC709), + m_xfer_func(V4L2_XFER_FUNC_DEFAULT), m_ycbcr_enc(V4L2_YCBCR_ENC_DEFAULT), m_quantization(V4L2_QUANTIZATION_DEFAULT), m_is_sdtv(false), @@ -156,7 +159,8 @@ CaptureWinGLEngine::~CaptureWinGLEngine() clearShader(); } -void CaptureWinGLEngine::setColorspace(unsigned colorspace, unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) +void CaptureWinGLEngine::setColorspace(unsigned colorspace, unsigned xfer_func, + unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) { bool is_rgb = true; @@ -209,14 +213,18 @@ void CaptureWinGLEngine::setColorspace(unsigned colorspace, unsigned ycbcr_enc, colorspace = V4L2_COLORSPACE_REC709; break; } - if (m_colorspace == colorspace && m_ycbcr_enc == ycbcr_enc && - m_quantization == quantization && m_is_sdtv == is_sdtv) + if (m_colorspace == colorspace && m_xfer_func == xfer_func && + m_ycbcr_enc == ycbcr_enc && m_quantization == quantization && + m_is_sdtv == is_sdtv) return; m_colorspace = colorspace; + if (xfer_func == V4L2_XFER_FUNC_DEFAULT) + xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(colorspace); if (ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT) ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(colorspace); if (quantization == V4L2_QUANTIZATION_DEFAULT) quantization = V4L2_MAP_QUANTIZATION_DEFAULT(is_rgb, colorspace, ycbcr_enc); + m_xfer_func = xfer_func; m_ycbcr_enc = ycbcr_enc; m_quantization = quantization; m_is_sdtv = is_sdtv; @@ -654,7 +662,7 @@ QString CaptureWinGLEngine::codeRGBNormalize() { switch (m_quantization) { case V4L2_QUANTIZATION_FULL_RANGE: - return ""; + return ""; default: return QString(" r = (255.0 / 219.0) * (r - (16.0 / 255.0));" " g = (255.0 / 219.0) * (g - (16.0 / 255.0));" @@ -712,15 +720,15 @@ QString CaptureWinGLEngine::codeYUV2RGB() // colorspace. QString CaptureWinGLEngine::codeTransformToLinear() { - switch (m_colorspace) { - case V4L2_COLORSPACE_SMPTE240M: + switch (m_xfer_func) { + case V4L2_XFER_FUNC_SMPTE240M: // Old obsolete HDTV standard. Replaced by REC 709. // This is the transfer function for SMPTE 240M return QString(" r = (r < 0.0913) ? r / 4.0 : pow((r + 0.1115) / 1.1115, 1.0 / 0.45);" " g = (g < 0.0913) ? g / 4.0 : pow((g + 0.1115) / 1.1115, 1.0 / 0.45);" " b = (b < 0.0913) ? b / 4.0 : pow((b + 0.1115) / 1.1115, 1.0 / 0.45);" ); - case V4L2_COLORSPACE_SRGB: + case V4L2_XFER_FUNC_SRGB: // This is used for sRGB as specified by the IEC FDIS 61966-2-1 standard return QString(" r = (r < -0.04045) ? -pow((-r + 0.055) / 1.055, 2.4) : " " ((r <= 0.04045) ? r / 12.92 : pow((r + 0.055) / 1.055, 2.4));" @@ -729,12 +737,13 @@ QString CaptureWinGLEngine::codeTransformToLinear() " b = (b < -0.04045) ? -pow((-b + 0.055) / 1.055, 2.4) : " " ((b <= 0.04045) ? b / 12.92 : pow((b + 0.055) / 1.055, 2.4));" ); - case V4L2_COLORSPACE_ADOBERGB: + case V4L2_XFER_FUNC_ADOBERGB: return QString(" r = pow(r, 2.19921875);" " g = pow(g, 2.19921875);" " b = pow(b, 2.19921875);"); - case V4L2_COLORSPACE_REC709: - case V4L2_COLORSPACE_BT2020: + case V4L2_XFER_FUNC_NONE: + return ""; + case V4L2_XFER_FUNC_709: default: // All others use the transfer function specified by REC 709 return QString(" r = (r <= -0.081) ? -pow((r - 0.099) / -1.099, 1.0 / 0.45) : " @@ -799,7 +808,7 @@ QString CaptureWinGLEngine::codeColorspaceConversion() QString CaptureWinGLEngine::codeTransformToNonLinear() { switch (m_displayColorspace) { - case 0: // Keep as linear RGB + case V4L2_COLORSPACE_DEFAULT: // Keep as linear RGB return ""; case V4L2_COLORSPACE_SMPTE240M: @@ -1456,7 +1465,7 @@ void CaptureWinGLEngine::shader_RGB(__u32 format) configureTexture(0); manualTransform = m_quantization == V4L2_QUANTIZATION_LIM_RANGE || - m_colorspace != V4L2_COLORSPACE_SRGB || + m_xfer_func != V4L2_XFER_FUNC_SRGB || format == V4L2_PIX_FMT_BGR666; GLint internalFmt = manualTransform ? GL_RGBA8 : GL_SRGB8_ALPHA8; @@ -1698,7 +1707,7 @@ void CaptureWinGLEngine::shader_Bayer(__u32 format) configureTexture(0); GLint internalFmt = (m_quantization == V4L2_QUANTIZATION_LIM_RANGE || - m_colorspace != V4L2_COLORSPACE_SRGB) ? + m_xfer_func != V4L2_XFER_FUNC_SRGB) ? GL_LUMINANCE : GL_SLUMINANCE; switch (format) { @@ -1764,7 +1773,7 @@ void CaptureWinGLEngine::shader_Bayer(__u32 format) if (m_quantization == V4L2_QUANTIZATION_LIM_RANGE) codeTail += codeRGBNormalize(); if (m_quantization == V4L2_QUANTIZATION_LIM_RANGE || - m_colorspace != V4L2_COLORSPACE_SRGB) + m_xfer_func != V4L2_XFER_FUNC_SRGB) codeTail += codeTransformToLinear(); codeTail += codeColorspaceConversion() + diff --git a/utils/qv4l2/capture-win-gl.h b/utils/qv4l2/capture-win-gl.h index 49e16c9..53e58eb 100644 --- a/utils/qv4l2/capture-win-gl.h +++ b/utils/qv4l2/capture-win-gl.h @@ -47,7 +47,8 @@ public: unsigned char *data3); bool hasNativeFormat(__u32 format); void lockSize(QSize size); - void setColorspace(unsigned colorspace, unsigned ycbcr_enc, unsigned quantization, bool is_sdtv); + void setColorspace(unsigned colorspace, unsigned xfer_func, + unsigned ycbcr_enc, unsigned quantization, bool is_sdtv); void setDisplayColorspace(unsigned colorspace); void setField(unsigned field); void setBlending(bool enable) { m_blending = enable; } @@ -101,6 +102,7 @@ private: int m_WCrop; int m_HCrop; unsigned m_colorspace; + unsigned m_xfer_func; unsigned m_ycbcr_enc; unsigned m_quantization; bool m_is_sdtv; @@ -132,7 +134,8 @@ public: void stop(); bool hasNativeFormat(__u32 format); static bool isSupported(); - void setColorspace(unsigned colorspace, unsigned ycbcr_enc, unsigned quantization, bool is_sdtv); + void setColorspace(unsigned colorspace, unsigned xfer_func, + unsigned ycbcr_enc, unsigned quantization, bool is_sdtv); void setField(unsigned field); void setDisplayColorspace(unsigned colorspace); void setBlending(bool enable); diff --git a/utils/qv4l2/capture-win-qt.h b/utils/qv4l2/capture-win-qt.h index f99245d..55294cb 100644 --- a/utils/qv4l2/capture-win-qt.h +++ b/utils/qv4l2/capture-win-qt.h @@ -36,7 +36,8 @@ public: void stop(); bool hasNativeFormat(__u32 format); static bool isSupported() { return true; } - void setColorspace(unsigned colorspace, unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) {} + void setColorspace(unsigned colorspace, unsigned xfer_func, + unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) {} void setField(unsigned field) {} void setDisplayColorspace(unsigned colorspace) {} void setBlending(bool enable) {} diff --git a/utils/qv4l2/capture-win.cpp b/utils/qv4l2/capture-win.cpp index 8e2bb36..1cf8e44 100644 --- a/utils/qv4l2/capture-win.cpp +++ b/utils/qv4l2/capture-win.cpp @@ -351,6 +351,7 @@ void CaptureWin::customMenuRequested(QPoint pos) menu->addAction(m_appWin->m_snapshotAct); menu->addAction(m_appWin->m_showFramesAct); menu->addMenu(m_appWin->m_overrideColorspaceMenu); + menu->addMenu(m_appWin->m_overrideXferFuncMenu); menu->addMenu(m_appWin->m_overrideYCbCrEncMenu); menu->addMenu(m_appWin->m_overrideQuantizationMenu); menu->addMenu(m_appWin->m_displayColorspaceMenu); diff --git a/utils/qv4l2/capture-win.h b/utils/qv4l2/capture-win.h index dda5393..fcf61b3 100644 --- a/utils/qv4l2/capture-win.h +++ b/utils/qv4l2/capture-win.h @@ -69,7 +69,8 @@ public: void setPixelAspectRatio(double ratio); float getHorScaleFactor(); float getVertScaleFactor(); - virtual void setColorspace(unsigned colorspace, unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) = 0; + virtual void setColorspace(unsigned colorspace, unsigned xfer_func, + unsigned ycbcr_enc, unsigned quantization, bool is_sdtv) = 0; virtual void setField(unsigned field) = 0; virtual void setDisplayColorspace(unsigned colorspace) = 0; virtual void setBlending(bool enable) = 0; diff --git a/utils/qv4l2/general-tab.cpp b/utils/qv4l2/general-tab.cpp index 13facc5..90cb6ea 100644 --- a/utils/qv4l2/general-tab.cpp +++ b/utils/qv4l2/general-tab.cpp @@ -85,6 +85,7 @@ GeneralTab::GeneralTab(const QString &device, cv4l_fd *fd, int n, QWidget *paren m_videoTimings(NULL), m_pixelAspectRatio(NULL), m_colorspace(NULL), + m_xferFunc(NULL), m_ycbcrEnc(NULL), m_quantRange(NULL), m_cropping(NULL), @@ -755,6 +756,18 @@ void GeneralTab::formatSection(v4l2_fmtdesc fmt) addWidget(m_colorspace); connect(m_colorspace, SIGNAL(activated(int)), SLOT(colorspaceChanged(int))); + m_xferFunc = new QComboBox(parentWidget()); + m_xferFunc->addItem(m_isOutput ? "Default" : "Autodetect", QVariant(V4L2_XFER_FUNC_DEFAULT)); + m_xferFunc->addItem("Rec. 709", QVariant(V4L2_XFER_FUNC_709)); + m_xferFunc->addItem("sRGB", QVariant(V4L2_XFER_FUNC_SRGB)); + m_xferFunc->addItem("Adobe RGB", QVariant(V4L2_XFER_FUNC_ADOBERGB)); + m_xferFunc->addItem("SMPTE 240M", QVariant(V4L2_XFER_FUNC_SMPTE240M)); + m_xferFunc->addItem("None", QVariant(V4L2_XFER_FUNC_NONE)); + + addLabel("Transfer Function"); + addWidget(m_xferFunc); + connect(m_xferFunc, SIGNAL(activated(int)), SLOT(xferFuncChanged(int))); + m_ycbcrEnc = new QComboBox(parentWidget()); m_ycbcrEnc->addItem(m_isOutput ? "Default" : "Autodetect", QVariant(V4L2_YCBCR_ENC_DEFAULT)); m_ycbcrEnc->addItem("ITU-R 601", QVariant(V4L2_YCBCR_ENC_601)); @@ -1369,6 +1382,21 @@ void GeneralTab::colorspaceChanged(int idx) g_fmt(fmt); fmt.s_colorspace(m_colorspace->itemData(idx).toInt()); + fmt.s_xfer_func(m_xferFunc->itemData(m_xferFunc->currentIndex()).toInt()); + fmt.s_ycbcr_enc(m_ycbcrEnc->itemData(m_ycbcrEnc->currentIndex()).toInt()); + fmt.s_quantization(m_quantRange->itemData(m_quantRange->currentIndex()).toInt()); + if (try_fmt(fmt) == 0) + s_fmt(fmt); + updateVidFormat(); +} + +void GeneralTab::xferFuncChanged(int idx) +{ + cv4l_fmt fmt; + + g_fmt(fmt); + fmt.s_colorspace(m_colorspace->itemData(m_colorspace->currentIndex()).toInt()); + fmt.s_xfer_func(m_xferFunc->itemData(idx).toInt()); fmt.s_ycbcr_enc(m_ycbcrEnc->itemData(m_ycbcrEnc->currentIndex()).toInt()); fmt.s_quantization(m_quantRange->itemData(m_quantRange->currentIndex()).toInt()); if (try_fmt(fmt) == 0) @@ -1382,6 +1410,7 @@ void GeneralTab::ycbcrEncChanged(int idx) g_fmt(fmt); fmt.s_colorspace(m_colorspace->itemData(m_colorspace->currentIndex()).toInt()); + fmt.s_xfer_func(m_xferFunc->itemData(m_xferFunc->currentIndex()).toInt()); fmt.s_ycbcr_enc(m_ycbcrEnc->itemData(idx).toInt()); fmt.s_quantization(m_quantRange->itemData(m_quantRange->currentIndex()).toInt()); if (try_fmt(fmt) == 0) @@ -1395,6 +1424,7 @@ void GeneralTab::quantRangeChanged(int idx) g_fmt(fmt); fmt.s_colorspace(m_colorspace->itemData(m_colorspace->currentIndex()).toInt()); + fmt.s_xfer_func(m_xferFunc->itemData(m_xferFunc->currentIndex()).toInt()); fmt.s_ycbcr_enc(m_ycbcrEnc->itemData(m_ycbcrEnc->currentIndex()).toInt()); fmt.s_quantization(m_quantRange->itemData(idx).toInt()); if (try_fmt(fmt) == 0) @@ -1406,6 +1436,8 @@ void GeneralTab::clearColorspace(cv4l_fmt &fmt) { if (m_colorspace->currentIndex() == 0) fmt.s_colorspace(V4L2_COLORSPACE_DEFAULT); + if (m_xferFunc->currentIndex() == 0) + fmt.s_xfer_func(V4L2_XFER_FUNC_DEFAULT); if (m_ycbcrEnc->currentIndex() == 0) fmt.s_ycbcr_enc(V4L2_YCBCR_ENC_DEFAULT); if (m_quantRange->currentIndex() == 0) @@ -1917,6 +1949,9 @@ void GeneralTab::updateColorspace() idx = m_colorspace->findData(fmt.g_colorspace()); if (m_colorspace->currentIndex()) m_colorspace->setCurrentIndex(idx >= 0 ? idx : 0); + idx = m_xferFunc->findData(fmt.g_xfer_func()); + if (m_xferFunc->currentIndex()) + m_xferFunc->setCurrentIndex(idx >= 0 ? idx : 0); idx = m_ycbcrEnc->findData(fmt.g_ycbcr_enc()); if (m_ycbcrEnc->currentIndex()) m_ycbcrEnc->setCurrentIndex(idx >= 0 ? idx : 0); diff --git a/utils/qv4l2/general-tab.h b/utils/qv4l2/general-tab.h index a69b8e9..55ffa18 100644 --- a/utils/qv4l2/general-tab.h +++ b/utils/qv4l2/general-tab.h @@ -88,6 +88,7 @@ public: int getWidth(); unsigned getNumBuffers() const; QComboBox *m_tpgComboColorspace; + QComboBox *m_tpgComboXferFunc; QComboBox *m_tpgComboYCbCrEnc; QComboBox *m_tpgComboQuantRange; @@ -127,6 +128,7 @@ private slots: void cropChanged(); void composeChanged(); void colorspaceChanged(int); + void xferFuncChanged(int); void ycbcrEncChanged(int); void quantRangeChanged(int); @@ -336,6 +338,7 @@ private: QComboBox *m_videoTimings; QComboBox *m_pixelAspectRatio; QComboBox *m_colorspace; + QComboBox *m_xferFunc; QComboBox *m_ycbcrEnc; QComboBox *m_quantRange; QComboBox *m_cropping; diff --git a/utils/qv4l2/qv4l2.cpp b/utils/qv4l2/qv4l2.cpp index bce31e5..7877473 100644 --- a/utils/qv4l2/qv4l2.cpp +++ b/utils/qv4l2/qv4l2.cpp @@ -94,6 +94,7 @@ ApplicationWindow::ApplicationWindow() : m_makeSnapshot = false; m_singleStep = false; m_tpgColorspace = 0; + m_tpgXferFunc = 0; m_tpgYCbCrEnc = 0; m_tpgQuantRange = 0; m_tpgLimRGBRange = NULL; @@ -196,6 +197,18 @@ ApplicationWindow::ApplicationWindow() : addSubMenuItem(grp, menu, "470 System BG", V4L2_COLORSPACE_470_SYSTEM_BG); connect(grp, SIGNAL(triggered(QAction *)), this, SLOT(overrideColorspaceChanged(QAction *))); + m_overrideXferFunc = -1; + menu = new QMenu("Override Transfer Function"); + m_overrideXferFuncMenu = menu; + grp = new QActionGroup(menu); + addSubMenuItem(grp, menu, "No Override", -1)->setChecked(true); + addSubMenuItem(grp, menu, "Rec. 709", V4L2_XFER_FUNC_709); + addSubMenuItem(grp, menu, "sRGB", V4L2_XFER_FUNC_SRGB); + addSubMenuItem(grp, menu, "Adobe RGB", V4L2_XFER_FUNC_ADOBERGB); + addSubMenuItem(grp, menu, "SMPTE 240M", V4L2_XFER_FUNC_SMPTE240M); + addSubMenuItem(grp, menu, "None", V4L2_XFER_FUNC_NONE); + connect(grp, SIGNAL(triggered(QAction *)), this, SLOT(overrideXferFuncChanged(QAction *))); + m_overrideYCbCrEnc = -1; menu = new QMenu("Override Y'CbCr Encoding"); m_overrideYCbCrEncMenu = menu; @@ -235,6 +248,7 @@ ApplicationWindow::ApplicationWindow() : m_capMenu->addAction(m_capStartAct); m_capMenu->addAction(m_capStepAct); m_capMenu->addMenu(m_overrideColorspaceMenu); + m_capMenu->addMenu(m_overrideXferFuncMenu); m_capMenu->addMenu(m_overrideYCbCrEncMenu); m_capMenu->addMenu(m_overrideQuantizationMenu); m_capMenu->addMenu(m_displayColorspaceMenu); @@ -311,6 +325,7 @@ void ApplicationWindow::updateColorspace() return; int colorspace = m_overrideColorspace; + int xferFunc = m_overrideXferFunc; int ycbcrEnc = m_overrideYCbCrEnc; int quantRange = m_overrideQuantization; cv4l_fmt fmt; @@ -321,11 +336,13 @@ void ApplicationWindow::updateColorspace() if (colorspace == -1) colorspace = fmt.g_colorspace(); + if (xferFunc == -1) + xferFunc = fmt.g_xfer_func(); if (ycbcrEnc == -1) ycbcrEnc = fmt.g_ycbcr_enc(); if (quantRange == -1) quantRange = fmt.g_quantization(); - m_capture->setColorspace(colorspace, ycbcrEnc, quantRange, + m_capture->setColorspace(colorspace, xferFunc, ycbcrEnc, quantRange, m_genTab ? m_genTab->isSDTV() : true); } @@ -335,6 +352,12 @@ void ApplicationWindow::overrideColorspaceChanged(QAction *a) updateColorspace(); } +void ApplicationWindow::overrideXferFuncChanged(QAction *a) +{ + m_overrideXferFunc = a->data().toInt(); + updateColorspace(); +} + void ApplicationWindow::overrideYCbCrEncChanged(QAction *a) { m_overrideYCbCrEnc = a->data().toInt(); diff --git a/utils/qv4l2/qv4l2.h b/utils/qv4l2/qv4l2.h index e2e088b..3ee490d 100644 --- a/utils/qv4l2/qv4l2.h +++ b/utils/qv4l2/qv4l2.h @@ -127,6 +127,7 @@ private: bool m_singleStep; RenderMethod m_renderMethod; int m_overrideColorspace; + int m_overrideXferFunc; int m_overrideYCbCrEnc; int m_overrideQuantization; int m_displayColorspace; @@ -164,6 +165,7 @@ private slots: void clearBuffers(); void about(); void overrideColorspaceChanged(QAction *a); + void overrideXferFuncChanged(QAction *a); void overrideYCbCrEncChanged(QAction *a); void overrideQuantChanged(QAction *a); void displayColorspaceChanged(QAction *a); @@ -201,6 +203,7 @@ public: QAction *m_snapshotAct; QAction *m_showFramesAct; QMenu *m_overrideColorspaceMenu; + QMenu *m_overrideXferFuncMenu; QMenu *m_overrideYCbCrEncMenu; QMenu *m_overrideQuantizationMenu; QMenu *m_displayColorspaceMenu; @@ -248,6 +251,7 @@ private: bool m_tpgFieldAlt; unsigned m_tpgSizeImage; QComboBox *m_tpgColorspace; + QComboBox *m_tpgXferFunc; QComboBox *m_tpgYCbCrEnc; QComboBox *m_tpgQuantRange; bool m_useTpg; diff --git a/utils/qv4l2/tpg-tab.cpp b/utils/qv4l2/tpg-tab.cpp index 1bc07a9..7da5ce3 100644 --- a/utils/qv4l2/tpg-tab.cpp +++ b/utils/qv4l2/tpg-tab.cpp @@ -163,6 +163,17 @@ void ApplicationWindow::addTpgTab(int m_winWidth) addWidget(grid, m_tpgColorspace); connect(m_tpgColorspace, SIGNAL(activated(int)), SLOT(tpgColorspaceChanged())); + addLabel(grid, "Transfer Function"); + m_tpgXferFunc = new QComboBox(w); + m_tpgXferFunc->addItem("Use Format", QVariant(V4L2_XFER_FUNC_DEFAULT)); + m_tpgXferFunc->addItem("Rec. 709", QVariant(V4L2_XFER_FUNC_709)); + m_tpgXferFunc->addItem("sRGB", QVariant(V4L2_XFER_FUNC_SRGB)); + m_tpgXferFunc->addItem("Adobe RGB", QVariant(V4L2_XFER_FUNC_ADOBERGB)); + m_tpgXferFunc->addItem("SMPTE 240M", QVariant(V4L2_XFER_FUNC_SMPTE240M)); + m_tpgXferFunc->addItem("None", QVariant(V4L2_XFER_FUNC_NONE)); + addWidget(grid, m_tpgXferFunc); + connect(m_tpgXferFunc, SIGNAL(activated(int)), SLOT(tpgXferFuncChanged())); + addLabel(grid, "Y'CbCr Encoding"); m_tpgYCbCrEnc = new QComboBox(w); m_tpgYCbCrEnc->addItem("Use Format", QVariant(V4L2_YCBCR_ENC_DEFAULT)); @@ -326,6 +337,7 @@ void ApplicationWindow::tpgColorspaceChanged() { cv4l_fmt fmt; int colorspace = combo2int(m_tpgColorspace); + int xferFunc = combo2int(m_tpgXferFunc); int ycbcrEnc = combo2int(m_tpgYCbCrEnc); int quantization = combo2int(m_tpgQuantRange); @@ -334,11 +346,14 @@ void ApplicationWindow::tpgColorspaceChanged() colorspace = fmt.g_colorspace(); if (colorspace == V4L2_COLORSPACE_DEFAULT) colorspace = tpgDefaultColorspace(); + if (xferFunc == V4L2_XFER_FUNC_DEFAULT) + xferFunc = fmt.g_xfer_func(); if (ycbcrEnc == V4L2_YCBCR_ENC_DEFAULT) ycbcrEnc = fmt.g_ycbcr_enc(); if (quantization == V4L2_QUANTIZATION_DEFAULT) quantization = fmt.g_quantization(); tpg_s_colorspace(&m_tpg, colorspace); + tpg_s_xfer_func(&m_tpg, xferFunc); tpg_s_ycbcr_enc(&m_tpg, ycbcrEnc); tpg_s_quantization(&m_tpg, quantization); } _______________________________________________ linuxtv-commits mailing list [email protected] http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits
