1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef MEDIA_CAST_SENDER_AUDIO_ENCODER_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MEDIA_CAST_SENDER_AUDIO_ENCODER_H_
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/ref_counted.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/thread_checker.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/audio_bus.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "media/cast/cast_environment.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base {
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TimeTicks;
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace media {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace cast {
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AudioEncoder {
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Callback to deliver each EncodedFrame, plus the number of audio samples
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // skipped since the last frame.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef base::Callback<void(scoped_ptr<EncodedFrame>, int)>
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FrameEncodedCallback;
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AudioEncoder(const scoped_refptr<CastEnvironment>& cast_environment,
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               int num_channels,
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               int sampling_rate,
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               int bitrate,
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               Codec codec,
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               const FrameEncodedCallback& frame_encoded_callback);
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~AudioEncoder();
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CastInitializationStatus InitializationResult() const;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int GetSamplesPerFrame() const;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void InsertAudio(scoped_ptr<AudioBus> audio_bus,
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   const base::TimeTicks& recorded_time);
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class ImplBase;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class OpusImpl;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class Pcm16Impl;
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const scoped_refptr<CastEnvironment> cast_environment_;
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<ImplBase> impl_;
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Used to ensure only one thread invokes InsertAudio().
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::ThreadChecker insert_thread_checker_;
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioEncoder);
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace cast
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace media
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // MEDIA_CAST_SENDER_AUDIO_ENCODER_H_
61