Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2030)

Unified Diff: content/renderer/media/rtc_video_decoder.cc

Issue 426873004: Pass decoded picture size from VDA to client (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: use gfx::Size Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/rtc_video_decoder.cc
diff --git a/content/renderer/media/rtc_video_decoder.cc b/content/renderer/media/rtc_video_decoder.cc
index 4e4b3199683e7a0f33e37f48fee7360be304417c..0b5ccda45dbeb2c5b7fe5d73459c4adf0827731c 100644
--- a/content/renderer/media/rtc_video_decoder.cc
+++ b/content/renderer/media/rtc_video_decoder.cc
@@ -61,13 +61,9 @@ RTCVideoDecoder::SHMBuffer::~SHMBuffer() { shm->Close(); }
RTCVideoDecoder::BufferData::BufferData(int32 bitstream_buffer_id,
uint32_t timestamp,
- int width,
- int height,
size_t size)
: bitstream_buffer_id(bitstream_buffer_id),
timestamp(timestamp),
- width(width),
- height(height),
size(size) {}
RTCVideoDecoder::BufferData::BufferData() {}
@@ -208,13 +204,17 @@ int32_t RTCVideoDecoder::Decode(
bool need_to_reset_for_midstream_resize = false;
if (inputImage._frameType == webrtc::kKeyFrame) {
- DVLOG(2) << "Got key frame. size=" << inputImage._encodedWidth << "x"
- << inputImage._encodedHeight;
- gfx::Size prev_frame_size = frame_size_;
- frame_size_.SetSize(inputImage._encodedWidth, inputImage._encodedHeight);
- if (!kVDACanHandleMidstreamResize && !prev_frame_size.IsEmpty() &&
- prev_frame_size != frame_size_) {
- need_to_reset_for_midstream_resize = true;
+ // TODO(kcwu): What if VDA cannot handle mid stream resize and
+ // encoded size is unknown??
Pawel Osciak 2014/08/10 00:02:21 s/??/?/ Not sure what you mean here, VDA will alw
kcwu 2014/08/12 03:50:47 1. Should I still use client provided size if avai
Pawel Osciak 2014/08/12 04:05:07 Given that some vdas can't provide visible size, I
kcwu 2014/08/12 04:48:06 Okay, then should I leave comment here to indicate
Pawel Osciak 2014/08/12 04:59:24 Yes please.
+ if (inputImage._encodedWidth && inputImage._encodedHeight) {
+ DVLOG(2) << "Got key frame. size=" << inputImage._encodedWidth << "x"
+ << inputImage._encodedHeight;
+ gfx::Size prev_frame_size = frame_size_;
+ frame_size_.SetSize(inputImage._encodedWidth, inputImage._encodedHeight);
+ if (!kVDACanHandleMidstreamResize && !prev_frame_size.IsEmpty() &&
+ prev_frame_size != frame_size_) {
+ need_to_reset_for_midstream_resize = true;
+ }
}
} else if (IsFirstBufferAfterReset(next_bitstream_buffer_id_,
reset_bitstream_buffer_id_)) {
@@ -227,8 +227,6 @@ int32_t RTCVideoDecoder::Decode(
// Create buffer metadata.
BufferData buffer_data(next_bitstream_buffer_id_,
inputImage._timeStamp,
- frame_size_.width(),
- frame_size_.height(),
inputImage._length);
// Mask against 30 bits, to avoid (undefined) wraparound on signed integer.
next_bitstream_buffer_id_ = (next_bitstream_buffer_id_ + 1) & ID_LAST;
@@ -365,12 +363,12 @@ void RTCVideoDecoder::PictureReady(const media::Picture& picture) {
const media::PictureBuffer& pb = it->second;
// Create a media::VideoFrame.
- uint32_t timestamp = 0, width = 0, height = 0;
+ uint32_t timestamp = 0;
size_t size = 0;
GetBufferData(
- picture.bitstream_buffer_id(), &timestamp, &width, &height, &size);
+ picture.bitstream_buffer_id(), &timestamp);
scoped_refptr<media::VideoFrame> frame =
- CreateVideoFrame(picture, pb, timestamp, width, height, size);
+ CreateVideoFrame(picture, pb, timestamp, size);
bool inserted =
picture_buffers_at_display_.insert(std::make_pair(
picture.picture_buffer_id(),
@@ -380,7 +378,11 @@ void RTCVideoDecoder::PictureReady(const media::Picture& picture) {
// Create a WebRTC video frame.
webrtc::RefCountImpl<NativeHandleImpl>* handle =
new webrtc::RefCountImpl<NativeHandleImpl>(frame);
- webrtc::TextureVideoFrame decoded_image(handle, width, height, timestamp, 0);
+ webrtc::TextureVideoFrame decoded_image(handle,
+ picture.size().width(),
+ picture.size().height(),
+ timestamp,
+ 0);
// Invoke decode callback. WebRTC expects no callback after Reset or Release.
{
@@ -424,10 +426,8 @@ scoped_refptr<media::VideoFrame> RTCVideoDecoder::CreateVideoFrame(
const media::Picture& picture,
const media::PictureBuffer& pb,
uint32_t timestamp,
- uint32_t width,
- uint32_t height,
size_t size) {
- gfx::Rect visible_rect(width, height);
+ gfx::Rect visible_rect(picture.size());
DCHECK(decoder_texture_target_);
// Convert timestamp from 90KHz to ms.
base::TimeDelta timestamp_ms = base::TimeDelta::FromInternalValue(
@@ -777,18 +777,13 @@ void RTCVideoDecoder::RecordBufferData(const BufferData& buffer_data) {
}
void RTCVideoDecoder::GetBufferData(int32 bitstream_buffer_id,
- uint32_t* timestamp,
- uint32_t* width,
- uint32_t* height,
- size_t* size) {
+ uint32_t* timestamp) {
for (std::list<BufferData>::iterator it = input_buffer_data_.begin();
it != input_buffer_data_.end();
++it) {
if (it->bitstream_buffer_id != bitstream_buffer_id)
continue;
*timestamp = it->timestamp;
- *width = it->width;
- *height = it->height;
return;
}
NOTREACHED() << "Missing bitstream buffer id: " << bitstream_buffer_id;

Powered by Google App Engine
This is Rietveld 408576698