Home | History | Annotate | Download | only in media
      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