Update code for new APIs 39/91639/1 accepted/tizen/common/20161012.154136 accepted/tizen/ivi/20161012.065357 accepted/tizen/mobile/20161012.065237 accepted/tizen/tv/20161012.065308 accepted/tizen/wearable/20161012.065330 submit/tizen/20161012.010406
authorHaesu Gwon <haesu.gwon@samsung.com>
Mon, 10 Oct 2016 12:26:48 +0000 (21:26 +0900)
committerHaesu Gwon <haesu.gwon@samsung.com>
Mon, 10 Oct 2016 12:26:48 +0000 (21:26 +0900)
- supported file format by audio/video encoder
- supported audio/video codec by file format

[Version] 0.2.28
[Profile] Common
[Issue Type] Update
[Dependency module] N/A
[Dependency commit] N/A
[Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-mobile_20161010.1]

Change-Id: I8f6475792ff174f48198e124800494c96696cbe7
Signed-off-by: Haesu Gwon <haesu.gwon@samsung.com>
legacy/include/legacy_recorder.h
legacy/src/legacy_recorder.c
muse/include/muse_recorder.h
muse/src/muse_recorder_dispatcher.c
packaging/mmsvc-recorder.spec

index 78363f5..3dcf107 100644 (file)
@@ -700,9 +700,11 @@ int legacy_recorder_set_sound_stream_info(recorder_h recorder, char *stream_type
 /**
  * @brief Retrieves all supported file formats by invoking a specific callback for each supported file format.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
- * @param[in] recorder  The handle to the media recorder
- * @param[in] callback The iteration callback
- * @param[in] user_data        The user data to be passed to the callback function
+ * @param[in] recorder   The handle to the media recorder
+ * @param[in] foreach_cb The iteration callback
+ * @param[in] codec_type The type of codec(Audio or Video)
+ * @param[in] codec      The codec
+ * @param[in] user_data  The user data to be passed to the callback function
  * @return @c 0 on success, otherwise a negative error value
  * @retval #RECORDER_ERROR_NONE Successful
  * @retval #RECORDER_ERROR_INVALID_PARAMETER Invalid parameter
@@ -713,7 +715,9 @@ int legacy_recorder_set_sound_stream_info(recorder_h recorder, char *stream_type
  * @see legacy_recorder_set_file_format()
  * @see legacy_recorder_supported_file_format_cb()
  */
-int legacy_recorder_foreach_supported_file_format(recorder_h recorder, recorder_supported_file_format_cb callback, void *user_data);
+int legacy_recorder_foreach_supported_file_format(recorder_h recorder,
+       recorder_supported_file_format_cb foreach_cb, const char* codec_type, int codec, void *user_data);
+
 
 /**
  * @}
@@ -774,9 +778,11 @@ int legacy_recorder_get_audio_encoder(recorder_h recorder, recorder_audio_codec_
 /**
  * @brief Retrieves all supported audio encoders by invoking a specific callback for each supported audio encoder.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
- * @param[in] recorder  The handle to the media recorder
- * @param[in] callback The iteration callback
- * @param[in] user_data        The user data to be passed to the callback function
+ * @param[in] recorder   The handle to the media recorder
+ * @param[in] foreach_cb The iteration callback
+ * @param[in] codec_type The type of codec(Audio or Video)
+ * @param[in] format     The file format
+ * @param[in] user_data  The user data to be passed to the callback function
  * @return @c 0 on success, otherwise a negative error value
  * @retval #RECORDER_ERROR_NONE Successful
  * @retval #RECORDER_ERROR_INVALID_PARAMETER Invalid parameter
@@ -787,7 +793,8 @@ int legacy_recorder_get_audio_encoder(recorder_h recorder, recorder_audio_codec_
  * @see        recorder_get_audio_encoder()
  * @see        recorder_supported_audio_encoder_cb()
  */
-int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder, recorder_supported_audio_encoder_cb callback, void *user_data);
+int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder,
+       recorder_supported_audio_encoder_cb foreach_cb, const char* codec_type, int format, void *user_data);
 
 /**
  * @}
@@ -916,9 +923,11 @@ int legacy_recorder_get_video_encoder(recorder_h recorder, recorder_video_codec_
 /**
  * @brief Retrieves all supported video encoders by invoking a specific callback for each supported video encoder.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
- * @param[in] recorder The handle to the media recorder
- * @param[in] callback The iteration callback
- * @param[in] user_data        The user data to be passed to the callback function
+ * @param[in] recorder   The handle to the media recorder
+ * @param[in] foreach_cb The iteration callback
+ * @param[in] codec_type The type of codec(Audio or Video)
+ * @param[in] format     The file format
+ * @param[in] user_data  The user data to be passed to the callback function
  * @return @c 0 on success, otherwise a negative error value
  * @retval #RECORDER_ERROR_NONE Successful
  * @retval #RECORDER_ERROR_INVALID_PARAMETER Invalid parameter
@@ -929,7 +938,8 @@ int legacy_recorder_get_video_encoder(recorder_h recorder, recorder_video_codec_
  * @see legacy_recorder_get_video_encoder()
  * @see        recorder_supported_video_encoder_cb()
  */
