|
| 1 | +#include "MediaMetadatasStructures.hpp" |
| 2 | + |
| 3 | +extern "C" { |
| 4 | +#ifndef __STDC_CONSTANT_MACROS |
| 5 | + #define __STDC_CONSTANT_MACROS |
| 6 | +#endif |
| 7 | +#include <libavutil/dict.h> |
| 8 | +} |
| 9 | + |
| 10 | +#include <sstream> |
| 11 | +#include <utility> |
| 12 | + |
| 13 | +namespace avtranscoder |
| 14 | +{ |
| 15 | + |
| 16 | +namespace detail |
| 17 | +{ |
| 18 | + |
| 19 | +template<typename T> |
| 20 | +void add( MetadatasMap& dataMap, const std::string& key, const T& value ) |
| 21 | +{ |
| 22 | + std::stringstream ss; |
| 23 | + ss << value; |
| 24 | + add( dataMap, key, ss.str() ); |
| 25 | +} |
| 26 | + |
| 27 | +template<> |
| 28 | +void add( MetadatasMap& dataMap, const std::string& key, const std::string& value ) |
| 29 | +{ |
| 30 | + dataMap.push_back( std::pair<std::string, std::string>( key, value ) ); |
| 31 | +} |
| 32 | + |
| 33 | +template<> |
| 34 | +void add( MetadatasMap& dataMap, const std::string& key, const bool& value ) |
| 35 | +{ |
| 36 | + add( dataMap, key, value ? "True" : "False" ); |
| 37 | +} |
| 38 | + |
| 39 | +void fillMetadataDictionnary( AVDictionary* avdictionnary, MetadatasMap& metadata ) |
| 40 | +{ |
| 41 | + AVDictionaryEntry* tag = NULL; |
| 42 | + while( ( tag = av_dict_get( avdictionnary, "", tag, AV_DICT_IGNORE_SUFFIX ) ) ) |
| 43 | + { |
| 44 | + metadata.push_back( std::pair<std::string, std::string>( tag->key, tag->value ) ); |
| 45 | + } |
| 46 | +} |
| 47 | + |
| 48 | +} |
| 49 | + |
| 50 | +MetadatasMap VideoProperties::getDataMap() const |
| 51 | +{ |
| 52 | + MetadatasMap dataMap; |
| 53 | + |
| 54 | + detail::add( dataMap, "stream id", streamId ); |
| 55 | + detail::add( dataMap, "codec id", codecId ); |
| 56 | + detail::add( dataMap, "codec name", codecName ); |
| 57 | + detail::add( dataMap, "codec long name", codecLongName ); |
| 58 | + detail::add( dataMap, "profile", profile ); |
| 59 | + detail::add( dataMap, "profile name", profileName ); |
| 60 | + detail::add( dataMap, "level", level ); |
| 61 | + detail::add( dataMap, "start timecode", startTimecode ); |
| 62 | + detail::add( dataMap, "width", width ); |
| 63 | + detail::add( dataMap, "height", height ); |
| 64 | + detail::add( dataMap, "pixel aspect ratio", sar.num / sar.den ); |
| 65 | + detail::add( dataMap, "display aspect ratio", dar.num / dar.den ); |
| 66 | + detail::add( dataMap, "dtgActiveFormat", dtgActiveFormat ); |
| 67 | + detail::add( dataMap, "components count", componentsCount ); |
| 68 | + detail::add( dataMap, "pixel type", pixelName ); |
| 69 | + detail::add( dataMap, "bit wise acked", bitWisePacked ); |
| 70 | + detail::add( dataMap, "rgb pixel", rgbPixelData ); |
| 71 | + detail::add( dataMap, "as alpha", asAlpha ); |
| 72 | + detail::add( dataMap, "chroma width", chromaWidth ); |
| 73 | + detail::add( dataMap, "chroma height", chromaHeight ); |
| 74 | + detail::add( dataMap, "endianess", endianess ); |
| 75 | + detail::add( dataMap, "color transfert", colorTransfert ); |
| 76 | + detail::add( dataMap, "colorspace", colorspace ); |
| 77 | + detail::add( dataMap, "color range", colorRange ); |
| 78 | + detail::add( dataMap, "color primaries", colorPrimaries ); |
| 79 | + detail::add( dataMap, "indexed colors", indexedColors ); |
| 80 | + detail::add( dataMap, "pseudo paletted", pseudoPaletted ); |
| 81 | + detail::add( dataMap, "chroma sample location", chromaSampleLocation); |
| 82 | + detail::add( dataMap, "interlaced ", isInterlaced ); |
| 83 | + detail::add( dataMap, "top field first", topFieldFirst ); |
| 84 | + detail::add( dataMap, "field order", fieldOrder); |
| 85 | + detail::add( dataMap, "timeBase", timeBase.num / timeBase.den ); |
| 86 | + detail::add( dataMap, "fps", fps ); |
| 87 | + detail::add( dataMap, "ticksPerFrame", ticksPerFrame ); |
| 88 | + detail::add( dataMap, "bit rate", bitRate ); |
| 89 | + detail::add( dataMap, "max bit rate", maxBitRate ); |
| 90 | + detail::add( dataMap, "min bit rate", minBitRate ); |
| 91 | + detail::add( dataMap, "gop size", gopSize ); |
| 92 | + |
| 93 | + std::string gop; |
| 94 | + for( size_t frameIndex = 0; frameIndex < gopStructure.size(); ++frameIndex ) |
| 95 | + { |
| 96 | + gop += gopStructure.at( frameIndex ).first; |
| 97 | + gop += ( gopStructure.at( frameIndex ).second ? "*" : " " ); |
| 98 | + } |
| 99 | + detail::add( dataMap, "gop", gop ); |
| 100 | + |
| 101 | + detail::add( dataMap, "has B frames", hasBFrames ); |
| 102 | + detail::add( dataMap, "references frames", referencesFrames ); |
| 103 | + |
| 104 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 105 | + { |
| 106 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 107 | + } |
| 108 | + |
| 109 | + return dataMap; |
| 110 | +} |
| 111 | + |
| 112 | +MetadatasMap AudioProperties::getDataMap() const |
| 113 | +{ |
| 114 | + MetadatasMap dataMap; |
| 115 | + |
| 116 | + detail::add( dataMap, "stream id", streamId ); |
| 117 | + detail::add( dataMap, "codec id", codecId ); |
| 118 | + detail::add( dataMap, "codec name", codecName ); |
| 119 | + detail::add( dataMap, "codec long name", codecLongName ); |
| 120 | + detail::add( dataMap, "sample format", sampleFormat ); |
| 121 | + detail::add( dataMap, "sample rate", sampleRate ); |
| 122 | + detail::add( dataMap, "bit rate", bit_rate ); |
| 123 | + detail::add( dataMap, "channels", channels ); |
| 124 | + detail::add( dataMap, "channel layout", channelLayout ); |
| 125 | + detail::add( dataMap, "channel name", channelName ); |
| 126 | + detail::add( dataMap, "channel description", channelDescription ); |
| 127 | + |
| 128 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 129 | + { |
| 130 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 131 | + } |
| 132 | + |
| 133 | + return dataMap; |
| 134 | +} |
| 135 | + |
| 136 | +MetadatasMap DataProperties::getDataMap() const |
| 137 | +{ |
| 138 | + MetadatasMap dataMap; |
| 139 | + |
| 140 | + detail::add( dataMap, "streamId", streamId ); |
| 141 | + |
| 142 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 143 | + { |
| 144 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 145 | + } |
| 146 | + |
| 147 | + return dataMap; |
| 148 | +} |
| 149 | + |
| 150 | +MetadatasMap SubtitleProperties::getDataMap() const |
| 151 | +{ |
| 152 | + MetadatasMap dataMap; |
| 153 | + |
| 154 | + detail::add( dataMap, "streamId", streamId ); |
| 155 | + |
| 156 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 157 | + { |
| 158 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 159 | + } |
| 160 | + |
| 161 | + return dataMap; |
| 162 | +} |
| 163 | + |
| 164 | +MetadatasMap AttachementProperties::getDataMap() const |
| 165 | +{ |
| 166 | + MetadatasMap dataMap; |
| 167 | + |
| 168 | + detail::add( dataMap, "streamId", streamId ); |
| 169 | + |
| 170 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 171 | + { |
| 172 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 173 | + } |
| 174 | + |
| 175 | + return dataMap; |
| 176 | +} |
| 177 | + |
| 178 | +MetadatasMap UnknownProperties::getDataMap() const |
| 179 | +{ |
| 180 | + MetadatasMap dataMap; |
| 181 | + |
| 182 | + detail::add( dataMap, "streamId", streamId ); |
| 183 | + |
| 184 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 185 | + { |
| 186 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 187 | + } |
| 188 | + |
| 189 | + return dataMap; |
| 190 | +} |
| 191 | + |
| 192 | +MetadatasMap Properties::getDataMap() const |
| 193 | +{ |
| 194 | + MetadatasMap dataMap; |
| 195 | + |
| 196 | + detail::add( dataMap, "filename", filename ); |
| 197 | + detail::add( dataMap, "format name", formatName ); |
| 198 | + detail::add( dataMap, "format long name", formatLongName ); |
| 199 | + |
| 200 | + detail::add( dataMap, "start time", startTime ); |
| 201 | + detail::add( dataMap, "duration", duration ); |
| 202 | + detail::add( dataMap, "bitrate", bitRate ); |
| 203 | + detail::add( dataMap, "number of streams", streamsCount ); |
| 204 | + detail::add( dataMap, "number of programs", programsCount ); |
| 205 | + detail::add( dataMap, "number of video streams", videoStreams.size() ); |
| 206 | + detail::add( dataMap, "number of audio streams", audioStreams.size() ); |
| 207 | + detail::add( dataMap, "number of data streams", dataStreams.size() ); |
| 208 | + detail::add( dataMap, "number of subtitle streams", subtitleStreams.size() ); |
| 209 | + detail::add( dataMap, "number of attachement streams", attachementStreams.size() ); |
| 210 | + detail::add( dataMap, "number of unknown streams", unknownStreams.size() ); |
| 211 | + |
| 212 | + for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) |
| 213 | + { |
| 214 | + detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); |
| 215 | + } |
| 216 | + |
| 217 | + return dataMap; |
| 218 | +} |
| 219 | + |
| 220 | +} |
0 commit comments