|  | 
地板
 
 楼主|
发表于 2024-8-8 11:02:22
|
只看该作者 
| 我把这种高级的 方式改成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
 
 | 
 |