Update code to check free space 23/47423/1
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 3 Sep 2015 08:20:42 +0000 (17:20 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 3 Sep 2015 08:20:42 +0000 (17:20 +0900)
Change-Id: I6a22430ca75f3e471f40ecf3f1047558a6ebca46
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
configure.ac
packaging/libmm-camcorder.spec
src/Makefile.am
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_util.h
src/mm_camcorder_attribute.c
src/mm_camcorder_audiorec.c
src/mm_camcorder_internal.c
src/mm_camcorder_util.c
src/mm_camcorder_videorec.c

index ce8dace..8fe4f13 100644 (file)
@@ -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])
index 6549a2d..1b6f9ad 100644 (file)
@@ -30,6 +30,7 @@ BuildRequires:  pkgconfig(libpulse)
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  gstreamer-devel
 BuildRequires:  pkgconfig(libtbm)
+BuildRequires:  pkgconfig(storage)
 
 %description
 Camera and recorder library.
index 06aa51e..854382e 100644 (file)
@@ -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
index 0b85cf0..b9a44b8 100644 (file)
@@ -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 */
 
index fddb411..557725c 100644 (file)
@@ -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);
index 54c018b..2f8050a 100644 (file)
@@ -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,
                },
                {
index 7281018..fdf2a64 100644 (file)
@@ -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");*/
index 5407f37..39e4083 100644 (file)
@@ -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);
index af5c55f..111e7b3 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/stat.h>
 #include <gst/video/video-info.h>
 #include <gio/gio.h>
+#include <errno.h>
 
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_util.h"
@@ -37,6 +38,8 @@
 #include <mm_util_imgp.h>
 #include <mm_util_jpeg.h>
 
+#include <storage.h>
+
 /*-----------------------------------------------------------------------
 |    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;
+}
+
index 73ccfa8..7aa6cdd 100644 (file)
@@ -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");*/