Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

154 řádky
4.7KB

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