From 6c2d46b4bca72b7b2a56f692361d7b2b1274d1fb Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 6 Sep 2022 20:12:47 +0900 Subject: [PATCH] Add new util function to get video caps [Version] 0.10.269 [Issue Type] Update Change-Id: I1877c34b0e064a6b009b9893e639258957932853 Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder_util.h | 1 + src/mm_camcorder_gstcommon.c | 80 +----------------------------- src/mm_camcorder_stillshot.c | 16 ++---- src/mm_camcorder_util.c | 88 +++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 92 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 48801a5..6e08b7b 100755 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -1,6 +1,6 @@ Name: libmm-camcorder Summary: Camera and recorder library -Version: 0.10.268 +Version: 0.10.269 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder_util.h b/src/include/mm_camcorder_util.h index 6165170..cfa5fb5 100644 --- a/src/include/mm_camcorder_util.h +++ b/src/include/mm_camcorder_util.h @@ -293,6 +293,7 @@ void _mmcamcorder_remove_all_handlers(MMHandleType handle, _MMCamcorderHandlerCa void _mmcamcorder_element_release_noti(gpointer data, GObject *where_the_object_was); gboolean _mmcamcorder_add_elements_to_bin(GstBin *bin, GList *element_list); gboolean _mmcamcorder_link_elements(GList *element_list); +GstCaps *_mmcamcorder_get_video_caps(MMHandleType handle, MMPixelFormatType format, int width, int height, int fps, int rotate); /* Message */ #ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index 1c9a76d..b6deab8 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -2616,14 +2616,6 @@ bool _mmcamcorder_set_videosrc_caps(MMHandleType handle, unsigned int fourcc, in int fps_auto = 0; unsigned int caps_fourcc = 0; gboolean do_set_caps = FALSE; - char fourcc_string[sizeof(fourcc) + 1]; - gchar *caps_str = NULL; -#ifdef _MMCAMCORDER_PRODUCT_TV - gint maxwidth = 0; - gint maxheight = 0; - int display_surface_type = MM_DISPLAY_SURFACE_NULL; -#endif /* _MMCAMCORDER_PRODUCT_TV */ - GstCaps *caps = NULL; mmf_camcorder_t *hcamcorder = NULL; @@ -2793,81 +2785,13 @@ bool _mmcamcorder_set_videosrc_caps(MMHandleType handle, unsigned int fourcc, in if (!do_set_caps) return TRUE; - switch (sc->info_image->preview_format) { - case MM_PIXEL_FORMAT_ENCODED_H264: -#ifdef _MMCAMCORDER_PRODUCT_TV - mm_camcorder_get_attributes(handle, NULL, - MMCAM_DISPLAY_SURFACE, &display_surface_type, - NULL); - if (display_surface_type != MM_DISPLAY_SURFACE_NULL && - __mmcamcorder_find_max_resolution(handle, &maxwidth, &maxheight) == false) { - MMCAM_LOG_ERROR("can not find max resolution limitation"); - return false; - } else if (display_surface_type == MM_DISPLAY_SURFACE_NULL) { - maxwidth = set_width; - maxheight = set_height; - } -#endif /* _MMCAMCORDER_PRODUCT_TV */ - caps = gst_caps_new_simple("video/x-h264", - "width", G_TYPE_INT, set_width, - "height", G_TYPE_INT, set_height, - "framerate", GST_TYPE_FRACTION, fps, 1, - "stream-format", G_TYPE_STRING, "byte-stream", -#ifdef _MMCAMCORDER_PRODUCT_TV - "maxwidth", G_TYPE_INT, maxwidth, - "maxheight", G_TYPE_INT, maxheight, - "alignment", G_TYPE_STRING, "au", -#endif /* _MMCAMCORDER_PRODUCT_TV */ - NULL); - break; - case MM_PIXEL_FORMAT_ENCODED_MJPEG: -#ifdef _MMCAMCORDER_PRODUCT_TV - caps = gst_caps_new_simple("video/x-jpeg", -#else - caps = gst_caps_new_simple("image/jpeg", -#endif - "width", G_TYPE_INT, set_width, - "height", G_TYPE_INT, set_height, - "framerate", GST_TYPE_FRACTION, fps, 1, - NULL); - break; - case MM_PIXEL_FORMAT_ENCODED_VP8: - caps = gst_caps_new_simple("video/x-vp8", - "width", G_TYPE_INT, set_width, - "height", G_TYPE_INT, set_height, - "framerate", GST_TYPE_FRACTION, fps, 1, - NULL); - break; - case MM_PIXEL_FORMAT_ENCODED_VP9: - caps = gst_caps_new_simple("video/x-vp9", - "width", G_TYPE_INT, set_width, - "height", G_TYPE_INT, set_height, - "framerate", GST_TYPE_FRACTION, fps, 1, - NULL); - break; - break; - default: - memcpy(fourcc_string, (char*)&fourcc, sizeof(fourcc)); - fourcc_string[sizeof(fourcc)] = '\0'; - caps = gst_caps_new_simple("video/x-raw", - "format", G_TYPE_STRING, fourcc_string, - "width", G_TYPE_INT, set_width, - "height", G_TYPE_INT, set_height, - "framerate", GST_TYPE_FRACTION, fps, 1, - "rotate", G_TYPE_INT, set_rotate, - NULL); - break; - } - + caps = _mmcamcorder_get_video_caps(handle, + sc->info_image->preview_format, set_width, set_height, fps, set_rotate); if (!caps) { MMCAM_LOG_ERROR("There are no caps"); return FALSE; } - caps_str = gst_caps_to_string(caps); - MMCAM_LOG_INFO("vidoesrc new caps set [%s]", caps_str); - g_free(caps_str); - MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps); gst_caps_unref(caps); diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index 9161189..b58d290 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -326,7 +326,6 @@ static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder) int width = 0; int height = 0; int fps = 0; - gchar *caps_string = NULL; GstCaps *caps = NULL; GList *element_list = NULL; _MMCamcorderSubContext *sc = NULL; @@ -358,24 +357,15 @@ static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder) MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "enable-last-sample", FALSE); MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "signal-handoffs", TRUE); - caps = gst_caps_new_simple("video/x-h264", - "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, - "framerate", GST_TYPE_FRACTION, fps, 1, - NULL); + caps = _mmcamcorder_get_video_caps((MMHandleType)hcamcorder, + hcamcorder->extra_preview.format[0].pixel_format, + width, height, fps, -1); if (!caps) { MMCAM_LOG_ERROR("caps for extra preview failed"); err = MM_ERROR_CAMCORDER_GST_LINK; goto pipeline_creation_error; } - caps_string = gst_caps_to_string(caps); - if (caps_string) { - MMCAM_LOG_INFO("set caps for capture[%s]", caps_string); - g_free(caps_string); - caps_string = NULL; - } - MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "caps", caps); gst_caps_unref(caps); diff --git a/src/mm_camcorder_util.c b/src/mm_camcorder_util.c index b7c8852..af640a1 100644 --- a/src/mm_camcorder_util.c +++ b/src/mm_camcorder_util.c @@ -1890,6 +1890,94 @@ gboolean _mmcamcorder_link_elements(GList *element_list) return TRUE; } +GstCaps *_mmcamcorder_get_video_caps(MMHandleType handle, MMPixelFormatType format, int width, int height, int fps, int rotate) +{ + int codec_type = MM_IMAGE_CODEC_JPEG; + guint32 fourcc = 0; + char fourcc_string[sizeof(guint32) + 1]; +#ifdef _MMCAMCORDER_PRODUCT_TV + int maxwidth = 0; + int maxheight = 0; + int display_surface_type = MM_DISPLAY_SURFACE_NULL; +#endif /* _MMCAMCORDER_PRODUCT_TV */ + gchar *caps_string = NULL; + GstCaps *caps = NULL;; + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + + switch (format) { + case MM_PIXEL_FORMAT_ENCODED_H264: +#ifdef _MMCAMCORDER_PRODUCT_TV + mm_camcorder_get_attributes(handle, NULL, + MMCAM_DISPLAY_SURFACE, &display_surface_type, + NULL); + if (display_surface_type != MM_DISPLAY_SURFACE_NULL && + __mmcamcorder_find_max_resolution(handle, &maxwidth, &maxheight) == false) { + MMCAM_LOG_ERROR("can not find max resolution limitation"); + return false; + } else if (display_surface_type == MM_DISPLAY_SURFACE_NULL) { + maxwidth = width; + maxheight = height; + } +#endif /* _MMCAMCORDER_PRODUCT_TV */ + caps = gst_caps_new_simple("video/x-h264", + "stream-format", G_TYPE_STRING, "byte-stream", +#ifdef _MMCAMCORDER_PRODUCT_TV + "maxwidth", G_TYPE_INT, maxwidth, + "maxheight", G_TYPE_INT, maxheight, + "alignment", G_TYPE_STRING, "au", +#endif /* _MMCAMCORDER_PRODUCT_TV */ + NULL); + break; + case MM_PIXEL_FORMAT_ENCODED_MJPEG: +#ifdef _MMCAMCORDER_PRODUCT_TV + caps = gst_caps_new_empty_simple("video/x-jpeg"); +#else + caps = gst_caps_new_empty_simple("image/jpeg"); +#endif + break; + case MM_PIXEL_FORMAT_ENCODED_VP8: + caps = gst_caps_new_empty_simple("video/x-vp8"); + break; + case MM_PIXEL_FORMAT_ENCODED_VP9: + caps = gst_caps_new_empty_simple("video/x-vp9"); + break; + default: + mm_camcorder_get_attributes(handle, NULL, + MMCAM_IMAGE_ENCODER, &codec_type, + NULL); + + fourcc = (guint32)_mmcamcorder_get_fourcc(format, codec_type, hcamcorder->use_zero_copy_format); + snprintf(fourcc_string, sizeof(fourcc_string), "%"GST_FOURCC_FORMAT, GST_FOURCC_ARGS(fourcc)); + caps = gst_caps_new_simple("video/x-raw", + "format", G_TYPE_STRING, fourcc_string, + NULL); + break; + } + + gst_caps_set_simple(caps, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + NULL); + + if (fps > 0) { + gst_caps_set_simple(caps, + "framerate", GST_TYPE_FRACTION, fps, 1, + NULL); + } + + if (rotate >= 0) { + gst_caps_set_simple(caps, + "rotate", G_TYPE_INT, rotate, + NULL); + } + + caps_string = gst_caps_to_string(caps); + MMCAM_LOG_INFO("caps[%s]", caps_string); + g_free(caps_string); + + return caps; +} + gboolean _mmcamcorder_resize_frame(unsigned char *src_data, unsigned int src_width, unsigned int src_height, unsigned int src_length, int src_format, unsigned char **dst_data, unsigned int *dst_width, unsigned int *dst_height, size_t *dst_length) { -- 2.34.1