jm8.6编解码器概述

Dreaming-in-Gottingen 2020-11-18 原文


jm8.6编解码器概述

  自己在学习h264的路上,欢迎讨论交流。

  前段时间研究JM出品的h264编码器,代码实在看不下去,因此换了个角度来研究诸多算法——逆向方式(解码),本系列文章记录一些遇到的东西和思考。

1. JM介绍

   JM编解码器,是一个纯软件编解码器,由位于德国的海因里希赫兹研究所(Heinrich Hertz Institute)推出,是h264官方推荐的用于研究avc算法的软件。

2. JM & x264

  JM但其未做太多优化,速度较慢,用于科研需求。x264则是JM的升级版,编码速度较快,广泛应用于企业,例如网上下载的视频,(目前的时间节点)毫不夸张地说,50%以上都是由x264压制而来。

  抄一段网上的对比:

1,X264简化了JM的代价(或者叫成本)计算方法,去掉了一些代码,进行了估算。
2,JM中是要把编码后的比特数进行加权运算后作为代价的一部分进行比较的,X264把这个部分的代码删除了,即没有把编码后的比特数作为代价的一部分。
3,X264进行了SSE2,MMX的优化。
4,X264对JM的数据结构部分进行了优化,以加快内存的数据读取速度。
5,由于JM不断地升级。JM代码里面有了很多的快速算法,包括快速搜索算法。X264则没有这些快速算法。

3. 使用哪个版本?

  jm8.6版本是最经典的版本,网上资料较齐全,建议下载该版本。

  读者可自行去官网下载代码,来编译和运行。该软件同时支持Win和Linux平台下构建,下载的代码中已经建了vc工程,也包括Makefile。

