如何编写函数来接受SWIG中的分数对象?

2024-05-23 14:04:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用Pythg编写Python和我们的C++视频处理库之间的接口。在python中,我使用Fraction类来表示帧速率(例如NTFS24=24000/1001fps)。所讨论的功能是视频转码,即获取视频(或帧流)输入并产生类似的输出。为此,我们需要指定输出(有时输入)帧速率。你知道吗

有什么方法可以在C++(SWIG)侧接口分数类?从我在互联网上发现的情况来看,我应该能够将tuple传递给std::pair<int,int>参数,所以这就是我的回退计划,但是有更好的方法吗?谢谢!你知道吗


Tags: 方法功能视频速率情况互联网转码分数
1条回答
网友
1楼 · 发布于 2024-05-23 14:04:10

我将下面的接口文件放在一起,以说明包装一个分数是如何工作的。最后,我决定创建我自己的分数结构,以在C++侧保存分数,主要是因为它比使用^ {CD1}}更不含糊。(我认为一对整数也可以是二维坐标,或者屏幕分辨率或其他类型,对于重载分辨率等来说,更强大的输入是更好的选择。)

%module test

%{
#include <iostream> // Just for testing....

static PyObject *fractions_module = NULL;
%}

%init %{
  // Import the module we want
  fractions_module = PyImport_ImportModule("fractions");
  assert(fractions_module);
  // TODO: we should call Py_DECREF(fractions_module) when our module gets unloaded
%}

%typemap(in) const Fraction& (Fraction tmp) {
  // Input typemap for fraction: duck-type on attrs numerator, denominator
  PyObject *numerator = PyObject_GetAttrString($input, "numerator");
  PyObject *denominator = PyObject_GetAttrString($input, "denominator");

  int err = SWIG_AsVal_int(numerator, &tmp.numerator);
  assert(SWIG_IsOK(err)); // TODO: proper error handling
  err = SWIG_AsVal_int(denominator, &tmp.denominator);
  assert(SWIG_IsOK(err)); // TODO: errors...

  Py_DECREF(numerator);
  Py_DECREF(denominator);

  $1 = &tmp;  
}

%typemap(out) Fraction {
  // Output typemap: pass two ints into fractions.Fraction() ctor
  $result = PyObject_CallMethod(fractions_module, "Fraction", "ii", $1.numerator, $1.denominator);
}

%inline %{
  struct Fraction {
    int numerator, denominator;
  };

  void fraction_in(const Fraction& fraction) {
    std::cout << fraction.numerator << "/" << fraction.denominator << "\n";
  }

  Fraction fraction_out() {
    Fraction f = {100, 1};
    return f;
  }
%}
<>这主要是两个类型映射——一个用于C++函数的输入,一个用于输出。他们从输入对象的分子和分母属性构造一个临时C++分数,并分别从C++中构造一个^ {CD2}} python对象。将它们改编成其他类似的分数类型应该相当简单。你知道吗

相关问题 更多 >