#ifndef MEDIA_FORMATS_HLS_MEDIA_SEGMENT_H_
#define MEDIA_FORMATS_HLS_MEDIA_SEGMENT_H_
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "media/base/media_export.h"
#include "media/formats/hls/tags.h"
#include "media/formats/hls/types.h"
#include "url/gurl.h"
namespace media::hls {
class MEDIA_EXPORT MediaSegment : public base::RefCounted<MediaSegment> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
class MEDIA_EXPORT InitializationSegment
: public base::RefCounted<InitializationSegment> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
InitializationSegment(GURL uri, std::optional<types::ByteRange>);
InitializationSegment(const InitializationSegment& copy) = delete;
InitializationSegment(InitializationSegment&& copy) = delete;
InitializationSegment& operator=(const InitializationSegment& copy) =
delete;
InitializationSegment& operator=(InitializationSegment&& copy) = delete;
const GURL& GetUri() const { return uri_; }
std::optional<types::ByteRange> GetByteRange() const { return byte_range_; }
private:
friend class base::RefCounted<InitializationSegment>;
~InitializationSegment();
GURL uri_;
std::optional<types::ByteRange> byte_range_;
};
class MEDIA_EXPORT EncryptionData : public base::RefCounted<EncryptionData> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
using IVType = types::parsing::HexRepr<128>;
using IVContainer = std::optional<IVType::Container>;
EncryptionData(GURL uri,
XKeyTagMethod method,
XKeyTagKeyFormat format,
IVContainer iv);
EncryptionData(const EncryptionData& copy) = delete;
EncryptionData(EncryptionData&& copy) = delete;
EncryptionData& operator=(const EncryptionData& copy) = delete;
EncryptionData& operator=(EncryptionData&& copy) = delete;
const GURL& GetUri() const { return uri_; }
XKeyTagMethod GetMethod() const { return method_; }
std::vector<uint8_t> GetKey() const { return key_; }
XKeyTagKeyFormat GetKeyFormat() const { return format_; }
bool NeedsKeyFetch() const { return key_.empty(); }
IVContainer GetIV(types::DecimalInteger media_sequence_number) const;
std::optional<std::string> GetIVStr(
types::DecimalInteger media_sequence_number) const;
void ImportKey(std::string_view key_content);
private:
friend class base::RefCounted<EncryptionData>;
~EncryptionData();
const GURL uri_;
const XKeyTagMethod method_;
const IVContainer iv_;
const XKeyTagKeyFormat format_;
std::vector<uint8_t> key_;
};
MediaSegment(base::TimeDelta duration,
types::DecimalInteger media_sequence_number,
types::DecimalInteger discontinuity_sequence_number,
GURL uri,
scoped_refptr<InitializationSegment> initialization_segment,
scoped_refptr<EncryptionData> encryption_data,
std::optional<types::ByteRange> byte_range,
std::optional<types::DecimalInteger> bitrate,
bool has_discontinuity,
bool is_gap,
bool has_new_init_segment,
bool has_new_encryption_data);
MediaSegment(const MediaSegment&) = delete;
MediaSegment(MediaSegment&&) = delete;
MediaSegment& operator=(const MediaSegment&) = delete;
MediaSegment& operator=(MediaSegment&&) = delete;
base::TimeDelta GetDuration() const { return duration_; }
types::DecimalInteger GetMediaSequenceNumber() const {
return media_sequence_number_;
}
types::DecimalInteger GetDiscontinuitySequenceNumber() const {
return discontinuity_sequence_number_;
}
const GURL& GetUri() const { return uri_; }
scoped_refptr<InitializationSegment> GetInitializationSegment() const {
return initialization_segment_;
}
bool HasNewInitSegment() const { return has_new_init_segment_; }
scoped_refptr<EncryptionData> GetEncryptionData() const {
return encryption_data_;
}
bool HasNewEncryptionData() const { return has_new_encryption_data_; }
std::optional<types::ByteRange> GetByteRange() const { return byte_range_; }
bool HasDiscontinuity() const { return has_discontinuity_; }
bool IsGap() const { return is_gap_; }
std::optional<types::DecimalInteger> GetBitRate() const { return bitrate_; }
bool GetPlaintextStreamSource(base::span<const uint8_t> src,
base::span<const uint8_t>* dest,
std::vector<uint8_t>* mem) const;
private:
friend class base::RefCounted<MediaSegment>;
~MediaSegment();
base::TimeDelta duration_;
types::DecimalInteger media_sequence_number_;
types::DecimalInteger discontinuity_sequence_number_;
GURL uri_;
scoped_refptr<InitializationSegment> initialization_segment_;
scoped_refptr<EncryptionData> encryption_data_;
std::optional<types::ByteRange> byte_range_;
std::optional<types::DecimalInteger> bitrate_;
bool has_discontinuity_;
bool is_gap_;
bool has_new_init_segment_;
bool has_new_encryption_data_;
};
}
#endif