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