Chromium Code Reviews| 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 CONTENT_COMMON_GPU_MEDIA_H264_DECODER_H_ | 5 #ifndef CONTENT_COMMON_GPU_MEDIA_H264_DECODER_H_ |
| 6 #define CONTENT_COMMON_GPU_MEDIA_H264_DECODER_H_ | 6 #define CONTENT_COMMON_GPU_MEDIA_H264_DECODER_H_ |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 // Internal state of the decoder. | 122 // Internal state of the decoder. |
| 123 enum State { | 123 enum State { |
| 124 kNeedStreamMetadata, // After initialization, need an SPS. | 124 kNeedStreamMetadata, // After initialization, need an SPS. |
| 125 kDecoding, // Ready to decode from any point. | 125 kDecoding, // Ready to decode from any point. |
| 126 kAfterReset, // After Reset(), need a resume point. | 126 kAfterReset, // After Reset(), need a resume point. |
| 127 kError, // Error in decode, can't continue. | 127 kError, // Error in decode, can't continue. |
| 128 }; | 128 }; |
| 129 | 129 |
| 130 // Process H264 stream structures. | 130 // Process H264 stream structures. |
| 131 bool ProcessSPS(int sps_id, bool* need_new_buffers); | 131 bool ProcessSPS(int sps_id, bool* need_new_buffers); |
| 132 bool ProcessPPS(int pps_id); | 132 // Process current slice header to discover if we need to start a new picture, |
| 133 bool PreprocessSlice(media::H264SliceHeader* slice_hdr); | 133 // finishing up the current one. |
| 134 bool ProcessSlice(media::H264SliceHeader* slice_hdr); | 134 bool PreprocessCurrentSlice(); |
| 135 // Process current slice as a slice of the current picture. | |
| 136 bool ProcessCurrentSlice(); | |
| 137 | |
| 138 // Return true if we need to start a new picture. | |
| 139 bool IsNewPrimaryCodedPicture(const media::H264SliceHeader* slice_hdr); | |
|
kcwu
2015/10/02 13:06:03
const method
Pawel Osciak
2015/10/09 06:39:25
Done.
| |
| 135 | 140 |
| 136 // Initialize the current picture according to data in |slice_hdr|. | 141 // Initialize the current picture according to data in |slice_hdr|. |
| 137 bool InitCurrPicture(media::H264SliceHeader* slice_hdr); | 142 bool InitCurrPicture(const media::H264SliceHeader* slice_hdr); |
| 138 | 143 |
| 139 // Calculate picture order counts for the new picture | 144 // Initialize |pic| as a "non-existing" picture (see spec) with |frame_num|, |
| 140 // on initialization of a new frame (see spec). | 145 // to be used for frame gap concealment. |
| 141 bool CalculatePicOrderCounts(media::H264SliceHeader* slice_hdr); | 146 bool InitNonexistingPicture(scoped_refptr<H264Picture> pic, int frame_num); |
| 142 | 147 |
| 143 // Update PicNum values in pictures stored in DPB on creation of new | 148 // Calculate picture order counts for |pic| on initialization |
| 144 // frame (see spec). | 149 // of a new frame (see spec). |
| 145 void UpdatePicNums(); | 150 bool CalculatePicOrderCounts(scoped_refptr<H264Picture> pic); |
| 151 | |
| 152 // Update PicNum values in pictures stored in DPB on creation of | |
| 153 // a picture with |frame_num|. | |
| 154 void UpdatePicNums(int frame_num); | |
| 146 | 155 |
| 147 bool UpdateMaxNumReorderFrames(const media::H264SPS* sps); | 156 bool UpdateMaxNumReorderFrames(const media::H264SPS* sps); |
| 148 | 157 |
| 149 // Prepare reference picture lists for the current frame. | 158 // Prepare reference picture lists for the current frame. |
| 150 void PrepareRefPicLists(media::H264SliceHeader* slice_hdr); | 159 void PrepareRefPicLists(const media::H264SliceHeader* slice_hdr); |
| 151 // Prepare reference picture lists for the given slice. | 160 // Prepare reference picture lists for the given slice. |
| 152 bool ModifyReferencePicLists(media::H264SliceHeader* slice_hdr, | 161 bool ModifyReferencePicLists(const media::H264SliceHeader* slice_hdr, |
| 153 H264Picture::Vector* ref_pic_list0, | 162 H264Picture::Vector* ref_pic_list0, |
| 154 H264Picture::Vector* ref_pic_list1); | 163 H264Picture::Vector* ref_pic_list1); |
| 155 | 164 |
| 156 // Construct initial reference picture lists for use in decoding of | 165 // Construct initial reference picture lists for use in decoding of |
| 157 // P and B pictures (see 8.2.4 in spec). | 166 // P and B pictures (see 8.2.4 in spec). |
| 158 void ConstructReferencePicListsP(media::H264SliceHeader* slice_hdr); | 167 void ConstructReferencePicListsP(const media::H264SliceHeader* slice_hdr); |
| 159 void ConstructReferencePicListsB(media::H264SliceHeader* slice_hdr); | 168 void ConstructReferencePicListsB(const media::H264SliceHeader* slice_hdr); |
| 160 | 169 |
| 161 // Helper functions for reference list construction, per spec. | 170 // Helper functions for reference list construction, per spec. |
| 162 int PicNumF(const scoped_refptr<H264Picture>& pic); | 171 int PicNumF(const scoped_refptr<H264Picture>& pic); |
| 163 int LongTermPicNumF(const scoped_refptr<H264Picture>& pic); | 172 int LongTermPicNumF(const scoped_refptr<H264Picture>& pic); |
| 164 | 173 |
| 165 // Perform the reference picture lists' modification (reordering), as | 174 // Perform the reference picture lists' modification (reordering), as |
| 166 // specified in spec (8.2.4). | 175 // specified in spec (8.2.4). |
| 167 // | 176 // |
| 168 // |list| indicates list number and should be either 0 or 1. | 177 // |list| indicates list number and should be either 0 or 1. |
| 169 bool ModifyReferencePicList(media::H264SliceHeader* slice_hdr, | 178 bool ModifyReferencePicList(const media::H264SliceHeader* slice_hdr, |
| 170 int list, | 179 int list, |
| 171 H264Picture::Vector* ref_pic_listx); | 180 H264Picture::Vector* ref_pic_listx); |
| 172 | 181 |
| 173 // Perform reference picture memory management operations (marking/unmarking | 182 // Perform reference picture memory management operations (marking/unmarking |
| 174 // of reference pictures, long term picture management, discarding, etc.). | 183 // of reference pictures, long term picture management, discarding, etc.). |
| 175 // See 8.2.5 in spec. | 184 // See 8.2.5 in spec. |
| 176 bool HandleMemoryManagementOps(); | 185 bool HandleMemoryManagementOps(scoped_refptr<H264Picture> pic); |
| 177 void ReferencePictureMarking(); | 186 bool ReferencePictureMarking(scoped_refptr<H264Picture> pic); |
| 187 bool SlidingWindowPictureMarking(); | |
| 188 | |
| 189 // Handle a gap in frame_num in the stream up to |frame_num|, by creating | |
| 190 // "non-existing" pictures (see spec). | |
| 191 bool HandleFrameNumGap(int frame_num); | |
| 178 | 192 |
| 179 // Start processing a new frame. | 193 // Start processing a new frame. |
| 180 bool StartNewFrame(media::H264SliceHeader* slice_hdr); | 194 bool StartNewFrame(const media::H264SliceHeader* slice_hdr); |
| 181 | 195 |
| 182 // All data for a frame received, process it and decode. | 196 // All data for a frame received, process it and decode. |
| 183 bool FinishPrevFrameIfPresent(); | 197 bool FinishPrevFrameIfPresent(); |
| 184 | 198 |
| 185 // Called after decoding, performs all operations to be done after decoding, | 199 // Called after we are done processing |pic|. Performs all operations to be |
| 186 // including DPB management, reference picture marking and memory management | 200 // done after decoding, including DPB management, reference picture marking |
| 187 // operations. | 201 // and memory management operations. |
| 188 // This will also output a picture if one is ready for output. | 202 // This will also output pictures if any have become ready to be outputted |
| 189 bool FinishPicture(); | 203 // after processing |pic|. |
| 204 bool FinishPicture(scoped_refptr<H264Picture> pic); | |
| 190 | 205 |
| 191 // Clear DPB contents and remove all surfaces in DPB from *in_use_ list. | 206 // Clear DPB contents and remove all surfaces in DPB from *in_use_ list. |
| 192 // Cleared pictures will be made available for decode, unless they are | 207 // Cleared pictures will be made available for decode, unless they are |
| 193 // at client waiting to be displayed. | 208 // at client waiting to be displayed. |
| 194 void ClearDPB(); | 209 void ClearDPB(); |
| 195 | 210 |
| 196 // Commits all pending data for HW decoder and starts HW decoder. | 211 // Commits all pending data for HW decoder and starts HW decoder. |
| 197 bool DecodePicture(); | 212 bool DecodePicture(); |
| 198 | 213 |
| 199 // Notifies client that a picture is ready for output. | 214 // Notifies client that a picture is ready for output. |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 213 | 228 |
| 214 // Picture currently being processed/decoded. | 229 // Picture currently being processed/decoded. |
| 215 scoped_refptr<H264Picture> curr_pic_; | 230 scoped_refptr<H264Picture> curr_pic_; |
| 216 | 231 |
| 217 // Reference picture lists, constructed for each frame. | 232 // Reference picture lists, constructed for each frame. |
| 218 H264Picture::Vector ref_pic_list_p0_; | 233 H264Picture::Vector ref_pic_list_p0_; |
| 219 H264Picture::Vector ref_pic_list_b0_; | 234 H264Picture::Vector ref_pic_list_b0_; |
| 220 H264Picture::Vector ref_pic_list_b1_; | 235 H264Picture::Vector ref_pic_list_b1_; |
| 221 | 236 |
| 222 // Global state values, needed in decoding. See spec. | 237 // Global state values, needed in decoding. See spec. |
| 223 int max_pic_order_cnt_lsb_; | |
| 224 int max_frame_num_; | 238 int max_frame_num_; |
| 225 int max_pic_num_; | 239 int max_pic_num_; |
| 226 int max_long_term_frame_idx_; | 240 int max_long_term_frame_idx_; |
| 227 size_t max_num_reorder_frames_; | 241 size_t max_num_reorder_frames_; |
| 228 | 242 |
| 229 int frame_num_; | |
| 230 int prev_frame_num_; | 243 int prev_frame_num_; |
| 244 int prev_ref_frame_num_; | |
| 231 int prev_frame_num_offset_; | 245 int prev_frame_num_offset_; |
| 232 bool prev_has_memmgmnt5_; | 246 bool prev_has_memmgmnt5_; |
| 233 | 247 |
| 234 // Values related to previously decoded reference picture. | 248 // Values related to previously decoded reference picture. |
| 235 bool prev_ref_has_memmgmnt5_; | 249 bool prev_ref_has_memmgmnt5_; |
| 236 int prev_ref_top_field_order_cnt_; | 250 int prev_ref_top_field_order_cnt_; |
| 237 int prev_ref_pic_order_cnt_msb_; | 251 int prev_ref_pic_order_cnt_msb_; |
| 238 int prev_ref_pic_order_cnt_lsb_; | 252 int prev_ref_pic_order_cnt_lsb_; |
| 239 H264Picture::Field prev_ref_field_; | 253 H264Picture::Field prev_ref_field_; |
| 240 | 254 |
| 241 // Currently active SPS and PPS. | 255 // Currently active SPS and PPS. |
| 242 int curr_sps_id_; | 256 int curr_sps_id_; |
| 243 int curr_pps_id_; | |
| 244 | 257 |
| 245 // Current NALU and slice header being processed. | 258 // Current NALU and slice header being processed. |
| 246 scoped_ptr<media::H264NALU> curr_nalu_; | 259 scoped_ptr<media::H264NALU> curr_nalu_; |
| 247 scoped_ptr<media::H264SliceHeader> curr_slice_hdr_; | 260 scoped_ptr<media::H264SliceHeader> curr_slice_hdr_; |
| 248 | 261 |
| 249 // Output picture size. | 262 // Output picture size. |
| 250 gfx::Size pic_size_; | 263 gfx::Size pic_size_; |
| 251 | 264 |
| 252 // PicOrderCount of the previously outputted frame. | 265 // PicOrderCount of the previously outputted frame. |
| 253 int last_output_poc_; | 266 int last_output_poc_; |
| 254 | 267 |
| 255 H264Accelerator* accelerator_; | 268 H264Accelerator* accelerator_; |
| 256 | 269 |
| 257 DISALLOW_COPY_AND_ASSIGN(H264Decoder); | 270 DISALLOW_COPY_AND_ASSIGN(H264Decoder); |
| 258 }; | 271 }; |
| 259 | 272 |
| 260 } // namespace content | 273 } // namespace content |
| 261 | 274 |
| 262 #endif // CONTENT_COMMON_GPU_MEDIA_H264_DECODER_H_ | 275 #endif // CONTENT_COMMON_GPU_MEDIA_H264_DECODER_H_ |
| OLD | NEW |