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

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

Issue 2133993002: Parse VP9 compressed header (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reset curr_frame_info_ when Reset Created 4 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 unified diff | Download patch
« no previous file with comments | « media/filters/vp9_uncompressed_header_parser.cc ('k') | media/gpu/vp9_decoder.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 (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
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
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
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
OLDNEW
« no previous file with comments | « media/filters/vp9_uncompressed_header_parser.cc ('k') | media/gpu/vp9_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698