Change mm_attr structure
[platform/core/multimedia/libmm-streamrecorder.git] / src / mm_streamrecorder_attribute.c
index 40d7c91..6db79d1 100644 (file)
@@ -43,228 +43,228 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = {
        /* 0 */
        {
         MM_STR_VIDEO_BUFFER_TYPE,      /* ID */
-        "videobuffer-type",            /* Name */
+        (char *)"videobuffer-type",            /* Name */
         MMF_VALUE_TYPE_INT,            /* Type */
         MM_ATTRS_FLAG_RW,                      /* Flag */
         {(void *)MM_STREAMRECORDER_VIDEO_TYPE_TBM_BO}, /* Default value */
         MM_ATTRS_VALID_TYPE_INT_RANGE, /* Validity type */
-        MM_STREAMRECORDER_VIDEO_TYPE_TBM_BO,   /* Validity val1 (min, *array,...) */
-        MM_STREAMRECORDER_VIDEO_TYPE_NORMAL_BUFFER,    /* Validity val2 (max, count, ...) */
+        {.int_min = MM_STREAMRECORDER_VIDEO_TYPE_TBM_BO},      /* Validity val1 (min, *array,...) */
+        {.int_max = MM_STREAMRECORDER_VIDEO_TYPE_NORMAL_BUFFER},       /* Validity val2 (max, count, ...) */
         NULL,                                          /* Runtime setting function of the attribute */
         },
        /* 1  */
        {MM_STR_VIDEO_FORMAT,
-        "videosource-format",
+        (char *)"videosource-format",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)MM_STREAMRECORDER_INPUT_FORMAT_NV12},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        MM_STREAMRECORDER_INPUT_FORMAT_INVALID,
-        MM_STREAMRECORDER_INPUT_FORMAT_NUM,
+        {.int_min = MM_STREAMRECORDER_INPUT_FORMAT_INVALID},
+        {.int_max = MM_STREAMRECORDER_INPUT_FORMAT_NUM},
         NULL,
         },
        /* 2  */
        {
         MM_STR_VIDEO_FRAMERATE,
-        "video-framerate",
+        (char *)"video-framerate",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         NULL,
         },
        /* 3  */
        {
         MM_STR_VIDEO_ENCODER_BITRATE,
-        "video-bitrate",
+        (char *)"video-bitrate",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         NULL,    /*_mmstreamrecorder_commit_video_bitrate, */
         },
        /* 4  */
        {
         MM_STR_VIDEO_RESOLUTION_WIDTH,
-        "video-resolution-width",
+        (char *)"video-resolution-width",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_ARRAY,
-        0,
-        0,
+        {.int_array = NULL},
+        {.count = 0},
         NULL,
         },
        /* 5  */
        {
         MM_STR_VIDEO_RESOLUTION_HEIGHT,
-        "video-resolution-height",
+        (char *)"video-resolution-height",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_ARRAY,
-        0,
-        0,
+        {.int_array = NULL},
+        {.count = 0},
         NULL,
         },
        /* 6  */
        {
         MM_STR_AUDIO_FORMAT,
-        "audio-source-format",
+        (char *)"audio-source-format",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)MM_STREAMRECORDER_AUDIO_FORMAT_PCM_S16_LE},
-        MMF_VALUE_TYPE_INT,
-        MM_STREAMRECORDER_AUDIO_FORMAT_PCM_U8,
-        MM_STREAMRECORDER_AUDIO_FORMAT_PCM_S16_LE,
+        MM_ATTRS_VALID_TYPE_INT_RANGE,
+        {.int_min = MM_STREAMRECORDER_AUDIO_FORMAT_PCM_U8},
+        {.int_max = MM_STREAMRECORDER_AUDIO_FORMAT_PCM_S16_LE},
         _mmstreamrecorder_commit_audio_bitformat,
         },
        /* 7  */
        {
         MM_STR_AUDIO_ENCODER_BITRATE,
-        "audio-bitrate",
+        (char *)"audio-bitrate",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)128000},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         _mmstreamrecorder_commit_audio_bitrate,
         },
        /* 8  */
        {
         MM_STR_AUDIO_SAMPLERATE,
-        "audio-samplerate",
+        (char *)"audio-samplerate",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         _mmstreamrecorder_commit_audio_samplingrate,
         },
        /* 9  */
        {
         MM_STR_VIDEO_ENCODER,
-        "video-encoder",
+        (char *)"video-encoder",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_ARRAY,
-        0,
-        0,
+        {.int_array = NULL},
+        {.count = 0},
         _mmstreamrecorder_commit_video_encoder,
         },
        /* 10  */
        {
         MM_STR_AUDIO_ENCODER,
-        "audio-encoder",
+        (char *)"audio-encoder",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_ARRAY,
-        0,
-        0,
+        {.int_array = NULL},
+        {.count = 0},
         _mmstreamrecorder_commit_audio_encoder,
         },
        /* 11  */
        {
         MM_STR_AUDIO_CHENNEL_COUNT,
-        "audio-channel-count",
+        (char *)"audio-channel-count",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)2},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         _mmstreamrecorder_commit_audio_channel,
         },
        /* 12  */
        {
         MM_STR_FILE_FORMAT,
-        "file-format",
+        (char *)"file-format",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_ARRAY,
-        0,
-        0,
+        {.int_array = NULL},
+        {.count = 0},
         NULL,
         },
        /* 13  */
        {
         MM_STR_TARGET_FILE_NAME,
-        "filename",
+        (char *)"filename",
         MMF_VALUE_TYPE_STRING,
         MM_ATTRS_FLAG_RW,
         {NULL},
         MM_ATTRS_VALID_TYPE_NONE,
-        0,
-        0,
+        {0},
+        {0},
         NULL,
         },
        /* 14  */
        {
         MM_STR_VIDEO_ENABLE,
-        "video-enable",
+        (char *)"video-enable",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)FALSE},
         MM_ATTRS_VALID_TYPE_NONE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {0},
