chromium/chromecast/media/api/cma_backend.h

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

#ifndef CHROMECAST_MEDIA_API_CMA_BACKEND_H_
#define CHROMECAST_MEDIA_API_CMA_BACKEND_H_

#include <stdint.h>

#include "base/memory/ref_counted.h"
#include "chromecast/media/api/decoder_buffer_base.h"
#include "chromecast/public/media/decoder_config.h"
#include "chromecast/public/media/media_pipeline_backend.h"

namespace chromecast {
namespace media {

// Interface for the media backend used by the CMA pipeline. The implementation
// is selected by CmaBackendFactory. MediaPipelineBackend is a lower-level
// interface used to abstract the platform, with a separate implementation for
// each platform, while CmaBackend implementations are used across multiple
// platforms.
class CmaBackend {
 public:
  using BufferStatus = MediaPipelineBackend::BufferStatus;

  class Decoder {
   public:
    using BufferStatus = MediaPipelineBackend::BufferStatus;
    using Delegate = MediaPipelineBackend::Decoder::Delegate;

    // These methods have the same behavior as the corresponding methods on
    // MediaPipelineBackend::Decoder.
    // See chromecast/public/media/media_pipeline_backend.h for documentation.
    virtual void SetDelegate(Delegate* delegate) = 0;

    // Pushes buffer to decoder.  A new |buffer| should be used for each call
    // and should not be mutated by the caller.
    virtual BufferStatus PushBuffer(
        scoped_refptr<DecoderBufferBase> buffer) = 0;

   protected:
    virtual ~Decoder() = default;
  };

  class AudioDecoder : public Decoder {
   public:
    using RenderingDelay = MediaPipelineBackend::AudioDecoder::RenderingDelay;
    using Statistics = MediaPipelineBackend::AudioDecoder::Statistics;
    using AudioTrackTimestamp =
        MediaPipelineBackend::AudioDecoder::AudioTrackTimestamp;

    // These methods have the same behavior as the corresponding methods on
    // MediaPipelineBackend::AudioDecoder.
    // See chromecast/public/media/media_pipeline_backend.h for documentation.
    virtual bool SetConfig(const AudioConfig& config) = 0;
    virtual bool SetVolume(float multiplier) = 0;
    virtual RenderingDelay GetRenderingDelay() = 0;
    virtual void GetStatistics(Statistics* statistics) = 0;
    virtual AudioTrackTimestamp GetAudioTrackTimestamp() = 0;
    virtual int GetStartThresholdInFrames() = 0;

    // Returns true if the audio decoder requires that encrypted buffers be
    // decrypted before being passed to PushBuffer(). The return value may
    // change whenever SetConfig() is called or the backend is initialized.
    virtual bool RequiresDecryption() = 0;

   protected:
    ~AudioDecoder() override = default;
  };

  class VideoDecoder : public Decoder {
   public:
    using Statistics = MediaPipelineBackend::VideoDecoder::Statistics;

    // These methods have the same behavior as the corresponding methods on
    // MediaPipelineBackend::VideoDecoder.
    // See chromecast/public/media/media_pipeline_backend.h for documentation.
    virtual bool SetConfig(const VideoConfig& config) = 0;
    virtual void GetStatistics(Statistics* statistics) = 0;

   protected:
    ~VideoDecoder() override = default;
  };

  virtual ~CmaBackend() = default;

  // These methods have the same behavior as the corresponding methods on
  // MediaPipelineBackend. See chromecast/public/media/media_pipeline_backend.h
  // for documentation.
  virtual AudioDecoder* CreateAudioDecoder() = 0;
  virtual VideoDecoder* CreateVideoDecoder() = 0;
  virtual bool Initialize() = 0;
  virtual bool Start(int64_t start_pts) = 0;
  virtual void Stop() = 0;
  virtual bool Pause() = 0;
  virtual bool Resume() = 0;
  virtual int64_t GetCurrentPts() = 0;
  virtual bool SetPlaybackRate(float rate) = 0;

  // Logically pauses/resumes a backend instance, without actually pausing or
  // resuming it. This is used by multiroom output to avoid playback stutter on
  // resume.
  virtual void LogicalPause() = 0;
  virtual void LogicalResume() = 0;
};

}  // namespace media
}  // namespace chromecast

#endif  // CHROMECAST_MEDIA_API_CMA_BACKEND_H_