4. 构建、运行流程

  本人在Win10+mingw环境做开发验证,此外还需将一些编译工具链(gcc/ld等gcc家族产品)准备好,才能使用Makefile。

  JM目录结构如下:

  1 $ tree
  2 .
  3 |-- CHANGES.TXT
  4 |-- Changes_detail.txt
  5 |-- Readme.txt
  6 |-- bin
  7 |   |-- decoder.cfg
  8 |   |-- encoder_baseline.cfg
  9 |   |-- encoder_extended.cfg
 10 |   |-- encoder_main.cfg
 11 |   |-- foreman_part_qcif.yuv
 12 |   |-- leakybucketrate.cfg
 13 |   |-- sg0conf.cfg
 14 |   |-- sg2conf.cfg
 15 |   `-- sg6conf.cfg
 16 |-- copyright.txt
 17 |-- disclaimer.txt
 18 |-- doc
 19 |   |-- coding_style.doc
 20 |   |-- doxygen.txt
 21 |   |-- foot.html
 22 |   |-- h26l.css
 23 |   |-- ldecod.dox
 24 |   `-- lencod.dox
 25 |-- ldecod
 26 |   |-- Makefile
 27 |   |-- inc
 28 |   |   |-- annexb.h
 29 |   |   |-- biaridecod.h
 30 |   |   |-- block.h
 31 |   |   |-- cabac.h
 32 |   |   |-- context_ini.h
 33 |   |   |-- contributors.h
 34 |   |   |-- ctx_tables.h
 35 |   |   |-- defines.h
 36 |   |   |-- elements.h
 37 |   |   |-- erc_api.h
 38 |   |   |-- erc_do.h
 39 |   |   |-- erc_globals.h
 40 |   |   |-- errorconcealment.h
 41 |   |   |-- fmo.h
 42 |   |   |-- global.h
 43 |   |   |-- header.h
 44 |   |   |-- image.h
 45 |   |   |-- leaky_bucket.h
 46 |   |   |-- loopfilter.h
 47 |   |   |-- macroblock.h
 48 |   |   |-- mb_access.h
 49 |   |   |-- mbuffer.h
 50 |   |   |-- memalloc.h
 51 |   |   |-- nalu.h
 52 |   |   |-- nalucommon.h
 53 |   |   |-- output.h
 54 |   |   |-- parset.h
 55 |   |   |-- parsetcommon.h
 56 |   |   |-- rtp.h
 57 |   |   |-- sei.h
 58 |   |   `-- vlc.h
 59 |   `-- src
 60 |       |-- annexb.c
 61 |       |-- biaridecod.c
 62 |       |-- block.c
 63 |       |-- cabac.c
 64 |       |-- context_ini.c
 65 |       |-- erc_api.c
 66 |       |-- erc_do_i.c
 67 |       |-- erc_do_p.c
 68 |       |-- errorconcealment.c
 69 |       |-- filehandle.c
 70 |       |-- fmo.c
 71 |       |-- header.c
 72 |       |-- image.c
 73 |       |-- ldecod.c
 74 |       |-- leaky_bucket.c
 75 |       |-- loopFilter.c
 76 |       |-- macroblock.c
 77 |       |-- mb_access.c
 78 |       |-- mbuffer.c
 79 |       |-- memalloc.c
 80 |       |-- nal.c
 81 |       |-- nal_part.c
 82 |       |-- nalu.c
 83 |       |-- nalucommon.c
 84 |       |-- output.c
 85 |       |-- parset.c
 86 |       |-- parsetcommon.c
 87 |       |-- rtp.c
 88 |       |-- sei.c
 89 |       `-- vlc.c
 90 |-- ldecod.dsp
 91 |-- ldecod.dsw
 92 |-- ldecod.vcproj
 93 |-- lencod
 94 |   |-- Makefile
 95 |   |-- inc
 96 |   |   |-- annexb.h
 97 |   |   |-- biariencode.h
 98 |   |   |-- block.h
 99 |   |   |-- cabac.h
100 |   |   |-- configfile.h
101 |   |   |-- context_ini.h
102 |   |   |-- contributors.h
103 |   |   |-- ctx_tables.h
104 |   |   |-- defines.h
105 |   |   |-- elements.h
106 |   |   |-- fast_me.h
107 |   |   |-- fmo.h
108 |   |   |-- global.h
109 |   |   |-- header.h
110 |   |   |-- image.h
111 |   |   |-- intrarefresh.h
112 |   |   |-- leaky_bucket.h
113 |   |   |-- macroblock.h
114 |   |   |-- mb_access.h
115 |   |   |-- mbuffer.h
116 |   |   |-- memalloc.h
117 |   |   |-- minmax.h
118 |   |   |-- mv-search.h
119 |   |   |-- nalu.h
120 |   |   |-- nalucommon.h
121 |   |   |-- output.h
122 |   |   |-- parset.h
123 |   |   |-- parsetcommon.h
124 |   |   |-- ratectl.h
125 |   |   |-- rdopt_coding_state.h
126 |   |   |-- refbuf.h
127 |   |   |-- rtp.h
128 |   |   |-- sei.h
129 |   |   `-- vlc.h
130 |   `-- src
131 |       |-- annexb.c
132 |       |-- biariencode.c
133 |       |-- block.c
134 |       |-- cabac.c
135 |       |-- configfile.c
136 |       |-- context_ini.c
137 |       |-- decoder.c
138 |       |-- fast_me.c
139 |       |-- filehandle.c
140 |       |-- fmo.c
141 |       |-- header.c
142 |       |-- image.c
143 |       |-- intrarefresh.c
144 |       |-- leaky_bucket.c
145 |       |-- lencod.c
146 |       |-- loopFilter.c
147 |       |-- macroblock.c
148 |       |-- mb_access.c
149 |       |-- mbuffer.c
150 |       |-- memalloc.c
151 |       |-- mv-search.c
152 |       |-- nal.c
153 |       |-- nalu.c
154 |       |-- nalucommon.c
155 |       |-- output.c
156 |       |-- parset.c
157 |       |-- parsetcommon.c
158 |       |-- ratectl.c
159 |       |-- rdopt.c
160 |       |-- rdopt_coding_state.c
161 |       |-- refbuf.c
162 |       |-- rtp.c
163 |       |-- sei.c
164 |       |-- slice.c
165 |       |-- vlc.c
166 |       `-- weighted_prediction.c
167 |-- lencod.dsp
168 |-- lencod.dsw
169 |-- lencod.vcproj
170 |-- rtpdump
171 |   |-- ReadMe.txt
172 |   |-- StdAfx.cpp
173 |   |-- StdAfx.h
174 |   |-- rtpdump.cpp
175 |   `-- rtpdump.dsp
176 |-- tml.dsw
177 |-- tml.sln
178 `-- unixprep.sh

