Add new field to frame meta for lux index
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_configure.c
index e01f642..b946112 100644 (file)
 /*-----------------------------------------------------------------------
 |    LOCAL VARIABLE DEFINITIONS                                                |
 -----------------------------------------------------------------------*/
-#define DEFAULT_AUDIO_BUFFER_INTERVAL   50
+#define DEFAULT_AUDIO_BUFFER_INTERVAL       50
+#define DEFAULT_ENCODED_PREVIEW_BITRATE     (1024*1024*4)
 
-#define MMCAMCORDER_CONF_FILEPATH_LENGTH 128
-#define MMCAMCORDER_BUFFER_LINE_MAX      256
+#define MMCAMCORDER_CONF_FILEPATH_LENGTH    128
+#define MMCAMCORDER_BUFFER_LINE_MAX         256
+
+#define BUFFER_NUM_DETAILS                  256
+#define BUFFER_NUM_TOKEN                    64
 
 char *get_new_string(char* src_string)
 {
@@ -54,7 +58,7 @@ char *get_new_string(char* src_string)
 int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure_info)
 {
        int category_num = 0;
-       int info_table_size = sizeof(conf_info_table);
+       size_t info_table_size = sizeof(conf_info_table);
 
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
@@ -191,6 +195,36 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                0,
        };
 
+       /* MJPEG decoder element default value */
+       static type_element _videodecoder_element_mjpeg_default = {
+               "VideodecoderElementMJPEG",
+               "jpegdec",
+               NULL,
+               0,
+               NULL,
+               0,
+       };
+
+       /* VP8 decoder element default value */
+       static type_element _videodecoder_element_vp8_default = {
+               "VideodecoderElementVP8",
+               "vp8dec",
+               NULL,
+               0,
+               NULL,
+               0,
+       };
+
+       /* VP9 decoder element default value */
+       static type_element _videodecoder_element_vp9_default = {
+               "VideodecoderElementVP9",
+               "vp9dec",
+               NULL,
+               0,
+               NULL,
+               0,
+       };
+
        /* Record sink element default value */
        static type_element _recordsink_element_default = {
                "RecordsinkElement",
@@ -623,23 +657,24 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
 
        /* [General] matching table */
        static conf_info_table conf_main_general_table[] = {
-               { "SyncStateChange",            CONFIGURE_VALUE_INT,            {.value_int = 1} },
                { "GSTInitOption",              CONFIGURE_VALUE_STRING_ARRAY,   {NULL} },
-               { "ModelName",                  CONFIGURE_VALUE_STRING,         {NULL} },
-               { "DisabledAttributes",         CONFIGURE_VALUE_STRING_ARRAY,   {NULL} },
                { "PlatformPrivilegeCamera",    CONFIGURE_VALUE_STRING,         {NULL} },
                { "LogLevel",                   CONFIGURE_VALUE_INT,            {.value_int = MM_CAMCORDER_LOG_LEVEL_INFO} },
+               { "NetworkCameraHALName",       CONFIGURE_VALUE_STRING,         {NULL} },
        };
 
        /* [VideoInput] matching table */
        static conf_info_table conf_main_video_input_table[] = {
-               { "VideosrcElement",    CONFIGURE_VALUE_ELEMENT,        {&_videosrc_element_default} },
-               { "UseVideoscale",      CONFIGURE_VALUE_INT,            {.value_int = 0} },
-               { "VideoscaleElement",  CONFIGURE_VALUE_ELEMENT,        {&_videoscale_element_default} },
-               { "UseZeroCopyFormat",  CONFIGURE_VALUE_INT,            {.value_int = 0} },
-               { "DeviceCount",        CONFIGURE_VALUE_INT,            {.value_int = MM_VIDEO_DEVICE_NUM} },
-               { "SupportMediaPacketPreviewCb",  CONFIGURE_VALUE_INT,  {.value_int = 0} },
-               { "SupportUserBuffer",  CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideosrcElement",              CONFIGURE_VALUE_ELEMENT,      {&_videosrc_element_default} },
+               { "UseVideoscale",                CONFIGURE_VALUE_INT,          {.value_int = 0} },
+               { "VideoscaleElement",            CONFIGURE_VALUE_ELEMENT,      {&_videoscale_element_default} },
+               { "UseZeroCopyFormat",            CONFIGURE_VALUE_INT,          {.value_int = 0} },
+               { "DeviceCount",                  CONFIGURE_VALUE_INT,          {.value_int = MM_VIDEO_DEVICE_NUM} },
+               { "SupportMediaPacketPreviewCb",  CONFIGURE_VALUE_INT,          {.value_int = 0} },
+               { "SupportUserBuffer",            CONFIGURE_VALUE_INT,          {.value_int = 0} },
+               { "MeasurePreviewFPS",            CONFIGURE_VALUE_INT,          {.value_int = 0} },
+               { "DefaultEncodedPreviewBitrate", CONFIGURE_VALUE_INT,          {.value_int = DEFAULT_ENCODED_PREVIEW_BITRATE} },
+               { "UpdateCapsByStreamRotation",   CONFIGURE_VALUE_INT,          {.value_int = 0} },
        };
 
        /* [AudioInput] matching table */
@@ -665,13 +700,15 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "UseVideoconvert",         CONFIGURE_VALUE_INT,       {.value_int = 0} },
                { "VideoconvertElement",     CONFIGURE_VALUE_ELEMENT,   {&_videoconvert_element_default} },
                { "VideodecoderElementH264", CONFIGURE_VALUE_ELEMENT,   {&_videodecoder_element_h264_default} },
+               { "VideodecoderElementMJPEG",CONFIGURE_VALUE_ELEMENT,   {&_videodecoder_element_mjpeg_default} },
+               { "VideodecoderElementVP8",  CONFIGURE_VALUE_ELEMENT,   {&_videodecoder_element_vp8_default} },
+               { "VideodecoderElementVP9",  CONFIGURE_VALUE_ELEMENT,   {&_videodecoder_element_vp9_default} },
                { "RecreateDecoder",         CONFIGURE_VALUE_INT,       {.value_int = 0} }
        };
 
        /* [Capture] matching table */
        static conf_info_table conf_main_capture_table[] = {
-               { "UseEncodebin",           CONFIGURE_VALUE_INT,     {.value_int = 0} },
-               { "UseCaptureMode",         CONFIGURE_VALUE_INT,     {.value_int = 0} },
+               { "CaptureMode",            CONFIGURE_VALUE_INT,     {.value_int = MM_CAMCORDER_CAPTURE_MODE_ENCODEBIN} },
                { "VideoscaleElement",      CONFIGURE_VALUE_ELEMENT, {&_videoscale_element_default} },
                { "PlayCaptureSound",       CONFIGURE_VALUE_INT,     {.value_int = 1} },
        };
