Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
c70977ea
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
c70977ea
编写于
10月 29, 2022
作者:
O
openharmony_ci
提交者:
Gitee
10月 29, 2022
浏览文件
操作
浏览文件
下载
差异文件
!10748 Codec文档修改
Merge pull request !10748 from 张浩东/master
上级
d01a7a7e
89cb77c2
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
14 addition
and
15 deletion
+14
-15
zh-cn/device-dev/driver/driver-peripherals-codec-des.md
zh-cn/device-dev/driver/driver-peripherals-codec-des.md
+14
-15
未找到文件。
zh-cn/device-dev/driver/driver-peripherals-codec-des.md
浏览文件 @
c70977ea
...
...
@@ -3,7 +3,7 @@
## 概述
### 功能简介
OpenHarmony Codec HDI
驱动框架基于OpenMax实现了视频硬件编解码驱动,提供Codec基础能力接口给上层媒体服务调用,包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁组件等功能,实现对视频数据的编解码处理(可以将YUV/RGB等格式的视频数据编码成H264/H265等编码格式,也可以将H264/H265等裸流数据解码成YUV/RGB等格式数据)。本文主要介绍基于HDF
驱动框架开发的Codec编解码功能。
OpenHarmony Codec HDI
(Hardware Device Interface)驱动框架基于OpenMax实现了视频硬件编解码驱动,提供Codec基础能力接口给上层媒体服务调用,包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁组件等功能,实现对视频数据的编解码处理(可以将YUV/RGB等格式的视频数据编码成H264/H265等编码格式,也可以将H264/H265等裸流数据解码成YUV/RGB等格式数据)。本文主要介绍基于HDF(Hardware Driver Foundation)
驱动框架开发的Codec编解码功能。
Codec HDI驱动框架基于HDF驱动框架实现。Codec HDI驱动架构组成:
...
...
@@ -16,7 +16,7 @@ Codec HDI驱动框架基于HDF驱动框架实现。Codec HDI驱动架构组成
-
Codec HDI Adapter:HDI 实现层,实现了HDI Interface接口,并与OpenMax IL 对接。
-
OpenMax IL Interface:OpenMax IL接口,Codec HDI驱动直接对接OpenMax IL层。
-
Vendor Impl:厂商适配层,各大厂商适配的OpenMax 实现层。
-
Codec Hard
W
are:硬件解码设备。
-
Codec Hard
w
are:硬件解码设备。
### 基本概念
在进行开发前,开发者应了解一下基本概念:
...
...
@@ -35,7 +35,7 @@ Codec HDI驱动框架基于HDF驱动框架实现。Codec HDI驱动架构组成
-
码率
视频的码率是指在单位时间内传输的视频数据数量,一般用kbps作为单位。码率越高,视频就越清晰,反之则画面粗糙而多马赛克。
视频的码率是指在单位时间内传输的视频数据数量,一般用kbps作为单位。码率越高,视频就越清晰,反之则画面粗糙而
且
多马赛克。
-
组件
...
...
@@ -59,7 +59,7 @@ Codec模块主要完成对视频数据的硬件编解码,将H264等裸流数
| 接口名称 | 功能描述 |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------|
| int32_t (
*CreateComponent)(struct CodecComponentType **component, uint32_t *
componentId, char
*compName, int64_t appData, struct CodecCallbackType *
callbacks) | 创建Codec组件实例 |
| int32_t (
*
DestroyComponent)(uint32_t componentId) | 销毁组件实例 |
| int32_t (
*
DestroyComponent)(uint32_t componentId) | 销毁
Codec
组件实例 |
-
codec_component _if.h
...
...
@@ -133,7 +133,7 @@ HDF_INIT(g_codecComponentDriverEntry); // 将Codec HDI的HdfDriverEntry结构体
}
```
-
HdfCodecComponentTypeDriverInit:加载HCS中的属性配置。
-
HdfCodecComponentTypeDriverInit:加载HCS
(HDF Configuration Source)
中的属性配置。
```c
int32_t HdfCodecComponentTypeDriverInit(struct HdfDeviceObject *deviceObject)
...
...
@@ -172,7 +172,7 @@ HCS配置包括两部分:
HCS配置内容包括:驱动节点、加载顺序、服务名称等。HCS语法可参考
[
配置管理
](
driver-hdf-manage.md
)
。
标准系统配置文件路径(其它系统暂不涉及):
以RK3568开发板为例,
标准系统配置文件路径(其它系统暂不涉及):
vendor/hihope/rk3568/hdf_config/uhdf/
1.
device相关配置
...
...
@@ -392,22 +392,22 @@ bool CodecHdiDecode::UseBufferOnPort(enum PortIndex portIndex)
auto
err
=
client_
->
GetParameter
(
client_
,
OMX_IndexParamPortDefinition
,
(
int8_t
*
)
&
param
,
sizeof
(
param
));
if
(
err
!=
HDF_SUCCESS
)
{
HDF_LOGE
(
"%{public}s failed to GetParameter with OMX_IndexParamPortDefinition : portIndex[%{public}d]"
,
__func__
,
portIndex
);
__func__
,
portIndex
);
return
false
;
}
bufferSize
=
param
.
nBufferSize
;
bufferCount
=
param
.
nBufferCountActual
;
bPortEnable
=
param
.
bEnabled
;
HDF_LOGI
(
"buffer index [%{public}d], buffer size [%{public}d], "
"buffer count [%{public}d], portEnable[%{public}d], err [%{public}d]"
,
portIndex
,
bufferSize
,
bufferCount
,
bPortEnable
,
err
);
"buffer count [%{public}d], portEnable[%{public}d], err [%{public}d]"
,
portIndex
,
bufferSize
,
bufferCount
,
bPortEnable
,
err
);
{
OMX_PARAM_BUFFERSUPPLIERTYPE
param
;
InitParam
(
param
);
param
.
nPortIndex
=
(
uint32_t
)
portIndex
;
auto
err
=
client_
->
GetParameter
(
client_
,
OMX_IndexParamCompBufferSupplier
,
(
int8_t
*
)
&
param
,
sizeof
(
param
));
HDF_LOGI
(
"param.eBufferSupplier[%{public}d] isSupply [%{public}d], err [%{public}d]"
,
param
.
eBufferSupplier
,
this
->
isSupply_
,
err
);
this
->
isSupply_
,
err
);
}
// 设置端口buffer
UseBufferOnPort
(
portIndex
,
bufferCount
,
bufferSize
);
...
...
@@ -536,7 +536,7 @@ while (!this->exit_) {
client_
->
SendCommand
(
client_
,
OMX_CommandStateSet
,
OMX_StateIdle
,
NULL
,
0
);
```
对rk OMX解码时,
不支持数据的分帧,所以需要手动分帧,目前简单实现按照起始码0x000001或0x00000001分帧发送到服务端处理。分帧代码如下:
当在rk开发板上进行解码时,由于其OMX的实现
不支持数据的分帧,所以需要手动分帧,目前简单实现按照起始码0x000001或0x00000001分帧发送到服务端处理。分帧代码如下:
```
cpp
// 文件分帧读取实现
...
...
@@ -646,8 +646,7 @@ int32_t OMXCore::onFillBufferDone(struct OmxCodecBuffer* pBuffer)
int32_t
CodecHdiDecode
::
OnEvent
(
struct
CodecCallbackType
*
self
,
enum
OMX_EVENTTYPE
event
,
struct
EventInfo
*
info
)
{
HDF_LOGI
(
"onEvent: appData[0x%{public}p], eEvent [%{public}d], "
"nData1[%{public}d]"
,
info
->
appData
,
event
,
info
->
data1
);
"nData1[%{public}d]"
,
info
->
appData
,
event
,
info
->
data1
);
switch
(
event
)
{
case
OMX_EventCmdComplete
:
{
OMX_COMMANDTYPE
cmd
=
(
OMX_COMMANDTYPE
)
info
->
data1
;
...
...
@@ -665,7 +664,7 @@ int32_t CodecHdiDecode::OnEvent(struct CodecCallbackType *self, enum OMX_EVENTTY
```
#### 接口去初始化
组件关闭前,需要将组件状态修改为
IDLE
,然后开始释放输入输出Buffer,再将组件状态修改为OMX_StateLoaded,最后再调用DestoryComponent去关闭组件。
组件关闭前,需要将组件状态修改为
OMX_StateIdle
,然后开始释放输入输出Buffer,再将组件状态修改为OMX_StateLoaded,最后再调用DestoryComponent去关闭组件。
##### Buffer释放示例
...
...
@@ -721,7 +720,7 @@ OpenMax不支持分帧。
**解决办法**
上层在调用EmptyThisBuffer时,需要按照
一帧一帧
传入。
上层在调用EmptyThisBuffer时,需要按照
每次一帧的方式
传入。
## 解码过程中全是绿屏
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录