2014-02-14 23:21:05 +00:00
|
|
|
// Copyright 2014 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
|
|
|
|
//
|
2013-12-05 23:13:35 +00:00
|
|
|
// MpdNotifier is responsible for notifying the MpdBuilder class to generate an
|
|
|
|
// MPD file.
|
2014-02-14 23:21:05 +00:00
|
|
|
|
2013-12-05 23:13:35 +00:00
|
|
|
#ifndef MPD_BASE_MPD_NOTIFIER_H_
|
|
|
|
#define MPD_BASE_MPD_NOTIFIER_H_
|
|
|
|
|
2014-09-30 23:52:58 +00:00
|
|
|
#include <stdint.h>
|
2015-09-24 22:03:52 +00:00
|
|
|
#include <string>
|
2015-08-26 20:25:29 +00:00
|
|
|
#include <vector>
|
2013-12-05 23:13:35 +00:00
|
|
|
|
2015-07-22 06:57:21 +00:00
|
|
|
#include "packager/base/macros.h"
|
|
|
|
|
2014-09-19 20:41:13 +00:00
|
|
|
namespace edash_packager {
|
2013-12-05 23:13:35 +00:00
|
|
|
|
|
|
|
class MediaInfo;
|
2014-05-19 21:30:58 +00:00
|
|
|
struct ContentProtectionElement;
|
2013-12-05 23:13:35 +00:00
|
|
|
|
2014-05-16 23:32:10 +00:00
|
|
|
enum DashProfile {
|
|
|
|
kUnknownProfile,
|
|
|
|
kOnDemandProfile,
|
|
|
|
kLiveProfile,
|
|
|
|
};
|
|
|
|
|
2014-02-06 21:20:36 +00:00
|
|
|
/// Interface for publish/subscribe publisher class which notifies MpdBuilder
|
|
|
|
/// of media-related events.
|
2013-12-05 23:13:35 +00:00
|
|
|
class MpdNotifier {
|
|
|
|
public:
|
2014-05-16 23:32:10 +00:00
|
|
|
MpdNotifier(DashProfile dash_profile) : dash_profile_(dash_profile) {};
|
2013-12-05 23:13:35 +00:00
|
|
|
virtual ~MpdNotifier() {};
|
|
|
|
|
2014-02-06 21:20:36 +00:00
|
|
|
/// Initializes the notifier. For example, if this notifier uses a network for
|
|
|
|
/// notification, then this would set up the connection with the remote host.
|
|
|
|
/// @return true on success, false otherwise.
|
2013-12-05 23:13:35 +00:00
|
|
|
virtual bool Init() = 0;
|
|
|
|
|
2014-02-06 21:20:36 +00:00
|
|
|
/// Notifies the MpdBuilder that there is a new container along with
|
|
|
|
/// @a media_info. Live may have multiple files (segments) but those should be
|
|
|
|
/// notified via NotifyNewSegment().
|
|
|
|
/// @param media_info is the MediaInfo that will be passed to MpdBuilder.
|
|
|
|
/// @param[out] container_id is the numeric ID of the container, possibly for
|
|
|
|
/// NotifyNewSegment() and AddContentProtectionElement(). Only
|
|
|
|
/// populated on success.
|
|
|
|
/// @return true on success, false otherwise.
|
2013-12-05 23:13:35 +00:00
|
|
|
virtual bool NotifyNewContainer(const MediaInfo& media_info,
|
2014-09-30 21:52:21 +00:00
|
|
|
uint32_t* container_id) = 0;
|
2013-12-05 23:13:35 +00:00
|
|
|
|
2015-06-15 21:12:42 +00:00
|
|
|
/// Change the sample duration of container with @a container_id.
|
|
|
|
/// @param container_id Container ID obtained from calling
|
|
|
|
/// NotifyNewContainer().
|
|
|
|
/// @param sample_duration is the duration of a sample in timescale of the
|
|
|
|
/// media.
|
|
|
|
/// @return true on success, false otherwise. This may fail if the container
|
|
|
|
/// specified by @a container_id does not exist.
|
|
|
|
virtual bool NotifySampleDuration(uint32_t container_id,
|
|
|
|
uint32_t sample_duration) = 0;
|
|
|
|
|
2015-07-21 21:52:20 +00:00
|
|
|
/// Notifies MpdBuilder that there is a new segment ready. For live, this
|
|
|
|
/// is usually a new segment, for VOD this is usually a subsegment.
|
2014-02-06 21:20:36 +00:00
|
|
|
/// @param container_id Container ID obtained from calling
|
|
|
|
/// NotifyNewContainer().
|
|
|
|
/// @param start_time is the start time of the new segment, in units of the
|
|
|
|
/// stream's time scale.
|
|
|
|
/// @param duration is the duration of the new segment, in units of the
|
2014-05-30 05:01:09 +00:00
|
|
|
/// stream's time scale.
|
|
|
|
/// @param size is the new segment size in bytes.
|
2014-02-06 21:20:36 +00:00
|
|
|
/// @return true on success, false otherwise.
|
2014-09-30 21:52:21 +00:00
|
|
|
virtual bool NotifyNewSegment(uint32_t container_id,
|
|
|
|
uint64_t start_time,
|
|
|
|
uint64_t duration,
|
|
|
|
uint64_t size) = 0;
|
2013-12-05 23:13:35 +00:00
|
|
|
|
2015-08-26 20:25:29 +00:00
|
|
|
/// Notifiers MpdBuilder that there is a new PSSH for the container.
|
|
|
|
/// This may be called whenever the key has to change, e.g. key rotation.
|
|
|
|
/// @param container_id Container ID obtained from calling
|
|
|
|
/// NotifyNewContainer().
|
2015-09-24 22:03:52 +00:00
|
|
|
/// @param drm_uuid is the UUID of the DRM for encryption.
|
2015-08-26 20:25:29 +00:00
|
|
|
/// @param new_key_id is the new key ID for the key.
|
|
|
|
/// @param new_pssh is the new pssh box (including the header).
|
|
|
|
/// @attention This might change or get removed once DASH IF IOP specification
|
|
|
|
/// writes a clear guideline on how to handle key rotation.
|
|
|
|
virtual bool NotifyEncryptionUpdate(uint32_t container_id,
|
2015-09-24 22:03:52 +00:00
|
|
|
const std::string& drm_uuid,
|
2015-08-26 20:25:29 +00:00
|
|
|
const std::vector<uint8_t>& new_key_id,
|
|
|
|
const std::vector<uint8_t>& new_pssh) = 0;
|
|
|
|
|
2014-02-06 21:20:36 +00:00
|
|
|
/// Adds content protection information to the MPD.
|
|
|
|
/// @param container_id is the nummeric container ID obtained from calling
|
|
|
|
/// NotifyNewContainer().
|
|
|
|
/// @param content_protection_element New ContentProtection element
|
|
|
|
/// specification.
|
|
|
|
/// @return true on success, false otherwise.
|
2013-12-05 23:13:35 +00:00
|
|
|
virtual bool AddContentProtectionElement(
|
2014-09-30 21:52:21 +00:00
|
|
|
uint32_t container_id,
|
2013-12-05 23:13:35 +00:00
|
|
|
const ContentProtectionElement& content_protection_element) = 0;
|
2014-05-16 23:32:10 +00:00
|
|
|
|
2015-09-10 23:01:00 +00:00
|
|
|
/// Call this method to force a flush. Implementations might not write out
|
|
|
|
/// the MPD to a stream (file, stdout, etc.) when the MPD is updated, this
|
|
|
|
/// forces a flush.
|
|
|
|
virtual bool Flush() = 0;
|
|
|
|
|
2014-05-16 23:32:10 +00:00
|
|
|
/// @return The dash profile for this object.
|
|
|
|
DashProfile dash_profile() const { return dash_profile_; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
const DashProfile dash_profile_;
|
|
|
|
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(MpdNotifier);
|
2013-12-05 23:13:35 +00:00
|
|
|
};
|
|
|
|
|
2014-09-19 20:41:13 +00:00
|
|
|
} // namespace edash_packager
|
2013-12-05 23:13:35 +00:00
|
|
|
|
|
|
|
#endif // MPD_BASE_MPD_NOTIFIER_H_
|