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