Add support for Spherical Video and Ambisonics Audio Metadata 51/123151/8
authorMykola Alieksieiev <m.alieksieie@samsung.com>
Tue, 4 Apr 2017 17:36:30 +0000 (20:36 +0300)
committerhj kim <backto.kim@samsung.com>
Tue, 11 Jul 2017 01:45:14 +0000 (01:45 +0000)
Change-Id: Idd877625bd4ed44f82c646c7058f5b00302e5573
Signed-off-by: Mykola Alieksieiev <m.alieksieie@samsung.com>
include/metadata_extractor_type.h
include/metadata_extractor_type_private.h [new file with mode: 0755]
src/metadata_extractor.c
test/metadata_extractor_test.c

index 7ae6cafa435ccc1b5fb7311ff3b1dc90362801a8..3af1f42685953e1d9f03f8cb92d550afad63432d 100755 (executable)
@@ -89,7 +89,7 @@ typedef enum {
        METADATA_ROTATE,                                        /**< Rotate(Orientation) Information */
        METADATA_VIDEO_CODEC,                   /**< Video Codec (Since 3.0) */
        METADATA_AUDIO_CODEC,                   /**< Audio Codec (Since 3.0) */
-       METADATA_360,                                           /**< 360 content Information (Since 3.0) */
+       METADATA_360,                                                   /**< Flag indicating if the video is a spherical video (Since 3.0) */
 } metadata_extractor_attr_e;
 
 /**
diff --git a/include/metadata_extractor_type_private.h b/include/metadata_extractor_type_private.h
new file mode 100755 (executable)
index 0000000..d52f830
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef __TIZEN_MEDIA_METADATA_EXTRACTOR_TYPE_PRIVATE_H__
+#define __TIZEN_MEDIA_METADATA_EXTRACTOR_TYPE_PRIVATE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file metadata_extractor_type_private.h
+ */
+
+/**
+* @addtogroup CAPI_METADATA_EXTRACTOR_MODULE
+* @{
+*/
+
+/*TODO: Move attributes to metadata_extractor_type.h after ACR*/
+
+/**
+ * @ingroup CAPI_METADATA_EXTRACTOR_MODULE
+ * @brief Enumeration of attributes to be introduced in 4.0. This is a temp change until ACR
+ * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 4.0 @endif
+ */
+
+#define METADATA_360_STITCHED                                  35 /**< Flag indicating if the video is stitched (Since 4.0) */
+#define METADATA_360_STITCHING_SOFTWARE                        36 /**< Software used to stitch the spherical video (Since 4.0) */
+#define METADATA_360_PROJECTION_TYPE                   37 /**< Projection type used in the video frames (Since 4.0) */
+#define METADATA_360_STEREO_MODE                               38 /**< Description of stereoscopic 3D layout (Since 4.0) */
+#define METADATA_360_SOURCE_COUNT                              39 /**< Number of cameras used to create the spherical video (Since 4.0) */
+#define METADATA_360_INIT_VIEW_HEADING                 40 /**< The heading angle of the initial view in degrees. (Since 4.0) */
+#define METADATA_360_INIT_VIEW_PITCH                   41 /**< The pitch angle of the initial view in degrees (Since 4.0) */
+#define METADATA_360_INIT_VIEW_ROLL                    42 /**< The roll angle of the initial view in degrees (Since 4.0) */
+#define METADATA_360_TIMESTAMP                                 43 /**< Epoch timestamp of when the first frame in the video was recorded (Since 4.0) */
+#define METADATA_360_FULL_PANO_WIDTH                   44 /**< Width of the encoded video frame in pixels (Since 4.0) */
+#define METADATA_360_FULL_PANO_HEIGHT                  45 /**< Height of the encoded video frame in pixels (Since 4.0) */
+#define METADATA_360_CROPPED_AREA_IMAGE_WIDTH  46 /**< Width of the video frame to display (e.g. cropping) (Since 4.0) */
+#define METADATA_360_CROPPED_AREA_IMAGE_HEIGHT 47 /**< Height of the video frame to display (e.g. cropping) (Since 4.0) */
+#define METADATA_360_CROPPED_AREA_LEFT                 48 /**< Column where the left edge of the image was cropped from the full sized panorama (Since 4.0) */
+#define METADATA_360_CROPPED_AREA_TOP                  49 /**< Row where the top edge of the image was cropped from the full sized panorama (Since 4.0) */
+#define METADATA_AMBISONIC_TYPE                                        50 /**< Ambisonics type in User Data Information (Since 4.0) */
+#define METADATA_AMBISONIC_FORMAT                              51 /**< Ambisonics format in User Data Information (Since 4.0) */
+#define METADATA_AMBISONIC_ORDER                               52 /**< Ambisonics order in User Data Information (Since 4.0) */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /*__TIZEN_MEDIA_METADATA_EXTRACTOR_TYPE_PRIVATE_H__*/
index 22b04e5e142dd5d7db5d3a0dceb616a19586e950..dd1c2243a3bf36a9c65d7aa06ef18be37e842a2a 100755 (executable)
@@ -20,6 +20,7 @@
 #include <mm_file.h>
 #include <metadata_extractor.h>
 #include <metadata_extractor_private.h>
