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 3 // found in the LICENSE file. 4 // 5 // This file contains an implementation of an H.264 Decoded Picture Buffer 6 // used in H264 decoders. 7 8 #ifndef CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 9 #define CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 10 11 #include <vector> 12 13 #include "base/basictypes.h" 14 #include "base/memory/scoped_vector.h" 15 #include "content/common/gpu/media/h264_parser.h" 16 17 namespace content { 18 19 // A picture (a frame or a field) in the H.264 spec sense. 20 // See spec at http://www.itu.int/rec/T-REC-H.264 21 struct H264Picture { 22 enum Field { 23 FIELD_NONE, 24 FIELD_TOP, 25 FIELD_BOTTOM, 26 }; 27 28 // Values calculated per H.264 specification or taken from slice header. 29 // See spec for more details on each (some names have been converted from 30 // CamelCase in spec to Chromium-style names). 31 int top_field_order_cnt; 32 int bottom_field_order_cnt; 33 int pic_order_cnt; 34 int pic_order_cnt_msb; 35 int pic_order_cnt_lsb; 36 37 int pic_num; 38 int long_term_pic_num; 39 int frame_num; // from slice header 40 int frame_num_offset; 41 int frame_num_wrap; 42 int long_term_frame_idx; 43 44 bool idr; // IDR picture? 45 bool ref; // reference picture? 46 bool long_term; // long term reference picture? 47 bool outputted; 48 // Does memory management op 5 needs to be executed after this 49 // picture has finished decoding? 50 bool mem_mgmt_5; 51 52 Field field; 53 54 // Values from slice_hdr to be used during reference marking and 55 // memory management after finishing this picture. 56 bool long_term_reference_flag; 57 bool adaptive_ref_pic_marking_mode_flag; 58 H264DecRefPicMarking ref_pic_marking[H264SliceHeader::kRefListSize]; 59 60 typedef std::vector<H264Picture*> PtrVector; 61 }; 62 63 // DPB - Decoded Picture Buffer. 64 // Stores decoded pictures that will be used for future display 65 // and/or reference. 66 class H264DPB { 67 public: 68 H264DPB(); 69 ~H264DPB(); 70 71 void set_max_num_pics(size_t max_num_pics); 72 size_t max_num_pics() { return max_num_pics_; } 73 74 // Remove unused (not reference and already outputted) pictures from DPB 75 // and free it. 76 void DeleteUnused(); 77 78 // Remove a picture by its pic_order_cnt and free it. 79 void DeleteByPOC(int poc); 80 81 // Clear DPB. 82 void Clear(); 83 84 // Store picture in DPB. DPB takes ownership of its resources. 85 void StorePic(H264Picture* pic); 86 87 // Return the number of reference pictures in DPB. 88 int CountRefPics(); 89 90 // Mark all pictures in DPB as unused for reference. 91 void MarkAllUnusedForRef(); 92 93 // Return a short-term reference picture by its pic_num. 94 H264Picture* GetShortRefPicByPicNum(int pic_num); 95 96 // Return a long-term reference picture by its long_term_pic_num. 97 H264Picture* GetLongRefPicByLongTermPicNum(int pic_num); 98 99 // Return the short reference picture with lowest frame_num. Used for sliding 100 // window memory management. 101 H264Picture* GetLowestFrameNumWrapShortRefPic(); 102 103 // Append all pictures that have not been outputted yet to the passed |out| 104 // vector, sorted by lowest pic_order_cnt (in output order). 105 void GetNotOutputtedPicsAppending(H264Picture::PtrVector& out); 106 107 // Append all short term reference pictures to the passed |out| vector. 108 void GetShortTermRefPicsAppending(H264Picture::PtrVector& out); 109 110 // Append all long term reference pictures to the passed |out| vector. 111 void GetLongTermRefPicsAppending(H264Picture::PtrVector& out); 112 113 // Iterators for direct access to DPB contents. 114 // Will be invalidated after any of Remove* calls. 115 typedef ScopedVector<H264Picture> Pictures; 116 Pictures::iterator begin() { return pics_.begin(); } 117 Pictures::iterator end() { return pics_.end(); } 118 Pictures::reverse_iterator rbegin() { return pics_.rbegin(); } 119 Pictures::reverse_iterator rend() { return pics_.rend(); } 120 121 size_t size() const { return pics_.size(); } 122 bool IsFull() const { return pics_.size() == max_num_pics_; } 123 124 // Per H264 spec, increase to 32 if interlaced video is supported. 125 enum { kDPBMaxSize = 16, }; 126 127 private: 128 Pictures pics_; 129 size_t max_num_pics_; 130 131 DISALLOW_COPY_AND_ASSIGN(H264DPB); 132 }; 133 134 } // namespace content 135 136 #endif // CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 137