From e677e41502e0876a03df952b46ea1f1db40bf815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=91=E6=B3=BD=E5=AF=B0?= Date: Fri, 28 Feb 2025 12:49:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Eps=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?c=20api=20(#4172)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/include/mk_frame.h | 34 ++++++++++++++++++++++++++++++++++ api/source/mk_frame.cpp | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/api/include/mk_frame.h b/api/include/mk_frame.h index 68d06ce2..d5da969c 100644 --- a/api/include/mk_frame.h +++ b/api/include/mk_frame.h @@ -343,6 +343,40 @@ API_EXPORT void API_CALL mk_mpeg_muxer_init_complete(mk_mpeg_muxer ctx); */ API_EXPORT int API_CALL mk_mpeg_muxer_input_frame(mk_mpeg_muxer ctx, mk_frame frame); +////////////////////////////////////////////////////////////////////// +#if defined(ENABLE_RTPPROXY) + +typedef struct mk_ps_decoder_t *mk_ps_decoder; + +typedef void (API_CALL *on_mk_ps_decoder_stream)(void *user_data, int stream, int codecid, const void *ext, size_t ext_len, int finish); +typedef void(API_CALL *on_mk_ps_decoder_frame)(void *user_data, int stream, int codecid, int flags, int64_t pts, int64_t dts, const void *data, size_t bytes); + +/** + * 创建一个ps解析器 + * @param scb stream 回调; 可选, 如果明确知道数据类型也许不需要此回调创建track? + * @param dcb 数据回调;必填 + * @param user_data 用户自定义数据 + * @return + */ +API_EXPORT mk_ps_decoder API_CALL mk_ps_decoder_create(on_mk_ps_decoder_stream scb, on_mk_ps_decoder_frame dcb, void * user_data); + +/** + * 释放ps解析器 + * @param ctx + */ +API_EXPORT void API_CALL mk_ps_decoder_release(mk_ps_decoder ctx); + +/** + * 输入ps数据 + * @param ctx ps解析器指针 + * @param data ps数据指针 + * @param bytes 数据长度 + */ +API_EXPORT void API_CALL mk_ps_decoder_input(mk_ps_decoder ctx, const char * data, size_t bytes); + + +# endif + #ifdef __cplusplus } #endif diff --git a/api/source/mk_frame.cpp b/api/source/mk_frame.cpp index c84453d3..94d5cb50 100644 --- a/api/source/mk_frame.cpp +++ b/api/source/mk_frame.cpp @@ -11,6 +11,7 @@ #include "mk_frame.h" #include "Record/MPEG.h" #include "Extension/Factory.h" +#include "Rtp/PSDecoder.h" using namespace mediakit; @@ -223,4 +224,36 @@ API_EXPORT int API_CALL mk_mpeg_muxer_input_frame(mk_mpeg_muxer ctx, mk_frame fr assert(ctx && frame); auto ptr = reinterpret_cast(ctx); return ptr->inputFrame(*((Frame::Ptr *) frame)); -} \ No newline at end of file +} + + +////////////////////////////////////////////////////////////////////// +#if defined(ENABLE_RTPPROXY) + +API_EXPORT mk_ps_decoder API_CALL mk_ps_decoder_create(on_mk_ps_decoder_stream scb, on_mk_ps_decoder_frame dcb, void * user_data) { + assert(dcb); + auto ps_decoder = new PSDecoder(); + std::shared_ptr ptr(user_data, [](void *) {}); + if (scb) { + ps_decoder->setOnStream([ptr,scb](int stream, int codecid, const void *extra, size_t bytes, int finish) { + scb(ptr.get(), stream, getCodecByMpegId(codecid), extra, bytes, finish); + }); + } + ps_decoder->setOnDecode([ptr,dcb](int stream, int codecid, int flags, int64_t pts, int64_t dts, const void *data, size_t bytes) { + dcb(ptr.get(), stream,getCodecByMpegId(codecid),flags,pts,dts,data,bytes); + }); + return reinterpret_cast(ps_decoder); +} + +API_EXPORT void API_CALL mk_ps_decoder_release(mk_ps_decoder ctx) { + assert(ctx); + auto ptr = reinterpret_cast(ctx); + delete ptr; +} + +API_EXPORT void API_CALL mk_ps_decoder_input(mk_ps_decoder ctx, const char * data, size_t bytes) { + assert(ctx && data); + auto ptr = reinterpret_cast(ctx); + ptr->input(reinterpret_cast(data), bytes); +} +#endif \ No newline at end of file