OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/mp2t/mp2t_stream_parser.h" | 5 #include "media/mp2t/mp2t_stream_parser.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "media/base/audio_decoder_config.h" | 10 #include "media/base/audio_decoder_config.h" |
11 #include "media/base/buffers.h" | 11 #include "media/base/buffers.h" |
12 #include "media/base/stream_parser_buffer.h" | 12 #include "media/base/stream_parser_buffer.h" |
| 13 #include "media/base/text_track_config.h" |
13 #include "media/base/video_decoder_config.h" | 14 #include "media/base/video_decoder_config.h" |
14 #include "media/mp2t/es_parser.h" | 15 #include "media/mp2t/es_parser.h" |
15 #include "media/mp2t/es_parser_adts.h" | 16 #include "media/mp2t/es_parser_adts.h" |
16 #include "media/mp2t/es_parser_h264.h" | 17 #include "media/mp2t/es_parser_h264.h" |
17 #include "media/mp2t/mp2t_common.h" | 18 #include "media/mp2t/mp2t_common.h" |
18 #include "media/mp2t/ts_packet.h" | 19 #include "media/mp2t/ts_packet.h" |
19 #include "media/mp2t/ts_section.h" | 20 #include "media/mp2t/ts_section.h" |
20 #include "media/mp2t/ts_section_pat.h" | 21 #include "media/mp2t/ts_section_pat.h" |
21 #include "media/mp2t/ts_section_pes.h" | 22 #include "media/mp2t/ts_section_pes.h" |
22 #include "media/mp2t/ts_section_pmt.h" | 23 #include "media/mp2t/ts_section_pmt.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 } | 160 } |
160 | 161 |
161 Mp2tStreamParser::~Mp2tStreamParser() { | 162 Mp2tStreamParser::~Mp2tStreamParser() { |
162 STLDeleteValues(&pids_); | 163 STLDeleteValues(&pids_); |
163 } | 164 } |
164 | 165 |
165 void Mp2tStreamParser::Init( | 166 void Mp2tStreamParser::Init( |
166 const InitCB& init_cb, | 167 const InitCB& init_cb, |
167 const NewConfigCB& config_cb, | 168 const NewConfigCB& config_cb, |
168 const NewBuffersCB& new_buffers_cb, | 169 const NewBuffersCB& new_buffers_cb, |
169 const NewTextBuffersCB& text_cb, | 170 const NewTextBuffersCB& /* text_cb */ , |
170 const NeedKeyCB& need_key_cb, | 171 const NeedKeyCB& need_key_cb, |
171 const AddTextTrackCB& add_text_track_cb, | |
172 const NewMediaSegmentCB& new_segment_cb, | 172 const NewMediaSegmentCB& new_segment_cb, |
173 const base::Closure& end_of_segment_cb, | 173 const base::Closure& end_of_segment_cb, |
174 const LogCB& log_cb) { | 174 const LogCB& log_cb) { |
175 DCHECK(!is_initialized_); | 175 DCHECK(!is_initialized_); |
176 DCHECK(init_cb_.is_null()); | 176 DCHECK(init_cb_.is_null()); |
177 DCHECK(!init_cb.is_null()); | 177 DCHECK(!init_cb.is_null()); |
178 DCHECK(!config_cb.is_null()); | 178 DCHECK(!config_cb.is_null()); |
179 DCHECK(!new_buffers_cb.is_null()); | 179 DCHECK(!new_buffers_cb.is_null()); |
180 DCHECK(!need_key_cb.is_null()); | 180 DCHECK(!need_key_cb.is_null()); |
181 DCHECK(!end_of_segment_cb.is_null()); | 181 DCHECK(!end_of_segment_cb.is_null()); |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); | 469 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); |
470 if (selected_audio_pid_ > 0 && | 470 if (selected_audio_pid_ > 0 && |
471 !queue_with_config.audio_config.IsValidConfig()) | 471 !queue_with_config.audio_config.IsValidConfig()) |
472 return true; | 472 return true; |
473 if (selected_video_pid_ > 0 && | 473 if (selected_video_pid_ > 0 && |
474 !queue_with_config.video_config.IsValidConfig()) | 474 !queue_with_config.video_config.IsValidConfig()) |
475 return true; | 475 return true; |
476 | 476 |
477 // Pass the config before invoking the initialization callback. | 477 // Pass the config before invoking the initialization callback. |
478 RCHECK(config_cb_.Run(queue_with_config.audio_config, | 478 RCHECK(config_cb_.Run(queue_with_config.audio_config, |
479 queue_with_config.video_config)); | 479 queue_with_config.video_config, |
| 480 TextTrackConfigMap())); |
480 queue_with_config.is_config_sent = true; | 481 queue_with_config.is_config_sent = true; |
481 | 482 |
482 // For Mpeg2 TS, the duration is not known. | 483 // For Mpeg2 TS, the duration is not known. |
483 DVLOG(1) << "Mpeg2TS stream parser initialization done"; | 484 DVLOG(1) << "Mpeg2TS stream parser initialization done"; |
484 init_cb_.Run(true, kInfiniteDuration()); | 485 init_cb_.Run(true, kInfiniteDuration()); |
485 is_initialized_ = true; | 486 is_initialized_ = true; |
486 | 487 |
487 return true; | 488 return true; |
488 } | 489 } |
489 | 490 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 if (!segment_started_) { | 579 if (!segment_started_) { |
579 DVLOG(1) << "Starting a new segment"; | 580 DVLOG(1) << "Starting a new segment"; |
580 segment_started_ = true; | 581 segment_started_ = true; |
581 new_segment_cb_.Run(); | 582 new_segment_cb_.Run(); |
582 } | 583 } |
583 | 584 |
584 // Update the audio and video config if needed. | 585 // Update the audio and video config if needed. |
585 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); | 586 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); |
586 if (!queue_with_config.is_config_sent) { | 587 if (!queue_with_config.is_config_sent) { |
587 if (!config_cb_.Run(queue_with_config.audio_config, | 588 if (!config_cb_.Run(queue_with_config.audio_config, |
588 queue_with_config.video_config)) | 589 queue_with_config.video_config, |
| 590 TextTrackConfigMap())) |
589 return false; | 591 return false; |
590 queue_with_config.is_config_sent = true; | 592 queue_with_config.is_config_sent = true; |
591 } | 593 } |
592 | 594 |
593 // Add buffers. | 595 // Add buffers. |
594 if (!queue_with_config.audio_queue.empty() || | 596 if (!queue_with_config.audio_queue.empty() || |
595 !queue_with_config.video_queue.empty()) { | 597 !queue_with_config.video_queue.empty()) { |
596 if (!new_buffers_cb_.Run(queue_with_config.audio_queue, | 598 if (!new_buffers_cb_.Run(queue_with_config.audio_queue, |
597 queue_with_config.video_queue)) { | 599 queue_with_config.video_queue)) { |
598 return false; | 600 return false; |
599 } | 601 } |
600 } | 602 } |
601 | 603 |
602 buffer_queue_chain_.pop_front(); | 604 buffer_queue_chain_.pop_front(); |
603 } | 605 } |
604 | 606 |
605 // Push an empty queue with the last audio/video config | 607 // Push an empty queue with the last audio/video config |
606 // so that buffers with the same config can be added later on. | 608 // so that buffers with the same config can be added later on. |
607 BufferQueueWithConfig queue_with_config( | 609 BufferQueueWithConfig queue_with_config( |
608 true, last_audio_config, last_video_config); | 610 true, last_audio_config, last_video_config); |
609 buffer_queue_chain_.push_back(queue_with_config); | 611 buffer_queue_chain_.push_back(queue_with_config); |
610 | 612 |
611 return true; | 613 return true; |
612 } | 614 } |
613 | 615 |
614 } // namespace mp2t | 616 } // namespace mp2t |
615 } // namespace media | 617 } // namespace media |
616 | 618 |
OLD | NEW |