Changeset 148540 in webkit
- Timestamp:
- Apr 16, 2013 1:42:49 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r148539 r148540 1 2013-04-16 Eric Carlson <eric.carlson@apple.com> 2 3 [Mac] in-band cues sometimes displayed late 4 https://bugs.webkit.org/show_bug.cgi?id=114629 5 6 Reviewed by Jer Noble. 7 8 No new tests, this deals with a platform-specific issue that is extremely timing dependent. 9 10 * html/track/InbandTextTrack.cpp: 11 (WebCore::TextTrackCueMap::add): New, two way cue data <-> cue map. 12 (WebCore::TextTrackCueMap::find): 13 (WebCore::TextTrackCueMap::remove): 14 (WebCore::InbandTextTrack::updateCueFromCueData): New, update an existing cue. Set cue end time 15 to video duration if it is unknown. 16 (WebCore::InbandTextTrack::addGenericCue): Look for existing cues without considering duration 17 so we can match incomplete cues. 18 (WebCore::InbandTextTrack::updateGenericCue): New, update an existing cue. This allows us to 19 add in-band cues as soon as we get them from the media engine and update them as more 20 information becomes available. 21 (WebCore::InbandTextTrack::removeGenericCue): New, remove an existing cue. This is necessary 22 because we never want to keep an incomplete cue when a seek happens. 23 (WebCore::InbandTextTrack::removeCue): New, base class override so we can keep the two way 24 map up to date. 25 * html/track/InbandTextTrack.h: 26 27 * html/track/TextTrack.cpp: 28 (WebCore::TextTrack::addCue): TextTrack::removeCue takes a RefPtr. 29 (WebCore::TextTrack::removeCue): Take a RefPtr. 30 (WebCore::TextTrack::hasCue): Allow caller to request match without considering end time. 31 * html/track/TextTrack.h: 32 33 * html/track/TextTrackCue.cpp: 34 (WebCore::TextTrackCue::TextTrackCue): Initialize m_processingCueChanges. 35 (WebCore::TextTrackCue::willChange): Renamed from cueWillChange. Use m_processingCueChanges 36 to avoid thrashing the track when many cue properties will change. 37 (WebCore::TextTrackCue::didChange): Renamed from cueDidChange. Use m_processingCueChanges 38 to avoid thrashing the track when many cue properties will change. 39 (WebCore::TextTrackCue::setId): cueWillChange -> willChange. cueDidChange -> didChange. 40 (WebCore::TextTrackCue::setStartTime): Ditto. 41 (WebCore::TextTrackCue::setEndTime): Ditto. 42 (WebCore::TextTrackCue::setPauseOnExit): Ditto. 43 (WebCore::TextTrackCue::setVertical): Ditto. 44 (WebCore::TextTrackCue::setSnapToLines): Ditto. 45 (WebCore::TextTrackCue::setLine): Ditto. 46 (WebCore::TextTrackCue::setPosition): Ditto. 47 (WebCore::TextTrackCue::setSize): Ditto. 48 (WebCore::TextTrackCue::setAlign): Ditto. 49 (WebCore::TextTrackCue::setText): Ditto. 50 (WebCore::TextTrackCue::setRegionId): Ditto. 51 (WebCore::TextTrackCue::isEqual): Renamed from operator==, take match rules param. 52 * html/track/TextTrackCue.h: 53 54 * html/track/TextTrackCueGeneric.cpp: 55 (WebCore::TextTrackCueGeneric::isEqual): Renamed from operator==, take match rules param. 56 * html/track/TextTrackCueGeneric.h: 57 58 * platform/graphics/InbandTextTrackPrivateClient.h: Make GenericCueData refcounted. 59 (WebCore::GenericCueData::create): New. 60 (WebCore::GenericCueData::status): Ditto. 61 (WebCore::GenericCueData::setStatus): Ditto. 62 (WebCore::GenericCueData::GenericCueData): 63 64 * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp: 65 (WebCore::InbandTextTrackPrivateAVF::processCue): Add cues as soon as we get them from the media 66 engine, update duration once we know it. 67 (WebCore::InbandTextTrackPrivateAVF::resetCueValues): Tell the client to remove all incomplete 68 cues we have delivered. 69 * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h: 70 71 * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: 72 (WebCore::MediaPlayerPrivateAVFoundation::seekCompleted): Do not flush cues when seek completes, 73 we did that when the seek started and cues can be delivered before we get the the 74 seek completed notification. 75 1 76 2013-04-16 James Craig <james@cookiecrook.com> 2 77 -
trunk/Source/WebCore/html/track/InbandTextTrack.cpp
r148285 r148540 33 33 #include "Event.h" 34 34 #include "ExceptionCodePlaceholder.h" 35 #include "HTMLMediaElement.h" 35 36 #include "InbandTextTrackPrivate.h" 36 37 #include "Logging.h" 37 #include "MediaPlayer.h"38 38 #include "TextTrackCueGeneric.h" 39 39 #include "TextTrackCueList.h" … … 42 42 43 43 namespace WebCore { 44 45 void TextTrackCueMap::add(GenericCueData* cueData, TextTrackCueGeneric* cue) 46 { 47 m_dataToCueMap.add(cueData, cue); 48 m_cueToDataMap.add(cue, cueData); 49 } 50 51 PassRefPtr<TextTrackCueGeneric> TextTrackCueMap::find(GenericCueData* cueData) 52 { 53 GenericCueDataToCueMap::iterator iter = m_dataToCueMap.find(cueData); 54 if (iter == m_dataToCueMap.end()) 55 return 0; 56 57 return iter->value; 58 } 59 60 PassRefPtr<GenericCueData> TextTrackCueMap::find(TextTrackCueGeneric* cue) 61 { 62 GenericCueToCueDataMap::iterator iter = m_cueToDataMap.find(cue); 63 if (iter == m_cueToDataMap.end()) 64 return 0; 65 66 return iter->value; 67 } 68 69 void TextTrackCueMap::remove(GenericCueData* cueData) 70 { 71 RefPtr<TextTrackCueGeneric> cue = find(cueData); 72 73 if (cue) 74 m_cueToDataMap.remove(cue); 75 m_dataToCueMap.remove(cueData); 76 } 77 78 void TextTrackCueMap::remove(TextTrackCueGeneric* cue) 79 { 80 RefPtr<GenericCueData> cueData = find(cue); 81 82 if (cueData) 83 m_dataToCueMap.remove(cueData); 84 m_cueToDataMap.remove(cue); 85 } 86 44 87 45 88 PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate) … … 137 180 } 138 181 139 void InbandTextTrack::addGenericCue(InbandTextTrackPrivate* trackPrivate, GenericCueData* cueData) 140 { 141 UNUSED_PARAM(trackPrivate); 142 ASSERT(trackPrivate == m_private); 143 144 RefPtr<TextTrackCueGeneric> cue = TextTrackCueGeneric::create(scriptExecutionContext(), cueData->startTime(), cueData->endTime(), cueData->content()); 145 182 void InbandTextTrack::updateCueFromCueData(TextTrackCueGeneric* cue, GenericCueData* cueData) 183 { 184 cue->willChange(); 185 186 cue->setStartTime(cueData->startTime(), IGNORE_EXCEPTION); 187 double endTime = cueData->endTime(); 188 if (std::isinf(endTime) && mediaElement()) 189 endTime = mediaElement()->duration(); 190 cue->setEndTime(endTime, IGNORE_EXCEPTION); 191 cue->setText(cueData->content()); 146 192 cue->setId(cueData->id()); 147 193 cue->setBaseFontSizeRelativeToVideoHeight(cueData->baseFontSize()); … … 168 214 cue->setSnapToLines(false); 169 215 170 if (hasCue(cue.get())) { 171 LOG(Media, "InbandTextTrack::addGenericCue ignoring already added cue: start=%.2f, end=%.2f, content=\"%s\"\n", 172 cueData->startTime(), cueData->endTime(), cueData->content().utf8().data()); 216 cue->didChange(); 217 } 218 219 void InbandTextTrack::addGenericCue(InbandTextTrackPrivate* trackPrivate, PassRefPtr<GenericCueData> prpCueData) 220 { 221 UNUSED_PARAM(trackPrivate); 222 ASSERT(trackPrivate == m_private); 223 224 RefPtr<GenericCueData> cueData = prpCueData; 225 if (m_cueMap.find(cueData.get())) 226 return; 227 228 RefPtr<TextTrackCueGeneric> cue = TextTrackCueGeneric::create(scriptExecutionContext(), cueData->startTime(), cueData->endTime(), cueData->content()); 229 updateCueFromCueData(cue.get(), cueData.get()); 230 if (hasCue(cue.get(), TextTrackCue::IgnoreDuration)) { 231 LOG(Media, "InbandTextTrack::addGenericCue ignoring already added cue: start=%.2f, end=%.2f, content=\"%s\"\n", cueData->startTime(), cueData->endTime(), cueData->content().utf8().data()); 173 232 return; 174 233 } 175 234 235 m_cueMap.add(cueData.get(), cue.get()); 236 176 237 addCue(cue); 177 238 } 178 239 179 void InbandTextTrack::addWebVTTCue(InbandTextTrackPrivate* trackPrivate, double start, double end, const String& id, const String& content, const String& settings) 180 { 181 UNUSED_PARAM(trackPrivate); 182 ASSERT(trackPrivate == m_private); 183 184 RefPtr<TextTrackCue> cue = TextTrackCue::create(scriptExecutionContext(), start, end, content); 185 cue->setId(id); 186 cue->setCueSettings(settings); 187 188 if (hasCue(cue.get())) 240 void InbandTextTrack::updateGenericCue(InbandTextTrackPrivate*, GenericCueData* cueData) 241 { 242 RefPtr<TextTrackCueGeneric> cue = m_cueMap.find(cueData); 243 if (!cue) 189 244 return; 190 245 191 addCue(cue); 192 } 193 246 updateCueFromCueData(cue.get(), cueData); 247 248 if (cueData->status() == GenericCueData::Complete) 249 m_cueMap.remove(cueData); 250 } 251 252 void InbandTextTrack::removeGenericCue(InbandTextTrackPrivate*, GenericCueData* cueData) 253 { 254 RefPtr<TextTrackCueGeneric> cue = m_cueMap.find(cueData); 255 if (cue) 256 removeCue(cue.get(), IGNORE_EXCEPTION); 257 else 258 m_cueMap.remove(cueData); 259 } 260 261 void InbandTextTrack::removeCue(TextTrackCue* cue, ExceptionCode& ec) 262 { 263 m_cueMap.remove(static_cast<TextTrackCueGeneric*>(cue)); 264 TextTrack::removeCue(cue, ec); 265 } 266 194 267 } // namespace WebCore 195 268 -
trunk/Source/WebCore/html/track/InbandTextTrack.h
r146380 r148540 32 32 #include "InbandTextTrackPrivateClient.h" 33 33 #include "TextTrack.h" 34 #include "TextTrackCueGeneric.h" 34 35 #include <wtf/RefPtr.h> 35 36 … … 38 39 class Document; 39 40 class InbandTextTrackPrivate; 40 class MediaPlayer;41 41 class TextTrackCue; 42 43 class TextTrackCueMap { 44 public: 45 TextTrackCueMap() { } 46 virtual ~TextTrackCueMap() { } 47 48 void add(GenericCueData*, TextTrackCueGeneric*); 49 50 void remove(GenericCueData*); 51 void remove(TextTrackCueGeneric*); 52 53 PassRefPtr<GenericCueData> find(TextTrackCueGeneric*); 54 PassRefPtr<TextTrackCueGeneric> find(GenericCueData*); 55 56 private: 57 typedef HashMap<RefPtr<TextTrackCueGeneric>, RefPtr<GenericCueData> > GenericCueToCueDataMap; 58 typedef HashMap<RefPtr<GenericCueData>, RefPtr<TextTrackCueGeneric> > GenericCueDataToCueMap; 59 60 GenericCueToCueDataMap m_cueToDataMap; 61 GenericCueDataToCueMap m_dataToCueMap; 62 }; 42 63 43 64 class InbandTextTrack : public TextTrack, public InbandTextTrackPrivateClient { … … 56 77 InbandTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>); 57 78 58 virtual void addGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 59 virtual void addWebVTTCue(InbandTextTrackPrivate*, double, double, const String&, const String&, const String&) OVERRIDE; 79 virtual void addGenericCue(InbandTextTrackPrivate*, PassRefPtr<GenericCueData>) OVERRIDE; 80 virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 81 virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 82 virtual void removeCue(TextTrackCue*, ExceptionCode&) OVERRIDE; 83 84 PassRefPtr<TextTrackCueGeneric> createCue(PassRefPtr<GenericCueData>); 85 void updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*); 60 86 61 87 #if USE(PLATFORM_TEXT_TRACK_MENU) … … 63 89 #endif 64 90 91 TextTrackCueMap m_cueMap; 65 92 RefPtr<InbandTextTrackPrivate> m_private; 66 93 }; -
trunk/Source/WebCore/html/track/TextTrack.cpp
r148305 r148540 467 467 } 468 468 469 bool TextTrack::hasCue(TextTrackCue* cue )469 bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) 470 470 { 471 471 if (cue->startTime() < 0 || cue->endTime() < 0) … … 506 506 return false; 507 507 508 if ( *existingCue != *cue)508 if (!existingCue->isEqual(*cue, match)) 509 509 continue; 510 510 … … 515 515 size_t index = (searchStart + searchEnd) / 2; 516 516 existingCue = m_cues->item(index); 517 if (cue->startTime() < existingCue->startTime() || ( cue->startTime() == existingCue->startTime() && cue->endTime() > existingCue->endTime()))517 if (cue->startTime() < existingCue->startTime() || (match != TextTrackCue::IgnoreDuration && cue->startTime() == existingCue->startTime() && cue->endTime() > existingCue->endTime())) 518 518 searchEnd = index; 519 519 else -
trunk/Source/WebCore/html/track/TextTrack.h
r148305 r148540 31 31 32 32 #include "ExceptionCode.h" 33 #include "TextTrackCue.h" 33 34 #include "TrackBase.h" 34 35 #include <wtf/PassOwnPtr.h> … … 44 45 class ScriptExecutionContext; 45 46 class TextTrack; 46 class TextTrackCue;47 47 class TextTrackCueList; 48 48 #if ENABLE(WEBVTT_REGIONS) … … 109 109 110 110 void addCue(PassRefPtr<TextTrackCue>); 111 void removeCue(TextTrackCue*, ExceptionCode&); 112 bool hasCue(TextTrackCue*); 111 virtual void removeCue(TextTrackCue*, ExceptionCode&); 112 113 bool hasCue(TextTrackCue*, TextTrackCue::CueMatchRules = TextTrackCue::MatchAllFields); 113 114 114 115 #if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS) -
trunk/Source/WebCore/html/track/TextTrackCue.cpp
r148099 r148540 41 41 #include "Event.h" 42 42 #include "HTMLDivElement.h" 43 #include "HTMLMediaElement.h"44 43 #include "HTMLSpanElement.h" 45 44 #include "Logging.h" … … 195 194 , m_cueSize(100) 196 195 , m_cueIndex(invalidCueIndex) 196 , m_processingCueChanges(0) 197 197 , m_writingDirection(Horizontal) 198 198 , m_cueAlignment(Middle) … … 236 236 } 237 237 238 void TextTrackCue::cueWillChange() 239 { 238 void TextTrackCue::willChange() 239 { 240 if (++m_processingCueChanges > 1) 241 return; 242 240 243 if (m_track) 241 244 m_track->cueWillChange(this); 242 245 } 243 246 244 void TextTrackCue::cueDidChange() 245 { 247 void TextTrackCue::didChange() 248 { 249 ASSERT(m_processingCueChanges); 250 if (--m_processingCueChanges) 251 return; 252 246 253 if (m_track) 247 254 m_track->cueDidChange(this); … … 265 272 return; 266 273 267 cueWillChange();274 willChange(); 268 275 m_id = id; 269 cueDidChange();276 didChange(); 270 277 } 271 278 … … 281 288 if (m_startTime == value || value < 0) 282 289 return; 283 284 cueWillChange();290 291 willChange(); 285 292 m_startTime = value; 286 cueDidChange();293 didChange(); 287 294 } 288 295 … … 298 305 if (m_endTime == value || value < 0) 299 306 return; 300 301 cueWillChange();307 308 willChange(); 302 309 m_endTime = value; 303 cueDidChange();310 didChange(); 304 311 } 305 312 … … 309 316 return; 310 317 311 cueWillChange();312 318 m_pauseOnExit = value; 313 cueDidChange();314 319 } 315 320 … … 350 355 return; 351 356 352 cueWillChange();357 willChange(); 353 358 m_writingDirection = direction; 354 cueDidChange();359 didChange(); 355 360 } 356 361 … … 360 365 return; 361 366 362 cueWillChange();367 willChange(); 363 368 m_snapToLines = value; 364 cueDidChange();369 didChange(); 365 370 } 366 371 … … 379 384 return; 380 385 381 cueWillChange();386 willChange(); 382 387 m_linePosition = position; 383 388 m_computedLinePosition = calculateComputedLinePosition(); 384 cueDidChange();389 didChange(); 385 390 } 386 391 … … 399 404 return; 400 405 401 cueWillChange();406 willChange(); 402 407 m_textPosition = position; 403 cueDidChange();408 didChange(); 404 409 } 405 410 … … 418 423 return; 419 424 420 cueWillChange();425 willChange(); 421 426 m_cueSize = size; 422 cueDidChange();427 didChange(); 423 428 } 424 429 … … 459 464 return; 460 465 461 cueWillChange();466 willChange(); 462 467 m_cueAlignment = alignment; 463 cueDidChange();468 didChange(); 464 469 } 465 470 … … 469 474 return; 470 475 471 cueWillChange();476 willChange(); 472 477 // Clear the document fragment but don't bother to create it again just yet as we can do that 473 478 // when it is requested. 474 479 m_webVTTNodeTree = 0; 475 480 m_content = text; 476 cueDidChange();481 didChange(); 477 482 } 478 483 … … 542 547 return; 543 548 544 cueWillChange();549 willChange(); 545 550 m_regionId = regionId; 546 cueDidChange();551 didChange(); 547 552 } 548 553 #endif … … 1154 1159 } 1155 1160 1156 bool TextTrackCue:: operator==(const TextTrackCue& cue) const1161 bool TextTrackCue::isEqual(const TextTrackCue& cue, CueMatchRules match) const 1157 1162 { 1158 1163 if (cueType() != cue.cueType()) 1159 1164 return false; 1160 1161 if (m _endTime != cue.endTime())1165 1166 if (match != IgnoreDuration && m_endTime != cue.endTime()) 1162 1167 return false; 1163 1168 if (m_startTime != cue.startTime()) … … 1180 1185 return true; 1181 1186 } 1182 1183 1187 void TextTrackCue::setFontSize(int fontSize, const IntSize&, bool important) 1184 1188 { -
trunk/Source/WebCore/html/track/TextTrackCue.h
r148099 r148540 38 38 #include "HTMLDivElement.h" 39 39 #include "HTMLElement.h" 40 #include "TextTrack.h"41 40 #include <wtf/PassOwnPtr.h> 42 41 #include <wtf/RefCounted.h> … … 180 179 virtual void setFontSize(int, const IntSize&, bool important); 181 180 182 virtual bool operator==(const TextTrackCue&) const;183 virtual bool operator!=(const TextTrackCue& cue) const184 {185 return !(*this == cue);186 }187 181 enum CueMatchRules { 182 MatchAllFields, 183 IgnoreDuration, 184 }; 185 virtual bool isEqual(const TextTrackCue&, CueMatchRules) const; 186 188 187 enum CueType { 189 188 Generic, … … 192 191 virtual CueType cueType() const { return WebVTT; } 193 192 193 void willChange(); 194 void didChange(); 195 194 196 DEFINE_ATTRIBUTE_EVENT_LISTENER(enter); 195 197 DEFINE_ATTRIBUTE_EVENT_LISTENER(exit); … … 218 220 void determineTextDirection(); 219 221 void calculateDisplayParameters(); 220 221 void cueWillChange();222 void cueDidChange();223 222 224 223 virtual void refEventTarget() { ref(); } … … 248 247 int m_cueSize; 249 248 int m_cueIndex; 249 int m_processingCueChanges; 250 250 251 251 WritingDirection m_writingDirection; -
trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp
r148058 r148540 152 152 } 153 153 154 bool TextTrackCueGeneric:: operator==(const TextTrackCue& cue) const154 bool TextTrackCueGeneric::isEqual(const TextTrackCue& cue, TextTrackCue::CueMatchRules match) const 155 155 { 156 156 if (cue.cueType() != TextTrackCue::Generic) … … 170 170 return false; 171 171 172 return TextTrackCue:: operator==(cue);172 return TextTrackCue::isEqual(cue, match); 173 173 } 174 174 -
trunk/Source/WebCore/html/track/TextTrackCueGeneric.h
r148050 r148540 71 71 virtual void setFontSize(int, const IntSize&, bool important) OVERRIDE; 72 72 73 virtual bool operator==(const TextTrackCue&) const OVERRIDE; 74 virtual bool operator!=(const TextTrackCue& cue) const OVERRIDE 75 { 76 return !(*this == cue); 77 } 73 virtual bool isEqual(const TextTrackCue&, CueMatchRules) const OVERRIDE; 78 74 79 75 virtual TextTrackCue::CueType cueType() const OVERRIDE { return TextTrackCue::Generic; } -
trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h
r142349 r148540 28 28 29 29 #include "Color.h" 30 #include <wtf/ Noncopyable.h>30 #include <wtf/RefCounted.h> 31 31 #include <wtf/text/WTFString.h> 32 32 … … 37 37 class InbandTextTrackPrivate; 38 38 39 class GenericCueData { 40 WTF_MAKE_NONCOPYABLE(GenericCueData); WTF_MAKE_FAST_ALLOCATED; 39 class GenericCueData : public RefCounted<GenericCueData> { 41 40 public: 42 GenericCueData() 43 : m_startTime(0) 44 , m_endTime(0) 45 , m_line(-1) 46 , m_position(-1) 47 , m_size(-1) 48 , m_align(None) 49 , m_baseFontSize(0) 50 , m_relativeFontSize(0) 51 { 52 } 41 42 static PassRefPtr<GenericCueData> create() { return adoptRef(new GenericCueData()); } 53 43 virtual ~GenericCueData() { } 54 44 … … 98 88 void setBackgroundColor(RGBA32 color) { m_backgroundColor.setRGB(color); } 99 89 90 enum Status { 91 Uninitialized, 92 Partial, 93 Complete, 94 }; 95 Status status() { return m_status; } 96 void setStatus(Status status) { m_status = status; } 97 100 98 private: 99 GenericCueData() 100 : m_startTime(0) 101 , m_endTime(0) 102 , m_line(-1) 103 , m_position(-1) 104 , m_size(-1) 105 , m_align(None) 106 , m_baseFontSize(0) 107 , m_relativeFontSize(0) 108 , m_status(Uninitialized) 109 { 110 } 111 101 112 double m_startTime; 102 113 double m_endTime; … … 112 123 Color m_foregroundColor; 113 124 Color m_backgroundColor; 125 Status m_status; 114 126 }; 115 127 … … 118 130 virtual ~InbandTextTrackPrivateClient() { } 119 131 120 virtual void addWebVTTCue(InbandTextTrackPrivate*, double /*start*/, double /*end*/, const String& /*id*/, const String& /*content*/, const String& /*settings*/) = 0; 121 virtual void addGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0; 132 virtual void addGenericCue(InbandTextTrackPrivate*, PassRefPtr<GenericCueData>) = 0; 133 virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0; 134 virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0; 122 135 }; 123 136 -
trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp
r148285 r148540 340 340 if (m_currentCueEndTime >= m_currentCueStartTime) { 341 341 for (size_t i = 0; i < m_cues.size(); i++) { 342 343 342 GenericCueData* cueData = m_cues[i].get(); 344 343 345 LOG(Media, "InbandTextTrackPrivateAVF::processCue flushing cue: start=%.2f, end=%.2f, content=\"%s\" \n",346 m_currentCueStartTime, m_currentCueEndTime, cueData->content().utf8().data());347 348 if (!cueData->content().length())349 continue;350 351 cueData->setStartTime(m_currentCueStartTime);352 344 cueData->setEndTime(m_currentCueEndTime); 353 354 // AVFoundation cue "position" is to the center of the text so adjust relative to the edge because we will use it to 355 // set CSS "left". 356 if (cueData->position() >= 0 && cueData->size() > 0) 357 cueData->setPosition(cueData->position() - cueData->size() / 2); 358 359 LOG(Media, "InbandTextTrackPrivateAVF::processCue(%p) - adding cue for time = %.2f, position = %.2f, line = %.2f", this, cueData->startTime(), cueData->position(), cueData->line()); 360 client()->addGenericCue(this, cueData); 345 cueData->setStatus(GenericCueData::Complete); 346 347 LOG(Media, "InbandTextTrackPrivateAVF::processCue(%p) - updating cue: start=%.2f, end=%.2f, content=\"%s\"", this, cueData->startTime(), m_currentCueEndTime, cueData->content().utf8().data()); 348 client()->updateGenericCue(this, cueData); 361 349 } 362 350 } else … … 379 367 continue; 380 368 381 m_cues.append(adoptPtr(new GenericCueData)); 382 processCueAttributes(attributedString, m_cues[i].get()); 369 RefPtr<GenericCueData> cueData = GenericCueData::create(); 370 processCueAttributes(attributedString, cueData.get()); 371 if (!cueData->content().length()) 372 continue; 373 374 m_cues.append(cueData); 375 383 376 m_currentCueStartTime = time; 377 cueData->setStartTime(m_currentCueStartTime); 378 cueData->setEndTime(numeric_limits<double>::infinity()); // duration 379 380 // AVFoundation cue "position" is to the center of the text so adjust relative to the edge because we will use it to 381 // set CSS "left". 382 if (cueData->position() >= 0 && cueData->size() > 0) 383 cueData->setPosition(cueData->position() - cueData->size() / 2); 384 385 LOG(Media, "InbandTextTrackPrivateAVF::processCue(%p) - adding cue for time = %.2f, position = %.2f, line = %.2f", this, cueData->startTime(), cueData->position(), cueData->line()); 386 387 cueData->setStatus(GenericCueData::Partial); 388 client()->addGenericCue(this, cueData.release()); 389 384 390 m_havePartialCue = true; 385 391 } … … 396 402 if (m_havePartialCue && !m_currentCueEndTime) 397 403 LOG(Media, "InbandTextTrackPrivateAVF::resetCueValues flushing data for cues: start=%.2f\n", m_currentCueStartTime); 404 405 if (client()) { 406 for (size_t i = 0; i < m_cues.size(); i++) 407 client()->removeGenericCue(this, m_cues[i].get()); 408 } 398 409 399 410 m_cues.resize(0); -
trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h
r145326 r148540 30 30 31 31 #include "InbandTextTrackPrivate.h" 32 #include "InbandTextTrackPrivateClient.h" 32 33 #include <wtf/text/StringBuilder.h> 33 34 34 35 namespace WebCore { 35 36 class GenericCueData;37 36 38 37 class AVFInbandTrackParent { … … 69 68 double m_currentCueEndTime; 70 69 71 Vector< OwnPtr<GenericCueData> > m_cues;70 Vector<RefPtr<GenericCueData> > m_cues; 72 71 73 72 AVFInbandTrackParent* m_owner; -
trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp
r148291 r148540 598 598 UNUSED_PARAM(finished); 599 599 600 #if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)601 if (currentTrack())602 currentTrack()->resetCueValues();603 #endif604 605 600 m_seekTo = MediaPlayer::invalidTime(); 606 601 updateStates();
Note: See TracChangeset
for help on using the changeset viewer.