• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# native_avcodec_videodecoder.h
2<!--Kit: AVCodec Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @zhanghongran-->
5<!--Designer: @dpy2650--->
6<!--Tester: @cyakee-->
7<!--Adviser: @zengyawen-->
8
9## 概述
10
11声明用于视频解码的Native API。
12
13**引用文件:** <multimedia/player_framework/native_avcodec_videodecoder.h>
14
15**库:** libnative_media_vdec.so
16
17**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
18
19**起始版本:** 9
20
21**相关模块:** [VideoDecoder](capi-videodecoder.md)
22
23**相关示例:** [AVCodec](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec)
24
25接口在每个版本的支持情况以及在解码过程中可以调用的情况,如下图所示:
26
27![meaning](figures/meaning.PNG)
28
29![desciption of decode api history](figures/video-decode-api.PNG)
30
31## 汇总
32
33### 结构体
34
35| 名称 | typedef关键字 | 描述 |
36| -- | -- | -- |
37| [MediaKeySession](capi-videodecoder-mediakeysession.md) | MediaKeySession | 为MediaKeySession定义native层对象。 |
38
39### 函数
40
41| 名称 | 描述 |
42| -- | -- |
43| [OH_AVCodec *OH_VideoDecoder_CreateByMime(const char *mime)](#oh_videodecoder_createbymime) | 根据MIME类型创建视频解码器实例,大多数情况下建议使用。 |
44| [OH_AVCodec *OH_VideoDecoder_CreateByName(const char *name)](#oh_videodecoder_createbyname) | 根据视频解码器名称创建视频解码器实例。使用此接口的前提是知道解码器的确切名称,解码器的名称可以通过能力查询获取。 |
45| [OH_AVErrCode OH_VideoDecoder_Destroy(OH_AVCodec *codec)](#oh_videodecoder_destroy) | 清理解码器内部资源,销毁解码器实例。不能重复销毁。 |
46| [OH_AVErrCode OH_VideoDecoder_SetCallback(OH_AVCodec *codec, OH_AVCodecAsyncCallback callback, void *userData)](#oh_videodecoder_setcallback) | 设置异步回调函数,让应用可以响应视频解码器生成的事件。在调用OH_VideoDecoder_Prepare接口之前,必须调用此接口。 |
47| [OH_AVErrCode OH_VideoDecoder_RegisterCallback(OH_AVCodec *codec, OH_AVCodecCallback callback, void *userData)](#oh_videodecoder_registercallback) | 注册异步回调函数,让应用可以响应视频解码器生成的事件。在调用OH_VideoDecoder_Prepare接口之前,必须调用此接口。 |
48| [OH_AVErrCode OH_VideoDecoder_SetSurface(OH_AVCodec *codec, OHNativeWindow *window)](#oh_videodecoder_setsurface) | 设置输出surface以提供视频解码输出。在初始化阶段,必须在调用OH_VideoDecoder_Prepare接口之前调用此接口。在Running状态可以直接调用该接口。 |
49| [OH_AVErrCode OH_VideoDecoder_Configure(OH_AVCodec *codec, OH_AVFormat *format)](#oh_videodecoder_configure) | 配置视频解码器,通常需要配置解码视频的描述信息,这些信息可以从OH_AVSource中提取。在调用OH_VideoDecoder_Prepare接口之前,必须调用此接口。 |
50| [OH_AVErrCode OH_VideoDecoder_Prepare(OH_AVCodec *codec)](#oh_videodecoder_prepare) | 准备解码器的内部资源,在调用该接口之前,必须调用OH_VideoDecoder_Configure接口。 |
51| [OH_AVErrCode OH_VideoDecoder_Start(OH_AVCodec *codec)](#oh_videodecoder_start) | 调用[OH_VideoDecoder_Prepare](#oh_videodecoder_prepare)接口成功后调用此接口启动解码器。成功启动后,解码器将开始报告注册的回调事件。 |
52| [OH_AVErrCode OH_VideoDecoder_Stop(OH_AVCodec *codec)](#oh_videodecoder_stop) | 停止解码器,释放输入输出buffer。停止后,可以通过调用OH_VideoDecoder_Start接口重新进入Executing状态。但需要注意的是,如果编解码器特定数据以前已输入到解码器,则需要再次输入。 |
53| [OH_AVErrCode OH_VideoDecoder_Flush(OH_AVCodec *codec)](#oh_videodecoder_flush) | 清除解码器中缓存的输入和输出数据及参数集如H264格式的PPS/SPS。调用此接口后,以前通过异步回调上报的所有缓冲区index都将失效,请确保不要访问这些index对应的缓冲区。 |
54| [OH_AVErrCode OH_VideoDecoder_Reset(OH_AVCodec *codec)](#oh_videodecoder_reset) | 重置解码器,解码器回到初始化状态。如果要继续解码,需要再次调用OH_VideoDecoder_Configure接口配置解码器实例。 |
55| [OH_AVFormat *OH_VideoDecoder_GetOutputDescription(OH_AVCodec *codec)](#oh_videodecoder_getoutputdescription) | 获取解码器输出数据的OH_AVFormat信息,请参阅{@link OH_AVFormat。需要注意的是,指向的OH_AVFormat实例在生命周期结束时需开发者通过调用接口OH_AVFormat_Destroy释放。 |
56| [OH_AVErrCode OH_VideoDecoder_SetParameter(OH_AVCodec *codec, OH_AVFormat *format)](#oh_videodecoder_setparameter) | 设置解码器的动态参数。注意,该接口只能在解码器启动后调用。同时,参数配置错误可能会导致解码失败。 |
57| [OH_AVErrCode OH_VideoDecoder_PushInputData(OH_AVCodec *codec, uint32_t index, OH_AVCodecBufferAttr attr)](#oh_videodecoder_pushinputdata) | 将填充数据的输入缓冲区提交给视频解码器。输入回调将报告可用的输入缓冲区和相应的index值,请参阅{@OH_AVCodecOnNeedInputData}。一旦具有指定index的缓冲区提交到视频解码器,则无法再次访问缓冲区,直到再次收到输入回调,报告具有相同index的缓冲区可用。此外,对于某些解码器,需要在开始时向解码器输入编解码特定数据,以初始化解码器的解码过程,如H264格式的PPS/SPS数据。 |
58| [OH_AVErrCode OH_VideoDecoder_RenderOutputData(OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_renderoutputdata) | 将处理后的输出buffer返回给解码器,并通知解码器完成在输出surface上渲染Buffer中包含的解码数据。如果之前没有配置输出surface,则调用此接口仅将指定index对应的输出缓冲区返回给解码器。 |
59| [OH_AVErrCode OH_VideoDecoder_FreeOutputData(OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_freeoutputdata) | 将处理后的输出缓冲区返回到解码器。 |
60| [OH_AVErrCode OH_VideoDecoder_PushInputBuffer(OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_pushinputbuffer) | 通知视频解码器已对index对应的缓冲区完成输入数据的填充。输入回调将报告可用的输入缓冲区和相应的index值,请参阅{@OH_AVCodecOnNeedInputBuffer}。一旦具有指定index的缓冲区提交到视频解码器,则无法再次访问缓冲区,直到再次收到输入回调,报告具有相同index的缓冲区可用。此外,对于某些解码器,需要在开始时向解码器输入编解码特定数据,以初始化解码器的解码过程,如H264格式的PPS/SPS数据。开发者可以使用该接口把解码需要的参数集如H264格式的PPS/SPS传递给解码器,该参数集可以单独送入解码器也可以和要解码的数据一起传入。 |
61| [OH_AVErrCode OH_VideoDecoder_RenderOutputBuffer(OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_renderoutputbuffer) | 将index对应的输出缓冲返回给解码器,缓冲中携带解码输出数据,并通知解码器完成在输出surface上渲染,输出缓冲包含解码数据。如果之前没有配置输出surface,则调用此接口仅将指定index对应的输出缓冲区返回给解码器。 |
62| [OH_AVErrCode OH_VideoDecoder_RenderOutputBufferAtTime(OH_AVCodec *codec, uint32_t index, int64_t renderTimestampNs)](#oh_videodecoder_renderoutputbufferattime) | 将index对应的输出缓冲返回给解码器,缓冲中携带解码输出数据,并通知解码器在开发者指定的时间内完成在输出surface上渲染,输出缓冲包含解码数据。如果之前没有配置输出surface,则调用此接口仅将指定index对应的输出缓冲区返回给解码器。开发者可以使用时间戳在特定时间(在VSYNC或者缓冲区时间戳之后)渲染缓冲区。若要在指定的时间戳显示,时间戳需要合理接近系统时间,有几点需要注意:1. 缓冲区是按照顺序处理的,因此可能会阻塞后续缓冲区在surface上的显示,如果想要对用户的一些行为做出反应,例如停止或者快进快退视频,这一点很重要。2. 如果多个缓冲区被发送到surface要在同一个VSYNC上渲染,那么最后一个将会被显示,其他的将被丢弃。3. 如果时间戳与当前的系统时间不是“合理接近”,surface将会忽略时间戳,并在可行的最早时间里显示buffer。在此模式下不会丢弃帧。 |
63| [OH_AVErrCode OH_VideoDecoder_FreeOutputBuffer(OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_freeoutputbuffer) | 将处理后的输出缓冲区返回到解码器。用户使用完需要及时调用此接口释放输出缓存区,否则会阻塞解码流程。 |
64| [OH_AVErrCode OH_VideoDecoder_IsValid(OH_AVCodec *codec, bool *isValid)](#oh_videodecoder_isvalid) | 检查当前解码实例是否有效。 |
65| [OH_AVErrCode OH_VideoDecoder_SetDecryptionConfig(OH_AVCodec *codec, MediaKeySession *mediaKeySession,bool secureVideoPath)](#oh_videodecoder_setdecryptionconfig) | 设置解密配置。在调用OH_VideoDecoder_Prepare接口之前,可选择调用此接口。 |
66| [OH_AVErrCode OH_VideoDecoder_QueryInputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs)](#oh_videodecoder_queryinputbuffer) | 查询下一个可用输入缓冲区的索引。调用此接口后需要接着调用[OH_VideoDecoder_GetInputBuffer](#oh_videodecoder_getinputbuffer)接口获取缓冲区实例,并通过[OH_VideoDecoder_PushInputBuffer](#oh_videodecoder_pushinputbuffer)接口传递给解码器。<br> 需要注意的是,上述操作仅在同步模式下支持。 |
67| [OH_AVBuffer *OH_VideoDecoder_GetInputBuffer(struct OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_getinputbuffer) | 获取可用输入缓冲区的实例。需要注意的是,此接口仅适用于同步模式。 |
68| [OH_AVErrCode OH_VideoDecoder_QueryOutputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs)](#oh_videodecoder_queryoutputbuffer) | 查询下一个可用输出缓冲区的索引。通过[OH_VideoDecoder_GetOutputBuffer](#oh_videodecoder_getoutputbuffer)接口获取的缓冲区实例可以通过执行以下操作来显示或释放解码帧:<br> 1. 通过[OH_VideoDecoder_FreeOutputBuffer](#oh_videodecoder_freeoutputbuffer)接口将处理后的输出缓冲区返回到解码器。<br> 2. 通过[OH_VideoDecoder_RenderOutputBuffer](#oh_videodecoder_renderoutputbuffer)在输出surface上渲染。<br> 3. 通过[OH_VideoDecoder_RenderOutputBufferAtTime](#oh_videodecoder_renderoutputbufferattime)在指定时间内完成输出surface上渲染。<br> 需要注意的是,上述操作仅在同步模式下支持。 |
69| [OH_AVBuffer *OH_VideoDecoder_GetOutputBuffer(struct OH_AVCodec *codec, uint32_t index)](#oh_videodecoder_getoutputbuffer) | 获取可用输出缓冲区的实例。需要注意的是,此接口仅适用于同步模式。 |
70
71## 函数说明
72
73### OH_VideoDecoder_CreateByMime()
74
75```
76OH_AVCodec *OH_VideoDecoder_CreateByMime(const char *mime)
77```
78
79**描述**
80
81根据MIME类型创建视频解码器实例,大多数情况下建议使用。
82
83**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
84
85**起始版本:** 9
86
87
88**参数:**
89
90| 参数项 | 描述 |
91| -- | -- |
92| const char *mime | MIME类型描述字符串,请参阅[AVCODEC_MIME_TYPE](capi-native-avcodec-base-h.md#变量)。 |
93
94**返回:**
95
96| 类型 | 说明 |
97| -- | -- |
98| [OH_AVCodec](capi-codecbase-oh-avcodec.md) * | 返回一个指向视频解码实例的指针。<br> 当传入的解码器类型不支持或者内存资源耗尽时,返回NULL。 |
99
100### OH_VideoDecoder_CreateByName()
101
102```
103OH_AVCodec *OH_VideoDecoder_CreateByName(const char *name)
104```
105
106**描述**
107
108根据视频解码器名称创建视频解码器实例。使用此接口的前提是知道解码器的确切名称,解码器的名称可以通过能力查询获取。
109
110详情请参见:[获取支持的编解码能力](../../media/avcodec/obtain-supported-codecs.md#创建指定名称的编解码器)。
111
112**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
113
114**起始版本:** 9
115
116
117**参数:**
118
119| 参数项 | 描述 |
120| -- | -- |
121| const char *name | 视频解码器名称。 |
122
123**返回:**
124
125| 类型 | 说明 |
126| -- | -- |
127| [OH_AVCodec](capi-codecbase-oh-avcodec.md) * | 返回指向视频解码实例的指针。<br> 当输入的解码器名称不支持或者内存资源耗尽时,返回NULL。 |
128
129### OH_VideoDecoder_Destroy()
130
131```
132OH_AVErrCode OH_VideoDecoder_Destroy(OH_AVCodec *codec)
133```
134
135**描述**
136
137清理解码器内部资源,销毁解码器实例。不能重复销毁。
138
139**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
140
141**起始版本:** 9
142
143
144**参数:**
145
146| 参数项 | 描述 |
147| -- | -- |
148| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
149
150**返回:**
151
152| 类型 | 说明 |
153| -- | -- |
154| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
155
156### OH_VideoDecoder_SetCallback()
157
158```
159OH_AVErrCode OH_VideoDecoder_SetCallback(OH_AVCodec *codec, OH_AVCodecAsyncCallback callback, void *userData)
160```
161
162**描述**
163
164设置异步回调函数,让应用可以响应视频解码器生成的事件。在调用OH_VideoDecoder_Prepare接口之前,必须调用此接口。
165
166**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
167
168**起始版本:** 9
169
170**废弃版本:** 11
171
172**替代接口:** [OH_VideoDecoder_RegisterCallback](#oh_videodecoder_registercallback)
173
174
175**参数:**
176
177| 参数项 | 描述 |
178| -- | -- |
179| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
180| [OH_AVCodecAsyncCallback](capi-codecbase-oh-avcodecasynccallback.md) callback | 所有回调函数的集合。 |
181| void *userData | 开发者执行回调所依赖的数据。 |
182
183**返回:**
184
185| 类型 | 说明 |
186| -- | -- |
187| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。<br>         AV_ERR_INVALID_STATE:本接口必须在OH_VideoDecoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。 |
188
189### OH_VideoDecoder_RegisterCallback()
190
191```
192OH_AVErrCode OH_VideoDecoder_RegisterCallback(OH_AVCodec *codec, OH_AVCodecCallback callback, void *userData)
193```
194
195**描述**
196
197注册异步回调函数,让应用可以响应视频解码器生成的事件。在调用OH_VideoDecoder_Prepare接口之前,必须调用此接口。
198
199**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
200
201**起始版本:** 11
202
203
204**参数:**
205
206| 参数项 | 描述 |
207| -- | -- |
208| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码器实例的指针。 |
209| [OH_AVCodecCallback](capi-codecbase-oh-avcodeccallback.md) callback | 所有回调函数的集合。 |
210| void *userData | 开发者执行回调所依赖的数据。 |
211
212**返回:**
213
214| 类型 | 说明 |
215| -- | -- |
216| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。<br>         AV_ERR_INVALID_STATE:本接口必须在OH_VideoDecoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。 |
217
218### OH_VideoDecoder_SetSurface()
219
220```
221OH_AVErrCode OH_VideoDecoder_SetSurface(OH_AVCodec *codec, OHNativeWindow *window)
222```
223
224**描述**
225
226设置输出surface以提供视频解码输出。<br>在初始化阶段,必须在调用OH_VideoDecoder_Prepare接口之前调用此接口。在Executing状态可以直接调用该接口。
227
228**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
229
230**起始版本:** 9
231
232
233**参数:**
234
235| 参数项 | 描述 |
236| -- | -- |
237| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
238| [OHNativeWindow](../apis-arkgraphics2d/capi-nativewindow-nativewindow.md) *window | 指向OHNativeWindow实例的指针。 |
239
240**返回:**
241
242| 类型 | 说明 |
243| -- | -- |
244| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_OPERATE_NOT_PERMIT:本接口仅支持在Surface模式下调用, 如果在Buffer模式调用, 则返回此错误码。<br>         AV_ERR_INVALID_VAL:1. 输入的codec指针为非解码器实例,或者为空指针;2. window为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。 |
245
246### OH_VideoDecoder_Configure()
247
248```
249OH_AVErrCode OH_VideoDecoder_Configure(OH_AVCodec *codec, OH_AVFormat *format)
250```
251
252**描述**
253
254配置视频解码器,通常需要配置解码视频的描述信息,这些信息可以从[OH_AVSource](capi-avsource-oh-avsource.md)中提取。在调用OH_VideoDecoder_Prepare接口之前,必须调用此接口。<br>以下参数的配置范围可通过[能力查询](../../media/avcodec/obtain-supported-codecs.md)获取,OH_MD_KEY_ROTATION配置的参数都支持。<br>设置OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY接口时如果当前平台不支持,不报错,走正常解码流程。<br>参数校验规则:
255
256| Key    | 配置正常范围的值 | 配置超出范围的值 | 不配置该参数 |
257| ----------| -------- | -------- | ------ |
258| OH_MD_KEY_WIDTH         | AV_ERR_OK       | AV_ERR_INVALID_VAL      | AV_ERR_INVALID_VAL  |
259| OH_MD_KEY_HEIGHT        | AV_ERR_OK       | AV_ERR_INVALID_VAL       | AV_ERR_INVALID_VAL     |
260| OH_MD_KEY_PIXEL_FORMAT 请参阅[OH_AVPixelFormat](capi-native-avformat-h.md#oh_avpixelformat)    | AV_ERR_OK       | AV_ERR_UNSUPPORT       | AV_ERR_OK      |
261| OH_MD_KEY_FRAME_RATE    | AV_ERR_OK       | AV_ERR_INVALID_VAL       | AV_ERR_OK     |
262| OH_MD_KEY_ROTATION 请参阅[OH_MD_KEY_ROTATION](capi-native-avcodec-base-h.md#变量)| AV_ERR_OK       | AV_ERR_INVALID_VAL       | AV_ERR_OK      |
263
264> **说明:**
265>
266> 建议按照该实例需要支持的最大分辨率来配置,否则可能会出现高于该分辨率的码流解码会触发异常。该设置直接影响应用的内存使用情况。
267
268**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
269
270**起始版本:** 9
271
272
273**参数:**
274
275| 参数项 | 描述 |
276| -- | -- |
277| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
278| [OH_AVFormat](capi-core-oh-avformat.md) *format | 指向OH_AVFormat的指针,用于给出要解码的视频轨道的描述。 |
279
280**返回:**
281
282| 类型 | 说明 |
283| -- | -- |
284| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:1. 输入的codec指针为非解码器实例,或者为空指针;2. 输入format参数不支持。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。<br>         AV_ERR_INVALID_STATE:本接口必须在OH_VideoDecoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。<br>         AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION:不支持色彩空间转换功能。 |
285
286### OH_VideoDecoder_Prepare()
287
288```
289OH_AVErrCode OH_VideoDecoder_Prepare(OH_AVCodec *codec)
290```
291
292**描述**
293
294准备解码器的内部资源,在调用该接口之前,必须调用OH_VideoDecoder_Configure接口。
295
296**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
297
298**起始版本:** 9
299
300
301**参数:**
302
303| 参数项 | 描述 |
304| -- | -- |
305| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
306
307**返回:**
308
309| 类型 | 说明 |
310| -- | -- |
311| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:1. 内部执行错误;2. 配置了色彩空间转换功能,但解码器处于Buffer模式。 |
312
313### OH_VideoDecoder_Start()
314
315```
316OH_AVErrCode OH_VideoDecoder_Start(OH_AVCodec *codec)
317```
318
319**描述**
320
321调用[OH_VideoDecoder_Prepare](#oh_videodecoder_prepare)接口成功后调用此接口启动解码器。成功启动后,解码器将开始报告注册的回调事件。
322
323**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
324
325**起始版本:** 9
326
327
328**参数:**
329
330| 参数项 | 描述 |
331| -- | -- |
332| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
333
334**返回:**
335
336| 类型 | 说明 |
337| -- | -- |
338| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:1. 内部执行错误;2. 视频色彩空间转换功能已配置,但是没有调用OH_VideoDecoder_Prepare接口。 |
339
340### OH_VideoDecoder_Stop()
341
342```
343OH_AVErrCode OH_VideoDecoder_Stop(OH_AVCodec *codec)
344```
345
346**描述**
347
348停止解码器,释放输入输出buffer。停止后,可以通过调用OH_VideoDecoder_Start接口重新进入Running状态。<br>需要注意的是,如果编解码器特定数据以前已输入到解码器,则需要再次输入。
349
350**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
351
352**起始版本:** 9
353
354
355**参数:**
356
357| 参数项 | 描述 |
358| -- | -- |
359| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
360
361**返回:**
362
363| 类型 | 说明 |
364| -- | -- |
365| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
366
367### OH_VideoDecoder_Flush()
368
369```
370OH_AVErrCode OH_VideoDecoder_Flush(OH_AVCodec *codec)
371```
372
373**描述**
374
375清除解码器中缓存的输入和输出数据及参数集如H.264格式的PPS/SPS。<br>调用此接口后,以前通过异步回调上报的所有缓冲区index都将失效,请确保不要访问这些index对应的缓冲区。
376
377**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
378
379**起始版本:** 9
380
381
382**参数:**
383
384| 参数项 | 描述 |
385| -- | -- |
386| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
387
388**返回:**
389
390| 类型 | 说明 |
391| -- | -- |
392| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
393
394### OH_VideoDecoder_Reset()
395
396```
397OH_AVErrCode OH_VideoDecoder_Reset(OH_AVCodec *codec)
398```
399
400**描述**
401
402重置解码器,解码器回到初始化状态。如果要继续解码,需要再次调用OH_VideoDecoder_Configure接口配置解码器实例。
403
404**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
405
406**起始版本:** 9
407
408
409**参数:**
410
411| 参数项 | 描述 |
412| -- | -- |
413| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
414
415**返回:**
416
417| 类型 | 说明 |
418| -- | -- |
419| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
420
421### OH_VideoDecoder_GetOutputDescription()
422
423```
424OH_AVFormat *OH_VideoDecoder_GetOutputDescription(OH_AVCodec *codec)
425```
426
427**描述**
428
429获取解码器输出数据的OH_AVFormat信息,请参阅[OH_AVFormat](capi-core-oh-avformat.md)。<br>需要注意的是,指向的OH_AVFormat实例在生命周期结束时需开发者通过调用接口[OH_AVFormat_Destroy](capi-native-avformat-h.md#oh_avformat_destroy)释放。
430
431**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
432
433**起始版本:** 9
434
435
436**参数:**
437
438| 参数项 | 描述 |
439| -- | -- |
440| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
441
442**返回:**
443
444| 类型 | 说明 |
445| -- | -- |
446| [OH_AVFormat](capi-core-oh-avformat.md) * | 返回指向OH_AVFormat实例的指针。<br> 当输入的codec指针非解码器实例,或者为空指针,则返回NULL。 |
447
448### OH_VideoDecoder_SetParameter()
449
450```
451OH_AVErrCode OH_VideoDecoder_SetParameter(OH_AVCodec *codec, OH_AVFormat *format)
452```
453
454**描述**
455
456设置解码器的动态参数。<br>注意,该接口只能在解码器启动后调用。同时,参数配置错误可能会导致解码失败。
457
458**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
459
460**起始版本:** 9
461
462
463**参数:**
464
465| 参数项 | 描述 |
466| -- | -- |
467| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
468| [OH_AVFormat](capi-core-oh-avformat.md) *format | 指向OH_AVFormat实例的指针。 |
469
470**返回:**
471
472| 类型 | 说明 |
473| -- | -- |
474| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:1. 输入的codec指针为非解码器实例,或者为空指针;2. 输入format参数不支持。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
475
476### OH_VideoDecoder_PushInputData()
477
478```
479OH_AVErrCode OH_VideoDecoder_PushInputData(OH_AVCodec *codec, uint32_t index, OH_AVCodecBufferAttr attr)
480```
481
482**描述**
483
484将填充数据的输入缓冲区提交给视频解码器。<br>输入回调将报告可用的输入缓冲区和相应的index值,请参阅[OH_AVCodecOnNeedInputData](capi-native-avcodec-base-h.md#oh_avcodeconneedinputdata)。一旦具有指定index的缓冲区提交到视频解码器,则无法再次访问缓冲区,直到再次收到输入回调,报告具有相同index的缓冲区可用。<br>此外,对于某些解码器,需要在开始时向解码器输入编解码特定数据,以初始化解码器的解码过程,如H.264格式的PPS/SPS数据。
485
486**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
487
488**起始版本:** 9
489
490**废弃版本:** 11
491
492**替代接口:** [OH_VideoDecoder_PushInputBuffer](#oh_videodecoder_pushinputbuffer)
493
494
495**参数:**
496
497| 参数项 | 描述 |
498| -- | -- |
499| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
500| uint32_t index | 输入Buffer对应的索引值。由[OH_AVCodecOnNeedInputData](capi-native-avcodec-base-h.md#oh_avcodeconneedinputdata)给出。 |
501| OH_AVCodecBufferAttr attr | 描述缓冲区中包含的数据的信息。 |
502
503**返回:**
504
505| 类型 | 说明 |
506| -- | -- |
507| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
508
509### OH_VideoDecoder_RenderOutputData()
510
511```
512OH_AVErrCode OH_VideoDecoder_RenderOutputData(OH_AVCodec *codec, uint32_t index)
513```
514
515**描述**
516
517将处理后的输出buffer返回给解码器,并通知解码器完成在输出surface上渲染buffer中包含的解码数据。<br>如果之前没有配置输出surface,则调用此接口仅将指定index对应的输出缓冲区返回给解码器。
518
519**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
520
521**起始版本:** 9
522
523**废弃版本:** 11
524
525**替代接口:** [OH_VideoDecoder_RenderOutputBuffer](#oh_videodecoder_renderoutputbuffer)
526
527
528**参数:**
529
530| 参数项 | 描述 |
531| -- | -- |
532| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
533| uint32_t index | 输出Buffer对应的索引值。由[OH_AVCodecOnNewOutputData](capi-native-avcodec-base-h.md#oh_avcodeconnewoutputdata)给出。 |
534
535**返回:**
536
537| 类型 | 说明 |
538| -- | -- |
539| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
540
541### OH_VideoDecoder_FreeOutputData()
542
543```
544OH_AVErrCode OH_VideoDecoder_FreeOutputData(OH_AVCodec *codec, uint32_t index)
545```
546
547**描述**
548
549将处理后的输出缓冲区返回到解码器。
550
551**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
552
553**起始版本:** 9
554
555**废弃版本:** 11
556
557**替代接口:** [OH_VideoDecoder_FreeOutputBuffer](#oh_videodecoder_freeoutputbuffer)
558
559
560**参数:**
561
562| 参数项 | 描述 |
563| -- | -- |
564| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
565| uint32_t index | 输出buffer对应的索引值。由[OH_AVCodecOnNewOutputData](capi-native-avcodec-base-h.md#oh_avcodeconnewoutputdata)给出。 |
566
567**返回:**
568
569| 类型 | 说明 |
570| -- | -- |
571| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
572
573### OH_VideoDecoder_PushInputBuffer()
574
575```
576OH_AVErrCode OH_VideoDecoder_PushInputBuffer(OH_AVCodec *codec, uint32_t index)
577```
578
579**描述**
580
581通知视频解码器已对index对应的缓冲区完成输入数据的填充。<br>输入回调将报告可用的输入缓冲区和相应的index值,请参阅[OH_AVCodecOnNeedInputBuffer](capi-native-avcodec-base-h.md#oh_avcodeconneedinputbuffer)。一旦具有指定index的缓冲区提交到视频解码器,则无法再次访问缓冲区,直到再次收到输入回调,报告具有相同index的缓冲区可用。<br>此外,对于某些解码器,需要在开始时向解码器输入编解码特定数据,以初始化解码器的解码过程,如H.264格式的PPS/SPS数据。<br>开发者可以使用该接口把解码需要的参数集如H.264格式的PPS/SPS传递给解码器,该参数集可以单独送入解码器也可以和要解码的数据一起传入。
582
583**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
584
585**起始版本:** 11
586
587
588**参数:**
589
590| 参数项 | 描述 |
591| -- | -- |
592| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
593| uint32_t index | 输入buffer对应的索引值。由[OH_AVCodecOnNeedInputBuffer](capi-native-avcodec-base-h.md#oh_avcodeconneedinputbuffer)给出。 |
594
595**返回:**
596
597| 类型 | 说明 |
598| -- | -- |
599| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
600
601### OH_VideoDecoder_RenderOutputBuffer()
602
603```
604OH_AVErrCode OH_VideoDecoder_RenderOutputBuffer(OH_AVCodec *codec, uint32_t index)
605```
606
607**描述**
608
609将index对应的输出缓冲返回给解码器,缓冲中携带解码输出数据,并通知解码器完成在输出surface上渲染,输出缓冲包含解码数据。<br>如果之前没有配置输出surface,则调用此接口仅将指定index对应的输出缓冲区返回给解码器。
610
611**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
612
613**起始版本:** 11
614
615
616**参数:**
617
618| 参数项 | 描述 |
619| -- | -- |
620| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
621| uint32_t index | 输出buffer对应的索引值。由[OH_AVCodecOnNewOutputBuffer](capi-native-avcodec-base-h.md#oh_avcodeconnewoutputbuffer)给出。 |
622
623**返回:**
624
625| 类型 | 说明 |
626| -- | -- |
627| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
628
629### OH_VideoDecoder_RenderOutputBufferAtTime()
630
631```
632OH_AVErrCode OH_VideoDecoder_RenderOutputBufferAtTime(OH_AVCodec *codec, uint32_t index, int64_t renderTimestampNs)
633```
634
635**描述**
636
637将index对应的输出缓冲返回给解码器,缓冲中携带解码输出数据,并通知解码器在开发者指定的时间内完成在输出surface上渲染,输出缓冲包含解码数据。<br>如果之前没有配置输出surface,则调用此接口仅将指定index对应的输出缓冲区返回给解码器。<br>开发者可以使用时间戳在特定时间(在VSYNC或者缓冲区时间戳之后)渲染缓冲区。若要在指定的时间戳显示,时间戳需要合理接近系统时间,有几点需要注意:<br>1. 缓冲区是按照顺序处理的,因此可能会阻塞后续缓冲区在surface上的显示,如果想要对用户的一些行为做出反应,例如停止或者快进快退视频,这一点很重要。<br>2. 如果多个缓冲区被发送到surface要在同一个VSYNC上渲染,那么最后一个将会被显示,其他的将被丢弃。<br>3. 如果时间戳与当前的系统时间不是“合理接近”,surface将会忽略时间戳,并在可行的最早时间里显示buffer。在此模式下不会丢弃帧。
638
639**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
640
641**起始版本:** 12
642
643
644**参数:**
645
646| 参数项 | 描述 |
647| -- | -- |
648| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
649| uint32_t index | 输出buffer对应的索引值。由[OH_AVCodecOnNewOutputBuffer](capi-native-avcodec-base-h.md#oh_avcodeconnewoutputbuffer)给出。 |
650| int64_t renderTimestampNs | 输出buffer被发送到surface的时间戳,取值范围大于0,应由std::chrono::steady_clock标准库时钟生成,且单位为纳秒。 |
651
652**返回:**
653
654| 类型 | 说明 |
655| -- | -- |
656| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
657
658### OH_VideoDecoder_FreeOutputBuffer()
659
660```
661OH_AVErrCode OH_VideoDecoder_FreeOutputBuffer(OH_AVCodec *codec, uint32_t index)
662```
663
664**描述**
665
666将处理后的输出缓冲区返回到解码器。用户使用完需要及时调用此接口释放输出缓存区,否则会阻塞解码流程。<br>详情请参见:[视频解码](../../media/avcodec/video-decoding.md) “Surface模式的步骤-12或Buffer模式步骤-10”。
667
668**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
669
670**起始版本:** 11
671
672
673**参数:**
674
675| 参数项 | 描述 |
676| -- | -- |
677| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针 |
678| uint32_t index | 输出buffer对应的索引值。由[OH_AVCodecOnNewOutputBuffer](capi-native-avcodec-base-h.md#oh_avcodeconnewoutputbuffer)给出。 |
679
680**返回:**
681
682| 类型 | 说明 |
683| -- | -- |
684| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:1. 输入的codec指针为非解码器实例,或者为空指针;2. index非法或者连续给同一个index,该错误不影响后续解码流程。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 |
685
686### OH_VideoDecoder_IsValid()
687
688```
689OH_AVErrCode OH_VideoDecoder_IsValid(OH_AVCodec *codec, bool *isValid)
690```
691
692**描述**
693
694在解码器实例存在的情况下,检查当前解码器服务是否有效。
695
696**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
697
698**起始版本:** 10
699
700
701**参数:**
702
703| 参数项 | 描述 |
704| -- | -- |
705| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
706| bool *isValid | 输出参数,指向布尔类型的指针。只有当接口返回AV_ERR_OK时,该值表示解码器服务的有效性(true为有效,false为无效)。建议开发者将isValid初始化为false。 |
707
708**返回:**
709
710| 类型 | 说明 |
711| -- | -- |
712| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。 |
713
714### OH_VideoDecoder_SetDecryptionConfig()
715
716```
717OH_AVErrCode OH_VideoDecoder_SetDecryptionConfig(OH_AVCodec *codec, MediaKeySession *mediaKeySession,bool secureVideoPath)
718```
719
720**描述**
721
722设置解密配置。在调用OH_VideoDecoder_Prepare接口之前,可选择调用此接口。
723
724**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
725
726**起始版本:** 11
727
728
729**参数:**
730
731| 参数项 | 描述 |
732| -- | -- |
733| [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
734| [MediaKeySession](capi-videodecoder-mediakeysession.md) *mediaKeySession | 指向带有解密功能的DRM会话实例的指针。 |
735| bool secureVideoPath | 安全视频通路。指定安全视频通路为true,非安全视频通路为false。在[Surface模式](../../media/avcodec/video-decoding.md#surface模式)下,既支持安全视频通路,也支持非安全视频通路。在[Buffer模式](../../media/avcodec/video-decoding.md#buffer模式)下,仅支持非安全视频通路。 |
736
737**返回:**
738
739| 类型 | 说明 |
740| -- | -- |
741| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_OPERATE_NOT_PERMIT:1. 内部执行错误;2. 解码服务进程异常;3. 媒体密钥会话服务处于错误状态。<br>         AV_ERR_INVALID_VAL:1. 输入的codec指针为非解码器实例或为空指针;2. mediaKeySession为nullptr或无效。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。 |
742
743### OH_VideoDecoder_QueryInputBuffer()
744
745```
746OH_AVErrCode OH_VideoDecoder_QueryInputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs)
747```
748
749**描述**
750
751查询下一个可用输入缓冲区的索引。<br>调用此接口后需要接着调用[OH_VideoDecoder_GetInputBuffer](#oh_videodecoder_getinputbuffer)接口获取缓冲区实例,并通过[OH_VideoDecoder_PushInputBuffer](#oh_videodecoder_pushinputbuffer)接口传递给解码器。<br> 需要注意的是,上述操作仅在同步模式下支持。
752
753**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
754
755**起始版本:** 20
756
757
758**参数:**
759
760| 参数项 | 描述 |
761| -- | -- |
762| struct [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
763| uint32_t *index | 输入buffer对应的索引值。 |
764| int64_t timeoutUs | 超时时长,单位为微秒。负值:无限等待;0:立即退出;正值:等待指定时长后退出。 |
765
766**返回:**
767
768| 类型 | 说明 |
769| -- | -- |
770| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_SERVICE_DIED:编解码服务已终止。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:禁止异步模式下使用。<br>         AV_ERR_TRY_AGAIN_LATER:查询失败,建议等待短暂间隔后重试。 |
771
772### OH_VideoDecoder_GetInputBuffer()
773
774```
775OH_AVBuffer *OH_VideoDecoder_GetInputBuffer(struct OH_AVCodec *codec, uint32_t index)
776```
777
778**描述**
779
780获取可用输入缓冲区的实例。<br>需要注意的是,此接口仅适用于同步模式。
781
782**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
783
784**起始版本:** 20
785
786
787**参数:**
788
789| 参数项 | 描述 |
790| -- | -- |
791| struct [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
792| uint32_t index | 输入buffer对应的索引值,可通过[OH_VideoDecoder_QueryInputBuffer](#oh_videodecoder_queryinputbuffer)接口获取。 |
793
794**返回:**
795
796| 类型 | 说明 |
797| -- | -- |
798| [OH_AVBuffer](capi-core-oh-avbuffer.md) * | 如果执行成功,则返回一个指向OH_AVBuffer实例的指针,否则返回NULL。 |
799
800### OH_VideoDecoder_QueryOutputBuffer()
801
802```
803OH_AVErrCode OH_VideoDecoder_QueryOutputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs)
804```
805
806**描述**
807
808查询下一个可用输出缓冲区的索引。<br>通过[OH_VideoDecoder_GetOutputBuffer](#oh_videodecoder_getoutputbuffer)接口获取的缓冲区实例可以通过执行以下操作来显示或释放解码帧:<br> 1. 通过[OH_VideoDecoder_FreeOutputBuffer](#oh_videodecoder_freeoutputbuffer)接口将处理后的输出缓冲区返回到解码器。<br> 2. 通过[OH_VideoDecoder_RenderOutputBuffer](#oh_videodecoder_renderoutputbuffer)在输出surface上渲染。<br> 3. 通过[OH_VideoDecoder_RenderOutputBufferAtTime](#oh_videodecoder_renderoutputbufferattime)在指定时间内完成输出surface上渲染。<br> 需要注意的是,上述操作仅在同步模式下支持。
809
810**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
811
812**起始版本:** 20
813
814
815**参数:**
816
817| 参数项 | 描述 |
818| -- | -- |
819| struct [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
820| uint32_t *index | 输出buffer对应的索引值。 |
821| int64_t timeoutUs | 超时时长,单位为微秒。负值:无限等待;0:立即退出;正值:等待指定时长后退出。 |
822
823**返回:**
824
825| 类型 | 说明 |
826| -- | -- |
827| [OH_AVErrCode](capi-native-averrors-h.md#oh_averrcode) | AV_ERR_OK:执行成功。<br>         AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。<br>         AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。<br>         AV_ERR_UNKNOWN:未知错误。<br>         AV_ERR_SERVICE_DIED:编解码服务已终止。<br>         AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。<br>         AV_ERR_OPERATE_NOT_PERMIT:禁止异步模式下使用。<br>         AV_ERR_STREAM_CHANGED:流格式已变更,可以通过调用[OH_VideoDecoder_GetOutputDescription](#oh_videodecoder_getoutputdescription)接口获取新的流信息。<br>         AV_ERR_TRY_AGAIN_LATER:查询失败,建议等待短暂间隔后重试。 |
828
829### OH_VideoDecoder_GetOutputBuffer()
830
831```
832OH_AVBuffer *OH_VideoDecoder_GetOutputBuffer(struct OH_AVCodec *codec, uint32_t index)
833```
834
835**描述**
836
837获取可用输出缓冲区的实例。<br>需要注意的是,此接口仅适用于同步模式。
838
839**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder
840
841**起始版本:** 20
842
843
844**参数:**
845
846| 参数项 | 描述 |
847| -- | -- |
848| struct [OH_AVCodec](capi-codecbase-oh-avcodec.md) *codec | 指向视频解码实例的指针。 |
849| uint32_t index | 输出buffer对应的索引值,可通过[OH_VideoDecoder_QueryOutputBuffer](#oh_videodecoder_queryoutputbuffer)接口获取。 |
850
851**返回:**
852
853| 类型 | 说明 |
854| -- | -- |
855| [OH_AVBuffer](capi-core-oh-avbuffer.md) * | 如果执行成功,则返回一个指向OH_AVBuffer实例的指针,否则返回NULL。 |
856
857
858