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_TRANSCODE_H 12 #define ZLMEDIAKIT_MK_TRANSCODE_H 13 14 #include "mk_common.h" 15 #include "mk_track.h" 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 //解码器对象 22 typedef void *mk_decoder; 23 //解码后的frame 24 typedef void *mk_frame_pix; 25 //SwsContext的包装 26 typedef void *mk_swscale; 27 //FFmpeg原始解码帧对象 28 typedef struct AVFrame AVFrame; 29 //FFmpeg编解码器对象 30 typedef struct AVCodecContext AVCodecContext; 31 //解码输出回调 32 typedef void(API_CALL *on_mk_decode)(void *user_data, mk_frame_pix frame); 33 34 /** 35 * 创建解码器 36 * @param track track对象 37 * @param thread_num 解码线程数,0时为自动 38 * @return 返回解码器对象,NULL代表失败 39 */ 40 API_EXPORT mk_decoder API_CALL mk_decoder_create(mk_track track, int thread_num); 41 42 /** 43 * 销毁解码器 44 * @param ctx 解码器对象 45 * @param flush_frame 是否等待所有帧解码成功 46 */ 47 API_EXPORT void API_CALL mk_decoder_release(mk_decoder ctx, int flush_frame); 48 49 /** 50 * 解码音视频帧 51 * @param ctx 解码器 52 * @param frame 帧对象 53 * @param async 是否异步解码 54 * @param enable_merge 是否合并帧解码,有些情况下,需要把时间戳相同的slice合并输入到解码器才能解码 55 */ 56 API_EXPORT void API_CALL mk_decoder_decode(mk_decoder ctx, mk_frame frame, int async, int enable_merge); 57 58 /** 59 * 设置异步解码最大帧缓存积压数限制 60 */ 61 API_EXPORT void API_CALL mk_decoder_set_max_async_frame_size(mk_decoder ctx, size_t size); 62 63 /** 64 * 设置解码输出回调 65 * @param ctx 解码器 66 * @param cb 回调函数 67 * @param user_data 回调函数用户指针参数 68 */ 69 API_EXPORT void API_CALL mk_decoder_set_cb(mk_decoder ctx, on_mk_decode cb, void *user_data); 70 71 /** 72 * 获取FFmpeg原始AVCodecContext对象 73 * @param ctx 解码器 74 */ 75 API_EXPORT const AVCodecContext* API_CALL mk_decoder_get_context(mk_decoder ctx); 76 77 ///////////////////////////////////////////////////////////////////////////////////////////// 78 79 /** 80 * 创建解码帧mk_frame_pix新引用 81 * @param frame 原始引用 82 * @return 新引用 83 */ 84 API_EXPORT mk_frame_pix API_CALL mk_frame_pix_ref(mk_frame_pix frame); 85 86 /** 87 * 解码帧mk_frame_pix减引用 88 * @param frame 原始引用 89 */ 90 API_EXPORT void API_CALL mk_frame_pix_unref(mk_frame_pix frame); 91 92 /** 93 * 从FFmpeg AVFrame转换为mk_frame_pix 94 * @param frame FFmpeg AVFrame 95 * @return mk_frame_pix对象 96 */ 97 API_EXPORT mk_frame_pix API_CALL mk_frame_pix_from_av_frame(AVFrame *frame); 98 99 /** 100 * 获取FFmpeg AVFrame对象 101 * @param frame 解码帧mk_frame_pix 102 * @return FFmpeg AVFrame对象 103 */ 104 API_EXPORT AVFrame* API_CALL mk_frame_pix_get_av_frame(mk_frame_pix frame); 105 106 ///////////////////////////////////////////////////////////////////////////////////////////// 107 108 /** 109 * 创建ffmpeg SwsContext wrapper实例 110 * @param output AVPixelFormat类型,AV_PIX_FMT_BGR24==3 111 * @param width 目标宽度,置0时,则与输入时一致 112 * @param height 目标高度,置0时,则与输入时一致 113 * @return SwsContext wrapper 实例 114 */ 115 API_EXPORT mk_swscale mk_swscale_create(int output, int width, int height); 116 117 /** 118 * 释放ffmpeg SwsContext wrapper实例 119 * @param ctx SwsContext wrapper实例 120 */ 121 API_EXPORT void mk_swscale_release(mk_swscale ctx); 122 123 /** 124 * 使用SwsContext转换pix format 125 * @param ctx SwsContext wrapper实例 126 * @param frame pix frame 127 * @param out 转换后存放的数据指针,用户需要确保提前申请并大小足够 128 * @return sws_scale()返回值:the height of the output slice 129 */ 130 API_EXPORT int mk_swscale_input_frame(mk_swscale ctx, mk_frame_pix frame, uint8_t *out); 131 132 /** 133 * 使用SwsContext转换pix format 134 * @param ctx SwsContext wrapper实例 135 * @param frame pix frame 136 * @return 新的pix frame对象,需要使用mk_frame_pix_unref销毁 137 */ 138 API_EXPORT mk_frame_pix mk_swscale_input_frame2(mk_swscale ctx, mk_frame_pix frame); 139 140 ///////////////////////////////////////////////////////////////////////////////////////////// 141 142 API_EXPORT uint8_t** API_CALL mk_get_av_frame_data(AVFrame *frame); 143 API_EXPORT int* API_CALL mk_get_av_frame_line_size(AVFrame *frame); 144 API_EXPORT int64_t API_CALL mk_get_av_frame_dts(AVFrame *frame); 145 API_EXPORT int64_t API_CALL mk_get_av_frame_pts(AVFrame *frame); 146 API_EXPORT int API_CALL mk_get_av_frame_width(AVFrame *frame); 147 API_EXPORT int API_CALL mk_get_av_frame_height(AVFrame *frame); 148 API_EXPORT int API_CALL mk_get_av_frame_format(AVFrame *frame); 149 150 #ifdef __cplusplus 151 } 152 #endif 153 154 #endif //ZLMEDIAKIT_MK_TRANSCODE_H