/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #if !defined(MediaInfo_h) #define MediaInfo_h #include "nsRect.h" #include "nsRefPtr.h" #include "nsSize.h" #include "nsString.h" #include "nsTArray.h" #include "ImageTypes.h" #include "MediaData.h" #include "StreamBuffer.h" // for TrackID namespace mozilla { class TrackInfo { public: enum TrackType { kUndefinedTrack, kAudioTrack, kVideoTrack, kTextTrack }; TrackInfo(TrackType aType, const nsAString& aId, const nsAString& aKind, const nsAString& aLabel, const nsAString& aLanguage, bool aEnabled, TrackID aTrackId = TRACK_INVALID) : mId(aId) , mKind(aKind) , mLabel(aLabel) , mLanguage(aLanguage) , mEnabled(aEnabled) , mTrackId(aTrackId) , mDuration(0) , mMediaTime(0) , mType(aType) { } // Only used for backward compatibility. Do not use in new code. void Init(TrackType aType, const nsAString& aId, const nsAString& aKind, const nsAString& aLabel, const nsAString& aLanguage, bool aEnabled, TrackID aTrackId = TRACK_INVALID) { mId = aId; mKind = aKind; mLabel = aLabel; mLanguage = aLanguage; mEnabled = aEnabled; mTrackId = aTrackId; mType = aType; } // Fields common with MediaTrack object. nsString mId; nsString mKind; nsString mLabel; nsString mLanguage; bool mEnabled; TrackID mTrackId; nsAutoCString mMimeType; int64_t mDuration; int64_t mMediaTime; CryptoTrack mCrypto; bool IsAudio() const { return mType == kAudioTrack; } bool IsVideo() const { return mType == kVideoTrack; } bool IsText() const { return mType == kTextTrack; } TrackType GetType() const { return mType; } bool virtual IsValid() const = 0; private: TrackType mType; }; // Stores info relevant to presenting media frames. class VideoInfo : public TrackInfo { public: VideoInfo() : VideoInfo(-1, -1) { } VideoInfo(int32_t aWidth, int32_t aHeight) : TrackInfo(kVideoTrack, NS_LITERAL_STRING("2"), NS_LITERAL_STRING("main"), EmptyString(), EmptyString(), true, 2) , mDisplay(nsIntSize(aWidth, aHeight)) , mStereoMode(StereoMode::MONO) , mImage(nsIntSize(aWidth, aHeight)) , mExtraData(new DataBuffer) { } virtual bool IsValid() const override { return mDisplay.width > 0 && mDisplay.height > 0; } // Size in pixels at which the video is rendered. This is after it has // been scaled by its aspect ratio. nsIntSize mDisplay; // Indicates the frame layout for single track stereo videos. StereoMode mStereoMode; // Size in pixels of decoded video's image. nsIntSize mImage; nsRefPtr mExtraData; }; class AudioInfo : public TrackInfo { public: AudioInfo() : TrackInfo(kAudioTrack, NS_LITERAL_STRING("1"), NS_LITERAL_STRING("main"), EmptyString(), EmptyString(), true, 1) , mRate(0) , mChannels(0) , mBitDepth(0) , mProfile(0) , mExtendedProfile(0) , mCodecSpecificConfig(new DataBuffer) , mExtraData(new DataBuffer) { } // Sample rate. uint32_t mRate; // Number of audio channels. uint32_t mChannels; // Bits per sample. uint32_t mBitDepth; // Codec profile. int8_t mProfile; // Extended codec profile. int8_t mExtendedProfile; nsRefPtr mCodecSpecificConfig; nsRefPtr mExtraData; virtual bool IsValid() const override { return mChannels > 0 && mRate > 0; } }; class EncryptionInfo { public: struct InitData { template InitData(const nsAString& aType, AInitDatas&& aInitData) : mType(aType) , mInitData(Forward(aInitData)) { } // Encryption type to be passed to JS. Usually `cenc'. nsString mType; // Encryption data. nsTArray mInitData; }; typedef nsTArray InitDatas; // True if the stream has encryption metadata bool IsEncrypted() const { return !mInitDatas.IsEmpty(); } template void AddInitData(const nsAString& aType, AInitDatas&& aInitData) { mInitDatas.AppendElement(InitData(aType, Forward(aInitData))); } void AddInitData(const EncryptionInfo& aInfo) { mInitDatas.AppendElements(aInfo.mInitDatas); } // One 'InitData' per encrypted buffer. InitDatas mInitDatas; }; class MediaInfo { public: bool HasVideo() const { return mVideo.IsValid(); } bool HasAudio() const { return mAudio.IsValid(); } bool IsEncrypted() const { return mCrypto.IsEncrypted(); } bool HasValidMedia() const { return HasVideo() || HasAudio(); } // TODO: Store VideoInfo and AudioIndo in arrays to support multi-tracks. VideoInfo mVideo; AudioInfo mAudio; EncryptionInfo mCrypto; }; } // namespace mozilla #endif // MediaInfo_h