Support large file for recording 04/44004/2
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 16 Jul 2015 06:02:01 +0000 (15:02 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 16 Jul 2015 06:10:45 +0000 (15:10 +0900)
Change-Id: I4729c77092cb98804e78676dc7204242f0b03d7d
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder_util.h
src/mm_camcorder_audiorec.c
src/mm_camcorder_util.c
src/mm_camcorder_videorec.c
test/mm_camcorder_testsuite.c

index a0f9331..bc825b4 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:       libmm-camcorder
 Summary:    Camera and recorder library
-Version:    0.10.3
+Version:    0.10.4
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
@@ -53,6 +53,7 @@ Camera and recorder development library.
 %if %{with wayland}
 export CFLAGS+=" -DHAVE_WAYLAND"
 %endif
+export CFLAGS+=" -D_LARGEFILE64_SOURCE"
 ./autogen.sh
 %configure \
 %if %{with wayland}
index e2a89f6..b2b0a99 100644 (file)
@@ -238,6 +238,7 @@ gboolean _mmcamcorder_write_loci(FILE *f, _MMCamcorderLocationInfo info);
 gboolean _mmcamcorder_write_geodata(FILE *f,_MMCamcorderLocationInfo info);
 gboolean _mmcamcorder_write_udta(FILE *f, int gps_enable, _MMCamcorderLocationInfo info, _MMCamcorderLocationInfo geotag);
 guint64 _mmcamcorder_get_container_size(const guchar *size);
+guint64 _mmcamcorder_get_container_size64(const guchar *size);
 gboolean _mmcamcorder_update_composition_matrix(FILE *f, int orientation);
 
 /* File system */
index 5a3e823..7281018 100644 (file)
@@ -1076,7 +1076,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle)
                geo_info.altitude = altitude *10000;
        }
 
-       f = fopen(info->filename, "rb+");
+       f = fopen64(info->filename, "rb+");
        if (f == NULL) {
                strerror_r(errno, err_msg, 128);
                _mmcam_dbg_err("file open failed [%s]", err_msg);
@@ -1100,7 +1100,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle)
                        goto fail;
                }
 
-               udta_pos = ftell(f);
+               udta_pos = ftello(f);
                if (udta_pos < 0) {
                        goto ftell_fail;
                }
@@ -1126,7 +1126,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle)
                        }
                }
 
-               current_pos = ftell(f);
+               current_pos = ftello(f);
                if (current_pos < 0) {
                        goto ftell_fail;
                }
@@ -1147,7 +1147,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle)
 
        /* find moov container.
           update moov container size. */
-       if((current_pos = ftell(f))<0)
+       if((current_pos = ftello(f))<0)
                goto ftell_fail;
 
        if (_mmcamcorder_find_fourcc(f, MMCAM_FOURCC('m','o','o','v'), TRUE)) {
@@ -1157,7 +1157,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle)
                        goto fail;
                }
 
-               moov_pos = ftell(f);
+               moov_pos = ftello(f);
                if (moov_pos < 0) {
                        goto ftell_fail;
                }
