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