Index: media/filters/vp9_parser.h |
diff --git a/media/filters/vp9_parser.h b/media/filters/vp9_parser.h |
index acb88d7e76a443cfc12ac6ff20238ecc1699fd53..a6186ce149c4530b13c95732710e86d66e538b17 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 { |
+ static bool IsValid(const Vp9FrameContext& context); |
kcwu
2016/08/10 09:59:18
How about make it non-static member function?
Acc
Pawel Osciak
2016/08/13 01:51:30
Done.
|
+ |
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,9 +289,49 @@ class MEDIA_EXPORT Vp9Parser { |
}; |
// The parsing context that persists across frames. |
- struct Context { |
+ class Context { |
kcwu
2016/08/10 09:59:18
If it's class, member variable need to be named fo
Pawel Osciak
2016/08/13 01:51:30
Done.
|
+ 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); |
+ |
+ // Return 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); |
+ |
// Segmentation and loop filter state. |
Vp9SegmentationParams segmentation; |
Vp9LoopFilterParams loop_filter; |
@@ -342,16 +355,12 @@ 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 { |
@@ -363,13 +372,15 @@ class MEDIA_EXPORT Vp9Parser { |
return context_.loop_filter; |
} |
+ // Return a GetContextRefreshCb, which, if not null, has to be called with the |
+ // new context state after the frame associated with |frame_hdr| is decoded. |
+ ContextRefreshCallback GetContextRefreshCb( |
+ const std::unique_ptr<Vp9FrameHeader>& frame_hdr); |
+ |
// 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; |