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