小编ixS*_*Sci的帖子

如何使用ffmpeg进行硬件加速

我需要使用硬件加速来ffmpeg解码我的视频(例如h264).我正在使用解码帧的常用方法:读取数据包 - >解码帧.而且我想让ffmpeg加速解码.所以,我有内置它--enable-vaapi--enable-hwaccel=h264.但我真的不知道接下来该怎么做.我试过使用avcodec_find_decoder_by_name("h264_vaapi")但它返回nullptr.无论如何,我可能想要使用其他API而不仅仅是VA API.如何加速ffmpeg解码?

PS我没有在互联网上找到任何使用ffmpeg和hwaccel的例子.

c c++ ffmpeg hardware-acceleration

43
推荐指数
1
解决办法
5万
查看次数

多个Cmake_Prefix_Paths

在我开发的项目上,我们使用cmake来编译我们的服务.目前,我们需要从3个不同的位置获取Qt的数据,我很好奇是否有办法在三个独立的命令上运行一个cmake命令.

我们目前使用的是什么

cmake -G "Visual Studio 12 2013" -DWITH_SERVER=1 -DCMAKE_PREFIX_PATH=C:\Qt\5.5\msvc2013\lib\cmake ..
cmake -G "Visual Studio 12 2013" -DWITH_SERVER=1 -DCMAKE_PREFIX_PATH=C:\protobuf\src ..
cmake -G "Visual Studio 12 2013" -DWITH_SERVER=1 -DCMAKE_PREFIX_PATH=C:\protobuf\cmake\build\Release ..
Run Code Online (Sandbox Code Playgroud)

我们试图通过相同的标志3次,并与分离的路径:;,但似乎没有像预期的那样工作.

cmake

19
推荐指数
1
解决办法
1万
查看次数

是否可以使用cmake创建WinRT项目?

