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

#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 == strncmp("rst", info.cmd, 3)) {

                        //mpp_log("%p get reset cmd\n", ctx);

                        packet_size = 0;

                        break;

                    }

                } else {

                    //mpp_log("aa%p get end of cfg file\n", ctx);

                    packet_size = 0;

                    break;

                }

            } while (1);

        }*/

        // when packet size is valid read the input binary file

        if (packet_size){

             read_size=MPI_DEC_STREAM_SIZE;

             switch(mode){

                case 0:read(fd,buf,read_size);break;

                case 1:read(fd,buf,read_size);break;

                case 2:read(fd,buf,read_size);break;

                case 3:read(fd,buf,read_size);/*a_queue_pop((unsigned char*)buf, read_size);read_size=0;*/break;

                case 4:read(fd,buf,read_size);break;

                case 5:read(fd,buf,read_size);break;

                case 6:break;

                case 7:break;

                default:break;

            }

        }

        if (!packet_size || read_size != packet_size || feof(data->fp_input)) {

            if (data->frame_num < 0) {

                clearerr(data->fp_input);

                rewind(data->fp_input);

                /*if (data->fp_config) {

                    clearerr(data->fp_config);

                    rewind(data->fp_config);

                }*/

                data->eos = pkt_eos = 0;

                //mpp_log("%p loop again\n", ctx);

            } else {

                // setup eos flag

                data->eos = pkt_eos = 1;

                //mpp_log("%p found last packet\n", ctx);

                break;

            }

        }

    } while (!read_size);

   

    // write data to packet

    mpp_packet_write(packet, 0, buf, read_size);

    // reset pos and set valid length

    mpp_packet_set_pos(packet, buf);

    mpp_packet_set_length(packet, read_size);

    // setup eos flag

    if (pkt_eos)

        mpp_packet_set_eos(packet);

    do {

        RK_S32 times = 5;

        // send the packet first if packet is not done

        if (!pkt_done) {

            ret = mpi->decode_put_packet(ctx, packet);

            if (MPP_OK == ret)

                pkt_done = 1;

        }

        // then get all available frame and release

        do {

            RK_S32 get_frm = 0;

            RK_U32 frm_eos = 0;

        try_again:

            ret = mpi->decode_get_frame(ctx, &frame);

            if (MPP_ERR_TIMEOUT == ret) {

                if (times > 0) {

                    times--;

                    msleep(2);

                    goto try_again;

                }

                //mpp_err("%p decode_get_frame failed too much time\n", ctx);

            }

            if (MPP_OK != ret) {

                //mpp_err("%p decode_get_frame failed ret %d\n", ret, ctx);

                break;

            }

            if (frame) {

                if (mpp_frame_get_info_change(frame)) {

                    RK_U32 width = mpp_frame_get_width(frame);

                    RK_U32 height = mpp_frame_get_height(frame);

                    RK_U32 hor_stride = mpp_frame_get_hor_stride(frame);

                    RK_U32 ver_stride = mpp_frame_get_ver_stride(frame);

                    RK_U32 buf_size = mpp_frame_get_buf_size(frame);

                    /*mpp_log("%p decode_get_frame get info changed found\n", ctx);

                    mpp_log("%p decoder require buffer w:h [%d:%d] stride [%d:%d] buf_size %d",

                            ctx, width, height, hor_stride, ver_stride, buf_size);*/

                    if (NULL == data->frm_grp) {

                        /* If buffer group is not set create one and limit it */

                        ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION);

                        if (ret) {

                            //mpp_err("%p get mpp buffer group failed ret %d\n", ctx, ret);

                            break;

                        }

                        /* Set buffer to mpp decoder */

                        ret = mpi->control(ctx, MPP_DEC_SET_EXT_BUF_GROUP, data->frm_grp);

                        if (ret) {

                            //mpp_err("%p set buffer group failed ret %d\n", ctx, ret);

                            break;

                        }

                    } else {

                        /* If old buffer group exist clear it */

                        ret = mpp_buffer_group_clear(data->frm_grp);

                        if (ret) {

                            //mpp_err("%p clear buffer group failed ret %d\n", ctx, ret);

                            break;

                        }

                    }

                    /* Use limit config to limit buffer count to 24 with buf_size */

                    ret = mpp_buffer_group_limit_config(data->frm_grp, buf_size, 24);

                    if (ret) {

                        //mpp_err("%p limit buffer group failed ret %d\n", ctx, ret);

                        break;

                    }

                    /*

                     * All buffer group config done. Set info change ready to let

                     * decoder continue decoding

                     */

                    ret = mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);

                    if (ret) {

                        //mpp_err("%p info change ready failed ret %d\n", ctx, ret);

                        break;

                    }

                } else {

                    RK_S32 log_size = sizeof(log_buf) - 1;

                    RK_S32 log_len = 0;

                    RK_U32 err_info = mpp_frame_get_errinfo(frame);

                    RK_U32 discard = mpp_frame_get_discard(frame);

                    /*log_len += snprintf(log_buf + log_len, log_size - log_len,

                                        "decode get frame %d", data->frame_count);*/

                    if (mpp_frame_has_meta(frame)) {

                        MppMeta meta = mpp_frame_get_meta(frame);

                        RK_S32 temporal_id = 0;

                        mpp_meta_get_s32(meta, KEY_TEMPORAL_ID, &temporal_id);

                        /*log_len += snprintf(log_buf + log_len, log_size - log_len,

                                            " tid %d", temporal_id);*/

                    }

                    /*if (err_info || discard) {

                        log_len += snprintf(log_buf + log_len, log_size - log_len,

                                            " err %x discard %x", err_info, discard);

                    }

                    mpp_log("%p %s\n", ctx, log_buf);*/

                    //data->frame_count++;

                    if (!err_info)

                        dump_mpp_frame_to_file0(frame,mode);

                }

                frm_eos = mpp_frame_get_eos(frame);

                mpp_frame_deinit(&frame);

                frame = NULL;

                get_frm = 1;

            }

            // try get runtime frame memory usage

            if (data->frm_grp) {

                size_t usage = mpp_buffer_group_usage(data->frm_grp);

                if (usage > data->max_usage)

                    data->max_usage = usage;

            }

            // if last packet is send but last frame is not found continue

            if (pkt_eos && pkt_done && !frm_eos) {

                msleep(10);

                continue;

            }

            if (frm_eos) {

                //mpp_log("%p found last packet\n", ctx);

                break;

            }

            if (data->frame_num > 0 && data->frame_count >= data->frame_num) {

                data->eos = 1;

                break;

            }

            if (get_frm)

                continue;

            break;

        } while (1);

        if (data->frame_num > 0 && data->frame_count >= data->frame_num) {

            data->eos = 1;

            //mpp_log("%p reach max frame number %d\n", ctx, data->frame_count);

            break;

        }

        if (pkt_done)

            break;

        /*

         * why sleep here:

         * mpi->decode_put_packet will failed when packet in internal queue is

         * full,waiting the package is consumed .Usually hardware decode one

         * frame which resolution is 1080p needs 2 ms,so here we sleep 3ms

         * * is enough.

         */

        msleep(1);

    } while (1);

    return ret;

}

