Toybrick

PX30 MJPEG视频硬解问题

ah911017

新手上路

积分
26
楼主
发表于 2024-8-7 11:37:34    查看: 1309|回复: 4 | [复制链接]    打印 | 只看该作者
PX30板子是否支持decode_put_packet + decode_get_frame的简单方式去解码MJPEG视频流?
还是如RK3399一样,必须使用advanced的dequeue+enqueue+poll的方式处理?
回复

使用道具 举报

ah911017

新手上路

积分
26
沙发
 楼主| 发表于 2024-8-7 14:31:11 | 只看该作者
已在redmine上发帖找到答案,jpeg与非jpeg解码方式不同
回复

使用道具 举报

jefferyzhang

版主

积分
13572
板凳
发表于 2024-8-7 14:35:38 | 只看该作者
jpeg只支持q/dq的方式,他其实是不同的IP核
回复

使用道具 举报

ah911017

新手上路

积分
26
地板
 楼主| 发表于 2024-8-8 11:02:22 | 只看该作者
jefferyzhang 发表于 2024-8-7 14:35
jpeg只支持q/dq的方式,他其实是不同的IP核

我把这种高级的 方式改成2个线程,发现poll不到解出的数据,伪代码如下:
mpp_buffer_get(NULL, &frm_buf, length)
mpp_frame_set_buffer(frame, frm_buf)
mpp_create(&ctx, &mpi);
mpp_init(ctx, MPP_CTX_DEC, MPP_VIDEO_CodingMJPEG)
mpp_dec_cfg_init(&cfg)
mpi->control(ctx, MPP_DEC_GET_CFG, cfg)
MppFrameFormat frame_fmt = MPP_FRAME_FMT_RGB;
mpi->control(ctx, MPP_DEC_SET_OUTPUT_FORMAT, &frame_fmt);
解码线程input_thread:
mpp_buffer_get(NULL, &frm_in_buf, length);
memcpy(mpp_buffer_get_ptr(frm_in_buf), jpeg_stream_buf, stream_buf_len);
mpp_packet_init_with_buffer(&packet, frm_in_buf);
mpi->poll(ctx, MPP_PORT_INPUT, MPP_POLL_NON_BLOCK);
mpi->dequeue(ctx, MPP_PORT_INPUT, &task);
mpp_task_meta_set_packet(task, KEY_INPUT_PACKET, packet);
mpp_task_meta_set_frame(task, KEY_OUTPUT_FRAME,  frame);
mpi->enqueue(ctx, MPP_PORT_INPUT, task);

获取解码图片线程out_thread
mpi->poll(ctx, MPP_PORT_OUTPUT, MPP_POLL_NON_BLOCK);
mpi->dequeue(ctx, MPP_PORT_OUTPUT, &task);
if (task) {
    mpp_task_meta_get_frame(task, KEY_OUTPUT_FRAME, &frame_out);
   frame送给rag模块缩放旋转等,再拷贝内存送至上次UI显示
}

其中frame始终是同一块MppBuffer
回复

使用道具 举报

jefferyzhang

版主

积分
13572
5#
发表于 2024-8-8 11:20:38 | 只看该作者
请自行参考mpp/test下的sample来写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表