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