View Code

  1. 进入ldecod目录,执行make,即可编译出解码器,最终会将可执行文件ldecod.exe拷贝到根目录下的bin文件夹中。(可能会遇到几个预处理错误问题,是关于不同平台下最大值的定义)

  2.与上面类似,进入lencod目录,构建出编码器。

  3.进入bin目录,执行命令:

  ./ldecod.exe decoder.cfg

  其中,decoder.cfg指定了裸码流路径(不能是mp4等带文件容器格式的文件,必须是NALU形式的裸数据——可由ffmpeg提取出来)、解码后yuv文件输出路径等参数。

 

发表于
2020-11-18 00:37 
OnlyTime_唯有时光 
阅读(0
评论(0
编辑 
收藏

 

版权声明:本文为Dreaming-in-Gottingen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Dreaming-in-Gottingen/p/13997578.html

jm8.6编解码器概述的更多相关文章

  1. H264裸码流I/P/B帧类型判别

    H264裸码流I/P/B帧类型判别   花了两天时间做了个h264裸流nal类型和frame类型检测的工具,已 […]...

  2. jpeg编解码概述

    jpeg编解码概述 本博文为概览性介绍。后面有空了再分几篇博文分别介绍所用到的技术细节。 1.编解码目标   […]...

  3. 缩略图调查——抖音客户端/PC/iphone

    缩略图调查——抖音客户端/PC/iphone 最近对抖音有点上瘾,经常看到这样的视频列表:           […]...

  4. JPEG解码——(6)IDCT逆离散余弦变换

    JPEG解码——(6)IDCT逆离散余弦变换   本篇是该系列的第六篇,承接上篇IZigZag变换,介绍接下来 […]...

  5. JPEG解码——(4)霍夫曼解码

    JPEG解码——(4)霍夫曼解码 本篇是该系列的第四篇,主要介绍霍夫曼解码相关内容。 承接上篇,文件头解析完毕 […]...

  6. x264编码demo定制修改介绍

    x264编码demo定制修改介绍   x264编码器,提供了两个demo来验证编码功能:一个是大而全的x264 […]...

随机推荐

  1. USB2.0协议标准描述符

    转自  https://blog.csdn.net/hushiganghu/article/details/5 […]...

  2. centos7以后关闭防火墙

    centos 6.5关闭防火墙 # service iptables stop    临时关闭防火墙 # ch […]...

  3. 注册账号小程序

    # -*- coding:utf-8 -*- #created by wangwang import sys […]...

  4. 【Canal源码分析】数据传输协议

    Canal的数据传输有两块,一块是进行binlog订阅时,binlog转换为我们所定义的Message,第二块 […]...

  5. 使用ImpromptuInterface反射库方便的创建自定义DfaGraphWriter

    在本文中,我为创建的自定义的DfaGraphWriter实现奠定了基础。DfaGraphWriter是公开的, […]...

  6. JavaScript算法模式——动态规划和贪心算法

    动态规划   动态规划(Dynamic Programming,DP)是一种将复杂问题分解成更小的子问题来解决 […]...

  7. 第二周博客作业

    1.助教博客链接:https://home.cnblogs.com/u/lxt-/ 2.点评作业内容: htt […]...

  8. 人工智能的全面科普

    本文由  网易云 发布。   原文阅读地址:人工智能的全面科普-网易云博客   人们在日常生活中接触人工智能的 […]...

展开目录

目录导航