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

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

Issue 539343002: Make the timestamp unroll offset consistent accross PES pids. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove the global timestamp offset from this CL. Created 6 years, 3 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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 // stream parser already involves the end of the current segment. 210 // stream parser already involves the end of the current segment.
211 segment_started_ = false; 211 segment_started_ = false;
212 212
213 // Remove any bytes left in the TS buffer. 213 // Remove any bytes left in the TS buffer.
214 // (i.e. any partial TS packet => less than 188 bytes). 214 // (i.e. any partial TS packet => less than 188 bytes).
215 ts_byte_queue_.Reset(); 215 ts_byte_queue_.Reset();
216 216
217 // Reset the selected PIDs. 217 // Reset the selected PIDs.
218 selected_audio_pid_ = -1; 218 selected_audio_pid_ = -1;
219 selected_video_pid_ = -1; 219 selected_video_pid_ = -1;
220
221 // Reset the timestamp unroller.
222 timestamp_unroller_.Reset();
220 } 223 }
221 224
222 bool Mp2tStreamParser::Parse(const uint8* buf, int size) { 225 bool Mp2tStreamParser::Parse(const uint8* buf, int size) {
223 DVLOG(1) << "Mp2tStreamParser::Parse size=" << size; 226 DVLOG(1) << "Mp2tStreamParser::Parse size=" << size;
224 227
225 // Add the data to the parser state. 228 // Add the data to the parser state.
226 ts_byte_queue_.Push(buf, size); 229 ts_byte_queue_.Push(buf, size);
227 230
228 while (true) { 231 while (true) {
229 const uint8* ts_buffer; 232 const uint8* ts_buffer;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 pes_pid), 352 pes_pid),
350 sbr_in_mimetype_)); 353 sbr_in_mimetype_));
351 is_audio = true; 354 is_audio = true;
352 } else { 355 } else {
353 return; 356 return;
354 } 357 }
355 358
356 // Create the PES state here. 359 // Create the PES state here.
357 DVLOG(1) << "Create a new PES state"; 360 DVLOG(1) << "Create a new PES state";
358 scoped_ptr<TsSection> pes_section_parser( 361 scoped_ptr<TsSection> pes_section_parser(
359 new TsSectionPes(es_parser.Pass())); 362 new TsSectionPes(es_parser.Pass(), &timestamp_unroller_));
360 PidState::PidType pid_type = 363 PidState::PidType pid_type =
361 is_audio ? PidState::kPidAudioPes : PidState::kPidVideoPes; 364 is_audio ? PidState::kPidAudioPes : PidState::kPidVideoPes;
362 scoped_ptr<PidState> pes_pid_state( 365 scoped_ptr<PidState> pes_pid_state(
363 new PidState(pes_pid, pid_type, pes_section_parser.Pass())); 366 new PidState(pes_pid, pid_type, pes_section_parser.Pass()));
364 pids_.insert(std::pair<int, PidState*>(pes_pid, pes_pid_state.release())); 367 pids_.insert(std::pair<int, PidState*>(pes_pid, pes_pid_state.release()));
365 368
366 // A new PES pid has been added, the PID filter might change. 369 // A new PES pid has been added, the PID filter might change.
367 UpdatePidFilter(); 370 UpdatePidFilter();
368 } 371 }
369 372
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 DVLOG(LOG_LEVEL_ES) 515 DVLOG(LOG_LEVEL_ES)
513 << "OnEmitAudioBuffer: " 516 << "OnEmitAudioBuffer: "
514 << " size=" 517 << " size="
515 << stream_parser_buffer->data_size() 518 << stream_parser_buffer->data_size()
516 << " dts=" 519 << " dts="
517 << stream_parser_buffer->GetDecodeTimestamp().InMilliseconds() 520 << stream_parser_buffer->GetDecodeTimestamp().InMilliseconds()
518 << " pts=" 521 << " pts="
519 << stream_parser_buffer->timestamp().InMilliseconds() 522 << stream_parser_buffer->timestamp().InMilliseconds()
520 << " dur=" 523 << " dur="
521 << stream_parser_buffer->duration().InMilliseconds(); 524 << stream_parser_buffer->duration().InMilliseconds();
522 stream_parser_buffer->set_timestamp(
523 stream_parser_buffer->timestamp() - time_offset_);
524 stream_parser_buffer->SetDecodeTimestamp(
525 stream_parser_buffer->GetDecodeTimestamp() - time_offset_);
526 525
527 // Ignore the incoming buffer if it is not associated with any config. 526 // Ignore the incoming buffer if it is not associated with any config.
528 if (buffer_queue_chain_.empty()) { 527 if (buffer_queue_chain_.empty()) {
529 NOTREACHED() << "Cannot provide buffers before configs"; 528 NOTREACHED() << "Cannot provide buffers before configs";
530 return; 529 return;
531 } 530 }
532 531
533 buffer_queue_chain_.back().audio_queue.push_back(stream_parser_buffer); 532 buffer_queue_chain_.back().audio_queue.push_back(stream_parser_buffer);
534 } 533 }
535 534
536 void Mp2tStreamParser::OnEmitVideoBuffer( 535 void Mp2tStreamParser::OnEmitVideoBuffer(
537 int pes_pid, 536 int pes_pid,
538 scoped_refptr<StreamParserBuffer> stream_parser_buffer) { 537 scoped_refptr<StreamParserBuffer> stream_parser_buffer) {
539 DCHECK_EQ(pes_pid, selected_video_pid_); 538 DCHECK_EQ(pes_pid, selected_video_pid_);
540 539
541 DVLOG(LOG_LEVEL_ES) 540 DVLOG(LOG_LEVEL_ES)
542 << "OnEmitVideoBuffer" 541 << "OnEmitVideoBuffer"
543 << " size=" 542 << " size="
544 << stream_parser_buffer->data_size() 543 << stream_parser_buffer->data_size()
545 << " dts=" 544 << " dts="
546 << stream_parser_buffer->GetDecodeTimestamp().InMilliseconds() 545 << stream_parser_buffer->GetDecodeTimestamp().InMilliseconds()
547 << " pts=" 546 << " pts="
548 << stream_parser_buffer->timestamp().InMilliseconds() 547 << stream_parser_buffer->timestamp().InMilliseconds()
549 << " dur=" 548 << " dur="
550 << stream_parser_buffer->duration().InMilliseconds() 549 << stream_parser_buffer->duration().InMilliseconds()
551 << " IsKeyframe=" 550 << " IsKeyframe="
552 << stream_parser_buffer->IsKeyframe(); 551 << stream_parser_buffer->IsKeyframe();
553 stream_parser_buffer->set_timestamp(
554 stream_parser_buffer->timestamp() - time_offset_);
555 stream_parser_buffer->SetDecodeTimestamp(
556 stream_parser_buffer->GetDecodeTimestamp() - time_offset_);
557 552
558 // Ignore the incoming buffer if it is not associated with any config. 553 // Ignore the incoming buffer if it is not associated with any config.
559 if (buffer_queue_chain_.empty()) { 554 if (buffer_queue_chain_.empty()) {
560 NOTREACHED() << "Cannot provide buffers before configs"; 555 NOTREACHED() << "Cannot provide buffers before configs";
561 return; 556 return;
562 } 557 }
563 558
564 buffer_queue_chain_.back().video_queue.push_back(stream_parser_buffer); 559 buffer_queue_chain_.back().video_queue.push_back(stream_parser_buffer);
565 } 560 }
566 561
(...skipping 14 matching lines...) Expand all
581 buffer_queue_chain_.back().video_config; 576 buffer_queue_chain_.back().video_config;
582 577
583 // Do not have all the configs, need more data. 578 // Do not have all the configs, need more data.
584 if (selected_audio_pid_ >= 0 && !last_audio_config.IsValidConfig()) 579 if (selected_audio_pid_ >= 0 && !last_audio_config.IsValidConfig())
585 return true; 580 return true;
586 if (selected_video_pid_ >= 0 && !last_video_config.IsValidConfig()) 581 if (selected_video_pid_ >= 0 && !last_video_config.IsValidConfig())
587 return true; 582 return true;
588 583
589 // Buffer emission. 584 // Buffer emission.
590 while (!buffer_queue_chain_.empty()) { 585 while (!buffer_queue_chain_.empty()) {
586
damienv1 2014/09/05 23:02:20 Remove line.
591 // Start a segment if needed. 587 // Start a segment if needed.
592 if (!segment_started_) { 588 if (!segment_started_) {
593 DVLOG(1) << "Starting a new segment"; 589 DVLOG(1) << "Starting a new segment";
594 segment_started_ = true; 590 segment_started_ = true;
595 new_segment_cb_.Run(); 591 new_segment_cb_.Run();
596 } 592 }
597 593
598 // Update the audio and video config if needed. 594 // Update the audio and video config if needed.
599 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front(); 595 BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front();
600 if (!queue_with_config.is_config_sent) { 596 if (!queue_with_config.is_config_sent) {
(...skipping 22 matching lines...) Expand all
623 // so that buffers with the same config can be added later on. 619 // so that buffers with the same config can be added later on.
624 BufferQueueWithConfig queue_with_config( 620 BufferQueueWithConfig queue_with_config(
625 true, last_audio_config, last_video_config); 621 true, last_audio_config, last_video_config);
626 buffer_queue_chain_.push_back(queue_with_config); 622 buffer_queue_chain_.push_back(queue_with_config);
627 623
628 return true; 624 return true;
629 } 625 }
630 626
631 } // namespace mp2t 627 } // namespace mp2t
632 } // namespace media 628 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698