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
|
|
|
#include "mpd/base/simple_vod_mpd_notifier.h"
|
|
|
|
|
|
|
|
#include "base/stl_util.h"
|
|
|
|
#include "mpd/base/content_protection_element.h"
|
|
|
|
#include "mpd/base/media_info.pb.h"
|
|
|
|
|
|
|
|
namespace dash_packager {
|
|
|
|
|
|
|
|
SimpleVodMpdNotifier::SimpleVodMpdNotifier(MpdBuilder* mpd_builder)
|
|
|
|
: mpd_builder_(mpd_builder),
|
|
|
|
video_adaptation_set_(NULL),
|
|
|
|
audio_adaptation_set_(NULL),
|
|
|
|
representation_(NULL) {
|
|
|
|
DCHECK(mpd_builder);
|
|
|
|
}
|
|
|
|
|
|
|
|
SimpleVodMpdNotifier::~SimpleVodMpdNotifier() {}
|
|
|
|
|
|
|
|
bool SimpleVodMpdNotifier::Init() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SimpleVodMpdNotifier::NotifyNewContainer(const MediaInfo& media_info,
|
|
|
|
uint32* container_id) {
|
|
|
|
DCHECK(container_id);
|
|
|
|
|
|
|
|
if (media_info.video_info_size() > 0 && media_info.audio_info_size() > 0) {
|
|
|
|
LOG(ERROR) << "SimpleVodMpdNotifier cannot handle media container with "
|
|
|
|
"both video and audio";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
ContainerType container_type = kVideo;
|
|
|
|
if (media_info.video_info_size() > 0) {
|
|
|
|
container_type = kVideo;
|
|
|
|
} else if (media_info.audio_info_size() > 0) {
|
|
|
|
container_type = kAudio;
|
|
|
|
} else {
|
|
|
|
LOG(ERROR) << "Either video_info or audio_info must be populated.";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!AddNewRepresentation(container_type, media_info, container_id))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return mpd_builder_->WriteMpd();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SimpleVodMpdNotifier::NotifyNewSegment(uint32 container_id,
|
|
|
|
uint64 start_time,
|
|
|
|
uint64 duration) {
|
|
|
|
DLOG(INFO) << "VOD does not support this operation.";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SimpleVodMpdNotifier::AddContentProtectionElement(
|
|
|
|
uint32 container_id,
|
|
|
|
const ContentProtectionElement& content_protection_element) {
|
|
|
|
if (!ContainsKey(id_to_representation_, container_id))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
Representation* representation = id_to_representation_[container_id];
|
|
|
|
|
|
|
|
DCHECK(representation);
|
|
|
|
representation->AddContentProtectionElement(content_protection_element);
|
|
|
|
return mpd_builder_->WriteMpd();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SimpleVodMpdNotifier::AddNewRepresentation(ContainerType type,
|
|
|
|
const MediaInfo& media_info,
|
|
|
|
uint32* container_id) {
|
|
|
|
// Use pointer-pointer to set {video,audio}_adaptation_set_.
|
|
|
|
AdaptationSet** adaptation_set_pp = NULL;
|
|
|
|
if (type == kVideo) {
|
|
|
|
adaptation_set_pp = &video_adaptation_set_;
|
|
|
|
} else if (type == kAudio){
|
|
|
|
adaptation_set_pp = &audio_adaptation_set_;
|
|
|
|
} else {
|
|
|
|
NOTREACHED() << "Unknown container type: " << type;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!*adaptation_set_pp)
|
|
|
|
*adaptation_set_pp = mpd_builder_->AddAdaptationSet();
|
|
|
|
|
|
|
|
AdaptationSet* const adaptation_set = *adaptation_set_pp;
|
|
|
|
Representation* new_representation =
|
|
|
|
adaptation_set->AddRepresentation(media_info);
|
|
|
|
|
|
|
|
if (!new_representation)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
const uint32 representation_id = new_representation->id();
|
|
|
|
id_to_representation_[representation_id] = new_representation;
|
|
|
|
*container_id = representation_id;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace dash_packager
|