15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <list>
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <utility>
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/callback.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/compiler_specific.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/time/time.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/audio_decoder_config.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/byte_queue.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/mp2t/es_parser.h"
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace media {
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class AudioTimestampHelper;
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class BitReader;
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class StreamParserBuffer;
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace media {
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace mp2t {
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EsParserAdts : public EsParser {
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  typedef base::Callback<void(const AudioDecoderConfig&)> NewAudioConfigCB;
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EsParserAdts(const NewAudioConfigCB& new_audio_config_cb,
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               const EmitBufferCB& emit_buffer_cb,
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               bool sbr_in_mimetype);
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~EsParserAdts();
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // EsParser implementation.
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool Parse(const uint8* buf, int size,
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                     base::TimeDelta pts,
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                     base::TimeDelta dts) OVERRIDE;
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void Flush() OVERRIDE;
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void Reset() OVERRIDE;
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Used to link a PTS with a byte position in the ES stream.
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  typedef std::pair<int, base::TimeDelta> EsPts;
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  typedef std::list<EsPts> EsPtsList;
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Signal any audio configuration change (if any).
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Return false if the current audio config is not
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // a supported ADTS audio config.
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool UpdateAudioConfiguration(const uint8* adts_header);
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Discard some bytes from the ES stream.
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void DiscardEs(int nbytes);
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Callbacks:
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // - to signal a new audio configuration,
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // - to send ES buffers.
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NewAudioConfigCB new_audio_config_cb_;
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EmitBufferCB emit_buffer_cb_;
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // True when AAC SBR extension is signalled in the mimetype
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // (mp4a.40.5 in the codecs parameter).
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool sbr_in_mimetype_;
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Bytes of the ES stream that have not been emitted yet.
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ByteQueue es_byte_queue_;
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // List of PTS associated with a position in the ES stream.
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EsPtsList pts_list_;
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Interpolated PTS for frames that don't have one.
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<AudioTimestampHelper> audio_timestamp_helper_;
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Last audio config.
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AudioDecoderConfig last_audio_decoder_config_;
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EsParserAdts);
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace mp2t
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace media
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
87