【mpeg2】MPEG-2官方参考代码MPEG2_reference_software

Date: 2018.10.22


1、介绍和源码下载
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!

原文地址:https://www.cnblogs.com/SoaringLee/p/10532326.html