2018-02-01 17:24:23 u012478275 阅读数 2568
  • 从官方例程深度学习海思SDK及API-第2/11季视频课程

    本季课程详细分析海思SDK中的sample程序的实现,讲解视频采集中的基本概念,视频sensor的工作原理、像素和视频分辨率的关系、rawRGB和RGB888的换算等。重点内容是海思SDK中API文档的带读。本季课程非常关键,学完本季才表示对海思方案入门。课程隶属朱有鹏物联网大讲堂“项目驱动创新学习训练营”之《A0201-海思HI3518E方案视频编解码传输深度学习》项目,项目共11季,此为第2季

    1952 人正在学习 去看看 朱有鹏

 前言:

 海思提供的媒体处理软件平台(Media Process Platform,简称MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPI(MPP Programe Interface)接口完成相应功能。该平台支持应用软件快速开发以下功能:输入视频捕获、H.264/MJPEG/JPEG/MPEG4 编码、H264/VC1/MPEG4/MPEG2/AVS 解码、视频输出显示、视频图像前处理(包括去噪、增强、锐化、Deinterlace)、编码码流叠加OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。

一、HI3520D的视频子系统
    分为视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频侦测分析(VDA)、音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)、区域管理(REGION)等模块

1、视频输入(VI)模块实现的功能:将芯片外的视频数据通过ITU-R BT656/601/1120 接口或Digital Camera 接口接收,存入到指定的内存区域。在此过程中,VI 可以对接收到的原始视频图像数据进行裁剪(Crop)、水平垂直缩小(Down Scaling)和水平垂直翻转(Mirror、Flip)等处理,并实现一路原始视频图像输入,输出一路或多路视频图像功能。

2、VPSS 是视频前处理单元,全称为Video Process Sub-System。支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后输出多种不同分辨率的图像。VPSS 单元支持的具体图像处理功能包括PreScale、De-ring/De-block、NR、IE、DIE、Sharpen 等。

3、VENC 模块即视频编码模块。本模块支持多路实时编码,且每路编码彼此独立,编码协议和编码profile 可以不同。本模块支持视频编码同时,调度Region 模块对编码图像内容进行叠加和遮挡。本模块的输入源包括三类:第一类是用户态读取图像文件向编码模块发送数据;第二类是视频输入(VIU)模块采集的图像经视频处理子系统(VPSS)发送到编码模块;第三类是视频输入(VIU)模块采集的图像直接发送到编码模块。

4、视频解码(VDEC):VDEC 模块提供驱动视频解码硬件工作的MPI 接口,实现视频解码功能

5、VOU(Video Output Unit)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出。

6、视频侦测分析(VDA)通过检测视频的亮度变化,得出视频侦测分析结果。VDA 包含运动侦测(MD)和遮挡检测(OD)两种工作模式


7、AUDIO 模块包括音频输入、音频输出、音频编码、音频解码四个子模块。音频输入和输出模块通过对 Hi35xx 芯片音频接口的控制实现音频输入输出功能。音频编码和解码模块提供对G711、G726、ADPCM 格式的音频编解码功能,并支持录制和播放LPCM格式的原始音频文件

8、更多详细内容和各模块函数接口,可以去下载文档http://download.csdn.net/download/u012478275/10116909

9、海思音视频编解码源码下载:http://download.csdn.net/download/u012478275/10118411




2019-04-18 10:21:10 u014689845 阅读数 798
  • 从官方例程深度学习海思SDK及API-第2/11季视频课程

    本季课程详细分析海思SDK中的sample程序的实现,讲解视频采集中的基本概念,视频sensor的工作原理、像素和视频分辨率的关系、rawRGB和RGB888的换算等。重点内容是海思SDK中API文档的带读。本季课程非常关键,学完本季才表示对海思方案入门。课程隶属朱有鹏物联网大讲堂“项目驱动创新学习训练营”之《A0201-海思HI3518E方案视频编解码传输深度学习》项目,项目共11季,此为第2季

    1952 人正在学习 去看看 朱有鹏

处理器内核
− ARM Cortex A17 四核@Max. 1.4GHz
− ARM Cortex A7 单核@Max. 900MHz

视频编解码处理
− 4x4K(3840*2160)@30fps H.265/H.264解码 + 2x1080p@30fps H.264编码
− 16x1080p@30fps H.265/H.264解码 + 2x1080p@30fps H.264编码
− 9x1080p@30fps H.265/H.264解码 + 4K@30fps H.264编码
− 32x720p@30fps H.265/H.264解码 + 4x720p@30fps H.264编码

GPU
− 集成 Mali-T720 GPU
− 支持 OpenGL ES3.1/2.0/1.1
− 支持 OpenCL 1.2/1.1/1.0
− 三角形填充率高达 63MTris/s
− 支持双精度 FP64 及抗锯齿功能

视频输出接口
− 1个HDMI 2.0 超高清输出接口,最大输出3840 x 2160@60fps
− 1个VGA高清输出接口(排针),最大输出2560 x 1600@60fps
− 1个HDMI(BT.1120->SII9022->HDMI) 高清输出接口,最大输出1080P@60fps



