Add Recording modes 35/218535/28 accepted/tizen/unified/20200113.222502 submit/tizen/20200107.015415 submit/tizen/20200108.071757 submit/tizen/20200113.060950 submit/tizen/20200121.084540 submit/trunk/20200107.014436
authorHyunsoo Park <hance.park@samsung.com>
Mon, 25 Nov 2019 07:02:19 +0000 (16:02 +0900)
committerHyunsoo Park <hance.park@samsung.com>
Mon, 6 Jan 2020 07:11:38 +0000 (16:11 +0900)
Adds APIs for setting modes. It serves to select mode for recording what user want.
Mode means how to stream recorder works.

[apis]
streamrecorder_set_mode(streamrecorder_h recorder, streamrecorder_mode_e mode);
streamrecorder_get_mode(streamrecorder_h recorder, streamrecorder_mode_e* mode);

[modes]
Add stream recording modes.
- STREAMRECORDER_MODE_STREAM_BUFFER
- STREAMRECORDER_MODE_DEVICE_LOOPBACK

*STREAMRECORDER_MODE_STREAM_BUFFER
: Uses Stream Recorder same as current.

*STREAMRECORDER_MODE_DEVICE_LOOPBACK
: For using it only device's own screen (display) and audio, please use this mode.

Change-Id: Ibbe4356589769659e5091c1b57945ead837a5d22
Signed-off-by: Hyunsoo Park <hance.park@samsung.com>
include/streamrecorder.h
include/streamrecorder_private.h
packaging/capi-media-streamrecorder.spec
src/streamrecorder.c
src/streamrecorder_private.c

index 32e9915..81d90ff 100644 (file)
@@ -48,7 +48,7 @@ typedef struct streamrecorder_s *streamrecorder_h;
 typedef enum {
        STREAMRECORDER_SOURCE_VIDEO,           /**< Video only */
        STREAMRECORDER_SOURCE_AUDIO,           /**< Audio only */
-       STREAMRECORDER_SOURCE_VIDEO_AUDIO,    /**< Video and Audio */
+       STREAMRECORDER_SOURCE_VIDEO_AUDIO,     /**< Video and Audio */
 } streamrecorder_source_e;
 
 /**
@@ -60,7 +60,7 @@ typedef enum {
        STREAMRECORDER_VIDEO_SOURCE_FORMAT_NV12,           /**< NV12 pixel format */
        STREAMRECORDER_VIDEO_SOURCE_FORMAT_NV21,           /**< NV21 pixel format */
        STREAMRECORDER_VIDEO_SOURCE_FORMAT_I420,           /**< I420 pixel format */
-       STREAMRECORDER_VIDEO_SOURCE_FORMAT_NUM             /**< Number of the video source format */
+       STREAMRECORDER_VIDEO_SOURCE_FORMAT_NUM             /**< @deprecated Number of the video source format (Deprecated since 6.0, please don't use it) */
 } streamrecorder_video_source_format_e;
 
 /**
@@ -140,6 +140,15 @@ typedef enum {
 } streamrecorder_state_e;
 
 /**
+ * @brief Enumeration for StreamRecorder recoding modes.
+ * @since_tizen 6.0
+ */
+typedef enum {
+       STREAMRECORDER_MODE_STREAM_BUFFER = 0,    /**< Recording with media buffer */
+       STREAMRECORDER_MODE_DEVICE_LOOPBACK          /**< Recording with device's own screen and audio */
+} streamrecorder_mode_e;
+
+/**
  * @}
  */
 