+#include <metadata_extractor_type_private.h> /*TODO (m.alieksieie): Remove after ACR*/
 
 #define SAFE_FREE(src)      { if (src) {free(src); src = NULL; } }
 #define META_MAX_LEN   256
@@ -74,6 +75,24 @@ static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata);
 static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec);
 static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec);
 static int __metadata_extractor_get_is_360(metadata_extractor_s *metadata, int *is_360);
+static int __metadata_extractor_get_is_stitched(metadata_extractor_s *metadata, int *is_stitched);
+static int __metadata_extractor_get_projection_type(metadata_extractor_s *metadata, char **projection_type);
+static int __metadata_extractor_get_stitching_software(metadata_extractor_s *metadata, char **stitching_software);
+static int __metadata_extractor_get_stereo_mode(metadata_extractor_s *metadata, char **stereo_mode);
+static int __metadata_extractor_get_source_count(metadata_extractor_s *metadata, int *source_count);
+static int __metadata_extractor_get_initial_view_heading_degrees(metadata_extractor_s *metadata, int32_t *initial_view_heading_degrees);
+static int __metadata_extractor_get_initial_view_pitch_degrees(metadata_extractor_s *metadata, int32_t *initial_view_pitch_degrees);
+static int __metadata_extractor_get_initial_view_roll_degrees(metadata_extractor_s *metadata, int32_t *initial_view_roll_degrees);
+static int __metadata_extractor_get_timestamp(metadata_extractor_s *metadata, int *timestamp);
+static int __metadata_extractor_get_full_pano_width_pixels(metadata_extractor_s *metadata, int *full_pano_width_pixels);
+static int __metadata_extractor_get_full_pano_height_pixels(metadata_extractor_s *metadata, int *full_pano_height_pixels);
+static int __metadata_extractor_get_cropped_area_image_width(metadata_extractor_s *metadata, int *cropped_area_image_width);
+static int __metadata_extractor_get_cropped_area_image_height(metadata_extractor_s *metadata, int *cropped_area_image_height);
+static int __metadata_extractor_get_cropped_area_left(metadata_extractor_s *metadata, int *cropped_area_left);
+static int __metadata_extractor_get_cropped_area_top(metadata_extractor_s *metadata, int *cropped_area_top);
+static int __metadata_extractor_get_ambisonic_type(metadata_extractor_s *metadata, int *ambisonic_type);
+static int __metadata_extractor_get_ambisonic_format(metadata_extractor_s *metadata, int *ambisonic_format);
+static int __metadata_extractor_get_ambisonic_order(metadata_extractor_s *metadata, int *ambisonic_order);
 
 static int __metadata_extractor_check_and_extract_meta(metadata_extractor_s *metadata, metadata_extractor_type_e metadata_type)
 {
@@ -1084,7 +1103,6 @@ static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata,
        return ret;
 }
 
-
 static int __metadata_extractor_get_is_360(metadata_extractor_s *metadata, int *is_360)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
