From: Mykola Alieksieiev Date: Tue, 4 Apr 2017 17:36:30 +0000 (+0300) Subject: Add support for Spherical Video and Ambisonics Audio Metadata X-Git-Tag: submit/tizen/20170721.015330~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c1ada51f27a2490026adf1a7f906337b0854a8c7;p=platform%2Fcore%2Fapi%2Fmetadata-extractor.git Add support for Spherical Video and Ambisonics Audio Metadata Change-Id: Idd877625bd4ed44f82c646c7058f5b00302e5573 Signed-off-by: Mykola Alieksieiev --- diff --git a/include/metadata_extractor_type.h b/include/metadata_extractor_type.h index 7ae6caf..3af1f42 100755 --- a/include/metadata_extractor_type.h +++ b/include/metadata_extractor_type.h @@ -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 index 0000000..d52f830 --- /dev/null +++ b/include/metadata_extractor_type_private.h @@ -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__*/ diff --git a/src/metadata_extractor.c b/src/metadata_extractor.c index 22b04e5..dd1c224 100755 --- a/src/metadata_extractor.c +++ b/src/metadata_extractor.c @@ -20,6 +20,7 @@ #include #include #include +#include /*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; } diff --git a/test/metadata_extractor_test.c b/test/metadata_extractor_test.c index 4810983..f89d1d0 100755 --- a/test/metadata_extractor_test.c +++ b/test/metadata_extractor_test.c @@ -20,6 +20,7 @@ #include #include #include +#include /*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, ×tamp); + 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;