+        {_MMSTREAMRECORDER_MAX_INT},
         _mmstreamrecorder_commit_video_enable,
         },
        /* 15  */
        {
         MM_STR_AUDIO_ENABLE,
-        "audio-enable",
+        (char *)"audio-enable",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)FALSE},
         MM_ATTRS_VALID_TYPE_NONE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {0},
+        {_MMSTREAMRECORDER_MAX_INT},
         _mmstreamrecorder_commit_audio_enable,
         },
        /* 16 */
        {
         MM_STR_MODE,
-        "recorder-mode",
+        (char *)"recorder-mode",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)MM_STREAMRECORDER_MODE_MEDIABUFFER},
         MM_ATTRS_VALID_TYPE_NONE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {0},
+        {_MMSTREAMRECORDER_MAX_INT},
         NULL,
         },
        /*17*/
        {
         MM_STR_TARGET_MAX_SIZE,
-        "target-max-size",
+        (char *)"target-max-size",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         NULL,
        },
        /*18*/
        {
         MM_STR_TARGET_TIME_LIMIT,
-        "target-time-limit",
+        (char *)"target-time-limit",
         MMF_VALUE_TYPE_INT,
         MM_ATTRS_FLAG_RW,
         {(void *)0},
         MM_ATTRS_VALID_TYPE_INT_RANGE,
-        0,
-        _MMSTREAMRECORDER_MAX_INT,
+        {.int_min = 0},
+        {.int_max = _MMSTREAMRECORDER_MAX_INT},
         NULL,
        },
 
