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_TRACKS_BUILDER_H_ 6 #define MEDIA_FORMATS_WEBM_TRACKS_BUILDER_H_ 7 8 #include <list> 9 #include <string> 10 #include <vector> 11 12 #include "base/basictypes.h" 13 14 namespace media { 15 16 class TracksBuilder { 17 public: 18 // If |allow_invalid_values| is false, some AddTrack() parameters will be 19 // basically checked and will assert if out of valid range. |codec_id|, 20 // |name|, |language| and any device-specific constraints are not checked. 21 explicit TracksBuilder(bool allow_invalid_values); 22 TracksBuilder(); // Sets |allow_invalid_values| to false. 23 ~TracksBuilder(); 24 25 // Only a non-negative |default_duration| will result in a serialized 26 // kWebMIdDefaultDuration element. Note, 0 is allowed here for testing only 27 // if |allow_invalid_values_| is true, since it is an illegal value for 28 // DefaultDuration. Similar applies to |audio_channels|, 29 // |audio_sampling_frequency|, |video_pixel_width| and |video_pixel_height|. 30 void AddVideoTrack(int track_num, int track_uid, const std::string& codec_id, 31 const std::string& name, const std::string& language, 32 int default_duration, int video_pixel_width, 33 int video_pixel_height); 34 void AddAudioTrack(int track_num, int track_uid, const std::string& codec_id, 35 const std::string& name, const std::string& language, 36 int default_duration, int audio_channels, 37 double audio_sampling_frequency); 38 void AddTextTrack(int track_num, int track_uid, const std::string& codec_id, 39 const std::string& name, const std::string& language); 40 41 std::vector<uint8> Finish(); 42 43 private: 44 void AddTrackInternal(int track_num, int track_type, int track_uid, 45 const std::string& codec_id, const std::string& name, 46 const std::string& language, int default_duration, 47 int video_pixel_width, int video_pixel_height, 48 int audio_channels, double audio_sampling_frequency); 49 int GetTracksSize() const; 50 int GetTracksPayloadSize() const; 51 void WriteTracks(uint8* buffer, int buffer_size) const; 52 53 class Track { 54 public: 55 Track(int track_num, int track_type, int track_uid, 56 const std::string& codec_id, const std::string& name, 57 const std::string& language, int default_duration, 58 int video_pixel_width, int video_pixel_height, 59 int audio_channels, double audio_sampling_frequency, 60 bool allow_invalid_values); 61 62 int GetSize() const; 63 void Write(uint8** buf, int* buf_size) const; 64 private: 65 int GetPayloadSize() const; 66 int GetVideoPayloadSize() const; 67 int GetAudioPayloadSize() const; 68 69 int track_num_; 70 int track_type_; 71 int track_uid_; 72 std::string codec_id_; 73 std::string name_; 74 std::string language_; 75 int default_duration_; 76 int video_pixel_width_; 77 int video_pixel_height_; 78 int audio_channels_; 79 double audio_sampling_frequency_; 80 }; 81 82 typedef std::list<Track> TrackList; 83 TrackList tracks_; 84 bool allow_invalid_values_; 85 86 DISALLOW_COPY_AND_ASSIGN(TracksBuilder); 87 }; 88 89 } // namespace media 90 91 #endif // MEDIA_FORMATS_WEBM_TRACKS_BUILDER_H_ 92