#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"
#include <mm_util_imgp.h>
#include <mm_util_jpeg.h>
+#include <storage.h>
+
/*-----------------------------------------------------------------------
| GLOBAL VARIABLE DEFINITIONS for internal |
-----------------------------------------------------------------------*/
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);
}
-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;
+ }
}
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)
{
{
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) {
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)
{
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;
+}
+
int ret_free_space = 0;
char *dir_name = NULL;
guint64 free_space = 0;
- guint64 free_space_exceptsystem = 0;
int file_system_type = 0;
/* Recording */
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 */
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);
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;
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");*/