-int legacy_recorder_foreach_supported_video_encoder(recorder_h recorder, recorder_supported_video_encoder_cb callback, void *user_data);
+int legacy_recorder_foreach_supported_video_encoder(recorder_h recorder,
+       recorder_supported_video_encoder_cb foreach_cb, const char* codec_type, int format, void *user_data);
 
  /**
  * @}
index cf648a9..ecdaf16 100644 (file)
@@ -1305,7 +1305,8 @@ int legacy_recorder_unset_recording_limit_reached_cb(recorder_h recorder)
 }
 
 
-int legacy_recorder_foreach_supported_file_format(recorder_h recorder, recorder_supported_file_format_cb foreach_cb, void *user_data)
+int legacy_recorder_foreach_supported_file_format(recorder_h recorder,
+       recorder_supported_file_format_cb foreach_cb, const char* codec_type, int codec, void *user_data)
 {
        int i = 0;
        int ret = MM_ERROR_NONE;
@@ -1353,7 +1354,10 @@ int legacy_recorder_foreach_supported_file_format(recorder_h recorder, recorder_
                        break;
                }
 
-               if (format != -1 && !foreach_cb(format, user_data))
+               if (codec_type != NULL && format != -1)
+                       ret = mm_camcorder_check_codec_fileformat_compatibility((const char*)codec_type, codec, format);
+
+               if (ret == MM_ERROR_NONE && format != -1 && !foreach_cb(format, user_data))
                        break;
        }
 
@@ -1744,7 +1748,8 @@ int legacy_recorder_attr_get_video_encoder_bitrate(recorder_h recorder, int *bit
 }
 
 
-int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder, recorder_supported_audio_encoder_cb foreach_cb, void *user_data)
+int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder,
+       recorder_supported_audio_encoder_cb foreach_cb, const char* codec_type, int format, void *user_data)
 {
        int i = 0;
        int ret = MM_ERROR_NONE;
@@ -1784,7 +1789,10 @@ int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder, recorde
                        break;
                }
 
-               if (codec != -1 && !foreach_cb(codec, user_data))
+               if (codec_type != NULL && codec != -1)
+                       ret = mm_camcorder_check_codec_fileformat_compatibility((const char*)codec_type, codec, format);
+
+               if (ret == MM_ERROR_NONE && codec != -1 && !foreach_cb(codec, user_data))
                        break;
        }
 
@@ -1792,7 +1800,8 @@ int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder, recorde
 }
 
 
-int legacy_recorder_foreach_supported_video_encoder(recorder_h recorder, recorder_supported_video_encoder_cb foreach_cb, void *user_data)
+int legacy_recorder_foreach_supported_video_encoder(recorder_h recorder,
+       recorder_supported_video_encoder_cb foreach_cb, const char* codec_type, int format, void *user_data)
 {
        int i = 0;
        int ret = MM_ERROR_NONE;
@@ -1836,7 +1845,10 @@ int legacy_recorder_foreach_supported_video_encoder(recorder_h recorder, recorde
                        break;
                }
 
-               if (codec != -1 && !foreach_cb(codec, user_data))
+               if (codec_type != NULL && codec != -1)
+                       ret = mm_camcorder_check_codec_fileformat_compatibility((const char*)codec_type, codec, format);
+
+               if (ret == MM_ERROR_NONE && codec != -1 && !foreach_cb(codec, user_data))
                        break;
        }
 
index 5839ef8..0787a6e 100644 (file)
@@ -64,33 +64,37 @@ typedef enum {
        MUSE_RECORDER_API_SET_RECORDING_LIMIT_REACHED_CB,
        MUSE_RECORDER_API_UNSET_RECORDING_LIMIT_REACHED_CB,
        MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT,
-       MUSE_RECORDER_API_ATTR_SET_SIZE_LIMIT, /* 30 */
+       MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT_BY_AUDIO_ENCORDER, /* 30 */
+       MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT_BY_VIDEO_ENCORDER,
+       MUSE_RECORDER_API_ATTR_SET_SIZE_LIMIT,
        MUSE_RECORDER_API_ATTR_SET_TIME_LIMIT,
        MUSE_RECORDER_API_ATTR_SET_AUDIO_DEVICE,
