7bf27ae2006d79386788e673da6820fee09b98fb
[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 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
29 #if ENABLE(VIDEO_TRACK)
30 #include "InbandDataTextTrack.h"
31
32 #include "DataCue.h"
33 #include "ExceptionCodePlaceholder.h"
34 #include "HTMLMediaElement.h"
35 #include "InbandTextTrackPrivate.h"
36 #include "Logging.h"
37 #include <runtime/ArrayBuffer.h>
38
39 namespace WebCore {
40
41 Ref<InbandDataTextTrack> InbandDataTextTrack::create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate)
42 {
43     return adoptRef(*new InbandDataTextTrack(context, client, playerPrivate));
44 }
45
46 InbandDataTextTrack::InbandDataTextTrack(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate)
47     : InbandTextTrack(context, client, trackPrivate)
48 {
49 }
50
51 InbandDataTextTrack::~InbandDataTextTrack()
52 {
53 }
54
55 void InbandDataTextTrack::addDataCue(InbandTextTrackPrivate*, const MediaTime& start, const MediaTime& end, const void* data, unsigned length)
56 {
57     auto cue = DataCue::create(*scriptExecutionContext(), start, end, data, length);
58     addCue(WTFMove(cue), ASSERT_NO_EXCEPTION);
59 }
60
61 #if ENABLE(DATACUE_VALUE)
62 void InbandDataTextTrack::addDataCue(InbandTextTrackPrivate*, const MediaTime& start, const MediaTime& end, PassRefPtr<SerializedPlatformRepresentation> prpPlatformValue, const String& type)
63 {
64     RefPtr<SerializedPlatformRepresentation> platformValue = prpPlatformValue;
65     if (m_incompleteCueMap.find(platformValue.get()) != m_incompleteCueMap.end())
66         return;
67
68     auto cue = DataCue::create(*scriptExecutionContext(), start, end, platformValue.copyRef(), type);
69     if (hasCue(cue.ptr(), TextTrackCue::IgnoreDuration)) {
70         LOG(Media, "InbandDataTextTrack::addDataCue ignoring already added cue: start=%s, end=%s\n", toString(cue->startTime()).utf8().data(), toString(cue->endTime()).utf8().data());
71         return;
72     }
73
74     if (end.isPositiveInfinite() && mediaElement()) {
75         cue->setEndTime(mediaElement()->durationMediaTime());
76         m_incompleteCueMap.add(WTFMove(platformValue), cue.copyRef());
77     }
78
79     addCue(WTFMove(cue), ASSERT_NO_EXCEPTION);
80 }
81
82 void InbandDataTextTrack::updateDataCue(InbandTextTrackPrivate*, const MediaTime& start, const MediaTime& inEnd, PassRefPtr<SerializedPlatformRepresentation> prpPlatformValue)
83 {
84     MediaTime end = inEnd;
85
86     RefPtr<SerializedPlatformRepresentation> platformValue = prpPlatformValue;
87     auto iter = m_incompleteCueMap.find(platformValue.get());
88     if (iter == m_incompleteCueMap.end())
89         return;
90
91     RefPtr<DataCue> cue = iter->value;
92     if (!cue)
93         return;
94
95     cue->willChange();
96
97     if (end.isPositiveInfinite() && mediaElement())
98         end = mediaElement()->durationMediaTime();
99     else
100         m_incompleteCueMap.remove(platformValue.get());
101
102     LOG(Media, "InbandDataTextTrack::updateDataCue: was start=%s, end=%s, will be start=%s, end=%s\n", toString(cue->startTime()).utf8().data(), toString(cue->endTime()).utf8().data(), toString(start).utf8().data(), toString(end).utf8().data());
103
104     cue->setStartTime(start);
105     cue->setEndTime(end);
106
107     cue->didChange();
108 }
109
110 void InbandDataTextTrack::removeDataCue(InbandTextTrackPrivate*, const MediaTime&, const MediaTime&, PassRefPtr<SerializedPlatformRepresentation> prpPlatformValue)
111 {
112     RefPtr<SerializedPlatformRepresentation> platformValue = prpPlatformValue;
113     auto iter = m_incompleteCueMap.find(platformValue.get());
114     if (iter == m_incompleteCueMap.end())
115         return;
116
117     RefPtr<DataCue> cue = iter->value;
118     if (cue) {
119         LOG(Media, "InbandDataTextTrack::removeDataCue removing cue: start=%s, end=%s\n", toString(cue->startTime()).utf8().data(), toString(cue->endTime()).utf8().data());
120         removeCue(cue.get(), IGNORE_EXCEPTION);
121     }
122 }
123
124 void InbandDataTextTrack::removeCue(TextTrackCue* cue, ExceptionCode& ec)
125 {
126     ASSERT(cue->cueType() == TextTrackCue::Data);
127
128     SerializedPlatformRepresentation* platformValue = const_cast<SerializedPlatformRepresentation*>(toDataCue(cue)->platformValue());
129     auto iter = m_incompleteCueMap.find(platformValue);
130     if (iter != m_incompleteCueMap.end())
131         m_incompleteCueMap.remove(platformValue);
132
133     InbandTextTrack::removeCue(cue, ec);
134 }
135
136 #endif
137
138 } // namespace WebCore
139
140 #endif