Index: media/filters/vp9_parser.h |
diff --git a/media/filters/vp9_parser.h b/media/filters/vp9_parser.h |
index acb88d7e76a443cfc12ac6ff20238ecc1699fd53..c7cca744dfd893fc2ca413a1881e98578980c1a4 100644 |
--- a/media/filters/vp9_parser.h |
+++ b/media/filters/vp9_parser.h |
@@ -17,6 +17,7 @@ |
#include <sys/types.h> |
#include <deque> |
+#include <memory> |
#include "base/callback.h" |
#include "base/macros.h" |
@@ -30,7 +31,8 @@ const int kVp9NumRefFramesLog2 = 3; |
const size_t kVp9NumRefFrames = 1 << kVp9NumRefFramesLog2; |
const uint8_t kVp9MaxProb = 255; |
const size_t kVp9NumRefsPerFrame = 3; |
-const size_t kVp9NumFrameContexts = 4; |
+const size_t kVp9NumFrameContextsLog2 = 2; |
+const size_t kVp9NumFrameContexts = 1 << kVp9NumFrameContextsLog2; |
using Vp9Prob = uint8_t; |
@@ -136,6 +138,8 @@ struct MEDIA_EXPORT Vp9QuantizationParams { |
// Entropy context for frame parsing |
struct MEDIA_EXPORT Vp9FrameContext { |
+ bool IsValid() const; |
+ |
Vp9Prob tx_probs_8x8[2][1]; |
Vp9Prob tx_probs_16x16[2][2]; |
Vp9Prob tx_probs_32x32[2][3]; |
@@ -255,44 +259,13 @@ struct MEDIA_EXPORT Vp9FrameHeader { |
Vp9FrameContext frame_context; |
}; |
-class Vp9FrameContextManager { |
+// A parser for VP9 bitstream. |
+class MEDIA_EXPORT Vp9Parser { |
public: |
// If context update is needed after decoding a frame, the client must |
// execute this callback, passing the updated context state. |
using ContextRefreshCallback = base::Callback<void(const Vp9FrameContext&)>; |
- static bool IsValidFrameContext(const Vp9FrameContext& context); |
- |
- Vp9FrameContextManager(); |
- ~Vp9FrameContextManager(); |
- bool initialized() const { return initialized_; } |
- bool needs_client_update() const { return needs_client_update_; } |
- const Vp9FrameContext& frame_context() const; |
- |
- // Resets to uninitialized state. |
- void Reset(); |
- |
- // Sets this context need update from parser's client. Returns a callback for |
- // update. |
- ContextRefreshCallback SetNeedsClientUpdate(); |
- |
- // Updates frame context. |
- void Update(const Vp9FrameContext& frame_context); |
- |
- private: |
- // Updates frame context from parser's client. |
- void UpdateFromClient(const Vp9FrameContext& frame_context); |
- |
- bool initialized_ = false; |
- bool needs_client_update_ = false; |
- Vp9FrameContext frame_context_; |
- |
- base::WeakPtrFactory<Vp9FrameContextManager> weak_ptr_factory_; |
-}; |
- |
-// A parser for VP9 bitstream. |
-class MEDIA_EXPORT Vp9Parser { |
- public: |
// ParseNextFrame() return values. See documentation for ParseNextFrame(). |
enum Result { |
kOk, |
@@ -316,17 +289,72 @@ class MEDIA_EXPORT Vp9Parser { |
}; |
// The parsing context that persists across frames. |
- struct Context { |
+ class Context { |
+ public: |
+ class Vp9FrameContextManager { |
+ public: |
+ Vp9FrameContextManager(); |
+ ~Vp9FrameContextManager(); |
+ bool initialized() const { return initialized_; } |
+ bool needs_client_update() const { return needs_client_update_; } |
+ const Vp9FrameContext& frame_context() const; |
+ |
+ // Resets to uninitialized state. |
+ void Reset(); |
+ |
+ // Marks this context as requiring an update from parser's client. |
+ void SetNeedsClientUpdate(); |
+ |
+ // Updates frame context. |
+ void Update(const Vp9FrameContext& frame_context); |
+ |
+ // Returns a callback to update frame context at a later time with. |
+ ContextRefreshCallback GetUpdateCb(); |
+ |
+ private: |
+ // Updates frame context from parser's client. |
+ void UpdateFromClient(const Vp9FrameContext& frame_context); |
+ |
+ bool initialized_ = false; |
+ bool needs_client_update_ = false; |
+ Vp9FrameContext frame_context_; |
+ |
+ base::WeakPtrFactory<Vp9FrameContextManager> weak_ptr_factory_; |
+ }; |
+ |
void Reset(); |
+ // Mark |frame_context_idx| as requiring update from the client. |
+ void MarkFrameContextForUpdate(size_t frame_context_idx); |
+ |
+ // Update frame context at |frame_context_idx| with the contents of |
+ // |frame_context|. |
+ void UpdateFrameContext(size_t frame_context_idx, |
+ const Vp9FrameContext& frame_context); |
+ |
+ // Return ReferenceSlot for frame at |ref_idx|. |
+ const ReferenceSlot& GetRefSlot(size_t ref_idx) const; |
+ |
+ // Update contents of ReferenceSlot at |ref_idx| with the contents of |
+ // |ref_slot|. |
+ void UpdateRefSlot(size_t ref_idx, const ReferenceSlot& ref_slot); |
+ |
+ const Vp9SegmentationParams& segmentation() const { return segmentation_; } |
+ |
+ const Vp9LoopFilterParams& loop_filter() const { return loop_filter_; } |
+ |
+ private: |
+ friend class Vp9UncompressedHeaderParser; |
+ friend class Vp9Parser; |
+ |
// Segmentation and loop filter state. |
- Vp9SegmentationParams segmentation; |
- Vp9LoopFilterParams loop_filter; |
+ Vp9SegmentationParams segmentation_; |
+ Vp9LoopFilterParams loop_filter_; |
// Frame references. |
- ReferenceSlot ref_slots[kVp9NumRefFrames]; |
+ ReferenceSlot ref_slots_[kVp9NumRefFrames]; |
- Vp9FrameContextManager frame_context_managers[kVp9NumFrameContexts]; |
+ Vp9FrameContextManager frame_context_managers_[kVp9NumFrameContexts]; |
}; |
// The constructor. See ParseNextFrame() for comments for |
@@ -342,34 +370,25 @@ class MEDIA_EXPORT Vp9Parser { |
// Parse the next frame in the current stream buffer, filling |fhdr| with |
// the parsed frame header and updating current segmentation and loop filter |
- // state. If |parsing_compressed_header_|, this function also fills |
- // |context_refresh_cb|, which is used to update frame context. If |
- // |*context_refresh_cb| is null, no callback is necessary. |
+ // state. |
// Return kOk if a frame has successfully been parsed, |
// kEOStream if there is no more data in the current stream buffer, |
// kAwaitingRefresh if this frame awaiting frame context update, or |
// kInvalidStream on error. |
- Result ParseNextFrame( |
- Vp9FrameHeader* fhdr, |
- Vp9FrameContextManager::ContextRefreshCallback* context_refresh_cb); |
+ Result ParseNextFrame(Vp9FrameHeader* fhdr); |
- // Return current segmentation state. |
- const Vp9SegmentationParams& GetSegmentation() const { |
- return context_.segmentation; |
- } |
+ // Return current parsing context. |
+ const Context& context() const { return context_; } |
- // Return current loop filter state. |
- const Vp9LoopFilterParams& GetLoopFilter() const { |
- return context_.loop_filter; |
- } |
+ // Return a ContextRefreshCallback, which, if not null, has to be called with |
+ // the new context state after the frame associated with |frame_context_idx| |
+ // is decoded. |
+ ContextRefreshCallback GetContextRefreshCb(size_t frame_context_idx); |
// Clear parser state and return to an initialized state. |
void Reset(); |
private: |
- class UncompressedHeaderParser; |
- class CompressedHeaderParser; |
- |
// Stores start pointer and size of each frame within the current superframe. |
struct FrameInfo { |
FrameInfo() = default; |