From c3629eacb5f7e99798616200bc607ed9b2cb487a Mon Sep 17 00:00:00 2001 From: jpk <_@jpk.is> Date: Wed, 24 Feb 2016 23:02:11 -0500 Subject: [PATCH] libobs: Add Y800 color format support (Note: Also modified the obs-ffmpeg plugin module) Allows the ability for frame data to pass 8-bit grayscale images (Y800 color format). Closes jp9000/obs-studio#515 --- libobs/media-io/video-fourcc.c | 3 +++ libobs/media-io/video-frame.c | 8 ++++++++ libobs/media-io/video-io.h | 3 +++ libobs/media-io/video-scaler-ffmpeg.c | 1 + libobs/obs-internal.h | 2 ++ libobs/obs-source.c | 3 +++ plugins/obs-ffmpeg/obs-ffmpeg-formats.h | 2 ++ 7 files changed, 22 insertions(+) diff --git a/libobs/media-io/video-fourcc.c b/libobs/media-io/video-fourcc.c index a1c0e42f3..37b949b05 100644 --- a/libobs/media-io/video-fourcc.c +++ b/libobs/media-io/video-fourcc.c @@ -44,6 +44,9 @@ enum video_format video_format_from_fourcc(uint32_t fourcc) case MAKE_FOURCC('Y','V','Y','U'): return VIDEO_FORMAT_YVYU; + + case MAKE_FOURCC('Y','8','0','0'): + return VIDEO_FORMAT_Y800; } return VIDEO_FORMAT_NONE; diff --git a/libobs/media-io/video-frame.c b/libobs/media-io/video-frame.c index d950814ba..f29a6f11a 100644 --- a/libobs/media-io/video-frame.c +++ b/libobs/media-io/video-frame.c @@ -66,6 +66,13 @@ void video_frame_init(struct video_frame *frame, enum video_format format, frame->linesize[1] = width; break; + case VIDEO_FORMAT_Y800: + size = width * height; + ALIGN_SIZE(size, alignment); + frame->data[0] = bmalloc(size); + frame->linesize[0] = width; + break; + case VIDEO_FORMAT_YVYU: case VIDEO_FORMAT_YUY2: case VIDEO_FORMAT_UYVY: @@ -115,6 +122,7 @@ void video_frame_copy(struct video_frame *dst, const struct video_frame *src, memcpy(dst->data[1], src->data[1], src->linesize[1] * cy / 2); break; + case VIDEO_FORMAT_Y800: case VIDEO_FORMAT_YVYU: case VIDEO_FORMAT_YUY2: case VIDEO_FORMAT_UYVY: diff --git a/libobs/media-io/video-io.h b/libobs/media-io/video-io.h index cef009dd0..ec6b2face 100644 --- a/libobs/media-io/video-io.h +++ b/libobs/media-io/video-io.h @@ -46,6 +46,7 @@ enum video_format { VIDEO_FORMAT_RGBA, VIDEO_FORMAT_BGRA, VIDEO_FORMAT_BGRX, + VIDEO_FORMAT_Y800, /* grayscale */ /* planar 4:4:4 */ VIDEO_FORMAT_I444, @@ -97,6 +98,7 @@ static inline bool format_is_yuv(enum video_format format) case VIDEO_FORMAT_RGBA: case VIDEO_FORMAT_BGRA: case VIDEO_FORMAT_BGRX: + case VIDEO_FORMAT_Y800: return false; } @@ -115,6 +117,7 @@ static inline const char *get_video_format_name(enum video_format format) case VIDEO_FORMAT_BGRA: return "BGRA"; case VIDEO_FORMAT_BGRX: return "BGRX"; case VIDEO_FORMAT_I444: return "I444"; + case VIDEO_FORMAT_Y800: return "Y800"; case VIDEO_FORMAT_NONE:; } diff --git a/libobs/media-io/video-scaler-ffmpeg.c b/libobs/media-io/video-scaler-ffmpeg.c index 31f721e33..e46aa4e9b 100644 --- a/libobs/media-io/video-scaler-ffmpeg.c +++ b/libobs/media-io/video-scaler-ffmpeg.c @@ -38,6 +38,7 @@ static inline enum AVPixelFormat get_ffmpeg_video_format( case VIDEO_FORMAT_RGBA: return AV_PIX_FMT_RGBA; case VIDEO_FORMAT_BGRA: return AV_PIX_FMT_BGRA; case VIDEO_FORMAT_BGRX: return AV_PIX_FMT_BGRA; + case VIDEO_FORMAT_Y800: return AV_PIX_FMT_GRAY8; case VIDEO_FORMAT_I444: return AV_PIX_FMT_YUV444P; } diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 2120f8c07..a825d239e 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -714,6 +714,8 @@ static inline enum gs_color_format convert_video_format( return GS_RGBA; else if (format == VIDEO_FORMAT_BGRA) return GS_BGRA; + else if (format == VIDEO_FORMAT_Y800) + return GS_R8; return GS_BGRX; } diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 4cb2ae458..d06ad744a 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -1233,6 +1233,7 @@ static inline enum convert_type get_convert_type(enum video_format format) case VIDEO_FORMAT_UYVY: return CONVERT_422_U; + case VIDEO_FORMAT_Y800: case VIDEO_FORMAT_I444: case VIDEO_FORMAT_NONE: case VIDEO_FORMAT_RGBA: @@ -1399,6 +1400,7 @@ static const char *select_conversion_technique(enum video_format format) return "NV12_Reverse"; break; + case VIDEO_FORMAT_Y800: case VIDEO_FORMAT_BGRA: case VIDEO_FORMAT_BGRX: case VIDEO_FORMAT_RGBA: @@ -2090,6 +2092,7 @@ static void copy_frame_data(struct obs_source_frame *dst, case VIDEO_FORMAT_YVYU: case VIDEO_FORMAT_YUY2: case VIDEO_FORMAT_UYVY: + case VIDEO_FORMAT_Y800: case VIDEO_FORMAT_NONE: case VIDEO_FORMAT_RGBA: case VIDEO_FORMAT_BGRA: diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-formats.h b/plugins/obs-ffmpeg/obs-ffmpeg-formats.h index 7b70e6e60..260f7514c 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-formats.h +++ b/plugins/obs-ffmpeg/obs-ffmpeg-formats.h @@ -21,6 +21,7 @@ static inline enum AVPixelFormat obs_to_ffmpeg_video_format( case VIDEO_FORMAT_RGBA: return AV_PIX_FMT_RGBA; case VIDEO_FORMAT_BGRA: return AV_PIX_FMT_BGRA; case VIDEO_FORMAT_BGRX: return AV_PIX_FMT_BGRA; + case VIDEO_FORMAT_Y800: return AV_PIX_FMT_GRAY8; } return AV_PIX_FMT_NONE; @@ -37,6 +38,7 @@ static inline enum video_format ffmpeg_to_obs_video_format( case AV_PIX_FMT_UYVY422: return VIDEO_FORMAT_UYVY; case AV_PIX_FMT_RGBA: return VIDEO_FORMAT_RGBA; case AV_PIX_FMT_BGRA: return VIDEO_FORMAT_BGRA; + case AV_PIX_FMT_GRAY8: return VIDEO_FORMAT_Y800; case AV_PIX_FMT_NONE: default: return VIDEO_FORMAT_NONE; }