RTK_mmp.c 3.4 KB
#include <stdio.h>

#include "JZsdkLib.h"
#include "./Enc/RTK_mmp_enc.h"
#include "./Dec/RTK_mmp_dec.h"

#include "version_choose.h"
#include "MediaProc/VideoMgmt/VideoMgmt.h"

void *Kt_Irc_enc_index = NULL;  //昆腾红外编码器的索引值
void *Kt_Cam_enc_index = NULL;  //昆腾光学编码器的索引值
void *Kt_Cam_dec_index = NULL;  //昆腾光学解码器的索引值

//昆腾红外相机的mmp初始化部分
T_JZsdkReturnCode JZsdk_Kt_IrcMMP_Init(int Irc_width, int Irc_height, int Irc_frame, int Irc_gop, int Cam_width, int Cam_height, int Cam_frame,int Cam_gop)
{
#if RTK_MPP_STATUS == VERSION_SWITCH_ON
    //初始化红外数据的编码器
    RTK_mmp_enc_Init(&Kt_Irc_enc_index, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, Irc_width, Irc_height, Irc_frame, Irc_gop);
    //RTK_mmp_enc_Init(&Kt_Irc_enc_index, MPP_VIDEO_CodingAVC, MPP_FMT_RGB888, Irc_width, Irc_height, Irc_frame);

    //初始化光学数据的编解码器
    RTK_mmp_dec_Init(&Kt_Cam_dec_index, MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, Cam_width, Cam_height);
    RTK_mmp_enc_Init(&Kt_Cam_enc_index, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, Cam_width, Cam_height, Cam_frame, Cam_gop);
#endif
}

//原始视频流通过rtkmmp转为h264
T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264(unsigned char *RawData, int data_len)
{
#if RTK_MPP_STATUS == VERSION_SWITCH_ON
    MppPacket Packet = NULL;

    RTK_mmp_enc_data_to_h264(&Kt_Irc_enc_index, RawData, data_len, &Packet);
    
    int packet_len = mpp_packet_get_length(Packet);
    void *ptr   = mpp_packet_get_pos(Packet);
    //EncCfg->Packet_eos = mpp_packet_get_eos(packet);
    // printf("获取到编码内容 len:%d\n",packet_len);

    //3、将h264流输出到视频流缓冲区
    VideoMgmt_write_data(&VideoMgmt_FirstVideo_index, ptr, packet_len);

    //释放掉packet
    mpp_packet_deinit(&Packet);
#endif
}

//昆腾光学相机数据输入部分
T_JZsdkReturnCode JZsdk_Kt_CamMMP_Mjpeg_to_h264(unsigned char *data, int data_len)
{
#if RTK_MPP_STATUS == VERSION_SWITCH_ON
    MppFrame yuv_data = NULL; //用于传递yuv数据的地址
    MppPacket Packet = NULL;

    //输入数据进入解码器
    RTK_mmp_dec_input(&Kt_Cam_dec_index, data, data_len, &yuv_data);

    // int width    = mpp_frame_get_width(yuv_data);
    // int height   = mpp_frame_get_height(yuv_data);
    // int h_stride = mpp_frame_get_hor_stride(yuv_data);
    // int v_stride = mpp_frame_get_ver_stride(yuv_data);

    // JZSDK_LOG_INFO("w:%d h:%d hor:%d ver:%d",width,height,h_stride,v_stride);

    //将返回的数据输入进编码器
    RTK_mmp_enc_yuv_to_h264_byFrame(&Kt_Cam_enc_index, yuv_data, &Packet);

    //获取数据指针与长度
    int packet_len = mpp_packet_get_length(Packet);
    void *ptr   = mpp_packet_get_pos(Packet);

    //置入视频缓冲区
    VideoMgmt_write_data(&VideoMgmt_SecondVideo_index, (unsigned char *)ptr, (unsigned int)packet_len);

    //释放掉编码图像
    mpp_packet_deinit(&Packet);
#endif
}

//昆腾相机设置下一帧为I帧
T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex)
{ 
#if RTK_MPP_STATUS == VERSION_SWITCH_ON
    if (CameraIndex == 0)
    {
        RTK_mmp_enc_SetNextFrame_IDR(&Kt_Irc_enc_index);
    }
    else if(CameraIndex == 1)
    {
        RTK_mmp_enc_SetNextFrame_IDR(&Kt_Cam_enc_index);
    }
    else
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}