Index: webrtc/api/java/jni/androidmediaencoder_jni.cc |
diff --git a/webrtc/api/java/jni/androidmediaencoder_jni.cc b/webrtc/api/java/jni/androidmediaencoder_jni.cc |
index 35291dfb1e4d43f6eae3986b99a6a30d2ec646d2..948f9356ea89667b26203e30a474cf5892166075 100644 |
--- a/webrtc/api/java/jni/androidmediaencoder_jni.cc |
+++ b/webrtc/api/java/jni/androidmediaencoder_jni.cc |
@@ -12,6 +12,9 @@ |
// androidmediacodeccommon.h to avoid build errors. |
#include "webrtc/api/java/jni/androidmediaencoder_jni.h" |
+#include <algorithm> |
pbos-webrtc
2016/04/14 14:29:57
Not needed, right?
perkj_webrtc
2016/04/15 12:37:39
git cl lint say its needed.
|
+#include <list> |
+ |
#include "third_party/libyuv/include/libyuv/convert.h" |
#include "third_party/libyuv/include/libyuv/convert_from.h" |
#include "third_party/libyuv/include/libyuv/video_common.h" |
@@ -229,13 +232,27 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder, |
int current_encoding_time_ms_; // Overall encoding time in the current second |
int64_t last_input_timestamp_ms_; // Timestamp of last received yuv frame. |
int64_t last_output_timestamp_ms_; // Timestamp of last encoded frame. |
- std::vector<int32_t> timestamps_; // Video frames timestamp queue. |
- std::vector<int64_t> render_times_ms_; // Video frames render time queue. |
+ |
+ struct InputFrameInfo { |
+ InputFrameInfo(int32_t timestamp, |
+ int64_t render_time_ms, |
+ webrtc::VideoRotation rotation) |
+ : timestamp(timestamp), |
+ render_time_ms(render_time_ms), |
+ rotation(rotation) {} |
+ const int32_t timestamp; |
+ const int64_t render_time_ms; |
+ const webrtc::VideoRotation rotation; |
+ }; |
+ std::list<InputFrameInfo> input_frame_infos_; |
std::vector<int64_t> frame_rtc_times_ms_; // Time when video frame is sent to |
magjed_webrtc
2016/04/15 09:43:30
Can you add a rtc_time member in InputFrameInfo an
perkj_webrtc
2016/04/15 12:37:39
Done.
|
// encoder input. |
- int32_t output_timestamp_; // Last output frame timestamp from timestamps_ Q. |
+ int32_t output_timestamp_; // Last output frame timestamp from |
magjed_webrtc
2016/04/15 09:43:30
Can you replace |output_timestamp_|, |output_rende
perkj_webrtc
2016/04/15 12:37:39
I could but that would mean a slight beaviour diff
|
+ // |input_frame_infos_|. |
int64_t output_render_time_ms_; // Last output frame render time from |
- // render_times_ms_ queue. |
+ // |input_frame_infos_|. |
+ webrtc::VideoRotation output_rotation_; // Last output frame rotation from |
+ // |input_frame_infos_|. |
// Frame size in bytes fed to MediaCodec. |
int yuv_size_; |
// True only when between a callback_->Encoded() call return a positive value |
@@ -523,8 +540,7 @@ int32_t MediaCodecVideoEncoder::InitEncodeOnCodecThread( |
last_output_timestamp_ms_ = -1; |
output_timestamp_ = 0; |
output_render_time_ms_ = 0; |
- timestamps_.clear(); |
- render_times_ms_.clear(); |
+ input_frame_infos_.clear(); |
frame_rtc_times_ms_.clear(); |
drop_next_input_frame_ = false; |
use_surface_ = use_surface; |
@@ -735,8 +751,10 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread( |
frames_in_queue_++; |
// Save input image timestamps for later output |
- timestamps_.push_back(input_frame.timestamp()); |
- render_times_ms_.push_back(input_frame.render_time_ms()); |
+ |
magjed_webrtc
2016/04/15 09:43:30
nit: remove empty line
perkj_webrtc
2016/04/15 12:37:39
Done.
|
+ input_frame_infos_.push_back(InputFrameInfo(input_frame.timestamp(), |
magjed_webrtc
2016/04/15 09:43:30
emplace_back is allowed now according to http://ch
perkj_webrtc
2016/04/15 12:37:39
Done.
|
+ input_frame.render_time_ms(), |
+ input_frame.rotation())); |
current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_; |
if (!DeliverPendingOutputs(jni)) { |
@@ -943,10 +961,11 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { |
GetOutputBufferInfoPresentationTimestampUs(jni, j_output_buffer_info) / |
1000; |
if (frames_in_queue_ > 0) { |
magjed_webrtc
2016/04/15 09:43:30
Can you CHECK_GT(frames_in_queue_, 0) here? It loo
perkj_webrtc
2016/04/15 12:37:39
as discussed- I don't want to in this cl. The comm
|
- output_timestamp_ = timestamps_.front(); |
- timestamps_.erase(timestamps_.begin()); |
- output_render_time_ms_ = render_times_ms_.front(); |
- render_times_ms_.erase(render_times_ms_.begin()); |
+ const InputFrameInfo& frame_info = input_frame_infos_.front(); |
+ output_timestamp_ = frame_info.timestamp; |
+ output_render_time_ms_ = frame_info.render_time_ms; |
+ output_rotation_ = frame_info.rotation; |
+ input_frame_infos_.pop_front(); |
frame_encoding_time_ms = GetCurrentTimeMs() - frame_rtc_times_ms_.front(); |
frame_rtc_times_ms_.erase(frame_rtc_times_ms_.begin()); |
frames_in_queue_--; |
@@ -978,6 +997,7 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { |
image->_encodedHeight = height_; |
image->_timeStamp = output_timestamp_; |
image->capture_time_ms_ = output_render_time_ms_; |
+ image->rotation_ = output_rotation_; |
image->_frameType = |
(key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta); |
image->_completeFrame = true; |