| Index: content/renderer/media/video_track_recorder.cc
|
| diff --git a/content/renderer/media/video_track_recorder.cc b/content/renderer/media/video_track_recorder.cc
|
| index a29af2fc5b0c8caae761d6aa1cc4febcd8764aee..1d67ddd15f39120849543167a176390607b9e050 100644
|
| --- a/content/renderer/media/video_track_recorder.cc
|
| +++ b/content/renderer/media/video_track_recorder.cc
|
| @@ -166,7 +166,7 @@ class VideoTrackRecorder::Encoder : public base::RefCountedThreadSafe<Encoder> {
|
| }
|
|
|
| virtual void EncodeOnEncodingTaskRunner(
|
| - const scoped_refptr<VideoFrame>& frame,
|
| + scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) = 0;
|
| virtual void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) = 0;
|
|
|
| @@ -338,13 +338,13 @@ typedef std::unique_ptr<vpx_codec_ctx_t, VpxCodecDeleter> ScopedVpxCodecCtxPtr;
|
|
|
| static void OnFrameEncodeCompleted(
|
| const VideoTrackRecorder::OnEncodedVideoCB& on_encoded_video_cb,
|
| - const scoped_refptr<VideoFrame>& frame,
|
| + const media::WebmMuxer::VideoParameters& params,
|
| std::unique_ptr<std::string> data,
|
| base::TimeTicks capture_timestamp,
|
| bool keyframe) {
|
| DVLOG(1) << (keyframe ? "" : "non ") << "keyframe "<< data->length() << "B, "
|
| << capture_timestamp << " ms";
|
| - on_encoded_video_cb.Run(frame, std::move(data), capture_timestamp, keyframe);
|
| + on_encoded_video_cb.Run(params, std::move(data), capture_timestamp, keyframe);
|
| }
|
|
|
| static int GetNumberOfThreadsForEncoding() {
|
| @@ -378,14 +378,16 @@ class VEAEncoder final : public VideoTrackRecorder::Encoder,
|
|
|
| private:
|
| using VideoFrameAndTimestamp =
|
| - std::pair<scoped_refptr<VideoFrame>, base::TimeTicks>;
|
| + std::pair<scoped_refptr<media::VideoFrame>, base::TimeTicks>;
|
| + using VideoParamsAndTimestamp =
|
| + std::pair<media::WebmMuxer::VideoParameters, base::TimeTicks>;
|
|
|
| void UseOutputBitstreamBufferId(int32_t bitstream_buffer_id);
|
| void FrameFinished(std::unique_ptr<base::SharedMemory> shm);
|
|
|
| // VideoTrackRecorder::Encoder implementation.
|
| ~VEAEncoder() override;
|
| - void EncodeOnEncodingTaskRunner(const scoped_refptr<VideoFrame>& frame,
|
| + void EncodeOnEncodingTaskRunner(scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) override;
|
| void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) override;
|
|
|
| @@ -415,7 +417,7 @@ class VEAEncoder final : public VideoTrackRecorder::Encoder,
|
| gfx::Size vea_requested_input_size_;
|
|
|
| // Frames and corresponding timestamps in encode as FIFO.
|
| - std::queue<VideoFrameAndTimestamp> frames_in_encode_;
|
| + std::queue<VideoParamsAndTimestamp> frames_in_encode_;
|
| };
|
|
|
| // Class encapsulating all libvpx interactions for VP8/VP9 encoding.
|
| @@ -432,7 +434,7 @@ class VpxEncoder final : public VideoTrackRecorder::Encoder {
|
| private:
|
| // VideoTrackRecorder::Encoder implementation.
|
| ~VpxEncoder() override;
|
| - void EncodeOnEncodingTaskRunner(const scoped_refptr<VideoFrame>& frame,
|
| + void EncodeOnEncodingTaskRunner(scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) override;
|
| void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) override;
|
|
|
| @@ -484,7 +486,7 @@ class H264Encoder final : public VideoTrackRecorder::Encoder {
|
| private:
|
| // VideoTrackRecorder::Encoder implementation.
|
| ~H264Encoder() override;
|
| - void EncodeOnEncodingTaskRunner(const scoped_refptr<VideoFrame>& frame,
|
| + void EncodeOnEncodingTaskRunner(scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) override;
|
| void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) override;
|
|
|
| @@ -596,7 +598,7 @@ void VEAEncoder::FrameFinished(std::unique_ptr<base::SharedMemory> shm) {
|
| }
|
|
|
| void VEAEncoder::EncodeOnEncodingTaskRunner(
|
| - const scoped_refptr<VideoFrame>& frame,
|
| + scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) {
|
| DVLOG(3) << __func__;
|
| DCHECK(encoding_task_runner_->BelongsToCurrentThread());
|
| @@ -680,7 +682,8 @@ void VEAEncoder::EncodeOnEncodingTaskRunner(
|
| video_frame->stride(media::VideoFrame::kVPlane),
|
| input_size_.width(), input_size_.height());
|
| }
|
| - frames_in_encode_.push(std::make_pair(video_frame, capture_timestamp));
|
| + frames_in_encode_.push(std::make_pair(
|
| + media::WebmMuxer::VideoParameters(frame), capture_timestamp));
|
|
|
| encoding_task_runner_->PostTask(
|
| FROM_HERE,
|
| @@ -728,7 +731,7 @@ VpxEncoder::~VpxEncoder() {
|
| }
|
|
|
| void VpxEncoder::EncodeOnEncodingTaskRunner(
|
| - const scoped_refptr<VideoFrame>& frame,
|
| + scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) {
|
| TRACE_EVENT0("video", "VpxEncoder::EncodeOnEncodingTaskRunner");
|
| DCHECK(encoding_task_runner_->BelongsToCurrentThread());
|
| @@ -768,6 +771,9 @@ void VpxEncoder::EncodeOnEncodingTaskRunner(
|
| << vpx_codec_error(encoder_.get()) << " -"
|
| << vpx_codec_error_detail(encoder_.get());
|
|
|
| + const media::WebmMuxer::VideoParameters video_params(frame);
|
| + frame = nullptr;
|
| +
|
| std::unique_ptr<std::string> data(new std::string);
|
| bool keyframe = false;
|
| vpx_codec_iter_t iter = NULL;
|
| @@ -782,7 +788,7 @@ void VpxEncoder::EncodeOnEncodingTaskRunner(
|
| origin_task_runner_->PostTask(FROM_HERE,
|
| base::Bind(OnFrameEncodeCompleted,
|
| on_encoded_video_callback_,
|
| - frame,
|
| + video_params,
|
| base::Passed(&data),
|
| capture_timestamp,
|
| keyframe));
|
| @@ -932,7 +938,7 @@ H264Encoder::~H264Encoder() {
|
| }
|
|
|
| void H264Encoder::EncodeOnEncodingTaskRunner(
|
| - const scoped_refptr<VideoFrame>& frame,
|
| + scoped_refptr<VideoFrame> frame,
|
| base::TimeTicks capture_timestamp) {
|
| TRACE_EVENT0("video", "H264Encoder::EncodeOnEncodingTaskRunner");
|
| DCHECK(encoding_task_runner_->BelongsToCurrentThread());
|
| @@ -961,6 +967,8 @@ void H264Encoder::EncodeOnEncodingTaskRunner(
|
| NOTREACHED() << "OpenH264 encoding failed";
|
| return;
|
| }
|
| + const media::WebmMuxer::VideoParameters video_params(frame);
|
| + frame = nullptr;
|
|
|
| std::unique_ptr<std::string> data(new std::string);
|
| const uint8_t kNALStartCode[4] = {0, 0, 0, 1};
|
| @@ -984,9 +992,9 @@ void H264Encoder::EncodeOnEncodingTaskRunner(
|
|
|
| const bool is_key_frame = info.eFrameType == videoFrameTypeIDR;
|
| origin_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(OnFrameEncodeCompleted, on_encoded_video_callback_, frame,
|
| - base::Passed(&data), capture_timestamp, is_key_frame));
|
| + FROM_HERE, base::Bind(OnFrameEncodeCompleted, on_encoded_video_callback_,
|
| + video_params, base::Passed(&data),
|
| + capture_timestamp, is_key_frame));
|
| }
|
|
|
| void H264Encoder::ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) {
|
|
|