Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: media/formats/mp2t/mp2t_stream_parser.cc

Issue 1716503002: Basic media tracks implementation for media stream parsers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/mp2t_stream_parser.h" 5 #include "media/formats/mp2t/mp2t_stream_parser.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "media/base/media_tracks.h"
12 #include "media/base/stream_parser_buffer.h" 13 #include "media/base/stream_parser_buffer.h"
13 #include "media/base/text_track_config.h" 14 #include "media/base/text_track_config.h"
14 #include "media/base/timestamp_constants.h" 15 #include "media/base/timestamp_constants.h"
15 #include "media/formats/mp2t/es_parser.h" 16 #include "media/formats/mp2t/es_parser.h"
16 #include "media/formats/mp2t/es_parser_adts.h" 17 #include "media/formats/mp2t/es_parser_adts.h"
17 #include "media/formats/mp2t/es_parser_h264.h" 18 #include "media/formats/mp2t/es_parser_h264.h"
18 #include "media/formats/mp2t/es_parser_mpeg1audio.h" 19 #include "media/formats/mp2t/es_parser_mpeg1audio.h"
19 #include "media/formats/mp2t/mp2t_common.h" 20 #include "media/formats/mp2t/mp2t_common.h"
20 #include "media/formats/mp2t/ts_packet.h" 21 #include "media/formats/mp2t/ts_packet.h"
21 #include "media/formats/mp2t/ts_section.h" 22 #include "media/formats/mp2t/ts_section.h"
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 // Replace any non valid config with the 1st valid entry. 496 // Replace any non valid config with the 1st valid entry.
496 // This might happen if there was no available config before. 497 // This might happen if there was no available config before.
497 for (std::list<BufferQueueWithConfig>::iterator it = 498 for (std::list<BufferQueueWithConfig>::iterator it =
498 buffer_queue_chain_.begin(); it != buffer_queue_chain_.end(); ++it) { 499 buffer_queue_chain_.begin(); it != buffer_queue_chain_.end(); ++it) {
499 if (it->audio_config.IsValidConfig()) 500 if (it->audio_config.IsValidConfig())
500 break; 501 break;
501 it->audio_config = audio_decoder_config; 502 it->audio_config = audio_decoder_config;
502 } 503 }
503 } 504 }
504 505
506 scoped_ptr<MediaTracks> GenerateMediaTrackInfo(
507 const AudioDecoderConfig& audio_config,
508 const VideoDecoderConfig& video_config) {
509 scoped_ptr<MediaTracks> media_tracks(new MediaTracks());
510 // TODO(servolk): Implement proper sourcing of media track info as described
511 // in crbug.com/590085
512 if (audio_config.IsValidConfig()) {
513 media_tracks->AddAudioTrack(audio_config, "audio", "main", "", "");
514 }
515 if (video_config.IsValidConfig()) {
516 media_tracks->AddVideoTrack(video_config, "video", "main", "", "");
517 }
518 return media_tracks;
519 }
520
505 bool Mp2tStreamParser::FinishInitializationIfNeeded() { 521 bool Mp2tStreamParser::FinishInitializationIfNeeded() {
506 // Nothing to be done if already initialized. 522 // Nothing to be done if already initialized.
507 if (is_initialized_) 523 if (is_initialized_)
508 return true; 524 return true;
509 525
510 // Wait for more data to come to finish initialization. 526 // Wait for more data to come to finish initialization.
511 if (buffer_queue_chain_.empty()) 527 if (buffer_queue_chain_.empty())
512 return true; 528 return true;
513 529
514 // Wait for more data to come if one of the config is not available. 530 // Wait for more data to come if one of the config is not available.
515 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); 531 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front();
516 if (selected_audio_pid_ > 0 && 532 if (selected_audio_pid_ > 0 &&
517 !queue_with_config.audio_config.IsValidConfig()) 533 !queue_with_config.audio_config.IsValidConfig())
518 return true; 534 return true;
519 if (selected_video_pid_ > 0 && 535 if (selected_video_pid_ > 0 &&
520 !queue_with_config.video_config.IsValidConfig()) 536 !queue_with_config.video_config.IsValidConfig())
521 return true; 537 return true;
522 538
523 // Pass the config before invoking the initialization callback. 539 // Pass the config before invoking the initialization callback.
524 RCHECK(config_cb_.Run(queue_with_config.audio_config, 540 scoped_ptr<MediaTracks> media_tracks = GenerateMediaTrackInfo(
525 queue_with_config.video_config, 541 queue_with_config.audio_config, queue_with_config.video_config);
526 TextTrackConfigMap())); 542 RCHECK(config_cb_.Run(std::move(media_tracks), TextTrackConfigMap()));
527 queue_with_config.is_config_sent = true; 543 queue_with_config.is_config_sent = true;
528 544
529 // For Mpeg2 TS, the duration is not known. 545 // For Mpeg2 TS, the duration is not known.
530 DVLOG(1) << "Mpeg2TS stream parser initialization done"; 546 DVLOG(1) << "Mpeg2TS stream parser initialization done";
531 base::ResetAndReturn(&init_cb_).Run(InitParameters(kInfiniteDuration())); 547 base::ResetAndReturn(&init_cb_).Run(InitParameters(kInfiniteDuration()));
532 is_initialized_ = true; 548 is_initialized_ = true;
533 549
534 return true; 550 return true;
535 } 551 }
536 552
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 // Start a segment if needed. 629 // Start a segment if needed.
614 if (!segment_started_) { 630 if (!segment_started_) {
615 DVLOG(1) << "Starting a new segment"; 631 DVLOG(1) << "Starting a new segment";
616 segment_started_ = true; 632 segment_started_ = true;
617 new_segment_cb_.Run(); 633 new_segment_cb_.Run();
618 } 634 }
619 635
620 // Update the audio and video config if needed. 636 // Update the audio and video config if needed.
621 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); 637 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front();
622 if (!queue_with_config.is_config_sent) { 638 if (!queue_with_config.is_config_sent) {
623 if (!config_cb_.Run(queue_with_config.audio_config, 639 scoped_ptr<MediaTracks> media_tracks = GenerateMediaTrackInfo(
624 queue_with_config.video_config, 640 queue_with_config.audio_config, queue_with_config.video_config);
625 TextTrackConfigMap())) 641 if (!config_cb_.Run(std::move(media_tracks), TextTrackConfigMap()))
626 return false; 642 return false;
627 queue_with_config.is_config_sent = true; 643 queue_with_config.is_config_sent = true;
628 } 644 }
629 645
630 // Add buffers. 646 // Add buffers.
631 TextBufferQueueMap empty_text_map; 647 TextBufferQueueMap empty_text_map;
632 if (!queue_with_config.audio_queue.empty() || 648 if (!queue_with_config.audio_queue.empty() ||
633 !queue_with_config.video_queue.empty()) { 649 !queue_with_config.video_queue.empty()) {
634 if (!new_buffers_cb_.Run(queue_with_config.audio_queue, 650 if (!new_buffers_cb_.Run(queue_with_config.audio_queue,
635 queue_with_config.video_queue, 651 queue_with_config.video_queue,
636 empty_text_map)) { 652 empty_text_map)) {
637 return false; 653 return false;
638 } 654 }
639 } 655 }
640 656
641 buffer_queue_chain_.pop_front(); 657 buffer_queue_chain_.pop_front();
642 } 658 }
643 659
644 // Push an empty queue with the last audio/video config 660 // Push an empty queue with the last audio/video config
645 // so that buffers with the same config can be added later on. 661 // so that buffers with the same config can be added later on.
646 BufferQueueWithConfig queue_with_config( 662 BufferQueueWithConfig queue_with_config(
647 true, last_audio_config, last_video_config); 663 true, last_audio_config, last_video_config);
648 buffer_queue_chain_.push_back(queue_with_config); 664 buffer_queue_chain_.push_back(queue_with_config);
649 665
650 return true; 666 return true;
651 } 667 }
652 668
653 } // namespace mp2t 669 } // namespace mp2t
654 } // namespace media 670 } // namespace media
OLDNEW
« no previous file with comments | « media/formats/common/stream_parser_test_base.cc ('k') | media/formats/mp2t/mp2t_stream_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698