三线程加速无损视频解码

无损解码速度快,需要56ms(基于YUV和DCT的需要1.6s),经过优化,比如将for循环改为C语言自带的memcpy替换,提升到50ms,还不足于正常播放,因为1000ms/50ms=20帧峰值。为此需要提速,如果正常播放25帧视频,则需要可播放30帧的能力。

1. 对于图像提速可采用以下方法:

1.1 汇编方法:汇编可起到事半功倍的作用,但对于复杂的程序比如视频编码,转换很困难,需要时间和“汇编功力”。

1.2 图像分割方法:将图像“分割”为n等分区域,分别用线程同时运行,起到并行加速作用。“分割”图像需要一套操作机制,有些麻烦。

1.3 多媒体指令方法:就是以前的蝶形运算,现在是加强版,缺点是破坏程序结构,有些程序不适合(困难度很高)。

1.4 三线程方法(本文首先提出):彩色图像是由RGB构成的,基于传统方式的YUV,都是三个分量,分别由三个线程同时运行,起到加速作用。优点是利用自然的三个分量,操作简单。缺点是只能三个分量(线程),加速有限。经测试,由原来的50ms提速到22ms,提高了28ms,可实现1000ms/22ms=45帧峰值,满足了最高播放25帧要求。基于YUV和DCT的不能满足要求。

2. 线程与CPU“核”:多线程在多核处理器上是并行运行的。如果多个线程访问一个变量会造成冲突,起不到并行加速作用。

3. 其他视频加速:由显卡或CPU多媒体硬件部分实现加速,不通用,需要检测各种环境,应用不同方案才能“通用”。

原文地址:https://www.cnblogs.com/hbg200/p/12169278.html

时间: 2024-10-09 07:55:50

三线程加速无损视频解码的相关文章

线程三线程安全

线程三线程安全对于多线程的系统来说,如果不加以限制的话,会造成数据安全等问题,对于数据安全问题会有如下问题:1.读取脏数据 在读取数据的时候,数据被修改了,而程序读取的是修改过的或者没有修改过的,反正不是自己期望读取的数据的值.2.数据不一致 在使用多线程进行数据处理的时候,最终得出来的数据每一次执行都不一样.3.数据错乱 在数据的打印或者数组中,会造成数据的顺序错乱,对于关系可能会错乱.--对于数据的安全性,java提供了一些解决的方法:1.使用synchronized同步关键字2.使用vol

多线程编程学习三(线程间通信)

一.概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一.可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高cpu利用率的同时还会使程序员对各线程任务在处理过程中进行有效的把控和监督. 二.等待/通知机制 1."wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行.用一个厨师和服务员的交互来说明: (1) 服务员取到菜的时间取决于厨师,所以服务员就有“

MFC线程(三):线程同步事件(event)与互斥(mutex)

前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFun{ hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(hEvent); char g_charArray[4]; CString szResult; //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问 AfxBe

JAVA多线程(三) 线程池和锁的深度化

github演示代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread 1.线程池 1.1 线程池是什么 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务

多线程面试题之【三线程按顺序交替打印ABC的方法】

建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:"打印完毕" 方法之一:使用Condition等待唤醒机制,代码如下: import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concu

java三线程循环有序打印ABC

迅雷笔试题: 编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. 解决思路:每个线程运行时先检查他依赖的线程是否已完成工作,线程B依赖线程A的完成,线程C依赖线程B和线程A的完成,线程A依赖线程C的完成.如果当前线程依赖的线程没有执行完,则阻塞当前线程直到条件满足再执行. Condition.await()会使当前线程暂时阻塞,并释放ReentrantLock锁. Conditi

GCD使用三 -- 线程间通信

#define HMGlobalQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)#define HMMainQueue dispatch_get_main_queue() dispatch_async(HMGlobalQueue, ^{ NSLog(@"donwload---%@", [NSThread currentThread]); // 1.子线程下载图片 NSURL *url = [NSURL

三.线程优先级和守护进程

1.线程的优先级 在操作系统中,线程可以划分优先级,优先级高的线程得到的CPU资源较多,也是CPU优先执行优先级较高的线程对象中的任务. 设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行. 设置优先级使用setPriority()方法. 线程优先级的继承性 java中线程的优先级具有继承性,比如A启动B,则B的优先级和A相同. 优先级具有规则性 虽然使用setPriority()方法可以设置线程的优先级,但还没有看到设置优先级所带来的效果 线程2: 高优先级的线程总是大部

并发编程专题(三)-线程的状态

1.线程状态 Java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待).TERMINATED(终止.结束).但是大多数人的理解和上面的这六种还是有些差别,通常会加上阻塞状态,可运行状态,挂起状态.在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态,这是Thread类描述线程状态的枚举类的源代码: public enum