#ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_IMPL_H_
#define MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_IMPL_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include "base/android/scoped_java_ref.h"
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "media/base/android/media_codec_bridge.h"
#include "media/base/android/media_codec_direction.h"
#include "media/base/audio_decoder_config.h"
#include "media/base/media_export.h"
#include "media/base/video_decoder_config.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/hdr_metadata.h"
namespace media {
class VideoColorSpace;
class MEDIA_EXPORT VideoCodecConfig {
public:
VideoCodecConfig();
VideoCodecConfig(const VideoCodecConfig&) = delete;
VideoCodecConfig& operator=(const VideoCodecConfig&) = delete;
~VideoCodecConfig();
VideoCodec codec = VideoCodec::kUnknown;
CodecType codec_type = CodecType::kAny;
gfx::Size initial_expected_coded_size;
base::android::ScopedJavaGlobalRef<jobject> surface;
base::android::ScopedJavaGlobalRef<jobject> media_crypto;
std::vector<uint8_t> csd0;
std::vector<uint8_t> csd1;
VideoColorSpace container_color_space;
std::optional<gfx::HDRMetadata> hdr_metadata;
base::RepeatingClosure on_buffers_available_cb;
std::string name;
bool use_block_model = false;
bool use_low_latency_mode = false;
VideoCodecProfile profile;
};
class MEDIA_EXPORT MediaCodecBridgeImpl : public MediaCodecBridge {
public:
static std::unique_ptr<MediaCodecBridge> CreateVideoDecoder(
const VideoCodecConfig& config);
static std::unique_ptr<MediaCodecBridge> CreateAudioDecoder(
const AudioDecoderConfig& config,
const base::android::JavaRef<jobject>& media_crypto,
base::RepeatingClosure on_buffers_available_cb =
base::RepeatingClosure());
static void SetupCallbackHandlerForTesting();
MediaCodecBridgeImpl(const MediaCodecBridgeImpl&) = delete;
MediaCodecBridgeImpl& operator=(const MediaCodecBridgeImpl&) = delete;
~MediaCodecBridgeImpl() override;
void Stop() override;
MediaCodecResult Flush() override;
MediaCodecResult GetOutputSize(gfx::Size* size) override;
MediaCodecResult GetOutputSamplingRate(int* sampling_rate) override;
MediaCodecResult GetOutputChannelCount(int* channel_count) override;
MediaCodecResult GetOutputColorSpace(gfx::ColorSpace* color_space) override;
MediaCodecResult QueueInputBuffer(int index,
base::span<const uint8_t> data,
base::TimeDelta presentation_time) override;
MediaCodecResult QueueFilledInputBuffer(
int index,
size_t data_size,
base::TimeDelta presentation_time) override;
MediaCodecResult QueueSecureInputBuffer(
int index,
base::span<const uint8_t> data,
base::TimeDelta presentation_time,
const DecryptConfig& decrypt_config) override;
MediaCodecResult QueueEOS(int input_buffer_index) override;
MediaCodecResult DequeueInputBuffer(base::TimeDelta timeout,
int* index) override;
MediaCodecResult DequeueOutputBuffer(base::TimeDelta timeout,
int* index,
size_t* offset,
size_t* size,
base::TimeDelta* presentation_time,
bool* end_of_stream,
bool* key_frame) override;
void ReleaseOutputBuffer(int index, bool render) override;
base::span<uint8_t> GetInputBuffer(int input_buffer_index) override;
MediaCodecResult CopyFromOutputBuffer(int index,
size_t offset,
base::span<uint8_t> dst) override;
std::string GetName() override;
bool IsSoftwareCodec() override;
bool SetSurface(const base::android::JavaRef<jobject>& surface) override;
CodecType GetCodecType() const override;
size_t GetMaxInputSize() override;
private:
MediaCodecBridgeImpl(CodecType codec_type,
std::optional<VideoCodec> video_decoder_codec,
base::android::ScopedJavaGlobalRef<jobject> j_bridge,
bool use_block_model = false,
base::RepeatingClosure on_buffers_available_cb =
base::RepeatingClosure());
[[nodiscard]] bool FillInputBuffer(int index, base::span<const uint8_t> data);
MediaCodecResult QueueInputBlock(int index,
base::span<const uint8_t> data,
base::TimeDelta presentation_time);
MediaCodecResult GetOutputBufferAddress(int index,
size_t offset,
const uint8_t** addr,
size_t* capacity);
void OnBuffersAvailable(JNIEnv* ) override;
void ReportAnyErrorToUMA(MediaCodecStatus status);
const bool use_block_model_;
const CodecType codec_type_;
const std::optional<VideoCodec> video_decoder_codec_;
base::RepeatingClosure on_buffers_available_cb_;
base::android::ScopedJavaGlobalRef<jobject> j_bridge_;
};
}
#endif