Files
2026-08-24 10:03:24 +08:00

587 lines
18 KiB
C++

/*
* Copyright (C) 2021 Amlogic Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <drm_fourcc.h>
#include "render_plugin.h"
#include "Logger.h"
#include "wayland_videoformat.h"
#ifdef __cplusplus
extern "C" {
#endif
#define TAG "rlib:wayland_videoformat"
typedef struct
{
int32_t wl_shm_format;
uint32_t dma_format;
RenderVideoFormat render_format;
} wl_VideoFormat;
static const wl_VideoFormat wl_formats[] = {
{WL_SHM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888, VIDEO_FORMAT_BGRx},
{WL_SHM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888, VIDEO_FORMAT_BGRA},
{WL_SHM_FORMAT_XBGR8888, DRM_FORMAT_XBGR8888, VIDEO_FORMAT_RGBx},
{WL_SHM_FORMAT_RGBX8888, DRM_FORMAT_RGBX8888, VIDEO_FORMAT_xBGR},
{WL_SHM_FORMAT_BGRX8888, DRM_FORMAT_BGRX8888, VIDEO_FORMAT_xRGB},
{WL_SHM_FORMAT_ABGR8888, DRM_FORMAT_ABGR8888, VIDEO_FORMAT_RGBA},
{WL_SHM_FORMAT_RGBA8888, DRM_FORMAT_RGBA8888, VIDEO_FORMAT_ABGR},
{WL_SHM_FORMAT_BGRA8888, DRM_FORMAT_BGRA8888, VIDEO_FORMAT_ARGB},
{WL_SHM_FORMAT_RGB888, DRM_FORMAT_RGB888, VIDEO_FORMAT_RGB},
{WL_SHM_FORMAT_BGR888, DRM_FORMAT_BGR888, VIDEO_FORMAT_BGR},
{WL_SHM_FORMAT_RGB565, DRM_FORMAT_RGB565, VIDEO_FORMAT_RGB16},
{WL_SHM_FORMAT_BGR565, DRM_FORMAT_BGR565, VIDEO_FORMAT_BGR16},
{WL_SHM_FORMAT_YUYV, DRM_FORMAT_YUYV, VIDEO_FORMAT_YUY2},
{WL_SHM_FORMAT_YVYU, DRM_FORMAT_YVYU, VIDEO_FORMAT_YVYU},
{WL_SHM_FORMAT_UYVY, DRM_FORMAT_UYVY, VIDEO_FORMAT_UYVY},
{WL_SHM_FORMAT_AYUV, DRM_FORMAT_AYUV, VIDEO_FORMAT_AYUV},
{WL_SHM_FORMAT_NV12, DRM_FORMAT_NV12, VIDEO_FORMAT_NV12},
{WL_SHM_FORMAT_NV21, DRM_FORMAT_NV21, VIDEO_FORMAT_NV21},
{WL_SHM_FORMAT_NV16, DRM_FORMAT_NV16, VIDEO_FORMAT_NV16},
{WL_SHM_FORMAT_NV61, DRM_FORMAT_NV61, VIDEO_FORMAT_NV61},
{WL_SHM_FORMAT_YUV410, DRM_FORMAT_YUV410, VIDEO_FORMAT_YUV9},
{WL_SHM_FORMAT_YVU410, DRM_FORMAT_YVU410, VIDEO_FORMAT_YVU9},
{WL_SHM_FORMAT_YUV411, DRM_FORMAT_YUV411, VIDEO_FORMAT_Y41B},
{WL_SHM_FORMAT_YUV420, DRM_FORMAT_YUV420, VIDEO_FORMAT_I420},
{WL_SHM_FORMAT_YVU420, DRM_FORMAT_YVU420, VIDEO_FORMAT_YV12},
{WL_SHM_FORMAT_YUV422, DRM_FORMAT_YUV422, VIDEO_FORMAT_Y42B},
{WL_SHM_FORMAT_YUV444, DRM_FORMAT_YUV444, VIDEO_FORMAT_v308},
};
/**
* @brief translate video buffer format to wl dmabuffer format
*
* @param format render video format
* @return int if found return dma format,0 if not found
*/
uint32_t video_format_to_wl_dmabuf_format (RenderVideoFormat format)
{
int i;
for (i = 0; i < sizeof(wl_formats)/sizeof(wl_formats[0]); i++) {
if (wl_formats[i].render_format == format)
return wl_formats[i].dma_format;
}
TRACE(NO_CAT,"wl dmabuf format not found");
return 0;
}
RenderVideoFormat wl_dmabuf_format_to_video_format (uint32_t wl_format)
{
int i;
for (i = 0; i < sizeof(wl_formats)/sizeof(wl_formats[0]); i++)
if (wl_formats[i].dma_format == wl_format)
return (RenderVideoFormat)wl_formats[i].render_format;
return VIDEO_FORMAT_UNKNOWN;
}
int32_t video_format_to_wl_shm_format (RenderVideoFormat format)
{
int i;
for (i = 0; i < sizeof(wl_formats)/sizeof(wl_formats[0]); i++)
if (wl_formats[i].render_format == format)
return wl_formats[i].wl_shm_format;
return (int32_t) -1;
}
RenderVideoFormat wl_shm_format_to_video_format (enum wl_shm_format wl_format)
{
int i;
for (i = 0; i < sizeof(wl_formats)/sizeof(wl_formats[0]); i++)
if (wl_formats[i].wl_shm_format == wl_format)
return (RenderVideoFormat)wl_formats[i].render_format;
return VIDEO_FORMAT_UNKNOWN;
}
int is_direct_display_format(RenderVideoFormat format)
{
int support = 0;
switch (format) {
case VIDEO_FORMAT_NV12:
case VIDEO_FORMAT_NV21:
case VIDEO_FORMAT_UYVY:
support = 1;
break;
default:
break;
}
return support;
}
const char * print_dmabuf_format_name(uint32_t dmabufferformat)
{
const char* str = nullptr;
switch (dmabufferformat) {
case DRM_FORMAT_XRGB8888:{
str = "DRM_FORMAT_XRGB8888";
} break;
case DRM_FORMAT_ARGB8888:{
str = "DRM_FORMAT_ARGB8888";
} break;
case DRM_FORMAT_XBGR8888:{
str = "DRM_FORMAT_XBGR8888";
} break;
case DRM_FORMAT_RGBX8888:{
str = "DRM_FORMAT_RGBX8888";
} break;
case DRM_FORMAT_BGRX8888:{
str = "DRM_FORMAT_BGRX8888";
} break;
case DRM_FORMAT_ABGR8888:{
str = "DRM_FORMAT_ABGR8888";
} break;
case DRM_FORMAT_RGBA8888:{
str = "DRM_FORMAT_RGBA8888";
} break;
case DRM_FORMAT_BGRA8888:{
str = "DRM_FORMAT_BGRA8888";
} break;
case DRM_FORMAT_RGB888:{
str = "DRM_FORMAT_RGB888";
} break;
case DRM_FORMAT_BGR888:{
str = "DRM_FORMAT_BGR888";
} break;
case DRM_FORMAT_RGB565:{
str = "DRM_FORMAT_RGB565";
} break;
case DRM_FORMAT_BGR565:{
str = "DRM_FORMAT_BGR565";
} break;
case DRM_FORMAT_YUYV:{
str = "DRM_FORMAT_YUYV";
} break;
case DRM_FORMAT_YVYU:{
str = "DRM_FORMAT_YVYU";
} break;
case DRM_FORMAT_UYVY:{
str = "DRM_FORMAT_UYVY";
} break;
case DRM_FORMAT_AYUV:{
str = "DRM_FORMAT_AYUV";
} break;
case DRM_FORMAT_NV12:{
str = "DRM_FORMAT_NV12";
} break;
case DRM_FORMAT_NV21:{
str = "DRM_FORMAT_NV21";
} break;
case DRM_FORMAT_NV16:{
str = "DRM_FORMAT_NV16";
} break;
case DRM_FORMAT_NV61:{
str = "DRM_FORMAT_NV61";
} break;
case DRM_FORMAT_YUV410:{
str = "DRM_FORMAT_YUV410";
} break;
case DRM_FORMAT_YVU410:{
str = "DRM_FORMAT_YVU410";
} break;
case DRM_FORMAT_YUV411:{
str = "DRM_FORMAT_YUV411";
} break;
case DRM_FORMAT_YUV420:{
str = "DRM_FORMAT_YUV420";
} break;
case DRM_FORMAT_YVU420:{
str = "DRM_FORMAT_YVU420";
} break;
case DRM_FORMAT_YUV422:{
str = "DRM_FORMAT_YUV422";
} break;
case DRM_FORMAT_YUV444:{
str = "DRM_FORMAT_YUV444";
} break;
default:
str = "Unknown";
break;
}
return str;
}
const char * print_render_video_format_name(RenderVideoFormat format)
{
const char* str = nullptr;
switch (format) {
case VIDEO_FORMAT_UNKNOWN:{
str = "VIDEO_FORMAT_UNKNOWN";
} break;
case VIDEO_FORMAT_ENCODED:{
str = "VIDEO_FORMAT_ENCODED";
} break;
case VIDEO_FORMAT_I420:{
str = "VIDEO_FORMAT_I420";
} break;
case VIDEO_FORMAT_YV12:{
str = "VIDEO_FORMAT_YV12";
} break;
case VIDEO_FORMAT_YUY2:{
str = "VIDEO_FORMAT_YUY2";
} break;
case VIDEO_FORMAT_UYVY:{
str = "VIDEO_FORMAT_UYVY";
} break;
case VIDEO_FORMAT_AYUV:{
str = "VIDEO_FORMAT_AYUV";
} break;
case VIDEO_FORMAT_RGBx:{
str = "VIDEO_FORMAT_RGBx";
} break;
case VIDEO_FORMAT_BGRx:{
str = "VIDEO_FORMAT_BGRx";
} break;
case VIDEO_FORMAT_xRGB:{
str = "VIDEO_FORMAT_xRGB";
} break;
case VIDEO_FORMAT_xBGR:{
str = "VIDEO_FORMAT_xBGR";
} break;
case VIDEO_FORMAT_RGBA:{
str = "VIDEO_FORMAT_RGBA";
} break;
case VIDEO_FORMAT_BGRA:{
str = "VIDEO_FORMAT_BGRA";
} break;
case VIDEO_FORMAT_ARGB:{
str = "VIDEO_FORMAT_ARGB";
} break;
case VIDEO_FORMAT_ABGR:{
str = "VIDEO_FORMAT_ABGR";
} break;
case VIDEO_FORMAT_RGB:{
str = "VIDEO_FORMAT_RGB";
} break;
case VIDEO_FORMAT_BGR:{
str = "VIDEO_FORMAT_BGR";
} break;
case VIDEO_FORMAT_Y41B:{
str = "VIDEO_FORMAT_Y41B";
} break;
case VIDEO_FORMAT_Y42B:{
str = "VIDEO_FORMAT_Y42B";
} break;
case VIDEO_FORMAT_YVYU:{
str = "VIDEO_FORMAT_YVYU";
} break;
case VIDEO_FORMAT_Y444:{
str = "VIDEO_FORMAT_Y444";
} break;
case VIDEO_FORMAT_v210:{
str = "VIDEO_FORMAT_v210";
} break;
case VIDEO_FORMAT_v216:{
str = "VIDEO_FORMAT_v216";
} break;
case VIDEO_FORMAT_NV12:{
str = "VIDEO_FORMAT_NV12";
} break;
case VIDEO_FORMAT_NV21:{
str = "VIDEO_FORMAT_NV21";
} break;
case VIDEO_FORMAT_GRAY8:{
str = "VIDEO_FORMAT_GRAY8";
} break;
case VIDEO_FORMAT_GRAY16_BE:{
str = "VIDEO_FORMAT_GRAY16_BE";
} break;
case VIDEO_FORMAT_GRAY16_LE:{
str = "VIDEO_FORMAT_GRAY16_LE";
} break;
case VIDEO_FORMAT_v308:{
str = "VIDEO_FORMAT_v308";
} break;
case VIDEO_FORMAT_RGB16:{
str = "VIDEO_FORMAT_RGB16";
} break;
case VIDEO_FORMAT_BGR16:{
str = "VIDEO_FORMAT_BGR16";
} break;
case VIDEO_FORMAT_RGB15:{
str = "VIDEO_FORMAT_RGB15";
} break;
case VIDEO_FORMAT_BGR15:{
str = "VIDEO_FORMAT_BGR15";
} break;
case VIDEO_FORMAT_UYVP:{
str = "VIDEO_FORMAT_UYVP";
} break;
case VIDEO_FORMAT_A420:{
str = "VIDEO_FORMAT_A420";
} break;
case VIDEO_FORMAT_RGB8P:{
str = "VIDEO_FORMAT_RGB8P";
} break;
case VIDEO_FORMAT_YUV9:{
str = "VIDEO_FORMAT_YUV9";
} break;
case VIDEO_FORMAT_YVU9:{
str = "VIDEO_FORMAT_YVU9";
} break;
case VIDEO_FORMAT_IYU1:{
str = "VIDEO_FORMAT_IYU1";
} break;
case VIDEO_FORMAT_ARGB64:{
str = "VIDEO_FORMAT_ARGB64";
} break;
case VIDEO_FORMAT_AYUV64:{
str = "VIDEO_FORMAT_AYUV64";
} break;
case VIDEO_FORMAT_r210:{
str = "VIDEO_FORMAT_r210";
} break;
case VIDEO_FORMAT_I420_10BE:{
str = "VIDEO_FORMAT_I420_10BE";
} break;
case VIDEO_FORMAT_I420_10LE:{
str = "VIDEO_FORMAT_I420_10LE";
} break;
case VIDEO_FORMAT_I422_10BE:{
str = "VIDEO_FORMAT_I422_10BE";
} break;
case VIDEO_FORMAT_I422_10LE:{
str = "VIDEO_FORMAT_I422_10LE";
} break;
case VIDEO_FORMAT_Y444_10BE:{
str = "VIDEO_FORMAT_Y444_10BE";
} break;
case VIDEO_FORMAT_Y444_10LE:{
str = "VIDEO_FORMAT_Y444_10LE";
} break;
case VIDEO_FORMAT_GBR:{
str = "VIDEO_FORMAT_GBR";
} break;
case VIDEO_FORMAT_GBR_10BE:{
str = "VIDEO_FORMAT_GBR_10BE";
} break;
case VIDEO_FORMAT_GBR_10LE:{
str = "VIDEO_FORMAT_GBR_10LE";
} break;
case VIDEO_FORMAT_NV16:{
str = "VIDEO_FORMAT_NV16";
} break;
case VIDEO_FORMAT_NV24:{
str = "VIDEO_FORMAT_NV24";
} break;
case VIDEO_FORMAT_NV12_64Z32:{
str = "VIDEO_FORMAT_NV12_64Z32";
} break;
case VIDEO_FORMAT_A420_10BE:{
str = "VIDEO_FORMAT_A420_10BE";
} break;
case VIDEO_FORMAT_A420_10LE:{
str = "VIDEO_FORMAT_A420_10LE";
} break;
case VIDEO_FORMAT_A422_10BE:{
str = "VIDEO_FORMAT_A422_10BE";
} break;
case VIDEO_FORMAT_A422_10LE:{
str = "VIDEO_FORMAT_A422_10LE";
} break;
case VIDEO_FORMAT_A444_10BE:{
str = "VIDEO_FORMAT_A444_10BE";
} break;
case VIDEO_FORMAT_A444_10LE:{
str = "VIDEO_FORMAT_A444_10LE";
} break;
case VIDEO_FORMAT_NV61:{
str = "VIDEO_FORMAT_NV61";
} break;
case VIDEO_FORMAT_P010_10BE:{
str = "VIDEO_FORMAT_P010_10BE";
} break;
case VIDEO_FORMAT_P010_10LE:{
str = "VIDEO_FORMAT_P010_10LE";
} break;
case VIDEO_FORMAT_IYU2:{
str = "VIDEO_FORMAT_IYU2";
} break;
case VIDEO_FORMAT_VYUY:{
str = "VIDEO_FORMAT_VYUY";
} break;
case VIDEO_FORMAT_GBRA:{
str = "VIDEO_FORMAT_GBRA";
} break;
case VIDEO_FORMAT_GBRA_10BE:{
str = "VIDEO_FORMAT_GBRA_10BE";
} break;
case VIDEO_FORMAT_GBRA_10LE:{
str = "VIDEO_FORMAT_GBRA_10LE";
} break;
case VIDEO_FORMAT_GBR_12BE:{
str = "VIDEO_FORMAT_GBR_12BE";
} break;
case VIDEO_FORMAT_GBR_12LE:{
str = "VIDEO_FORMAT_GBR_12LE";
} break;
case VIDEO_FORMAT_GBRA_12BE:{
str = "VIDEO_FORMAT_GBRA_12BE";
} break;
case VIDEO_FORMAT_GBRA_12LE:{
str = "VIDEO_FORMAT_GBRA_12LE";
} break;
case VIDEO_FORMAT_I420_12BE:{
str = "VIDEO_FORMAT_I420_12BE";
} break;
case VIDEO_FORMAT_I420_12LE:{
str = "VIDEO_FORMAT_I420_12LE";
} break;
case VIDEO_FORMAT_I422_12BE:{
str = "VIDEO_FORMAT_I422_12BE";
} break;
case VIDEO_FORMAT_I422_12LE:{
str = "VIDEO_FORMAT_I422_12LE";
} break;
case VIDEO_FORMAT_Y444_12BE:{
str = "VIDEO_FORMAT_Y444_12BE";
} break;
case VIDEO_FORMAT_Y444_12LE:{
str = "VIDEO_FORMAT_Y444_12LE";
} break;
case VIDEO_FORMAT_GRAY10_LE32:{
str = "VIDEO_FORMAT_GRAY10_LE32";
} break;
case VIDEO_FORMAT_NV12_10LE32:{
str = "VIDEO_FORMAT_NV12_10LE32";
} break;
case VIDEO_FORMAT_NV16_10LE32:{
str = "VIDEO_FORMAT_NV16_10LE32";
} break;
case VIDEO_FORMAT_NV12_10LE40:{
str = "VIDEO_FORMAT_NV12_10LE40";
} break;
case VIDEO_FORMAT_Y210:{
str = "VIDEO_FORMAT_Y210";
} break;
case VIDEO_FORMAT_Y410:{
str = "VIDEO_FORMAT_Y410";
} break;
case VIDEO_FORMAT_VUYA:{
str = "VIDEO_FORMAT_VUYA";
} break;
case VIDEO_FORMAT_BGR10A2_LE:{
str = "VIDEO_FORMAT_BGR10A2_LE";
} break;
default:
str = "Unknown";
break;
}
return str;
}
const char* print_shm_format_name(uint32_t format)
{
const char* str = nullptr;
switch (format) {
case WL_SHM_FORMAT_XRGB8888:{
str = "WL_SHM_FORMAT_XRGB8888";
} break;
case WL_SHM_FORMAT_ARGB8888:{
str = "WL_SHM_FORMAT_ARGB8888";
} break;
case WL_SHM_FORMAT_XBGR8888:{
str = "WL_SHM_FORMAT_XBGR8888";
} break;
case WL_SHM_FORMAT_RGBX8888:{
str = "WL_SHM_FORMAT_RGBX8888";
} break;
case WL_SHM_FORMAT_BGRX8888:{
str = "WL_SHM_FORMAT_BGRX8888";
} break;
case WL_SHM_FORMAT_ABGR8888:{
str = "WL_SHM_FORMAT_ABGR8888";
} break;
case WL_SHM_FORMAT_RGBA8888:{
str = "WL_SHM_FORMAT_RGBA8888";
} break;
case WL_SHM_FORMAT_BGRA8888:{
str = "WL_SHM_FORMAT_BGRA8888";
} break;
case WL_SHM_FORMAT_RGB888:{
str = "WL_SHM_FORMAT_RGB888";
} break;
case WL_SHM_FORMAT_BGR888:{
str = "WL_SHM_FORMAT_BGR888";
} break;
case WL_SHM_FORMAT_RGB565:{
str = "WL_SHM_FORMAT_RGB565";
} break;
case WL_SHM_FORMAT_BGR565:{
str = "WL_SHM_FORMAT_BGR565";
} break;
case WL_SHM_FORMAT_YUYV:{
str = "WL_SHM_FORMAT_YUYV";
} break;
case WL_SHM_FORMAT_YVYU:{
str = "WL_SHM_FORMAT_YVYU";
} break;
case WL_SHM_FORMAT_UYVY:{
str = "WL_SHM_FORMAT_UYVY";
} break;
case WL_SHM_FORMAT_AYUV:{
str = "WL_SHM_FORMAT_AYUV";
} break;
case WL_SHM_FORMAT_NV12:{
str = "WL_SHM_FORMAT_NV12";
} break;
case WL_SHM_FORMAT_NV21:{
str = "WL_SHM_FORMAT_NV21";
} break;
case WL_SHM_FORMAT_NV16:{
str = "WL_SHM_FORMAT_NV16";
} break;
case WL_SHM_FORMAT_NV61:{
str = "WL_SHM_FORMAT_NV61";
} break;
case WL_SHM_FORMAT_YUV410:{
str = "WL_SHM_FORMAT_YUV410";
} break;
case WL_SHM_FORMAT_YVU410:{
str = "WL_SHM_FORMAT_YVU410";
} break;
case WL_SHM_FORMAT_YUV411:{
str = "WL_SHM_FORMAT_YUV411";
} break;
case WL_SHM_FORMAT_YUV420:{
str = "WL_SHM_FORMAT_YUV420";
} break;
case WL_SHM_FORMAT_YVU420:{
str = "WL_SHM_FORMAT_YVU420";
} break;
case WL_SHM_FORMAT_YUV422:{
str = "WL_SHM_FORMAT_YUV422";
} break;
case WL_SHM_FORMAT_YUV444:{
str = "WL_SHM_FORMAT_YUV444";
} break;
default:
str = "Unknown";
break;
}
return str;
}
#ifdef __cplusplus
}
#endif