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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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( |
249 const scoped_refptr<VP9Picture>& pic, | 249 const scoped_refptr<VP9Picture>& pic, |
250 const Vp9Segmentation& seg, | 250 const Vp9SegmentationParams& seg, |
251 const Vp9LoopFilter& lf, | 251 const Vp9LoopFilterParams& lf, |
252 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures) override; | 252 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures) override; |
253 | 253 |
254 bool OutputPicture(const scoped_refptr<VP9Picture>& pic) override; | 254 bool OutputPicture(const scoped_refptr<VP9Picture>& pic) override; |
255 | 255 |
256 private: | 256 private: |
257 scoped_refptr<VaapiDecodeSurface> VP9PictureToVaapiDecodeSurface( | 257 scoped_refptr<VaapiDecodeSurface> VP9PictureToVaapiDecodeSurface( |
258 const scoped_refptr<VP9Picture>& pic); | 258 const scoped_refptr<VP9Picture>& pic); |
259 | 259 |
260 VaapiWrapper* vaapi_wrapper_; | 260 VaapiWrapper* vaapi_wrapper_; |
261 VaapiVideoDecodeAccelerator* vaapi_dec_; | 261 VaapiVideoDecodeAccelerator* vaapi_dec_; |
(...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::CreateVP9Picture() { | 1710 VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::CreateVP9Picture() { |
1711 scoped_refptr<VaapiDecodeSurface> va_surface = vaapi_dec_->CreateSurface(); | 1711 scoped_refptr<VaapiDecodeSurface> va_surface = vaapi_dec_->CreateSurface(); |
1712 if (!va_surface) | 1712 if (!va_surface) |
1713 return nullptr; | 1713 return nullptr; |
1714 | 1714 |
1715 return new VaapiVP9Picture(va_surface); | 1715 return new VaapiVP9Picture(va_surface); |
1716 } | 1716 } |
1717 | 1717 |
1718 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::SubmitDecode( | 1718 bool VaapiVideoDecodeAccelerator::VaapiVP9Accelerator::SubmitDecode( |
1719 const scoped_refptr<VP9Picture>& pic, | 1719 const scoped_refptr<VP9Picture>& pic, |
1720 const Vp9Segmentation& seg, | 1720 const Vp9SegmentationParams& seg, |
1721 const Vp9LoopFilter& lf, | 1721 const Vp9LoopFilterParams& lf, |
1722 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures) { | 1722 const std::vector<scoped_refptr<VP9Picture>>& ref_pictures) { |
1723 VADecPictureParameterBufferVP9 pic_param; | 1723 VADecPictureParameterBufferVP9 pic_param; |
1724 memset(&pic_param, 0, sizeof(pic_param)); | 1724 memset(&pic_param, 0, sizeof(pic_param)); |
1725 | 1725 |
1726 const Vp9FrameHeader* frame_hdr = pic->frame_hdr.get(); | 1726 const Vp9FrameHeader* frame_hdr = pic->frame_hdr.get(); |
1727 DCHECK(frame_hdr); | 1727 DCHECK(frame_hdr); |
1728 | 1728 |
1729 if (frame_hdr->profile != 0) { | 1729 if (frame_hdr->profile != 0) { |
1730 DVLOG(1) << "Unsupported profile" << frame_hdr->profile; | 1730 DVLOG(1) << "Unsupported profile" << frame_hdr->profile; |
1731 return false; | 1731 return false; |
1732 } | 1732 } |
1733 | 1733 |
1734 pic_param.frame_width = base::checked_cast<uint16_t>(frame_hdr->width); | 1734 pic_param.frame_width = base::checked_cast<uint16_t>(frame_hdr->frame_width); |
1735 pic_param.frame_height = base::checked_cast<uint16_t>(frame_hdr->height); | 1735 pic_param.frame_height = |
| 1736 base::checked_cast<uint16_t>(frame_hdr->frame_height); |
1736 | 1737 |
1737 CHECK_EQ(ref_pictures.size(), arraysize(pic_param.reference_frames)); | 1738 CHECK_EQ(ref_pictures.size(), arraysize(pic_param.reference_frames)); |
1738 for (size_t i = 0; i < arraysize(pic_param.reference_frames); ++i) { | 1739 for (size_t i = 0; i < arraysize(pic_param.reference_frames); ++i) { |
1739 VASurfaceID va_surface_id; | 1740 VASurfaceID va_surface_id; |
1740 if (ref_pictures[i]) { | 1741 if (ref_pictures[i]) { |
1741 scoped_refptr<VaapiDecodeSurface> surface = | 1742 scoped_refptr<VaapiDecodeSurface> surface = |
1742 VP9PictureToVaapiDecodeSurface(ref_pictures[i]); | 1743 VP9PictureToVaapiDecodeSurface(ref_pictures[i]); |
1743 va_surface_id = surface->va_surface()->id(); | 1744 va_surface_id = surface->va_surface()->id(); |
1744 } else { | 1745 } else { |
1745 va_surface_id = VA_INVALID_SURFACE; | 1746 va_surface_id = VA_INVALID_SURFACE; |
1746 } | 1747 } |
1747 | 1748 |
1748 pic_param.reference_frames[i] = va_surface_id; | 1749 pic_param.reference_frames[i] = va_surface_id; |
1749 } | 1750 } |
1750 | 1751 |
1751 #define FHDR_TO_PP_PF1(a) pic_param.pic_fields.bits.a = frame_hdr->a | 1752 #define FHDR_TO_PP_PF1(a) pic_param.pic_fields.bits.a = frame_hdr->a |
1752 #define FHDR_TO_PP_PF2(a, b) pic_param.pic_fields.bits.a = b | 1753 #define FHDR_TO_PP_PF2(a, b) pic_param.pic_fields.bits.a = b |
1753 FHDR_TO_PP_PF2(subsampling_x, frame_hdr->subsampling_x == 1); | 1754 FHDR_TO_PP_PF2(subsampling_x, frame_hdr->subsampling_x == 1); |
1754 FHDR_TO_PP_PF2(subsampling_y, frame_hdr->subsampling_y == 1); | 1755 FHDR_TO_PP_PF2(subsampling_y, frame_hdr->subsampling_y == 1); |
1755 FHDR_TO_PP_PF2(frame_type, frame_hdr->IsKeyframe() ? 0 : 1); | 1756 FHDR_TO_PP_PF2(frame_type, frame_hdr->IsKeyframe() ? 0 : 1); |
1756 FHDR_TO_PP_PF1(show_frame); | 1757 FHDR_TO_PP_PF1(show_frame); |
1757 FHDR_TO_PP_PF1(error_resilient_mode); | 1758 FHDR_TO_PP_PF1(error_resilient_mode); |
1758 FHDR_TO_PP_PF1(intra_only); | 1759 FHDR_TO_PP_PF1(intra_only); |
1759 FHDR_TO_PP_PF1(allow_high_precision_mv); | 1760 FHDR_TO_PP_PF1(allow_high_precision_mv); |
1760 FHDR_TO_PP_PF2(mcomp_filter_type, frame_hdr->interp_filter); | 1761 FHDR_TO_PP_PF2(mcomp_filter_type, frame_hdr->interpolation_filter); |
1761 FHDR_TO_PP_PF1(frame_parallel_decoding_mode); | 1762 FHDR_TO_PP_PF1(frame_parallel_decoding_mode); |
1762 FHDR_TO_PP_PF2(reset_frame_context, frame_hdr->reset_context); | 1763 FHDR_TO_PP_PF1(reset_frame_context); |
1763 FHDR_TO_PP_PF1(refresh_frame_context); | 1764 FHDR_TO_PP_PF1(refresh_frame_context); |
1764 FHDR_TO_PP_PF1(frame_context_idx); | 1765 FHDR_TO_PP_PF2(frame_context_idx, frame_hdr->frame_context_idx_to_save_probs); |
1765 FHDR_TO_PP_PF2(segmentation_enabled, seg.enabled); | 1766 FHDR_TO_PP_PF2(segmentation_enabled, seg.enabled); |
1766 FHDR_TO_PP_PF2(segmentation_temporal_update, seg.temporal_update); | 1767 FHDR_TO_PP_PF2(segmentation_temporal_update, seg.temporal_update); |
1767 FHDR_TO_PP_PF2(segmentation_update_map, seg.update_map); | 1768 FHDR_TO_PP_PF2(segmentation_update_map, seg.update_map); |
1768 FHDR_TO_PP_PF2(last_ref_frame, frame_hdr->frame_refs[0]); | 1769 FHDR_TO_PP_PF2(last_ref_frame, frame_hdr->ref_frame_idx[0]); |
1769 FHDR_TO_PP_PF2(last_ref_frame_sign_bias, frame_hdr->ref_sign_biases[0]); | 1770 FHDR_TO_PP_PF2(last_ref_frame_sign_bias, |
1770 FHDR_TO_PP_PF2(golden_ref_frame, frame_hdr->frame_refs[1]); | 1771 frame_hdr->ref_frame_sign_bias[Vp9RefType::VP9_FRAME_LAST]); |
1771 FHDR_TO_PP_PF2(golden_ref_frame_sign_bias, frame_hdr->ref_sign_biases[1]); | 1772 FHDR_TO_PP_PF2(golden_ref_frame, frame_hdr->ref_frame_idx[1]); |
1772 FHDR_TO_PP_PF2(alt_ref_frame, frame_hdr->frame_refs[2]); | 1773 FHDR_TO_PP_PF2(golden_ref_frame_sign_bias, |
1773 FHDR_TO_PP_PF2(alt_ref_frame_sign_bias, frame_hdr->ref_sign_biases[2]); | 1774 frame_hdr->ref_frame_sign_bias[Vp9RefType::VP9_FRAME_GOLDEN]); |
| 1775 FHDR_TO_PP_PF2(alt_ref_frame, frame_hdr->ref_frame_idx[2]); |
| 1776 FHDR_TO_PP_PF2(alt_ref_frame_sign_bias, |
| 1777 frame_hdr->ref_frame_sign_bias[Vp9RefType::VP9_FRAME_ALTREF]); |
1774 FHDR_TO_PP_PF2(lossless_flag, frame_hdr->quant_params.IsLossless()); | 1778 FHDR_TO_PP_PF2(lossless_flag, frame_hdr->quant_params.IsLossless()); |
1775 #undef FHDR_TO_PP_PF2 | 1779 #undef FHDR_TO_PP_PF2 |
1776 #undef FHDR_TO_PP_PF1 | 1780 #undef FHDR_TO_PP_PF1 |
1777 | 1781 |
1778 pic_param.filter_level = lf.filter_level; | 1782 pic_param.filter_level = lf.level; |
1779 pic_param.sharpness_level = lf.sharpness_level; | 1783 pic_param.sharpness_level = lf.sharpness; |
1780 pic_param.log2_tile_rows = frame_hdr->log2_tile_rows; | 1784 pic_param.log2_tile_rows = frame_hdr->tile_rows_log2; |
1781 pic_param.log2_tile_columns = frame_hdr->log2_tile_cols; | 1785 pic_param.log2_tile_columns = frame_hdr->tile_cols_log2; |
1782 pic_param.frame_header_length_in_bytes = frame_hdr->uncompressed_header_size; | 1786 pic_param.frame_header_length_in_bytes = frame_hdr->uncompressed_header_size; |
1783 pic_param.first_partition_size = frame_hdr->first_partition_size; | 1787 pic_param.first_partition_size = frame_hdr->header_size_in_bytes; |
1784 | 1788 |
1785 ARRAY_MEMCPY_CHECKED(pic_param.mb_segment_tree_probs, seg.tree_probs); | 1789 ARRAY_MEMCPY_CHECKED(pic_param.mb_segment_tree_probs, seg.tree_probs); |
1786 ARRAY_MEMCPY_CHECKED(pic_param.segment_pred_probs, seg.pred_probs); | 1790 ARRAY_MEMCPY_CHECKED(pic_param.segment_pred_probs, seg.pred_probs); |
1787 | 1791 |
1788 pic_param.profile = frame_hdr->profile; | 1792 pic_param.profile = frame_hdr->profile; |
1789 | 1793 |
1790 if (!vaapi_wrapper_->SubmitBuffer(VAPictureParameterBufferType, | 1794 if (!vaapi_wrapper_->SubmitBuffer(VAPictureParameterBufferType, |
1791 sizeof(pic_param), &pic_param)) | 1795 sizeof(pic_param), &pic_param)) |
1792 return false; | 1796 return false; |
1793 | 1797 |
1794 VASliceParameterBufferVP9 slice_param; | 1798 VASliceParameterBufferVP9 slice_param; |
1795 memset(&slice_param, 0, sizeof(slice_param)); | 1799 memset(&slice_param, 0, sizeof(slice_param)); |
1796 slice_param.slice_data_size = frame_hdr->frame_size; | 1800 slice_param.slice_data_size = frame_hdr->frame_size; |
1797 slice_param.slice_data_offset = 0; | 1801 slice_param.slice_data_offset = 0; |
1798 slice_param.slice_data_flag = VA_SLICE_DATA_FLAG_ALL; | 1802 slice_param.slice_data_flag = VA_SLICE_DATA_FLAG_ALL; |
1799 | 1803 |
1800 static_assert(arraysize(Vp9Segmentation::feature_enabled) == | 1804 static_assert(arraysize(Vp9SegmentationParams::feature_enabled) == |
1801 arraysize(slice_param.seg_param), | 1805 arraysize(slice_param.seg_param), |
1802 "seg_param array of incorrect size"); | 1806 "seg_param array of incorrect size"); |
1803 for (size_t i = 0; i < arraysize(slice_param.seg_param); ++i) { | 1807 for (size_t i = 0; i < arraysize(slice_param.seg_param); ++i) { |
1804 VASegmentParameterVP9& seg_param = slice_param.seg_param[i]; | 1808 VASegmentParameterVP9& seg_param = slice_param.seg_param[i]; |
1805 #define SEG_TO_SP_SF(a, b) seg_param.segment_flags.fields.a = b | 1809 #define SEG_TO_SP_SF(a, b) seg_param.segment_flags.fields.a = b |
1806 SEG_TO_SP_SF(segment_reference_enabled, | 1810 SEG_TO_SP_SF( |
1807 seg.FeatureEnabled(i, Vp9Segmentation::SEG_LVL_REF_FRAME)); | 1811 segment_reference_enabled, |
| 1812 seg.FeatureEnabled(i, Vp9SegmentationParams::SEG_LVL_REF_FRAME)); |
1808 SEG_TO_SP_SF(segment_reference, | 1813 SEG_TO_SP_SF(segment_reference, |
1809 seg.FeatureData(i, Vp9Segmentation::SEG_LVL_REF_FRAME)); | 1814 seg.FeatureData(i, Vp9SegmentationParams::SEG_LVL_REF_FRAME)); |
1810 SEG_TO_SP_SF(segment_reference_skipped, | 1815 SEG_TO_SP_SF(segment_reference_skipped, |
1811 seg.FeatureEnabled(i, Vp9Segmentation::SEG_LVL_SKIP)); | 1816 seg.FeatureEnabled(i, Vp9SegmentationParams::SEG_LVL_SKIP)); |
1812 #undef SEG_TO_SP_SF | 1817 #undef SEG_TO_SP_SF |
1813 | 1818 |
1814 ARRAY_MEMCPY_CHECKED(seg_param.filter_level, lf.lvl[i]); | 1819 ARRAY_MEMCPY_CHECKED(seg_param.filter_level, lf.lvl[i]); |
1815 | 1820 |
1816 seg_param.luma_dc_quant_scale = seg.y_dequant[i][0]; | 1821 seg_param.luma_dc_quant_scale = seg.y_dequant[i][0]; |
1817 seg_param.luma_ac_quant_scale = seg.y_dequant[i][1]; | 1822 seg_param.luma_ac_quant_scale = seg.y_dequant[i][1]; |
1818 seg_param.chroma_dc_quant_scale = seg.uv_dequant[i][0]; | 1823 seg_param.chroma_dc_quant_scale = seg.uv_dequant[i][0]; |
1819 seg_param.chroma_ac_quant_scale = seg.uv_dequant[i][1]; | 1824 seg_param.chroma_ac_quant_scale = seg.uv_dequant[i][1]; |
1820 } | 1825 } |
1821 | 1826 |
(...skipping 29 matching lines...) Expand all Loading... |
1851 return vaapi_pic->dec_surface(); | 1856 return vaapi_pic->dec_surface(); |
1852 } | 1857 } |
1853 | 1858 |
1854 // static | 1859 // static |
1855 VideoDecodeAccelerator::SupportedProfiles | 1860 VideoDecodeAccelerator::SupportedProfiles |
1856 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { | 1861 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { |
1857 return VaapiWrapper::GetSupportedDecodeProfiles(); | 1862 return VaapiWrapper::GetSupportedDecodeProfiles(); |
1858 } | 1863 } |
1859 | 1864 |
1860 } // namespace media | 1865 } // namespace media |
OLD | NEW |