− 1个CVBS输出接口

存储器接口
− DDR 容量 2GByte/16Gbit
− SPI NOR 容量 32MByte/256Mbit
− NAND Flash 容量 128MByte/1Gbit
− SPI NAND 预留位置,未贴



网络接口
− 支持 2 个千兆以太网接口

音频接口
− 1个LINE IN,3.5mm接口
− 1个LINE OUT,3.5mm接口
− 1个差分MIC输入,双排针
− 1个差分音频输出,双排针

外围接口
− 4 个SATA3.0 接口 支持PM功能 支持eSATA
− 2 个USB 2.0 HOST 接口,支持Hub 功能
− 1 个USB 3.0 HOST 接口,支持Hub 功能
− 4 个UART 接口,其中 2 个用于调试
− 1 个IR 接口
− 21 个GPIO 接口
− 1 个蜂鸣器
− 1 个按钮接GPIO
− 1 个SOP8加密芯片位置,可贴AT88SC0104CA或兼容芯片
− 外置复位芯片

 

 

2019-08-13 10:29:08 A707471534 阅读数 364
  • 从官方例程深度学习海思SDK及API-第2/11季视频课程

    本季课程详细分析海思SDK中的sample程序的实现,讲解视频采集中的基本概念,视频sensor的工作原理、像素和视频分辨率的关系、rawRGB和RGB888的换算等。重点内容是海思SDK中API文档的带读。本季课程非常关键,学完本季才表示对海思方案入门。课程隶属朱有鹏物联网大讲堂“项目驱动创新学习训练营”之《A0201-海思HI3518E方案视频编解码传输深度学习》项目,项目共11季,此为第2季

    1952 人正在学习 去看看 朱有鹏

海思3536解码G711音频


最近的一个项目,需要增加对G711的解码功能。而HI3536这款芯片是支持对G711进行CPU软件编解码的,所有的解码功能都基于独立封装的海思音频解码库,核心解码器工作在用户态,使用 CPU 软件解码。
对于海思的芯片来说,如果想要解码标准的G711音频数据的话,需要在G711音频数据流的每一帧前面都要加上一个海思的数据头,这样的G711音频数据才能被海思所解码。对于G711来说,HI3536能获取每帧数据长度为:N*40 (N 为[1,5]的任意正整数)。
海思语音帧结构为:
在这里插入图片描述
代码处理:

FILE* fp = fopen(argv[1], "rb");

fseek(fp,0L,SEEK_END); //定位到文件末尾  
int flen = ftell(fp); // 得到文件大小 

fseek(fp,0L,SEEK_SET);// 回到文件头部

printf("flen = %d\n",flen);

int size  = 2 * 1024 * 1024;

char* buffer = (char*)malloc(size);
bzero(buffer,size);
if(fp)
{
	fread(buffer, 1, size , fp);
	fclose(fp);
}

int newlen = flen/200;
if( flen %200 )
{
	newlen += 1;
}

printf("newlen = %d\n",newlen);

newlen = flen + newlen*4;
printf("newlen = %d\n",newlen);
short * p = (short *)malloc(newlen);
bzero(p,newlen);

HisiVoiceAddHisiHeader((short *)buffer,(short *)p,200,flen);

free(buffer);

从标准的G711音频文件中读取数据,然后在按帧长度为200的间隔,对每个帧前加上一个海思的语音帧结构。

对于3536解码G711的过程,参考了海思提供的SDK,其中有个音频解码的demo sample_audio.c,具体的代码就不做分析,只是介绍一下大体上是怎么实现的,有兴趣的可以自己去看该代码。

G711解码流程:

  1. MMP系统初始化
  2. 设置音频输出设备属性,比如:采样率,数据宽度,I2S主从模式等
  3. 根据所设置的属性,创建ADEC通道
  4. 设置 AO 设备属性、启用 AO 设备、启用 AO 通道
  5. 数据源到数据接收者进行绑定
  6. 发送音频码流到音频解码通道

大体上的流程就是这样,还是个小白,只是想将学习的过程记录下来.

2019-08-29 21:26:10 yeshennet 阅读数 209
  • 从官方例程深度学习海思SDK及API-第2/11季视频课程

    本季课程详细分析海思SDK中的sample程序的实现,讲解视频采集中的基本概念,视频sensor的工作原理、像素和视频分辨率的关系、rawRGB和RGB888的换算等。重点内容是海思SDK中API文档的带读。本季课程非常关键,学完本季才表示对海思方案入门。课程隶属朱有鹏物联网大讲堂“项目驱动创新学习训练营”之《A0201-海思HI3518E方案视频编解码传输深度学习》项目,项目共11季,此为第2季

    1952 人正在学习 去看看 朱有鹏

webrtc-android h264只支持 OMX.ExynosOMX.IntelOMX.NvidiaOMX.qcom 这几个的硬解。不支持软解.
支持软解我做了,记录在这篇博客中。
支持海思芯片的硬解,只要改下 HardwareVideoEncoderFactory::isHardwareSupportedInCurrentSdkH264 修改下白名单即可(增加OMX.hisi )。

这篇文章是增加了开关之后兼容性测试出现了问题的解决办法。