@@ -1096,7 +1114,7 @@ static int __metadata_extractor_get_is_360(metadata_extractor_s *metadata, int *
                return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
        }
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_360, &_is_360, NULL);
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL, &_is_360, NULL);
        if (ret != FILEINFO_ERROR_NONE) {
                metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
                SAFE_FREE(err_attr_name);
@@ -1108,6 +1126,411 @@ static int __metadata_extractor_get_is_360(metadata_extractor_s *metadata, int *
        return ret;
 }
 
+static int __metadata_extractor_get_is_stitched(metadata_extractor_s *metadata, int *is_stitched)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _is_stitched = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_STITCHED, &_is_stitched, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *is_stitched = _is_stitched;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_projection_type(metadata_extractor_s *metadata, char **projection_type)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       char *_projection_type = NULL;
+       int _tag_len = 0;
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name,        MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, &_projection_type, &_tag_len, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *projection_type = _projection_type;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_stitching_software(metadata_extractor_s *metadata, char **stitching_software)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       char *_stitching_software = NULL;
+       int _tag_len = 0;
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name,        MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, &_stitching_software, &_tag_len, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *stitching_software = _stitching_software;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_stereo_mode(metadata_extractor_s *metadata, char **stereo_mode)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       char *_stereo_mode = NULL;
+       int _tag_len = 0;
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name,        MM_FILE_TAG_SPHERICAL_STEREO_MODE, &_stereo_mode, &_tag_len, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *stereo_mode = _stereo_mode;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_source_count(metadata_extractor_s *metadata, int *source_count)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _source_count = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_SOURCE_COUNT, &_source_count, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *source_count = _source_count;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_initial_view_heading_degrees(metadata_extractor_s *metadata, int32_t *initial_view_heading_degrees)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _initial_view_heading_degrees = -1;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_INIT_VIEW_HEADING, &_initial_view_heading_degrees, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *initial_view_heading_degrees = _initial_view_heading_degrees;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_initial_view_pitch_degrees(metadata_extractor_s *metadata, int32_t *initial_view_pitch_degrees)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _initial_view_pitch_degrees = -1;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_INIT_VIEW_PITCH, &_initial_view_pitch_degrees, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *initial_view_pitch_degrees = _initial_view_pitch_degrees;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_initial_view_roll_degrees(metadata_extractor_s *metadata, int32_t *initial_view_roll_degrees)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _initial_view_roll_degrees = -1;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_INIT_VIEW_ROLL, &_initial_view_roll_degrees, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *initial_view_roll_degrees = _initial_view_roll_degrees;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_timestamp(metadata_extractor_s *metadata, int *timestamp)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _timestamp = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_TIMESTAMP, &_timestamp, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *timestamp = _timestamp;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_full_pano_width_pixels(metadata_extractor_s *metadata, int *full_pano_width_pixels)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _full_pano_width_pixels = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_FULL_PANO_WIDTH, &_full_pano_width_pixels, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *full_pano_width_pixels = _full_pano_width_pixels;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_full_pano_height_pixels(metadata_extractor_s *metadata, int *full_pano_height_pixels)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _full_pano_height_pixels = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_FULL_PANO_HEIGHT, &_full_pano_height_pixels, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *full_pano_height_pixels = _full_pano_height_pixels;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_cropped_area_image_width(metadata_extractor_s *metadata, int *cropped_area_image_width)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _cropped_area_image_width = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_WIDTH, &_cropped_area_image_width, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *cropped_area_image_width = _cropped_area_image_width;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_cropped_area_image_height(metadata_extractor_s *metadata, int *cropped_area_image_height)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _cropped_area_image_height = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_HEIGHT, &_cropped_area_image_height, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *cropped_area_image_height = _cropped_area_image_height;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_cropped_area_left(metadata_extractor_s *metadata, int *cropped_area_left)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _cropped_area_left = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_LEFT, &_cropped_area_left, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *cropped_area_left = _cropped_area_left;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_cropped_area_top(metadata_extractor_s *metadata, int *cropped_area_top)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _cropped_area_top = 0;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_TOP, &_cropped_area_top, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *cropped_area_top = _cropped_area_top;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_ambisonic_type(metadata_extractor_s *metadata, int *ambisonic_type)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _ambisonic_type = -1;
+       *ambisonic_type = -1;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AMBISONIC_TYPE, &_ambisonic_type, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *ambisonic_type = _ambisonic_type;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_ambisonic_format(metadata_extractor_s *metadata, int *ambisonic_format)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _ambisonic_format = -1;
+       *ambisonic_format = -1;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AMBISONIC_FORMAT, &_ambisonic_format, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *ambisonic_format = _ambisonic_format;
+
+       return ret;
+}
+
+static int __metadata_extractor_get_ambisonic_order(metadata_extractor_s *metadata, int *ambisonic_order)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int _ambisonic_order = -1;
+       *ambisonic_order = -1;
+
+       if ((!metadata) || (!metadata->tag_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AMBISONIC_ORDER, &_ambisonic_order, NULL);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
+
+       *ambisonic_order = _ambisonic_order;
+
+       return ret;
+}
+
 static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
