Name: libmm-camcorder
Summary: Camera and recorder library
-Version: 0.10.239
+Version: 0.10.240
Release: 0
Group: Multimedia/Libraries
License: Apache-2.0
/* get log level */
int mm_camcorder_get_log_level(void);
+/* extra preview */
+int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps);
+int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps);
+
/**
@}
*/
#define MM_CAMCORDER_STROBE_MODE_NUM 8 /**< Number of strobe mode type */
#define MM_CAMCORDER_STROBE_CONTROL_NUM 3 /**< Number of strobe control type */
#define MM_CAMCORDER_DETECT_MODE_NUM 2 /**< Number of detect mode type */
+#define MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM 10 /**< Number of extra preview stream */
/*=======================================================================================
| ENUM DEFINITIONS |
} _MMCamcorderReplayGain;
/**
+ * MMCamcorder Extra preview stream format
+ */
+typedef struct {
+ int pixel_format;
+ int width;
+ int height;
+ int fps;
+ gboolean is_set;
+} _MMCamcorderExtraPreviewStreamFormat;
+
+/**
* MMCamcorder Sub Context
*/
typedef struct {
int use_videoconvert; /**< Whether use videoconvert element for display */
int support_media_packet_preview_cb; /**< Whether support zero copy format for camera input */
int support_user_buffer; /**< Whether support user allocated buffer for zero copy */
- int support_extra_preview; /**< Whether support extra preview stream */
int shutter_sound_policy; /**< shutter sound policy */
int brightness_default; /**< default value of brightness */
int brightness_step_denominator; /**< denominator of brightness bias step */
/* Profiling */
int measure_preview_fps; /**< Flag for measuring fps of preview frames */
+ /* Extra preview */
+ int support_extra_preview;
+ _MMCamcorderExtraPreviewStreamFormat extra_preview_format[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM];
+
int reserved[4]; /**< reserved */
} mmf_camcorder_t;
int _mmcamcorder_connect_capture_signal(MMHandleType handle);
/**
- * This function connects extra preview stream signal.
- *
- * @param[in] handle Handle of camcorder context.
- * @return This function returns MM_ERROR_NONE on success, or the other values on error.
- * @remarks
- */
-int _mmcamcorder_connect_extra_preview_stream(MMHandleType handle);
-
-/**
* This function destroy image pipeline.
*
* @param[in] handle Handle of camcorder context.
int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif);
gboolean __mmcamcorder_handoff_callback(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data);
+/* extra preview */
+int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle);
+int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps);
+int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps);
+
#ifdef __cplusplus
}
#endif
#include <gio/gio.h>
#include <linux/magic.h>
#include <storage.h>
+#include <gst/video/cameracontrol.h>
#ifdef __cplusplus
int _mmcamcorder_get_pixel_format(GstCaps *pad);
int _mmcamcorder_get_pixtype(unsigned int fourcc);
unsigned int _mmcamcorder_get_fourcc(int pixtype, int codectype, int use_zero_copy_format);
+MMPixelFormatType _mmcamcorder_get_pixel_format2(GstCameraControlImageFormat img_fmt);
+GstCameraControlImageFormat _mmcamcorder_get_camera_control_image_format(int pixel_format);
/* JPEG encode */
gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsigned int src_height,
{
return _mmcamcorder_get_log_level();
}
+
+int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps)
+{
+ return _mmcamcorder_set_extra_preview_stream_format(camcorder, stream_id, pixel_format, width, height, fps);
+}
+
+int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps)
+{
+ return _mmcamcorder_get_extra_preview_stream_format(camcorder, stream_id, pixel_format, width, height, fps);
+}
#include "mm_camcorder_gstcommon.h"
#include <gst/video/colorbalance.h>
-#include <gst/video/cameracontrol.h>
#include <gst/video/videooverlay.h>
/*-----------------------------------------------------------------------
#include <gst/allocators/gsttizenmemory.h>
#include <gst/audio/audio-format.h>
#include <gst/video/videooverlay.h>
-#include <gst/video/cameracontrol.h>
#include <sys/time.h>
#include <unistd.h>
#include <mm_types.h>
#include <gst/video/colorbalance.h>
-#include <gst/video/cameracontrol.h>
#include <asm/types.h>
#include <system_info.h>
}
if (hcamcorder->support_extra_preview &&
- _mmcamcorder_connect_extra_preview_stream(handle) != MM_ERROR_NONE)
+ _mmcamcorder_initialize_extra_preview_stream(handle) != MM_ERROR_NONE)
MMCAM_LOG_WARNING("connect extra preview stream signal failed");
break;
}
#include <stdlib.h>
#include <sys/time.h>
#include <sys/times.h>
-#include <gst/video/cameracontrol.h>
#include "mm_camcorder_internal.h"
#include "mm_camcorder_stillshot.h"
#include "mm_camcorder_exifinfo.h"
}
-int _mmcamcorder_connect_extra_preview_stream(MMHandleType handle)
+int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle)
{
+ int i = 0;
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
_MMCamcorderSubContext *sc = NULL;
+ GstCameraControl *control = NULL;
+ _MMCamcorderExtraPreviewStreamFormat *e_fmt = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
G_CALLBACK(__mmcamcorder_extra_preview_stream_cb),
hcamcorder);
+ control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+ if (!control) {
+ MMCAM_LOG_ERROR("no camera control");
+ return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+ }
+
+ for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) {
+ e_fmt = &hcamcorder->extra_preview_format[i];
+
+ if (!e_fmt->is_set)
+ continue;
+
+ if (!gst_camera_control_set_extra_preview_stream_format(control,
+ i, _mmcamcorder_get_pixel_format2(e_fmt->pixel_format),
+ e_fmt->width, e_fmt->height, e_fmt->fps))
+ MMCAM_LOG_WARNING("set failed[%d],[%d,%dx%d,%d]",
+ i, e_fmt->pixel_format, e_fmt->width, e_fmt->height, e_fmt->fps);
+ }
+
return MM_ERROR_NONE;
}
return;
}
+
+
+int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps)
+{
+ mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder;
+ MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE;
+ GstCameraControl *control = NULL;
+ _MMCamcorderSubContext *sc = NULL;
+
+ mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+ mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+ mmf_return_val_if_fail(pixel_format > MM_PIXEL_FORMAT_INVALID && pixel_format < MM_PIXEL_FORMAT_NUM,
+ MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+ mmf_return_val_if_fail(width > 0 && height > 0 && fps >= 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
+ mm_camcorder_get_state(camcorder, ¤t_state);
+
+ MMCAM_LOG_INFO("state[%d] stream_id[%d],fmt[%d],res[%dx%d],fps[%d]",
+ current_state, stream_id, pixel_format, width, height, fps);
+
+ if (current_state >= MM_CAMCORDER_STATE_READY) {
+ sc = MMF_CAMCORDER_SUBCONTEXT(camcorder);
+ mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
+ control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+ if (!gst_camera_control_set_extra_preview_stream_format(control,
+ stream_id, _mmcamcorder_get_camera_control_image_format(pixel_format), width, height, fps)) {
+ MMCAM_LOG_ERROR("camera control failed");
+ return MM_ERROR_CAMCORDER_INTERNAL;
+ }
+ } else {
+ MMCAM_LOG_INFO("It will be set when start preview");
+ }
+
+ hcamcorder->extra_preview_format[stream_id].pixel_format = pixel_format;
+ hcamcorder->extra_preview_format[stream_id].width = width;
+ hcamcorder->extra_preview_format[stream_id].height = height;
+ hcamcorder->extra_preview_format[stream_id].fps = fps;
+ hcamcorder->extra_preview_format[stream_id].is_set = TRUE;
+
+ return MM_ERROR_NONE;
+}
+
+
+int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps)
+{
+ int _width = 0;
+ int _height = 0;
+ int _fps = 0;
+ GstCameraControlImageFormat _img_fmt = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12;
+ GstCameraControl *control = NULL;
+ mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder;
+ MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE;
+ _MMCamcorderSubContext *sc = NULL;
+
+ mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+ mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ mmf_return_val_if_fail(pixel_format && width && height && fps, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
+ mm_camcorder_get_state(camcorder, ¤t_state);
+
+ if (current_state >= MM_CAMCORDER_STATE_READY) {
+ sc = MMF_CAMCORDER_SUBCONTEXT(camcorder);
+ mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
+ control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+ if (!gst_camera_control_get_extra_preview_stream_format(control,
+ stream_id, &_img_fmt, &_width, &_height, &_fps)) {
+ MMCAM_LOG_ERROR("extra preview stream format get failed");
+ return MM_ERROR_CAMCORDER_INTERNAL;
+ }
+
+ *pixel_format = _mmcamcorder_get_pixel_format2(_img_fmt);
+ *width = _width;
+ *height = _height;
+ *fps = _fps;
+ } else {
+ *pixel_format = hcamcorder->extra_preview_format[stream_id].pixel_format;
+ *width = hcamcorder->extra_preview_format[stream_id].width;
+ *height = hcamcorder->extra_preview_format[stream_id].height;
+ *fps = hcamcorder->extra_preview_format[stream_id].fps;
+ }
+
+ MMCAM_LOG_INFO("get result[fmt:%d(%d),res:%dx%d,fps:%d][state:%d]",
+ *pixel_format, _img_fmt, *width, *height, *fps, current_state);
+
+ return MM_ERROR_NONE;
+}
}
+MMPixelFormatType _mmcamcorder_get_pixel_format2(GstCameraControlImageFormat img_fmt)
+{
+ const MMPixelFormatType pixel_format_table[] = {
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12] = MM_PIXEL_FORMAT_NV12,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_NV21] = MM_PIXEL_FORMAT_NV21,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_I420] = MM_PIXEL_FORMAT_I420,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_YV12] = MM_PIXEL_FORMAT_YV12,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_YUYV] = MM_PIXEL_FORMAT_YUYV,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_UYVY] = MM_PIXEL_FORMAT_UYVY,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_BGRA] = MM_PIXEL_FORMAT_RGBA,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_ARGB] = MM_PIXEL_FORMAT_ARGB,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_JPEG] = MM_PIXEL_FORMAT_ENCODED,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_H264] = MM_PIXEL_FORMAT_ENCODED_H264,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_MJPEG] = MM_PIXEL_FORMAT_ENCODED_MJPEG,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_VP8] = MM_PIXEL_FORMAT_ENCODED_VP8,
+ [GST_CAMERA_CONTROL_IMAGE_FORMAT_VP9] = MM_PIXEL_FORMAT_ENCODED_VP9,
+ };
+
+ if (img_fmt < GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12 || img_fmt > GST_CAMERA_CONTROL_IMAGE_FORMAT_VP9) {
+ MMCAM_LOG_ERROR("invalid format[%d], return default[NV12]", img_fmt);
+ return MM_PIXEL_FORMAT_NV12;
+ }
+
+ return pixel_format_table[img_fmt];
+}
+
+
+GstCameraControlImageFormat _mmcamcorder_get_camera_control_image_format(int pixel_format)
+{
+ const GstCameraControlImageFormat img_fmt_table[] = {
+ [MM_PIXEL_FORMAT_NV12] = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12,
+ [MM_PIXEL_FORMAT_NV21] = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV21,
+ [MM_PIXEL_FORMAT_I420] = GST_CAMERA_CONTROL_IMAGE_FORMAT_I420,
+ [MM_PIXEL_FORMAT_YV12] = GST_CAMERA_CONTROL_IMAGE_FORMAT_YV12,
+ [MM_PIXEL_FORMAT_YUYV] = GST_CAMERA_CONTROL_IMAGE_FORMAT_YUYV,
+ [MM_PIXEL_FORMAT_UYVY] = GST_CAMERA_CONTROL_IMAGE_FORMAT_UYVY,
+ [MM_PIXEL_FORMAT_RGBA] = GST_CAMERA_CONTROL_IMAGE_FORMAT_BGRA,
+ [MM_PIXEL_FORMAT_ARGB] = GST_CAMERA_CONTROL_IMAGE_FORMAT_ARGB,
+ [MM_PIXEL_FORMAT_ENCODED] = GST_CAMERA_CONTROL_IMAGE_FORMAT_JPEG,
+ [MM_PIXEL_FORMAT_ENCODED_H264] = GST_CAMERA_CONTROL_IMAGE_FORMAT_H264,
+ [MM_PIXEL_FORMAT_ENCODED_MJPEG] = GST_CAMERA_CONTROL_IMAGE_FORMAT_MJPEG,
+ [MM_PIXEL_FORMAT_ENCODED_VP8] = GST_CAMERA_CONTROL_IMAGE_FORMAT_VP8,
+ [MM_PIXEL_FORMAT_ENCODED_VP9] = GST_CAMERA_CONTROL_IMAGE_FORMAT_VP9
+ };
+
+ if (pixel_format < MM_PIXEL_FORMAT_NV12 || pixel_format > MM_PIXEL_FORMAT_ENCODED_VP9) {
+ MMCAM_LOG_ERROR("invalid format[%d], return default[NV12]", pixel_format);
+ return GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12;
+ }
+
+ return img_fmt_table[pixel_format];
+}
+
+
unsigned int _mmcamcorder_get_fourcc(int pixtype, int codectype, int use_zero_copy_format)
{
unsigned int fourcc = 0;
| INCLUDE FILES |
=======================================================================================*/
#include <gst/allocators/gsttizenmemory.h>
-#include <gst/video/cameracontrol.h>
#include <gst/app/gstappsrc.h>
#include "mm_camcorder_internal.h"
#include "mm_camcorder_videorec.h"