@@ -277,6 +277,9 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = {
 /*-----------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                |
 -----------------------------------------------------------------------*/
+int _mmstreamrecorder_get_available_format(MMHandleType handle, int type, int ** format);
+
+
 /* STATIC INTERNAL FUNCTION */
 static int __mmstreamrecorder_set_conf_to_valid_info(MMHandleType handle)
 {
@@ -285,28 +288,28 @@ static int __mmstreamrecorder_set_conf_to_valid_info(MMHandleType handle)
 
        /* Video width */
        total_count = _mmstreamrecorder_get_available_format(handle, KEYWORD_VIDEO_WIDTH, &format);
-       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value1 = (int)format;
-       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value2 = (int)total_count;
+       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value_1.int_array = format;
+       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value_2.count = total_count;
 
        /* Video height */
        total_count = _mmstreamrecorder_get_available_format(handle, KEYWORD_VIDEO_HEIGHT,  &format);
-       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value1 = (int)format;
-       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value2 = (int)total_count;
+       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value_1.int_array = format;
+       stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value_2.count = total_count;
 
        /* Audio encoder */
        total_count = _mmstreamrecorder_get_available_format(handle, KEYWORD_AUDIO_ENCODERS, &format);
-       stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value1 = (int)format;
-       stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value2 = (int)total_count;
+       stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value_1.int_array = format;
+       stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value_2.count = total_count;
 
        /*Video encoder*/
        total_count = _mmstreamrecorder_get_available_format(handle, KEYWORD_VIDEO_ENCODERS, &format);
-       stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value1 = (int)format;
-       stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value2 = (int)total_count;
+       stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value_1.int_array = format;
+       stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value_2.count = total_count;
 
        /* File Format */
        total_count = _mmstreamrecorder_get_available_format(handle, KEYWORD_FILE_FORMATS, &format);
-       stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value1 = (int)format;
-       stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value2 = (int)total_count;
+       stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value_1.int_array = format;
+       stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value_2.count = total_count;
 
        return MM_ERROR_NONE;
 }
@@ -317,39 +320,39 @@ static int __mmstreamrecorder_release_conf_valid_info(MMHandleType handle)
 
        _mmstreamrec_dbg_log("START");
 
-       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value1);
+       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value_1.int_array);
        if (allocated_memory) {
                free(allocated_memory);
-               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value1 = (int)NULL;
-               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value2 = (int)0;
+               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value_1.int_array = NULL;
+               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_WIDTH].validity_value_2.count = 0;
        }
 
-       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value1);
+       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value_1.int_array);
        if (allocated_memory) {
                free(allocated_memory);
-               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value1 = (int)NULL;
-               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value2 = (int)0;
+               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value_1.int_array = NULL;
+               stream_attrs_const_info[MM_STR_VIDEO_RESOLUTION_HEIGHT].validity_value_2.count = 0;
        }
 
-       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value1);
+       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value_1.int_array);
        if (allocated_memory) {
                free(allocated_memory);
-               stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value1 = (int)NULL;
-               stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value2 = (int)0;
+               stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value_1.int_array = NULL;
+               stream_attrs_const_info[MM_STR_AUDIO_ENCODER].validity_value_2.count = 0;
        }
 
-       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value1);
+       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value_1.int_array);
        if (allocated_memory) {
                free(allocated_memory);
-               stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value1 = (int)NULL;
-               stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value2 = (int)0;
+               stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value_1.int_array = NULL;
+               stream_attrs_const_info[MM_STR_VIDEO_ENCODER].validity_value_2.count = 0;
        }
 
-       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value1);
+       allocated_memory = (int *)(stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value_1.int_array);
        if (allocated_memory) {
                free(allocated_memory);
-               stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value1 = (int)NULL;
-               stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value2 = (int)0;
+               stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value_1.int_array = NULL;
+               stream_attrs_const_info[MM_STR_FILE_FORMAT].validity_value_2.count = 0;
        }
        _mmstreamrec_dbg_log("DONE");
 
