xref: /OK3568_Linux_fs/external/rknpu2/examples/3rdparty/zlmediakit/include/mk_frame.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Use of this source code is governed by MIT license that can be found in the
7*4882a593Smuzhiyun  * LICENSE file in the root of the source tree. All contributing project authors
8*4882a593Smuzhiyun  * may be found in the AUTHORS file in the root of the source tree.
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef ZLMEDIAKIT_MK_FRAME_H
12*4882a593Smuzhiyun #define ZLMEDIAKIT_MK_FRAME_H
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "mk_common.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #ifdef __cplusplus
17*4882a593Smuzhiyun extern "C" {
18*4882a593Smuzhiyun #endif
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun //是否为关键帧
21*4882a593Smuzhiyun #define MK_FRAME_FLAG_IS_KEY (1 << 0)
22*4882a593Smuzhiyun //是否为配置帧(sps/pps/vps等)
23*4882a593Smuzhiyun #define MK_FRAME_FLAG_IS_CONFIG (1 << 1)
24*4882a593Smuzhiyun //是否可丢弃的帧(sei/aud)
25*4882a593Smuzhiyun #define MK_FRAME_FLAG_DROP_ABLE  (1 << 2)
26*4882a593Smuzhiyun //是否不可单独解码的帧(多slice的非vcl帧)
27*4882a593Smuzhiyun #define MK_FRAME_FLAG_NOT_DECODE_ABLE (1 << 3)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun //codec id常量定义
30*4882a593Smuzhiyun API_EXPORT extern const int MKCodecH264;
31*4882a593Smuzhiyun API_EXPORT extern const int MKCodecH265;
32*4882a593Smuzhiyun API_EXPORT extern const int MKCodecAAC;
33*4882a593Smuzhiyun API_EXPORT extern const int MKCodecG711A;
34*4882a593Smuzhiyun API_EXPORT extern const int MKCodecG711U;
35*4882a593Smuzhiyun API_EXPORT extern const int MKCodecOpus;
36*4882a593Smuzhiyun API_EXPORT extern const int MKCodecL16;
37*4882a593Smuzhiyun API_EXPORT extern const int MKCodecVP8;
38*4882a593Smuzhiyun API_EXPORT extern const int MKCodecVP9;
39*4882a593Smuzhiyun API_EXPORT extern const int MKCodecAV1;
40*4882a593Smuzhiyun API_EXPORT extern const int MKCodecJPEG;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun typedef void *mk_frame;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun // 用户自定义free回调函数
45*4882a593Smuzhiyun typedef void(API_CALL *on_mk_frame_data_release)(void *user_data, char *ptr);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /**
48*4882a593Smuzhiyun  * 创建frame对象,并返回其引用
49*4882a593Smuzhiyun  * @param codec_id 编解码类型,请参考MKCodecXXX定义
50*4882a593Smuzhiyun  * @param dts 解码时间戳,单位毫秒
51*4882a593Smuzhiyun  * @param pts 显示时间戳,单位毫秒
52*4882a593Smuzhiyun  * @param data 单帧数据
53*4882a593Smuzhiyun  * @param size 单帧数据长度
54*4882a593Smuzhiyun  * @param cb data指针free释放回调, 如果为空,内部会拷贝数据
55*4882a593Smuzhiyun  * @param user_data data指针free释放回调用户指针
56*4882a593Smuzhiyun  * @return frame对象引用
57*4882a593Smuzhiyun  */
58*4882a593Smuzhiyun API_EXPORT mk_frame API_CALL mk_frame_create(int codec_id, uint64_t dts, uint64_t pts, const char *data, size_t size,
59*4882a593Smuzhiyun                                             on_mk_frame_data_release cb, void *user_data);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /**
62*4882a593Smuzhiyun  * 减引用frame对象
63*4882a593Smuzhiyun  * @param frame 帧对象引用
64*4882a593Smuzhiyun  */
65*4882a593Smuzhiyun API_EXPORT void API_CALL mk_frame_unref(mk_frame frame);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /**
68*4882a593Smuzhiyun  * 引用frame对象
69*4882a593Smuzhiyun  * @param frame 被引用的frame对象
70*4882a593Smuzhiyun  * @return 新的对象引用
71*4882a593Smuzhiyun  */
72*4882a593Smuzhiyun API_EXPORT mk_frame API_CALL mk_frame_ref(mk_frame frame);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /**
75*4882a593Smuzhiyun  * 获取frame 编码codec类型,请参考MKCodecXXX定义
76*4882a593Smuzhiyun  */
77*4882a593Smuzhiyun API_EXPORT int API_CALL mk_frame_codec_id(mk_frame frame);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /**
80*4882a593Smuzhiyun  * 获取帧编码codec名称
81*4882a593Smuzhiyun  */
82*4882a593Smuzhiyun API_EXPORT const char* API_CALL mk_frame_codec_name(mk_frame frame);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /**
85*4882a593Smuzhiyun  * 帧是否为视频
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun API_EXPORT int API_CALL mk_frame_is_video(mk_frame frame);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /**
90*4882a593Smuzhiyun  * 获取帧数据指针
91*4882a593Smuzhiyun  */
92*4882a593Smuzhiyun API_EXPORT const char* API_CALL mk_frame_get_data(mk_frame frame);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun /**
95*4882a593Smuzhiyun  * 获取帧数据指针长度
96*4882a593Smuzhiyun  */
97*4882a593Smuzhiyun API_EXPORT size_t API_CALL mk_frame_get_data_size(mk_frame frame);
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /**
100*4882a593Smuzhiyun  * 返回帧数据前缀长度,譬如H264/H265前缀一般是0x00 00 00 01,那么本函数返回4
101*4882a593Smuzhiyun  */
102*4882a593Smuzhiyun API_EXPORT size_t API_CALL mk_frame_get_data_prefix_size(mk_frame frame);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /**
105*4882a593Smuzhiyun  * 获取解码时间戳,单位毫秒
106*4882a593Smuzhiyun  */
107*4882a593Smuzhiyun API_EXPORT uint64_t API_CALL mk_frame_get_dts(mk_frame frame);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /**
110*4882a593Smuzhiyun  * 获取显示时间戳,单位毫秒
111*4882a593Smuzhiyun  */
112*4882a593Smuzhiyun API_EXPORT uint64_t API_CALL mk_frame_get_pts(mk_frame frame);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /**
115*4882a593Smuzhiyun  * 获取帧flag,请参考 MK_FRAME_FLAG
116*4882a593Smuzhiyun  */
117*4882a593Smuzhiyun API_EXPORT uint32_t API_CALL mk_frame_get_flags(mk_frame frame);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #ifdef __cplusplus
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun #endif
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #endif //ZLMEDIAKIT_MK_FRAME_H
124