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)#include <algorithm>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/media/h264_dpb.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)H264DPB::H264DPB() : max_num_pics_(0) {}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264DPB::~H264DPB() {}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264DPB::Clear() {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pics_.clear();
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void H264DPB::set_max_num_pics(size_t max_num_pics) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_LE(max_num_pics, kDPBMaxSize);
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  max_num_pics_ = max_num_pics;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pics_.size() > max_num_pics_)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pics_.resize(max_num_pics_);
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void H264DPB::DeleteByPOC(int poc) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (Pictures::iterator it = pics_.begin(); it != pics_.end(); ++it) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*it)->pic_order_cnt == poc) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pics_.erase(it);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Missing POC: " << poc;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void H264DPB::DeleteUnused() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (Pictures::iterator it = pics_.begin(); it != pics_.end(); ) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*it)->outputted && !(*it)->ref)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it = pics_.erase(it);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++it;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264DPB::StorePic(H264Picture* pic) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_LT(pics_.size(), max_num_pics_);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(3) << "Adding PicNum: " << pic->pic_num << " ref: " << (int)pic->ref
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << " longterm: " << (int)pic->long_term << " to DPB";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pics_.push_back(pic);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int H264DPB::CountRefPics() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ret = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pics_[i]->ref)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++ret;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264DPB::MarkAllUnusedForRef() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pics_[i]->ref = false;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Picture* H264DPB::GetShortRefPicByPicNum(int pic_num) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    H264Picture* pic = pics_[i];
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pic->ref && !pic->long_term && pic->pic_num == pic_num)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pic;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Missing short ref pic num: " << pic_num;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Picture* H264DPB::GetLongRefPicByLongTermPicNum(int pic_num) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    H264Picture* pic = pics_[i];
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pic->ref && pic->long_term && pic->long_term_pic_num == pic_num)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pic;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Missing long term pic num: " << pic_num;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264Picture* H264DPB::GetLowestFrameNumWrapShortRefPic() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264Picture* ret = NULL;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    H264Picture* pic = pics_[i];
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pic->ref && !pic->long_term &&
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (!ret || pic->frame_num_wrap < ret->frame_num_wrap))
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = pic;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264DPB::GetNotOutputtedPicsAppending(H264Picture::PtrVector& out) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    H264Picture* pic = pics_[i];
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pic->outputted)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out.push_back(pic);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264DPB::GetShortTermRefPicsAppending(H264Picture::PtrVector& out) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    H264Picture* pic = pics_[i];
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pic->ref && !pic->long_term)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out.push_back(pic);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void H264DPB::GetLongTermRefPicsAppending(H264Picture::PtrVector& out) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pics_.size(); ++i) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    H264Picture* pic = pics_[i];
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pic->ref && pic->long_term)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      out.push_back(pic);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
125