OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/formats/mp2t/es_parser_mpeg1audio.h" | 5 #include "media/formats/mp2t/es_parser_mpeg1audio.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/basictypes.h" | |
10 #include "base/bind.h" | 9 #include "base/bind.h" |
11 #include "base/logging.h" | 10 #include "base/logging.h" |
12 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
13 #include "media/base/audio_timestamp_helper.h" | 12 #include "media/base/audio_timestamp_helper.h" |
14 #include "media/base/bit_reader.h" | 13 #include "media/base/bit_reader.h" |
15 #include "media/base/channel_layout.h" | 14 #include "media/base/channel_layout.h" |
16 #include "media/base/stream_parser_buffer.h" | 15 #include "media/base/stream_parser_buffer.h" |
17 #include "media/base/timestamp_constants.h" | 16 #include "media/base/timestamp_constants.h" |
18 #include "media/formats/common/offset_byte_queue.h" | 17 #include "media/formats/common/offset_byte_queue.h" |
19 #include "media/formats/mp2t/mp2t_common.h" | 18 #include "media/formats/mp2t/mp2t_common.h" |
20 #include "media/formats/mpeg/mpeg1_audio_stream_parser.h" | 19 #include "media/formats/mpeg/mpeg1_audio_stream_parser.h" |
21 | 20 |
22 namespace media { | 21 namespace media { |
23 namespace mp2t { | 22 namespace mp2t { |
24 | 23 |
25 struct EsParserMpeg1Audio::Mpeg1AudioFrame { | 24 struct EsParserMpeg1Audio::Mpeg1AudioFrame { |
26 // Pointer to the ES data. | 25 // Pointer to the ES data. |
27 const uint8* data; | 26 const uint8_t* data; |
28 | 27 |
29 // Frame size. | 28 // Frame size. |
30 int size; | 29 int size; |
31 | 30 |
32 // Number of samples in the frame. | 31 // Number of samples in the frame. |
33 int sample_count; | 32 int sample_count; |
34 | 33 |
35 // Frame offset in the ES queue. | 34 // Frame offset in the ES queue. |
36 int64 queue_offset; | 35 int64_t queue_offset; |
37 }; | 36 }; |
38 | 37 |
39 EsParserMpeg1Audio::EsParserMpeg1Audio( | 38 EsParserMpeg1Audio::EsParserMpeg1Audio( |
40 const NewAudioConfigCB& new_audio_config_cb, | 39 const NewAudioConfigCB& new_audio_config_cb, |
41 const EmitBufferCB& emit_buffer_cb, | 40 const EmitBufferCB& emit_buffer_cb, |
42 const scoped_refptr<MediaLog>& media_log) | 41 const scoped_refptr<MediaLog>& media_log) |
43 : media_log_(media_log), | 42 : media_log_(media_log), |
44 new_audio_config_cb_(new_audio_config_cb), | 43 new_audio_config_cb_(new_audio_config_cb), |
45 emit_buffer_cb_(emit_buffer_cb) { | 44 emit_buffer_cb_(emit_buffer_cb) { |
46 } | 45 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 void EsParserMpeg1Audio::Flush() { | 100 void EsParserMpeg1Audio::Flush() { |
102 } | 101 } |
103 | 102 |
104 void EsParserMpeg1Audio::ResetInternal() { | 103 void EsParserMpeg1Audio::ResetInternal() { |
105 last_audio_decoder_config_ = AudioDecoderConfig(); | 104 last_audio_decoder_config_ = AudioDecoderConfig(); |
106 } | 105 } |
107 | 106 |
108 bool EsParserMpeg1Audio::LookForMpeg1AudioFrame( | 107 bool EsParserMpeg1Audio::LookForMpeg1AudioFrame( |
109 Mpeg1AudioFrame* mpeg1audio_frame) { | 108 Mpeg1AudioFrame* mpeg1audio_frame) { |
110 int es_size; | 109 int es_size; |
111 const uint8* es; | 110 const uint8_t* es; |
112 es_queue_->Peek(&es, &es_size); | 111 es_queue_->Peek(&es, &es_size); |
113 | 112 |
114 int max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize; | 113 int max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize; |
115 if (max_offset <= 0) | 114 if (max_offset <= 0) |
116 return false; | 115 return false; |
117 | 116 |
118 for (int offset = 0; offset < max_offset; offset++) { | 117 for (int offset = 0; offset < max_offset; offset++) { |
119 const uint8* cur_buf = &es[offset]; | 118 const uint8_t* cur_buf = &es[offset]; |
120 if (cur_buf[0] != 0xff) | 119 if (cur_buf[0] != 0xff) |
121 continue; | 120 continue; |
122 | 121 |
123 int remaining_size = es_size - offset; | 122 int remaining_size = es_size - offset; |
124 DCHECK_GE(remaining_size, MPEG1AudioStreamParser::kHeaderSize); | 123 DCHECK_GE(remaining_size, MPEG1AudioStreamParser::kHeaderSize); |
125 MPEG1AudioStreamParser::Header header; | 124 MPEG1AudioStreamParser::Header header; |
126 if (!MPEG1AudioStreamParser::ParseHeader(media_log_, cur_buf, &header)) | 125 if (!MPEG1AudioStreamParser::ParseHeader(media_log_, cur_buf, &header)) |
127 continue; | 126 continue; |
128 | 127 |
129 if (remaining_size < header.frame_size) { | 128 if (remaining_size < header.frame_size) { |
(...skipping 24 matching lines...) Expand all Loading... |
154 << base::HexEncode(mpeg1audio_frame->data, | 153 << base::HexEncode(mpeg1audio_frame->data, |
155 MPEG1AudioStreamParser::kHeaderSize); | 154 MPEG1AudioStreamParser::kHeaderSize); |
156 return true; | 155 return true; |
157 } | 156 } |
158 | 157 |
159 es_queue_->Pop(max_offset); | 158 es_queue_->Pop(max_offset); |
160 return false; | 159 return false; |
161 } | 160 } |
162 | 161 |
163 bool EsParserMpeg1Audio::UpdateAudioConfiguration( | 162 bool EsParserMpeg1Audio::UpdateAudioConfiguration( |
164 const uint8* mpeg1audio_header) { | 163 const uint8_t* mpeg1audio_header) { |
165 MPEG1AudioStreamParser::Header header; | 164 MPEG1AudioStreamParser::Header header; |
166 if (!MPEG1AudioStreamParser::ParseHeader(media_log_, mpeg1audio_header, | 165 if (!MPEG1AudioStreamParser::ParseHeader(media_log_, mpeg1audio_header, |
167 &header)) { | 166 &header)) { |
168 return false; | 167 return false; |
169 } | 168 } |
170 | 169 |
171 // TODO(damienv): Verify whether Android playback requires the extra data | 170 // TODO(damienv): Verify whether Android playback requires the extra data |
172 // field for Mpeg1 audio. If yes, we should generate this field. | 171 // field for Mpeg1 audio. If yes, we should generate this field. |
173 AudioDecoderConfig audio_decoder_config( | 172 AudioDecoderConfig audio_decoder_config( |
174 kCodecMP3, | 173 kCodecMP3, |
(...skipping 26 matching lines...) Expand all Loading... |
201 } | 200 } |
202 | 201 |
203 void EsParserMpeg1Audio::SkipMpeg1AudioFrame( | 202 void EsParserMpeg1Audio::SkipMpeg1AudioFrame( |
204 const Mpeg1AudioFrame& mpeg1audio_frame) { | 203 const Mpeg1AudioFrame& mpeg1audio_frame) { |
205 DCHECK_EQ(mpeg1audio_frame.queue_offset, es_queue_->head()); | 204 DCHECK_EQ(mpeg1audio_frame.queue_offset, es_queue_->head()); |
206 es_queue_->Pop(mpeg1audio_frame.size); | 205 es_queue_->Pop(mpeg1audio_frame.size); |
207 } | 206 } |
208 | 207 |
209 } // namespace mp2t | 208 } // namespace mp2t |
210 } // namespace media | 209 } // namespace media |
OLD | NEW |