diff --git a/webrtc/api/android/jni/androidmediadecoder_jni.cc b/webrtc/api/android/jni/androidmediadecoder_jni.cc index 2a7e68976a..96c0fc2f7c 100644 --- a/webrtc/api/android/jni/androidmediadecoder_jni.cc +++ b/webrtc/api/android/jni/androidmediadecoder_jni.cc @@ -782,7 +782,9 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs( payload += output_buffer_offset; // Create yuv420 frame. - frame_buffer = decoded_frame_pool_.CreateBuffer(width, height); + rtc::scoped_refptr i420_buffer; + + i420_buffer = decoded_frame_pool_.CreateBuffer(width, height); if (color_format == COLOR_FormatYUV420Planar) { RTC_CHECK_EQ(0, stride % 2); RTC_CHECK_EQ(0, slice_height % 2); @@ -791,31 +793,23 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs( const uint8_t* y_ptr = payload; const uint8_t* u_ptr = y_ptr + stride * slice_height; const uint8_t* v_ptr = u_ptr + uv_stride * u_slice_height; - libyuv::I420Copy(y_ptr, stride, - u_ptr, uv_stride, - v_ptr, uv_stride, - frame_buffer->MutableDataY(), - frame_buffer->StrideY(), - frame_buffer->MutableDataU(), - frame_buffer->StrideU(), - frame_buffer->MutableDataV(), - frame_buffer->StrideV(), + libyuv::I420Copy(y_ptr, stride, u_ptr, uv_stride, v_ptr, uv_stride, + i420_buffer->MutableDataY(), i420_buffer->StrideY(), + i420_buffer->MutableDataU(), i420_buffer->StrideU(), + i420_buffer->MutableDataV(), i420_buffer->StrideV(), width, height); } else { // All other supported formats are nv12. const uint8_t* y_ptr = payload; const uint8_t* uv_ptr = y_ptr + stride * slice_height; - libyuv::NV12ToI420( - y_ptr, stride, - uv_ptr, stride, - frame_buffer->MutableDataY(), - frame_buffer->StrideY(), - frame_buffer->MutableDataU(), - frame_buffer->StrideU(), - frame_buffer->MutableDataV(), - frame_buffer->StrideV(), - width, height); + libyuv::NV12ToI420(y_ptr, stride, uv_ptr, stride, + i420_buffer->MutableDataY(), i420_buffer->StrideY(), + i420_buffer->MutableDataU(), i420_buffer->StrideU(), + i420_buffer->MutableDataV(), i420_buffer->StrideV(), + width, height); } + frame_buffer = i420_buffer; + // Return output byte buffer back to codec. jni->CallVoidMethod( *j_media_codec_video_decoder_, diff --git a/webrtc/api/androidvideotracksource.cc b/webrtc/api/androidvideotracksource.cc index f49cc30c8c..7fd033efec 100644 --- a/webrtc/api/androidvideotracksource.cc +++ b/webrtc/api/androidvideotracksource.cc @@ -115,7 +115,7 @@ void AndroidVideoTrackSource::OnByteBufferFrameCaptured(const void* frame_data, std::swap(rotated_width, rotated_height); } - rtc::scoped_refptr buffer = + rtc::scoped_refptr buffer = pre_scale_pool_.CreateBuffer(rotated_width, rotated_height); const uint8_t* y_plane = static_cast(frame_data);