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 "media/filters/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 media::H264DecRefPicMarking 59 ref_pic_marking[media::H264SliceHeader::kRefListSize]; 60 61 typedef std::vector<H264Picture*> PtrVector; 62 }; 63 64 // DPB - Decoded Picture Buffer. 65 // Stores decoded pictures that will be used for future display 66 // and/or reference. 67 class H264DPB { 68 public: 69 H264DPB(); 70 ~H264DPB(); 71 72 void set_max_num_pics(size_t max_num_pics); max_num_pics()73 size_t max_num_pics() { return max_num_pics_; } 74 75 // Remove unused (not reference and already outputted) pictures from DPB 76 // and free it. 77 void DeleteUnused(); 78 79 // Remove a picture by its pic_order_cnt and free it. 80 void DeleteByPOC(int poc); 81 82 // Clear DPB. 83 void Clear(); 84 85 // Store picture in DPB. DPB takes ownership of its resources. 86 void StorePic(H264Picture* pic); 87 88 // Return the number of reference pictures in DPB. 89 int CountRefPics(); 90 91 // Mark all pictures in DPB as unused for reference. 92 void MarkAllUnusedForRef(); 93 94 // Return a short-term reference picture by its pic_num. 95 H264Picture* GetShortRefPicByPicNum(int pic_num); 96 97 // Return a long-term reference picture by its long_term_pic_num. 98 H264Picture* GetLongRefPicByLongTermPicNum(int pic_num); 99 100 // Return the short reference picture with lowest frame_num. Used for sliding 101 // window memory management. 102 H264Picture* GetLowestFrameNumWrapShortRefPic(); 103 104 // Append all pictures that have not been outputted yet to the passed |out| 105 // vector, sorted by lowest pic_order_cnt (in output order). 106 void GetNotOutputtedPicsAppending(H264Picture::PtrVector& out); 107 108 // Append all short term reference pictures to the passed |out| vector. 109 void GetShortTermRefPicsAppending(H264Picture::PtrVector& out); 110 111 // Append all long term reference pictures to the passed |out| vector. 112 void GetLongTermRefPicsAppending(H264Picture::PtrVector& out); 113 114 // Iterators for direct access to DPB contents. 115 // Will be invalidated after any of Remove* calls. 116 typedef ScopedVector<H264Picture> Pictures; begin()117 Pictures::iterator begin() { return pics_.begin(); } end()118 Pictures::iterator end() { return pics_.end(); } rbegin()119 Pictures::reverse_iterator rbegin() { return pics_.rbegin(); } rend()120 Pictures::reverse_iterator rend() { return pics_.rend(); } 121 size()122 size_t size() const { return pics_.size(); } IsFull()123 bool IsFull() const { return pics_.size() == max_num_pics_; } 124 125 // Per H264 spec, increase to 32 if interlaced video is supported. 126 enum { kDPBMaxSize = 16, }; 127 128 private: 129 Pictures pics_; 130 size_t max_num_pics_; 131 132 DISALLOW_COPY_AND_ASSIGN(H264DPB); 133 }; 134 135 } // namespace content 136 137 #endif // CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 138