h264_dpb.h revision 116680a4aac90f2aa7413d9095a592090648e557
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"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/filters/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)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  media::H264SliceHeader::Type type;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool idr;  // IDR picture?
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ref;  // reference picture?
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool long_term;  // long term reference picture?
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool outputted;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does memory management op 5 needs to be executed after this
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // picture has finished decoding?
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool mem_mgmt_5;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Field field;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values from slice_hdr to be used during reference marking and
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // memory management after finishing this picture.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool long_term_reference_flag;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool adaptive_ref_pic_marking_mode_flag;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  media::H264DecRefPicMarking
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ref_pic_marking[media::H264SliceHeader::kRefListSize];
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<H264Picture*> PtrVector;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DPB - Decoded Picture Buffer.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores decoded pictures that will be used for future display
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and/or reference.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class H264DPB {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264DPB();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~H264DPB();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_max_num_pics(size_t max_num_pics);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t max_num_pics() { return max_num_pics_; }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Remove unused (not reference and already outputted) pictures from DPB
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // and free it.
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DeleteUnused();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Remove a picture by its pic_order_cnt and free it.
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DeleteByPOC(int poc);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear DPB.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store picture in DPB. DPB takes ownership of its resources.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StorePic(H264Picture* pic);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the number of reference pictures in DPB.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CountRefPics();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark all pictures in DPB as unused for reference.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkAllUnusedForRef();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a short-term reference picture by its pic_num.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* GetShortRefPicByPicNum(int pic_num);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a long-term reference picture by its long_term_pic_num.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* GetLongRefPicByLongTermPicNum(int pic_num);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the short reference picture with lowest frame_num. Used for sliding
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window memory management.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* GetLowestFrameNumWrapShortRefPic();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append all pictures that have not been outputted yet to the passed |out|
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vector, sorted by lowest pic_order_cnt (in output order).
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNotOutputtedPicsAppending(H264Picture::PtrVector& out);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append all short term reference pictures to the passed |out| vector.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetShortTermRefPicsAppending(H264Picture::PtrVector& out);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append all long term reference pictures to the passed |out| vector.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetLongTermRefPicsAppending(H264Picture::PtrVector& out);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterators for direct access to DPB contents.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Will be invalidated after any of Remove* calls.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ScopedVector<H264Picture> Pictures;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::iterator begin() { return pics_.begin(); }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::iterator end() { return pics_.end(); }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::reverse_iterator rbegin() { return pics_.rbegin(); }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures::reverse_iterator rend() { return pics_.rend(); }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return pics_.size(); }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsFull() const { return pics_.size() == max_num_pics_; }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per H264 spec, increase to 32 if interlaced video is supported.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum { kDPBMaxSize = 16, };
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pictures pics_;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t max_num_pics_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(H264DPB);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_
139