firefly rk3399 硬件解码,多通道解码

这是一个关于多媒体处理的测试程序,包括H264解码和帧处理。程序使用了多线程,每个线程对应不同的解码模式,并从管道中读取数据。解码后的帧被写入文件并进行一些处理,如图片格式转换和信息统计。测试涵盖了不同输入文件和配置选项,如帧数、输出格式和解码模式。

#include "sys/sock.h"

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <string.h>

#include <iostream>

#include <pthread.h>

#include <time.h>

#include <string>

#include <dirent.h>

#include <stdlib.h>

#include "rk_mpi.h"

#include "mpp_log.h"

#include "mpp_mem.h"

#include "mpp_env.h"

#include "mpp_time.h"

#include "mpp_common.h"

#include "mpp_task.h"

#include "utils.h"

#include "ffmpeg_task.hh"

#include "opencv_task.hh"

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>


 

#define MPI_DEC_LOOP_COUNT          4

#define MPI_DEC_STREAM_SIZE         (1024*5)

#define MAX_FILE_NAME_LENGTH        256

typedef struct {

    MppCtx          ctx;

    MppApi          *mpi;

    /* end of stream flag when set quit the loop */

    RK_U32          eos;

    /* buffer for stream data reading */

    char            *buf;

    /* input and output */

    MppBufferGroup  frm_grp;

    MppBufferGroup  pkt_grp;

    MppPacket       packet;

    size_t          packet_size;

    MppFrame        frame;

    FILE            *fp_input;

    FILE            *fp_output;

    FILE            *fp_config;

    RK_S32          frame_count;

    RK_S32          frame_num;

    size_t          max_usage;

} MpiDecLoopData,MpiDecLoopData1;

typedef struct {

    char            file_input[MAX_FILE_NAME_LENGTH];

    char            file_output[MAX_FILE_NAME_LENGTH];

    char            file_config[MAX_FILE_NAME_LENGTH];

    MppCodingType   type;

    MppFrameFormat  format;

    RK_U32          width;

    RK_U32          height;

    RK_U32          debug;

    RK_U32          have_input;

    RK_U32          have_output;

    RK_U32          have_config;

    RK_U32          simple;

    RK_S32          timeout;

    RK_S32          frame_num;

    size_t          pkt_size;

    // report information

    size_t          max_usage;

} MpiDecTestCmd,MpiDecTestCmd1;

static OptionInfo mpi_dec_cmd[] = {

    {"i",               "input_file",           "input bitstream file"},

    {"o",               "output_file",          "output bitstream file, "},

    {"c",               "ops_file",             "input operation config file"},

    {"w",               "width",                "the width of input bitstream"},

    {"h",               "height",               "the height of input bitstream"},

    {"t",               "type",                 "input stream coding type"},

    {"f",               "format",               "output frame format type"},

    {"d",               "debug",                "debug flag"},

    {"x",               "timeout",              "output timeout interval"},

    {"n",               "frame_number",         "max output frame number"},

};

pthread_mutex_t mutex0 ; 

pthread_mutex_t mutex1 ; 

pthread_mutex_t mutex2 ; 

pthread_mutex_t mutex3 ; 

pthread_mutex_t mutex4 ; 

pthread_mutex_t mutex5 ; 

unsigned int summ_list0=0;

unsigned int summ_list1=0;

unsigned int summ_list2=0;

unsigned int summ_list3=0;

unsigned int summ_list4=0;

unsigned int summ_list5=0;

static unsigned char mpp_buffer[640*480*3/2];

FILE *fdddd;

static void dump_mpp_frame_to_file0(MppFrame frame,int mode)

{

    static int flage0=0;

    static int flage1=0;

    static int flage2=0;

    static int flage3=0;

    static int flage4=0;

    static int flage5=0;

    RK_U32 width    = 0;

    RK_U32 height   = 0;

    //RK_U32 h_stride = 0;

    //RK_U32 v_stride = 0;

    //MppFrameFormat fmt  = MPP_FMT_YUV420SP;

    MppBuffer buffer    = NULL;

    RK_U8 *base = NULL;

    

    if (NULL == frame)

        return ;

    width    = mpp_frame_get_width(frame);

    height   = mpp_frame_get_height(frame);

    //h_stride = mpp_frame_get_hor_stride(frame);

    //v_stride = mpp_frame_get_ver_stride(frame);

    //fmt      = mpp_frame_get_fmt(frame);

    buffer   = mpp_frame_get_buffer(frame);

    if (NULL == buffer)

        return ;

    base = (RK_U8 *)mpp_buffer_get_ptr(buffer);

    switch(mode){

        case 0:flage0+=1;if(flage0>=7){flage0=0;pthread_mutex_lock(&mutex0);list_addd0( mode, 512, 288,base);summ_list0++;pthread_mutex_unlock(&mutex0);}break;

        case 1:flage1+=1;if(flage1>=7){flage1=0;pthread_mutex_lock(&mutex1);list_addd1( mode, 512, 288,base);summ_list1++;pthread_mutex_unlock(&mutex1);}break;

        case 2:flage2+=1;if(flage2>=7){flage2=0;pthread_mutex_lock(&mutex2);guiyihua_pic(base,width,height,mpp_buffer);/*fwrite(mpp_buffer, 1, 640*480*3/2, fdddd);list_addd2( mode, 640, 480,mpp_buffer);summ_list2++;*/pthread_mutex_unlock(&mutex2);}break;

        case 3:flage3+=1;if(flage3>=7){flage3=0;pthread_mutex_lock(&mutex3);list_addd3( mode, 512, 288,base);summ_list3++;pthread_mutex_unlock(&mutex3);}break;

        case 4:flage4+=1;if(flage4>=7){flage4=0;pthread_mutex_lock(&mutex4);/*list_addd4( mode, 512, 288,base);summ_list4++;*/pthread_mutex_unlock(&mutex4);}break;

        case 5:flage5+=1;if(flage5>=7){flage5=0;pthread_mutex_lock(&mutex5);/*list_addd5( mode, 512, 288,base);summ_list5++;*/pthread_mutex_unlock(&mutex5);}break;

        default:break;

    }

}

static int decode_simple(MpiDecLoopData *data,int mode,int fd,int n)

{

    RK_U32 pkt_done = 0;

    RK_U32 pkt_eos  = 0;

    MPP_RET ret = MPP_OK;

    MppCtx ctx  = data->ctx;

    MppApi *mpi = data->mpi;

    char   *buf = data->buf;

    MppPacket packet = data->packet;

    MppFrame  frame  = NULL;

    size_t read_size = 0;

    size_t packet_size = data->packet_size;

    char log_buf[256];

    do {

        /*if (data->fp_config) {

            char line[MAX_FILE_NAME_LENGTH];

            char *ptr = NULL;

            do {

                ptr = fgets(line, MAX_FILE_NAME_LENGTH, data->fp_config);

                if (ptr) {

                    OpsLine info;

                    RK_S32 cnt = parse_config_line(line, &info);

                    // parser for packet message

                    if (cnt >= 3 && 0 == strncmp("pkt", info.cmd, sizeof(info.cmd))) {

                        packet_size = info.value2;

                        break;

                    }

                    // parser for reset message at the end

                    if (0&nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌风_lwp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值