@@ -692,7 +695,7 @@ _mmstreamrecorder_get_available_format(MMHandleType handle, int type, int ** for
        int count = 0;
        int i = 0;
        int fmt = 0;
-       const char *name = NULL;
+       char *name = NULL;
 
        mmf_return_val_if_fail(hstreamrecorder, 0);
 
@@ -786,18 +789,32 @@ MMHandleType _mmstreamrecorder_alloc_attribute(MMHandleType handle)
 
                switch (stream_attrs_const_info[idx].validity_type) {
                case MM_ATTRS_VALID_TYPE_INT_ARRAY:
-                       if (stream_attrs_const_info[idx].validity_value1 && stream_attrs_const_info[idx].validity_value2 > 0)
-                               mmf_attrs_set_valid_array(attrs, idx, (const int *)(stream_attrs_const_info[idx].validity_value1), stream_attrs_const_info[idx].validity_value2, (int)(stream_attrs_const_info[idx].default_value.value_int));
+                       if (stream_attrs_const_info[idx].validity_value_1.int_array &&
+                                       stream_attrs_const_info[idx].validity_value_2.count > 0)
+                               mmf_attrs_set_valid_array(attrs, idx,
+                                               (const int *)(stream_attrs_const_info[idx].validity_value_1.int_array),
+                                               stream_attrs_const_info[idx].validity_value_2.count,
+                                               stream_attrs_const_info[idx].default_value.value_int);
                        break;
                case MM_ATTRS_VALID_TYPE_INT_RANGE:
-                       mmf_attrs_set_valid_range(attrs, idx, stream_attrs_const_info[idx].validity_value1, stream_attrs_const_info[idx].validity_value2, (int)(stream_attrs_const_info[idx].default_value.value_int));
+                       mmf_attrs_set_valid_range(attrs, idx,
+                                       stream_attrs_const_info[idx].validity_value_1.int_min,
+                                       stream_attrs_const_info[idx].validity_value_2.int_max,
+                                       stream_attrs_const_info[idx].default_value.value_int);
                        break;
                case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
-                       if (stream_attrs_const_info[idx].validity_value1 && stream_attrs_const_info[idx].validity_value2 > 0)
-                               mmf_attrs_set_valid_double_array(attrs, idx, (const double *)(stream_attrs_const_info[idx].validity_value1), stream_attrs_const_info[idx].validity_value2, (double)(stream_attrs_const_info[idx].default_value.value_double));
+                       if (stream_attrs_const_info[idx].validity_value_1.double_array &&
+                                       stream_attrs_const_info[idx].validity_value_2.count > 0)
+                               mmf_attrs_set_valid_double_array(attrs, idx,
+                                               (const double *)(stream_attrs_const_info[idx].validity_value_1.double_array),
+                                               stream_attrs_const_info[idx].validity_value_2.count,
+                                               stream_attrs_const_info[idx].default_value.value_double);
                        break;
                case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
-                       mmf_attrs_set_valid_double_range(attrs, idx, (double)(stream_attrs_const_info[idx].validity_value1), (double)(stream_attrs_const_info[idx].validity_value2), (double)(stream_attrs_const_info[idx].default_value.value_double));
+                       mmf_attrs_set_valid_double_range(attrs, idx,
+                                       stream_attrs_const_info[idx].validity_value_1.double_min,
+                                       stream_attrs_const_info[idx].validity_value_2.double_max,
+                                       stream_attrs_const_info[idx].default_value.value_double);
                        break;
                case MM_ATTRS_VALID_TYPE_NONE:
                        break;
@@ -843,9 +860,13 @@ int _mmstreamrecorder_set_attributes(MMHandleType handle, char **err_attr_name,
 {
        MMHandleType attrs = 0;
        int ret = MM_ERROR_NONE;
+       va_list var_args_copy;
 
        mmf_return_val_if_fail(handle, MM_ERROR_STREAMRECORDER_INVALID_ARGUMENT);
 
+       /* copy var_args to keep original var_args */
+       va_copy(var_args_copy, var_args);
+
        attrs = MMF_STREAMRECORDER_ATTRS(handle);
        if (!attrs) {
                _mmstreamrec_dbg_err("handle 0x%x, attrs is NULL, attr name [%s]", handle, attribute_name);
@@ -856,8 +877,11 @@ int _mmstreamrecorder_set_attributes(MMHandleType handle, char **err_attr_name,
 
        _mmstreamrec_dbg_err("__mmstreamrecorder_check_valid_pair handle 0x%x, attr name [%s] , ret = %d", handle, attribute_name, ret);
 
-       if (ret == MM_ERROR_NONE)
-               ret = mm_attrs_set_valist(attrs, err_attr_name, attribute_name, var_args);
+       if (ret == MM_ERROR_NONE) {
+               /* In 64bit environment, unexpected result is returned if var_args is used again. */
+               ret = mm_attrs_set_valist(attrs, err_attr_name, attribute_name, var_args_copy);
+       }
+       va_end(var_args_copy);
 
        _mmstreamrec_dbg_err("mm_attrs_set_valist handle 0x%x, attr name [%s] , ret = %d", handle, attribute_name, ret);
        return ret;
@@ -1146,8 +1170,3 @@ bool _mmstreamrecorder_commit_audio_channel(MMHandleType handle, int attr_idx, c
 
        return TRUE;
 }
-
-int mm_streamrecorder_get_attribute_info(MMHandleType streamrecorder, const char *attribute_name, MMStreamRecorderAttrsInfo * info)
-{
-       return _mmstreamrecorder_get_attribute_info(streamrecorder, attribute_name, info);
-}