1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_FORMATS_WEBM_WEBM_TRACKS_PARSER_H_
6#define MEDIA_FORMATS_WEBM_WEBM_TRACKS_PARSER_H_
7
8#include <map>
9#include <set>
10#include <string>
11#include <vector>
12
13#include "base/compiler_specific.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/time/time.h"
16#include "media/base/audio_decoder_config.h"
17#include "media/base/media_log.h"
18#include "media/base/text_track_config.h"
19#include "media/base/video_decoder_config.h"
20#include "media/formats/webm/webm_audio_client.h"
21#include "media/formats/webm/webm_content_encodings_client.h"
22#include "media/formats/webm/webm_parser.h"
23#include "media/formats/webm/webm_video_client.h"
24
25namespace media {
26
27// Parser for WebM Tracks element.
28class MEDIA_EXPORT WebMTracksParser : public WebMParserClient {
29 public:
30  explicit WebMTracksParser(const LogCB& log_cb, bool ignore_text_tracks);
31  virtual ~WebMTracksParser();
32
33  // Parses a WebM Tracks element in |buf|.
34  //
35  // Returns -1 if the parse fails.
36  // Returns 0 if more data is needed.
37  // Returns the number of bytes parsed on success.
38  int Parse(const uint8* buf, int size);
39
40  int64 audio_track_num() const { return audio_track_num_; }
41  int64 video_track_num() const { return video_track_num_; }
42
43  // If TrackEntry DefaultDuration field existed for the associated audio or
44  // video track, returns that value converted from ns to base::TimeDelta with
45  // precision not greater than |timecode_scale_in_us|. Defaults to
46  // kNoTimestamp().
47  base::TimeDelta GetAudioDefaultDuration(
48      const double timecode_scale_in_us) const;
49  base::TimeDelta GetVideoDefaultDuration(
50      const double timecode_scale_in_us) const;
51
52  const std::set<int64>& ignored_tracks() const { return ignored_tracks_; }
53
54  const std::string& audio_encryption_key_id() const {
55    return audio_encryption_key_id_;
56  }
57
58  const AudioDecoderConfig& audio_decoder_config() {
59    return audio_decoder_config_;
60  }
61
62  const std::string& video_encryption_key_id() const {
63    return video_encryption_key_id_;
64  }
65
66  const VideoDecoderConfig& video_decoder_config() {
67    return video_decoder_config_;
68  }
69
70  typedef std::map<int, TextTrackConfig> TextTracks;
71
72  const TextTracks& text_tracks() const {
73    return text_tracks_;
74  }
75
76 private:
77  // WebMParserClient implementation.
78  virtual WebMParserClient* OnListStart(int id) OVERRIDE;
79  virtual bool OnListEnd(int id) OVERRIDE;
80  virtual bool OnUInt(int id, int64 val) OVERRIDE;
81  virtual bool OnFloat(int id, double val) OVERRIDE;
82  virtual bool OnBinary(int id, const uint8* data, int size) OVERRIDE;
83  virtual bool OnString(int id, const std::string& str) OVERRIDE;
84
85  int64 track_type_;
86  int64 track_num_;
87  int64 track_uid_;
88  std::string track_name_;
89  std::string track_language_;
90  std::string codec_id_;
91  std::vector<uint8> codec_private_;
92  int64 seek_preroll_;
93  int64 codec_delay_;
94  int64 default_duration_;
95  scoped_ptr<WebMContentEncodingsClient> track_content_encodings_client_;
96
97  int64 audio_track_num_;
98  int64 audio_default_duration_;
99  int64 video_track_num_;
100  int64 video_default_duration_;
101  bool ignore_text_tracks_;
102  TextTracks text_tracks_;
103  std::set<int64> ignored_tracks_;
104  std::string audio_encryption_key_id_;
105  std::string video_encryption_key_id_;
106  LogCB log_cb_;
107
108  WebMAudioClient audio_client_;
109  AudioDecoderConfig audio_decoder_config_;
110
111  WebMVideoClient video_client_;
112  VideoDecoderConfig video_decoder_config_;
113
114  DISALLOW_COPY_AND_ASSIGN(WebMTracksParser);
115};
116
117}  // namespace media
118
119#endif  // MEDIA_FORMATS_WEBM_WEBM_TRACKS_PARSER_H_
120