7#include <packager/media/formats/ttml/ttml_to_mp4_handler.h>
15#include <absl/log/check.h>
17#include <packager/macros/status.h>
18#include <packager/media/base/media_handler.h>
19#include <packager/media/base/media_sample.h>
20#include <packager/media/base/stream_info.h>
21#include <packager/media/base/text_stream_info.h>
22#include <packager/status.h>
32std::shared_ptr<MediaSample> CreateMediaSample(
const std::string& data,
35 DCHECK_GE(start_time, 0);
36 DCHECK_GT(duration, 0);
38 const bool kIsKeyFrame =
true;
41 reinterpret_cast<const uint8_t*
>(data.data()), data.size(), kIsKeyFrame);
42 sample->set_pts(start_time);
43 sample->set_dts(start_time);
44 sample->set_duration(duration);
51Status TtmlToMp4Handler::InitializeInternal() {
55Status TtmlToMp4Handler::Process(std::unique_ptr<StreamData> stream_data) {
56 switch (stream_data->stream_data_type) {
57 case StreamDataType::kStreamInfo:
58 return OnStreamInfo(std::move(stream_data));
59 case StreamDataType::kCueEvent:
60 return OnCueEvent(std::move(stream_data));
61 case StreamDataType::kSegmentInfo:
62 return OnSegmentInfo(std::move(stream_data));
63 case StreamDataType::kTextSample:
64 return OnTextSample(std::move(stream_data));
66 return Status(error::INTERNAL_ERROR,
67 "Invalid stream data type (" +
68 StreamDataTypeToString(stream_data->stream_data_type) +
69 ") for this TtmlToMp4 handler");
73Status TtmlToMp4Handler::OnStreamInfo(std::unique_ptr<StreamData> stream_data) {
75 DCHECK(stream_data->stream_info);
77 auto clone = stream_data->stream_info->Clone();
78 clone->set_codec(kCodecTtml);
79 clone->set_codec_string(
"ttml");
81 if (clone->stream_type() != kStreamText)
82 return Status(error::MUXER_FAILURE,
"Incorrect stream type");
83 auto* text_stream =
static_cast<const TextStreamInfo*
>(clone.get());
84 generator_.Initialize(text_stream->regions(), text_stream->language(),
85 text_stream->time_scale());
88 StreamData::FromStreamInfo(stream_data->stream_index, std::move(clone)));
91Status TtmlToMp4Handler::OnCueEvent(std::unique_ptr<StreamData> stream_data) {
93 DCHECK(stream_data->cue_event);
94 return Dispatch(std::move(stream_data));
97Status TtmlToMp4Handler::OnSegmentInfo(
98 std::unique_ptr<StreamData> stream_data) {
100 DCHECK(stream_data->segment_info);
102 const auto& segment = stream_data->segment_info;
105 if (!generator_.Dump(&data))
106 return Status(error::INTERNAL_ERROR,
"Error generating XML");
111 CreateMediaSample(data, segment->start_timestamp, segment->duration)));
113 return Dispatch(std::move(stream_data));
116Status TtmlToMp4Handler::OnTextSample(std::unique_ptr<StreamData> stream_data) {
118 DCHECK(stream_data->text_sample);
120 auto& sample = stream_data->text_sample;
124 if (sample->body().is_empty()) {
130 generator_.AddSample(*sample);
All the methods that are virtual are virtual for mocking.