| Index: content/renderer/media/rtc_video_decoder.cc
|
| ===================================================================
|
| --- content/renderer/media/rtc_video_decoder.cc (revision 89290)
|
| +++ content/renderer/media/rtc_video_decoder.cc (working copy)
|
| @@ -2,12 +2,11 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "media/filters/rtc_video_decoder.h"
|
| +#include "content/renderer/media/rtc_video_decoder.h"
|
|
|
| #include <deque>
|
|
|
| #include "base/task.h"
|
| -#include "googleurl/src/gurl.h"
|
| #include "media/base/callback.h"
|
| #include "media/base/filter_host.h"
|
| #include "media/base/filters.h"
|
| @@ -15,10 +14,17 @@
|
| #include "media/base/media_format.h"
|
| #include "media/base/video_frame.h"
|
|
|
| -namespace media {
|
| +using media::DemuxerStream;
|
| +using media::FilterCallback;
|
| +using media::FilterStatusCB;
|
| +using media::kNoTimestamp;
|
| +using media::Limits;
|
| +using media::MediaFormat;
|
| +using media::PIPELINE_OK;
|
| +using media::StatisticsCallback;
|
| +using media::VideoDecoder;
|
| +using media::VideoFrame;
|
|
|
| -static const char kMediaScheme[] = "media";
|
| -
|
| RTCVideoDecoder::RTCVideoDecoder(MessageLoop* message_loop,
|
| const std::string& url)
|
| : message_loop_(message_loop),
|
| @@ -54,7 +60,7 @@
|
| media_format_.SetAsInteger(MediaFormat::kSurfaceType,
|
| static_cast<int>(VideoFrame::YV12));
|
| media_format_.SetAsInteger(MediaFormat::kSurfaceFormat,
|
| - static_cast<int>(VideoFrame::TYPE_SYSTEM_MEMORY));
|
| + static_cast<int>(VideoFrame::TYPE_SYSTEM_MEMORY));
|
|
|
| state_ = kNormal;
|
|
|
| @@ -113,7 +119,8 @@
|
| // TODO(ronghuawu): Stop rtc
|
| }
|
|
|
| -void RTCVideoDecoder::Seek(base::TimeDelta time, const FilterStatusCB& cb) {
|
| +void RTCVideoDecoder::Seek(base::TimeDelta time,
|
| + const FilterStatusCB& cb) {
|
| if (MessageLoop::current() != message_loop_) {
|
| message_loop_->PostTask(FROM_HERE,
|
| NewRunnableMethod(this, &RTCVideoDecoder::Seek,
|
| @@ -190,30 +197,28 @@
|
| return true;
|
| }
|
|
|
| -int RTCVideoDecoder::FrameSizeChange(unsigned int width,
|
| - unsigned int height,
|
| - unsigned int number_of_streams) {
|
| +bool RTCVideoDecoder::SetSize(int width, int height, int reserved) {
|
| width_ = width;
|
| height_ = height;
|
|
|
| media_format_.SetAsInteger(MediaFormat::kWidth, width_);
|
| media_format_.SetAsInteger(MediaFormat::kHeight, height_);
|
| host()->SetVideoSize(width_, height_);
|
| - return 0;
|
| + return true;
|
| }
|
|
|
| -int RTCVideoDecoder::DeliverFrame(unsigned char* buffer,
|
| - int buffer_size) {
|
| - DCHECK(buffer);
|
| +bool RTCVideoDecoder::RenderFrame(const cricket::VideoFrame* frame) {
|
| + DCHECK(frame);
|
|
|
| - if (frame_queue_available_.size() == 0)
|
| - return 0;
|
| -
|
| if (state_ != kNormal)
|
| - return 0;
|
| + return true;
|
|
|
| // This is called from another thread
|
| lock_.Acquire();
|
| + if (frame_queue_available_.size() == 0) {
|
| + lock_.Release();
|
| + return true;
|
| + }
|
| scoped_refptr<VideoFrame> video_frame = frame_queue_available_.front();
|
| frame_queue_available_.pop_front();
|
| lock_.Release();
|
| @@ -228,32 +233,33 @@
|
| kNoTimestamp,
|
| kNoTimestamp,
|
| &video_frame);
|
| - if (!video_frame.get()) {
|
| - return -1;
|
| - }
|
| + if (!video_frame.get())
|
| + return false;
|
| }
|
|
|
| video_frame->SetTimestamp(host()->GetTime());
|
| video_frame->SetDuration(base::TimeDelta::FromMilliseconds(30));
|
|
|
| uint8* y_plane = video_frame->data(VideoFrame::kYPlane);
|
| + const uint8* y_plane_src = frame->GetYPlane();
|
| for (size_t row = 0; row < video_frame->height(); ++row) {
|
| - memcpy(y_plane, buffer, width_);
|
| + memcpy(y_plane, y_plane_src, frame->GetYPitch());
|
| y_plane += video_frame->stride(VideoFrame::kYPlane);
|
| - buffer += width_;
|
| + y_plane_src += frame->GetYPitch();
|
| }
|
| - size_t uv_width = width_/2;
|
| uint8* u_plane = video_frame->data(VideoFrame::kUPlane);
|
| + const uint8* u_plane_src = frame->GetUPlane();
|
| for (size_t row = 0; row < video_frame->height(); row += 2) {
|
| - memcpy(u_plane, buffer, uv_width);
|
| + memcpy(u_plane, u_plane_src, frame->GetUPitch());
|
| u_plane += video_frame->stride(VideoFrame::kUPlane);
|
| - buffer += uv_width;
|
| + u_plane_src += frame->GetUPitch();
|
| }
|
| uint8* v_plane = video_frame->data(VideoFrame::kVPlane);
|
| + const uint8* v_plane_src = frame->GetVPlane();
|
| for (size_t row = 0; row < video_frame->height(); row += 2) {
|
| - memcpy(v_plane, buffer, uv_width);
|
| + memcpy(v_plane, v_plane_src, frame->GetVPitch());
|
| v_plane += video_frame->stride(VideoFrame::kVPlane);
|
| - buffer += uv_width;
|
| + v_plane_src += frame->GetVPitch();
|
| }
|
|
|
| if (MessageLoop::current() != message_loop_) {
|
| @@ -266,12 +272,5 @@
|
| VideoFrameReady(video_frame);
|
| }
|
|
|
| - return 0;
|
| + return true;
|
| }
|
| -
|
| -bool RTCVideoDecoder::IsUrlSupported(const std::string& url) {
|
| - GURL gurl(url);
|
| - return gurl.SchemeIs(kMediaScheme);
|
| -}
|
| -
|
| -} // namespace media
|
|
|