From 982d21f432623a9029d6d5e11f520b5df1f1df97 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 3 Sep 2015 17:20:42 +0900 Subject: [PATCH] Update code to check free space Change-Id: I6a22430ca75f3e471f40ecf3f1047558a6ebca46 Signed-off-by: Jeongmo Yang --- configure.ac | 4 + packaging/libmm-camcorder.spec | 1 + src/Makefile.am | 4 +- src/include/mm_camcorder_internal.h | 3 +- src/include/mm_camcorder_util.h | 5 +- src/mm_camcorder_attribute.c | 4 +- src/mm_camcorder_audiorec.c | 26 ++-- src/mm_camcorder_internal.c | 17 +++ src/mm_camcorder_util.c | 244 +++++++++++++++++++++--------------- src/mm_camcorder_videorec.c | 32 ++--- 10 files changed, 196 insertions(+), 144 deletions(-) diff --git a/configure.ac b/configure.ac index ce8dace..8fe4f13 100644 --- a/configure.ac +++ b/configure.ac @@ -102,6 +102,10 @@ PKG_CHECK_MODULES(TBM, libtbm) AC_SUBST(TBM_CFLAGS) AC_SUBST(TBM_LIBS) +PKG_CHECK_MODULES(STORAGE, storage) +AC_SUBST(STORAGE_CFLAGS) +AC_SUBST(STORAGE_LIBS) + # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h memory.h stdlib.h string.h sys/time.h unistd.h]) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 6549a2d..1b6f9ad 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -30,6 +30,7 @@ BuildRequires: pkgconfig(libpulse) BuildRequires: pkgconfig(vconf) BuildRequires: gstreamer-devel BuildRequires: pkgconfig(libtbm) +BuildRequires: pkgconfig(storage) %description Camera and recorder library. diff --git a/src/Makefile.am b/src/Makefile.am index 06aa51e..854382e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -45,6 +45,7 @@ libmmfcamcorder_la_CFLAGS = -I$(srcdir)/include \ $(MMUTIL_IMGP_CFLAGS) \ $(MMUTIL_JPEG_CFLAGS) \ $(TBM_CFLAGS) \ + $(STORAGE_CFLAGS) \ $(SYSTEMINFO_CFLAGS) libmmfcamcorder_la_LIBADD = \ @@ -61,7 +62,8 @@ libmmfcamcorder_la_LIBADD = \ $(VCONF_LIBS) \ $(MMUTIL_IMGP_LIBS) \ $(MMUTIL_JPEG_LIBS) \ - $(TBM_LIBS) + $(TBM_LIBS) \ + $(STORAGE_LIBS) libmmfcamcorder_la_CFLAGS += -DMMF_LOG_OWNER=0x010 -D_FILE_OFFSET_BITS=64 libmmfcamcorder_la_CFLAGS += -fdata-sections -ffunction-sections -Wl,--gc-sections diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index 0b85cf0..b9a44b8 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -666,14 +666,13 @@ typedef struct mmf_camcorder { char *model_name; /**< model name from system info */ char *software_version; /**< software_version from system info */ int capture_sound_count; /**< count for capture sound */ + char *root_directory; /**< Root directory for device */ _MMCamcorderInfoConverting caminfo_convert[CAMINFO_CONVERT_NUM]; /**< converting structure of camera info */ _MMCamcorderEnumConvert enum_conv[ENUM_CONVERT_NUM]; /**< enum converting list that is modified by ini info */ gboolean capture_in_recording; /**< Flag for capture while recording */ - guint64 system_memory; /* system memory size, do not use this size for recording*/ - gboolean error_occurs; /**< flag for error */ int error_code; /**< error code for internal gstreamer error */ diff --git a/src/include/mm_camcorder_util.h b/src/include/mm_camcorder_util.h index fddb411..557725c 100644 --- a/src/include/mm_camcorder_util.h +++ b/src/include/mm_camcorder_util.h @@ -243,11 +243,10 @@ guint64 _mmcamcorder_get_container_size64(const guchar *size); gboolean _mmcamcorder_update_composition_matrix(FILE *f, int orientation); /* File system */ -int _mmcamcorder_get_freespace(const gchar *path, guint64 *free_space); -int _mmcamcorder_get_freespace_except_system(guint64 *free_space); +int _mmcamcorder_get_freespace(const gchar *path, const gchar *root_directory, guint64 *free_space); int _mmcamcorder_get_file_size(const char *filename, guint64 *size); int _mmcamcorder_get_file_system_type(const gchar *path, int *file_system_type); -gboolean _mmcamcorder_check_file_path(const gchar *path); +int _mmcamcorder_get_root_directory(char **root_directory); /* Task */ void *_mmcamcorder_util_task_thread_func(void *data); diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 54c018b..2f8050a 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -1418,8 +1418,8 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) MM_ATTRS_FLAG_RW, {(void*)FALSE}, MM_ATTRS_VALID_TYPE_INT_RANGE, - FALSE, - TRUE, + {.int_min = FALSE}, + {.int_max = TRUE}, NULL, }, { diff --git a/src/mm_camcorder_audiorec.c b/src/mm_camcorder_audiorec.c index 7281018..fdf2a64 100644 --- a/src/mm_camcorder_audiorec.c +++ b/src/mm_camcorder_audiorec.c @@ -351,7 +351,6 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) int err = 0; int size=0; guint64 free_space = 0; - guint64 free_space_exceptsystem = 0; char *dir_name = NULL; char *err_attr_name = NULL; @@ -439,18 +438,9 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) /* TODO : check free space before recording start */ dir_name = g_path_get_dirname(info->filename); if (dir_name) { - err = _mmcamcorder_get_freespace(dir_name, &free_space); - if(_mmcamcorder_check_file_path(dir_name)) { - if (_mmcamcorder_get_freespace_except_system(&free_space_exceptsystem) == MM_ERROR_NONE) { - hcamcorder->system_memory = free_space - free_space_exceptsystem; - free_space = free_space - hcamcorder->system_memory; - } else { - hcamcorder->system_memory = 0; - } - } + err = _mmcamcorder_get_freespace(dir_name, hcamcorder->root_directory, &free_space); - _mmcam_dbg_warn("current space - %s [%" G_GUINT64_FORMAT "], system [%" G_GUINT64_FORMAT "]", - dir_name, free_space, hcamcorder->system_memory); + _mmcam_dbg_warn("current space - %s [%" G_GUINT64_FORMAT "]", dir_name, free_space); if (_mmcamcorder_get_file_system_type(dir_name, &file_system_type) == 0) { /* MSDOS_SUPER_MAGIC : 0x4d44 */ @@ -892,10 +882,16 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa /* to minimizing free space check overhead */ count = count % _MMCAMCORDER_FREE_SPACE_CHECK_INTERVAL; if (count++ == 0) { - gint free_space_ret = _mmcamcorder_get_freespace(filename, &free_space); + char *dir_name = g_path_get_dirname(filename); + gint free_space_ret = 0; - if(_mmcamcorder_check_file_path(filename) && hcamcorder->system_memory) { - free_space = free_space - hcamcorder->system_memory; + if (dir_name) { + free_space_ret = _mmcamcorder_get_freespace(dir_name, hcamcorder->root_directory, &free_space); + g_free(dir_name); + dir_name = NULL; + } else { + _mmcam_dbg_err("failed to get dir name from [%s]", filename); + free_space_ret = -1; } /*_mmcam_dbg_log("check free space for recording");*/ diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index 5407f37..39e4083 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -247,6 +247,12 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) /* create task thread */ pthread_create(&(hcamcorder->task_thread), NULL, _mmcamcorder_util_task_thread_func, (void *)hcamcorder); + /* get root directory */ + ret = _mmcamcorder_get_root_directory(&hcamcorder->root_directory); + if (ret != MM_ERROR_NONE) { + goto _ERR_DEFAULT_VALUE_INIT; + } + if (info->videodev_type < MM_VIDEO_DEVICE_NONE || info->videodev_type >= MM_VIDEO_DEVICE_NUM) { _mmcam_dbg_err("_mmcamcorder_create::video device type is out of range."); @@ -597,6 +603,11 @@ _ERR_DEFAULT_VALUE_INIT: pthread_mutex_destroy(&(hcamcorder->task_thread_lock)); pthread_cond_destroy(&(hcamcorder->task_thread_cond)); + if (hcamcorder->root_directory) { + free(hcamcorder->root_directory); + hcamcorder->root_directory = NULL; + } + /* Release handle */ memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t)); free(hcamcorder); @@ -765,6 +776,12 @@ int _mmcamcorder_destroy(MMHandleType handle) pthread_mutex_destroy(&(hcamcorder->task_thread_lock)); pthread_cond_destroy(&(hcamcorder->task_thread_cond)); + /* Release internal root directory string */ + if (hcamcorder->root_directory) { + free(hcamcorder->root_directory); + hcamcorder->root_directory = NULL; + } + /* Release handle */ memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t)); free(hcamcorder); diff --git a/src/mm_camcorder_util.c b/src/mm_camcorder_util.c index af5c55f..111e7b3 100644 --- a/src/mm_camcorder_util.c +++ b/src/mm_camcorder_util.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "mm_camcorder_internal.h" #include "mm_camcorder_util.h" @@ -37,6 +38,8 @@ #include #include +#include + /*----------------------------------------------------------------------- | GLOBAL VARIABLE DEFINITIONS for internal | -----------------------------------------------------------------------*/ @@ -141,6 +144,38 @@ static int __gdbus_method_call_sync(const char* bus_name, const char* object, co return ret; } + +static int __storage_device_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data) +{ + char **root_directory = (char **)user_data; + + if (root_directory == NULL) { + _mmcam_dbg_warn("user data is NULL"); + return FALSE; + } + + _mmcam_dbg_log("storage id %d, type %d, state %d, path %s", + storage_id, type, state, path ? path : "NULL"); + + if (type == STORAGE_TYPE_INTERNAL && path) { + if (*root_directory) { + free(*root_directory); + *root_directory = NULL; + } + + *root_directory = strdup(path); + if (*root_directory) { + _mmcam_dbg_log("get root directory %s", *root_directory); + return FALSE; + } else { + _mmcam_dbg_warn("strdup %s failed"); + } + } + + return TRUE; +} + + gint32 _mmcamcorder_double_to_fix(gdouble d_number) { return (gint32) (d_number * 65536.0); @@ -597,24 +632,55 @@ gboolean _mmcamcorder_update_composition_matrix(FILE *f, int orientation) } -int _mmcamcorder_get_freespace(const gchar *path, guint64 *free_space) +int _mmcamcorder_get_freespace(const gchar *path, const gchar *root_directory, guint64 *free_space) { - struct statfs fs; + int ret = 0; + int is_internal = 0; + struct statvfs vfs; + struct stat stat_path; + struct stat stat_root; - g_assert(path); + if (path == NULL || root_directory == NULL || free_space == NULL) { + _mmcam_dbg_err("invalid parameter %p, %p, %p", path, root_directory, free_space); + return -1; + } - if (!g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { - _mmcam_dbg_log("File(%s) doesn't exist.", path); - return -2; + if (stat(path, &stat_path) != 0) { + *free_space = 0; + _mmcam_dbg_err("failed to stat for [%s][errno %d]", path, errno); + return -1; } - if (-1 == statfs(path, &fs)) { - _mmcam_dbg_log("statfs failed.(%s)", path); + if (stat(root_directory, &stat_root) != 0) { + *free_space = 0; + _mmcam_dbg_err("failed to stat for [%s][errno %d]", path, errno); return -1; } - *free_space = (guint64)fs.f_bsize * fs.f_bavail; - return 1; + if (stat_path.st_dev == stat_root.st_dev) { + is_internal = TRUE; + } else { + is_internal = FALSE; + } + + if (is_internal) { + ret = storage_get_internal_memory_size(&vfs); + } else { + ret = storage_get_external_memory_size(&vfs); + } + + if (ret < 0) { + *free_space = 0; + _mmcam_dbg_err("failed to get memory size [%s]", path); + return -1; + } else { + *free_space = vfs.f_bsize * vfs.f_bavail; + /* + _mmcam_dbg_log("vfs.f_bsize [%lu], vfs.f_bavail [%lu]", vfs.f_bsize, vfs.f_bavail); + _mmcam_dbg_log("memory size %llu [%s]", *free_space, path); + */ + return 1; + } } @@ -639,36 +705,6 @@ int _mmcamcorder_get_file_system_type(const gchar *path, int *file_system_type) return 0; } -int _mmcamcorder_get_freespace_except_system(guint64 *free_space) -{ - double total_space=0; - double avail_space=0; - - int ret = MM_ERROR_NONE; - GVariant *params = NULL, *result = NULL; - const char *param_type = "(xx)"; - - if ((ret = __gdbus_method_call_sync("org.tizen.system.deviced", - "/Org/Tizen/System/DeviceD/Storage", - "org.tizen.system.deviced.storage", - "getstorage", - params, - &result, - TRUE)) != MM_ERROR_NONE) { - _mmcam_dbg_err("Dbus Call on Client Error"); - return ret; - } - - if (result) { - g_variant_get(result, param_type, &total_space, &avail_space); - *free_space = (guint64)avail_space; - _mmcam_dbg_log("free space [%" G_GUINT64_FORMAT "] ", *free_space); - } else { - _mmcam_dbg_err("replied result is null"); - ret = MM_ERROR_CAMCORDER_INTERNAL; - } - return ret; -} int _mmcamcorder_get_device_flash_brightness(int *brightness) { @@ -1578,66 +1614,62 @@ gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsign { int ret = 0; gboolean ret_conv = TRUE; - guint32 src_fourcc = 0; int jpeg_format = 0; unsigned char *converted_src = NULL; unsigned int converted_src_size = 0; mmf_return_val_if_fail(src_data && result_data && result_length, FALSE); - src_fourcc = _mmcamcorder_get_fourcc(src_format, 0, FALSE); - switch (src_format) { - case MM_PIXEL_FORMAT_NV12: - //jpeg_format = MM_UTIL_JPEG_FMT_NV12; - ret_conv = _mmcamcorder_convert_NV12_to_I420(src_data,src_width,src_height,&converted_src,&converted_src_size); - jpeg_format = MM_UTIL_JPEG_FMT_YUV420; - break; - case MM_PIXEL_FORMAT_NV16: - jpeg_format = MM_UTIL_JPEG_FMT_NV16; - converted_src = src_data; - break; - case MM_PIXEL_FORMAT_NV21: - jpeg_format = MM_UTIL_JPEG_FMT_NV21; - converted_src = src_data; - break; - case MM_PIXEL_FORMAT_YUYV: - //jpeg_format = MM_UTIL_JPEG_FMT_YUYV; - ret_conv = _mmcamcorder_convert_YUYV_to_I420(src_data,src_width,src_height,&converted_src,&converted_src_size); - jpeg_format = MM_UTIL_JPEG_FMT_YUV420; - break; - case MM_PIXEL_FORMAT_UYVY: - //jpeg_format = MM_UTIL_JPEG_FMT_UYVY; - ret_conv = _mmcamcorder_convert_UYVY_to_I420(src_data,src_width,src_height,&converted_src,&converted_src_size); - jpeg_format = MM_UTIL_JPEG_FMT_YUV420; - break; - case MM_PIXEL_FORMAT_I420: - jpeg_format = MM_UTIL_JPEG_FMT_YUV420; - converted_src = src_data; - break; - case MM_PIXEL_FORMAT_RGB888: - jpeg_format = MM_UTIL_JPEG_FMT_RGB888; - converted_src = src_data; - break; - case MM_PIXEL_FORMAT_RGBA: - jpeg_format = MM_UTIL_JPEG_FMT_RGBA8888; - converted_src = src_data; - break; - case MM_PIXEL_FORMAT_ARGB: - jpeg_format = MM_UTIL_JPEG_FMT_ARGB8888; - converted_src = src_data; - break; - case MM_PIXEL_FORMAT_422P: - jpeg_format = MM_UTIL_JPEG_FMT_YUV422; // not supported - return FALSE; - case MM_PIXEL_FORMAT_NV12T: - case MM_PIXEL_FORMAT_YV12: - case MM_PIXEL_FORMAT_RGB565: - case MM_PIXEL_FORMAT_ENCODED: - case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY: - default: - return FALSE; - + case MM_PIXEL_FORMAT_NV12: + //jpeg_format = MM_UTIL_JPEG_FMT_NV12; + ret_conv = _mmcamcorder_convert_NV12_to_I420(src_data,src_width,src_height,&converted_src,&converted_src_size); + jpeg_format = MM_UTIL_JPEG_FMT_YUV420; + break; + case MM_PIXEL_FORMAT_NV16: + jpeg_format = MM_UTIL_JPEG_FMT_NV16; + converted_src = src_data; + break; + case MM_PIXEL_FORMAT_NV21: + jpeg_format = MM_UTIL_JPEG_FMT_NV21; + converted_src = src_data; + break; + case MM_PIXEL_FORMAT_YUYV: + //jpeg_format = MM_UTIL_JPEG_FMT_YUYV; + ret_conv = _mmcamcorder_convert_YUYV_to_I420(src_data,src_width,src_height,&converted_src,&converted_src_size); + jpeg_format = MM_UTIL_JPEG_FMT_YUV420; + break; + case MM_PIXEL_FORMAT_UYVY: + //jpeg_format = MM_UTIL_JPEG_FMT_UYVY; + ret_conv = _mmcamcorder_convert_UYVY_to_I420(src_data,src_width,src_height,&converted_src,&converted_src_size); + jpeg_format = MM_UTIL_JPEG_FMT_YUV420; + break; + case MM_PIXEL_FORMAT_I420: + jpeg_format = MM_UTIL_JPEG_FMT_YUV420; + converted_src = src_data; + break; + case MM_PIXEL_FORMAT_RGB888: + jpeg_format = MM_UTIL_JPEG_FMT_RGB888; + converted_src = src_data; + break; + case MM_PIXEL_FORMAT_RGBA: + jpeg_format = MM_UTIL_JPEG_FMT_RGBA8888; + converted_src = src_data; + break; + case MM_PIXEL_FORMAT_ARGB: + jpeg_format = MM_UTIL_JPEG_FMT_ARGB8888; + converted_src = src_data; + break; + case MM_PIXEL_FORMAT_422P: + jpeg_format = MM_UTIL_JPEG_FMT_YUV422; // not supported + return FALSE; + case MM_PIXEL_FORMAT_NV12T: + case MM_PIXEL_FORMAT_YV12: + case MM_PIXEL_FORMAT_RGB565: + case MM_PIXEL_FORMAT_ENCODED: + case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY: + default: + return FALSE; } if (ret_conv == FALSE) { @@ -1728,13 +1760,6 @@ gboolean _mmcamcorder_downscale_UYVYorYUYV(unsigned char *src, unsigned int src_ return TRUE; } -gboolean _mmcamcorder_check_file_path(const gchar *path) -{ - if(strstr(path, "/opt/usr") != NULL) { - return TRUE; - } - return FALSE; -} static guint16 get_language_code(const char *str) { @@ -2065,3 +2090,22 @@ static gboolean _mmcamcorder_convert_NV12_to_I420(unsigned char *src, guint widt return TRUE; } + +int _mmcamcorder_get_root_directory(char **root_directory) +{ + int ret = STORAGE_ERROR_NONE; + + if (root_directory == NULL) { + _mmcam_dbg_warn("user data is NULL"); + return MM_ERROR_CAMCORDER_INVALID_ARGUMENT; + } + + ret = storage_foreach_device_supported((storage_device_supported_cb)__storage_device_supported_cb, root_directory); + if (ret != STORAGE_ERROR_NONE) { + _mmcam_dbg_err("storage_foreach_device_supported failed 0x%x", ret); + return MM_ERROR_CAMCORDER_INTERNAL; + } + + return MM_ERROR_NONE; +} + diff --git a/src/mm_camcorder_videorec.c b/src/mm_camcorder_videorec.c index 73ccfa8..7aa6cdd 100644 --- a/src/mm_camcorder_videorec.c +++ b/src/mm_camcorder_videorec.c @@ -504,7 +504,6 @@ int _mmcamcorder_video_command(MMHandleType handle, int command) int ret_free_space = 0; char *dir_name = NULL; guint64 free_space = 0; - guint64 free_space_exceptsystem = 0; int file_system_type = 0; /* Recording */ @@ -554,18 +553,9 @@ int _mmcamcorder_video_command(MMHandleType handle, int command) dir_name = g_path_get_dirname(temp_filename); if (dir_name) { - ret_free_space = _mmcamcorder_get_freespace(dir_name, &free_space); - if(_mmcamcorder_check_file_path(dir_name)) { - if (_mmcamcorder_get_freespace_except_system(&free_space_exceptsystem) == MM_ERROR_NONE) { - hcamcorder->system_memory = free_space - free_space_exceptsystem; - free_space = free_space - hcamcorder->system_memory; - } else { - hcamcorder->system_memory = 0; - } - } + ret_free_space = _mmcamcorder_get_freespace(dir_name, hcamcorder->root_directory, &free_space); - _mmcam_dbg_warn("current space - %s [%" G_GUINT64_FORMAT "], system [%" G_GUINT64_FORMAT "]", - dir_name, free_space, hcamcorder->system_memory); + _mmcam_dbg_warn("current space - %s [%" G_GUINT64_FORMAT "]", dir_name, free_space); if (_mmcamcorder_get_file_system_type(dir_name, &file_system_type) == 0) { /* MSDOS_SUPER_MAGIC : 0x4d44 */ @@ -1023,9 +1013,6 @@ int _mmcamcorder_video_command(MMHandleType handle, int command) sc->display_interval = 0; sc->previous_slot_time = 0; - /* init system memory size */ - hcamcorder->system_memory = 0; - /* Wait EOS */ _mmcam_dbg_log("Start to wait EOS"); ret =_mmcamcorder_get_eos_message(handle); @@ -1355,7 +1342,7 @@ static GstPadProbeReturn __mmcamcorder_video_dataprobe_record(GstPad *pad, GstPa guint64 buffer_size = 0; guint64 trailer_size = 0; guint64 queued_buffer = 0; - char *filename = NULL; + char *dir_name = NULL; GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER(info); GstMapInfo mapinfo; @@ -1398,11 +1385,14 @@ static GstPadProbeReturn __mmcamcorder_video_dataprobe_record(GstPad *pad, GstPa trailer_size = 0; } - filename = videoinfo->filename; - ret = _mmcamcorder_get_freespace(filename, &free_space); - - if(_mmcamcorder_check_file_path(filename) && hcamcorder->system_memory) { - free_space = free_space - hcamcorder->system_memory; + dir_name = g_path_get_dirname(videoinfo->filename); + if (dir_name) { + ret = _mmcamcorder_get_freespace(dir_name, hcamcorder->root_directory, &free_space); + g_free(dir_name); + dir_name = NULL; + } else { + _mmcam_dbg_err("failed to get dir name from [%s]", videoinfo->filename); + ret = -1; } /*_mmcam_dbg_log("check free space for recording");*/ -- 2.7.4