1/* 2 * Copyright (C) 2012 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27 28#if ENABLE(VIDEO_TRACK) 29 30#include "InbandTextTrack.h" 31 32#include "Document.h" 33#include "Event.h" 34#include "ExceptionCodePlaceholder.h" 35#include "HTMLMediaElement.h" 36#include "InbandDataTextTrack.h" 37#include "InbandGenericTextTrack.h" 38#include "InbandTextTrackPrivate.h" 39#include "InbandWebVTTTextTrack.h" 40#include "Logging.h" 41#include "TextTrackCueList.h" 42#include <math.h> 43#include <wtf/text/CString.h> 44 45namespace WebCore { 46 47PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context, 48 TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate) 49{ 50 switch (trackPrivate->cueFormat()) { 51 case InbandTextTrackPrivate::Data: 52 return InbandDataTextTrack::create(context, client, trackPrivate); 53 case InbandTextTrackPrivate::Generic: 54 return InbandGenericTextTrack::create(context, client, trackPrivate); 55 case InbandTextTrackPrivate::WebVTT: 56 return InbandWebVTTTextTrack::create(context, client, trackPrivate); 57 default: 58 ASSERT_NOT_REACHED(); 59 return 0; 60 } 61} 62 63InbandTextTrack::InbandTextTrack(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate) 64 : TextTrack(context, client, emptyAtom, trackPrivate->id(), trackPrivate->label(), trackPrivate->language(), InBand) 65 , m_private(trackPrivate) 66{ 67 m_private->setClient(this); 68 updateKindFromPrivate(); 69} 70 71InbandTextTrack::~InbandTextTrack() 72{ 73 m_private->setClient(0); 74} 75 76void InbandTextTrack::setPrivate(PassRefPtr<InbandTextTrackPrivate> trackPrivate) 77{ 78 ASSERT(m_private); 79 ASSERT(trackPrivate); 80 81 if (m_private == trackPrivate) 82 return; 83 84 m_private->setClient(0); 85 m_private = trackPrivate; 86 m_private->setClient(this); 87 88 setModeInternal(mode()); 89 updateKindFromPrivate(); 90} 91 92void InbandTextTrack::setMode(const AtomicString& mode) 93{ 94 TextTrack::setMode(mode); 95 setModeInternal(mode); 96} 97 98void InbandTextTrack::setModeInternal(const AtomicString& mode) 99{ 100 if (mode == TextTrack::disabledKeyword()) 101 m_private->setMode(InbandTextTrackPrivate::Disabled); 102 else if (mode == TextTrack::hiddenKeyword()) 103 m_private->setMode(InbandTextTrackPrivate::Hidden); 104 else if (mode == TextTrack::showingKeyword()) 105 m_private->setMode(InbandTextTrackPrivate::Showing); 106 else 107 ASSERT_NOT_REACHED(); 108} 109 110bool InbandTextTrack::isClosedCaptions() const 111{ 112 if (!m_private) 113 return false; 114 115 return m_private->isClosedCaptions(); 116} 117 118bool InbandTextTrack::isSDH() const 119{ 120 if (!m_private) 121 return false; 122 123 return m_private->isSDH(); 124} 125 126bool InbandTextTrack::containsOnlyForcedSubtitles() const 127{ 128 if (!m_private) 129 return false; 130 131 return m_private->containsOnlyForcedSubtitles(); 132} 133 134bool InbandTextTrack::isMainProgramContent() const 135{ 136 if (!m_private) 137 return false; 138 139 return m_private->isMainProgramContent(); 140} 141 142bool InbandTextTrack::isEasyToRead() const 143{ 144 if (!m_private) 145 return false; 146 147 return m_private->isEasyToRead(); 148} 149 150size_t InbandTextTrack::inbandTrackIndex() 151{ 152 ASSERT(m_private); 153 return m_private->trackIndex(); 154} 155 156AtomicString InbandTextTrack::inBandMetadataTrackDispatchType() const 157{ 158 ASSERT(m_private); 159 return m_private->inBandMetadataTrackDispatchType(); 160} 161 162void InbandTextTrack::idChanged(TrackPrivateBase* trackPrivate, const AtomicString& id) 163{ 164 ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); 165 setId(id); 166} 167 168void InbandTextTrack::labelChanged(TrackPrivateBase* trackPrivate, const AtomicString& label) 169{ 170 ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); 171 setLabel(label); 172} 173 174void InbandTextTrack::languageChanged(TrackPrivateBase* trackPrivate, const AtomicString& language) 175{ 176 ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); 177 setLanguage(language); 178} 179 180void InbandTextTrack::willRemove(TrackPrivateBase* trackPrivate) 181{ 182 if (!mediaElement()) 183 return; 184 ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); 185 mediaElement()->removeTextTrack(this); 186} 187 188void InbandTextTrack::updateKindFromPrivate() 189{ 190 switch (m_private->kind()) { 191 case InbandTextTrackPrivate::Subtitles: 192 setKind(TextTrack::subtitlesKeyword()); 193 break; 194 case InbandTextTrackPrivate::Captions: 195 setKind(TextTrack::captionsKeyword()); 196 break; 197 case InbandTextTrackPrivate::Descriptions: 198 setKind(TextTrack::descriptionsKeyword()); 199 break; 200 case InbandTextTrackPrivate::Chapters: 201 setKind(TextTrack::chaptersKeyword()); 202 break; 203 case InbandTextTrackPrivate::Metadata: 204 setKind(TextTrack::metadataKeyword()); 205 break; 206 case InbandTextTrackPrivate::Forced: 207 setKind(TextTrack::forcedKeyword()); 208 break; 209 case InbandTextTrackPrivate::None: 210 default: 211 ASSERT_NOT_REACHED(); 212 break; 213 } 214} 215 216double InbandTextTrack::startTimeVariance() const 217{ 218 if (!m_private) 219 return false; 220 221 return m_private->startTimeVariance(); 222} 223 224} // namespace WebCore 225 226#endif 227