15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/webm/webm_tracks_parser.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/buffers.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/webm/webm_constants.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/webm/webm_content_encodings.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static TextKind CodecIdToTextKind(const std::string& codec_id) { 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (codec_id == kWebMCodecSubtitles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kTextSubtitles; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (codec_id == kWebMCodecCaptions) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kTextCaptions; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (codec_id == kWebMCodecDescriptions) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kTextDescriptions; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (codec_id == kWebMCodecMetadata) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kTextMetadata; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kTextNone; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic base::TimeDelta PrecisionCappedDefaultDuration( 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const double timecode_scale_in_us, const int64 duration_in_ns) { 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (duration_in_ns <= 0) 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return kNoTimestamp(); 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int64 mult = duration_in_ns / 1000; 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch mult /= timecode_scale_in_us; 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (mult == 0) 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return kNoTimestamp(); 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch mult = static_cast<double>(mult) * timecode_scale_in_us; 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return base::TimeDelta::FromMicroseconds(mult); 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebMTracksParser::WebMTracksParser(const LogCB& log_cb, bool ignore_text_tracks) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : track_type_(-1), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_num_(-1), 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) seek_preroll_(-1), 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) codec_delay_(-1), 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default_duration_(-1), 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_track_num_(-1), 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch audio_default_duration_(-1), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_track_num_(-1), 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch video_default_duration_(-1), 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ignore_text_tracks_(ignore_text_tracks), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log_cb_(log_cb), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_client_(log_cb), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_client_(log_cb) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMTracksParser::~WebMTracksParser() {} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebMTracksParser::Parse(const uint8* buf, int size) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_type_ =-1; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_num_ = -1; 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default_duration_ = -1; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_name_.clear(); 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_language_.clear(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_track_num_ = -1; 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch audio_default_duration_ = -1; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_decoder_config_ = AudioDecoderConfig(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_track_num_ = -1; 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch video_default_duration_ = -1; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_decoder_config_ = VideoDecoderConfig(); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_tracks_.clear(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ignored_tracks_.clear(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMListParser parser(kWebMIdTracks, this); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = parser.Parse(buf, size); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result <= 0) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now we do all or nothing parsing. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parser.IsParsingComplete() ? result : 0; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::TimeDelta WebMTracksParser::GetAudioDefaultDuration( 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const double timecode_scale_in_us) const { 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return PrecisionCappedDefaultDuration(timecode_scale_in_us, 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch audio_default_duration_); 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::TimeDelta WebMTracksParser::GetVideoDefaultDuration( 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const double timecode_scale_in_us) const { 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return PrecisionCappedDefaultDuration(timecode_scale_in_us, 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch video_default_duration_); 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMParserClient* WebMTracksParser::OnListStart(int id) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == kWebMIdContentEncodings) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!track_content_encodings_client_.get()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_content_encodings_client_.reset( 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new WebMContentEncodingsClient(log_cb_)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return track_content_encodings_client_->OnListStart(id); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == kWebMIdTrackEntry) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_type_ = -1; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_num_ = -1; 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default_duration_ = -1; 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_name_.clear(); 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_language_.clear(); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_id_ = ""; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_private_.clear(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_client_.Reset(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_client_.Reset(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id == kWebMIdAudio) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &audio_client_; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id == kWebMIdVideo) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &video_client_; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMTracksParser::OnListEnd(int id) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == kWebMIdContentEncodings) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(track_content_encodings_client_.get()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return track_content_encodings_client_->OnListEnd(id); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == kWebMIdTrackEntry) { 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (track_type_ == -1 || track_num_ == -1) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Missing TrackEntry data for " 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " TrackType " << track_type_ 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) << " TrackNum " << track_num_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (track_type_ != kWebMTrackTypeAudio && 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_type_ != kWebMTrackTypeVideo && 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_type_ != kWebMTrackTypeSubtitlesOrCaptions && 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_type_ != kWebMTrackTypeDescriptionsOrMetadata) { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Unexpected TrackType " << track_type_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TextKind text_track_kind = kTextNone; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (track_type_ == kWebMTrackTypeSubtitlesOrCaptions) { 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) text_track_kind = CodecIdToTextKind(codec_id_); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (text_track_kind == kTextNone) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Missing TrackEntry CodecID" 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " TrackNum " << track_num_; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (text_track_kind != kTextSubtitles && 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_track_kind != kTextCaptions) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Wrong TrackEntry CodecID" 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " TrackNum " << track_num_; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (track_type_ == kWebMTrackTypeDescriptionsOrMetadata) { 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) text_track_kind = CodecIdToTextKind(codec_id_); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (text_track_kind == kTextNone) { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Missing TrackEntry CodecID" 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " TrackNum " << track_num_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (text_track_kind != kTextDescriptions && 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_track_kind != kTextMetadata) { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Wrong TrackEntry CodecID" 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " TrackNum " << track_num_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string encryption_key_id; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (track_content_encodings_client_) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!track_content_encodings_client_->content_encodings().empty()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have multiple ContentEncoding in one track. Always choose the 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // key id in the first ContentEncoding as the key id of the track. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encryption_key_id = track_content_encodings_client_-> 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_encodings()[0]->encryption_key_id(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (track_type_ == kWebMTrackTypeAudio) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (audio_track_num_ == -1) { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_track_num_ = track_num_; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_encryption_key_id_ = encryption_key_id; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (default_duration_ == 0) { 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MEDIA_LOG(log_cb_) << "Illegal 0ns audio TrackEntry DefaultDuration"; 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch audio_default_duration_ = default_duration_; 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!audio_decoder_config_.IsValidConfig()); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!audio_client_.InitializeConfig( 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) codec_id_, codec_private_, seek_preroll_, codec_delay_, 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !audio_encryption_key_id_.empty(), &audio_decoder_config_)) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Ignoring audio track " << track_num_; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ignored_tracks_.insert(track_num_); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (track_type_ == kWebMTrackTypeVideo) { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (video_track_num_ == -1) { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_track_num_ = track_num_; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_encryption_key_id_ = encryption_key_id; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (default_duration_ == 0) { 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MEDIA_LOG(log_cb_) << "Illegal 0ns video TrackEntry DefaultDuration"; 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch video_default_duration_ = default_duration_; 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!video_decoder_config_.IsValidConfig()); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!video_client_.InitializeConfig( 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_id_, codec_private_, !video_encryption_key_id_.empty(), 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &video_decoder_config_)) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Ignoring video track " << track_num_; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ignored_tracks_.insert(track_num_); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (track_type_ == kWebMTrackTypeSubtitlesOrCaptions || 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_type_ == kWebMTrackTypeDescriptionsOrMetadata) { 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (ignore_text_tracks_) { 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MEDIA_LOG(log_cb_) << "Ignoring text track " << track_num_; 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ignored_tracks_.insert(track_num_); 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string track_num = base::Int64ToString(track_num_); 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) text_tracks_[track_num_] = TextTrackConfig( 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) text_track_kind, track_name_, track_language_, track_num); 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Unexpected TrackType " << track_type_; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_type_ = -1; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_num_ = -1; 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default_duration_ = -1; 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_name_.clear(); 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_language_.clear(); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_id_ = ""; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_private_.clear(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_content_encodings_client_.reset(); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_client_.Reset(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_client_.Reset(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMTracksParser::OnUInt(int id, int64 val) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64* dst = NULL; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kWebMIdTrackNumber: 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dst = &track_num_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kWebMIdTrackType: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dst = &track_type_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case kWebMIdSeekPreRoll: 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dst = &seek_preroll_; 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case kWebMIdCodecDelay: 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dst = &codec_delay_; 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case kWebMIdDefaultDuration: 284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dst = &default_duration_; 285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*dst != -1) { 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Multiple values for id " << std::hex << id 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " specified"; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dst = val; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMTracksParser::OnFloat(int id, double val) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMTracksParser::OnBinary(int id, const uint8* data, int size) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id == kWebMIdCodecPrivate) { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!codec_private_.empty()) { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Multiple CodecPrivate fields in a track."; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_private_.assign(data, data + size); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMTracksParser::OnString(int id, const std::string& str) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id == kWebMIdCodecID) { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!codec_id_.empty()) { 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Multiple CodecID fields in a track"; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) codec_id_ = str; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (id == kWebMIdName) { 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_name_ = str; 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (id == kWebMIdLanguage) { 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) track_language_ = str; 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 341