Android: Update MediaCodecVideoDecoder to output VideoFrames
Bug: webrtc:9181 Change-Id: I7eba15167536e453956c511a056143b039f52b92 Reviewed-on: https://webrtc-review.googlesource.com/71664 Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22988}
This commit is contained in:
committed by
Commit Bot
parent
9b20677c4e
commit
b9ac121598
@ -112,7 +112,6 @@ class MediaCodecVideoDecoder : public VideoDecoder, public rtc::MessageHandler {
|
||||
bool use_surface_;
|
||||
VideoCodec codec_;
|
||||
I420BufferPool decoded_frame_pool_;
|
||||
rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper_;
|
||||
DecodedImageCallback* callback_;
|
||||
int frames_received_; // Number of frames received by decoder.
|
||||
int frames_decoded_; // Number of frames decoded by decoder.
|
||||
@ -224,26 +223,12 @@ int32_t MediaCodecVideoDecoder::InitDecodeOnCodecThread() {
|
||||
|
||||
ResetVariables();
|
||||
|
||||
if (use_surface_) {
|
||||
surface_texture_helper_ = SurfaceTextureHelper::create(
|
||||
jni, "Decoder SurfaceTextureHelper",
|
||||
JavaParamRef<jobject>(render_egl_context_));
|
||||
if (!surface_texture_helper_) {
|
||||
ALOGE << "Couldn't create SurfaceTextureHelper - fallback to SW codec";
|
||||
sw_fallback_required_ = true;
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
ScopedJavaLocalRef<jobject> j_video_codec_enum =
|
||||
Java_VideoCodecType_fromNativeIndex(jni, codecType_);
|
||||
jobject j_surface_texture_helper =
|
||||
use_surface_
|
||||
? surface_texture_helper_->GetJavaSurfaceTextureHelper().obj()
|
||||
: nullptr;
|
||||
jobject j_egl_context = use_surface_ ? render_egl_context_ : nullptr;
|
||||
bool success = Java_MediaCodecVideoDecoder_initDecode(
|
||||
jni, j_media_codec_video_decoder_, j_video_codec_enum, codec_.width,
|
||||
codec_.height, JavaParamRef<jobject>(j_surface_texture_helper));
|
||||
codec_.height, JavaParamRef<jobject>(j_egl_context));
|
||||
|
||||
if (CheckException(jni) || !success) {
|
||||
ALOGE << "Codec initialization error - fallback to SW codec.";
|
||||
@ -325,7 +310,6 @@ int32_t MediaCodecVideoDecoder::ReleaseOnCodecThread() {
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
input_buffers_.clear();
|
||||
Java_MediaCodecVideoDecoder_release(jni, j_media_codec_video_decoder_);
|
||||
surface_texture_helper_ = nullptr;
|
||||
inited_ = false;
|
||||
rtc::MessageQueueManager::Clear(this);
|
||||
if (CheckException(jni)) {
|
||||
@ -604,18 +588,14 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(
|
||||
decode_time_ms =
|
||||
Java_DecodedTextureBuffer_getDecodeTimeMs(jni, j_decoder_output_buffer);
|
||||
|
||||
const int texture_id =
|
||||
Java_DecodedTextureBuffer_getTextureId(jni, j_decoder_output_buffer);
|
||||
if (texture_id != 0) { // |texture_id| == 0 represents a dropped frame.
|
||||
ScopedJavaLocalRef<jfloatArray> j_transform_matrix =
|
||||
Java_DecodedTextureBuffer_getTransformMatrix(jni,
|
||||
j_decoder_output_buffer);
|
||||
ScopedJavaLocalRef<jobject> j_video_frame_buffer =
|
||||
Java_DecodedTextureBuffer_getVideoFrameBuffer(jni,
|
||||
j_decoder_output_buffer);
|
||||
// |video_frame_buffer| == null represents a dropped frame.
|
||||
if (!j_video_frame_buffer.is_null()) {
|
||||
frame_delayed_ms = Java_DecodedTextureBuffer_getFrameDelayMs(
|
||||
jni, j_decoder_output_buffer);
|
||||
|
||||
// Create VideoFrameBuffer with native texture handle.
|
||||
frame_buffer = surface_texture_helper_->CreateTextureFrame(
|
||||
width, height, NativeHandleImpl(jni, texture_id, j_transform_matrix));
|
||||
frame_buffer = AndroidVideoBuffer::Adopt(jni, j_video_frame_buffer);
|
||||
} else {
|
||||
EnableFrameLogOnWarning();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user