Edit online

mpp_decoder 数据结构

  • struct decode_config
    struct decode_config {
        enum mpp_pixel_format pix_fmt;  // output pixel format
        int bitstream_buffer_size;      // bitstream buffer size in pm
        int packet_count;               // packet number in pm
        int extra_frame_num;            // extra frame number in fm
    };

    decode_config 结构体用于配置解码器初始化使用的参数。

    • pix_fmt 表示解码输出的颜色格式

    • bitstream_buffer_size 表示存放输入码流缓存的总长度

    • packet_count 表示 packet manager 中 packet 的最大个数

    • extra_frame_num 表示解码器额外分配的帧个数,主要用于缓存显示帧以保证显示平滑。

  • struct mpp_packet
    struct mpp_packet {
        void *data;
        int size;
        long long pts;
        unsigned int flag;
    };

    mpp_packet 结构体用于表示输入码流信息。

    • data 表示码流数据存放的起始地址

    • size 表示该笔码流数据长度

    • pts 表示该笔码流的时间戳

    • flag 表示该笔码流的标记位,目前仅用于确定该码流是否为最后一笔码流(PACKET_FLAG_EOS)

  • struct mpp_frame
    struct mpp_size {
        int width;
        int height;
    };
    struct mpp_rect {
        int x;
        int y;
        int width;
        int height;
    };
    enum mpp_buf_type {
        MPP_DMA_BUF_FD,
        MPP_PHY_ADDR,
    };
    
    struct mpp_buf {
        enum mpp_buf_type       buf_type;
        union {
                int             fd[3];
                unsigned int    phy_addr[3];
        };
        unsigned int            stride[3];
        struct mpp_size         size;
        unsigned int            crop_en;
        struct mpp_rect         crop;
        enum mpp_pixel_format   format;
        unsigned int            flags;
    };
    • buf_type:表示 mpp_buf 类型,以 fd 方式 MPP_DMA_BUF_FD 或 以物理地址方式 MPP_PHY_ADDR;

    • fd[3]:表示 buffer 三个分量的 fd

    • phy_addr[3]:表示 buffer 三个分量的物理地址

    • stride[3]:表示 buffer 三个分量的 stride

    • size:表示 buffer 的宽、高

    • crop_en: 表示该 buffer 是否需要 crop

    • crop:表示该 buffer 的 crop 信息

    • format: 表示该 buffer 的颜色格式类型

    struct mpp_frame {
        struct mpp_buf          buf;
        long long               pts;
        unsigned int            id;
        unsigned int            flags;
    };
    • buf:表示 mpp_frame 的 buffer 信息

    • pts:表示 mpp_frame 的时间戳

    • id:表示 mpp_frame 的唯一标识

    • flags:表示 mpp_frame 的标志位

  • enum mpp_dec_errno
    enum mpp_dec_errno {
        DEC_ERR_NOT_SUPPORT         = 0x90000001,
        DEC_ERR_NO_EMPTY_PACKET     = 0x90000002, // no packet in empty list
        DEC_ERR_NO_READY_PACKET     = 0x90000003, //
        DEC_ERR_NO_EMPTY_FRAME      = 0x90000004, //
        DEC_ERR_NO_RENDER_FRAME     = 0x90000005, //
        DEC_ERR_NULL_PTR            = 0x90000006,
        DEC_ERR_FM_NOT_CREATE       = 0x90000006,
    };
    • DEC_ERR_NOT_SUPPORT:该码流不支持

    • DEC_ERR_NO_EMPTY_PACKET:packet manager 中缺少空闲的 packet,可能是解码速度小于送 packet 速度,此时需要等待一段时间;

    • DEC_ERR_NO_READY_PACKET:packet manager 中缺少填好码流数据的 packet,可能是送 packet 速度小于解码速度,此时需要等待一段时间;

    • DEC_ERR_NO_EMPTY_FRAME:frame manager 中缺少空闲的 frame,表示所有帧都处于使用状态,通常是解码速度大于显示速度导致,此时需要等待一段时间;

    • DEC_ERR_NO_RENDER_FRAME:frame manager 中缺少待显示的 frame,表示所有帧都处于空闲状态,通常是解码速度小于显示速度导致,此时需要等待一段时间;

    • DEC_ERR_NULL_PTR:表示接口函数输入参数存在空指针

    • DEC_ERR_FM_NOT_CREATE:表示在获取待显示 frame 时 frame manager 还未创建

  • enum mpp_codec_type
    enum mpp_codec_type {
        MPP_CODEC_VIDEO_DECODER_H264 = 0x1000,         // decoder
        MPP_CODEC_VIDEO_DECODER_MJPEG,
        MPP_CODEC_VIDEO_DECODER_PNG,
    
        MPP_CODEC_VIDEO_ENCODER_H264 = 0x2000,         // encoder
    };

    mpp_codec_type 枚举类型表示支持的编解码格式。

  • enum mpp_dec_cmd
    enum mpp_dec_cmd {
        MPP_DEC_INIT_CMD_SET_EXT_FRAME_ALLOCATOR,            // frame buffer allocator
        MPP_DEC_INIT_CMD_SET_ROT_FLIP_FLAG,
        MPP_DEC_INIT_CMD_SET_SCALE,
        MPP_DEC_INIT_CMD_SET_CROP_INFO,
        MPP_DEC_INIT_CMD_SET_OUTPUT_POS,
    };
    • MPP_DEC_INIT_CMD_SET_EXT_FRAME_ALLOCATOR:表示由外部设置帧 buffer 分配器

    • MPP_DEC_INIT_CMD_SET_ROT_FLIP_FLAG: 表示设置旋转、镜像后处理,只用于 JPEG

    • MPP_DEC_INIT_CMD_SET_SCALE: 表示设置缩放系数,只用于 JPEG

    • MPP_DEC_INIT_CMD_SET_CROP_INFO:表示设置输出 crop 信息

    • MPP_DEC_INIT_CMD_SET_OUTPUT_POS:表示设置解码图像在输出缓存的位置