[ACR-593] Add attributes(video codec, audio codec) 45/67245/4 accepted/tizen/common/20160428.144623 accepted/tizen/ivi/20160428.081815 accepted/tizen/mobile/20160428.081857 accepted/tizen/tv/20160428.081919 accepted/tizen/wearable/20160428.081847 submit/tizen/20160428.025307
authorMinje Ahn <minje.ahn@samsung.com>
Tue, 26 Apr 2016 04:44:31 +0000 (13:44 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Tue, 26 Apr 2016 08:34:12 +0000 (17:34 +0900)
Change-Id: Ifc7408abe65087bc2c378d047e8c7120ef414758
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
include/metadata_extractor.h
include/metadata_extractor_type.h
src/metadata_extractor.c

index b238fa4..da63d8f 100755 (executable)
@@ -39,7 +39,7 @@ extern "C" {
 
 /**
  * @brief Creates metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @remarks You must release @a metadata using metadata_extractor_destroy().
  *
  * @param[in] metadata The handle to metadata
@@ -55,7 +55,7 @@ int metadata_extractor_create(metadata_extractor_h *metadata);
 
 /**
  * @brief Sets the file path to extract.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @param [in] metadata The handle to metadata
  * @param [in] path The path to extract metadata
  * @return @c 0 on success,
@@ -73,7 +73,7 @@ int metadata_extractor_set_path(metadata_extractor_h metadata, const char *path)
 
 /**
  * @brief Sets the buffer to extract.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @param [in] metadata The handle to metadata
  * @param [in] buffer The buffer to extract metadata
  * @param [in] size The buffer size
@@ -91,7 +91,7 @@ int metadata_extractor_set_buffer(metadata_extractor_h metadata, const void *buf
 
 /**
  * @brief Destroys metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @param [in] metadata The handle to metadata
  * @return @c 0 on success,
  *         otherwise a negative error value
@@ -106,7 +106,7 @@ int metadata_extractor_destroy(metadata_extractor_h metadata);
 
 /**
  * @brief Gets metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a value using @c free(). \n
  *                   In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n
@@ -130,7 +130,7 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
 
 /**
  * @brief Gets the artwork image in a media file.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a artwork and @a artwork_mime using @c free(). \n
  *                   In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n
@@ -155,7 +155,7 @@ int metadata_extractor_get_artwork(metadata_extractor_h metadata, void **artwork
 
 /**
  * @brief Gets the frame of a video media file.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a frame using @c free().
  *                   In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n
@@ -179,7 +179,7 @@ int metadata_extractor_get_frame(metadata_extractor_h metadata, void **frame, in
 
 /**
  * @brief Gets the synclyrics of a media file.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a lyrics using @c free().
  *                   In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n
@@ -204,7 +204,7 @@ int metadata_extractor_get_synclyrics(metadata_extractor_h metadata, int index,
 
 /**
  * @brief Gets the frame of a video media.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a frame using @c free().
  *                   In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n
index b78cff4..89b16c6 100755 (executable)
@@ -32,12 +32,12 @@ extern "C" {
 * @{
 */
 
-/** @brief Definition for Content Error Class */
 #define METADATA_EXTRACTOR_ERROR_CLASS                         TIZEN_ERROR_METADATA_EXTRACTOR
 
 /**
  * @ingroup CAPI_METADATA_EXTRACTOR_MODULE
  * @brief Enumeration for metadata extractor error.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
        METADATA_EXTRACTOR_ERROR_NONE = TIZEN_ERROR_NONE,         /**< Successful */
@@ -52,6 +52,7 @@ typedef enum {
 /**
  * @ingroup CAPI_METADATA_EXTRACTOR_MODULE
  * @brief Enumeration for attribute.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
        METADATA_DURATION       = 0,                    /**< Duration */
@@ -86,11 +87,14 @@ typedef enum {
        METADATA_SYNCLYRICS_NUM,                /**< Synchronized lyric (time/lyric set) number */
        METADATA_RECDATE,                               /**< Recording date */
        METADATA_ROTATE,                                        /**< Rotate(Orientation) Information */
+       METADATA_VIDEO_CODEC,                   /**< Video Codec (Since 3.0) */
+       METADATA_AUDIO_CODEC,                   /**< Audio Codec (Since 3.0) */
 } metadata_extractor_attr_e;
 
 /**
  * @ingroup CAPI_METADATA_EXTRACTOR_MODULE
  * @brief The metadata extractor handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct metadata_extractor_s *metadata_extractor_h;
 
index 83ab272..80213ce 100755 (executable)
@@ -71,6 +71,8 @@ static int __metadata_extractor_get_recording_date(metadata_extractor_s *metadat
 static int __metadata_extractor_get_rotate(metadata_extractor_s *metadata, char **rotate);
 static int __metadata_extractor_get_synclyrics_pair_num(metadata_extractor_s *metadata, int *synclyrics_num);
 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_check_and_extract_meta(metadata_extractor_s *metadata, metadata_extractor_type_e metadata_type)
 {
@@ -1002,6 +1004,85 @@ static int __metadata_extractor_get_synclyrics_pair_num(metadata_extractor_s *me
        return ret;
 }
 
+static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int audio_codec_idx = 0;
+       int audio_codec_cnt = 45;
+
+       const char *AudioCodecTypeString[] = {
+               "AMR", "G723.1", "MP3", "OGG", "AAC", "WMA", "MMF", "ADPCM", "WAVE", "WAVE NEW", "MIDI", "IMELODY", "MXMF", "MPEG1-Layer1 codec", "MPEG1-Layer2 codec",
+               "G711", "G722", "G722.1",       "G722.2  (AMR-WB)", "G723 wideband speech", "G726 (ADPCM)", "G728 speech",      "G729", "G729a",        "G729.1",
+               "Real",
+               "AAC-Low complexity",   "AAC-Main profile", "AAC-Scalable sample rate", "AAC-Long term prediction", "AAC-High Efficiency v1",   "AAC-High efficiency v2",
+               "DolbyDigital", "Apple Lossless",       "Sony proprietary", "SPEEX",    "Vorbis",       "AIFF", "AU",   "None (will be deprecated)",
+               "PCM",  "ALAW", "MULAW",        "MS ADPCM", "FLAC"
+       };
+
+       if ((!metadata) || (!metadata->attr_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       if (metadata->audio_track_cnt > 0) {
+               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_CODEC, &audio_codec_idx, 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;
+               }
+       }
+
+       if (audio_codec_idx < audio_codec_cnt)
+               *audio_codec = strdup(AudioCodecTypeString[audio_codec_idx]);
+       else {
+               metadata_extractor_error("Invalid Audio Codec [%d]", audio_codec_idx);
+               *audio_codec = NULL;
+       }
+
+       return ret;
+}
+
+static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec)
+{
+       int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       char *err_attr_name = NULL;
+       int video_codec_idx = 0;
+       int video_codec_cnt = 29;
+
+       const char *VideoCodecTypeString[] = {
+               "None (will be deprecated)",
+               "H263", "H264", "H26L", "MPEG4", "MPEG1", "WMV", "DIVX", "XVID", "H261", "H262/MPEG2-part2", "H263v2",  "H263v3",
+               "Motion JPEG", "MPEG2", "MPEG4 part-2 Simple profile",  "MPEG4 part-2 Advanced Simple profile", "MPEG4 part-2 Main profile",
+               "MPEG4 part-2 Core profile", "MPEG4 part-2 Adv Coding Eff profile", "MPEG4 part-2 Adv RealTime Simple profile",
+               "MPEG4 part-10 (h.264)",        "Real", "VC-1", "AVS",  "Cinepak",      "Indeo",        "Theora", "Flv"
+       };
+
+       if ((!metadata) || (!metadata->attr_h)) {
+               metadata_extractor_error("INVALID_PARAMETER(0x%08x)", METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER);
+               return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       if (metadata->video_track_cnt > 0) {
+               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_CODEC, &video_codec_idx, 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;
+               }
+       }
+
+       if (video_codec_idx < video_codec_cnt)
+               *video_codec = strdup(VideoCodecTypeString[video_codec_idx]);
+       else {
+               metadata_extractor_error("Invalid Video Codec[%d]", video_codec_idx);
+               *video_codec = NULL;
+       }
+
+       return ret;
+}
+
 static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
@@ -1197,6 +1278,8 @@ 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_HAS_AUDIO) && (attribute <= METADATA_ROTATE))
                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);
        else {
                metadata_extractor_error("INVALID_PARAMETER [%d]", attribute);
                ret = METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
@@ -1213,6 +1296,11 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
                ret = __metadata_extractor_get_duration(_metadata, &i_value);
                break;
        }
+       case METADATA_VIDEO_CODEC: {
+               is_string = 1;
+               ret = __metadata_extractor_get_video_codec(_metadata, &s_value);
+               break;
+       }
        case METADATA_VIDEO_BITRATE: {
                is_string = 0;
                ret = __metadata_extractor_get_video_bitrate(_metadata, &i_value);
@@ -1238,6 +1326,11 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
                ret = __metadata_extractor_get_video_track_count(_metadata, &i_value);
                break;
        }
+       case METADATA_AUDIO_CODEC: {
+               is_string = 1;
+               ret = __metadata_extractor_get_audio_codec(_metadata, &s_value);
+               break;
+       }
        case METADATA_AUDIO_BITRATE: {
                is_string = 0;
                ret = __metadata_extractor_get_audio_bitrate(_metadata, &i_value);