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