shaka-packager/packager/hls/base/media_playlist.h

178 lines
6.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2016 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#ifndef PACKAGER_HLS_BASE_MEDIA_PLAYLIST_H_
#define PACKAGER_HLS_BASE_MEDIA_PLAYLIST_H_
#include <list>
#include <string>
#include "packager/base/macros.h"
#include "packager/base/memory/scoped_ptr.h"
#include "packager/base/stl_util.h"
#include "packager/mpd/base/media_info.pb.h"
namespace edash_packager {
namespace media {
class File;
} // namespace media
namespace hls {
class HlsEntry {
public:
enum class EntryType {
kExtInf,
kExtKey,
};
virtual ~HlsEntry();
EntryType type() const { return type_; }
virtual std::string ToString() = 0;
protected:
explicit HlsEntry(EntryType type);
private:
EntryType type_;
};
/// Methods are virtual for mocking.
class MediaPlaylist {
public:
enum class MediaPlaylistType {
kPlaylistUnknown,
kPlayListAudio,
kPlayListVideo,
kPlayListSubtitle,
};
enum class EncryptionMethod {
kNone, // No encryption, i.e. clear.
kAes128, // Completely encrypted using AES-CBC.
kSampleAes, // Encrypted using Sample AES method.
};
/// @param file_name is the file name of this media playlist.
/// @param name is the name of this playlist. In other words this is the
/// value of the NAME attribute for EXT-X-MEDIA. This is not
/// necessarily the same as @a file_name.
/// @param group_id is the group ID for this playlist. This is the value of
/// GROUP-ID attribute for EXT-X-MEDIA.
MediaPlaylist(
const std::string& file_name,
const std::string& name,
const std::string& group_id);
virtual ~MediaPlaylist();
const std::string& file_name() const { return file_name_; }
const std::string& name() const { return name_; }
const std::string& group_id() const { return group_id_; }
MediaPlaylistType type() const { return type_; }
const std::string& codec() const { return codec_; }
/// For testing only.
void SetTypeForTesting(MediaPlaylistType type);
/// For testing only.
void SetCodecForTesting(const std::string& codec);
/// This must succeed before calling any other public methods.
/// @param media_info is the info of the segments that are going to be added
/// to this playlist.
/// @return true on success, false otherwise.
virtual bool SetMediaInfo(const MediaInfo& media_info);
/// Segments must be added in order.
/// @param file_name is the file name of the segment.
/// @param duration is in terms of the timescale of the media.
/// @param size is size in bytes.
virtual void AddSegment(const std::string& file_name,
uint64_t duration,
uint64_t size);
/// Removes the oldest segment from the playlist. Useful for manually managing
/// the length of the playlist.
virtual void RemoveOldestSegment();
/// All segments added after calling this method must be decryptable with
/// the key that can be fetched from |url|, until calling this again.
/// @param method is the encryption method.
/// @param url specifies where the key is i.e. the value of the URI attribute.
/// @param iv is the initialization vector in human readable format, i.e. the
/// value for IV attribute. This may be empty.
/// @param key_format is the key format, i.e. the KEYFORMAT value. This may be
/// empty.
/// @param key_format_versions is the KEYFORMATVERIONS value. This may be
/// empty.
virtual void AddEncryptionInfo(EncryptionMethod method,
const std::string& url,
const std::string& iv,
const std::string& key_format,
const std::string& key_format_versions);
/// Write the playlist to |file|.
/// This does not close the file.
/// If target duration is not set expliticly, this will try to find the target
/// duration. Note that target duration cannot be changed. So calling this
/// without explicitly setting the target duration and before adding any
/// segments will end up setting the target duration to 0 and will always
/// generate an invalid playlist.
/// @param file is the output file.
/// @return true on success, false otherwise.
virtual bool WriteToFile(media::File* file);
/// If bitrate is specified in MediaInfo then it will use that value.
/// Otherwise, it is calculated from the duration and the size of the
/// segments added to this object.
/// @return the bitrate of this MediaPlaylist.
virtual uint64_t Bitrate() const;
/// @return the longest segments duration. This will return 0 if no
/// segments have been added.
virtual double GetLongestSegmentDuration() const;
/// Set the target duration of this MediaPlaylist.
/// In other words this is the value for EXT-X-TARGETDURATION.
/// If this is not called before calling Write(), it will estimate the best
/// target duration.
/// The spec does not allow changing EXT-X-TARGETDURATION, once Write() is
/// called, this will fail.
/// @param target_duration is the target duration for this playlist.
/// @return true if set, false otherwise.
virtual bool SetTargetDuration(uint32_t target_duration);
private:
// Mainly for MasterPlaylist to use these values.
const std::string file_name_;
const std::string name_;
const std::string group_id_;
MediaInfo media_info_;
MediaPlaylistType type_ = MediaPlaylistType::kPlaylistUnknown;
std::string codec_;
double longest_segment_duration_ = 0.0;
uint32_t time_scale_ = 0;
uint64_t total_segments_size_ = 0;
double total_duration_in_seconds_ = 0.0;
int total_num_segments_;
// See SetTargetDuration() comments.
bool target_duration_set_ = false;
uint32_t target_duration_ = 0;
std::list<HlsEntry*> entries_;
STLElementDeleter<decltype(entries_)> entries_deleter_;
DISALLOW_COPY_AND_ASSIGN(MediaPlaylist);
};
} // namespace hls
} // namespace edash_packager
#endif // PACKAGER_HLS_BASE_MEDIA_PLAYLIST_H_