要创建WINRT项目,我们需要CMake> = 2.8.10并且:

  1. 将项目类型设置为Windows应用商店应用(CMAKE:SET_TARGET_PROPERTIES(目标属性VS_WINRT_EXTENSIONS TRUE)
  2. 为WinRT编译添加编译器标志/ ZW(CMAKE:ADD_DEFINITIONS(-ZW))
  3. 添加App.xaml.h,App.xaml.cpp
  4. 添加App.xaml,VS将从中生成一些额外的文件(CMAKE:怎么样?)
  5. 添加Package.appxmanifest与描述,以便VS将使用它(CMAKE:怎么样?)

谢谢.

更新:参考此问题的CMake错误报告在这里:0013749:无法在没有解决方法的情况下从CMake定位Windows 8 RT.

c++ cmake windows-runtime visual-studio-2012

17
推荐指数
1
解决办法
2587
查看次数

基本的自旋锁互斥锁实现排序

有一个流行的自旋锁互斥锁版本在互联网上传播,人们可能会在Anthony Williams的书(C++ Concurrency in Action)中遇到这种版本.这里是:

class SpinLock
{
    std::atomic_flag locked;
public:
    SpinLock() :
        locked{ATOMIC_FLAG_INIT}
    {
    }
    void lock() 
    {
        while(locked.test_and_set(std::memory_order_acquire));
    }
    void unlock() 
    {
        locked.clear(std::memory_order_release);
    }
};
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么每个人都使用std::memory_order_acquiretest_and_set是一个RMW操作.为什么不std::memory_acq_rel呢?假设我们有2个线程同时尝试获取锁:

T1: test_and_set -> ret false
T2: test_and_set -> ret false
Run Code Online (Sandbox Code Playgroud)

这种情况应该是可能的,因为我们有两个彼此之间acquire没有任何sync with关系的操作.是的,在我们解锁了互斥锁之后,我们进行了release一项后续操作,release sequence生活变得丰富多彩,每个人都很开心.但为什么在release sequence前进之前它是安全的?

由于很多人都提到了这个实现,我认为它应该可以正常工作.那我错过了什么?

更新1:

我完全理解操作是原子的,操作之间的操作lockunlock不能超出临界区.这不是问题.问题是我没有看到上面的代码如何防止2个互斥锁同时进入临界区.为了防止它发生,应该在2 秒之间的关系之前发生lock.有人能告诉我,使用C++标准概念,代码是完全安全的吗?

更新2:

好吧,我相信,我们接近正确的答案.我在标准中找到了以下内容:

[atomics.order]第11条

原子读 - 修改 - 写操作应始终读取与读 - …

c++ multithreading atomic

17
推荐指数
2
解决办法
2659
查看次数

在cmake中使用现有的Visual Studio项目

我有一堆cmake生成的项目和一个在MSVS下创建的项目.每当我重新运行cmake时,我想要添加它.现在我必须通过cmake生成解决方案,然后将现有项目从MSVS GUI添加到解决方案中,但这有点单调乏味.

有没有办法使流程自动化?

cmake visual-studio

11
推荐指数
1
解决办法
4351
查看次数

NUnit 3:禁止并行测试

我安装了最新的NUnit(3.2.0),并且我的所有测试都是并行运行的.它可能看起来像是理想的行为,但我没有要求它,实际上它打破了我的一些测试.我有一些初始化,[OneTimeSetUp]其中依赖于线程,似乎我无法做任何事情迫使NUnit按顺序运行我的测试.我已经阅读了文档,并指出默认情况下测试不是并行运行,而实际上它们是!

此外,我试图添加以下属性:[assembly: Parallelizable(ParallelScope.None)]- 没有运气.

有人知道如何改变这种行为吗?

PS我用ReSharper运行它,但也尝试使用MSVS加载项.


UPD:我正在使用MVVM Light DispatcherHelper.Initialize()(内部[OneTimeSetUp])来存储调度程序对象,稍后由几个测试使用它.如果线程不同(在测试和安装方法之间),则测试中的操作将异步执行,并且我的测试失败.

我在不同的测试中检查了线程ID,它们都是不同的.


UPD2:摘自文档:

NUnit 3.0框架可以在程序集中并行运行测试.这是与发动机并行测试执行完全独立的设施,尽管可以在同一测试运行中使用两者.

默认情况下,不会执行并行执行.属性用于指示哪些测试可以并行运行以及它们与其他测试的关系.

如果这并不意味着组件中的测试不应该在明确指定之前并行运行,那么它意味着什么?为什么[assembly: Parallelizable(ParallelScope.None)]对测试并行执行没有影响?


UPD3: 问题的答案可能在下面找到,但是如果你被卡住了(就像我一样),DispatcherHelper.Initialize()你只需要从OneTimeSetUp每个使用调度程序的测试中删除此初始化并放入以下行:

DispatcherHelper.Reset();
DispatcherHelper.Initialize();
Run Code Online (Sandbox Code Playgroud)

c# nunit nunit-3.0

11
推荐指数
2
解决办法
1万
查看次数

模板模板参数和转发参考

假设我们有以下代码:

template<typename T>
class C
{};

template <typename T, template <typename> class Container>
void dummyMe(Container<T>&&)
{};

int main(int argc, char* argv[])
{
    C<int> c;
    dummyMe(c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于第一个dummyMe参数是rvalue-reference ,因此无法编译.有人可以在Standardese中解释为什么模板模板参数与转发参考不相符,为什么它用简单的英语.

PS我偶然发现了这个那些问题,但我没有在答案中看到任何真实的证据.


上面链接的答案和这个问题的答案断言Container<T>不能算作模板参数.我认为没有理由这样做.让我们的例子更简单:

template <template <typename=int> class Container>
void dummyMe(Container<>&&)
{};
Run Code Online (Sandbox Code Playgroud)

现在我们有一个几乎与以下相同的示例:

template <typename Container>
void dummyMe(Container&&)
{};
Run Code Online (Sandbox Code Playgroud)

但是以完全不同的方式对待它.为什么?为什么Container<>&&不能被视为同样的事情template <typename=int> class Container作为Container&&typename Container

c++ language-lawyer

10
推荐指数
2
解决办法
773
查看次数

Linux中有暂停\恢复信号吗?

我的应用程序需要在休眠模式下做出反应,以便它可以对挂起和其他恢复操作执行某些操作.我发现了一些特定于分发的方法来实现它(Upower + DBus),但没有找到任何通用的东西.有办法吗?

谢谢!

linux signals hibernation

6
推荐指数
1
解决办法
2964
查看次数

在Windows资源管理器上下文菜单中排序

如何更改上下文菜单中条目的顺序?(例如,对于目录)我需要知道Windows在显示时如何确定顺序,以便我可以控制它.例如,我想将自定义操作放在上下文菜单列表的末尾

预先感谢!

windows contextmenu

6
推荐指数
2
解决办法
8559
查看次数

是否应该立即加载获取商店发布?

假设我们有一个简单的变量(std::atomic<int> var)和2个线程T1,T2并且我们有以下代码T1:

...
var.store(2, mem_order);
...
Run Code Online (Sandbox Code Playgroud)

并为 T2

...
var.load(mem_order)
...
Run Code Online (Sandbox Code Playgroud)

另外,我们假设T2(load)执行时间晚于123ns (在C++标准的修改顺序中稍后),而不是T1(store).我对这种情况的理解如下(针对不同的内存顺序):

  1. memory_order_seq_cst - T2负载必须加载2.因此,它必须加载最新的值(就像RMW操作的情况一样)
  2. memory_order_acquire/ memory_order_release/ memory_order_relaxed- T2没有义务加载2但可以加载任何旧值,但唯一的限制是:该值不应该早于该线程加载的最新值.所以,例如var.load返回0.

我的理解是对的吗?

UPDATE1:

如果我的推理错了,请提供C++标准中的文本证明.不仅仅是一些架构如何运作的理论推理.

c++ multithreading atomic atomicity

6
推荐指数
2
解决办法
390
查看次数