static int decode_advanced(MpiDecLoopData *data)

{

    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  = data->frame;

    MppTask task = NULL;

    size_t read_size = fread(buf, 1, data->packet_size, data->fp_input);

    if (read_size != data->packet_size || feof(data->fp_input)) {

        mpp_log("%p found last packet\n", ctx);

        // setup eos flag

        data->eos = pkt_eos = 1;

    }

    // reset pos

    mpp_packet_set_pos(packet, buf);

    mpp_packet_set_length(packet, read_size);

    // setup eos flag

    if (pkt_eos)

        mpp_packet_set_eos(packet);

    ret = mpi->poll(ctx, MPP_PORT_INPUT, MPP_POLL_BLOCK);

    if (ret) {

        mpp_err("%p mpp input poll failed\n", ctx);

        return ret;

    }

    ret = mpi->dequeue(ctx, MPP_PORT_INPUT, &task);  /* input queue */

    if (ret) {

        mpp_err("%p mpp task input dequeue failed\n", ctx);

        return ret;

    }

    mpp_assert(task);

    mpp_task_meta_set_packet(task, KEY_INPUT_PACKET, packet);

    mpp_task_meta_set_frame (task, KEY_OUTPUT_FRAME,  frame);

    ret = mpi->enqueue(ctx, MPP_PORT_INPUT, task);  /* input queue */

    if (ret) {

        mpp_err("%p mpp task input enqueue failed\n", ctx);

        return ret;

    }

    /* poll and wait here */

    ret = mpi->poll(ctx, MPP_PORT_OUTPUT, MPP_POLL_BLOCK);

    if (ret) {

        mpp_err("%p mpp output poll failed\n", ctx);

        return ret;

    }

    ret = mpi->dequeue(ctx, MPP_PORT_OUTPUT, &task); /* output queue */

    if (ret) {

        mpp_err("%p mpp task output dequeue failed\n", ctx);

        return ret;

    }

    mpp_assert(task);

    if (task) {

        MppFrame frame_out = NULL;

        mpp_task_meta_get_frame(task, KEY_OUTPUT_FRAME, &frame_out);

        //mpp_assert(packet_out == packet);

        if (frame) {

            /* write frame to file here */

            if (fdddd)

                dump_mpp_frame_to_file(frame, fdddd);

            mpp_log("%p decoded frame %d\n", ctx, data->frame_count);

            data->frame_count++;

            if (mpp_frame_get_eos(frame_out))

                mpp_log("%p found eos frame\n", ctx);

        }

        /* output queue */

        ret = mpi->enqueue(ctx, MPP_PORT_OUTPUT, task);

        if (ret)

            mpp_err("%p mpp task output enqueue failed\n", ctx);

    }

    return ret;

}