index f0493ee..87da365 100644 (file)
@@ -156,8 +156,8 @@ gint _mmcamcorder_find_tag(FILE *f, guint32 tag_fourcc, gboolean do_rewind)
        }
 
        while ((read_item = fread(&buf, sizeof(guchar), 8, f)) > 0) {
-               unsigned long long buf_size = 0;
-               unsigned int buf_fourcc = 0;
+               uint64_t buf_size = 0;
+               uint32_t buf_fourcc = 0;
 
                if (read_item < 8) {
                        _mmcam_dbg_err("fread failed : %d", read_item);
@@ -172,27 +172,28 @@ gint _mmcamcorder_find_tag(FILE *f, guint32 tag_fourcc, gboolean do_rewind)
                } else {
                        _mmcam_dbg_log("skip [%c%c%c%c] tag", MMCAM_FOURCC_ARGS(buf_fourcc));
 
-                       buf_size = (unsigned long long)_mmcamcorder_get_container_size(buf);
-                       buf_size = buf_size - 8; /* include tag */
+                       buf_size = _mmcamcorder_get_container_size(buf);
 
-                       do {
-                               if (buf_size > _MMCAMCORDER_MAX_INT) {
-                                       _mmcam_dbg_log("seek %d", _MMCAMCORDER_MAX_INT);
-                                       if (fseek(f, _MMCAMCORDER_MAX_INT, SEEK_CUR) != 0) {
-                                               _mmcam_dbg_err("fseek() fail");
-                                               return FALSE;
-                                       }
-
-                                       buf_size -= _MMCAMCORDER_MAX_INT;
-                               } else {
-                                       _mmcam_dbg_log("seek %d", buf_size);
-                                       if (fseek(f, buf_size, SEEK_CUR) != 0) {
-                                               _mmcam_dbg_err("fseek() fail");
-                                               return FALSE;
-                                       }
-                                       break;
+                       /* if size of mdat is 1, it means largesize is used.(bigger than 4GB) */
+                       if (buf_fourcc == MMCAM_FOURCC('m','d','a','t') &&
+                           buf_size == 1) {
+                               read_item = fread(&buf, sizeof(guchar), 8, f);
+                               if (read_item < 8) {
+                                       _mmcam_dbg_err("fread failed");
+                                       return FALSE;
                                }
-                       } while (TRUE);
+
+                               buf_size = _mmcamcorder_get_container_size64(buf);
+                               buf_size = buf_size - 16; /* include tag and large file flag(size 1) */
+                       } else {
+                               buf_size = buf_size - 8; /* include tag */
+                       }
+
+                       _mmcam_dbg_log("seek %llu", buf_size);
+                       if (fseeko(f, (off_t)buf_size, SEEK_CUR) != 0) {
+                               _mmcam_dbg_err("fseeko() fail");
+                               return FALSE;
+                       }
                }
        }
 
@@ -211,8 +212,8 @@ gboolean _mmcamcorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewin
        }
 
        while ((read_item = fread(&buf, sizeof(guchar), 8, f))  > 0) {
-               unsigned long long buf_size = 0;
-               unsigned int buf_fourcc = 0;
+               uint64_t buf_size = 0;
+               uint32_t buf_fourcc = 0;
 
                if (read_item < 8) {
                        _mmcam_dbg_err("fread failed : %d", read_item);
@@ -224,38 +225,38 @@ gboolean _mmcamcorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewin
                if (tag_fourcc == buf_fourcc) {
                        _mmcam_dbg_log("find tag : %c%c%c%c", MMCAM_FOURCC_ARGS(tag_fourcc));
                        return TRUE;
-               }
-               else if((buf_fourcc == MMCAM_FOURCC('m','o','o','v')) && (tag_fourcc != buf_fourcc)){
-                       if(_mmcamcorder_find_fourcc(f,tag_fourcc,FALSE)){
+               } else if (buf_fourcc == MMCAM_FOURCC('m','o','o','v') &&
+                          tag_fourcc != buf_fourcc) {
+                       if (_mmcamcorder_find_fourcc(f, tag_fourcc, FALSE)) {
                                return TRUE;
-                       }
-                       else{
+                       } else {
                                continue;
                        }
                } else {
                        _mmcam_dbg_log("skip [%c%c%c%c] tag", MMCAM_FOURCC_ARGS(buf_fourcc));
 
-                       buf_size = (unsigned long long)_mmcamcorder_get_container_size(buf);
-                       buf_size = buf_size - 8; /* include tag */
-
-                       do {
-                               if (buf_size > _MMCAMCORDER_MAX_INT) {
-                                       _mmcam_dbg_log("seek %d", _MMCAMCORDER_MAX_INT);
-                                       if (fseek(f, _MMCAMCORDER_MAX_INT, SEEK_CUR) != 0) {
-                                               _mmcam_dbg_err("fseek() fail");
-                                               return FALSE;
-                                       }
+                       buf_size = _mmcamcorder_get_container_size(buf);
 
-                                       buf_size -= _MMCAMCORDER_MAX_INT;
-                               } else {
-                                       _mmcam_dbg_log("seek %d", buf_size);
-                                       if (fseek(f, buf_size, SEEK_CUR) != 0) {
-                                               _mmcam_dbg_err("fseek() fail");
-                                               return FALSE;
-                                       }
-                                       break;
+                       /* if size of mdat is 1, it means largesize is used.(bigger than 4GB) */
+                       if (buf_fourcc == MMCAM_FOURCC('m','d','a','t') &&
+                           buf_size == 1) {
+                               read_item = fread(&buf, sizeof(guchar), 8, f);
+                               if (read_item < 8) {
+                                       _mmcam_dbg_err("fread failed");
+                                       return FALSE;
                                }
-                       } while (TRUE);
+
+                               buf_size = _mmcamcorder_get_container_size64(buf);
+                               buf_size = buf_size - 16; /* include tag and large file flag(size 1) */
+                       } else {
+                               buf_size = buf_size - 8; /* include tag */
+                       }
+
+                       _mmcam_dbg_log("seek %llu", buf_size);
+                       if (fseeko(f, (off_t)buf_size, SEEK_CUR) != 0) {
+                               _mmcam_dbg_err("fseeko() fail");
+                               return FALSE;
+                       }
                }
        }
 
@@ -267,18 +268,18 @@ gboolean _mmcamcorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewin
 gboolean _mmcamcorder_update_size(FILE *f, gint64 prev_pos, gint64 curr_pos)
 {
        _mmcam_dbg_log("size : %"G_GINT64_FORMAT"", curr_pos-prev_pos);
-       if(fseek(f, prev_pos, SEEK_SET) != 0)
+       if(fseeko(f, prev_pos, SEEK_SET) != 0)
        {
-               _mmcam_dbg_err("fseek() fail");
+               _mmcam_dbg_err("fseeko() fail");
                return FALSE;
        }
 
        if (!write_to_32(f, curr_pos -prev_pos))
                return FALSE;
 
-       if(fseek(f, curr_pos, SEEK_SET) != 0)
+       if(fseeko(f, curr_pos, SEEK_SET) != 0)
        {
-               _mmcam_dbg_err("fseek() fail");
+               _mmcam_dbg_err("fseeko() fail");
                return FALSE;
        }
 
@@ -292,15 +293,15 @@ gboolean _mmcamcorder_write_loci(FILE *f, _MMCamcorderLocationInfo info)
 
        _mmcam_dbg_log("");
 
-       if((pos = ftell(f))<0)
+       if((pos = ftello(f))<0)
        {
-               _mmcam_dbg_err("ftell() returns negative value");       
+               _mmcam_dbg_err("ftello() returns negative value");
                return FALSE;
        }
-       
+
        if(!write_to_32(f, 0)) //size
                return FALSE;
-       
+
        if(!write_tag(f, "loci"))       // type
                return FALSE;
 
@@ -341,9 +342,9 @@ gboolean _mmcamcorder_write_loci(FILE *f, _MMCamcorderLocationInfo info)
 
        FPUTC_CHECK('\0', f);
 
-       if((current_pos = ftell(f))<0)
+       if((current_pos = ftello(f))<0)
        {
-               _mmcam_dbg_err("ftell() returns negative value");
+               _mmcam_dbg_err("ftello() returns negative value");
                return FALSE;
        }
 
@@ -414,9 +415,9 @@ gboolean _mmcamcorder_write_geodata(FILE *f,_MMCamcorderLocationInfo info) {
 
        _mmcam_dbg_log("");
 
-       if((pos = ftell(f))<0)
+       if((pos = ftello(f))<0)
        {
-               _mmcam_dbg_err("ftell() returns negative value");
+               _mmcam_dbg_err("ftello() returns negative value");
                return FALSE;
        }
 
@@ -434,9 +435,9 @@ gboolean _mmcamcorder_write_geodata(FILE *f,_MMCamcorderLocationInfo info) {
 
        FPUTC_CHECK(0x2F, f);
 
-       if((current_pos = ftell(f))<0)
+       if((current_pos = ftello(f))<0)
        {
-               _mmcam_dbg_err("ftell() returns negative value");
+               _mmcam_dbg_err("ftello() returns negative value");
                return FALSE;
        }
 
@@ -457,8 +458,8 @@ gboolean _mmcamcorder_write_udta(FILE *f, int gps_enable, _MMCamcorderLocationIn
                return TRUE;
        }
 
-       if ((pos = ftell(f))<0) {
-               _mmcam_dbg_err("ftell() returns negative value");
+       if ((pos = ftello(f))<0) {
+               _mmcam_dbg_err("ftello() returns negative value");
                return FALSE;
        }
 
@@ -486,8 +487,8 @@ gboolean _mmcamcorder_write_udta(FILE *f, int gps_enable, _MMCamcorderLocationIn
                }
        }
 
-       if ((current_pos = ftell(f))<0) {
-               _mmcam_dbg_err("ftell() returns negative value");
+       if ((current_pos = ftello(f))<0) {
+               _mmcam_dbg_err("ftello() returns negative value");
                return FALSE;
        }
 
@@ -515,7 +516,34 @@ guint64 _mmcamcorder_get_container_size(const guchar *size)
        result = result | (temp << 8);
        result = result | size[3];
 
-       _mmcam_dbg_log("result : %lld", (unsigned long long)result);
+       _mmcam_dbg_log("result : %llu", result);
+
+       return result;
+}
+
+
+guint64 _mmcamcorder_get_container_size64(const guchar *size)
+{
+       guint64 result = 0;
+       guint64 temp = 0;
+
+       temp = size[0];
+       result = temp << 56;
+       temp = size[1];
+       result = result | (temp << 48);
+       temp = size[2];
+       result = result | (temp << 40);
+       temp = size[3];
+       result = result | (temp << 32);
+       temp = size[4];
+       result = result | (temp << 24);
+       temp = size[5];
+       result = result | (temp << 16);
+       temp = size[6];
+       result = result | (temp << 8);
+       result = result | size[7];
+
+       _mmcam_dbg_log("result : %llu", result);
 
        return result;
 }
index c20df6f..73ccfa8 100644 (file)
@@ -1806,7 +1806,7 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
 
        info = sc->info_video;
 
-       f = fopen(info->filename, "rb+");
+       f = fopen64(info->filename, "rb+");
        if (f == NULL) {
                strerror_r(errno, err_msg, MAX_ERROR_MESSAGE_LEN);
                _mmcam_dbg_err("file open failed [%s]", err_msg);
@@ -1844,7 +1844,7 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
                        goto fail;
                }
 
-               udta_pos = ftell(f);
+               udta_pos = ftello(f);
                if (udta_pos < 0) {
                        goto ftell_fail;
                }
@@ -1872,7 +1872,7 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
                        }
                }
 
-               current_pos = ftell(f);
+               current_pos = ftello(f);
                if (current_pos < 0) {
                        goto ftell_fail;
                }
@@ -1894,18 +1894,18 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
 
        /* find moov container.
           update moov container size. */
-       if((current_pos = ftell(f))<0)
+       if((current_pos = ftello(f))<0)
                goto ftell_fail;
 
        if (_mmcamcorder_find_tag(f, MMCAM_FOURCC('m','o','o','v'), TRUE)) {
-               gint64 internal_pos = ftell(f);
+               gint64 internal_pos = ftello(f);
 
                _mmcam_dbg_log("found moov container");
                if (fseek(f, -8L, SEEK_CUR) !=0) {
                        goto fail;
                }
 
-               moov_pos = ftell(f);
+               moov_pos = ftello(f);
                if (moov_pos < 0) {
                        goto ftell_fail;
                }
@@ -1915,7 +1915,7 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
                }
 
                /* add orientation info */
-               if (fseek(f, internal_pos, SEEK_SET) < 0) {
+               if (fseeko(f, internal_pos, SEEK_SET) < 0) {
                        _mmcam_dbg_err("fseek failed : errno %d", errno);
                        goto fail;
                }
index d07eb79..1e9566d 100644 (file)
@@ -2160,6 +2160,8 @@ static gboolean init(int type)
                                                   MMCAM_TARGET_FILENAME, TARGET_FILENAME_VIDEO, strlen(TARGET_FILENAME_VIDEO),
                                                   //MMCAM_TARGET_TIME_LIMIT, 360000,
                                                   //MMCAM_TARGET_MAX_SIZE, 102400,
+                                                  MMCAM_RECORDER_TAG_ENABLE, 1,
+                                                  MMCAM_TAG_VIDEO_ORIENTATION, 1,
                                                   NULL );
 
                if (err != MM_ERROR_NONE) {