Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / html / track / InbandDataTextTrack.cpp
1 /*
2  * Copyright (C) 2014 Cable Television Labs Inc.  All rights reserved.
3  * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "InbandDataTextTrack.h"
29
30 #if ENABLE(VIDEO_TRACK)
31
32 #include "DataCue.h"
33 #include "HTMLMediaElement.h"
34 #include "InbandTextTrackPrivate.h"
35
36 namespace WebCore {
37
38 inline InbandDataTextTrack::InbandDataTextTrack(ScriptExecutionContext& context, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
39     : InbandTextTrack(context, client, trackPrivate)
40 {
41 }
42
43 Ref<InbandDataTextTrack> InbandDataTextTrack::create(ScriptExecutionContext& context, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
44 {
45     return adoptRef(*new InbandDataTextTrack(context, client, trackPrivate));
46 }
47
48 InbandDataTextTrack::~InbandDataTextTrack() = default;
49
50 void InbandDataTextTrack::addDataCue(const MediaTime& start, const MediaTime& end, const void* data, unsigned length)
51 {
52     addCue(DataCue::create(*scriptExecutionContext(), start, end, data, length));
53 }
54
55 #if ENABLE(DATACUE_VALUE)
56
57 void InbandDataTextTrack::addDataCue(const MediaTime& start, const MediaTime& end, Ref<SerializedPlatformRepresentation>&& platformValue, const String& type)
58 {
59     if (m_incompleteCueMap.contains(platformValue.ptr()))
60         return;
61
62     auto cue = DataCue::create(*scriptExecutionContext(), start, end, platformValue.copyRef(), type);
63     if (hasCue(cue.ptr(), TextTrackCue::IgnoreDuration)) {
64         INFO_LOG(LOGIDENTIFIER, "ignoring already added cue: ", cue.get());
65         return;
66     }
67
68     if (end.isPositiveInfinite() && mediaElement()) {
69         cue->setEndTime(mediaElement()->durationMediaTime());
70         m_incompleteCueMap.add(WTFMove(platformValue), cue.copyRef());
71     }
72
73     INFO_LOG(LOGIDENTIFIER, cue.get());
74
75     addCue(WTFMove(cue));
76 }
77
78 void InbandDataTextTrack::updateDataCue(const MediaTime& start, const MediaTime& inEnd, SerializedPlatformRepresentation& platformValue)
79 {
80     RefPtr<DataCue> cue = m_incompleteCueMap.get(&platformValue);
81     if (!cue)
82         return;
83
84     cue->willChange();
85
86     MediaTime end = inEnd;
87     if (end.isPositiveInfinite() && mediaElement())
88         end = mediaElement()->durationMediaTime();
89     else
90         m_incompleteCueMap.remove(&platformValue);
91
92     INFO_LOG(LOGIDENTIFIER, "was start = ", cue->startMediaTime(), ", end = ", cue->endMediaTime(), ", will be start = ", start, ", end = ", end);
93
94     cue->setStartTime(start);
95     cue->setEndTime(end);
96
97     cue->didChange();
98 }
99
100 void InbandDataTextTrack::removeDataCue(const MediaTime&, const MediaTime&, SerializedPlatformRepresentation& platformValue)
101 {
102     if (auto cue = m_incompleteCueMap.take(&platformValue)) {
103         INFO_LOG(LOGIDENTIFIER, "removing: ", *cue);
104         InbandTextTrack::removeCue(*cue);
105     }
106 }
107
108 ExceptionOr<void> InbandDataTextTrack::removeCue(TextTrackCue& cue)
109 {
110     ASSERT(cue.cueType() == TextTrackCue::Data);
111
112     m_incompleteCueMap.remove(const_cast<SerializedPlatformRepresentation*>(toDataCue(&cue)->platformValue()));
113
114     return InbandTextTrack::removeCue(cue);
115 }
116
117 #endif
118
119 } // namespace WebCore
120
121 #endif