Add support to adapt video without preserving aspect ratio
This is implemented by allowing users to set two different aspect ratios, one for landscape input and one for portrait input. This extra control might be useful in other scenarios as well. Bug: webrtc:9903 Change-Id: I91676737f4aa1f5d94cfe79ac51d5f866779945b Reviewed-on: https://webrtc-review.googlesource.com/c/108086 Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25387}
This commit is contained in:
committed by
Commit Bot
parent
904903705f
commit
06aa209645
@ -84,10 +84,19 @@ void AndroidVideoTrackSource::OnFrameCaptured(
|
||||
int crop_x;
|
||||
int crop_y;
|
||||
|
||||
if (!AdaptFrame(width, height, camera_time_us, &adapted_width,
|
||||
&adapted_height, &crop_width, &crop_height, &crop_x,
|
||||
&crop_y)) {
|
||||
return;
|
||||
if (rotation % 180 == 0) {
|
||||
if (!AdaptFrame(width, height, camera_time_us, &adapted_width,
|
||||
&adapted_height, &crop_width, &crop_height, &crop_x,
|
||||
&crop_y)) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Swap all width/height and x/y.
|
||||
if (!AdaptFrame(height, width, camera_time_us, &adapted_height,
|
||||
&adapted_width, &crop_height, &crop_width, &crop_y,
|
||||
&crop_x)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<VideoFrameBuffer> buffer =
|
||||
@ -103,12 +112,16 @@ void AndroidVideoTrackSource::OnFrameCaptured(
|
||||
OnFrame(VideoFrame(buffer, rotation, translated_camera_time_us));
|
||||
}
|
||||
|
||||
void AndroidVideoTrackSource::OnOutputFormatRequest(int width,
|
||||
int height,
|
||||
void AndroidVideoTrackSource::OnOutputFormatRequest(int landscape_width,
|
||||
int landscape_height,
|
||||
int portrait_width,
|
||||
int portrait_height,
|
||||
int fps) {
|
||||
cricket::VideoFormat format(width, height,
|
||||
cricket::VideoFormat::FpsToInterval(fps), 0);
|
||||
video_adapter()->OnOutputFormatRequest(format);
|
||||
video_adapter()->OnOutputFormatRequest(
|
||||
std::make_pair(landscape_width, landscape_height),
|
||||
landscape_width * landscape_height,
|
||||
std::make_pair(portrait_width, portrait_height),
|
||||
portrait_width * portrait_height, fps);
|
||||
}
|
||||
|
||||
} // namespace jni
|
||||
|
||||
@ -53,7 +53,11 @@ class AndroidVideoTrackSource : public rtc::AdaptedVideoTrackSource {
|
||||
VideoRotation rotation,
|
||||
const JavaRef<jobject>& j_video_frame_buffer);
|
||||
|
||||
void OnOutputFormatRequest(int width, int height, int fps);
|
||||
void OnOutputFormatRequest(int landscape_width,
|
||||
int landscape_height,
|
||||
int portrait_width,
|
||||
int portrait_height,
|
||||
int fps);
|
||||
|
||||
private:
|
||||
rtc::Thread* signaling_thread_;
|
||||
|
||||
@ -33,13 +33,16 @@ static jlong JNI_VideoSource_GetInternalSource(JNIEnv* jni,
|
||||
static void JNI_VideoSource_AdaptOutputFormat(JNIEnv* jni,
|
||||
const JavaParamRef<jclass>&,
|
||||
jlong j_source,
|
||||
jint j_width,
|
||||
jint j_height,
|
||||
jint j_landscape_width,
|
||||
jint j_landscape_height,
|
||||
jint j_portrait_width,
|
||||
jint j_portrait_height,
|
||||
jint j_fps) {
|
||||
RTC_LOG(LS_INFO) << "VideoSource_nativeAdaptOutputFormat";
|
||||
AndroidVideoTrackSource* source =
|
||||
AndroidVideoTrackSourceFromJavaProxy(j_source);
|
||||
source->OnOutputFormatRequest(j_width, j_height, j_fps);
|
||||
source->OnOutputFormatRequest(j_landscape_width, j_landscape_height,
|
||||
j_portrait_width, j_portrait_height, j_fps);
|
||||
}
|
||||
|
||||
} // namespace jni
|
||||
|
||||
Reference in New Issue
Block a user