Isolate OnStreamInfo in Chunking Handler
Change-Id: If35b9f545f96237095177438a5f95f964cbbfe3d
This commit is contained in:
parent
a82ac20dbb
commit
d9d2cb3e1f
|
@ -40,37 +40,8 @@ Status ChunkingHandler::InitializeInternal() {
|
||||||
|
|
||||||
Status ChunkingHandler::Process(std::unique_ptr<StreamData> stream_data) {
|
Status ChunkingHandler::Process(std::unique_ptr<StreamData> stream_data) {
|
||||||
switch (stream_data->stream_data_type) {
|
switch (stream_data->stream_data_type) {
|
||||||
case StreamDataType::kStreamInfo: {
|
case StreamDataType::kStreamInfo:
|
||||||
// Make sure the inputs come from the same thread.
|
return OnStreamInfo(stream_data->stream_index, stream_data->stream_info);
|
||||||
const int64_t thread_id =
|
|
||||||
static_cast<int64_t>(base::PlatformThread::CurrentId());
|
|
||||||
int64_t expected = kThreadIdUnset;
|
|
||||||
if (!thread_id_.compare_exchange_strong(expected, thread_id) &&
|
|
||||||
expected != thread_id) {
|
|
||||||
return Status(error::CHUNKING_ERROR,
|
|
||||||
"Inputs should come from the same thread.");
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto time_scale = stream_data->stream_info->time_scale();
|
|
||||||
// The video stream is treated as the main stream. If there is only one
|
|
||||||
// stream, it is the main stream.
|
|
||||||
const bool is_main_stream =
|
|
||||||
main_stream_index_ == kInvalidStreamIndex &&
|
|
||||||
(stream_data->stream_info->stream_type() == kStreamVideo ||
|
|
||||||
num_input_streams() == 1);
|
|
||||||
if (is_main_stream) {
|
|
||||||
main_stream_index_ = stream_data->stream_index;
|
|
||||||
segment_duration_ =
|
|
||||||
chunking_params_.segment_duration_in_seconds * time_scale;
|
|
||||||
subsegment_duration_ =
|
|
||||||
chunking_params_.subsegment_duration_in_seconds * time_scale;
|
|
||||||
} else if (stream_data->stream_info->stream_type() == kStreamVideo) {
|
|
||||||
return Status(error::CHUNKING_ERROR,
|
|
||||||
"Only one video stream is allowed per chunking handler.");
|
|
||||||
}
|
|
||||||
time_scales_[stream_data->stream_index] = time_scale;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case StreamDataType::kScte35Event: {
|
case StreamDataType::kScte35Event: {
|
||||||
if (stream_data->stream_index != main_stream_index_) {
|
if (stream_data->stream_index != main_stream_index_) {
|
||||||
VLOG(3) << "Dropping scte35 event from non main stream.";
|
VLOG(3) << "Dropping scte35 event from non main stream.";
|
||||||
|
@ -159,6 +130,41 @@ Status ChunkingHandler::OnFlushRequest(size_t input_stream_index) {
|
||||||
return FlushDownstream(output_stream_index);
|
return FlushDownstream(output_stream_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Status ChunkingHandler::OnStreamInfo(uint64_t stream_index,
|
||||||
|
std::shared_ptr<const StreamInfo> info) {
|
||||||
|
// Make sure the inputs come from the same thread.
|
||||||
|
const int64_t thread_id =
|
||||||
|
static_cast<int64_t>(base::PlatformThread::CurrentId());
|
||||||
|
|
||||||
|
int64_t expected = kThreadIdUnset;
|
||||||
|
if (!thread_id_.compare_exchange_strong(expected, thread_id) &&
|
||||||
|
expected != thread_id) {
|
||||||
|
return Status(error::CHUNKING_ERROR,
|
||||||
|
"Inputs should come from the same thread.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto time_scale = info->time_scale();
|
||||||
|
time_scales_[stream_index] = time_scale;
|
||||||
|
|
||||||
|
// The video stream is treated as the main stream. If there is only one
|
||||||
|
// stream, it is the main stream.
|
||||||
|
const bool is_main_stream =
|
||||||
|
main_stream_index_ == kInvalidStreamIndex &&
|
||||||
|
(info->stream_type() == kStreamVideo || num_input_streams() == 1);
|
||||||
|
if (is_main_stream) {
|
||||||
|
main_stream_index_ = stream_index;
|
||||||
|
segment_duration_ =
|
||||||
|
chunking_params_.segment_duration_in_seconds * time_scale;
|
||||||
|
subsegment_duration_ =
|
||||||
|
chunking_params_.subsegment_duration_in_seconds * time_scale;
|
||||||
|
} else if (info->stream_type() == kStreamVideo) {
|
||||||
|
return Status(error::CHUNKING_ERROR,
|
||||||
|
"Only one video stream is allowed per chunking handler.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return DispatchStreamInfo(stream_index, std::move(info));
|
||||||
|
}
|
||||||
|
|
||||||
Status ChunkingHandler::ProcessMainMediaSample(const MediaSample* sample) {
|
Status ChunkingHandler::ProcessMainMediaSample(const MediaSample* sample) {
|
||||||
const bool is_key_frame = sample->is_key_frame();
|
const bool is_key_frame = sample->is_key_frame();
|
||||||
const int64_t timestamp = sample->dts();
|
const int64_t timestamp = sample->dts();
|
||||||
|
|
|
@ -62,6 +62,9 @@ class ChunkingHandler : public MediaHandler {
|
||||||
ChunkingHandler(const ChunkingHandler&) = delete;
|
ChunkingHandler(const ChunkingHandler&) = delete;
|
||||||
ChunkingHandler& operator=(const ChunkingHandler&) = delete;
|
ChunkingHandler& operator=(const ChunkingHandler&) = delete;
|
||||||
|
|
||||||
|
Status OnStreamInfo(uint64_t stream_index,
|
||||||
|
std::shared_ptr<const StreamInfo> info);
|
||||||
|
|
||||||
// Processes main media sample and apply chunking if needed.
|
// Processes main media sample and apply chunking if needed.
|
||||||
Status ProcessMainMediaSample(const MediaSample* sample);
|
Status ProcessMainMediaSample(const MediaSample* sample);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue