// Copyright (c) 2012 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.

// FFmpegGlue is an interface between FFmpeg and Chrome used to proxy FFmpeg's
// read and seek requests to Chrome's internal data structures.  The glue works
// through the AVIO interface provided by FFmpeg.
//
// AVIO works through a special AVIOContext created through avio_alloc_context()
// which is attached to the AVFormatContext used for demuxing.  The AVIO context
// is initialized with read and seek methods which FFmpeg calls when necessary.
//
// During OpenContext() FFmpegGlue will tell FFmpeg to use Chrome's AVIO context
// by passing NULL in for the filename parameter to avformat_open_input().  All
// FFmpeg operations using the configured AVFormatContext will then redirect
// reads and seeks through the glue.
//
// The glue in turn processes those read and seek requests using the
// FFmpegURLProtocol provided during construction.

#ifndef MEDIA_FILTERS_FFMPEG_GLUE_H_
#define MEDIA_FILTERS_FFMPEG_GLUE_H_

#include <stdint.h>

#include <memory>

#include "base/check.h"
#include "base/macros.h"
#include "media/base/container_names.h"
#include "media/base/media_export.h"
#include "media/ffmpeg/ffmpeg_deleters.h"

struct AVFormatContext;
struct AVIOContext;

namespace media {

class MEDIA_EXPORT FFmpegURLProtocol {
 public:
  // Read the given amount of bytes into data, returns the number of bytes read
  // if successful, kReadError otherwise.
  virtual int Read(int size, uint8_t* data) = 0;

  // Returns true and the current file position for this file, false if the
  // file position could not be retrieved.
  virtual bool GetPosition(int64_t* position_out) = 0;

  // Returns true if the file position could be set, false otherwise.
  virtual bool SetPosition(int64_t position) = 0;

  // Returns true and the file size, false if the file size could not be
  // retrieved.
  virtual bool GetSize(int64_t* size_out) = 0;

  // Returns false if this protocol supports random seeking.
  virtual bool IsStreaming() = 0;
};

class MEDIA_EXPORT FFmpegGlue {
 public:
  // See file documentation for usage.  |protocol| must outlive FFmpegGlue.
  explicit FFmpegGlue(FFmpegURLProtocol* protocol);
  ~FFmpegGlue();

  // Opens an AVFormatContext specially prepared to process reads and seeks
  // through the FFmpegURLProtocol provided during construction.
  // |is_local_file| is an optional parameter used for metrics reporting.
  bool OpenContext(bool is_local_file = false);
  AVFormatContext* format_context() { return format_context_; }
  // Returns the container name.
  // Note that it is only available after calling OpenContext.
  container_names::MediaContainerName container() const {
    DCHECK(open_called_);
    return container_;
  }

  // Used on Android to switch to using the native MediaPlayer to play HLS.
  bool detected_hls() { return detected_hls_; }

 private:
  bool open_called_ = false;
  bool detected_hls_ = false;
  AVFormatContext* format_context_ = nullptr;
  std::unique_ptr<AVIOContext, ScopedPtrAVFree> avio_context_;
  container_names::MediaContainerName container_ =
      container_names::CONTAINER_UNKNOWN;

  DISALLOW_COPY_AND_ASSIGN(FFmpegGlue);
};

}  // namespace media

#endif  // MEDIA_FILTERS_FFMPEG_GLUE_H_
