vp8_reference_frame_vector.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright 2018 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. #include "media/gpu/vp8_reference_frame_vector.h"
  5. #include "media/gpu/vp8_picture.h"
  6. namespace media {
  7. Vp8ReferenceFrameVector::Vp8ReferenceFrameVector() {
  8. // TODO(posciak): Remove this once VP8Decoder is created on the same thread
  9. // as its methods are called on.
  10. DETACH_FROM_SEQUENCE(sequence_checker_);
  11. }
  12. Vp8ReferenceFrameVector::~Vp8ReferenceFrameVector() {
  13. // TODO(posciak): Add this once VP8Decoder is created on the same thread
  14. // as its methods are called on.
  15. // DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  16. }
  17. // Based on update_reference_frames() in libvpx: vp8/encoder/onyx_if.c
  18. void Vp8ReferenceFrameVector::Refresh(scoped_refptr<VP8Picture> pic) {
  19. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  20. DCHECK(pic);
  21. bool keyframe = pic->frame_hdr->IsKeyframe();
  22. const auto& frame_hdr = pic->frame_hdr;
  23. if (keyframe) {
  24. reference_frames_[Vp8RefType::VP8_FRAME_LAST] = pic;
  25. reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN] = pic;
  26. reference_frames_[Vp8RefType::VP8_FRAME_ALTREF] = pic;
  27. return;
  28. }
  29. if (frame_hdr->refresh_alternate_frame) {
  30. reference_frames_[Vp8RefType::VP8_FRAME_ALTREF] = pic;
  31. } else {
  32. switch (frame_hdr->copy_buffer_to_alternate) {
  33. case Vp8FrameHeader::COPY_LAST_TO_ALT:
  34. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_LAST]);
  35. reference_frames_[Vp8RefType::VP8_FRAME_ALTREF] =
  36. reference_frames_[Vp8RefType::VP8_FRAME_LAST];
  37. break;
  38. case Vp8FrameHeader::COPY_GOLDEN_TO_ALT:
  39. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN]);
  40. reference_frames_[Vp8RefType::VP8_FRAME_ALTREF] =
  41. reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN];
  42. break;
  43. case Vp8FrameHeader::NO_ALT_REFRESH:
  44. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_ALTREF]);
  45. break;
  46. }
  47. }
  48. if (frame_hdr->refresh_golden_frame) {
  49. reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN] = pic;
  50. } else {
  51. switch (frame_hdr->copy_buffer_to_golden) {
  52. case Vp8FrameHeader::COPY_LAST_TO_GOLDEN:
  53. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_LAST]);
  54. reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN] =
  55. reference_frames_[Vp8RefType::VP8_FRAME_LAST];
  56. break;
  57. case Vp8FrameHeader::COPY_ALT_TO_GOLDEN:
  58. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_ALTREF]);
  59. reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN] =
  60. reference_frames_[Vp8RefType::VP8_FRAME_ALTREF];
  61. break;
  62. case Vp8FrameHeader::NO_GOLDEN_REFRESH:
  63. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_GOLDEN]);
  64. break;
  65. }
  66. }
  67. if (frame_hdr->refresh_last)
  68. reference_frames_[Vp8RefType::VP8_FRAME_LAST] = pic;
  69. else
  70. DCHECK(reference_frames_[Vp8RefType::VP8_FRAME_LAST]);
  71. }
  72. void Vp8ReferenceFrameVector::Clear() {
  73. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  74. for (auto& f : reference_frames_)
  75. f = nullptr;
  76. }
  77. scoped_refptr<VP8Picture> Vp8ReferenceFrameVector::GetFrame(
  78. Vp8RefType type) const {
  79. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  80. return reference_frames_[type];
  81. }
  82. } // namespace media