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