是什么问题呢?

用户观察上表现为卡顿,能收到数据,没有丢包,但是十几帧解一帧。

关键日志有几行(有删节):

I VDEC    : [set_parameter] : [5184] set_parameter:OMX_IndexParamPortDefinition
E VDEC    : [check_port_param] : [5001] set_parameter: invalid buffer count 15, should not be bigger than max count 14
E OMXNodeInstance: setParameter(0xe73aa220:hisi.decoder.avc, ParamPortDefinition(0x2000001)) ERROR: Undefined(0x80001001)
W ACodec  : [OMX.hisi.video.decoder.avc] setting nBufferCountActual to 15 failed: -2147483648

W video_decoder_wrapper.cc: (line 172): Java decoder produced an unexpected frame: -1000
I VDEC    : [empty_this_buffer] : [6698] [ETB] TimeStamp: 47264352000

解决问题的思路有几个

  1. webrtc的mediacodec的设置不对,数据源不对。

    系统软解和软解都可以正常播放

  2. hisi芯片不是完整的支持avc/hevc的解码

    用自己写的demo,发现可以正常播放出来。

  3. 我们的数据流不对

    自己推流,方法见这篇博客:https://blog.csdn.net/yeshennet/article/details/96993036
    可以正常播放。考虑是数据流有问题,请求推流的同学支援了。

  4. webrtc代码中的某个判断逻辑错了

    找了一下,修改方法是这样的:videodecoderwrapper.cc

void VideoDecoderWrapper::OnDecodedFrame(JNIEnv* jni,
                                         jobject jframe,
                                         jobject jdecode_time_ms,
                                         jobject jqp) {
  const jlong capture_time_ns =
      jni->CallLongMethod(jframe, video_frame_get_timestamp_ns_method_);
  FrameExtraInfo frame_extra_info;
  do {
    if (frame_extra_infos_.empty()) {
      LOG(LS_WARNING) << "Java decoder produced an unexpected frame.";
      // --- Modify by Yeshen ... for omx.hisi.video.decoder.avc
      break;
      //return;
      // --- End modify ...
    }

    frame_extra_info = frame_extra_infos_.front();
    frame_extra_infos_.pop_front();
    // If the decoder might drop frames so iterate through the queue until we
    // find a matching timestamp.
  } while (frame_extra_info.capture_time_ns != capture_time_ns);

本质上是什么问题呢?

https://developer.android.com/reference/android/media/MediaCodec.BufferInfo
The presentation timestamp in microseconds for the buffer. This is derived from the presentation timestamp passed in with the corresponding input buffer. This should be ignored for a 0-sized buffer.

我们的数据流过来,通过hisi的解码器,MediaCodec.BufferInfo 中的 presentationTimeUs 丢失了。

但是看描述是必须的,但是P、B帧缺失了这个数据。

至于我们的数据流为啥解析出来会缺少这个字段。
可能是海思有自己的算法;
可能是数据流的编码方式有问题。

2019.8.30

编码端做了修改,客户端无需绕过。验证修改有效。

2017-07-08 12:37:30 liqinghan 阅读数 1294
  • 从官方例程深度学习海思SDK及API-第2/11季视频课程

    本季课程详细分析海思SDK中的sample程序的实现,讲解视频采集中的基本概念,视频sensor的工作原理、像素和视频分辨率的关系、rawRGB和RGB888的换算等。重点内容是海思SDK中API文档的带读。本季课程非常关键,学完本季才表示对海思方案入门。课程隶属朱有鹏物联网大讲堂“项目驱动创新学习训练营”之《A0201-海思HI3518E方案视频编解码传输深度学习》项目,项目共11季,此为第2季

    1952 人正在学习 去看看 朱有鹏

uboot和内核都必须修改。

struct spi_info hisfc350_spi_info_table[] ;

在结构体里面添加自己的flash节点,我这里用的是MX66LS51235E

{
		 "MX66L(S512)35(E/F)", //chip name
		 {0xC2,0x20, 0x1A}, ///chip id nor flash has itself ID
		 3,  //ID len
		 _64M, //flash size
		 _64K, //falsh sectors size
		 4, //clock
		 {
			&READ_STD(0,  INFINITE, 40/*50*/), //standard read clock, in datesheet 
			&READ_FAST(1, INFINITE, 104),///fast read clock, in datesheet 
			&READ_DUAL(2, INFINITE, 104),///dual read clock, in datesheet 
			&READ_DUAL_ADDR(1, INFINITE, 84),///dual read addr clock, in datesheet 
#ifndef CONFIG_CLOSE_SPI_8PIN_4IO
			&READ_QUAD_ADDR(3, INFINITE, 70),///qual read addr clock, in datesheet 
#endif
			0
		},
		{
			&WRITE_STD(0, 256, 75),
			0
		},

		{
			&ERASE_SECTOR_64K(0, _64K, 80),
			0
		},
		&spi_driver_mx66lS512, // 驱动函数,寻找类似的芯片修改即可!,如果没有要看detasheet 编写相应的驱动程序
}


海思SDK编译填坑

阅读数 222

没有更多推荐了,返回首页