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_MPEG_MPEG_AUDIO_STREAM_PARSER_BASE_H_ 6 #define MEDIA_FORMATS_MPEG_MPEG_AUDIO_STREAM_PARSER_BASE_H_ 7 8 #include <set> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/callback.h" 13 #include "media/base/audio_decoder_config.h" 14 #include "media/base/audio_timestamp_helper.h" 15 #include "media/base/bit_reader.h" 16 #include "media/base/byte_queue.h" 17 #include "media/base/media_export.h" 18 #include "media/base/stream_parser.h" 19 20 namespace media { 21 22 class MEDIA_EXPORT MPEGAudioStreamParserBase : public StreamParser { 23 public: 24 // |start_code_mask| is used to find the start of each frame header. Also 25 // referred to as the sync code in the MP3 and ADTS header specifications. 26 // |codec_delay| is the number of samples the decoder will output before the 27 // first real frame. 28 MPEGAudioStreamParserBase(uint32 start_code_mask, 29 AudioCodec audio_codec, 30 int codec_delay); 31 virtual ~MPEGAudioStreamParserBase(); 32 33 // StreamParser implementation. 34 virtual void Init(const InitCB& init_cb, 35 const NewConfigCB& config_cb, 36 const NewBuffersCB& new_buffers_cb, 37 bool ignore_text_tracks, 38 const NeedKeyCB& need_key_cb, 39 const NewMediaSegmentCB& new_segment_cb, 40 const base::Closure& end_of_segment_cb, 41 const LogCB& log_cb) OVERRIDE; 42 virtual void Flush() OVERRIDE; 43 virtual bool Parse(const uint8* buf, int size) OVERRIDE; 44 45 protected: 46 // Subclasses implement this method to parse format specific frame headers. 47 // |data| & |size| describe the data available for parsing. 48 // 49 // Implementations are expected to consume an entire frame header. It should 50 // only return a value greater than 0 when |data| has enough bytes to 51 // successfully parse & consume the entire frame header. 52 // 53 // |frame_size| - Required parameter that is set to the size of the frame, in 54 // bytes, including the frame header if the function returns a value > 0. 55 // |sample_rate| - Optional parameter that is set to the sample rate 56 // of the frame if this function returns a value > 0. 57 // |channel_layout| - Optional parameter that is set to the channel_layout 58 // of the frame if this function returns a value > 0. 59 // |sample_count| - Optional parameter that is set to the number of samples 60 // in the frame if this function returns a value > 0. 61 // |metadata_frame| - Optional parameter that is set to true if the frame has 62 // valid values for the above parameters, but no usable encoded data; only set 63 // to true if this function returns a value > 0. 64 // 65 // |sample_rate|, |channel_layout|, |sample_count|, |metadata_frame| may be 66 // NULL if the caller is not interested in receiving these values from the 67 // frame header. 68 // 69 // If |metadata_frame| is true, the MPEGAudioStreamParserBase will discard the 70 // frame after consuming the metadata values above. 71 // 72 // Returns: 73 // > 0 : The number of bytes parsed. 74 // 0 : If more data is needed to parse the entire frame header. 75 // < 0 : An error was encountered during parsing. 76 virtual int ParseFrameHeader(const uint8* data, 77 int size, 78 int* frame_size, 79 int* sample_rate, 80 ChannelLayout* channel_layout, 81 int* sample_count, 82 bool* metadata_frame) const = 0; 83 84 const LogCB& log_cb() const { return log_cb_; } 85 86 private: 87 enum State { 88 UNINITIALIZED, 89 INITIALIZED, 90 PARSE_ERROR 91 }; 92 93 void ChangeState(State state); 94 95 // Parsing functions for various byte stream elements. |data| & |size| 96 // describe the data available for parsing. 97 // 98 // Returns: 99 // > 0 : The number of bytes parsed. 100 // 0 : If more data is needed to parse the entire element. 101 // < 0 : An error was encountered during parsing. 102 int ParseFrame(const uint8* data, int size, BufferQueue* buffers); 103 int ParseIcecastHeader(const uint8* data, int size); 104 int ParseID3v1(const uint8* data, int size); 105 int ParseID3v2(const uint8* data, int size); 106 107 // Parses an ID3v2 "sync safe" integer. 108 // |reader| - A BitReader to read from. 109 // |value| - Set to the integer value read, if true is returned. 110 // 111 // Returns true if the integer was successfully parsed and |value| 112 // was set. 113 // Returns false if an error was encountered. The state of |value| is 114 // undefined when false is returned. 115 bool ParseSyncSafeInt(BitReader* reader, int32* value); 116 117 // Scans |data| for the next valid start code. 118 // Returns: 119 // > 0 : The number of bytes that should be skipped to reach the 120 // next start code.. 121 // 0 : If a valid start code was not found and more data is needed. 122 // < 0 : An error was encountered during parsing. 123 int FindNextValidStartCode(const uint8* data, int size) const; 124 125 // Sends the buffers in |buffers| to |new_buffers_cb_| and then clears 126 // |buffers|. 127 // If |end_of_segment| is set to true, then |end_of_segment_cb_| is called 128 // after |new_buffers_cb_| to signal that these buffers represent the end of a 129 // media segment. 130 // Returns true if the buffers are sent successfully. 131 bool SendBuffers(BufferQueue* buffers, bool end_of_segment); 132 133 State state_; 134 135 InitCB init_cb_; 136 NewConfigCB config_cb_; 137 NewBuffersCB new_buffers_cb_; 138 NewMediaSegmentCB new_segment_cb_; 139 base::Closure end_of_segment_cb_; 140 LogCB log_cb_; 141 142 ByteQueue queue_; 143 144 AudioDecoderConfig config_; 145 scoped_ptr<AudioTimestampHelper> timestamp_helper_; 146 bool in_media_segment_; 147 const uint32 start_code_mask_; 148 const AudioCodec audio_codec_; 149 const int codec_delay_; 150 151 DISALLOW_COPY_AND_ASSIGN(MPEGAudioStreamParserBase); 152 }; 153 154 } // namespace media 155 156 #endif // MEDIA_FORMATS_MPEG_MPEG_AUDIO_STREAM_PARSER_BASE_H_ 157