Ver código fonte

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
jpk 9 anos atrás
pai
commit
c3629eacb5

+ 3 - 0
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;

+ 8 - 0
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:

+ 3 - 0
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:;
 	}
 

+ 1 - 0
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;
 	}
 

+ 2 - 0
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;
 }

+ 3 - 0
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:

+ 2 - 0
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;
 	}