mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 14:36:36 +08:00
Merge pull request #21538 from edman007:fixup-21536
This commit is contained in:
commit
a351e05a17
@ -606,10 +606,36 @@ void convertToVASurface(VADisplay display, InputArray src, VASurfaceID surface,
|
|||||||
if (status != VA_STATUS_SUCCESS)
|
if (status != VA_STATUS_SUCCESS)
|
||||||
CV_Error(cv::Error::StsError, "VA-API: vaSyncSurface failed");
|
CV_Error(cv::Error::StsError, "VA-API: vaSyncSurface failed");
|
||||||
|
|
||||||
|
bool indirect_buffer = false;
|
||||||
VAImage image;
|
VAImage image;
|
||||||
status = vaDeriveImage(display, surface, &image);
|
status = vaDeriveImage(display, surface, &image);
|
||||||
if (status != VA_STATUS_SUCCESS)
|
if (status != VA_STATUS_SUCCESS){
|
||||||
CV_Error(cv::Error::StsError, "VA-API: vaDeriveImage failed");
|
//try vaCreateImage + vaPutImage
|
||||||
|
//pick a format
|
||||||
|
indirect_buffer = true;
|
||||||
|
int num_formats = vaMaxNumImageFormats(display);
|
||||||
|
if (num_formats <= 0)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaMaxNumImageFormats failed");
|
||||||
|
std::vector<VAImageFormat> fmt_list(num_formats);
|
||||||
|
|
||||||
|
status = vaQueryImageFormats(display, fmt_list.data(), &num_formats);
|
||||||
|
if (status != VA_STATUS_SUCCESS)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaQueryImageFormats failed");
|
||||||
|
VAImageFormat *selected_format = nullptr;
|
||||||
|
for (auto &fmt : fmt_list){
|
||||||
|
if (fmt.fourcc == VA_FOURCC_NV12 || fmt.fourcc == VA_FOURCC_YV12){
|
||||||
|
selected_format = &fmt;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selected_format == nullptr)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaQueryImageFormats did not return a supported format");
|
||||||
|
|
||||||
|
status = vaCreateImage(display, selected_format, size.width, size.height, &image);
|
||||||
|
if (status != VA_STATUS_SUCCESS)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaCreateImage failed");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* buffer = 0;
|
unsigned char* buffer = 0;
|
||||||
status = vaMapBuffer(display, image.buf, (void **)&buffer);
|
status = vaMapBuffer(display, image.buf, (void **)&buffer);
|
||||||
@ -627,6 +653,14 @@ void convertToVASurface(VADisplay display, InputArray src, VASurfaceID surface,
|
|||||||
if (status != VA_STATUS_SUCCESS)
|
if (status != VA_STATUS_SUCCESS)
|
||||||
CV_Error(cv::Error::StsError, "VA-API: vaUnmapBuffer failed");
|
CV_Error(cv::Error::StsError, "VA-API: vaUnmapBuffer failed");
|
||||||
|
|
||||||
|
if (indirect_buffer){
|
||||||
|
status = vaPutImage(display, surface, image.image_id, 0, 0, size.width, size.height, 0, 0, size.width, size.height);
|
||||||
|
if (status != VA_STATUS_SUCCESS){
|
||||||
|
vaDestroyImage(display, image.image_id);
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaPutImage failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
status = vaDestroyImage(display, image.image_id);
|
status = vaDestroyImage(display, image.image_id);
|
||||||
if (status != VA_STATUS_SUCCESS)
|
if (status != VA_STATUS_SUCCESS)
|
||||||
CV_Error(cv::Error::StsError, "VA-API: vaDestroyImage failed");
|
CV_Error(cv::Error::StsError, "VA-API: vaDestroyImage failed");
|
||||||
@ -711,8 +745,37 @@ void convertFromVASurface(VADisplay display, VASurfaceID surface, Size size, Out
|
|||||||
|
|
||||||
VAImage image;
|
VAImage image;
|
||||||
status = vaDeriveImage(display, surface, &image);
|
status = vaDeriveImage(display, surface, &image);
|
||||||
if (status != VA_STATUS_SUCCESS)
|
if (status != VA_STATUS_SUCCESS){
|
||||||
CV_Error(cv::Error::StsError, "VA-API: vaDeriveImage failed");
|
//try vaCreateImage + vaGetImage
|
||||||
|
//pick a format
|
||||||
|
int num_formats = vaMaxNumImageFormats(display);
|
||||||
|
if (num_formats <= 0)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaMaxNumImageFormats failed");
|
||||||
|
std::vector<VAImageFormat> fmt_list(num_formats);
|
||||||
|
|
||||||
|
status = vaQueryImageFormats(display, fmt_list.data(), &num_formats);
|
||||||
|
if (status != VA_STATUS_SUCCESS)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaQueryImageFormats failed");
|
||||||
|
VAImageFormat *selected_format = nullptr;
|
||||||
|
for (auto &fmt : fmt_list){
|
||||||
|
if (fmt.fourcc == VA_FOURCC_NV12 || fmt.fourcc == VA_FOURCC_YV12){
|
||||||
|
selected_format = &fmt;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selected_format == nullptr)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaQueryImageFormats did not return a supported format");
|
||||||
|
|
||||||
|
status = vaCreateImage(display, selected_format, size.width, size.height, &image);
|
||||||
|
if (status != VA_STATUS_SUCCESS)
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaCreateImage failed");
|
||||||
|
|
||||||
|
status = vaGetImage(display, surface, 0, 0, size.width, size.height, image.image_id);
|
||||||
|
if (status != VA_STATUS_SUCCESS){
|
||||||
|
vaDestroyImage(display, image.image_id);
|
||||||
|
CV_Error(cv::Error::StsError, "VA-API: vaPutImage failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char* buffer = 0;
|
unsigned char* buffer = 0;
|
||||||
status = vaMapBuffer(display, image.buf, (void **)&buffer);
|
status = vaMapBuffer(display, image.buf, (void **)&buffer);
|
||||||
|
Loading…
Reference in New Issue
Block a user