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