-       MUSE_RECORDER_API_SET_AUDIO_ENCODER,
+       MUSE_RECORDER_API_SET_AUDIO_ENCODER, /* 35 */
        MUSE_RECORDER_API_GET_AUDIO_ENCODER,
-       MUSE_RECORDER_API_SET_VIDEO_ENCODER, /* 35 */
+       MUSE_RECORDER_API_SET_VIDEO_ENCODER,
        MUSE_RECORDER_API_GET_VIDEO_ENCODER,
        MUSE_RECORDER_API_ATTR_SET_AUDIO_SAMPLERATE,
-       MUSE_RECORDER_API_ATTR_SET_AUDIO_ENCODER_BITRATE,
+       MUSE_RECORDER_API_ATTR_SET_AUDIO_ENCODER_BITRATE, /* 40 */
        MUSE_RECORDER_API_ATTR_SET_VIDEO_ENCODER_BITRATE,
-       MUSE_RECORDER_API_ATTR_GET_SIZE_LIMIT, /* 40 */
+       MUSE_RECORDER_API_ATTR_GET_SIZE_LIMIT,
        MUSE_RECORDER_API_ATTR_GET_TIME_LIMIT,
        MUSE_RECORDER_API_ATTR_GET_AUDIO_DEVICE,
-       MUSE_RECORDER_API_ATTR_GET_AUDIO_SAMPLERATE,
+       MUSE_RECORDER_API_ATTR_GET_AUDIO_SAMPLERATE, /* 45 */
        MUSE_RECORDER_API_ATTR_GET_AUDIO_ENCODER_BITRATE,
-       MUSE_RECORDER_API_ATTR_GET_VIDEO_ENCODER_BITRATE, /* 45 */
+       MUSE_RECORDER_API_ATTR_GET_VIDEO_ENCODER_BITRATE,
        MUSE_RECORDER_API_FOREACH_SUPPORTED_AUDIO_ENCODER,
-       MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER,
+       MUSE_RECORDER_API_FOREACH_SUPPORTED_AUDIO_ENCODER_BY_FILE_FORMAT,
+       MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER, /* 50 */
+       MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER_BY_FILE_FORMAT,
        MUSE_RECORDER_API_ATTR_SET_MUTE,
        MUSE_RECORDER_API_ATTR_IS_MUTED,
-       MUSE_RECORDER_API_ATTR_SET_RECORDING_MOTION_RATE, /* 50 */
-       MUSE_RECORDER_API_ATTR_GET_RECORDING_MOTION_RATE,
+       MUSE_RECORDER_API_ATTR_SET_RECORDING_MOTION_RATE,
+       MUSE_RECORDER_API_ATTR_GET_RECORDING_MOTION_RATE, /* 55 */
        MUSE_RECORDER_API_ATTR_SET_AUDIO_CHANNEL,
        MUSE_RECORDER_API_ATTR_GET_AUDIO_CHANNEL,
        MUSE_RECORDER_API_ATTR_SET_ORIENTATION_TAG,
-       MUSE_RECORDER_API_ATTR_GET_ORIENTATION_TAG, /* 55 */
-       MUSE_RECORDER_API_ATTR_SET_ROOT_DIRECTORY,
+       MUSE_RECORDER_API_ATTR_GET_ORIENTATION_TAG,
+       MUSE_RECORDER_API_ATTR_SET_ROOT_DIRECTORY, /* 60 */
        MUSE_RECORDER_API_RETURN_BUFFER,
        MUSE_RECORDER_API_SET_SOUND_STREAM_INFO,
        MUSE_RECORDER_API_GET_DEVICE_STATE,
