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 #ifndef MEDIA_GPU_H264_DECODER_H_ | 5 #ifndef MEDIA_GPU_H264_DECODER_H_ |
6 #define MEDIA_GPU_H264_DECODER_H_ | 6 #define MEDIA_GPU_H264_DECODER_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 ~H264Decoder() override; | 104 ~H264Decoder() override; |
105 | 105 |
106 // AcceleratedVideoDecoder implementation. | 106 // AcceleratedVideoDecoder implementation. |
107 bool Flush() override WARN_UNUSED_RESULT; | 107 bool Flush() override WARN_UNUSED_RESULT; |
108 void Reset() override; | 108 void Reset() override; |
109 void SetStream(const uint8_t* ptr, size_t size) override; | 109 void SetStream(const uint8_t* ptr, size_t size) override; |
110 DecodeResult Decode() override WARN_UNUSED_RESULT; | 110 DecodeResult Decode() override WARN_UNUSED_RESULT; |
111 gfx::Size GetPicSize() const override; | 111 gfx::Size GetPicSize() const override; |
112 size_t GetRequiredNumOfPictures() const override; | 112 size_t GetRequiredNumOfPictures() const override; |
113 | 113 |
114 // Return true if we need to start a new picture. | |
115 static bool IsNewPrimaryCodedPicture(scoped_refptr<H264Picture> curr_pic, | |
116 int curr_pps_id, | |
117 const H264SPS* sps, | |
118 const H264SliceHeader& slice_hdr); | |
119 | |
120 // Create a H264Picture from given params. Return nullptr when there is an | |
121 // error. | |
122 static scoped_refptr<H264Picture> CreateH264PictureFromSliceHeader( | |
123 const H264SPS* sps, | |
124 const H264SliceHeader& slice_hdr); | |
125 | |
126 private: | 114 private: |
127 // We need to keep at most kDPBMaxSize pictures in DPB for | 115 // We need to keep at most kDPBMaxSize pictures in DPB for |
128 // reference/to display later and an additional one for the one currently | 116 // reference/to display later and an additional one for the one currently |
129 // being decoded. We also ask for some additional ones since VDA needs | 117 // being decoded. We also ask for some additional ones since VDA needs |
130 // to accumulate a few ready-to-output pictures before it actually starts | 118 // to accumulate a few ready-to-output pictures before it actually starts |
131 // displaying and giving them back. +2 instead of +1 because of subjective | 119 // displaying and giving them back. +2 instead of +1 because of subjective |
132 // smoothness improvement during testing. | 120 // smoothness improvement during testing. |
133 enum { | 121 enum { |
134 kPicsInPipeline = limits::kMaxVideoFrames + 2, | 122 kPicsInPipeline = limits::kMaxVideoFrames + 2, |
135 kMaxNumReqPictures = H264DPB::kDPBMaxSize + kPicsInPipeline, | 123 kMaxNumReqPictures = H264DPB::kDPBMaxSize + kPicsInPipeline, |
136 }; | 124 }; |
137 | 125 |
138 // Internal state of the decoder. | 126 // Internal state of the decoder. |
139 enum State { | 127 enum State { |
140 kNeedStreamMetadata, // After initialization, need an SPS. | 128 kNeedStreamMetadata, // After initialization, need an SPS. |
141 kDecoding, // Ready to decode from any point. | 129 kDecoding, // Ready to decode from any point. |
142 kAfterReset, // After Reset(), need a resume point. | 130 kAfterReset, // After Reset(), need a resume point. |
143 kError, // Error in decode, can't continue. | 131 kError, // Error in decode, can't continue. |
144 }; | 132 }; |
145 | 133 |
146 // Process H264 stream structures. | 134 // Process H264 stream structures. |
147 bool ProcessSPS(int sps_id, bool* need_new_buffers); | 135 bool ProcessSPS(int sps_id, bool* need_new_buffers); |
148 // Process current slice header to discover if we need to start a new picture, | 136 // Process current slice header to discover if we need to start a new picture, |
149 // finishing up the current one. | 137 // finishing up the current one. |
150 bool PreprocessCurrentSlice(); | 138 bool PreprocessCurrentSlice(); |
151 // Process current slice as a slice of the current picture. | 139 // Process current slice as a slice of the current picture. |
152 bool ProcessCurrentSlice(); | 140 bool ProcessCurrentSlice(); |
153 | 141 |
| 142 // Return true if we need to start a new picture. |
| 143 bool IsNewPrimaryCodedPicture(const H264SliceHeader* slice_hdr) const; |
| 144 |
154 // Initialize the current picture according to data in |slice_hdr|. | 145 // Initialize the current picture according to data in |slice_hdr|. |
155 bool InitCurrPicture(const H264SliceHeader* slice_hdr); | 146 bool InitCurrPicture(const H264SliceHeader* slice_hdr); |
156 | 147 |
157 // Initialize |pic| as a "non-existing" picture (see spec) with |frame_num|, | 148 // Initialize |pic| as a "non-existing" picture (see spec) with |frame_num|, |
158 // to be used for frame gap concealment. | 149 // to be used for frame gap concealment. |
159 bool InitNonexistingPicture(scoped_refptr<H264Picture> pic, int frame_num); | 150 bool InitNonexistingPicture(scoped_refptr<H264Picture> pic, int frame_num); |
160 | 151 |
161 // Calculate picture order counts for |pic| on initialization | 152 // Calculate picture order counts for |pic| on initialization |
162 // of a new frame (see spec). | 153 // of a new frame (see spec). |
163 bool CalculatePicOrderCounts(scoped_refptr<H264Picture> pic); | 154 bool CalculatePicOrderCounts(scoped_refptr<H264Picture> pic); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 int last_output_poc_; | 271 int last_output_poc_; |
281 | 272 |
282 H264Accelerator* accelerator_; | 273 H264Accelerator* accelerator_; |
283 | 274 |
284 DISALLOW_COPY_AND_ASSIGN(H264Decoder); | 275 DISALLOW_COPY_AND_ASSIGN(H264Decoder); |
285 }; | 276 }; |
286 | 277 |
287 } // namespace media | 278 } // namespace media |
288 | 279 |
289 #endif // MEDIA_GPU_H264_DECODER_H_ | 280 #endif // MEDIA_GPU_H264_DECODER_H_ |
OLD | NEW |