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

Side by Side Diff: media/gpu/vp8_decoder.cc

Issue 2926593002: V4L2SVDA/VAAPIVDA: use visible size from decoder and pass to client (Closed)
Patch Set: V4L2SVDA/VAAPIVDA: use visible size from decoder and pass to client Created 3 years, 6 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 unified diff | Download patch
« no previous file with comments | « media/gpu/vp8_decoder.h ('k') | media/gpu/vp8_picture.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/gpu/vp8_decoder.h" 5 #include "media/gpu/vp8_decoder.h"
6 #include "media/base/limits.h" 6 #include "media/base/limits.h"
7 7
8 namespace media { 8 namespace media {
9 9
10 VP8Decoder::VP8Accelerator::VP8Accelerator() {} 10 VP8Decoder::VP8Accelerator::VP8Accelerator() {}
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 curr_frame_hdr_.reset(new Vp8FrameHeader()); 58 curr_frame_hdr_.reset(new Vp8FrameHeader());
59 if (!parser_.ParseFrame(curr_frame_start_, frame_size_, 59 if (!parser_.ParseFrame(curr_frame_start_, frame_size_,
60 curr_frame_hdr_.get())) { 60 curr_frame_hdr_.get())) {
61 DVLOG(1) << "Error during decode"; 61 DVLOG(1) << "Error during decode";
62 state_ = kError; 62 state_ = kError;
63 return kDecodeError; 63 return kDecodeError;
64 } 64 }
65 } 65 }
66 66
67 if (curr_frame_hdr_->IsKeyframe()) { 67 if (curr_frame_hdr_->IsKeyframe()) {
68 gfx::Size new_pic_size(curr_frame_hdr_->width, curr_frame_hdr_->height); 68 gfx::Rect new_visible_rect(curr_frame_hdr_->width, curr_frame_hdr_->height);
69 if (new_pic_size.IsEmpty()) 69 if (new_visible_rect.IsEmpty())
70 return kDecodeError; 70 return kDecodeError;
71 visible_rect_ = new_visible_rect;
72 DVLOG(2) << "Visible size: " << visible_rect_.ToString();
73
74 // Per spec, frame size is not necessarily evenly divisible by 16, while
75 // frame is encoded by 16x16 macroblock units. Add excess width and height
76 // to be divisible by 16.
77 uint16_t coded_width =
Owen Lin 2017/06/14 02:28:25 You may use base::bits::Align. https://cs.chromiu
johnylin1 2017/06/14 14:11:22 Sounds good to me. Let's create another CL then.
78 (curr_frame_hdr_->width & 15)
79 ? curr_frame_hdr_->width + 16 - (curr_frame_hdr_->width & 15)
80 : curr_frame_hdr_->width;
81 uint16_t coded_height =
82 (curr_frame_hdr_->height & 15)
83 ? curr_frame_hdr_->height + 16 - (curr_frame_hdr_->height & 15)
84 : curr_frame_hdr_->height;
85 gfx::Size new_pic_size(coded_width, coded_height);
71 86
72 if (new_pic_size != pic_size_) { 87 if (new_pic_size != pic_size_) {
73 DVLOG(2) << "New resolution: " << new_pic_size.ToString(); 88 DVLOG(2) << "New resolution: " << new_pic_size.ToString();
74 pic_size_ = new_pic_size; 89 pic_size_ = new_pic_size;
75 90
76 DCHECK(!curr_pic_); 91 DCHECK(!curr_pic_);
77 last_frame_ = nullptr; 92 last_frame_ = nullptr;
78 golden_frame_ = nullptr; 93 golden_frame_ = nullptr;
79 alt_frame_ = nullptr; 94 alt_frame_ = nullptr;
80 95
81 return kAllocateNewSurfaces; 96 return kAllocateNewSurfaces;
82 } 97 }
83 98
84 state_ = kDecoding; 99 state_ = kDecoding;
85 } else { 100 } else {
86 if (state_ != kDecoding) { 101 if (state_ != kDecoding) {
87 // Need a resume point. 102 // Need a resume point.
88 curr_frame_hdr_.reset(); 103 curr_frame_hdr_.reset();
89 return kRanOutOfStreamData; 104 return kRanOutOfStreamData;
90 } 105 }
91 } 106 }
92 107
93 curr_pic_ = accelerator_->CreateVP8Picture(); 108 curr_pic_ = accelerator_->CreateVP8Picture();
94 if (!curr_pic_) 109 if (!curr_pic_)
95 return kRanOutOfSurfaces; 110 return kRanOutOfSurfaces;
96 111
112 curr_pic_->visible_rect = visible_rect_;
97 if (!DecodeAndOutputCurrentFrame()) 113 if (!DecodeAndOutputCurrentFrame())
98 return kDecodeError; 114 return kDecodeError;
99 115
100 return kRanOutOfStreamData; 116 return kRanOutOfStreamData;
101 } 117 }
102 118
103 void VP8Decoder::RefreshReferenceFrames() { 119 void VP8Decoder::RefreshReferenceFrames() {
104 if (curr_frame_hdr_->IsKeyframe()) { 120 if (curr_frame_hdr_->IsKeyframe()) {
105 last_frame_ = curr_pic_; 121 last_frame_ = curr_pic_;
106 golden_frame_ = curr_pic_; 122 golden_frame_ = curr_pic_;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 return pic_size_; 201 return pic_size_;
186 } 202 }
187 203
188 size_t VP8Decoder::GetRequiredNumOfPictures() const { 204 size_t VP8Decoder::GetRequiredNumOfPictures() const {
189 const size_t kVP8NumFramesActive = 4; 205 const size_t kVP8NumFramesActive = 4;
190 const size_t kPicsInPipeline = limits::kMaxVideoFrames + 2; 206 const size_t kPicsInPipeline = limits::kMaxVideoFrames + 2;
191 return kVP8NumFramesActive + kPicsInPipeline; 207 return kVP8NumFramesActive + kPicsInPipeline;
192 } 208 }
193 209
194 } // namespace media 210 } // namespace media
OLDNEW
« no previous file with comments | « media/gpu/vp8_decoder.h ('k') | media/gpu/vp8_picture.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698