index 8c1fc56..8ab3966 100644 (file)
@@ -1234,6 +1234,66 @@ int recorder_dispatcher_foreach_supported_file_format(muse_module_h module)
 
        ret = legacy_recorder_foreach_supported_file_format(muse_recorder->recorder_handle,
                (recorder_supported_file_format_cb)_recorder_disp_foreach_supported_file_format_cb,
+               NULL,
+               0,
+               (void *)module);
+
+       muse_recorder_msg_return(api, class, ret, module);
+
+       return MUSE_RECORDER_ERROR_NONE;
+}
+
+int recorder_dispatcher_foreach_supported_file_format_by_audio_encoder(muse_module_h module)
+{
+       int ret = RECORDER_ERROR_NONE;
+       int audio_codec = RECORDER_AUDIO_CODEC_DISABLE;
+       muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT_BY_AUDIO_ENCORDER;
+       muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_THREAD_SUB;
+       muse_recorder_handle_s *muse_recorder = NULL;
+
+       muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
+       if (muse_recorder == NULL) {
+               LOGE("NULL handle");
+               ret = RECORDER_ERROR_INVALID_OPERATION;
+               muse_recorder_msg_return(api, class, ret, module);
+               return MUSE_RECORDER_ERROR_NONE;
+       }
+
+       muse_recorder_msg_get(audio_codec, muse_core_client_get_msg(module));
+
+       ret = legacy_recorder_foreach_supported_file_format(muse_recorder->recorder_handle,
+               (recorder_supported_file_format_cb)_recorder_disp_foreach_supported_file_format_cb,
+               MMCAM_AUDIO_ENCODER,
+               audio_codec,
+               (void *)module);
+
+       muse_recorder_msg_return(api, class, ret, module);
+
+       return MUSE_RECORDER_ERROR_NONE;
+}
+
+int recorder_dispatcher_foreach_supported_file_format_by_video_encoder(muse_module_h module)
+{
+       int ret = RECORDER_ERROR_NONE;
+       int video_codec = -1;
+       muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT_BY_VIDEO_ENCORDER;
+       muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_THREAD_SUB;
+       muse_recorder_handle_s *muse_recorder = NULL;
+
+       muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
+       if (muse_recorder == NULL) {
+               LOGE("NULL handle");
+               ret = RECORDER_ERROR_INVALID_OPERATION;
+               muse_recorder_msg_return(api, class, ret, module);
+               return MUSE_RECORDER_ERROR_NONE;
+       }
+
+       muse_recorder_msg_get(video_codec, muse_core_client_get_msg(module));
+
+       ret = legacy_recorder_foreach_supported_file_format(muse_recorder->recorder_handle,
+               (recorder_supported_file_format_cb)_recorder_disp_foreach_supported_file_format_cb,
+               MMCAM_VIDEO_ENCODER,
+               video_codec,
                (void *)module);
 
        muse_recorder_msg_return(api, class, ret, module);
@@ -1642,6 +1702,37 @@ int recorder_dispatcher_foreach_supported_audio_encoder(muse_module_h module)
 
        ret = legacy_recorder_foreach_supported_audio_encoder(muse_recorder->recorder_handle,
                (recorder_supported_audio_encoder_cb)_recorder_disp_foreach_supported_audio_encoder_cb,
+               NULL,
+               0,
+               (void *)module);
+
+       muse_recorder_msg_return(api, class, ret, module);
+
+       return MUSE_RECORDER_ERROR_NONE;
+}
+
+int recorder_dispatcher_foreach_supported_audio_encoder_by_file_format(muse_module_h module)
+{
+       int ret = RECORDER_ERROR_NONE;
+       int file_format = -1;
+       muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_AUDIO_ENCODER_BY_FILE_FORMAT;
+       muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_THREAD_SUB;
+       muse_recorder_handle_s *muse_recorder = NULL;
+
+       muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
+       if (muse_recorder == NULL) {
+               LOGE("NULL handle");
+               ret = RECORDER_ERROR_INVALID_OPERATION;
+               muse_recorder_msg_return(api, class, ret, module);
+               return MUSE_RECORDER_ERROR_NONE;
+       }
+
+       muse_recorder_msg_get(file_format, muse_core_client_get_msg(module));
+
+       ret = legacy_recorder_foreach_supported_audio_encoder(muse_recorder->recorder_handle,
+               (recorder_supported_audio_encoder_cb)_recorder_disp_foreach_supported_audio_encoder_cb,
+               MMCAM_AUDIO_ENCODER,
+               file_format,
                (void *)module);
 
        muse_recorder_msg_return(api, class, ret, module);
@@ -1653,7 +1744,7 @@ int recorder_dispatcher_foreach_supported_video_encoder(muse_module_h module)
 {
        int ret = RECORDER_ERROR_NONE;
        muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER;
-               muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_THREAD_SUB;
+       muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_THREAD_SUB;
        muse_recorder_handle_s *muse_recorder = NULL;
 
        muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
@@ -1666,6 +1757,37 @@ int recorder_dispatcher_foreach_supported_video_encoder(muse_module_h module)
 
        ret = legacy_recorder_foreach_supported_video_encoder(muse_recorder->recorder_handle,
                (recorder_supported_video_encoder_cb)_recorder_disp_foreach_supported_video_encoder_cb,
+               NULL,
+               0,
+               (void *)module);
+
+       muse_recorder_msg_return(api, class, ret, module);
+
+       return MUSE_RECORDER_ERROR_NONE;
+}
+
+int recorder_dispatcher_foreach_supported_video_encoder_by_file_format(muse_module_h module)
+{
+       int ret = RECORDER_ERROR_NONE;
+       int file_format = -1;
+       muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER_BY_FILE_FORMAT;
+       muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_THREAD_SUB;
+       muse_recorder_handle_s *muse_recorder = NULL;
+
+       muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
+       if (muse_recorder == NULL) {
+               LOGE("NULL handle");
+               ret = RECORDER_ERROR_INVALID_OPERATION;
+               muse_recorder_msg_return(api, class, ret, module);
+               return MUSE_RECORDER_ERROR_NONE;
+       }
+
+       muse_recorder_msg_get(file_format, muse_core_client_get_msg(module));
+
+       ret = legacy_recorder_foreach_supported_video_encoder(muse_recorder->recorder_handle,
+               (recorder_supported_video_encoder_cb)_recorder_disp_foreach_supported_video_encoder_cb,
+               MMCAM_VIDEO_ENCODER,
+               file_format,
                (void *)module);
 
        muse_recorder_msg_return(api, class, ret, module);
@@ -2026,6 +2148,8 @@ int (*dispatcher[MUSE_RECORDER_API_MAX]) (muse_module_h module) = {
        recorder_dispatcher_set_recording_limit_reached_cb, /* MUSE_RECORDER_API_SET_RECORDING_LIMIT_RECHEAD_CB */
        recorder_dispatcher_unset_recording_limit_reached_cb, /* MUSE_RECORDER_API_UNSET_RECORDING_LIMIT_RECHEAD_CB */
        recorder_dispatcher_foreach_supported_file_format, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT */
+       recorder_dispatcher_foreach_supported_file_format_by_audio_encoder, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT_BY_AUDIO_ENCORDER */
+       recorder_dispatcher_foreach_supported_file_format_by_video_encoder, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT_BY_VIDEO_ENCORDER */
        recorder_dispatcher_attr_set_size_limit, /* MUSE_RECORDER_API_ATTR_SET_SIZE_LIMIT */
        recorder_dispatcher_attr_set_time_limit, /* MUSE_RECORDER_API_ATTR_SET_TIME_LIMIT */
        recorder_dispatcher_attr_set_audio_device, /* MUSE_RECORDER_API_ATTR_SET_AUDIO_DEVICE */
@@ -2043,7 +2167,9 @@ int (*dispatcher[MUSE_RECORDER_API_MAX]) (muse_module_h module) = {
        recorder_dispatcher_attr_get_audio_encoder_bitrate, /* MUSE_RECORDER_API_ATTR_GET_AUDIO_ENCODER_BITRATE */
        recorder_dispatcher_attr_get_video_encoder_bitrate, /* MUSE_RECORDER_API_ATTR_GET_VIDEO_ENCODER_BITRATE */
        recorder_dispatcher_foreach_supported_audio_encoder, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_AUDIO_ENCODER */
+       recorder_dispatcher_foreach_supported_audio_encoder_by_file_format, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_AUDIO_ENCODER_BY_FILE_FORMAT */
        recorder_dispatcher_foreach_supported_video_encoder, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER */
+       recorder_dispatcher_foreach_supported_video_encoder_by_file_format, /* MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER_BY_FILE_FORMAT */
        recorder_dispatcher_attr_set_mute, /* MUSE_RECORDER_API_ATTR_SET_MUTE */
        recorder_dispatcher_attr_is_muted, /* MUSE_RECORDER_API_ATTR_IS_MUTED */
        recorder_dispatcher_attr_set_recording_motion_rate, /* MUSE_RECORDER_API_ATTR_SET_RECORDING_MOTION_RATE */
index df4887a..9e3a45c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-recorder
 Summary:    A Recorder module for muse server
-Version:    0.2.27
+Version:    0.2.28
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0