Index: talk/app/webrtc/java/jni/androidmediaencoder_jni.cc |
diff --git a/talk/app/webrtc/java/jni/androidmediaencoder_jni.cc b/talk/app/webrtc/java/jni/androidmediaencoder_jni.cc |
index 3fc13222ede0a2316ecf39f8a4e9cdbe22cb5e73..5f76170891f34400fdf9f4380d3e3bad5c354b26 100644 |
--- a/talk/app/webrtc/java/jni/androidmediaencoder_jni.cc |
+++ b/talk/app/webrtc/java/jni/androidmediaencoder_jni.cc |
@@ -506,9 +506,7 @@ int32_t MediaCodecVideoEncoder::InitEncodeOnCodecThread( |
} |
CHECK_EXCEPTION(jni); |
- if (use_surface) { |
- scale_ = false; // TODO(perkj): Implement scaling when using textures. |
- } else { |
+ if (!use_surface) { |
jobjectArray input_buffers = reinterpret_cast<jobjectArray>( |
jni->CallObjectMethod(*j_media_codec_video_encoder_, |
j_get_input_buffers_method_)); |
@@ -574,12 +572,27 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread( |
} |
RTC_CHECK(frame_types->size() == 1) << "Unexpected stream count"; |
- // Check framerate before spatial resolution change. |
- if (scale_) |
- quality_scaler_.OnEncodeFrame(frame); |
- const VideoFrame& input_frame = |
- scale_ ? quality_scaler_.GetScaledFrame(frame) : frame; |
+ VideoFrame input_frame = frame; |
+ if (scale_) { |
+ // Check framerate before spatial resolution change. |
+ quality_scaler_.OnEncodeFrame(frame); |
+ if (quality_scaler_.GetScaledResolution().width != frame.width() || |
pbos-webrtc
2015/11/26 09:41:37
Get scaled resolution once, this looks clunky. Oth
perkj_webrtc
2015/11/26 12:58:48
Done.
|
+ quality_scaler_.GetScaledResolution().height != frame.height()) { |
+ if (frame.native_handle() != nullptr) { |
+ rtc::scoped_refptr<webrtc::VideoFrameBuffer> scaled_buffer( |
pbos-webrtc
2015/11/26 09:41:37
If you wanna put a comment on how the crop-and-sca
perkj_webrtc
2015/11/26 12:58:48
No I don't :-> Read the code...
|
+ static_cast<AndroidTextureBuffer*>( |
+ frame.video_frame_buffer().get())->CropAndScale( |
+ frame.width(), |
+ frame.height(), |
+ quality_scaler_.GetScaledResolution().width, |
+ quality_scaler_.GetScaledResolution().height)); |
+ input_frame.set_video_frame_buffer(scaled_buffer); |
+ } else { |
+ input_frame.ShallowCopy(quality_scaler_.GetScaledFrame(frame)); |
+ } |
+ } |
+ } |
if (!MaybeReconfigureEncoderOnCodecThread(input_frame)) { |
ALOGE << "Failed to reconfigure encoder."; |