Date: 2018.10.22
1、介绍和源码下载
- 开发组织以及开发组:MPEG, MPEG Software Simulation Group
- 源码下载地址:
https://mpeg.chiariglione.org/standards/mpeg-2/software-simulation (已经不可用)
可以使用并增加功能: https://download.csdn.net/download/soaringlee_fighting/10748537
ftp获取: ftp://ftp.mpeg.org/pub/mpeg/mssg/ - 开源协议:不确定, 推测为BSD协议
- mpeg2enc介绍:
doc/mpeg2enc.doc - mpeg2dec介绍:
doc/mpeg2dec.doc - 优化说明:只有C代码实现,没有任何架构的优化。
2、linux平台和ARM平台下编译和运行
编译:
makefile中增加arm32和arm64平台的编译:
CC_TOOL = gcc
#arm32
ifeq (findstring arm32, $(platform), arm32)
CROSS ?= arm-hisiv500-linux-
AS_TOOL = gcc
CFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -fpu=neon-vfpv4 -fPIC -Wall -Wunused-value -fsigned-char
LDFLAGS += -fPIC
endif
#arm64
ifeq (findstring arm64, $(platform), arm64)
CROSS ?= aarch64-himix100-linux-
AS_TOOL = gcc
CFLAGS += -mcpu=armv8-a -fPIC -Wall -Wunused-value -fsigned-char
LDFLAGS += -fPIC
endif
CLFAGAS += $(EXTRA_FLAGS)
CC = $(CROSS)$(CC_TOOL)
cd src/mpeg2enc
#linux 64位编译
make CFLAGS+=-O3
#linux 32位编译
make CFLAGS+=-m32 -O3
#arm 32位编译
make platform=arm32
#arm 64位编译
make platform=arm64
cd src/mpeg2dec
#linux 64位编译
make CFLAGS+=-O3
#linux 32位编译
make CLAGS+=-m32 -O3
#arm 32位编译
make platform=arm32
#arm 64位编译
make platform=arm64
运行:
#mpeg2enc运行:
./mpeg2encode in.par out.m2v
说明:
(1)其中in.par是编码配置文件,编码输入YUV,目标码率和分辨率等参数在这里进行配置。注意:原始工程中输入YUV要求是每帧分别输入分离的YUV,可以修改为输入整个YUV进行编码。通过fseek和fread函数可以很容易实现读取各帧yuv。
(2)增加时间统计函数:
利用gettimeofday函数,(gettimeofday.c和gettimeofday.h)
在put_seq()的每帧编码for循环中统计每帧的编码时间,在for循环的外面统计整个序列的编码时间。
#mpeg2dec运行
./mpeg2decode -b bitstream.m2v -f -r -o0 rec%d
说明:
(1)当前的输出YUV格式是每帧按照Y,U,V分别存储的。
可以通过在video_sequence()中设置输出文件fout并将解码的每帧yuv依次写入到fout中,注意需要修改store_yuv的方式。
(2)增加时间统计函数:
利用gettimeofday函数,(gettimeofday.c和gettimeofday.h)
在video_sequence函数中统计整个序列的解码时间,在Decode_Picture中统计每帧的解码时间。
3、Windows平台VS工程编译和运行
首先需要自己新建一个vs solution,添加相应的库源文件和demo源文件以及必要的头文件,配置相应参数。mpeg2enc和mpeg2dec的代码关系很清晰,很容易建立vs工程,可以采用cmd批处理脚本编译windows工程。
3.1 VS工程编译:
build.bat release Win32
build.bat release x64
windows cmd脚本:
@rem 说明:Windows平台命令行编译脚本
@rem 作用:通过批处理脚本命令行编译VS工程
@echo off
@rem example: build.bat Release/Debug Win32/x64
@rem set build_config= "Debug|Win32"
@rem set build_config= "Release|Win32"
@rem set build_config= $ALL
@setlocal
set build=%1
set platform=%2
set build_config="%build%|%platform%"
@echo %date% %time%
@echo %~dp0
set build_root = %~dp0
@rem vcvarsall.bat所在路径
set VCVARS="%VS120COMNTOOLS%../../VC/vcvarsall.bat"
set DEVENV="%VS120COMNTOOLS%../IDE/devenv.exe"
@rem 设置解决方案路径
set SOlUTION="%~dp0mpeg2_reference_software.sln"
@echo %SOLUTION%
if not exist %VCVARS% echo "VCVARS不存在!" &goto end
if not exist %DEVENV% echo "DEVENV不存在!" &goto end
if not exist %SOlUTION% echo "SOlUTION不存在!" &goto end
@rem 配置编译环境
@echo "config...."
if %platform%=="Win32" call %VCVARS% x86
if %platform%=="x64" call %VCVARS% x86_amd64
@echo build_config:%build_config%,please waiting
@echo "building...."
%DEVENV% %SOlUTION% /rebuild %build_config% /out build.log
copy %~dp0%build%mpeg2_enc.exe %~dp0bin
copy %~dp0%build%mpeg2_dec.exe %~dp0bin
@endlocal
:end
notepad build.log
3.2 运行
mpeg2enc编码器:
#mpeg2enc运行:
./mpeg2encode in.par out.m2v
说明:
(1)其中in.par是编码配置文件,编码输入YUV,目标码率和分辨率等参数在这里进行配置。注意:原始工程中输入YUV要求是每帧分别输入分离的YUV,可以修改为输入整个YUV进行编码。通过fseek和fread函数可以很容易实现读取各帧yuv。
(2)增加时间统计函数:
利用gettimeofday函数,(gettimeofday.c和gettimeofday.h)
在put_seq()的每帧编码for循环中统计每帧的编码时间,在for循环的外面统计整个序列的编码时间。
(3)上述2个增加功能已经实现在:https://download.csdn.net/download/soaringlee_fighting/10748537
编码器时间统计功能如下图所示:
mpeg2dec解码器:
#mpeg2dec运行
./mpeg2decode -b bitstream.m2v -f -r -o0 rec%d
说明:
(1)当前的输出YUV格式是每帧按照Y,U,V分别存储的。
可以通过在video_sequence()中设置输出文件fout并将解码的每帧yuv依次写入到fout中,注意需要修改store_yuv的方式。
(2)增加时间统计函数:
利用gettimeofday函数,(gettimeofday.c和gettimeofday.h)
在video_sequence函数中统计整个序列的解码时间,在Decode_Picture中统计每帧的解码时间。
(3)上述2个增加功能已经实现在:https://download.csdn.net/download/soaringlee_fighting/10748537
解码器时间统计功能如下图所示:
THE END!