modify 360 video parser. 01/101401/2
authorji.yong.seo <ji.yong.seo@samsung.com>
Thu, 1 Dec 2016 04:12:45 +0000 (13:12 +0900)
committerJiyong Min <jiyong.min@samsung.com>
Thu, 1 Dec 2016 08:59:14 +0000 (00:59 -0800)
Change-Id: I5411e7583b0fa8d964dd0e268d206cc0b38b61e7
Signed-off-by: ji.yong.seo <ji.yong.seo@samsung.com>
(cherry picked from commit 3636ddb575175638220b414a7f3b9a818dd01d24)

include/mm_file.h
include/mm_file_formats.h
mm_file.c
packaging/libmm-fileinfo.spec
utils/mm_file_util_tag.c

index 1711739..9067824 100755 (executable)
 extern "C" {
 #endif
 
+typedef enum {
+       MMFILE_360_NONE = 0,
+       MMFILE_360_NON_STITCHED = 0x00010000,
+       MMFILE_360_STITCHED = 0x00020000,
+       MMFILE_360_MASK = 0x00001111,
+} MMFILE_360_TYPE;
+
 
 /**
  * content attributes.
  */
-#define MM_FILE_CONTENT_DURATION                               "content-duration"              /**< Duration of media */
+#define MM_FILE_CONTENT_DURATION                       "content-duration"              /**< Duration of media */
 #define MM_FILE_CONTENT_VIDEO_CODEC                    "content-video-codec"           /**< Used video codec */
-#define MM_FILE_CONTENT_VIDEO_BITRATE                  "content-video-bitrate"         /**< Bitrate of video stream */
-#define MM_FILE_CONTENT_VIDEO_FPS                              "content-video-fps"             /**< Frames per second of video stream */
+#define MM_FILE_CONTENT_VIDEO_FORMAT           "content-video-format"          /**< Used video format */
+#define MM_FILE_CONTENT_VIDEO_BITRATE          "content-video-bitrate"         /**< Bitrate of video stream */
+#define MM_FILE_CONTENT_VIDEO_FPS                      "content-video-fps"             /**< Frames per second of video stream */
 #define MM_FILE_CONTENT_VIDEO_WIDTH                    "content-video-width"           /**< Width of video stream */
-#define MM_FILE_CONTENT_VIDEO_HEIGHT                   "content-video-height"          /**< Height of video stream */
+#define MM_FILE_CONTENT_VIDEO_HEIGHT           "content-video-height"          /**< Height of video stream */
 #define MM_FILE_CONTENT_VIDEO_THUMBNAIL                "content-video-thumbnail"       /**< Thumbnail of video stream */
 #define MM_FILE_CONTENT_VIDEO_TRACK_INDEX      "content-video-track-index" /**< Current stream of video */
 #define MM_FILE_CONTENT_VIDEO_TRACK_COUNT      "content-video-track-count"/**< Number of video streams */
@@ -75,34 +83,34 @@ extern "C" {
 /**
  * tag attributes.
  */
-#define        MM_FILE_TAG_ARTIST                      "tag-artist"                    /**< Artist */
-#define        MM_FILE_TAG_TITLE                               "tag-title"                     /**< Title */
+#define MM_FILE_TAG_ARTIST                     "tag-artist"                    /**< Artist */
+#define        MM_FILE_TAG_TITLE                       "tag-title"                     /**< Title */
 #define        MM_FILE_TAG_ALBUM                       "tag-album"                     /**< Album */
 #define        MM_FILE_TAG_ALBUM_ARTIST        "tag-album-artist"                      /**< Album_Artist */
-#define        MM_FILE_TAG_GENRE                               "tag-genre"                     /**< Genre */
+#define        MM_FILE_TAG_GENRE                       "tag-genre"                     /**< Genre */
 #define        MM_FILE_TAG_AUTHOR                      "tag-author"                    /**< Author / Composer */
 #define        MM_FILE_TAG_COPYRIGHT           "tag-copyright"         /**< Copyright */
-#define        MM_FILE_TAG_DATE                                "tag-date"                      /**< Year */
+#define        MM_FILE_TAG_DATE                        "tag-date"                      /**< Year */
 #define        MM_FILE_TAG_DESCRIPTION         "tag-description"               /**< Description */
 #define        MM_FILE_TAG_COMMENT                     "tag-comment"           /**< Comment */
 #define        MM_FILE_TAG_ARTWORK                     "tag-artwork"                   /**< Artwork */
-#define        MM_FILE_TAG_ARTWORK_SIZE                "tag-artwork-size"              /**< Artwork size */
+#define        MM_FILE_TAG_ARTWORK_SIZE        "tag-artwork-size"              /**< Artwork size */
 #define        MM_FILE_TAG_ARTWORK_MIME        "tag-artwork-mime"      /**< Artwork mime type */
 #define        MM_FILE_TAG_TRACK_NUM           "tag-track-num"         /**< Number of tracks */
 #define        MM_FILE_TAG_CLASSIFICATION      "tag-classification"            /**< Classification Information */
-#define        MM_FILE_TAG_RATING              "tag-rating"                    /**< Rating Information */
-#define        MM_FILE_TAG_LONGITUDE           "tag-longitude"         /**< location Information*/
-#define        MM_FILE_TAG_LATIDUE             "tag-latitude"                  /**< location Information*/
-#define        MM_FILE_TAG_ALTIDUE             "tag-altitude"                  /**< location Information*/
-#define        MM_FILE_TAG_CONDUCTOR           "tag-conductor"                 /**< Conductor Information*/
-#define        MM_FILE_TAG_UNSYNCLYRICS        "tag-unsynclyrics"      /**< Unsynchronized Lyrics Information*/
-#define        MM_FILE_TAG_SYNCLYRICS_NUM      "tag-synclyrics-num"    /**< Synchronized Lyrics Information*/
+#define        MM_FILE_TAG_RATING          "tag-rating"                        /**< Rating Information */
+#define        MM_FILE_TAG_LONGITUDE       "tag-longitude"             /**< location Information*/
+#define        MM_FILE_TAG_LATIDUE         "tag-latitude"                      /**< location Information*/
+#define        MM_FILE_TAG_ALTIDUE         "tag-altitude"                      /**< location Information*/
+#define        MM_FILE_TAG_CONDUCTOR       "tag-conductor"             /**< Conductor Information*/
+#define        MM_FILE_TAG_UNSYNCLYRICS    "tag-unsynclyrics"          /**< Unsynchronized Lyrics Information*/
+#define        MM_FILE_TAG_SYNCLYRICS_NUM  "tag-synclyrics-num"        /**< Synchronized Lyrics Information*/
 #define        MM_FILE_TAG_RECDATE                     "tag-recdate"                   /**< Recoding date */
 #define        MM_FILE_TAG_ROTATE                      "tag-rotate"                    /**< Rotate(Orientation) Information*/
 #define        MM_FILE_TAG_CDIS                        "tag-cdis"                              /**< CDIS in User Data Information*/
 #define        MM_FILE_TAG_SMTA                        "tag-smta"                              /**< SMTA in User Data Information*/
-
-#define        MM_FILE_TAG_360                 "tag-360"                       /**< 360 content in User Data Information*/
+#define        MM_FILE_TAG_360                         "tag-360"                       /**< 360 content in User Data Information*/
+#define MM_FILE_TAG_STITCHED_INFO      "tag-stitched_info"
 
 
 /**
index bc1794c..68c673d 100755 (executable)
@@ -151,6 +151,7 @@ struct _MMFileFormatContext {
        int cdis;
        int smta;
        int is_360;
+       int stitched_info;
 
        /* private data */
        void *privateFormatData;
index 8c9123e..dd10634 100755 (executable)
--- a/mm_file.c
+++ b/mm_file.c
@@ -125,11 +125,13 @@ static mmf_attrs_construct_info_t g_tag_attrs[] = {
        {(char *)"tag-cdis",                    MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
        {(char *)"tag-smta",                    MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
        {(char *)"tag-360",                     MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
+       {(char *)"tag-stitched_info",   MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
 };
 
 static mmf_attrs_construct_info_t g_content_attrs[] = {
        {(char *)"content-duration",                    MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
        {(char *)"content-video-codec",         MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
+       {(char *)"content-video-format",                MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
        {(char *)"content-video-bitrate",               MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
        {(char *)"content-video-fps",                   MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
        {(char *)"content-video-width",         MMF_VALUE_TYPE_INT,             MM_ATTRS_FLAG_RW, (void *)0},
@@ -311,6 +313,7 @@ _info_set_attr_media(mmf_attrs_t *attrs, MMFileFormatContext *formatContext)
                mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SMTA, formatContext->smta);
 
                mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_360, formatContext->is_360);
+               mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_STITCHED_INFO, formatContext->stitched_info);
 
                if ((formatContext->syncLyricsNum > 0) && (formatContext->syncLyrics))
                        mm_attrs_set_data_by_name(hattrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
@@ -339,6 +342,7 @@ _info_set_attr_media(mmf_attrs_t *attrs, MMFileFormatContext *formatContext)
 
                        MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
 
+                       mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_FORMAT, formatContext->formatType);
                        mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_CODEC, videoStream->codecId);
                        mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_BITRATE, videoStream->bitRate);
                        mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_FPS, videoStream->framePerSec);
index f539101..46c6339 100755 (executable)
@@ -1,6 +1,6 @@
 Name:      libmm-fileinfo
 Summary:    Media Fileinfo
-Version:    0.6.51
+Version:    0.6.52
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 4e52dd1..35e537e 100755 (executable)
@@ -26,6 +26,7 @@
 #include <vconf.h>
 #include <glib.h>
 
+#include "mm_file.h"
 #include "mm_file_debug.h"
 #include "mm_file_utils.h"
 
@@ -1316,13 +1317,6 @@ EXPORT_API int MMFileUtilGetMetaDataFromMP4(MMFileFormatContext *formatContext)
                        chunk_size = basic_header.size;
                }
 
-#ifdef __MMFILE_TEST_MODE__
-               debug_msg("START_OFFSET:[%lld] SIZE:[%d Byte] 4CC:[%c%c%c%c]\n",
-                               basic_header.start_offset, basic_header.size,
-                               ((char *)&basic_header.type)[0], ((char *)&basic_header.type)[1],
-                               ((char *)&basic_header.type)[2], ((char *)&basic_header.type)[3]);
-#endif
-
                switch (basic_header.type) {
                        case FOURCC('m', 'o', 'o', 'v'): {
 #ifdef __MMFILE_TEST_MODE__
@@ -1452,31 +1446,48 @@ EXPORT_API int MMFileUtilGetMetaDataFromMP4(MMFileFormatContext *formatContext)
 
                        case FOURCC('t', 'r', 'a', 'k'): {
 #ifdef __MMFILE_TEST_MODE__
-                                       debug_msg("MPEG4: [trak] SIZE: [%d]Byte\n", basic_header.size);
+                                       debug_msg("MPEG4: [trak] SIZE: [%lld]Byte\n", chunk_size);
 #endif
                                        break;
                                }
                        case FOURCC('u', 'u', 'i', 'd'): {
 #ifdef __MMFILE_TEST_MODE__
-                                       debug_msg("MPEG4: [uuid] SIZE: [%d]Byte\n", basic_header.size);
+                                       debug_msg("MPEG4: [uuid] SIZE: [%lld]Byte\n", chunk_size);
 #endif
-                                       if (!formatContext->is_360) {
-                                               unsigned long uuid[4] = {0, };
+                                       unsigned long uuid[4] = {0, };
+
+                                       mmfile_read(fp, (unsigned char *)uuid, sizeof(uuid));
+
+                                       if (mmfile_io_be_uint32(uuid[0]) == 0xffcc8263
+                                               && mmfile_io_be_uint32(uuid[1]) == 0xf8554a93
+                                               && mmfile_io_be_uint32(uuid[2]) == 0x8814587a
+                                               && mmfile_io_be_uint32(uuid[3]) == 0x02521fdd) {
+                                               char *str = NULL;
+                                               str = (char *)malloc(basic_header.size);
 
-                                               mmfile_read(fp, (unsigned char *)uuid, sizeof(uuid));
+                                               if(str != NULL) {
+                                                       memset(str, 0, basic_header.size);
+                                                       mmfile_read(fp, (unsigned char *)str, basic_header.size);
 
-                                               if (mmfile_io_be_uint32(uuid[0]) == 0xffcc8263
-                                                       && mmfile_io_be_uint32(uuid[1]) == 0xf8554a93
-                                                       && mmfile_io_be_uint32(uuid[2]) == 0x8814587a
-                                                       && mmfile_io_be_uint32(uuid[3]) == 0x02521fdd) {
-                                                       formatContext->is_360 = 1;
+                                                       if(strstr(str, "<GSpherical:Spherical>true</GSpherical:Spherical>"))
+                                                               formatContext->is_360 = 1;
+                                                       else
+                                                               formatContext->is_360 = 0;
+
+                                                       if(formatContext->is_360 == 1) {
+                                                               if (strstr(str, "<GSpherical:Stitched>true</GSpherical:Stitched>"))
+                                                                       formatContext->stitched_info = MMFILE_360_STITCHED;
+                                                               else
+                                                                       formatContext->stitched_info = MMFILE_360_NON_STITCHED;
+                                                       } else {
+                                                               formatContext->stitched_info = MMFILE_360_NONE;
+                                                       }
                                                }
-                                               ret = mmfile_seek(fp, basic_header.start_offset + basic_header.size, SEEK_SET);
                                        }
+                                       ret = mmfile_seek(fp, basic_header.start_offset + chunk_size - sizeof(uuid), SEEK_SET);
 
                                        break;
                                }
-
                        default: {
 #ifdef __MMFILE_TEST_MODE__
                                        debug_msg("4CC: Not Support [%c%c%c%c]. So skip it. Size [%lld Byte]\n",