int mpi_dec_test_decode(MpiDecTestCmd *cmd,int mode)

{

    int n;

    int fd0,fd1,fd2,fd3,fd4,fd5;

    MPP_RET ret         = MPP_OK;

    size_t file_size    = 0;

    // base flow context

    MppCtx ctx          = NULL;

    MppApi *mpi         = NULL;

    // input / output

    MppPacket packet    = NULL;

    MppFrame  frame     = NULL;

    MpiCmd mpi_cmd      = MPP_CMD_BASE;

    MppParam param      = NULL;

    RK_U32 need_split   = 1;

   

    MppPollType timeout = MPP_POLL_NON_BLOCK;//为了消除错误之前数据等于 cmd->timeout;

    // paramter for resource malloc

    RK_U32 width        = cmd->width;

    RK_U32 height       = cmd->height;

    MppCodingType type  = cmd->type;

    // resources

    char *buf           = NULL;

    size_t packet_size  = cmd->pkt_size;

    MppBuffer pkt_buf   = NULL;

    MppBuffer frm_buf   = NULL;

    MpiDecLoopData data;

    mpp_log("mpi_dec_test start\n");

    memset(&data, 0, sizeof(data));

    if (cmd->have_input) {

        

        data.fp_input = fopen(cmd->file_input, "rb");

        if (NULL == data.fp_input) {

            mpp_err("failed to open input file %s\n", cmd->file_input);

            goto MPP_TEST_OUT;

        }

        fseek(data.fp_input, 0L, SEEK_END);

        file_size = ftell(data.fp_input);

        rewind(data.fp_input);

        mpp_log("input file size %ld\n", file_size);

    }

    if (cmd->have_output) {

        fdddd = fopen(cmd->file_output, "w+b");

        if (NULL == fdddd) {//data.fp_output

            mpp_err("failed to open output file %s\n", cmd->file_output);

            goto MPP_TEST_OUT;

        }

        switch(mode){

            case 0:pthread_mutex_init(&mutex0,NULL);break;

            case 1:pthread_mutex_init(&mutex1,NULL);break;

            case 2:pthread_mutex_init(&mutex2,NULL);break;

            case 3:pthread_mutex_init(&mutex3,NULL);break;

            case 4:pthread_mutex_init(&mutex4,NULL);break;

            case 5:pthread_mutex_init(&mutex5,NULL);break;

            case 6:break;

            case 7:break;

            default:break;

        }

    }

    if (cmd->have_config) {

        data.fp_config = fopen(cmd->file_config, "r");

        if (NULL == data.fp_config) {

            mpp_err("failed to open config file %s\n", cmd->file_config);

            goto MPP_TEST_OUT;

        }

    }

    if (cmd->simple) {

        mpp_log("simple start\n");

        buf = mpp_malloc(char, packet_size);

        if (NULL == buf) {

            mpp_err("mpi_dec_test malloc input stream buffer failed\n");

            goto MPP_TEST_OUT;

        }

        ret = mpp_packet_init(&packet, buf, packet_size);

        if (ret) {

            mpp_err("mpp_packet_init failed\n");

            goto MPP_TEST_OUT;

        }

    }


 

    // decoder demo

    ret = mpp_create(&ctx, &mpi);

    if (MPP_OK != ret) {

        mpp_err("mpp_create failed\n");

        goto MPP_TEST_OUT;

    }

    mpp_log("%p mpi_dec_test decoder test start w %d h %d type %d\n",

            ctx, width, height, type);

    // NOTE: decoder split mode need to be set before init

    mpi_cmd = MPP_DEC_SET_PARSER_SPLIT_MODE;

    param = &need_split;

    ret = mpi->control(ctx, mpi_cmd, param);

    if (MPP_OK != ret) {

        mpp_err("%p mpi->control failed\n", ctx);

        goto MPP_TEST_OUT;

    }

    // NOTE: timeout value please refer to MppPollType definition

    //  0   - non-block call (default)

    // -1   - block call

    // +val - timeout value in ms

    if (timeout) {

        param = &timeout;

        ret = mpi->control(ctx, MPP_SET_OUTPUT_TIMEOUT, param);

        if (MPP_OK != ret) {

            mpp_err("%p failed to set output timeout %d ret %d\n",

                    ctx, timeout, ret);

            goto MPP_TEST_OUT;

        }

    }

    ret = mpp_init(ctx, MPP_CTX_DEC, type);

    if (MPP_OK != ret) {

        mpp_err("%p mpp_init failed\n", ctx);

        goto MPP_TEST_OUT;

    }

    data.ctx            = ctx;

    data.mpi            = mpi;

    data.eos            = 0;

    data.buf            = buf;

    data.packet         = packet;

    data.packet_size    = packet_size;

    data.frame          = frame;

    data.frame_count    = 0;

    data.frame_num      = cmd->frame_num;

    switch(mode){

        case 0:fd0 = open("my_fifo0",O_RDONLY);if(fd0 == -1)perror("open");break;

        case 1:fd1 = open("my_fifo1",O_RDONLY);if(fd1 == -1)perror("open");break;

        case 2:fd2 = open("my_fifo2",O_RDONLY);if(fd2 == -1)perror("open");break;

        case 3:fd3 = open("my_fifo3",O_RDONLY);if(fd3 == -1)perror("open");break;

        case 4:fd4 = open("my_fifo4",O_RDONLY);if(fd4 == -1)perror("open");break;

        case 5:fd5 = open("my_fifo5",O_RDONLY);if(fd5 == -1)perror("open");break;

        case 6:break;

        case 7:break;

        default:break;

    }

    if (cmd->simple) {

         //mpp_log("simple start111111111111111\n");

        while (!data.eos) {

            switch(mode){

                case 0:ioctl(fd0, FIONREAD, &n);if(n>=(4096))decode_simple(&data,mode,fd0,n);break;

                case 1:ioctl(fd1, FIONREAD, &n);if(n>=(4096))decode_simple(&data,mode,fd1,n);break;

                case 2:ioctl(fd2, FIONREAD, &n);if(n>=(4096))decode_simple(&data,mode,fd2,n);break;

                case 3:ioctl(fd3, FIONREAD, &n);if(n>=(4096))decode_simple(&data,mode,fd3,n);/*n=a_queue_size();*/break;

                case 4:ioctl(fd4, FIONREAD, &n);if(n>=(4096))decode_simple(&data,mode,fd4,n);break;

                case 5:ioctl(fd5, FIONREAD, &n);if(n>=(4096))decode_simple(&data,mode,fd5,n);break;

                case 6:break;

                case 7:break;

                default:break;

            }

        }

    }

    cmd->max_usage = data.max_usage;

    {

        MppDecQueryCfg query;

        memset(&query, 0, sizeof(query));

        query.query_flag = MPP_DEC_QUERY_ALL;

        ret = mpi->control(ctx, MPP_DEC_QUERY, &query);

        if (ret) {

            mpp_err("%p mpi->control query failed\n", ctx);

            goto MPP_TEST_OUT;

        }

        /*

         * NOTE:

         * 1. Output frame count included info change frame and empty eos frame.

         * 2. Hardware run count is real decoded frame count.

         */

        mpp_log("%p input %d pkt output %d frm decode %d frames\n", ctx,

                query.dec_in_pkt_cnt, query.dec_out_frm_cnt, query.dec_hw_run_cnt);

    }

    ret = mpi->reset(ctx);

    if (MPP_OK != ret) {

        mpp_err("%p mpi->reset failed\n", ctx);

        goto MPP_TEST_OUT;

    }

MPP_TEST_OUT:

    if (packet) {

        mpp_packet_deinit(&packet);

        packet = NULL;

    }

    if (frame) {

        mpp_frame_deinit(&frame);

        frame = NULL;

    }

    if (ctx) {

        mpp_destroy(ctx);

        ctx = NULL;

    }

    if (cmd->simple) {

        if (buf) {

            mpp_free(buf);

            buf = NULL;

        }

    } else {

        if (pkt_buf) {

            mpp_buffer_put(pkt_buf);

            pkt_buf = NULL;

        }

        if (frm_buf) {

            mpp_buffer_put(frm_buf);

            frm_buf = NULL;

        }

    }

    if (data.pkt_grp) {

        mpp_buffer_group_put(data.pkt_grp);

        data.pkt_grp = NULL;

    }

    if (data.frm_grp) {

        mpp_buffer_group_put(data.frm_grp);

        data.frm_grp = NULL;

    }

    if (fdddd) {

        fclose(fdddd);

        fdddd = NULL;

    }

    if (data.fp_input) {

        fclose(data.fp_input);

        data.fp_input = NULL;

    }

    return ret;

}

