diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-05-10 00:15:59 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-05-10 00:16:41 +0400 |
commit | 55b1456f50f0cb0e74be8d7faec76a09eb27e829 (patch) | |
tree | baa8a892bb0cace871c8d0bcf56872541b633b0f /decoder | |
parent | 58b8f3dca465f66372d7354e251c1468bc81d29f (diff) |
RGB48 output support
Support for native output of RGB48, however disabled by default.
Diffstat (limited to 'decoder')
-rw-r--r-- | decoder/LAVVideo/LAVPixFmtConverter.cpp | 36 | ||||
-rw-r--r-- | decoder/LAVVideo/LAVVideo.cpp | 3 | ||||
-rw-r--r-- | decoder/LAVVideo/LAVVideo.rc | 1 | ||||
-rw-r--r-- | decoder/LAVVideo/LAVVideoSettings.h | 2 | ||||
-rw-r--r-- | decoder/LAVVideo/VideoSettingsProp.cpp | 7 | ||||
-rw-r--r-- | decoder/LAVVideo/pixconv/convert_generic.cpp | 3 | ||||
-rw-r--r-- | decoder/LAVVideo/resource.h | 1 |
7 files changed, 35 insertions, 18 deletions
diff --git a/decoder/LAVVideo/LAVPixFmtConverter.cpp b/decoder/LAVVideo/LAVPixFmtConverter.cpp index 7dc459df..4003bf9c 100644 --- a/decoder/LAVVideo/LAVPixFmtConverter.cpp +++ b/decoder/LAVVideo/LAVPixFmtConverter.cpp @@ -69,37 +69,38 @@ typedef struct { #define PIXOUT_420_16 LAVOutPixFmt_P016 #define PIXOUT_422_16 LAVOutPixFmt_P216 #define PIXOUT_444_16 LAVOutPixFmt_Y416 +#define PIXOUT_RGB_16 LAVOutPixFmt_RGB48 static LAV_INOUT_PIXFMT_MAP lav_pixfmt_map[] = { // Default - { LAVPixFmt_None, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, + { LAVPixFmt_None, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, // 4:2:0 - { LAVPixFmt_YUV420, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, - { LAVPixFmt_NV12, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, + { LAVPixFmt_YUV420, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, + { LAVPixFmt_NV12, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, - { LAVPixFmt_YUV420bX, 10, { PIXOUT_420_10, PIXOUT_420_16, PIXOUT_420_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, - { LAVPixFmt_YUV420bX, 16, { PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, + { LAVPixFmt_YUV420bX, 10, { PIXOUT_420_10, PIXOUT_420_16, PIXOUT_420_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, + { LAVPixFmt_YUV420bX, 16, { PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, // 4:2:2 - { LAVPixFmt_YUV422, 8, { PIXOUT_422_8, PIXOUT_422_10, PIXOUT_422_16, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_YUY2, 8, { PIXOUT_422_8, PIXOUT_422_10, PIXOUT_422_16, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUV422, 8, { PIXOUT_422_8, PIXOUT_422_10, PIXOUT_422_16, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUY2, 8, { PIXOUT_422_8, PIXOUT_422_10, PIXOUT_422_16, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_YUV422bX, 10, { PIXOUT_422_10, PIXOUT_422_16, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_YUV422bX, 16, { PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUV422bX, 10, { PIXOUT_422_10, PIXOUT_422_16, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUV422bX, 16, { PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, // 4:4:4 - { LAVPixFmt_YUV444, 8, { PIXOUT_444_8, PIXOUT_444_10, PIXOUT_444_16, PIXOUT_RGB_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_YUV444bX, 10, { PIXOUT_444_10, PIXOUT_444_16, PIXOUT_444_8, PIXOUT_RGB_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_YUV444bX, 16, { PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_RGB_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUV444, 8, { PIXOUT_444_8, PIXOUT_444_10, PIXOUT_444_16, PIXOUT_RGB_16, PIXOUT_RGB_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUV444bX, 10, { PIXOUT_444_10, PIXOUT_444_16, PIXOUT_444_8, PIXOUT_RGB_16, PIXOUT_RGB_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_YUV444bX, 16, { PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_RGB_16, PIXOUT_RGB_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, // RGB - { LAVPixFmt_RGB24, 8, { LAVOutPixFmt_RGB24, LAVOutPixFmt_RGB32, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_RGB32, 8, { PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_ARGB32, 8, { PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_RGB48, 8, { PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_RGB24, 8, { LAVOutPixFmt_RGB24, LAVOutPixFmt_RGB32, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_RGB32, 8, { PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_ARGB32, 8, { PIXOUT_RGB_8, PIXOUT_RGB_16, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, + { LAVPixFmt_RGB48, 8, { PIXOUT_RGB_16, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_420_16, PIXOUT_420_10, PIXOUT_420_8 } }, - { LAVPixFmt_DXVA2, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8 } }, + { LAVPixFmt_DXVA2, 8, { PIXOUT_420_8, PIXOUT_420_10, PIXOUT_420_16, PIXOUT_422_16, PIXOUT_422_10, PIXOUT_422_8, PIXOUT_RGB_8, PIXOUT_444_16, PIXOUT_444_10, PIXOUT_444_8, PIXOUT_RGB_16 } }, }; LAVOutPixFmtDesc lav_pixfmt_desc[] = { @@ -120,6 +121,7 @@ LAVOutPixFmtDesc lav_pixfmt_desc[] = { { FOURCCMap('014v'), 32, 4, 0, { 1 }, { 1 } }, // v410 (packed) { MEDIASUBTYPE_YV16, 16, 1, 3, { 1, 1, 1 }, { 1, 2, 2 } }, // YV16 { MEDIASUBTYPE_YV24, 24, 1, 3, { 1, 1, 1 }, { 1, 1, 1 } }, // YV24 + { FOURCCMap('0BGR'), 48, 6, 0, { 1 }, { 1 } }, // RGB48 }; static LAV_INOUT_PIXFMT_MAP *lookupFormatMap(LAVPixelFormat informat, int bpp, BOOL bFallbackToDefault = TRUE) diff --git a/decoder/LAVVideo/LAVVideo.cpp b/decoder/LAVVideo/LAVVideo.cpp index 600d4afe..d717d1be 100644 --- a/decoder/LAVVideo/LAVVideo.cpp +++ b/decoder/LAVVideo/LAVVideo.cpp @@ -194,6 +194,7 @@ HRESULT CLAVVideo::LoadDefaults() m_settings.bPixFmts[LAVOutPixFmt_YV16] = FALSE; m_settings.bPixFmts[LAVOutPixFmt_AYUV] = FALSE; + m_settings.bPixFmts[LAVOutPixFmt_RGB48] = FALSE; m_settings.HWAccel = HWAccel_None; for (int i = 0; i < HWCodec_NB; ++i) @@ -216,7 +217,7 @@ HRESULT CLAVVideo::LoadDefaults() } static const WCHAR* pixFmtSettingsMap[LAVOutPixFmt_NB] = { - L"yv12", L"nv12", L"yuy2", L"uyvy", L"ayuv", L"p010", L"p210", L"y410", L"p016", L"p216", L"y416", L"rgb32", L"rgb24", L"v210", L"v410", L"yv16", L"yv24" + L"yv12", L"nv12", L"yuy2", L"uyvy", L"ayuv", L"p010", L"p210", L"y410", L"p016", L"p216", L"y416", L"rgb32", L"rgb24", L"v210", L"v410", L"yv16", L"yv24", L"rgb48" }; HRESULT CLAVVideo::LoadSettings() diff --git a/decoder/LAVVideo/LAVVideo.rc b/decoder/LAVVideo/LAVVideo.rc index c80813b2..88574eb8 100644 --- a/decoder/LAVVideo/LAVVideo.rc +++ b/decoder/LAVVideo/LAVVideo.rc @@ -100,6 +100,7 @@ BEGIN LTEXT "RGB",IDC_OUT_RGB,14,167,20,8 CONTROL "RGB32",IDC_OUT_RGB32,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,167,40,10 CONTROL "RGB24",IDC_OUT_RGB24,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,78,167,40,10 + CONTROL "RGB48",IDC_OUT_RGB48,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,191,167,40,10 LTEXT "RGB Output levels (for YUV -> RGB conversion)",IDC_LBL_RGBOUT,14,183,188,8 CONTROL "TV (16-235)",IDC_RGBOUT_TV,"Button",BS_AUTORADIOBUTTON,19,194,50,10 CONTROL "PC (0-255)",IDC_RGBOUT_PC,"Button",BS_AUTORADIOBUTTON,71,194,46,10 diff --git a/decoder/LAVVideo/LAVVideoSettings.h b/decoder/LAVVideo/LAVVideoSettings.h index 54ea1084..804d27a3 100644 --- a/decoder/LAVVideo/LAVVideoSettings.h +++ b/decoder/LAVVideo/LAVVideoSettings.h @@ -167,6 +167,8 @@ typedef enum LAVOutPixFmts { LAVOutPixFmt_YV16, // 4:2:2, 8-bit, planar LAVOutPixFmt_YV24, // 4:4:4, 8-bit, planar + LAVOutPixFmt_RGB48, // 48-bit RGB (16-bit per pixel, BGR) + LAVOutPixFmt_NB // Number of formats } LAVOutPixFmts; diff --git a/decoder/LAVVideo/VideoSettingsProp.cpp b/decoder/LAVVideo/VideoSettingsProp.cpp index ab6ce2aa..e3c91dab 100644 --- a/decoder/LAVVideo/VideoSettingsProp.cpp +++ b/decoder/LAVVideo/VideoSettingsProp.cpp @@ -93,6 +93,7 @@ HRESULT CLAVVideoSettingsProp::OnApplyChanges() m_bPixFmts[LAVOutPixFmt_Y416] = (BOOL)SendDlgItemMessage(m_Dlg, IDC_OUT_Y416, BM_GETCHECK,0, 0); m_bPixFmts[LAVOutPixFmt_RGB32] = (BOOL)SendDlgItemMessage(m_Dlg, IDC_OUT_RGB32, BM_GETCHECK,0, 0); m_bPixFmts[LAVOutPixFmt_RGB24] = (BOOL)SendDlgItemMessage(m_Dlg, IDC_OUT_RGB24, BM_GETCHECK,0, 0); + m_bPixFmts[LAVOutPixFmt_RGB48] = (BOOL)SendDlgItemMessage(m_Dlg, IDC_OUT_RGB48, BM_GETCHECK,0, 0); for (int i = 0; i < LAVOutPixFmt_NB; ++i) { m_pVideoSettings->SetPixelFormat((LAVOutPixFmts)i, m_bPixFmts[i]); @@ -264,6 +265,7 @@ HRESULT CLAVVideoSettingsProp::OnActivate() SendDlgItemMessage(m_Dlg, IDC_OUT_Y416, BM_SETCHECK, m_bPixFmts[LAVOutPixFmt_Y416], 0); SendDlgItemMessage(m_Dlg, IDC_OUT_RGB32, BM_SETCHECK, m_bPixFmts[LAVOutPixFmt_RGB32], 0); SendDlgItemMessage(m_Dlg, IDC_OUT_RGB24, BM_SETCHECK, m_bPixFmts[LAVOutPixFmt_RGB24], 0); + SendDlgItemMessage(m_Dlg, IDC_OUT_RGB48, BM_SETCHECK, m_bPixFmts[LAVOutPixFmt_RGB48], 0); SendDlgItemMessage(m_Dlg, IDC_RGBOUT_AUTO, BM_SETCHECK, (m_dwRGBOutput == 0), 0); SendDlgItemMessage(m_Dlg, IDC_RGBOUT_TV, BM_SETCHECK, (m_dwRGBOutput == 1), 0); @@ -497,6 +499,11 @@ INT_PTR CLAVVideoSettingsProp::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wPa if (bValue != m_bPixFmts[LAVOutPixFmt_RGB24]) { SetDirty(); } + } else if (LOWORD(wParam) == IDC_OUT_RGB48 && HIWORD(wParam) == BN_CLICKED) { + bValue = (BOOL)SendDlgItemMessage(m_Dlg, LOWORD(wParam), BM_GETCHECK, 0, 0); + if (bValue != m_bPixFmts[LAVOutPixFmt_RGB48]) { + SetDirty(); + } } else if (LOWORD(wParam) == IDC_RGBOUT_AUTO && HIWORD(wParam) == BN_CLICKED) { lValue = SendDlgItemMessage(m_Dlg, LOWORD(wParam), BM_GETCHECK, 0, 0); if (lValue != (m_dwRGBOutput == 0)) { diff --git a/decoder/LAVVideo/pixconv/convert_generic.cpp b/decoder/LAVVideo/pixconv/convert_generic.cpp index 5801c3c3..96c38051 100644 --- a/decoder/LAVVideo/pixconv/convert_generic.cpp +++ b/decoder/LAVVideo/pixconv/convert_generic.cpp @@ -84,6 +84,9 @@ DECLARE_CONV_FUNC_IMPL(convert_generic) case LAVOutPixFmt_YV24: hr = swscale_scale(inputFmt, AV_PIX_FMT_YUV444P, src, srcStride, dst, width, height, dstStride, lav_pixfmt_desc[m_OutputPixFmt], true); break; + case LAVOutPixFmt_RGB48: + hr = swscale_scale(inputFmt, AV_PIX_FMT_RGB48LE, src, srcStride, dst, width, height, dstStride * 6, lav_pixfmt_desc[m_OutputPixFmt], true); + break; default: ASSERT(0); hr = E_FAIL; diff --git a/decoder/LAVVideo/resource.h b/decoder/LAVVideo/resource.h index 9fa970e3..8e23a996 100644 --- a/decoder/LAVVideo/resource.h +++ b/decoder/LAVVideo/resource.h @@ -41,6 +41,7 @@ #define IDC_OUT_10BIT 1026 #define IDC_OUT_16BIT 1027 #define IDC_OUT_UYVY 1028 +#define IDC_OUT_RGB48 1029 #define IDC_LBL_RGBOUT 1030 #define IDC_RGBOUT_AUTO 1031 #define IDC_RGBOUT_TV 1032 |