/*
 *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaCrypto;
import android.media.MediaFormat;
import android.os.Bundle;
import android.view.Surface;
import java.nio.ByteBuffer;

/**
 * Subset of methods defined in {@link android.media.MediaCodec} needed by
 * {@link HardwareVideoEncoder} and {@link AndroidVideoDecoder}. This interface
 * exists to allow mocking and using a fake implementation in tests.
 */
interface MediaCodecWrapper {
  void configure(MediaFormat format, Surface surface, MediaCrypto crypto, int flags);

  void start();

  void flush();

  void stop();

  void release();

  int dequeueInputBuffer(long timeoutUs);

  void queueInputBuffer(int index, int offset, int size, long presentationTimeUs, int flags);

  int dequeueOutputBuffer(MediaCodec.BufferInfo info, long timeoutUs);

  void releaseOutputBuffer(int index, boolean render);

  MediaFormat getInputFormat();

  MediaFormat getOutputFormat();

  MediaFormat getOutputFormat(int index);

  ByteBuffer getInputBuffer(int index);

  ByteBuffer getOutputBuffer(int index);

  Surface createInputSurface();

  void setParameters(Bundle params);

  MediaCodecInfo getCodecInfo();
}