static void mpi_dec_test_help()

{

    mpp_log("usage: mpi_dec_test [options]\n");

    show_options(mpi_dec_cmd);

    mpp_show_support_format();

}

static void mpi_dec_test_show_options(MpiDecTestCmd* cmd)

{

    mpp_log("cmd parse result:\n");

    mpp_log("input  file name: %s\n", cmd->file_input);

    mpp_log("output file name: %s\n", cmd->file_output);

    mpp_log("config file name: %s\n", cmd->file_config);

    mpp_log("width      : %4d\n", cmd->width);

    mpp_log("height     : %4d\n", cmd->height);

    mpp_log("type       : %d\n", cmd->type);

    mpp_log("debug flag : %x\n", cmd->debug);

    mpp_log("max frames : %d\n", cmd->frame_num);

}

int mpp_run(int mode)

{

    RK_S32 ret = 0;

    MpiDecTestCmd  cmd_ctx;

    MpiDecTestCmd* cmd = &cmd_ctx;

    memset((void*)cmd, 0, sizeof(*cmd));

    cmd->format = MPP_FMT_BUTT;

    cmd->pkt_size = MPI_DEC_STREAM_SIZE;

    // parse the cmd option

    cmd->type = MPP_VIDEO_CodingAVC;

    if(mpp_check_support_format(MPP_CTX_DEC, cmd->type))

    {

        mpp_err("invalid input coding type\n");

    }

    strncpy(cmd->file_input, "cc_lwp.h264", MAX_FILE_NAME_LENGTH - 1);

                    cmd->have_input = 1;

                    name_to_coding_type(cmd->file_input, &cmd->type);

    strncpy(cmd->file_output, "cc_lwp.yuv", MAX_FILE_NAME_LENGTH - 1);

                    cmd->have_output = 1;

//cmd->width = 640;

//cmd->height = 340;

    cmd->frame_num = 0xffffffff;

    mpi_dec_test_show_options(cmd);

    mpp_env_set_u32("mpi_debug", cmd->debug);

    cmd->simple = (cmd->type != MPP_VIDEO_CodingMJPEG) ? (1) : (0);

    

    printf("%d --- %d\r\n",cmd->type,MPP_VIDEO_CodingMJPEG);

    ret = mpi_dec_test_decode(cmd,mode);

    if (MPP_OK == ret)

        mpp_log("test success max memory %.2f MB\n", cmd->max_usage / (float)(1 << 20));

    else

        mpp_err("test failed ret %d\n", ret);

    mpp_env_set_u32("mpi_debug", 0x0);

    return ret;

}

