#ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_
#define MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_
#include <stddef.h>
#include <stdint.h>
#include <optional>
#include <string>
#include <vector>
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "base/containers/span.h"
#include "base/time/time.h"
#include "media/base/decrypt_config.h"
#include "media/base/encryption_pattern.h"
#include "media/base/encryption_scheme.h"
#include "media/base/media_export.h"
#include "media/base/status.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"
namespace media {
enum class CodecType {
kAny,
kSecure,
kSoftware,
};
enum MediaCodecStatus {
MEDIA_CODEC_OK = 0,
MEDIA_CODEC_TRY_AGAIN_LATER = 1,
MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED = 2,
MEDIA_CODEC_OUTPUT_FORMAT_CHANGED = 3,
MEDIA_CODEC_NO_KEY = 4,
MEDIA_CODEC_ERROR = 5,
MEDIA_CODEC_KEY_EXPIRED = 6,
MEDIA_CODEC_RESOURCE_BUSY = 7,
MEDIA_CODEC_INSUFFICIENT_OUTPUT_PROTECTION = 8,
MEDIA_CODEC_SESSION_NOT_OPENED = 9,
MEDIA_CODEC_UNSUPPORTED_OPERATION = 10,
MEDIA_CODEC_INSUFFICIENT_SECURITY = 11,
MEDIA_CODEC_FRAME_TOO_LARGE = 12,
MEDIA_CODEC_LOST_STATE = 13,
MEDIA_CODEC_GENERIC_OEM = 14,
MEDIA_CODEC_GENERIC_PLUGIN = 15,
MEDIA_CODEC_LICENSE_PARSE = 16,
MEDIA_CODEC_MEDIA_FRAMEWORK = 17,
MEDIA_CODEC_ZERO_SUBSAMPLES = 18,
MEDIA_CODEC_UNKNOWN_CIPHER_MODE = 19,
MEDIA_CODEC_PATTERN_ENCRYPTION_NOT_SUPPORTED = 20,
MEDIA_CODEC_INSUFFICIENT_RESOURCE = 21,
MEDIA_CODEC_RECLAIMED = 22,
MEDIA_CODEC_INPUT_SLOT_UNAVAILABLE = 23,
MEDIA_CODEC_ILLEGAL_STATE = 24,
MEDIA_CODEC_UNKNOWN_CRYPTO_EXCEPTION = 25,
MEDIA_CODEC_UNKNOWN_MEDIADRM_EXCEPTION = 26,
MEDIA_CODEC_UNKNOWN_CODEC_EXCEPTION = 27,
MEDIA_CODEC_LINEAR_BLOCK_EXCEPTION = 28,
MEDIA_CODEC_CERTIFICATE_MALFORMED = 29,
MEDIA_CODEC_CERTIFICATE_MISSING = 30,
MEDIA_CODEC_CRYPTO_LIBRARY = 31,
MEDIA_CODEC_INIT_DATA = 32,
MEDIA_CODEC_KEY_NOT_LOADED = 33,
MEDIA_CODEC_LICENSE_POLICY = 34,
MEDIA_CODEC_LICENSE_RELEASE = 35,
MEDIA_CODEC_LICENSE_REQUEST_REJECTED = 36,
MEDIA_CODEC_LICENSE_RESTORE = 37,
MEDIA_CODEC_LICENSE_STATE = 38,
MEDIA_CODEC_PROVISIONING_CERTIFICATE = 39,
MEDIA_CODEC_PROVISIONING_CONFIG = 40,
MEDIA_CODEC_PROVISIONING_PARSE = 41,
MEDIA_CODEC_PROVISIONING_REQUEST_REJECTED = 42,
MEDIA_CODEC_PROVISIONING_RETRY = 43,
MEDIA_CODEC_SECURE_STOP_RELEASE = 44,
MEDIA_CODEC_STORAGE_READ = 45,
MEDIA_CODEC_STORAGE_WRITE = 46,
MEDIA_CODEC_MAX = MEDIA_CODEC_STORAGE_WRITE,
};
struct MediaCodecResultTraits {
enum class Codes : StatusCodeType {
kOk,
kTryAgainLater,
kOutputBuffersChanged,
kOutputFormatChanged,
kNoKey,
kError,
};
static constexpr StatusGroupType Group() { return "MediaCodecResult"; }
};
using MediaCodecResult = TypedStatus<MediaCodecResultTraits>;
class MEDIA_EXPORT MediaCodecBridge {
public:
MediaCodecBridge() = default;
MediaCodecBridge(const MediaCodecBridge&) = delete;
MediaCodecBridge& operator=(const MediaCodecBridge&) = delete;
virtual ~MediaCodecBridge() = default;
virtual void Stop() = 0;
virtual MediaCodecResult Flush() = 0;
virtual MediaCodecResult GetOutputSize(gfx::Size* size) = 0;
virtual MediaCodecResult GetOutputSamplingRate(int* sampling_rate) = 0;
virtual MediaCodecResult GetOutputChannelCount(int* channel_count) = 0;
virtual MediaCodecResult GetOutputColorSpace(
gfx::ColorSpace* color_space) = 0;
virtual MediaCodecResult QueueInputBuffer(
int index,
base::span<const uint8_t> data,
base::TimeDelta presentation_time) = 0;
virtual MediaCodecResult QueueFilledInputBuffer(
int index,
size_t data_size,
base::TimeDelta presentation_time) = 0;
virtual MediaCodecResult QueueSecureInputBuffer(
int index,
base::span<const uint8_t> data,
base::TimeDelta presentation_time,
const DecryptConfig& decrypt_config) = 0;
virtual MediaCodecResult QueueEOS(int input_buffer_index) = 0;
virtual MediaCodecResult DequeueInputBuffer(base::TimeDelta timeout,
int* index) = 0;
virtual MediaCodecResult DequeueOutputBuffer(
base::TimeDelta timeout,
int* index,
size_t* offset,
size_t* size,
base::TimeDelta* presentation_time,
bool* end_of_stream,
bool* key_frame) = 0;
virtual void ReleaseOutputBuffer(int index, bool render) = 0;
virtual base::span<uint8_t> GetInputBuffer(int input_buffer_index) = 0;
virtual MediaCodecResult CopyFromOutputBuffer(int index,
size_t offset,
base::span<uint8_t> dst) = 0;
virtual std::string GetName() = 0;
virtual bool IsSoftwareCodec() = 0;
virtual bool SetSurface(const base::android::JavaRef<jobject>& surface) = 0;
virtual void OnBuffersAvailable(JNIEnv* env) = 0;
virtual CodecType GetCodecType() const = 0;
virtual size_t GetMaxInputSize() = 0;
};
}
#endif