From 599a3c64174c675f56256e7a44e48f5ff109263c Mon Sep 17 00:00:00 2001 From: "Liu, Yun M" Date: Fri, 12 Sep 2025 15:31:00 +0800 Subject: [PATCH 1/3] [DLStreamer] gvagenai: enable memory mapper --- .../docs/source/elements/gvagenai.md | 30 +++++++ .../gst/elements/gvagenai/CMakeLists.txt | 1 + .../gst/elements/gvagenai/genai.cpp | 90 ++++++++++++++----- .../gst/elements/gvagenai/genai.hpp | 3 + .../gst/elements/gvagenai/gstgvagenai.cpp | 21 ++--- 5 files changed, 113 insertions(+), 32 deletions(-) diff --git a/libraries/dl-streamer/docs/source/elements/gvagenai.md b/libraries/dl-streamer/docs/source/elements/gvagenai.md index f00b17c39..d581a8e80 100644 --- a/libraries/dl-streamer/docs/source/elements/gvagenai.md +++ b/libraries/dl-streamer/docs/source/elements/gvagenai.md @@ -96,6 +96,21 @@ Pad Templates: width: [ 1, 2147483647 ] height: [ 1, 2147483647 ] framerate: [ 0/1, 2147483647/1 ] + video/x-raw(memory:DMABuf) + format: { (string)DMA_DRM } + width: [ 1, 2147483647 ] + height: [ 1, 2147483647 ] + framerate: [ 0/1, 2147483647/1 ] + video/x-raw(memory:VASurface) + format: { (string)NV12 } + width: [ 1, 2147483647 ] + height: [ 1, 2147483647 ] + framerate: [ 0/1, 2147483647/1 ] + video/x-raw(memory:VAMemory) + format: { (string)NV12 } + width: [ 1, 2147483647 ] + height: [ 1, 2147483647 ] + framerate: [ 0/1, 2147483647/1 ] SRC template: 'src' Availability: Always @@ -105,6 +120,21 @@ Pad Templates: width: [ 1, 2147483647 ] height: [ 1, 2147483647 ] framerate: [ 0/1, 2147483647/1 ] + video/x-raw(memory:DMABuf) + format: { (string)DMA_DRM } + width: [ 1, 2147483647 ] + height: [ 1, 2147483647 ] + framerate: [ 0/1, 2147483647/1 ] + video/x-raw(memory:VASurface) + format: { (string)NV12 } + width: [ 1, 2147483647 ] + height: [ 1, 2147483647 ] + framerate: [ 0/1, 2147483647/1 ] + video/x-raw(memory:VAMemory) + format: { (string)NV12 } + width: [ 1, 2147483647 ] + height: [ 1, 2147483647 ] + framerate: [ 0/1, 2147483647/1 ] Element has no clocking capabilities. Element has no URI handling capabilities. diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/CMakeLists.txt b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/CMakeLists.txt index 00d664a29..d1150dfd9 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/CMakeLists.txt +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/CMakeLists.txt @@ -36,6 +36,7 @@ target_link_libraries(${TARGET_NAME} ${GSTREAMER_VIDEO_LIBRARIES} openvino::genai ${OpenCV_LIBS} + common dlstreamer_gst_meta json-hpp ) diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.cpp b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.cpp index 65fada002..b4d88ee7e 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.cpp +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.cpp @@ -18,6 +18,9 @@ namespace genai { OpenVINOGenAIContext::OpenVINOGenAIContext(const std::string &model_path, const std::string &device, const std::string &cache_path, const std::string &generation_config_str, const std::string &scheduler_config_str) { + // Initialize memory mapper for GStreamer buffers + mapper = std::make_shared(nullptr, nullptr); + // Set configurations if provided if (!generation_config_str.empty()) { generation_config = ConfigParser::parse_generation_config_string(generation_config_str); @@ -60,58 +63,99 @@ OpenVINOGenAIContext::~OpenVINOGenAIContext() { bool OpenVINOGenAIContext::add_tensor_to_vector(GstBuffer *buffer, GstVideoInfo *info) { try { - GstMapInfo map; - if (!gst_buffer_map(buffer, &map, GST_MAP_READ)) { - GST_ERROR("Failed to map buffer"); - return false; + // Create a GSTFrame and map to CPU memory + auto gst_frame = std::make_shared(buffer, info); + auto mapped_frame = mapper->map(gst_frame, dlstreamer::AccessMode::Read); + + // Convert to Mat, code from gvawatermark + static constexpr std::array channels_to_cvtype_map = {CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4}; + std::vector image_planes; + image_planes.reserve(mapped_frame->num_tensors()); + + // Go through planes and create cv::Mat for every plane + for (auto &tensor : *mapped_frame) { + // Verify number of channels + dlstreamer::ImageInfo image_info(tensor->info()); + assert(image_info.channels() > 0 && image_info.channels() <= channels_to_cvtype_map.size()); + const int cv_type = channels_to_cvtype_map[image_info.channels() - 1]; + image_planes.emplace_back(image_info.height(), image_info.width(), cv_type, tensor->data(), + image_info.width_stride()); } - // Convert GStreamer buffer to OpenCV Mat + auto check_planes = [&image_planes](size_t n) { + if (image_planes.size() != n) + throw std::runtime_error("Image format error, plane count != " + std::to_string(n)); + }; + + // Convert Mat to RGB format cv::Mat frame; switch (GST_VIDEO_INFO_FORMAT(info)) { case GST_VIDEO_FORMAT_RGB: - frame = cv::Mat(info->height, info->width, CV_8UC3, map.data); + check_planes(1); + frame = image_planes[0]; break; case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_RGBx: - frame = cv::Mat(info->height, info->width, CV_8UC4, map.data); - cv::cvtColor(frame, frame, cv::COLOR_RGBA2RGB); + check_planes(1); + cv::cvtColor(image_planes[0], frame, cv::COLOR_RGBA2RGB); break; case GST_VIDEO_FORMAT_BGR: - frame = cv::Mat(info->height, info->width, CV_8UC3, map.data); - cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); + check_planes(1); + cv::cvtColor(image_planes[0], frame, cv::COLOR_BGR2RGB); break; case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_BGRx: - frame = cv::Mat(info->height, info->width, CV_8UC4, map.data); - cv::cvtColor(frame, frame, cv::COLOR_BGRA2RGB); + check_planes(1); + cv::cvtColor(image_planes[0], frame, cv::COLOR_BGRA2RGB); break; case GST_VIDEO_FORMAT_NV12: { - frame = cv::Mat(info->height * 3 / 2, info->width, CV_8UC1, map.data); - cv::cvtColor(frame, frame, cv::COLOR_YUV2RGB_NV12); + check_planes(2); + cv::cvtColorTwoPlane(image_planes[0], image_planes[1], frame, cv::COLOR_YUV2RGB_NV12); break; } case GST_VIDEO_FORMAT_I420: { - frame = cv::Mat(info->height * 3 / 2, info->width, CV_8UC1, map.data); - cv::cvtColor(frame, frame, cv::COLOR_YUV2RGB_I420); + check_planes(3); + // For I420, need to create a single Mat with the layout Y+U+V + uint8_t *y_data = image_planes[0].data; + uint8_t *u_data = image_planes[1].data; + uint8_t *v_data = image_planes[2].data; + int y_size = image_planes[0].rows * image_planes[0].step; + int u_size = image_planes[1].rows * image_planes[1].step; + int v_size = image_planes[2].rows * image_planes[2].step; + + // Check if planes are contiguous + if (u_data == y_data + y_size && v_data == u_data + u_size) { + // Planes are contiguous (typical) + cv::Mat yuv(info->height * 3 / 2, info->width, CV_8UC1, y_data); + cv::cvtColor(yuv, frame, cv::COLOR_YUV2RGB_I420); + } else { + // Planes are not contiguous, need to copy (fallback) + cv::Mat yuv(info->height * 3 / 2, info->width, CV_8UC1); + image_planes[0].copyTo(yuv.rowRange(0, info->height)); + image_planes[1].copyTo(yuv.rowRange(info->height, info->height + info->height / 4)); + image_planes[2].copyTo(yuv.rowRange(info->height + info->height / 4, info->height * 3 / 2)); + cv::cvtColor(yuv, frame, cv::COLOR_YUV2RGB_I420); + } break; } default: - gst_buffer_unmap(buffer, &map); GST_ERROR("Unsupported video format"); return false; } // Create tensor - auto tensor = ov::Tensor(ov::element::u8, {1, static_cast(frame.rows), - static_cast(frame.cols), - static_cast(frame.channels())}); - memcpy(tensor.data(), frame.data, frame.total() * frame.elemSize()); + auto tensor = ov::Tensor(ov::element::u8, {1, static_cast(frame.rows), static_cast(frame.cols), + static_cast(frame.channels())}); + size_t expected_size = frame.total() * frame.elemSize(); + if (tensor.get_byte_size() != expected_size) { + GST_ERROR("Tensor size mismatch: expected %zu, got %zu", expected_size, tensor.get_byte_size()); + return false; + } + memcpy(tensor.data(), frame.data, expected_size); // Add tensor to vector tensor_vector.push_back(tensor); - gst_buffer_unmap(buffer, &map); return true; } catch (const std::exception &e) { GST_ERROR("Error converting frame to tensor: %s", e.what()); @@ -198,6 +242,8 @@ std::string OpenVINOGenAIContext::create_json_metadata(GstClockTime timestamp, b if (include_metrics) { nlohmann::json metrics_obj = { {"load_time", round_2dp(metrics.get_load_time())}, + {"num_generated_tokens", metrics.get_num_generated_tokens()}, + {"num_input_tokens", metrics.get_num_input_tokens()}, {"generate_time_mean", round_2dp(metrics.get_generate_duration().mean)}, {"generate_time_std", round_2dp(metrics.get_generate_duration().std)}, {"tokenization_time_mean", round_2dp(metrics.get_tokenization_duration().mean)}, diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.hpp b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.hpp index f751045c4..9a160f405 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.hpp +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/genai.hpp @@ -9,6 +9,8 @@ #include #include +#include "dlstreamer/gst/mappers/gst_to_cpu.h" + #include #include @@ -98,6 +100,7 @@ class OpenVINOGenAIContext { std::string create_json_metadata(GstClockTime timestamp = GST_CLOCK_TIME_NONE, bool include_metrics = false); private: + std::shared_ptr mapper = nullptr; std::unique_ptr pipeline = nullptr; ov::AnyMap generation_config = {}; std::optional scheduler_config = std::nullopt; diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp index 83a917259..fb602ddf9 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp @@ -7,7 +7,9 @@ #include "gstgvagenai.h" #include -#include + +#include "gva_caps.h" +#include "gva_json_meta.h" #include "genai.hpp" @@ -29,13 +31,14 @@ enum { }; // Pad templates +#define GVAGENAI_SYSTEM_MEM_CAPS GST_VIDEO_CAPS_MAKE("{ RGB, RGBA, RGBx, BGR, BGRA, BGRx, NV12, I420 }") "; " static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS(GST_VIDEO_CAPS_MAKE("{ RGB, RGBA, RGBx, BGR, BGRA, BGRx, NV12, I420 }"))); + GST_STATIC_CAPS(GVAGENAI_SYSTEM_MEM_CAPS DMA_BUFFER_CAPS VASURFACE_CAPS VAMEMORY_CAPS)); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS(GST_VIDEO_CAPS_MAKE("{ RGB, RGBA, RGBx, BGR, BGRA, BGRx, NV12, I420 }"))); + GST_STATIC_CAPS(GVAGENAI_SYSTEM_MEM_CAPS DMA_BUFFER_CAPS VASURFACE_CAPS VAMEMORY_CAPS)); // Class initialization G_DEFINE_TYPE(GstGvaGenAI, gst_gvagenai, GST_TYPE_BASE_TRANSFORM); @@ -349,13 +352,11 @@ static gboolean gst_gvagenai_set_caps(GstBaseTransform *base, GstCaps *incaps, G } // Check if the format is supported - if (GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_RGB && GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_RGBA && - GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_RGBx && GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_BGR && - GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_BGRA && - GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_BGRx && - GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_NV12 && - GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_I420) { - GST_ERROR_OBJECT(base, "Unsupported format"); + GstVideoFormat format = GST_VIDEO_INFO_FORMAT(&info); + if (format != GST_VIDEO_FORMAT_RGB && format != GST_VIDEO_FORMAT_RGBA && format != GST_VIDEO_FORMAT_RGBx && + format != GST_VIDEO_FORMAT_BGR && format != GST_VIDEO_FORMAT_BGRA && format != GST_VIDEO_FORMAT_BGRx && + format != GST_VIDEO_FORMAT_NV12 && format != GST_VIDEO_FORMAT_I420) { + GST_ERROR_OBJECT(base, "Unsupported video format: %s", gst_video_format_to_string(format)); return FALSE; } From 4177d50bfb69f8f010b951a0dbba15fd209edc61 Mon Sep 17 00:00:00 2001 From: "Liu, Yun M" Date: Mon, 15 Sep 2025 13:16:04 +0800 Subject: [PATCH 2/3] [DLStreamer] gvagenai: add support for prompt-path --- .../docs/source/elements/gvagenai.md | 3 + .../gst/elements/gvagenai/gstgvagenai.cpp | 73 ++++++++++++++++++- .../gst/elements/gvagenai/gstgvagenai.h | 2 + 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/libraries/dl-streamer/docs/source/elements/gvagenai.md b/libraries/dl-streamer/docs/source/elements/gvagenai.md index d581a8e80..6a963479a 100644 --- a/libraries/dl-streamer/docs/source/elements/gvagenai.md +++ b/libraries/dl-streamer/docs/source/elements/gvagenai.md @@ -176,6 +176,9 @@ Element Properties: prompt : Text prompt for the GenAI model flags: readable, writable String. Default: null + prompt-path : Path to text prompt file for the GenAI model + flags: readable, writable + String. Default: null qos : Handle Quality-of-Service events flags: readable, writable Boolean. Default: false diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp index fb602ddf9..17e32485a 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp @@ -6,6 +6,7 @@ #include "gstgvagenai.h" +#include #include #include "gva_caps.h" @@ -22,6 +23,7 @@ enum { PROP_DEVICE, PROP_MODEL_PATH, PROP_PROMPT, + PROP_PROMPT_PATH, PROP_GENERATION_CONFIG, PROP_SCHEDULER_CONFIG, PROP_MODEL_CACHE_PATH, @@ -54,6 +56,9 @@ static gboolean gst_gvagenai_stop(GstBaseTransform *base); static GstFlowReturn gst_gvagenai_transform_ip(GstBaseTransform *base, GstBuffer *buf); static gboolean gst_gvagenai_set_caps(GstBaseTransform *base, GstCaps *incaps, GstCaps *outcaps); +// Utility functions +static gboolean load_effective_prompt(GstGvaGenAI *gvagenai); + // Initialize the element class static void gst_gvagenai_class_init(GstGvaGenAIClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); @@ -90,6 +95,11 @@ static void gst_gvagenai_class_init(GstGvaGenAIClass *klass) { gobject_class, PROP_PROMPT, g_param_spec_string("prompt", "Prompt", "Text prompt for the GenAI model", NULL, G_PARAM_READWRITE)); + g_object_class_install_property(gobject_class, PROP_PROMPT_PATH, + g_param_spec_string("prompt-path", "Prompt Path", + "Path to text prompt file for the GenAI model", NULL, + G_PARAM_READWRITE)); + g_object_class_install_property(gobject_class, PROP_GENERATION_CONFIG, g_param_spec_string("generation-config", "Generation Config", "Generation configuration as KEY=VALUE,KEY=VALUE format", NULL, @@ -128,6 +138,7 @@ static void gst_gvagenai_init(GstGvaGenAI *gvagenai) { gvagenai->device = g_strdup("CPU"); gvagenai->model_path = NULL; gvagenai->prompt = NULL; + gvagenai->prompt_path = NULL; gvagenai->generation_config = NULL; gvagenai->scheduler_config = NULL; gvagenai->model_cache_path = g_strdup("ov_cache"); @@ -135,9 +146,56 @@ static void gst_gvagenai_init(GstGvaGenAI *gvagenai) { gvagenai->chunk_size = 1; // Process one frame at a time by default gvagenai->metrics = FALSE; gvagenai->frame_counter = 0; + gvagenai->prompt_string = NULL; gvagenai->openvino_context = NULL; } +// Function to load effective prompt and set prompt_string +static gboolean load_effective_prompt(GstGvaGenAI *gvagenai) { + // Validate prompt or prompt-path + gboolean has_prompt = (gvagenai->prompt && strlen(gvagenai->prompt) > 0); + gboolean has_prompt_path = (gvagenai->prompt_path && strlen(gvagenai->prompt_path) > 0); + if (!has_prompt && !has_prompt_path) { + GST_ERROR_OBJECT(gvagenai, "Either 'prompt' or 'prompt-path' property must be specified"); + return FALSE; + } + if (has_prompt && has_prompt_path) { + GST_ERROR_OBJECT(gvagenai, "Both 'prompt' and 'prompt-path' properties are set. Please specify only one."); + return FALSE; + } + + g_free(gvagenai->prompt_string); + if (has_prompt) { + gvagenai->prompt_string = g_strdup(gvagenai->prompt); + } else if (has_prompt_path) { + try { + std::ifstream file(gvagenai->prompt_path); + if (!file.is_open()) { + GST_ERROR_OBJECT(gvagenai, "Failed to open prompt file: %s", gvagenai->prompt_path); + return FALSE; + } + + auto content = std::string((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + if (content.empty()) { + GST_WARNING_OBJECT(gvagenai, "Prompt file is empty: %s", gvagenai->prompt_path); + return FALSE; + } + + gvagenai->prompt_string = g_strdup(content.c_str()); + } catch (const std::exception &e) { + GST_ERROR_OBJECT(gvagenai, "Error reading prompt file %s: %s", gvagenai->prompt_path, e.what()); + return FALSE; + } + } else { + return FALSE; + } + + GST_INFO_OBJECT(gvagenai, "Using prompt: %s", gvagenai->prompt_string); + return TRUE; +} + static void gst_gvagenai_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GstGvaGenAI *gvagenai = GST_GVAGENAI(object); @@ -154,6 +212,10 @@ static void gst_gvagenai_set_property(GObject *object, guint prop_id, const GVal g_free(gvagenai->prompt); gvagenai->prompt = g_value_dup_string(value); break; + case PROP_PROMPT_PATH: + g_free(gvagenai->prompt_path); + gvagenai->prompt_path = g_value_dup_string(value); + break; case PROP_GENERATION_CONFIG: g_free(gvagenai->generation_config); gvagenai->generation_config = g_value_dup_string(value); @@ -195,6 +257,9 @@ static void gst_gvagenai_get_property(GObject *object, guint prop_id, GValue *va case PROP_PROMPT: g_value_set_string(value, gvagenai->prompt); break; + case PROP_PROMPT_PATH: + g_value_set_string(value, gvagenai->prompt_path); + break; case PROP_GENERATION_CONFIG: g_value_set_string(value, gvagenai->generation_config); break; @@ -225,11 +290,13 @@ static void gst_gvagenai_finalize(GObject *object) { g_free(gvagenai->device); g_free(gvagenai->model_path); g_free(gvagenai->prompt); + g_free(gvagenai->prompt_path); g_free(gvagenai->generation_config); g_free(gvagenai->scheduler_config); g_free(gvagenai->model_cache_path); // Clean up context + g_free(gvagenai->prompt_string); if (gvagenai->openvino_context) { delete static_cast(gvagenai->openvino_context); gvagenai->openvino_context = NULL; @@ -246,8 +313,8 @@ static gboolean gst_gvagenai_start(GstBaseTransform *base) { return FALSE; } - if (!gvagenai->prompt) { - GST_ERROR_OBJECT(gvagenai, "Prompt not specified"); + if (!load_effective_prompt(gvagenai)) { + GST_ERROR_OBJECT(gvagenai, "Failed to load effective prompt"); return FALSE; } @@ -320,7 +387,7 @@ static GstFlowReturn gst_gvagenai_transform_ip(GstBaseTransform *base, GstBuffer // Only process if we've accumulated enough tensors if (context->get_tensor_vector_size() >= gvagenai->chunk_size) { // Process tensor vector - if (!context->inference_tensor_vector(gvagenai->prompt)) { + if (!context->inference_tensor_vector(gvagenai->prompt_string)) { GST_ERROR_OBJECT(gvagenai, "Failed to inference tensor vector"); return GST_FLOW_ERROR; } diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.h b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.h index 5b11612aa..ae58c981e 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.h +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.h @@ -25,6 +25,7 @@ struct _GstGvaGenAI { gchar *device; gchar *model_path; gchar *prompt; + gchar *prompt_path; gchar *generation_config; gchar *scheduler_config; gchar *model_cache_path; @@ -33,6 +34,7 @@ struct _GstGvaGenAI { gboolean metrics; guint frame_counter; + gchar *prompt_string; void *openvino_context; }; From 78c3a87912868fdb542b0247d90c27caf65eebd5 Mon Sep 17 00:00:00 2001 From: "Liu, Yun M" Date: Tue, 23 Sep 2025 16:05:21 +0800 Subject: [PATCH 3/3] remove VASurface --- libraries/dl-streamer/docs/source/elements/gvagenai.md | 10 ---------- .../monolithic/gst/elements/gvagenai/gstgvagenai.cpp | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/libraries/dl-streamer/docs/source/elements/gvagenai.md b/libraries/dl-streamer/docs/source/elements/gvagenai.md index 6a963479a..8e0819e57 100644 --- a/libraries/dl-streamer/docs/source/elements/gvagenai.md +++ b/libraries/dl-streamer/docs/source/elements/gvagenai.md @@ -101,11 +101,6 @@ Pad Templates: width: [ 1, 2147483647 ] height: [ 1, 2147483647 ] framerate: [ 0/1, 2147483647/1 ] - video/x-raw(memory:VASurface) - format: { (string)NV12 } - width: [ 1, 2147483647 ] - height: [ 1, 2147483647 ] - framerate: [ 0/1, 2147483647/1 ] video/x-raw(memory:VAMemory) format: { (string)NV12 } width: [ 1, 2147483647 ] @@ -125,11 +120,6 @@ Pad Templates: width: [ 1, 2147483647 ] height: [ 1, 2147483647 ] framerate: [ 0/1, 2147483647/1 ] - video/x-raw(memory:VASurface) - format: { (string)NV12 } - width: [ 1, 2147483647 ] - height: [ 1, 2147483647 ] - framerate: [ 0/1, 2147483647/1 ] video/x-raw(memory:VAMemory) format: { (string)NV12 } width: [ 1, 2147483647 ] diff --git a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp index 17e32485a..627dbc352 100644 --- a/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp +++ b/libraries/dl-streamer/src/monolithic/gst/elements/gvagenai/gstgvagenai.cpp @@ -36,11 +36,11 @@ enum { #define GVAGENAI_SYSTEM_MEM_CAPS GST_VIDEO_CAPS_MAKE("{ RGB, RGBA, RGBx, BGR, BGRA, BGRx, NV12, I420 }") "; " static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS(GVAGENAI_SYSTEM_MEM_CAPS DMA_BUFFER_CAPS VASURFACE_CAPS VAMEMORY_CAPS)); + GST_STATIC_CAPS(GVAGENAI_SYSTEM_MEM_CAPS DMA_BUFFER_CAPS VAMEMORY_CAPS)); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS(GVAGENAI_SYSTEM_MEM_CAPS DMA_BUFFER_CAPS VASURFACE_CAPS VAMEMORY_CAPS)); + GST_STATIC_CAPS(GVAGENAI_SYSTEM_MEM_CAPS DMA_BUFFER_CAPS VAMEMORY_CAPS)); // Class initialization G_DEFINE_TYPE(GstGvaGenAI, gst_gvagenai, GST_TYPE_BASE_TRANSFORM);