| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_GPU_H265_DPB_H_ |
| #define MEDIA_GPU_H265_DPB_H_ |
| |
| #include <vector> |
| |
| #include "base/memory/ref_counted.h" |
| #include "media/base/video_color_space.h" |
| #include "media/gpu/codec_picture.h" |
| #include "media/gpu/media_gpu_export.h" |
| |
| namespace media { |
| |
| class VaapiH265Picture; |
| |
| // A picture (a frame or a field) in the H.265 spec sense. |
| // See spec at http://www.itu.int/rec/T-REC-H.265 |
| class MEDIA_GPU_EXPORT H265Picture : public CodecPicture { |
| public: |
| using Vector = std::vector<scoped_refptr<H265Picture>>; |
| |
| H265Picture(); |
| |
| H265Picture(const H265Picture&) = delete; |
| H265Picture& operator=(const H265Picture&) = delete; |
| |
| virtual VaapiH265Picture* AsVaapiH265Picture(); |
| |
| enum ReferenceType { |
| kUnused = 0, |
| kShortTermCurrBefore = 1, |
| kShortTermCurrAfter = 2, |
| kShortTermFoll = 3, |
| kLongTermCurr = 4, |
| kLongTermFoll = 5, |
| }; |
| |
| static std::string GetReferenceName(ReferenceType ref) { |
| if (ref == kUnused) |
| return "Unused"; |
| else if (ref == kLongTermCurr || ref == kLongTermFoll) |
| return "LongTerm"; |
| else |
| return "ShortTerm"; |
| } |
| |
| bool IsLongTermRef() const { |
| return ref_ == kLongTermCurr || ref_ == kLongTermFoll; |
| } |
| bool IsShortTermRef() const { |
| return ref_ == kShortTermCurrBefore || ref_ == kShortTermCurrAfter || |
| ref_ == kShortTermFoll; |
| } |
| bool IsUnused() const { return ref_ == kUnused; } |
| |
| // Values calculated per H.265 specification or taken from slice header. |
| // See spec for more details on each (some names have been converted from |
| // CamelCase in spec to Chromium-style names). |
| int nal_unit_type_; |
| bool no_rasl_output_flag_{false}; |
| bool no_output_of_prior_pics_flag_{false}; |
| bool pic_output_flag_{false}; |
| bool valid_for_prev_tid0_pic_{false}; |
| int slice_pic_order_cnt_lsb_{0}; |
| int pic_order_cnt_msb_{0}; |
| int pic_order_cnt_val_{0}; |
| |
| // Our own state variables. |
| bool irap_pic_; |
| bool first_picture_; |
| bool processed_{false}; |
| |
| ReferenceType ref_{kUnused}; |
| |
| bool outputted_{false}; |
| |
| protected: |
| ~H265Picture() override; |
| }; |
| |
| // DPB - Decoded Picture Buffer. |
| // Stores decoded pictures that will be used for future display and/or |
| // reference. |
| class H265DPB { |
| public: |
| H265DPB(); |
| |
| H265DPB(const H265DPB&) = delete; |
| H265DPB& operator=(const H265DPB&) = delete; |
| |
| ~H265DPB(); |
| |
| void set_max_num_pics(size_t max_num_pics); |
| size_t max_num_pics() const { return max_num_pics_; } |
| |
| // Removes all entries from the DPB. |
| void Clear(); |
| |
| // Stores |pic| in the DPB. If |used_for_long_term| is true it'll be marked as |
| // used for long term reference, otherwise it'll be marked as used for short |
| // term reference. |
| void StorePicture(scoped_refptr<H265Picture> pic, |
| H265Picture::ReferenceType ref); |
| |
| // Mark all pictures in DPB as unused for reference. |
| void MarkAllUnusedForReference(); |
| |
| // Removes all pictures from the DPB that do not have |pic_output_flag_| set |
| // and are marked Unused for reference. |
| void DeleteUnused(); |
| |
| // Returns the number of pictures in the DPB that are marked for reference. |
| int GetReferencePicCount(); |
| |
| // Returns a picture in the DPB which has a POC equal to |poc| and marks it |
| // with |ref| reference type. If not found, returns nullptr. |
| scoped_refptr<H265Picture> GetPicByPocAndMark(int poc, |
| H265Picture::ReferenceType ref); |
| |
| // Returns a picture in the DPB which has a POC bitmasked by |mask| which |
| // equals |poc| and marks it with |ref| reference type. If not found, returns |
| // nullptr. If |mask| is zero, then no bitmasking is done. |
| scoped_refptr<H265Picture> |
| GetPicByPocMaskedAndMark(int poc, int mask, H265Picture::ReferenceType ref); |
| |
| // Appends to |out| all of the pictures in the DPB that are flagged for output |
| // but have not be outputted yet. |
| void AppendPendingOutputPics(H265Picture::Vector* out); |
| |
| // Appends to |out| all of the pictures in the DPB that are not marked as |
| // unused for reference. |
| void AppendReferencePics(H265Picture::Vector* out); |
| |
| size_t size() const { return pics_.size(); } |
| bool IsFull() const { return pics_.size() >= max_num_pics_; } |
| |
| private: |
| H265Picture::Vector pics_; |
| size_t max_num_pics_{0}; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_GPU_H265_DPB_H_ |