@@ -1131,7 +1554,6 @@ static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata)
        return ret;
 }
 
-
 int metadata_extractor_create(metadata_extractor_h *metadata)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
@@ -1301,7 +1723,9 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
                        ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_ATTR);
        } else if ((attribute >= METADATA_DURATION) && (attribute < METADATA_HAS_AUDIO))
                ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_ATTR);
-       else if (((attribute > METADATA_HAS_AUDIO) && (attribute <= METADATA_ROTATE)) || (attribute == METADATA_360))
+       else if (((attribute > METADATA_HAS_AUDIO) && (attribute <= METADATA_ROTATE))
+                       || ((attribute >= METADATA_360) && (attribute <= METADATA_360_CROPPED_AREA_TOP))
+                       || ((attribute >= METADATA_AMBISONIC_TYPE) && (attribute <= METADATA_AMBISONIC_ORDER)))
                ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_TAG);
        else if ((attribute == METADATA_AUDIO_CODEC) || (attribute == METADATA_VIDEO_CODEC))
                ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_ATTR);
@@ -1315,7 +1739,7 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
 
        /*metadata_extractor_debug("attribute [%d]", attribute); */
 
-       switch (attribute) {
+       switch ((int)attribute) {  /*TODO (m.alieksieie): Remove casting after ACR*/
        case METADATA_DURATION: {
                is_string = 0;
                ret = __metadata_extractor_get_duration(_metadata, &i_value);
@@ -1491,6 +1915,96 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
                ret = __metadata_extractor_get_is_360(_metadata, &i_value);
                break;
        }
+       case METADATA_360_STITCHED: {
+               is_string = 0;
+               ret = __metadata_extractor_get_is_stitched(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_PROJECTION_TYPE: {
+               is_string = 1;
+               ret = __metadata_extractor_get_projection_type(_metadata, &s_value);
+               break;
+       }
+       case METADATA_360_STITCHING_SOFTWARE: {
+               is_string = 1;
+               ret = __metadata_extractor_get_stitching_software(_metadata, &s_value);
+               break;
+       }
+       case METADATA_360_STEREO_MODE: {
+               is_string = 1;
+               ret = __metadata_extractor_get_stereo_mode(_metadata, &s_value);
+               break;
+       }
+       case METADATA_360_SOURCE_COUNT: {
+               is_string = 0;
+               ret = __metadata_extractor_get_source_count(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_INIT_VIEW_HEADING: {
+               is_string = 0;
+               ret = __metadata_extractor_get_initial_view_heading_degrees(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_INIT_VIEW_PITCH: {
+               is_string = 0;
+               ret = __metadata_extractor_get_initial_view_pitch_degrees(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_INIT_VIEW_ROLL: {
+               is_string = 0;
+               ret = __metadata_extractor_get_initial_view_roll_degrees(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_TIMESTAMP: {
+               is_string = 0;
+               ret = __metadata_extractor_get_timestamp(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_FULL_PANO_WIDTH: {
+               is_string = 0;
+               ret = __metadata_extractor_get_full_pano_width_pixels(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_FULL_PANO_HEIGHT: {
+               is_string = 0;
+               ret = __metadata_extractor_get_full_pano_height_pixels(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_CROPPED_AREA_IMAGE_WIDTH: {
+               is_string = 0;
+               ret = __metadata_extractor_get_cropped_area_image_width(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_CROPPED_AREA_IMAGE_HEIGHT: {
+               is_string = 0;
+               ret = __metadata_extractor_get_cropped_area_image_height(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_CROPPED_AREA_LEFT: {
+               is_string = 0;
+               ret = __metadata_extractor_get_cropped_area_left(_metadata, &i_value);
+               break;
+       }
+       case METADATA_360_CROPPED_AREA_TOP: {
+               is_string = 0;
+               ret = __metadata_extractor_get_cropped_area_top(_metadata, &i_value);
+               break;
+       }
+       case METADATA_AMBISONIC_TYPE: {
+               is_string = 0;
+               ret = __metadata_extractor_get_ambisonic_type(_metadata, &i_value);
+               break;
+       }
+       case METADATA_AMBISONIC_FORMAT: {
+               is_string = 0;
+               ret = __metadata_extractor_get_ambisonic_format(_metadata, &i_value);
+               break;
+       }
+       case METADATA_AMBISONIC_ORDER: {
+               is_string = 0;
+               ret = __metadata_extractor_get_ambisonic_order(_metadata, &i_value);
+               break;
+       }
        default:
                break;
        }
index 4810983d6d8fdf07efb7860656557a979f75a2c2..f89d1d076a2dc8b13dc59a355226c3d61b0173c2 100755 (executable)
@@ -20,6 +20,7 @@
 #include <unistd.h>
 #include <stdbool.h>
 #include <metadata_extractor.h>
+#include <metadata_extractor_type_private.h> /*TODO (m.alieksieie): Remove after ACR*/
 
 #define SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
 
@@ -98,6 +99,24 @@ static bool __capi_metadata_extractor(metadata_extractor_h metadata)
        char *video_codec = NULL;
        char *audio_codec = NULL;
        char *is_360 = NULL;
+       char *is_stitched = NULL;
+       char *stitching_software = NULL;
+       char *projection_type = NULL;
+       char *stereo_mode = NULL;
+       char *source_count = NULL;
+       char *initial_view_heading_degrees = NULL;
+       char *initial_view_pitch_degrees = NULL;
+       char *initial_view_roll_degrees = NULL;
+       char *timestamp = NULL;
+       char *full_pano_width = NULL;
+       char *full_pano_height = NULL;
+       char *cropped_area_image_width = NULL;
+       char *cropped_area_image_height = NULL;
+       char *cropped_area_left = NULL;
+       char *cropped_area_top = NULL;
+       char *ambisonic_type = NULL;
+       char *ambisonic_format = NULL;
+       char *ambisonic_order = NULL;
 
        int idx = 0;
        unsigned long time_info = 0;
@@ -184,6 +203,42 @@ static bool __capi_metadata_extractor(metadata_extractor_h metadata)
        printf("video_codec = [%s]\n", video_codec);
        metadata_extractor_get_metadata(metadata, METADATA_360, &is_360);
        printf("is_360 = [%s]\n", is_360);
+       metadata_extractor_get_metadata(metadata, METADATA_360_STITCHED, &is_stitched);
+       printf("is_stitched = [%s]\n", is_stitched);
+       metadata_extractor_get_metadata(metadata, METADATA_360_STITCHING_SOFTWARE, &stitching_software);
+       printf("stitching_software = [%s]\n", stitching_software);
+       metadata_extractor_get_metadata(metadata, METADATA_360_PROJECTION_TYPE, &projection_type);
+       printf("projection_type = [%s]\n", projection_type);
+       metadata_extractor_get_metadata(metadata, METADATA_360_STEREO_MODE, &stereo_mode);
+       printf("stereo_mode = [%s]\n", stereo_mode);
+       metadata_extractor_get_metadata(metadata, METADATA_360_SOURCE_COUNT, &source_count);
+       printf("source_count = [%s]\n", source_count);
+       metadata_extractor_get_metadata(metadata, METADATA_360_INIT_VIEW_HEADING, &initial_view_heading_degrees);
+       printf("initial_view_heading_degrees = [%s]\n", initial_view_heading_degrees);
+       metadata_extractor_get_metadata(metadata, METADATA_360_INIT_VIEW_PITCH, &initial_view_pitch_degrees);
+       printf("initial_view_pitch_degrees = [%s]\n", initial_view_pitch_degrees);
+       metadata_extractor_get_metadata(metadata, METADATA_360_INIT_VIEW_ROLL, &initial_view_roll_degrees);
+       printf("initial_view_roll_degrees = [%s]\n", initial_view_roll_degrees);
+       metadata_extractor_get_metadata(metadata, METADATA_360_TIMESTAMP, &timestamp);
+       printf("timestamp = [%s]\n", timestamp);
+       metadata_extractor_get_metadata(metadata, METADATA_360_FULL_PANO_WIDTH, &full_pano_width);
+       printf("full_pano_width = [%s]\n", full_pano_width);
+       metadata_extractor_get_metadata(metadata, METADATA_360_FULL_PANO_HEIGHT, &full_pano_height);
+       printf("full_pano_height = [%s]\n", full_pano_height);
+       metadata_extractor_get_metadata(metadata, METADATA_360_CROPPED_AREA_IMAGE_WIDTH, &cropped_area_image_width);
+       printf("cropped_area_image_width = [%s]\n", cropped_area_image_width);
+       metadata_extractor_get_metadata(metadata, METADATA_360_CROPPED_AREA_IMAGE_HEIGHT, &cropped_area_image_height);
+       printf("cropped_area_image_height = [%s]\n", cropped_area_image_height);
+       metadata_extractor_get_metadata(metadata, METADATA_360_CROPPED_AREA_LEFT, &cropped_area_left);
+       printf("cropped_area_left = [%s]\n", cropped_area_left);
+       metadata_extractor_get_metadata(metadata, METADATA_360_CROPPED_AREA_TOP, &cropped_area_top);
+       printf("cropped_area_top = [%s]\n", cropped_area_top);
+       metadata_extractor_get_metadata(metadata, METADATA_AMBISONIC_TYPE, &ambisonic_type);
+       printf("ambisonic_type = [%s]\n", ambisonic_type);
+       metadata_extractor_get_metadata(metadata, METADATA_AMBISONIC_FORMAT, &ambisonic_format);
+       printf("ambisonic_format = [%s]\n", ambisonic_format);
+       metadata_extractor_get_metadata(metadata, METADATA_AMBISONIC_ORDER, &ambisonic_order);
+       printf("ambisonic_order = [%s]\n", ambisonic_order);
 
        metadata_extractor_get_metadata(metadata, METADATA_SYNCLYRICS_NUM, &synclyrics_num);
        if (synclyrics_num) {
@@ -253,6 +308,24 @@ static bool __capi_metadata_extractor(metadata_extractor_h metadata)
        SAFE_FREE(audio_codec);
        SAFE_FREE(video_codec);
        SAFE_FREE(is_360);
+       SAFE_FREE(is_stitched);
+       SAFE_FREE(stitching_software);
+       SAFE_FREE(projection_type);
+       SAFE_FREE(stereo_mode);
+       SAFE_FREE(source_count);
+       SAFE_FREE(initial_view_heading_degrees);
+       SAFE_FREE(initial_view_pitch_degrees);
+       SAFE_FREE(initial_view_roll_degrees);
+       SAFE_FREE(timestamp);
+       SAFE_FREE(full_pano_width);
+       SAFE_FREE(full_pano_height);
+       SAFE_FREE(cropped_area_image_width);
+       SAFE_FREE(cropped_area_image_height);
+       SAFE_FREE(cropped_area_left);
+       SAFE_FREE(cropped_area_top);
+       SAFE_FREE(ambisonic_type);
+       SAFE_FREE(ambisonic_format);
+       SAFE_FREE(ambisonic_order);
 
        return true;