@@ -862,6 +871,39 @@ int streamrecorder_set_audio_channel(streamrecorder_h recorder, int channel_coun
 int streamrecorder_get_audio_channel(streamrecorder_h recorder, int *channel_count);
 
 /**
+ * @brief Sets the recording mode.
+ * @since_tizen 6.0
+ * @remarks This attribute can be set only in the #STREAMRECORDER_STATE_CREATED state. \n
+ *          To record with media buffer, set the mode to #STREAMRECORDER_MODE_STREAM_BUFFER. \n
+ *          To record with the device's own screen (display) and audio, set the mode to #STREAMRECORDER_MODE_DEVICE_LOOPBACK.
+ * @param[in] recorder       The handle to the streamrecorder
+ * @param[in] mode  The recording mode
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #STREAMRECORDER_ERROR_NONE Successful
+ * @retval #STREAMRECORDER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #STREAMRECORDER_ERROR_INVALID_STATE Invalid state
+ * @pre The streamrecorder state must be #STREAMRECORDER_STATE_CREATED.\n
+ * @see streamrecorder_get_mode()
+ */
+int streamrecorder_set_mode(streamrecorder_h recorder, streamrecorder_mode_e mode);
+
+/**
+ * @brief Gets the recording mode.
+ * @since_tizen 6.0
+ * @remarks #STREAMRECORDER_MODE_STREAM_BUFFER indicates recording with media buffer. \n
+ *          #STREAMRECORDER_MODE_DEVICE_LOOPBACK indicates recording the device's own screen (display) and audio.
+ * @param[in] recorder       The handle to the streamrecorder
+ * @param[out] mode  The recording mode
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #STREAMRECORDER_ERROR_NONE Successful
+ * @retval #STREAMRECORDER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #STREAMRECORDER_ERROR_INVALID_STATE Invalid state
+ * @pre The streamrecorder state must be #STREAMRECORDER_STATE_CREATED.\n
+ * @see streamrecorder_set_mode()
+ */
+int streamrecorder_get_mode(streamrecorder_h recorder, streamrecorder_mode_e *mode);
+
+/**
  * @}
  */
 
index 70923d5..7dabbe0 100644 (file)
@@ -95,6 +95,8 @@ int _streamrecorder_foreach_supported_audio_encoder(streamrecorder_h recorder, s
 int _streamrecorder_foreach_supported_video_encoder(streamrecorder_h recorder, streamrecorder_supported_video_encoder_cb foreach_cb, void *user_data);
 int _streamrecorder_set_audio_channel(streamrecorder_h recorder, int channel_count);
 int _streamrecorder_get_audio_channel(streamrecorder_h recorder, int *channel_count);
+int _streamrecorder_set_mode(streamrecorder_h recorder, streamrecorder_mode_e mode);
+int _streamrecorder_get_mode(streamrecorder_h recorder, streamrecorder_mode_e *mode);
 #ifdef __cplusplus
 }
 #endif
index dae81ac..59ec669 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamrecorder
 Summary:    A Streamrecorder library in Tizen Native API
-Version:    0.0.25
+Version:    0.0.26
 Release:    0
 Group:      Multimedia/Other
 License:    Apache-2.0
index d4d0dc3..fde1b08 100644 (file)
@@ -153,7 +153,7 @@ int streamrecorder_push_stream_buffer(streamrecorder_h recorder, media_packet_h
                        video_buf->height[0] = height;
                        media_packet_get_video_stride_width(packet, 0, &video_buf->stride_width[0]);
                        media_packet_get_video_stride_width(packet, 0, &video_buf->stride_height[0]);
-                       video_buf->size[0] = width*height*3/2;
+                       video_buf->size[0] = width*height*3/2; // 1392640
 
                        for (i = 0; i < MAX_MPACKET_DATA; i++) {
                                if (pkt->packet[i] == NULL) {
@@ -170,9 +170,9 @@ int streamrecorder_push_stream_buffer(streamrecorder_h recorder, media_packet_h
                        }
 
                        ret = mm_streamrecorder_push_stream_buffer(handle->mm_handle, MM_STREAM_TYPE_VIDEO, pts, video_buf, video_buf->size[0]);
-               } else if (mimetype == MEDIA_FORMAT_I420) {
+               } else if (mimetype == MEDIA_FORMAT_I420 || mimetype == MEDIA_FORMAT_BGRA) {
                        void *buf_data = NULL;
-
+                       LOGI("mimetype: [%d]", mimetype);
                        ret = media_packet_get_video_plane_data_ptr(packet, 0, (void **)&buf_data);
                        if (ret != MEDIA_PACKET_ERROR_NONE) {
                                LOGW("buffer size get fail");
@@ -891,16 +891,35 @@ int streamrecorder_set_audio_channel(streamrecorder_h recorder, int channel_coun
 
 int streamrecorder_get_audio_channel(streamrecorder_h recorder, int *channel_count)
 {
+       if (recorder == NULL) {
+               LOGE("NULL pointer handle");
+               return STREAMRECORDER_ERROR_INVALID_PARAMETER;
+       }
+
+       return _streamrecorder_get_audio_channel(recorder, channel_count);
+}
+
+int streamrecorder_set_mode(streamrecorder_h recorder, streamrecorder_mode_e mode)
+{
+       if (recorder == NULL) {
+               LOGE("NULL pointer handle");
+               return STREAMRECORDER_ERROR_INVALID_PARAMETER;
+       }
+
+       return _streamrecorder_set_mode(recorder, mode);
+}
+
+int streamrecorder_get_mode(streamrecorder_h recorder, streamrecorder_mode_e *mode)
+{
        int ret = STREAMRECORDER_ERROR_NONE;
 
        if (recorder == NULL) {
                LOGE("NULL pointer handle");
                return STREAMRECORDER_ERROR_INVALID_PARAMETER;
        }
+       ret = _streamrecorder_get_mode(recorder, mode);
 
-       ret = _streamrecorder_get_audio_channel(recorder, channel_count);
        return ret;
-
 }
 
 static int __mm_streamrecorder_msg_cb(int message, void *param, void *user_data)
index dcbb017..aeac501 100644 (file)
 #include <fcntl.h>
 
 
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "TIZEN_N_STREAMRECORDER"
+
 
 int __convert_streamrecorder_error_code(const char *func, int code)
 {
@@ -164,11 +169,11 @@ int _streamrecorder_set_videosource_buffer(streamrecorder_h recorder)
        streamrecorder_s *handle = (streamrecorder_s *)recorder;
 
        mm_streamrecorder_set_attributes(handle->mm_handle, NULL,
-                                                               MMSTR_RECORDER_MODE, MM_STREAMRECORDER_MODE_MEDIABUFFER,
+                                                               MMSTR_RECORDER_MODE, MM_STREAMRECORDER_MODE_STREAM_BUFFER,
                                                                NULL);
 
        mm_streamrecorder_set_attributes(handle->mm_handle, NULL,
-                                                               MMSTR_VIDEO_ENABLE, true,
+                                                               MMSTR_VIDEO_ENABLE, TRUE,
                                                                NULL);
 
 
@@ -182,11 +187,11 @@ int _streamrecorder_set_audiosource_buffer(streamrecorder_h recorder)
        streamrecorder_s *handle;
        handle = (streamrecorder_s *) recorder;
        mm_streamrecorder_set_attributes(handle->mm_handle, NULL,
-                                                                       MMSTR_RECORDER_MODE, MM_STREAMRECORDER_MODE_MEDIABUFFER,
+                                                                       MMSTR_RECORDER_MODE, MM_STREAMRECORDER_MODE_STREAM_BUFFER,
                                                                        NULL);
 
        mm_streamrecorder_set_attributes(handle->mm_handle, NULL,
-                                                               MMSTR_AUDIO_ENABLE, true,
+                                                               MMSTR_AUDIO_ENABLE, TRUE,
                                                                NULL);
 
        return ret;
@@ -994,3 +999,49 @@ int _streamrecorder_get_audio_channel(streamrecorder_h recorder, int *channel_co
        return  __convert_streamrecorder_error_code(__func__, ret);
 }
 
+
+int _streamrecorder_set_mode(streamrecorder_h recorder , streamrecorder_mode_e mode)
+{
+       int ret = MM_ERROR_NONE;
+       streamrecorder_s *handle = (streamrecorder_s *)recorder;
+
+       if (mode > STREAMRECORDER_MODE_DEVICE_LOOPBACK) {
+               LOGE("invalid mode %d", mode);
+               return STREAMRECORDER_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_streamrecorder_set_attributes(handle->mm_handle, NULL,
+                                                               MMSTR_RECORDER_MODE, mode,
+                                                               NULL);
+       return __convert_streamrecorder_error_code(__func__, ret);
+}
+
+int _streamrecorder_get_mode(streamrecorder_h recorder, streamrecorder_mode_e *mode)
+{
+       int ret = MM_ERROR_NONE;
+       int mm_mode = 0;
+       streamrecorder_s *handle = (streamrecorder_s *)recorder;
+
+       if (mode == NULL) {
+               LOGE("mode is NULL");
+               return STREAMRECORDER_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_streamrecorder_get_attributes(handle->mm_handle, NULL,
+                                                               MMSTR_RECORDER_MODE, &mm_mode,
+                                                               NULL);
+       if (ret == MM_ERROR_NONE) {
+               switch (mm_mode) {
+               case MM_STREAMRECORDER_MODE_STREAM_BUFFER:
+                       *mode = STREAMRECORDER_MODE_STREAM_BUFFER;
+                       break;
+               case MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK:
+                       *mode = STREAMRECORDER_MODE_DEVICE_LOOPBACK;
+                       break;
+               default:
+                       ret = MM_ERROR_STREAMRECORDER_INTERNAL;
+                       break;
+               }
+       }
+       return __convert_streamrecorder_error_code(__func__, ret);
+}
\ No newline at end of file