@@ -783,12 +820,26 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "FPS9",                 CONFIGURE_VALUE_INT_ARRAY,      {NULL} },
                { "PictureFormat",        CONFIGURE_VALUE_INT_ARRAY,      {NULL} },
                { "Overlay",              CONFIGURE_VALUE_INT_RANGE,      {NULL} },
-               { "RecommendDisplayRotation", CONFIGURE_VALUE_INT,     {.value_int = 3} },
-               { "RecommendPreviewFormatCapture", CONFIGURE_VALUE_INT, {.value_int = MM_PIXEL_FORMAT_YUYV} },
-               { "RecommendPreviewFormatRecord",  CONFIGURE_VALUE_INT, {.value_int = MM_PIXEL_FORMAT_NV12} },
+               { "RecommendDisplayRotation", CONFIGURE_VALUE_INT,        {.value_int = 3} },
+               { "RecommendPreviewFormatCapture", CONFIGURE_VALUE_INT,   {.value_int = MM_PIXEL_FORMAT_YUYV} },
+               { "RecommendPreviewFormatRecord",  CONFIGURE_VALUE_INT,   {.value_int = MM_PIXEL_FORMAT_NV12} },
                { "RecommendPreviewResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {NULL} },
-               { "FacingDirection",      CONFIGURE_VALUE_INT, {.value_int = MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR} },
-               { "FrameStabilityCount",  CONFIGURE_VALUE_INT,     {.value_int = 0} },
+               { "FacingDirection",      CONFIGURE_VALUE_INT,            {.value_int = MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR} },
+               { "FrameStabilityCount",  CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "SupportExtraPreview",  CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "ExtraPreviewMode",     CONFIGURE_VALUE_INT,            {.value_int = MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL} },
+               { "AltVideosrcElement",   CONFIGURE_VALUE_ELEMENT,        {NULL} }, /* The alternative of videosrc element, it will be used instead of "VideosrcElement" if exists. */
+               { "AltUseZeroCopyFormat", CONFIGURE_VALUE_INT,            {.value_int = -1} }, /* The alternative of "UseZeroCopyFormat", it will be used if it's not default(-1) value. */
+               { "VideoFilterElement",   CONFIGURE_VALUE_ELEMENT,        {NULL} }, /* The video filter element which is placed between videosrc and videosink elements. */
+               { "VideoFilterCropX",     CONFIGURE_VALUE_INT,            {.value_int = 0} }, /* The VideoFilterElement is existed and these values are valid, they will be set to "crop" property. */
+               { "VideoFilterCropY",     CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideoFilterCropW",     CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideoFilterCropH",     CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideoFilter2Element",  CONFIGURE_VALUE_ELEMENT,        {NULL} },
+               { "VideoFilter2CropX",    CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideoFilter2CropY",    CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideoFilter2CropW",    CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "VideoFilter2CropH",    CONFIGURE_VALUE_INT,            {.value_int = 0} }
        };
 
        /* [Strobe] matching table */
@@ -796,23 +847,26 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "StrobeControl",        CONFIGURE_VALUE_INT_ARRAY, {NULL} },
                { "StrobeMode",           CONFIGURE_VALUE_INT_ARRAY, {NULL} },
                { "StrobeEV",             CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "StrobeBrightness",     CONFIGURE_VALUE_INT_RANGE, {NULL} },
        };
 
        /* [Effect] matching table */
        static conf_info_table conf_ctrl_effect_table[] = {
-               { "Brightness",           CONFIGURE_VALUE_INT_RANGE, {NULL} },
-               { "BrightnessStepDenominator", CONFIGURE_VALUE_INT, {.value_int = 2} },
-               { "Contrast",             CONFIGURE_VALUE_INT_RANGE, {NULL} },
-               { "Saturation",           CONFIGURE_VALUE_INT_RANGE, {NULL} },
-               { "Sharpness",            CONFIGURE_VALUE_INT_RANGE, {NULL} },
-               { "Hue",                  CONFIGURE_VALUE_INT_RANGE, {NULL} },
-               { "WhiteBalance",         CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-               { "ColorTone",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-               { "Flip",                 CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-               { "Rotation",             CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-               { "WDR",                  CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-               { "PartColorMode",        CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-               { "PartColor",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "Brightness",                     CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "BrightnessStepDenominator",      CONFIGURE_VALUE_INT, {.value_int = 2} },
+               { "Contrast",                       CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "Saturation",                     CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "Sharpness",                      CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "Hue",                            CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "WhiteBalance",                   CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "ColorTone",                      CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "Flip",                           CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "Rotation",                       CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "WDR",                            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "PartColorMode",                  CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "PartColor",                      CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "WhiteBalanceTemperature",        CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "WhiteBalanceTemperatureStep",    CONFIGURE_VALUE_INT, {.value_int = 1} }
        };
 
        /* [Photograph] matching table */
@@ -821,6 +875,7 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "DigitalZoom",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "OpticalZoom",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "FocusMode",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "FocusLevel",           CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "AFType",               CONFIGURE_VALUE_INT_ARRAY, {NULL} },
                { "AEType",               CONFIGURE_VALUE_INT_ARRAY, {NULL} },
                { "ExposureValue",        CONFIGURE_VALUE_INT_RANGE, {NULL} },
@@ -837,6 +892,8 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "PanElec",              CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "TiltMecha",            CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "TiltElec",             CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "Gain",                 CONFIGURE_VALUE_INT_RANGE, {NULL} },
+               { "GainStep",             CONFIGURE_VALUE_INT, {.value_int = 1} }
        };
 
        /* [Capture] matching table */
@@ -932,14 +989,13 @@ int _mmcamcorder_conf_get_info(MMHandleType handle, int type, const char *ConfFi
                fp = fopen(conf_path, "r");
                if (!fp) {
                        MMCAM_LOG_WARNING("open failed.[%s] errno [%d]", conf_path, errno);
-                       ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+                       return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
                }
        }
 
-       if (fp) {
-               ret = _mmcamcorder_conf_parse_info(handle, type, fp, configure_info);
-               fclose(fp);
-       }
+       ret = _mmcamcorder_conf_parse_info(handle, type, fp, configure_info);
+
+       fclose(fp);
 
        MMCAM_LOG_INFO("Leave [0x%x]", ret);
 
@@ -949,10 +1005,8 @@ int _mmcamcorder_conf_get_info(MMHandleType handle, int type, const char *ConfFi
 
 int _mmcamcorder_conf_parse_info(MMHandleType handle, int type, FILE *fp, camera_conf **configure_info)
 {
-       const unsigned int BUFFER_NUM_DETAILS = 256;
-       const unsigned int BUFFER_NUM_TOKEN = 20;
        size_t buffer_line_size = MMCAMCORDER_BUFFER_LINE_MAX;
-       const char* delimiters = " |=,\t\n";
+       const char* delimiters = " |=,\t\r\n";
 
        int i = 0;
        int ret = MM_ERROR_NONE;
@@ -964,8 +1018,8 @@ int _mmcamcorder_conf_parse_info(MMHandleType handle, int type, FILE *fp, camera
        int read_main = 0;
 
        char *buffer_string = NULL;
-       char *buffer_details[BUFFER_NUM_DETAILS];
-       char *buffer_token[BUFFER_NUM_TOKEN];
+       char *buffer_details[BUFFER_NUM_DETAILS] = {NULL, };
+       char *buffer_token[BUFFER_NUM_TOKEN] = {NULL, };
        char *token = NULL;
        char *category_name = NULL;
        char *detail_string = NULL;
@@ -1177,8 +1231,10 @@ void _mmcamcorder_conf_release_info(MMHandleType handle, camera_conf **configure
        for (i = 0 ; i < category_num ; i++) {
                if (temp_conf->info[i]) {
                        for (j = 0 ; j < temp_conf->info[i]->count ; j++) {
-                               if (temp_conf->info[i]->detail_info[j] == NULL)
+                               if (temp_conf->info[i]->detail_info[j] == NULL) {
+                                       MMCAM_LOG_WARNING("[%d][%d][%d] -> NULL", temp_conf->type, i, j);
                                        continue;
+                               }
 
                                if (_mmcamcorder_conf_get_value_type(handle, temp_conf->type, i, ((type_element*)(temp_conf->info[i]->detail_info[j]))->name, &type)) {
                                        switch (type) {
@@ -1312,19 +1368,17 @@ int _mmcamcorder_conf_get_value_type(MMHandleType handle, int type, int category
 
 int _mmcamcorder_conf_add_info(MMHandleType handle, int type, conf_detail **info, char **buffer_details, int category, int count_details)
 {
-       const int BUFFER_NUM_TOKEN = 256;
-
        int i = 0;
        int j = 0;
        int count_token;
        int value_type;
        char *token = NULL;
-       char *buffer_token[BUFFER_NUM_TOKEN];
+       char *buffer_token[BUFFER_NUM_TOKEN] = {NULL, };
        char *user_ptr = NULL;
 
-       const char *delimiters     = " |=,\t\n";
-       const char *delimiters_sub = " |\t\n";
-       const char *delimiters_3rd = "|\n";
+       const char *delimiters     = " |=,\t\r\n";
+       const char *delimiters_sub = " |\t\r\n";
+       const char *delimiters_3rd = "|\r\n";
 
        mmf_return_val_if_fail(info && buffer_details, FALSE);
 
@@ -1333,7 +1387,12 @@ int _mmcamcorder_conf_add_info(MMHandleType handle, int type, conf_detail **info
        (*info)->count = count_details;
 
        for (i = 0 ; i < count_details ; i++) {
-               MMCAM_LOG_VERBOSE("Read line\"%s\"", buffer_details[i]);
+               if (!buffer_details[i]) {
+                       MMCAM_LOG_WARNING("t[%d],cat[%d],index[%d]- NULL > skip", type, category, i);
+                       continue;
+               }
+
+               MMCAM_LOG_VERBOSE("Read line \"%s\"", buffer_details[i]);
                count_token = 0;
                token = strtok_r(buffer_details[i], delimiters, &user_ptr);
 
@@ -1518,6 +1577,7 @@ int _mmcamcorder_conf_add_info(MMHandleType handle, int type, conf_detail **info
                {
                        type_element2* new_element;
 
+                       j = 0;
                        new_element = (type_element2*)g_malloc0(sizeof(type_element2));
                        new_element->name         = get_new_string(buffer_token[0]);
                        new_element->element_name = get_new_string(buffer_token[1]);
@@ -1532,7 +1592,7 @@ int _mmcamcorder_conf_add_info(MMHandleType handle, int type, conf_detail **info
                        /* add int values */
                        if (new_element->count_int > 0 && new_element->count_int <= 30) {
                                new_element->value_int = (type_int2**)g_malloc0(sizeof(type_int2*)*(new_element->count_int));
-                               for (j = 0 ; j < new_element->count_int ; j++) {
+                               for ( ; j < new_element->count_int ; j++) {
                                        new_element->value_int[j] = (type_int2*)g_malloc0(sizeof(type_int2));
                                        new_element->value_int[j]->name  = get_new_string(buffer_token[4+(j<<1)]);
                                        new_element->value_int[j]->value = atoi(buffer_token[5+(j<<1)]);
@@ -2054,6 +2114,32 @@ int _mmcamcorder_conf_get_category_size(MMHandleType handle, int type, int categ
        return TRUE;
 }
 
+void _mmcamcorder_conf_get_element_and_name(MMHandleType handle, camera_conf *conf, int category,
+       const char *name, type_element **element, const char **element_name)
+{
+       type_element *_element = NULL;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       if (!hcamcorder) {
+               MMCAM_LOG_ERROR("NULL handle");
+               return;
+       }
+
+       if (!_mmcamcorder_conf_get_element(handle, conf,
+               category, name, &_element)) {
+               MMCAM_LOG_WARNING("get [%s] failed", name);
+               return;
+       }
+
+       if (element)
+               *element = _element;
+
+       if (element_name) {
+               _mmcamcorder_conf_get_value_element_name(_element, element_name);
+               MMCAM_LOG_INFO("[%s] -> [%s]", name, *element_name);
+       }
+}
+
 void _mmcamcorder_conf_print_info(MMHandleType handle, camera_conf** configure_info)
 {
        int i, j, k, type, category_type;