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);