h264_dpb.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains an implementation of an H.264 Decoded Picture Buffer
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used in H264 decoders.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/media/h264_parser.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A picture (a frame or a field) in the H.264 spec sense.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See spec at http://www.itu.int/rec/T-REC-H.264
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct H264Picture {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Field {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FIELD_NONE,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FIELD_TOP,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FIELD_BOTTOM,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values calculated per H.264 specification or taken from slice header.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See spec for more details on each (some names have been converted from
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CamelCase in spec to Chromium-style names).
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int top_field_order_cnt;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bottom_field_order_cnt;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pic_order_cnt;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pic_order_cnt_msb;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pic_order_cnt_lsb;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pic_num;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int long_term_pic_num;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int frame_num;  // from slice header
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int frame_num_offset;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int frame_num_wrap;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int long_term_frame_idx;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool idr;  // IDR picture?
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ref;  // reference picture?
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool long_term;  // long term reference picture?
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool outputted;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does memory management op 5 needs to be executed after this
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // picture has finished decoding?
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool mem_mgmt_5;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Field field;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values from slice_hdr to be used during reference marking and
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // memory management after finishing this picture.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool long_term_reference_flag;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool adaptive_ref_pic_marking_mode_flag;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264DecRefPicMarking ref_pic_marking[H264SliceHeader::kRefListSize];
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<H264Picture*> PtrVector;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DPB - Decoded Picture Buffer.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores decoded pictures that will be used for future display
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and/or reference.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class H264DPB {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264DPB();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~H264DPB();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_max_num_pics(size_t max_num_pics);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t max_num_pics() { return max_num_pics_; }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove unused (not reference and already outputted) pictures from DPB.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveUnused();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove a picture by its pic_order_cnt.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveByPOC(int poc);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear DPB.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store picture in DPB. DPB takes ownership of its resources.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StorePic(H264Picture* pic);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the number of reference pictures in DPB.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CountRefPics();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark all pictures in DPB as unused for reference.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkAllUnusedForRef();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a short-term reference picture by its pic_num.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* GetShortRefPicByPicNum(int pic_num);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a long-term reference picture by its long_term_pic_num.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* GetLongRefPicByLongTermPicNum(int pic_num);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the short reference picture with lowest frame_num. Used for sliding
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window memory management.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* GetLowestFrameNumWrapShortRefPic();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append all pictures that have not been outputted yet to the passed |out|
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vector, sorted by lowest pic_order_cnt (in output order).
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNotOutputtedPicsAppending(H264Picture::PtrVector& out);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append all short term reference pictures to the passed |out| vector.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetShortTermRefPicsAppending(H264Picture::PtrVector& out);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append all long term reference pictures to the passed |out| vector.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetLongTermRefPicsAppending(H264Picture::PtrVector& out);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterators for direct access to DPB contents.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Will be invalidated after any of Remove* calls.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ScopedVector<H264Picture> Pictures;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::iterator begin() { return pics_.begin(); }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::iterator end() { return pics_.end(); }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::reverse_iterator rbegin() { return pics_.rbegin(); }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::reverse_iterator rend() { return pics_.rend(); }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return pics_.size(); }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsFull() const { return pics_.size() == max_num_pics_; }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per H264 spec, increase to 32 if interlaced video is supported.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum { kDPBMaxSize = 16, };
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures pics_;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t max_num_pics_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(H264DPB);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_
136