// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COBALT_MEDIA_FILTERS_DECODER_SELECTOR_H_
#define COBALT_MEDIA_FILTERS_DECODER_SELECTOR_H_

#include <memory>

#include "base/basictypes.h"
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_vector.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "cobalt/media/base/demuxer_stream.h"
#include "cobalt/media/base/pipeline_status.h"
#include "cobalt/media/filters/decoder_stream_traits.h"

namespace base {
class SingleThreadTaskRunner;
}

namespace cobalt {
namespace media {

class CdmContext;
class DecoderBuffer;
class DecryptingDemuxerStream;
class MediaLog;

// DecoderSelector (creates if necessary and) initializes the proper
// Decoder for a given DemuxerStream. If the given DemuxerStream is
// encrypted, a DecryptingDemuxerStream may also be created.
// The template parameter |StreamType| is the type of stream we will be
// selecting a decoder for.
template <DemuxerStream::Type StreamType>
class MEDIA_EXPORT DecoderSelector {
 public:
  typedef DecoderStreamTraits<StreamType> StreamTraits;
  typedef typename StreamTraits::DecoderType Decoder;

  // Indicates completion of Decoder selection.
  // - First parameter: The initialized Decoder. If it's set to NULL, then
  // Decoder initialization failed.
  // - Second parameter: The initialized DecryptingDemuxerStream. If it's not
  // NULL, then a DecryptingDemuxerStream is created and initialized to do
  // decryption for the initialized Decoder.
  // Note: The caller owns selected Decoder and DecryptingDemuxerStream.
  // The caller should call DecryptingDemuxerStream::Reset() before
  // calling Decoder::Reset() to release any pending decryption or read.
  typedef base::Callback<void(std::unique_ptr<Decoder>,
                              std::unique_ptr<DecryptingDemuxerStream>)>
      SelectDecoderCB;

  // |decoders| contains the Decoders to use when initializing.
  DecoderSelector(
      const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
      ScopedVector<Decoder> decoders, const scoped_refptr<MediaLog>& media_log);

  // Aborts pending Decoder selection and fires |select_decoder_cb| with
  // NULL and NULL immediately if it's pending.
  ~DecoderSelector();

  // Initializes and selects the first Decoder that can decode the |stream|.
  // The selected Decoder (and DecryptingDemuxerStream) is returned via
  // the |select_decoder_cb|.
  // Notes:
  // 1. This must not be called again before |select_decoder_cb| is run.
  // 2. Decoders that fail to initialize will be deleted. Future calls will
  //    select from the decoders following the decoder that was last returned.
  // 3. |cdm_context| is optional. If |cdm_context| is
  //    null, no CDM will be available to perform decryption.
  void SelectDecoder(StreamTraits* traits, DemuxerStream* stream,
                     CdmContext* cdm_context,
                     const SelectDecoderCB& select_decoder_cb,
                     const typename Decoder::OutputCB& output_cb,
                     const base::Closure& waiting_for_decryption_key_cb);

 private:
#if !defined(OS_ANDROID)
  void InitializeDecryptingDecoder();
  void DecryptingDecoderInitDone(bool success);
#endif
  void InitializeDecryptingDemuxerStream();
  void DecryptingDemuxerStreamInitDone(PipelineStatus status);
  void InitializeDecoder();
  void DecoderInitDone(bool success);
  void ReturnNullDecoder();

  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
  ScopedVector<Decoder> decoders_;
  scoped_refptr<MediaLog> media_log_;

  StreamTraits* traits_;
  DemuxerStream* input_stream_;
  CdmContext* cdm_context_;
  SelectDecoderCB select_decoder_cb_;
  typename Decoder::OutputCB output_cb_;
  base::Closure waiting_for_decryption_key_cb_;

  std::unique_ptr<Decoder> decoder_;
  std::unique_ptr<DecryptingDemuxerStream> decrypted_stream_;

  // NOTE: Weak pointers must be invalidated before all other member variables.
  base::WeakPtrFactory<DecoderSelector> weak_ptr_factory_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(DecoderSelector);
};

typedef DecoderSelector<DemuxerStream::VIDEO> VideoDecoderSelector;
typedef DecoderSelector<DemuxerStream::AUDIO> AudioDecoderSelector;

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_FILTERS_DECODER_SELECTOR_H_
