diff --git a/dom/media/MediaContentType.h b/dom/media/MediaContentType.h index a45ee41d4462..08821257c0d3 100644 --- a/dom/media/MediaContentType.h +++ b/dom/media/MediaContentType.h @@ -17,6 +17,12 @@ namespace mozilla { class MediaContentType { public: + explicit MediaContentType(const MediaMIMEType& aType) + : mExtendedMIMEType(aType) + {} + explicit MediaContentType(MediaMIMEType&& aType) + : mExtendedMIMEType(Move(aType)) + {} explicit MediaContentType(const MediaExtendedMIMEType& aType) : mExtendedMIMEType(aType) { @@ -26,10 +32,11 @@ public: { } + const MediaMIMEType& Type() const { return mExtendedMIMEType.Type(); } const MediaExtendedMIMEType& ExtendedType() const { return mExtendedMIMEType; } // MIME "type/subtype". Guaranteed not to be empty. - const nsACString& GetMIMEType() const { return mExtendedMIMEType.Type(); } + const nsACString& GetMIMEType() const { return mExtendedMIMEType.Type().AsString(); } // Was there an explicit 'codecs' parameter provided? bool HaveCodecs() const { return mExtendedMIMEType.HaveCodecs(); } diff --git a/dom/media/MediaMIMETypes.cpp b/dom/media/MediaMIMETypes.cpp index 403ea98603d7..83dbaeb69302 100644 --- a/dom/media/MediaMIMETypes.cpp +++ b/dom/media/MediaMIMETypes.cpp @@ -10,6 +10,44 @@ namespace mozilla { +MediaMIMEType::MediaMIMEType(const nsACString& aType) + : mMIMEType(aType) +{ +} + +Maybe +MakeMediaMIMEType(const nsAString& aType) +{ + MOZ_ASSERT(NS_IsMainThread()); + + nsContentTypeParser parser(aType); + nsAutoString mime; + nsresult rv = parser.GetType(mime); + if (!NS_SUCCEEDED(rv) || mime.IsEmpty()) { + return Nothing(); + } + + NS_ConvertUTF16toUTF8 mime8{mime}; + + return Some(MediaMIMEType(mime8)); +} + +Maybe +MakeMediaMIMEType(const nsACString& aType) +{ + return MakeMediaMIMEType(NS_ConvertUTF8toUTF16(aType)); +} + +Maybe +MakeMediaMIMEType(const char* aType) +{ + if (!aType) { + return Nothing(); + } + return MakeMediaMIMEType(nsDependentCString(aType)); +} + + static int32_t GetParameterAsNumber(const nsContentTypeParser& aParser, const char* aParameter, @@ -32,9 +70,9 @@ MediaExtendedMIMEType::MediaExtendedMIMEType(const nsACString& aMIMEType, const nsAString& aCodecs, int32_t aWidth, int32_t aHeight, int32_t aFramerate, int32_t aBitrate) - : mMIMEType(Move(aMIMEType)) + : mMIMEType(aMIMEType) , mHaveCodecs(aHaveCodecs) - , mCodecs(Move(aCodecs)) + , mCodecs(aCodecs) , mWidth(aWidth) , mHeight(aHeight) , mFramerate(aFramerate) @@ -42,6 +80,16 @@ MediaExtendedMIMEType::MediaExtendedMIMEType(const nsACString& aMIMEType, { } +MediaExtendedMIMEType::MediaExtendedMIMEType(const MediaMIMEType& aType) + : mMIMEType(aType) +{ +} + +MediaExtendedMIMEType::MediaExtendedMIMEType(MediaMIMEType&& aType) + : mMIMEType(Move(aType)) +{ +} + Maybe MakeMediaExtendedMIMEType(const nsAString& aType) { diff --git a/dom/media/MediaMIMETypes.h b/dom/media/MediaMIMETypes.h index 35c937c3f967..e44564545696 100644 --- a/dom/media/MediaMIMETypes.h +++ b/dom/media/MediaMIMETypes.h @@ -12,13 +12,36 @@ namespace mozilla { +// Class containing only pre-parsed lowercase media MIME type/subtype. +class MediaMIMEType +{ +public: + // MIME "type/subtype", always lowercase. + const nsACString& AsString() const { return mMIMEType; } + +private: + friend Maybe MakeMediaMIMEType(const nsAString& aType); + friend class MediaExtendedMIMEType; + explicit MediaMIMEType(const nsACString& aType); + + nsCString mMIMEType; // UTF8 MIME "type/subtype". +}; + +Maybe MakeMediaMIMEType(const nsAString& aType); +Maybe MakeMediaMIMEType(const nsACString& aType); +Maybe MakeMediaMIMEType(const char* aType); + + // Class containing pre-parsed media MIME type parameters, e.g.: // MIME type/subtype, optional codecs, etc. class MediaExtendedMIMEType { public: + explicit MediaExtendedMIMEType(const MediaMIMEType& aType); + explicit MediaExtendedMIMEType(MediaMIMEType&& aType); + // MIME "type/subtype". - const nsACString& Type() const { return mMIMEType; } + const MediaMIMEType& Type() const { return mMIMEType; } // Was there an explicit 'codecs' parameter provided? bool HaveCodecs() const { return mHaveCodecs; } @@ -43,13 +66,13 @@ private: return (aNumber < 0) ? Maybe(Nothing()) : Some(int32_t(aNumber)); } - nsCString mMIMEType; // UTF8 MIME type. - bool mHaveCodecs; // If false, mCodecs must be empty. + MediaMIMEType mMIMEType; // MIME type/subtype. + bool mHaveCodecs = false; // If false, mCodecs must be empty. nsString mCodecs; - int32_t mWidth; // -1 if not provided. - int32_t mHeight; // -1 if not provided. - int32_t mFramerate; // -1 if not provided. - int32_t mBitrate; // -1 if not provided. + int32_t mWidth = -1; // -1 if not provided. + int32_t mHeight = -1; // -1 if not provided. + int32_t mFramerate = -1; // -1 if not provided. + int32_t mBitrate = -1; // -1 if not provided. }; Maybe MakeMediaExtendedMIMEType(const nsAString& aType);