void * mmp_thread0(void *thread)

{

   a_queue_reset();

   while(1)

   {

     mpp_run(0);

     printf("end mmp_run\r\n");

     sleep(2);

   }

}

void * mmp_thread1(void *thread)

{

   a_queue_reset();

   while(1)

   {

     mpp_run(1);

     printf("end mmp_run\r\n");

     sleep(2);

   }

}

void * mmp_thread2(void *thread)

{

   a_queue_reset();

   while(1)

   {

     mpp_run(2);

     printf("end mmp_run\r\n");

     sleep(2);

   }

}

void * mmp_thread3(void *thread)

{

   a_queue_reset();

   while(1)

   {

     mpp_run(3);

     printf("end mmp_run\r\n");

     sleep(2);

   }

}

void * mmp_thread4(void *thread)

{

   a_queue_reset();

   while(1)

   {

     mpp_run(4);

     printf("end mmp_run\r\n");

     sleep(2);

   }

}

void * mmp_thread5(void *thread)

{

   a_queue_reset();

   while(1)

   {

     mpp_run(5);

     printf("end mmp_run\r\n");

     sleep(2);

   }

}



 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Firefly-RK3399的Android10中的pdf_20211123_1657.7z a4_portrait_rgbb.pdf a5_portrait_rgbb.pdf a5_portrait_rgbb_1_6_printscaling_default.pdf a5_portrait_rgbb_1_6_printscaling_none.pdf aacDecoder.pdf aacEncoder.pdf about_blank.pdf Android_malloc_debug.pdf annotation_highlight_long_content.pdf annotation_highlight_rollover_ap.pdf annotation_highlight_square_with_ap.pdf annotation_ink_multiple.pdf annotation_stamp_with_ap.pdf annotiter.pdf barcode_test.pdf BHUSA2014-capstone.pdf black.pdf bookmarks.pdf bookmarks_circular.pdf brotli-comparison-study-2015-09-22.pdf bug_113.pdf bug_213.pdf bug_216.pdf bug_298.pdf bug_325_a.pdf bug_325_b.pdf bug_343.pdf bug_344.pdf bug_355.pdf bug_360.pdf bug_451265.pdf bug_451830.pdf bug_452455.pdf bug_454695.pdf bug_455199.pdf bug_459580.pdf bug_481363.pdf bug_487928.pdf bug_507316.pdf bug_544880.pdf bug_547706.pdf bug_551248.pdf bug_551460.pdf bug_552046.pdf bug_554151.pdf bug_555784.pdf bug_557223.pdf bug_57.pdf bug_572871.pdf bug_583.pdf bug_601362.pdf bug_602650.pdf bug_603518.pdf bug_620428.pdf bug_631912.pdf bug_634394.pdf bug_634716.pdf bug_644.pdf bug_650.pdf bug_664284.pdf bug_679649.pdf bug_680376.pdf bug_707673.pdf bug_709793.pdf bug_713197.pdf bug_717.pdf bug_750568.pdf bug_757705.pdf bug_765384.pdf bug_779.pdf bug_781804.pdf bug_782596.pdf bug_921.pdf bug_xrefv4_loop.pdf CameraITS.pdf camera_engine_rkisp_user_manual_v2.2.pdf camera_hal3_user_manual_v2.3.pdf checkerboard.pdf circular_viewer_ref.pdf combobox_form.pdf control_characters.pdf default-values-ip.pdf DngNoiseModel.pdf Drm_Vendor_Modules_v1.pdf dynamic_list_box_allow_multiple_selection.pdf dynamic_password_field_background_fill.pdf dynamic_table_color_and_width.pdf EASLibrary3_5.pdf EAS_API_Reference.pdf EAS_Library_Integration_Guide.pdf Efuse process explain .pdf email_recommended.pdf embedded_attachments.pdf embedded_images.pdf encrypted.pdf feature_linearized_loading.pdf fieldsmanagement.pdf first.pdf hello_world.pdf ic_brightness_medium_24dp.pdf ic_radio_button_check

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凌风_lwp

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

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

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

打赏作者

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

抵扣说明:

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

余额充值