Zebediah Figura : wincodecs: Add encoder options for JPEG.
Alexandre Julliard
julliard at winehq.org
Mon Jul 31 15:06:29 CDT 2017
Module: wine
Branch: master
Commit: 8648aaf86d6417950e8e0501e53edacfbb6461a2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8648aaf86d6417950e8e0501e53edacfbb6461a2
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Fri Jul 28 14:41:13 2017 -0500
wincodecs: Add encoder options for JPEG.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/windowscodecs/jpegformat.c | 29 ++++++++++++++++++++++++++++-
dlls/windowscodecs/tests/converter.c | 28 ++++++++++++++++++++++++++++
include/wincodec.idl | 8 ++++++++
3 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/dlls/windowscodecs/jpegformat.c b/dlls/windowscodecs/jpegformat.c
index acc262e..014620f 100644
--- a/dlls/windowscodecs/jpegformat.c
+++ b/dlls/windowscodecs/jpegformat.c
@@ -60,6 +60,13 @@ WINE_DECLARE_DEBUG_CHANNEL(jpeg);
static void *libjpeg_handle;
+static const WCHAR wszImageQuality[] = {'I','m','a','g','e','Q','u','a','l','i','t','y',0};
+static const WCHAR wszBitmapTransform[] = {'B','i','t','m','a','p','T','r','a','n','s','f','o','r','m',0};
+static const WCHAR wszLuminance[] = {'L','u','m','i','n','a','n','c','e',0};
+static const WCHAR wszChrominance[] = {'C','h','r','o','m','i','n','a','n','c','e',0};
+static const WCHAR wszJpegYCrCbSubsampling[] = {'J','p','e','g','Y','C','r','C','b','S','u','b','s','a','m','p','l','i','n','g',0};
+static const WCHAR wszSuppressApp0[] = {'S','u','p','p','r','e','s','s','A','p','p','0',0};
+
#define MAKE_FUNCPTR(f) static typeof(f) * p##f
MAKE_FUNCPTR(jpeg_CreateCompress);
MAKE_FUNCPTR(jpeg_CreateDecompress);
@@ -1407,6 +1414,7 @@ static HRESULT WINAPI JpegEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
{
JpegEncoder *This = impl_from_IWICBitmapEncoder(iface);
HRESULT hr;
+ PROPBAG2 opts[6] = {{0}};
TRACE("(%p,%p,%p)\n", iface, ppIFrameEncode, ppIEncoderOptions);
@@ -1424,7 +1432,26 @@ static HRESULT WINAPI JpegEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
return WINCODEC_ERR_NOTINITIALIZED;
}
- hr = CreatePropertyBag2(NULL, 0, ppIEncoderOptions);
+ opts[0].pstrName = (LPOLESTR)wszImageQuality;
+ opts[0].vt = VT_R4;
+ opts[0].dwType = PROPBAG2_TYPE_DATA;
+ opts[1].pstrName = (LPOLESTR)wszBitmapTransform;
+ opts[1].vt = VT_UI1;
+ opts[1].dwType = PROPBAG2_TYPE_DATA;
+ opts[2].pstrName = (LPOLESTR)wszLuminance;
+ opts[2].vt = VT_I4|VT_ARRAY;
+ opts[2].dwType = PROPBAG2_TYPE_DATA;
+ opts[3].pstrName = (LPOLESTR)wszChrominance;
+ opts[3].vt = VT_I4|VT_ARRAY;
+ opts[3].dwType = PROPBAG2_TYPE_DATA;
+ opts[4].pstrName = (LPOLESTR)wszJpegYCrCbSubsampling;
+ opts[4].vt = VT_UI1;
+ opts[4].dwType = PROPBAG2_TYPE_DATA;
+ opts[5].pstrName = (LPOLESTR)wszSuppressApp0;
+ opts[5].vt = VT_BOOL;
+ opts[5].dwType = PROPBAG2_TYPE_DATA;
+
+ hr = CreatePropertyBag2(opts, 6, ppIEncoderOptions);
if (FAILED(hr))
{
LeaveCriticalSection(&This->lock);
diff --git a/dlls/windowscodecs/tests/converter.c b/dlls/windowscodecs/tests/converter.c
index fba7fc7..041ca96 100644
--- a/dlls/windowscodecs/tests/converter.c
+++ b/dlls/windowscodecs/tests/converter.c
@@ -429,6 +429,12 @@ static const WCHAR wszTiffCompressionMethod[] = {'T','i','f','f','C','o','m','p'
static const WCHAR wszCompressionQuality[] = {'C','o','m','p','r','e','s','s','i','o','n','Q','u','a','l','i','t','y',0};
static const WCHAR wszInterlaceOption[] = {'I','n','t','e','r','l','a','c','e','O','p','t','i','o','n',0};
static const WCHAR wszFilterOption[] = {'F','i','l','t','e','r','O','p','t','i','o','n',0};
+static const WCHAR wszImageQuality[] = {'I','m','a','g','e','Q','u','a','l','i','t','y',0};
+static const WCHAR wszBitmapTransform[] = {'B','i','t','m','a','p','T','r','a','n','s','f','o','r','m',0};
+static const WCHAR wszLuminance[] = {'L','u','m','i','n','a','n','c','e',0};
+static const WCHAR wszChrominance[] = {'C','h','r','o','m','i','n','a','n','c','e',0};
+static const WCHAR wszJpegYCrCbSubsampling[] = {'J','p','e','g','Y','C','r','C','b','S','u','b','s','a','m','p','l','i','n','g',0};
+static const WCHAR wszSuppressApp0[] = {'S','u','p','p','r','e','s','s','A','p','p','0',0};
static const struct property_opt_test_data testdata_tiff_props[] = {
{ wszTiffCompressionMethod, VT_UI1, VT_UI1, WICTiffCompressionDontCare },
@@ -442,6 +448,16 @@ static const struct property_opt_test_data testdata_png_props[] = {
{ NULL }
};
+static const struct property_opt_test_data testdata_jpeg_props[] = {
+ { wszImageQuality, VT_R4, VT_EMPTY },
+ { wszBitmapTransform, VT_UI1, VT_UI1, WICBitmapTransformRotate0 },
+ { wszLuminance, VT_I4|VT_ARRAY, VT_EMPTY },
+ { wszChrominance, VT_I4|VT_ARRAY, VT_EMPTY },
+ { wszJpegYCrCbSubsampling, VT_UI1, VT_UI1, WICJpegYCrCbSubsamplingDefault, 0.0f, TRUE }, /* not supported on XP/2k3 */
+ { wszSuppressApp0, VT_BOOL, VT_BOOL, FALSE },
+ { NULL }
+};
+
static int find_property_index(const WCHAR* name, PROPBAG2* all_props, int all_prop_cnt)
{
int i;
@@ -566,6 +582,8 @@ static void test_encoder_properties(const CLSID* clsid_encoder, IPropertyBag2 *o
test_specific_encoder_properties(options, testdata_tiff_props, all_props, cProperties2);
else if (IsEqualCLSID(clsid_encoder, &CLSID_WICPngEncoder))
test_specific_encoder_properties(options, testdata_png_props, all_props, cProperties2);
+ else if (IsEqualCLSID(clsid_encoder, &CLSID_WICJpegEncoder))
+ test_specific_encoder_properties(options, testdata_jpeg_props, all_props, cProperties2);
for (i=0; i < cProperties2; i++)
{
@@ -727,6 +745,13 @@ static void test_multi_encoder(const struct bitmap_data **srcs, const CLSID* cls
i++;
}
+ if (clsid_decoder == NULL)
+ {
+ IStream_Release(stream);
+ IWICBitmapEncoder_Release(encoder);
+ return;
+ }
+
if (SUCCEEDED(hr))
{
hr = IWICBitmapEncoder_Commit(encoder);
@@ -868,6 +893,9 @@ START_TEST(converter)
test_encoder(&testdata_24bppBGR, &CLSID_WICTiffEncoder,
&testdata_24bppBGR, &CLSID_WICTiffDecoder, "TIFF encoder 24bppBGR");
+ test_encoder(&testdata_24bppBGR, &CLSID_WICJpegEncoder,
+ &testdata_24bppBGR, NULL, "JPEG encoder 24bppBGR");
+
test_multi_encoder(multiple_frames, &CLSID_WICTiffEncoder,
multiple_frames, &CLSID_WICTiffDecoder, NULL, NULL, "TIFF encoder multi-frame");
diff --git a/include/wincodec.idl b/include/wincodec.idl
index 1bbdab9..e727cbd 100644
--- a/include/wincodec.idl
+++ b/include/wincodec.idl
@@ -148,6 +148,14 @@ typedef enum WICComponentEnumerateOptions {
WICComponentEnumerateDisabled = 0x80000000
} WICComponentEnumerateOptions;
+typedef enum WICJpegYCrCbSubsamplingOption {
+ WICJpegYCrCbSubsamplingDefault = 0x00000000,
+ WICJpegYCrCbSubsampling420 = 0x00000001,
+ WICJpegYCrCbSubsampling422 = 0x00000002,
+ WICJpegYCrCbSubsampling444 = 0x00000003,
+ WICJpegYCrCbSubsampling440 = 0x00000004
+} WICJpegYCrCbSubsamplingOption;
+
typedef enum WICPixelFormatNumericRepresentation {
WICPixelFormatNumericRepresentationUnspecified = 0x00000000,
WICPixelFormatNumericRepresentationIndexed = 0x00000001,
More information about the wine-cvs
mailing list