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#include "media/formats/mp2t/es_parser.h"
6
7#include "media/formats/common/offset_byte_queue.h"
8
9namespace media {
10namespace mp2t {
11
12EsParser::TimingDesc::TimingDesc()
13    : dts(kNoDecodeTimestamp()),
14      pts(kNoTimestamp()) {
15}
16
17EsParser::TimingDesc::TimingDesc(
18    DecodeTimestamp dts_in, base::TimeDelta pts_in)
19    : dts(dts_in),
20      pts(pts_in) {
21}
22
23EsParser::EsParser()
24    : es_queue_(new media::OffsetByteQueue()) {
25}
26
27EsParser::~EsParser() {
28}
29
30bool EsParser::Parse(const uint8* buf, int size,
31                     base::TimeDelta pts,
32                     DecodeTimestamp dts) {
33  DCHECK(buf);
34  DCHECK_GT(size, 0);
35
36  if (pts != kNoTimestamp()) {
37    // Link the end of the byte queue with the incoming timing descriptor.
38    TimingDesc timing_desc(dts, pts);
39    timing_desc_list_.push_back(
40        std::pair<int64, TimingDesc>(es_queue_->tail(), timing_desc));
41  }
42
43  // Add the incoming bytes to the ES queue.
44  es_queue_->Push(buf, size);
45  return ParseFromEsQueue();
46}
47
48void EsParser::Reset() {
49  es_queue_.reset(new media::OffsetByteQueue());
50  timing_desc_list_.clear();
51  ResetInternal();
52}
53
54EsParser::TimingDesc EsParser::GetTimingDescriptor(int64 es_byte_count) {
55  TimingDesc timing_desc;
56  while (!timing_desc_list_.empty() &&
57         timing_desc_list_.front().first <= es_byte_count) {
58    timing_desc = timing_desc_list_.front().second;
59    timing_desc_list_.pop_front();
60  }
61  return timing_desc;
62}
63
64}  // namespace mp2t
65}  // namespace media
66