Skip to content

Commit

Permalink
#337 Add "param3" to ConvertToXX for passing it userdefined2 chroma r…
Browse files Browse the repository at this point in the history
…esampler as 's'
  • Loading branch information
pinterf committed Apr 14, 2023
1 parent c706b74 commit 9ebeed9
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 37 deletions.
44 changes: 22 additions & 22 deletions avs_core/convert/convert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,28 +64,28 @@
********************************************************************/

extern const AVSFunction Convert_filters[] = { // matrix can be "rec601", "rec709", "PC.601" or "PC.709" or "rec2020" or "PC.2020"
{ "ConvertToRGB", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)0 },
{ "ConvertToRGB24", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)24 },
{ "ConvertToRGB32", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)32 },
{ "ConvertToRGB48", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)48 },
{ "ConvertToRGB64", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)64 },
{ "ConvertToPlanarRGB", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)-1 },
{ "ConvertToPlanarRGBA", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToRGB::Create, (void *)-2 },
{ "ConvertToRGB", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)0 },
{ "ConvertToRGB24", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)24 },
{ "ConvertToRGB32", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)32 },
{ "ConvertToRGB48", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)48 },
{ "ConvertToRGB64", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)64 },
{ "ConvertToPlanarRGB", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)-1 },
{ "ConvertToPlanarRGBA", BUILTIN_FUNC_PREFIX, "c[matrix]s[interlaced]b[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToRGB::Create, (void *)-2 },
{ "ConvertToY8", BUILTIN_FUNC_PREFIX, "c[matrix]s", ConvertToY::Create, (void*)0 }, // user_data == 0 -> only 8 bit sources
{ "ConvertToYV12", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f", ConvertToYV12::Create, (void*)0 },
{ "ConvertToYV24", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV444, (void*)0},
{ "ConvertToYV16", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV422, (void*)0},
{ "ConvertToYV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYV411, (void*)0},
{ "ConvertToYUY2", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToYUY2::Create },
{ "ConvertToYV12", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f", ConvertToYV12::Create, (void*)0 },
{ "ConvertToYV24", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV444, (void*)0},
{ "ConvertToYV16", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV422, (void*)0},
{ "ConvertToYV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYV411, (void*)0},
{ "ConvertToYUY2", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToYUY2::Create },
{ "ConvertBackToYUY2", BUILTIN_FUNC_PREFIX, "c[matrix]s", ConvertBackToYUY2::Create },
{ "ConvertToY", BUILTIN_FUNC_PREFIX, "c[matrix]s", ConvertToY::Create, (void*)1 }, // user_data == 1 -> any bit depth sources
{ "ConvertToYUV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYV411, (void*)1}, // alias for ConvertToYV411, 8 bit check later
{ "ConvertToYUV420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV420, (void*)1},
{ "ConvertToYUV422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV422, (void*)1},
{ "ConvertToYUV444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV444, (void*)1},
{ "ConvertToYUVA420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV420, (void*)2},
{ "ConvertToYUVA422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV422, (void*)2},
{ "ConvertToYUVA444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f", ConvertToPlanarGeneric::CreateYUV444, (void*)2},
{ "ConvertToYUV411", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYV411, (void*)1}, // alias for ConvertToYV411, 8 bit check later
{ "ConvertToYUV420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV420, (void*)1},
{ "ConvertToYUV422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV422, (void*)1},
{ "ConvertToYUV444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV444, (void*)1},
{ "ConvertToYUVA420", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV420, (void*)2},
{ "ConvertToYUVA422", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[ChromaOutPlacement]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV422, (void*)2},
{ "ConvertToYUVA444", BUILTIN_FUNC_PREFIX, "c[interlaced]b[matrix]s[ChromaInPlacement]s[chromaresample]s[param1]f[param2]f[param3]f", ConvertToPlanarGeneric::CreateYUV444, (void*)2},
{ "ConvertTo8bit", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)8 },
{ "ConvertTo16bit", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)16 },
{ "ConvertToFloat", BUILTIN_FUNC_PREFIX, "c[bits]i[truerange]b[dither]i[dither_bits]i[fulls]b[fulld]b", ConvertBits::Create, (void *)32 },
Expand Down Expand Up @@ -251,10 +251,10 @@ AVSValue __cdecl ConvertToRGB::Create(AVSValue args, void* user_data, IScriptEnv
bool needConvertFinalBitdepth = false;
int finalBitdepth = -1;

AVSValue new_args[7] = { clip, args[2], args[1], args[3], args[4], args[5], args[6]};
AVSValue new_args[8] = { clip, args[2], args[1], args[3], args[4], args[5], args[6], args[7]};
// conversion to planar or packed RGB is always from 444
// clip, interlaced, matrix, chromainplacement, chromaresample, param1, param2
clip = ConvertToPlanarGeneric::CreateYUV444(AVSValue(new_args, 7), (void *)1, env).AsClip(); // (void *)1: not restricted to 8 bits
// clip, interlaced, matrix, chromainplacement, chromaresample, param1, param2, param3
clip = ConvertToPlanarGeneric::CreateYUV444(AVSValue(new_args, 8), (void *)1, env).AsClip(); // (void *)1: not restricted to 8 bits
if ((target_rgbtype == 24 || target_rgbtype == 32)) {
if (vi.BitsPerComponent() != 8) {
needConvertFinalBitdepth = true;
Expand Down
21 changes: 12 additions & 9 deletions avs_core/convert/convert_planar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
#include <algorithm>
#include <string>

static ResamplingFunction* getResampler( const char* resampler, AVSValue param1, AVSValue param2, IScriptEnvironment* env);
static ResamplingFunction* getResampler( const char* resampler, AVSValue param1, AVSValue param2, AVSValue param3, IScriptEnvironment* env);

template <typename pixel_t>
void fill_chroma(uint8_t * dstp_u, uint8_t * dstp_v, int height, int pitch, pixel_t val)
Expand Down Expand Up @@ -1145,7 +1145,7 @@ AVSValue __cdecl ConvertYV16ToYUY2::Create(AVSValue args, void*, IScriptEnvironm
ConvertToPlanarGeneric::ConvertToPlanarGeneric(
PClip src, int dst_space, bool interlaced,
int _ChromaLocation_In,
const AVSValue& chromaResampler, const AVSValue& param1, const AVSValue& param2,
const AVSValue& chromaResampler, const AVSValue& param1, const AVSValue& param2, const AVSValue& param3,
int _ChromaLocation_Out,
IScriptEnvironment* env) :
GenericVideoFilter(src), ChromaLocation_In(_ChromaLocation_In), ChromaLocation_Out(_ChromaLocation_Out)
Expand Down Expand Up @@ -1341,7 +1341,7 @@ ConvertToPlanarGeneric::ConvertToPlanarGeneric(
int uv_width = vi.width >> vi.GetPlaneWidthSubsampling(PLANAR_U);
int uv_height = vi.height >> vi.GetPlaneHeightSubsampling(PLANAR_U);

ResamplingFunction *filter = getResampler(chromaResampler.AsString("bicubic"), param1, param2, env);
ResamplingFunction *filter = getResampler(chromaResampler.AsString("bicubic"), param1, param2, param3, env);

bool P = !lstrcmpi(chromaResampler.AsString(""), "point");

Expand Down Expand Up @@ -1458,11 +1458,11 @@ AVSValue ConvertToPlanarGeneric::Create(AVSValue& args, const char* filter, bool
const bool keep_packedrgb_alpha = to_yuva && (vi.IsRGB32() || vi.IsRGB64());
if (vi.IsRGB48() || vi.IsRGB64()) {
// we convert to intermediate PlanarRGB, RGB48/64->YUV444 is slow C, planarRGB is fast
AVSValue new_args[7] = { clip, AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue() };
// clip, matrix, interlaced, chromainplacement, chromaresample, param1, param2
AVSValue new_args[8] = { clip, AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue(), AVSValue() };
// clip, matrix, interlaced, chromainplacement, chromaresample, param1, param2, param3
// convert to planar RGBA only if RGB64 and target is YUVA (need to keep alpha)
const intptr_t planar_rgb_type = keep_packedrgb_alpha ? -2 : -1;
clip = ConvertToRGB::Create(AVSValue(new_args, 7), (void *)planar_rgb_type, env).AsClip();
clip = ConvertToRGB::Create(AVSValue(new_args, 8), (void *)planar_rgb_type, env).AsClip();
vi = clip->GetVideoInfo();
}

Expand Down Expand Up @@ -1509,15 +1509,18 @@ AVSValue ConvertToPlanarGeneric::Create(AVSValue& args, const char* filter, bool

AVSValue param1;
AVSValue param2;
AVSValue param3;
if (to_420 || to_422) {
// ChromaOutPlacement parameter is valid
chromaloc_parse_merge_with_props(vi, args[5].AsString(nullptr), nullptr, /* ref*/ChromaLocation_Out, ChromaLocation_e::AVS_CHROMA_LEFT /*default*/, env);
param1 = args[6];
param2 = args[7];
param3 = args[8];
}
else {
param1 = args[5];
param2 = args[6];
param3 = args[7];
}


Expand Down Expand Up @@ -1615,7 +1618,7 @@ AVSValue ConvertToPlanarGeneric::Create(AVSValue& args, const char* filter, bool
// ConvertToPlanarGeneric's GetFrame will recognize if alpha copy or fill-with-defaults needed
return new ConvertToPlanarGeneric(clip, pixel_type, args[1].AsBool(false), ChromaLocation_In,
args[4], // chromaresample
param1, param2,
param1, param2, param3,
ChromaLocation_Out, env);
}

Expand Down Expand Up @@ -1685,7 +1688,7 @@ static int getPlacement(const AVSValue& _placement, IScriptEnvironment* env) {
*/


static ResamplingFunction* getResampler(const char* resampler, AVSValue param1, AVSValue param2, IScriptEnvironment* env) {
static ResamplingFunction* getResampler(const char* resampler, AVSValue param1, AVSValue param2, AVSValue param3, IScriptEnvironment* env) {
if (resampler) {
if (!lstrcmpi(resampler, "point"))
return new PointFilter();
Expand Down Expand Up @@ -1714,7 +1717,7 @@ static ResamplingFunction* getResampler(const char* resampler, AVSValue param1,
else if (!lstrcmpi(resampler, "sinclin2"))
return new SincLin2Filter((int)param1.AsFloat(15)); // optional Taps= as param1
else if (!lstrcmpi(resampler, "userdefined2"))
return new UserDefined2Filter(param1.AsDblDef(121.0), param2.AsDblDef(19.0)); // optional B and C as param1 and param2
return new UserDefined2Filter(param1.AsDblDef(121.0), param2.AsDblDef(19.0), param3.AsDblDef(2.3)); // optional B and C and S as param1, param2, param3
else
env->ThrowError("Convert: Unknown chroma resampler, '%s'", resampler);
}
Expand Down
2 changes: 1 addition & 1 deletion avs_core/convert/convert_planar.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ class ConvertToPlanarGeneric : public GenericVideoFilter
public:
ConvertToPlanarGeneric(PClip src, int dst_space, bool interlaced,
int _ChromaLocation_In,
const AVSValue& ChromaResampler, const AVSValue& param1, const AVSValue& param2,
const AVSValue& ChromaResampler, const AVSValue& param1, const AVSValue& param2, const AVSValue& param3,
int _ChromaLocation_Out, IScriptEnvironment* env);
~ConvertToPlanarGeneric() {}
PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) override;
Expand Down
10 changes: 5 additions & 5 deletions avs_core/convert/convert_yuy2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,8 +493,8 @@ AVSValue __cdecl ConvertToYUY2::Create(AVSValue args, void*, IScriptEnvironment*
if (clip->GetVideoInfo().IsYUY2())
return clip;

// chromain, chromaresample, param1, param2
const bool haveOpts = args[3].Defined() || args[4].Defined() || args[5].Defined() || args[6].Defined();
// chromain, chromaresample, param1, param2, param3
const bool haveOpts = args[3].Defined() || args[4].Defined() || args[5].Defined() || args[6].Defined() || args[7].Defined();

if (clip->GetVideoInfo().BitsPerComponent() != 8) {
env->ThrowError("ConvertToYUY2: only 8 bit sources are supported");
Expand All @@ -503,16 +503,16 @@ AVSValue __cdecl ConvertToYUY2::Create(AVSValue args, void*, IScriptEnvironment*
if (clip->GetVideoInfo().IsPlanar()) {
if (haveOpts || !clip->GetVideoInfo().IsYV12()) {
// We have no direct conversions. Go to YV16.
AVSValue new_args[7] = { clip, args[1], args[2], args[3], args[4], args[5], args[6]};
clip = ConvertToPlanarGeneric::CreateYUV422(AVSValue(new_args, 7), (void *)0, env).AsClip(); // (void *)0: restricted to 8 bits
AVSValue new_args[8] = { clip, args[1], args[2], args[3], args[4], args[5], args[6], args[7] };
clip = ConvertToPlanarGeneric::CreateYUV422(AVSValue(new_args, 8), (void *)0, env).AsClip(); // (void *)0: restricted to 8 bits
}
}

if (clip->GetVideoInfo().IsYV16())
return new ConvertYV16ToYUY2(clip, env);

if (haveOpts)
env->ThrowError("ConvertToYUY2: ChromaPlacement, ChromaResample, param1 and param2 options are not supported.");
env->ThrowError("ConvertToYUY2: ChromaPlacement, ChromaResample, param1, param2 or param3 options are not supported.");

const bool i=args[1].AsBool(false);
return new ConvertToYUY2(clip, false, i, args[2].AsString(0), env);
Expand Down

0 comments on commit 9ebeed9

Please sign in to comment.