Toybrick

标题: PX30 MJPEG视频硬解问题 [打印本页]

作者: ah911017    时间: 2024-8-7 11:37
标题: PX30 MJPEG视频硬解问题
PX30板子是否支持decode_put_packet + decode_get_frame的简单方式去解码MJPEG视频流?
还是如RK3399一样,必须使用advanced的dequeue+enqueue+poll的方式处理?

作者: ah911017    时间: 2024-8-7 14:31
已在redmine上发帖找到答案,jpeg与非jpeg解码方式不同
作者: jefferyzhang    时间: 2024-8-7 14:35
jpeg只支持q/dq的方式,他其实是不同的IP核
作者: ah911017    时间: 2024-8-8 11:02
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    时间: 2024-8-8 11:20
请自行参考mpp/test下的sample来写




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3