Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/v4l2_slice_video_decode_accelerator.h" | 5 #include "media/gpu/v4l2_slice_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <linux/videodev2.h> | 9 #include <linux/videodev2.h> |
| 10 #include <poll.h> | 10 #include <poll.h> |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 793 } | 793 } |
| 794 | 794 |
| 795 bool V4L2SliceVideoDecodeAccelerator::CreateOutputBuffers() { | 795 bool V4L2SliceVideoDecodeAccelerator::CreateOutputBuffers() { |
| 796 DVLOGF(3); | 796 DVLOGF(3); |
| 797 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); | 797 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); |
| 798 DCHECK(!output_streamon_); | 798 DCHECK(!output_streamon_); |
| 799 DCHECK(output_buffer_map_.empty()); | 799 DCHECK(output_buffer_map_.empty()); |
| 800 DCHECK(surfaces_at_display_.empty()); | 800 DCHECK(surfaces_at_display_.empty()); |
| 801 DCHECK(surfaces_at_device_.empty()); | 801 DCHECK(surfaces_at_device_.empty()); |
| 802 | 802 |
| 803 visible_size_ = decoder_->GetPicSize(); | 803 gfx::Size pic_size = decoder_->GetPicSize(); |
| 804 visible_rect_ = decoder_->GetVisibleRect(); | |
| 804 size_t num_pictures = decoder_->GetRequiredNumOfPictures(); | 805 size_t num_pictures = decoder_->GetRequiredNumOfPictures(); |
| 805 | 806 |
| 806 DCHECK_GT(num_pictures, 0u); | 807 DCHECK_GT(num_pictures, 0u); |
| 807 DCHECK(!visible_size_.IsEmpty()); | 808 DCHECK(!pic_size.IsEmpty()); |
| 809 DCHECK(!visible_rect_.IsEmpty()); | |
|
Owen Lin
2017/06/07 06:10:59
As said in previous file, remove the check.
Is it
johnylin1
2017/06/07 15:38:37
We may pass visible size from decoder to VDA along
| |
| 808 | 810 |
| 809 struct v4l2_format format; | 811 struct v4l2_format format; |
| 810 memset(&format, 0, sizeof(format)); | 812 memset(&format, 0, sizeof(format)); |
| 811 format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; | 813 format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; |
| 812 format.fmt.pix_mp.pixelformat = output_format_fourcc_; | 814 format.fmt.pix_mp.pixelformat = output_format_fourcc_; |
| 813 format.fmt.pix_mp.width = visible_size_.width(); | 815 format.fmt.pix_mp.width = pic_size.width(); |
| 814 format.fmt.pix_mp.height = visible_size_.height(); | 816 format.fmt.pix_mp.height = pic_size.height(); |
| 815 format.fmt.pix_mp.num_planes = input_planes_count_; | 817 format.fmt.pix_mp.num_planes = input_planes_count_; |
| 816 | 818 |
| 817 if (device_->Ioctl(VIDIOC_S_FMT, &format) != 0) { | 819 if (device_->Ioctl(VIDIOC_S_FMT, &format) != 0) { |
| 818 PLOGF(ERROR) << "Failed setting format to: " << output_format_fourcc_; | 820 PLOGF(ERROR) << "Failed setting format to: " << output_format_fourcc_; |
| 819 NOTIFY_ERROR(PLATFORM_FAILURE); | 821 NOTIFY_ERROR(PLATFORM_FAILURE); |
| 820 return false; | 822 return false; |
| 821 } | 823 } |
| 822 | 824 |
| 823 coded_size_.SetSize(base::checked_cast<int>(format.fmt.pix_mp.width), | 825 coded_size_.SetSize(base::checked_cast<int>(format.fmt.pix_mp.width), |
| 824 base::checked_cast<int>(format.fmt.pix_mp.height)); | 826 base::checked_cast<int>(format.fmt.pix_mp.height)); |
| 825 DCHECK_EQ(coded_size_.width() % 16, 0); | 827 DCHECK_EQ(coded_size_.width() % 16, 0); |
| 826 DCHECK_EQ(coded_size_.height() % 16, 0); | 828 DCHECK_EQ(coded_size_.height() % 16, 0); |
| 827 | 829 |
| 828 if (!gfx::Rect(coded_size_).Contains(gfx::Rect(visible_size_))) { | 830 if (!gfx::Rect(coded_size_).Contains(visible_rect_)) { |
|
Owen Lin
2017/06/07 06:10:59
use pic_size.
johnylin1
2017/06/07 15:38:37
Done.
| |
| 829 LOGF(ERROR) << "Got invalid adjusted coded size: " | 831 LOGF(ERROR) << "Got invalid adjusted coded size: " << coded_size_.ToString() |
| 830 << coded_size_.ToString(); | 832 << ", visible rect:" << visible_rect_.ToString(); |
| 831 return false; | 833 return false; |
| 832 } | 834 } |
| 833 | 835 |
| 834 DVLOGF(3) << "buffer_count=" << num_pictures | 836 DVLOGF(3) << "buffer_count=" << num_pictures |
| 835 << ", visible size=" << visible_size_.ToString() | 837 << ", visible rect=" << visible_rect_.ToString() |
| 836 << ", coded size=" << coded_size_.ToString(); | 838 << ", coded size=" << coded_size_.ToString(); |
| 837 | 839 |
| 838 // With ALLOCATE mode the client can sample it as RGB and doesn't need to | 840 // With ALLOCATE mode the client can sample it as RGB and doesn't need to |
| 839 // know the precise format. | 841 // know the precise format. |
| 840 VideoPixelFormat pixel_format = | 842 VideoPixelFormat pixel_format = |
| 841 (output_mode_ == Config::OutputMode::IMPORT) | 843 (output_mode_ == Config::OutputMode::IMPORT) |
| 842 ? V4L2Device::V4L2PixFmtToVideoPixelFormat(output_format_fourcc_) | 844 ? V4L2Device::V4L2PixFmtToVideoPixelFormat(output_format_fourcc_) |
| 843 : PIXEL_FORMAT_UNKNOWN; | 845 : PIXEL_FORMAT_UNKNOWN; |
| 844 | 846 |
| 845 child_task_runner_->PostTask( | 847 child_task_runner_->PostTask( |
| (...skipping 2334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3180 surfaces_at_display_ | 3182 surfaces_at_display_ |
| 3181 .insert(std::make_pair(output_record.picture_id, dec_surface)) | 3183 .insert(std::make_pair(output_record.picture_id, dec_surface)) |
| 3182 .second; | 3184 .second; |
| 3183 DCHECK(inserted); | 3185 DCHECK(inserted); |
| 3184 | 3186 |
| 3185 DCHECK(!output_record.at_client); | 3187 DCHECK(!output_record.at_client); |
| 3186 DCHECK(!output_record.at_device); | 3188 DCHECK(!output_record.at_device); |
| 3187 DCHECK_NE(output_record.picture_id, -1); | 3189 DCHECK_NE(output_record.picture_id, -1); |
| 3188 output_record.at_client = true; | 3190 output_record.at_client = true; |
| 3189 | 3191 |
| 3190 // TODO(posciak): Use visible size from decoder here instead | |
| 3191 // (crbug.com/402760). Passing (0, 0) results in the client using the | |
| 3192 // visible size extracted from the container instead. | |
| 3193 // TODO(hubbe): Insert correct color space. http://crbug.com/647725 | 3192 // TODO(hubbe): Insert correct color space. http://crbug.com/647725 |
| 3194 Picture picture(output_record.picture_id, dec_surface->bitstream_id(), | 3193 Picture picture(output_record.picture_id, dec_surface->bitstream_id(), |
| 3195 gfx::Rect(0, 0), gfx::ColorSpace(), false); | 3194 visible_rect_, gfx::ColorSpace(), false); |
| 3196 DVLOGF(3) << dec_surface->ToString() | 3195 DVLOGF(3) << dec_surface->ToString() |
| 3197 << ", bitstream_id: " << picture.bitstream_buffer_id() | 3196 << ", bitstream_id: " << picture.bitstream_buffer_id() |
| 3198 << ", picture_id: " << picture.picture_buffer_id(); | 3197 << ", picture_id: " << picture.picture_buffer_id() |
| 3198 << ", visible_rect: " << visible_rect_.ToString(); | |
| 3199 pending_picture_ready_.push(PictureRecord(output_record.cleared, picture)); | 3199 pending_picture_ready_.push(PictureRecord(output_record.cleared, picture)); |
| 3200 SendPictureReady(); | 3200 SendPictureReady(); |
| 3201 output_record.cleared = true; | 3201 output_record.cleared = true; |
| 3202 } | 3202 } |
| 3203 | 3203 |
| 3204 scoped_refptr<V4L2SliceVideoDecodeAccelerator::V4L2DecodeSurface> | 3204 scoped_refptr<V4L2SliceVideoDecodeAccelerator::V4L2DecodeSurface> |
| 3205 V4L2SliceVideoDecodeAccelerator::CreateSurface() { | 3205 V4L2SliceVideoDecodeAccelerator::CreateSurface() { |
| 3206 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); | 3206 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); |
| 3207 DCHECK_EQ(state_, kDecoding); | 3207 DCHECK_EQ(state_, kDecoding); |
| 3208 | 3208 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3295 V4L2SliceVideoDecodeAccelerator::GetSupportedProfiles() { | 3295 V4L2SliceVideoDecodeAccelerator::GetSupportedProfiles() { |
| 3296 scoped_refptr<V4L2Device> device = V4L2Device::Create(); | 3296 scoped_refptr<V4L2Device> device = V4L2Device::Create(); |
| 3297 if (!device) | 3297 if (!device) |
| 3298 return SupportedProfiles(); | 3298 return SupportedProfiles(); |
| 3299 | 3299 |
| 3300 return device->GetSupportedDecodeProfiles(arraysize(supported_input_fourccs_), | 3300 return device->GetSupportedDecodeProfiles(arraysize(supported_input_fourccs_), |
| 3301 supported_input_fourccs_); | 3301 supported_input_fourccs_); |
| 3302 } | 3302 } |
| 3303 | 3303 |
| 3304 } // namespace media | 3304 } // namespace media |
| OLD | NEW |