From 18a550c549033a7c13445a7000b6b86e67e1fda9 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 23 Jul 2020 19:43:07 +0900 Subject: [PATCH] [tizencamerasrc] Support capture function [Version] 1.16.2-9 [Profile] Common [Issue Type] Update Change-Id: I3e9f7804edddd96eb29981813974146bae670722 Signed-off-by: Jeongmo Yang --- packaging/gst-plugins-tizen.spec | 2 +- tizencamerasrc/src/gsttizencamerasrc.c | 52 ++++++++++++++++---------- tizencamerasrc/src/include/gsttizencamerasrc.h | 4 +- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/packaging/gst-plugins-tizen.spec b/packaging/gst-plugins-tizen.spec index d9cbb1a..007b93d 100644 --- a/packaging/gst-plugins-tizen.spec +++ b/packaging/gst-plugins-tizen.spec @@ -5,7 +5,7 @@ Name: gst-plugins-tizen Version: 1.16.2 Summary: GStreamer tizen plugins (common) -Release: 8 +Release: 9 Group: Multimedia/Framework Url: http://gstreamer.freedesktop.org/ License: LGPL-2.1+ diff --git a/tizencamerasrc/src/gsttizencamerasrc.c b/tizencamerasrc/src/gsttizencamerasrc.c index 1c3211b..cae1d2c 100644 --- a/tizencamerasrc/src/gsttizencamerasrc.c +++ b/tizencamerasrc/src/gsttizencamerasrc.c @@ -223,14 +223,14 @@ static void gst_tizencamerasrc_error_handler(GstTizenCameraSrc *camerasrc, int r static GstBuffer *gst_tizencamerasrc_buffer_new(GstTizenCameraSrc *camerasrc, camera_buffer_t *buffer, GstTizenCameraBufferType type); static void gst_tizencamerasrc_buffer_finalize(GstTizenCameraBuffer *buffer); static void gst_tizencamerasrc_set_video_format(GstTizenCameraSrc *camerasrc); -static void gst_tizencamerasrc_set_capture_resolution(GstTizenCameraSrc *camerasrc); +static void gst_tizencamerasrc_set_capture_format(GstTizenCameraSrc *camerasrc); /* Util functions */ #if 0 static unsigned long _get_current_time(void); #endif static gboolean _gst_tizencamerasrc_get_frame_size(int fourcc, int width, int height, unsigned int *outsize); -static gboolean _gst_tizencamerasrc_get_raw_pixel_info(int fourcc, int *pix_format); +static gboolean _gst_tizencamerasrc_get_raw_pixel_info(int fourcc, camera_pixel_format_t *pix_format); static gboolean _gst_tizencamerasrc_get_tbm_format(int pix_format, guint32 *tbm_format); static void _gst_tizencamerasrc_post_message_int(GstTizenCameraSrc *camerasrc, const char *msg_name, const char *field_name, int value); @@ -299,7 +299,6 @@ static GstBuffer *gst_tizencamerasrc_buffer_new(GstTizenCameraSrc *camerasrc, ca (gpointer)new_buffer, (GDestroyNotify)gst_tizencamerasrc_buffer_finalize); } else { - gpointer pdata = NULL; GST_DEBUG_OBJECT(camerasrc, "TBM is NOT used - size %u", buffer->total_size); if (camerasrc->pix_format == CAMERA_PIXEL_FORMAT_H264 || camerasrc->pix_format == CAMERA_PIXEL_FORMAT_MJPEG) { @@ -311,19 +310,17 @@ static GstBuffer *gst_tizencamerasrc_buffer_new(GstTizenCameraSrc *camerasrc, ca memcpy(new_buffer->copied_data + total_size, buffer->planes[i].data, buffer->planes[i].size); total_size += buffer->planes[i].size; } - pdata = (gpointer)new_buffer->copied_data; - - if (type == BUFFER_TYPE_PREVIEW) { - camera_hal_interface_release_preview_buffer(camerasrc->hal_intf_handle, buffer->index); - } else if (type == BUFFER_TYPE_VIDEO) { - camera_hal_interface_release_video_buffer(camerasrc->hal_intf_handle, buffer->index); - } } else { - pdata = (gpointer)buffer->planes[0].data; + new_buffer->copied_data = g_memdup(buffer->planes[0].data, buffer->total_size); } + if (type == BUFFER_TYPE_PREVIEW) + camera_hal_interface_release_preview_buffer(camerasrc->hal_intf_handle, buffer->index); + else if (type == BUFFER_TYPE_VIDEO) + camera_hal_interface_release_video_buffer(camerasrc->hal_intf_handle, buffer->index); + memory = gst_memory_new_wrapped(0, - pdata, + new_buffer->copied_data, buffer->total_size, 0, buffer->total_size, @@ -397,8 +394,9 @@ static void gst_tizencamerasrc_buffer_finalize(GstTizenCameraBuffer *buffer) tbm_surface_destroy(buffer->t_surface); buffer->t_surface = NULL; } - g_free(buffer->copied_data); + gst_object_unref(camerasrc); + g_free(buffer->copied_data); g_free(buffer); GST_DEBUG_OBJECT(camerasrc, "done"); @@ -440,7 +438,10 @@ static void gst_tizencamerasrc_set_video_format(GstTizenCameraSrc *camerasrc) break; } - set_format.capture_format = CAMERA_PIXEL_FORMAT_JPEG; + if (!_gst_tizencamerasrc_get_raw_pixel_info(camerasrc->cap_fourcc, &set_format.capture_format)) { + GST_WARNING_OBJECT(camerasrc, "_gst_tizencamerasrc_get_raw_pixel_info failed, set default JPEG"); + set_format.capture_format = CAMERA_PIXEL_FORMAT_JPEG; + } set_format.capture_resolution.width = camerasrc->cap_width; set_format.capture_resolution.height = camerasrc->cap_height; set_format.capture_quality = (uint32_t)camerasrc->cap_jpg_quality; @@ -459,7 +460,7 @@ static void gst_tizencamerasrc_set_video_format(GstTizenCameraSrc *camerasrc) } -static void gst_tizencamerasrc_set_capture_resolution(GstTizenCameraSrc *camerasrc) +static void gst_tizencamerasrc_set_capture_format(GstTizenCameraSrc *camerasrc) { int ret = CAMERA_ERROR_NONE; GstState state = GST_STATE_NULL; @@ -493,6 +494,10 @@ static void gst_tizencamerasrc_set_capture_resolution(GstTizenCameraSrc *cameras return; } + if (!_gst_tizencamerasrc_get_raw_pixel_info(camerasrc->cap_fourcc, &stream_format.capture_format)) { + GST_WARNING_OBJECT(camerasrc, "_gst_tizencamerasrc_get_raw_pixel_info failed, set default JPEG"); + stream_format.capture_format = CAMERA_PIXEL_FORMAT_JPEG; + } stream_format.capture_resolution.width = camerasrc->cap_width_tmp; stream_format.capture_resolution.height = camerasrc->cap_height_tmp; @@ -901,7 +906,7 @@ static GstSample *__create_buffer_sample(GstTizenCameraSrc *camerasrc, camera_bu } else { string_fourcc = gst_video_format_to_string(__get_gst_video_format(cam_buffer->format)); if (string_fourcc) { - caps = gst_caps_new_simple("image/jpeg", + caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, string_fourcc, "width", G_TYPE_INT, cam_buffer->resolution.width, "height", G_TYPE_INT, cam_buffer->resolution.height, @@ -1184,7 +1189,10 @@ static gboolean gst_tizencamerasrc_start(GstTizenCameraSrc *camerasrc) set_format.stream_fps = camerasrc->high_speed_fps; } - set_format.capture_format = CAMERA_PIXEL_FORMAT_JPEG; + if (!_gst_tizencamerasrc_get_raw_pixel_info(camerasrc->cap_fourcc, &set_format.capture_format)) { + GST_WARNING_OBJECT(camerasrc, "_gst_tizencamerasrc_get_raw_pixel_info failed, set default JPEG"); + set_format.capture_format = CAMERA_PIXEL_FORMAT_JPEG; + } set_format.capture_resolution.width = camerasrc->cap_width; set_format.capture_resolution.height = camerasrc->cap_height; set_format.capture_quality = (uint32_t)camerasrc->cap_jpg_quality; @@ -1376,6 +1384,7 @@ static gboolean gst_tizencamerasrc_capture_stop(GstTizenCameraSrc *camerasrc) g_mutex_lock(&camerasrc->preview_buffer_lock); + camerasrc->preview_buffer_running = TRUE; camerasrc->mode = VIDEO_IN_MODE_PREVIEW; g_cond_signal(&camerasrc->preview_buffer_cond); @@ -1622,13 +1631,14 @@ static void gst_tizencamerasrc_set_property(GObject *object, guint prop_id, break; case ARG_CAPTURE_FOURCC: camerasrc->cap_fourcc = g_value_get_uint(value); + gst_tizencamerasrc_set_capture_format(camerasrc); break; case ARG_CAPTURE_WIDTH: camerasrc->cap_width_tmp = g_value_get_int(value); break; case ARG_CAPTURE_HEIGHT: camerasrc->cap_height_tmp = g_value_get_int(value); - gst_tizencamerasrc_set_capture_resolution(camerasrc); + gst_tizencamerasrc_set_capture_format(camerasrc); break; case ARG_CAPTURE_INTERVAL: camerasrc->cap_interval = g_value_get_int(value); @@ -2088,7 +2098,7 @@ static GstCaps *gst_tizencamerasrc_get_caps(GstBaseSrc *src, GstCaps *filter) } -static gboolean _gst_tizencamerasrc_get_raw_pixel_info(int fourcc, int *pix_format) +static gboolean _gst_tizencamerasrc_get_raw_pixel_info(int fourcc, camera_pixel_format_t *pix_format) { if (pix_format == NULL) { GST_ERROR("NULL pointer"); @@ -2123,6 +2133,10 @@ static gboolean _gst_tizencamerasrc_get_raw_pixel_info(int fourcc, int *pix_form return FALSE; } + GST_INFO("pixel format[%c%c%c%c] -> [%d]", + fourcc, fourcc >> 8, fourcc >> 16, fourcc >> 24, + *pix_format); + return TRUE; } diff --git a/tizencamerasrc/src/include/gsttizencamerasrc.h b/tizencamerasrc/src/include/gsttizencamerasrc.h index ba1668c..6a600db 100644 --- a/tizencamerasrc/src/include/gsttizencamerasrc.h +++ b/tizencamerasrc/src/include/gsttizencamerasrc.h @@ -70,7 +70,7 @@ struct _GstTizenCameraBuffer { GstTizenCameraBufferType type; int index; tbm_surface_h t_surface; - gchar *copied_data; + gpointer copied_data; }; struct _GstTizenCameraSrc @@ -109,7 +109,7 @@ struct _GstTizenCameraSrc gboolean recording_hint; /**< Hint of recording */ gchar format_name[FORMAT_NAME_LENGTH]; /**< Format name */ - gint pix_format; /**< Image format of video source */ + camera_pixel_format_t pix_format; /**< Image format of video source */ gint high_speed_fps; /**< Video source fps for high speed recording */ gboolean fps_auto; /**< Auto Video source fps */ -- 2.7.4