From 1e9aaee3ecd2e33f9c46adcbabed337ffbc1fcd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 5 Jan 2013 18:56:26 +0100 Subject: [PATCH] mfc: Add support for RGB --- sys/mfc/fimc/fimc.c | 6 ++++++ sys/mfc/fimc/fimc.h | 3 ++- sys/mfc/gstmfcdec.c | 18 +++++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/sys/mfc/fimc/fimc.c b/sys/mfc/fimc/fimc.c index b955dc855d..b8334edf36 100644 --- a/sys/mfc/fimc/fimc.c +++ b/sys/mfc/fimc/fimc.c @@ -164,6 +164,8 @@ fimc_color_format_to_v4l2 (FimcColorFormat format) return V4L2_PIX_FMT_NV12M; case FIMC_COLOR_FORMAT_YUV420P: return V4L2_PIX_FMT_YUV420M; + case FIMC_COLOR_FORMAT_RGB32: + return V4L2_PIX_FMT_RGB32; default: break; } @@ -175,6 +177,8 @@ static int fimc_color_format_get_nplanes (FimcColorFormat format) { switch (format) { + case FIMC_COLOR_FORMAT_RGB32: + return 1; case FIMC_COLOR_FORMAT_YUV420SPT: case FIMC_COLOR_FORMAT_YUV420SP: return 2; @@ -192,6 +196,8 @@ fimc_color_format_get_component_height (FimcColorFormat format, int c, int height) { switch (format) { + case FIMC_COLOR_FORMAT_RGB32: + return height; case FIMC_COLOR_FORMAT_YUV420SPT: case FIMC_COLOR_FORMAT_YUV420SP: case FIMC_COLOR_FORMAT_YUV420P: diff --git a/sys/mfc/fimc/fimc.h b/sys/mfc/fimc/fimc.h index 480a0ab4b1..f2c34e3c32 100644 --- a/sys/mfc/fimc/fimc.h +++ b/sys/mfc/fimc/fimc.h @@ -51,7 +51,8 @@ typedef struct _Fimc Fimc; typedef enum { FIMC_COLOR_FORMAT_YUV420SPT, FIMC_COLOR_FORMAT_YUV420SP, - FIMC_COLOR_FORMAT_YUV420P + FIMC_COLOR_FORMAT_YUV420P, + FIMC_COLOR_FORMAT_RGB32 } FimcColorFormat; void fimc_init_debug (void); diff --git a/sys/mfc/gstmfcdec.c b/sys/mfc/gstmfcdec.c index 1c92958d49..fe2c97a74f 100644 --- a/sys/mfc/gstmfcdec.c +++ b/sys/mfc/gstmfcdec.c @@ -80,7 +80,7 @@ static GstStaticPadTemplate gst_mfc_dec_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ NV12, I420, YV12 }")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ NV12, I420, YV12, RGBx }")) ); /* *INDENT-ON* */ @@ -428,6 +428,9 @@ gst_mfc_dec_create_fimc (GstMFCDec * self, GstVideoCodecState * state) fimc = fimc_new (); switch (state->info.finfo->format) { + case GST_VIDEO_FORMAT_RGBx: + fimc_format = FIMC_COLOR_FORMAT_RGB32; + break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: fimc_format = FIMC_COLOR_FORMAT_YUV420P; @@ -629,6 +632,19 @@ gst_mfc_dec_fill_outbuf (GstMFCDec * self, GstBuffer * outbuf, goto fimc_convert_error; switch (state->info.finfo->format) { + case GST_VIDEO_FORMAT_RGBx: + dst_ = (guint8 *) GST_VIDEO_FRAME_COMP_DATA (&vframe, 0); + src_ = self->dst[0]; + src_stride = self->dst_stride[0]; + h = GST_VIDEO_FRAME_HEIGHT (&vframe); + w = GST_VIDEO_FRAME_WIDTH (&vframe); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&vframe, 0); + for (i = 0; i < h; i++) { + memcpy (dst_, src_, w); + dst_ += dst_stride; + src_ += src_stride; + } + break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: for (j = 0; j < 3; j++) {