146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef MEDIA_CAST_RECEIVER_AUDIO_DECODER_H_ 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define MEDIA_CAST_RECEIVER_AUDIO_DECODER_H_ 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/callback.h" 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/memory/ref_counted.h" 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "media/base/audio_bus.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "media/cast/cast_config.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/cast/cast_environment.h" 13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "media/cast/transport/cast_transport_config.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace media { 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace cast { 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class AudioDecoder { 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Callback passed to DecodeFrame, to deliver decoded audio data from the 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // decoder. The number of samples in |audio_bus| may vary, and |audio_bus| 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // can be NULL when errors occur. |is_continuous| is normally true, but will 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // be false if the decoder has detected a frame skip since the last decode 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // operation; and the client should take steps to smooth audio discontinuities 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // in this case. 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch typedef base::Callback<void(scoped_ptr<AudioBus> audio_bus, 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool is_continuous)> DecodeFrameCallback; 28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AudioDecoder(const scoped_refptr<CastEnvironment>& cast_environment, 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int channels, 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int sampling_rate, 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) transport::AudioCodec codec); 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~AudioDecoder(); 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Returns STATUS_AUDIO_INITIALIZED if the decoder was successfully 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // constructed from the given FrameReceiverConfig. If this method returns any 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // other value, calls to DecodeFrame() will not succeed. 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch CastInitializationStatus InitializationResult() const; 39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Decode the payload in |encoded_frame| asynchronously. |callback| will be 41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // invoked on the CastEnvironment::MAIN thread with the result. 42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // 43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // In the normal case, |encoded_frame->frame_id| will be 44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // monotonically-increasing by 1 for each successive call to this method. 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // When it is not, the decoder will assume one or more frames have been 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // dropped (e.g., due to packet loss), and will perform recovery actions. 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void DecodeFrame(scoped_ptr<transport::EncodedFrame> encoded_frame, 48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const DecodeFrameCallback& callback); 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch class ImplBase; 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch class OpusImpl; 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch class Pcm16Impl; 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const scoped_refptr<CastEnvironment> cast_environment_; 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<ImplBase> impl_; 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AudioDecoder); 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace cast 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace media 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // MEDIA_CAST_RECEIVER_AUDIO_DECODER_H_ 65