我需要使用硬件加速来ffmpeg解码我的视频(例如h264).我正在使用解码帧的常用方法:读取数据包 - >解码帧.而且我想让ffmpeg加速解码.所以,我有内置它--enable-vaapi和--enable-hwaccel=h264.但我真的不知道接下来该怎么做.我试过使用avcodec_find_decoder_by_name("h264_vaapi")但它返回nullptr.无论如何,我可能想要使用其他API而不仅仅是VA API.如何加速ffmpeg解码?
PS我没有在互联网上找到任何使用ffmpeg和hwaccel的例子.
在我开发的项目上,我们使用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次,并与分离的路径:和;,但似乎没有像预期的那样工作.
要创建WINRT项目,我们需要CMake> = 2.8.10并且:
谢谢.
更新:参考此问题的CMake错误报告在这里:0013749:无法在没有解决方法的情况下从CMake定位Windows 8 RT.
有一个流行的自旋锁互斥锁版本在互联网上传播,人们可能会在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_acquire的test_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:
我完全理解操作是原子的,操作之间的操作lock并unlock不能超出临界区.这不是问题.问题是我没有看到上面的代码如何防止2个互斥锁同时进入临界区.为了防止它发生,应该在2 秒之间的关系之前发生lock.有人能告诉我,使用C++标准概念,代码是完全安全的吗?
更新2:
好吧,我相信,我们接近正确的答案.我在标准中找到了以下内容:
[atomics.order]第11条
原子读 - 修改 - 写操作应始终读取与读 - …
我有一堆cmake生成的项目和一个在MSVS下创建的项目.每当我重新运行cmake时,我想要添加它.现在我必须通过cmake生成解决方案,然后将现有项目从MSVS GUI添加到解决方案中,但这有点单调乏味.
有没有办法使流程自动化?
我安装了最新的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) 假设我们有以下代码:
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?
我的应用程序需要在休眠模式下做出反应,以便它可以对挂起和其他恢复操作执行某些操作.我发现了一些特定于分发的方法来实现它(Upower + DBus),但没有找到任何通用的东西.有办法吗?
谢谢!
如何更改上下文菜单中条目的顺序?(例如,对于目录)我需要知道Windows在显示时如何确定顺序,以便我可以控制它.例如,我想将自定义操作放在上下文菜单列表的末尾
预先感谢!
假设我们有一个简单的变量(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).我对这种情况的理解如下(针对不同的内存顺序):
memory_order_seq_cst - T2负载必须加载2.因此,它必须加载最新的值(就像RMW操作的情况一样)memory_order_acquire/ memory_order_release/ memory_order_relaxed- T2没有义务加载2但可以加载任何旧值,但唯一的限制是:该值不应该早于该线程加载的最新值.所以,例如var.load返回0.我的理解是对的吗?
UPDATE1:
如果我的推理错了,请提供C++标准中的文本证明.不仅仅是一些架构如何运作的理论推理.