From 9ace1eb2f1bc7668e2629abebcc0c4e81c1c3780 Mon Sep 17 00:00:00 2001 From: sladro Date: Mon, 5 Jan 2026 16:33:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AEbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/input_rtsp/input_rtsp_node.cpp | 34 ++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/plugins/input_rtsp/input_rtsp_node.cpp b/plugins/input_rtsp/input_rtsp_node.cpp index 9fd9784..1c69988 100644 --- a/plugins/input_rtsp/input_rtsp_node.cpp +++ b/plugins/input_rtsp/input_rtsp_node.cpp @@ -331,12 +331,19 @@ private: // Packet buffer group (bitstream input). MPP will pick the best allocator available. if (!pkt_group) { - if (mpp_buffer_group_get_internal(&pkt_group, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE) != MPP_OK) { - // Try without flags. - if (mpp_buffer_group_get_internal(&pkt_group, MPP_BUFFER_TYPE_ION) != MPP_OK) { - pkt_group = nullptr; - return false; - } + auto try_group = [&](MppBufferType t) -> bool { + return mpp_buffer_group_get(&pkt_group, t, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__) == MPP_OK; + }; + + // Prefer dma_heap when available (newer kernels), then ion/drm as fallback. + if (!try_group(static_cast(MPP_BUFFER_TYPE_DMA_HEAP | MPP_BUFFER_FLAGS_CACHABLE)) && + !try_group(static_cast(MPP_BUFFER_TYPE_DMA_HEAP)) && + !try_group(static_cast(MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE)) && + !try_group(static_cast(MPP_BUFFER_TYPE_ION)) && + !try_group(static_cast(MPP_BUFFER_TYPE_DRM | MPP_BUFFER_FLAGS_CACHABLE)) && + !try_group(static_cast(MPP_BUFFER_TYPE_DRM))) { + pkt_group = nullptr; + return false; } mpp_buffer_group_limit_config(pkt_group, 0, 8); } @@ -392,6 +399,8 @@ private: } mpp_buffer_put(pkt_buf); // packet holds reference + mpp_packet_set_data(packet, dst); + mpp_packet_set_size(packet, size); mpp_packet_set_pos(packet, dst); mpp_packet_set_length(packet, size); mpp_packet_set_pts(packet, pts_us); @@ -445,7 +454,18 @@ private: MppBufferGroup group = frame_group; size_t buf_size = mpp_frame_get_buf_size(frame); if (!group) { - if (mpp_buffer_group_get_internal(&group, MPP_BUFFER_TYPE_DRM, NULL) != MPP_OK) return; + auto try_group = [&](MppBufferType t) -> bool { + return mpp_buffer_group_get(&group, t, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__) == MPP_OK; + }; + if (!try_group(static_cast(MPP_BUFFER_TYPE_DMA_HEAP | MPP_BUFFER_FLAGS_CACHABLE)) && + !try_group(static_cast(MPP_BUFFER_TYPE_DMA_HEAP)) && + !try_group(static_cast(MPP_BUFFER_TYPE_DRM | MPP_BUFFER_FLAGS_CACHABLE)) && + !try_group(static_cast(MPP_BUFFER_TYPE_DRM)) && + !try_group(static_cast(MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE)) && + !try_group(static_cast(MPP_BUFFER_TYPE_ION))) { + std::cerr << "[input_rtsp] mpp info_change: failed to alloc frame buffer group\n"; + return; + } frame_group = group; } else { mpp_buffer_group_clear(group);