| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/vaapi_video_decode_accelerator.h" | 5 #include "media/gpu/vaapi_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 class VaapiVideoDecodeAccelerator::VaapiVP9Accelerator | 238 class VaapiVideoDecodeAccelerator::VaapiVP9Accelerator |
| 239 : public VP9Decoder::VP9Accelerator { | 239 : public VP9Decoder::VP9Accelerator { |
| 240 public: | 240 public: |
| 241 VaapiVP9Accelerator(VaapiVideoDecodeAccelerator* vaapi_dec, | 241 VaapiVP9Accelerator(VaapiVideoDecodeAccelerator* vaapi_dec, |
| 242 VaapiWrapper* vaapi_wrapper); | 242 VaapiWrapper* vaapi_wrapper); |
| 243 ~VaapiVP9Accelerator() override; | 243 ~VaapiVP9Accelerator() override; |
| 244 | 244 |
| 245 // VP9Decoder::VP9Accelerator implementation. | 245 // VP9Decoder::VP9Accelerator implementation. |
| 246 scoped_refptr<VP9Picture> CreateVP9Picture() override; | 246 scoped_refptr<VP9Picture> CreateVP9Picture() override; |
| 247 | 247 |
| 248 bool SubmitDecode( | 248 bool SubmitDecode(const scoped_refptr<VP9Picture>& pic, |
| 249 const scoped_refptr<VP9Picture>& pic, | 249 const Vp9SegmentationParams& seg, |
| 250 const Vp9SegmentationParams& seg, | 250 const Vp9LoopFilterParams& lf, |
| 251 const Vp9LoopFilterParams& lf, | 251 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures, |
| 252 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures) override; | 252 const base::Closure& done_cb) override; |
| 253 | 253 |
| 254 bool OutputPicture(const scoped_refptr<VP9Picture>& pic) override; | 254 bool OutputPicture(const scoped_refptr<VP9Picture>& pic) override; |
| 255 | 255 |
| 256 bool IsFrameContextRequired() const override { return false; } |
| 257 |
| 258 bool GetFrameContext(const scoped_refptr<VP9Picture>& pic, |
| 259 Vp9FrameContext* frame_ctx) override; |
| 260 |
| 256 private: | 261 private: |
| 257 scoped_refptr<VaapiDecodeSurface> VP9PictureToVaapiDecodeSurface( | 262 scoped_refptr<VaapiDecodeSurface> VP9PictureToVaapiDecodeSurface( |
| 258 const scoped_refptr<VP9Picture>& pic); | 263 const scoped_refptr<VP9Picture>& pic); |
| 259 | 264 |
| 260 VaapiWrapper* vaapi_wrapper_; | 265 VaapiWrapper* vaapi_wrapper_; |
| 261 VaapiVideoDecodeAccelerator* vaapi_dec_; | 266 VaapiVideoDecodeAccelerator* vaapi_dec_; |
| 262 | 267 |
| 263 DISALLOW_COPY_AND_ASSIGN(VaapiVP9Accelerator); | 268 DISALLOW_COPY_AND_ASSIGN(VaapiVP9Accelerator); |
| 264 }; | 269 }; |
| 265 | 270 |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 break; | 617 break; |
| 613 | 618 |
| 614 case AcceleratedVideoDecoder::kRanOutOfSurfaces: | 619 case AcceleratedVideoDecoder::kRanOutOfSurfaces: |
| 615 // No more output buffers in the decoder, try getting more or go to | 620 // No more output buffers in the decoder, try getting more or go to |
| 616 // sleep waiting for them. | 621 // sleep waiting for them. |
| 617 if (!WaitForSurfaces_Locked()) | 622 if (!WaitForSurfaces_Locked()) |
| 618 return; | 623 return; |
| 619 | 624 |
| 620 break; | 625 break; |
| 621 | 626 |
| 627 case AcceleratedVideoDecoder::kNeedContextUpdate: |
| 628 // This should not happen as we return false from |
| 629 // IsFrameContextRequired(). |
| 630 NOTREACHED() << "Context updates not supported"; |
| 631 return; |
| 632 |
| 622 case AcceleratedVideoDecoder::kDecodeError: | 633 case AcceleratedVideoDecoder::kDecodeError: |
| 623 RETURN_AND_NOTIFY_ON_FAILURE(false, "Error decoding stream", | 634 RETURN_AND_NOTIFY_ON_FAILURE(false, "Error decoding stream", |
| 624 PLATFORM_FAILURE, ); | 635 PLATFORM_FAILURE, ); |
| 625 return; | 636 return; |
| 626 } | 637 } |
| 627 } | 638 } |
| 628 } | 639 } |
| 629 | 640 |
| 630 void VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange(size_t num_pics, | 641 void VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange(size_t num_pics, |
| 631 gfx::Size size) { | 642 gfx::Size size) { |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 if (!va_surface) | 1723 if (!va_surface) |
| 1713 return nullptr; | 1724 return nullptr; |
| 1714 | 1725 |
| 1715 return new VaapiVP9Picture(va_surface); | 1726 return new VaapiVP9Picture(va_surface); |
| 1716 } | 1727 } |
| 1717 | 1728 |
| 1718 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::SubmitDecode( | 1729 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::SubmitDecode( |
| 1719 const scoped_refptr<VP9Picture>& pic, | 1730 const scoped_refptr<VP9Picture>& pic, |
| 1720 const Vp9SegmentationParams& seg, | 1731 const Vp9SegmentationParams& seg, |
| 1721 const Vp9LoopFilterParams& lf, | 1732 const Vp9LoopFilterParams& lf, |
| 1722 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures) { | 1733 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures, |
| 1734 const base::Closure& done_cb) { |
| 1735 // TODO(posciak): We don't currently have the ability to know when the surface |
| 1736 // is decoded, as we submit both the decode job and output independently and |
| 1737 // don't wait for just the decode to be finished, instead relying on the |
| 1738 // driver to execute them in correct order. |
| 1739 DCHECK(!done_cb.is_null()); |
| 1740 |
| 1723 VADecPictureParameterBufferVP9 pic_param; | 1741 VADecPictureParameterBufferVP9 pic_param; |
| 1724 memset(&pic_param, 0, sizeof(pic_param)); | 1742 memset(&pic_param, 0, sizeof(pic_param)); |
| 1725 | 1743 |
| 1726 const Vp9FrameHeader* frame_hdr = pic->frame_hdr.get(); | 1744 const Vp9FrameHeader* frame_hdr = pic->frame_hdr.get(); |
| 1727 DCHECK(frame_hdr); | 1745 DCHECK(frame_hdr); |
| 1728 | 1746 |
| 1729 if (frame_hdr->profile != 0) { | 1747 if (frame_hdr->profile != 0) { |
| 1730 DVLOG(1) << "Unsupported profile" << frame_hdr->profile; | 1748 DVLOG(1) << "Unsupported profile" << frame_hdr->profile; |
| 1731 return false; | 1749 return false; |
| 1732 } | 1750 } |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1841 | 1859 |
| 1842 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::OutputPicture( | 1860 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::OutputPicture( |
| 1843 const scoped_refptr<VP9Picture>& pic) { | 1861 const scoped_refptr<VP9Picture>& pic) { |
| 1844 scoped_refptr<VaapiDecodeSurface> dec_surface = | 1862 scoped_refptr<VaapiDecodeSurface> dec_surface = |
| 1845 VP9PictureToVaapiDecodeSurface(pic); | 1863 VP9PictureToVaapiDecodeSurface(pic); |
| 1846 | 1864 |
| 1847 vaapi_dec_->SurfaceReady(dec_surface); | 1865 vaapi_dec_->SurfaceReady(dec_surface); |
| 1848 return true; | 1866 return true; |
| 1849 } | 1867 } |
| 1850 | 1868 |
| 1869 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::GetFrameContext( |
| 1870 const scoped_refptr<VP9Picture>& pic, |
| 1871 Vp9FrameContext* frame_ctx) { |
| 1872 NOTIMPLEMENTED() << "Frame context update not supported"; |
| 1873 return false; |
| 1874 } |
| 1875 |
| 1851 scoped_refptr<VaapiVideoDecodeAccelerator::VaapiDecodeSurface> | 1876 scoped_refptr<VaapiVideoDecodeAccelerator::VaapiDecodeSurface> |
| 1852 VaapiVideoDecodeAccelerator::VaapiVP9Accelerator:: | 1877 VaapiVideoDecodeAccelerator::VaapiVP9Accelerator:: |
| 1853 VP9PictureToVaapiDecodeSurface(const scoped_refptr<VP9Picture>& pic) { | 1878 VP9PictureToVaapiDecodeSurface(const scoped_refptr<VP9Picture>& pic) { |
| 1854 VaapiVP9Picture* vaapi_pic = pic->AsVaapiVP9Picture(); | 1879 VaapiVP9Picture* vaapi_pic = pic->AsVaapiVP9Picture(); |
| 1855 CHECK(vaapi_pic); | 1880 CHECK(vaapi_pic); |
| 1856 return vaapi_pic->dec_surface(); | 1881 return vaapi_pic->dec_surface(); |
| 1857 } | 1882 } |
| 1858 | 1883 |
| 1859 // static | 1884 // static |
| 1860 VideoDecodeAccelerator::SupportedProfiles | 1885 VideoDecodeAccelerator::SupportedProfiles |
| 1861 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { | 1886 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { |
| 1862 return VaapiWrapper::GetSupportedDecodeProfiles(); | 1887 return VaapiWrapper::GetSupportedDecodeProfiles(); |
| 1863 } | 1888 } |
| 1864 | 1889 |
| 1865 } // namespace media | 1890 } // namespace media |
| OLD | NEW |