Chromium Code Reviews| Index: media/filters/vp9_parser.cc |
| diff --git a/media/filters/vp9_parser.cc b/media/filters/vp9_parser.cc |
| index c49e33b391dff4dee3f13ca6fb0e849728f750dd..410da6b6636cd058a5f54e7621f7352fe526bf4e 100644 |
| --- a/media/filters/vp9_parser.cc |
| +++ b/media/filters/vp9_parser.cc |
| @@ -36,12 +36,8 @@ bool Vp9FrameHeader::IsIntra() const { |
| Vp9Parser::FrameInfo::FrameInfo(const uint8_t* ptr, off_t size) |
| : ptr(ptr), size(size) {} |
| -Vp9FrameContextManager::Vp9FrameContextManager() : weak_ptr_factory_(this) {} |
| - |
| -Vp9FrameContextManager::~Vp9FrameContextManager() {} |
| - |
| -bool Vp9FrameContextManager::IsValidFrameContext( |
| - const Vp9FrameContext& context) { |
| +// static |
| +bool Vp9FrameContext::IsValid(const Vp9FrameContext& context) { |
| // probs should be in [1, 255] range. |
| static_assert(sizeof(Vp9Prob) == 1, |
| "following checks assuming Vp9Prob is single byte"); |
| @@ -110,31 +106,43 @@ bool Vp9FrameContextManager::IsValidFrameContext( |
| return true; |
| } |
| -const Vp9FrameContext& Vp9FrameContextManager::frame_context() const { |
| +Vp9Parser::Context::Vp9FrameContextManager::Vp9FrameContextManager() |
| + : weak_ptr_factory_(this) {} |
| + |
| +Vp9Parser::Context::Vp9FrameContextManager::~Vp9FrameContextManager() {} |
| + |
| +const Vp9FrameContext& |
| +Vp9Parser::Context::Vp9FrameContextManager::frame_context() const { |
| DCHECK(initialized_); |
| DCHECK(!needs_client_update_); |
| return frame_context_; |
| } |
| -void Vp9FrameContextManager::Reset() { |
| +void Vp9Parser::Context::Vp9FrameContextManager::Reset() { |
| initialized_ = false; |
| needs_client_update_ = false; |
| weak_ptr_factory_.InvalidateWeakPtrs(); |
| } |
| -Vp9FrameContextManager::ContextRefreshCallback |
| -Vp9FrameContextManager::SetNeedsClientUpdate() { |
| +void Vp9Parser::Context::Vp9FrameContextManager::SetNeedsClientUpdate() { |
| DCHECK(!needs_client_update_); |
| initialized_ = true; |
| needs_client_update_ = true; |
| +} |
| - return base::Bind(&Vp9FrameContextManager::UpdateFromClient, |
| - weak_ptr_factory_.GetWeakPtr()); |
| +Vp9Parser::ContextRefreshCallback |
| +Vp9Parser::Context::Vp9FrameContextManager::GetUpdateCb() { |
| + if (needs_client_update_) |
| + return base::Bind(&Vp9FrameContextManager::UpdateFromClient, |
| + weak_ptr_factory_.GetWeakPtr()); |
| + else |
| + return Vp9Parser::ContextRefreshCallback(); |
| } |
| -void Vp9FrameContextManager::Update(const Vp9FrameContext& frame_context) { |
| +void Vp9Parser::Context::Vp9FrameContextManager::Update( |
| + const Vp9FrameContext& frame_context) { |
| // DCHECK because we can trust values from our parser. |
| - DCHECK(IsValidFrameContext(frame_context)); |
| + DCHECK(Vp9FrameContext::IsValid(frame_context)); |
| initialized_ = true; |
| frame_context_ = frame_context; |
| @@ -148,11 +156,11 @@ void Vp9FrameContextManager::Update(const Vp9FrameContext& frame_context) { |
| needs_client_update_ = false; |
| } |
| -void Vp9FrameContextManager::UpdateFromClient( |
| +void Vp9Parser::Context::Vp9FrameContextManager::UpdateFromClient( |
| const Vp9FrameContext& frame_context) { |
| DVLOG(2) << "Got external frame_context update"; |
| DCHECK(needs_client_update_); |
| - if (!IsValidFrameContext(frame_context)) { |
| + if (!Vp9FrameContext::IsValid(frame_context)) { |
| DLOG(ERROR) << "Invalid prob value in frame_context"; |
| return; |
| } |
| @@ -169,6 +177,18 @@ void Vp9Parser::Context::Reset() { |
| manager.Reset(); |
| } |
| +void Vp9Parser::Context::MarkFrameContextForUpdate(size_t frame_context_idx) { |
| + DCHECK_LT(frame_context_idx, arraysize(frame_context_managers)); |
| + frame_context_managers[frame_context_idx].SetNeedsClientUpdate(); |
| +} |
| + |
| +void Vp9Parser::Context::UpdateFrameContext( |
| + size_t frame_context_idx, |
| + const Vp9FrameContext& frame_context) { |
| + DCHECK_LT(frame_context_idx, arraysize(frame_context_managers)); |
| + frame_context_managers[frame_context_idx].Update(frame_context); |
| +} |
| + |
| Vp9Parser::Vp9Parser(bool parsing_compressed_header) |
| : parsing_compressed_header_(parsing_compressed_header) { |
| Reset(); |
| @@ -191,11 +211,8 @@ void Vp9Parser::Reset() { |
| context_.Reset(); |
| } |
| -Vp9Parser::Result Vp9Parser::ParseNextFrame( |
| - Vp9FrameHeader* fhdr, |
| - Vp9FrameContextManager::ContextRefreshCallback* context_refresh_cb) { |
| +Vp9Parser::Result Vp9Parser::ParseNextFrame(Vp9FrameHeader* fhdr) { |
| DCHECK(fhdr); |
| - DCHECK(!parsing_compressed_header_ || context_refresh_cb); |
| DVLOG(2) << "ParseNextFrame"; |
| // If |curr_frame_info_| is valid, uncompressed header was parsed into |
| @@ -251,19 +268,19 @@ Vp9Parser::Result Vp9Parser::ParseNextFrame( |
| } |
| if (parsing_compressed_header_) { |
| - Vp9FrameContextManager& context_to_load = |
| - context_.frame_context_managers[curr_frame_header_.frame_context_idx]; |
| + size_t frame_context_idx = curr_frame_header_.frame_context_idx; |
| + const Context::Vp9FrameContextManager& context_to_load = |
| + context_.frame_context_managers[frame_context_idx]; |
| if (!context_to_load.initialized()) { |
| // 8.2 Frame order constraints |
| // must load an initialized set of probabilities. |
| DVLOG(1) << "loading uninitialized frame context, index=" |
| - << curr_frame_header_.frame_context_idx; |
| + << frame_context_idx; |
| return kInvalidStream; |
| } |
| if (context_to_load.needs_client_update()) { |
| DVLOG(3) << "waiting frame_context_idx=" |
| - << static_cast<int>(curr_frame_header_.frame_context_idx) |
| - << " to update"; |
| + << static_cast<int>(frame_context_idx) << " to update"; |
|
kcwu
2016/08/10 09:59:18
no longer needed to cast for size_t.
Pawel Osciak
2016/08/13 01:51:30
Done.
|
| return kAwaitingRefresh; |
| } |
| curr_frame_header_.initial_frame_context = |
| @@ -277,15 +294,13 @@ Vp9Parser::Result Vp9Parser::ParseNextFrame( |
| } |
| if (curr_frame_header_.refresh_frame_context) { |
| - Vp9FrameContextManager& frame_context_manager = |
| - context_.frame_context_managers[curr_frame_header_.frame_context_idx]; |
| - |
| // In frame parallel mode, we can refresh the context without decoding |
| // tile data. |
| if (curr_frame_header_.frame_parallel_decoding_mode) { |
| - frame_context_manager.Update(curr_frame_header_.frame_context); |
| + context_.UpdateFrameContext(frame_context_idx, |
| + curr_frame_header_.frame_context); |
| } else { |
| - *context_refresh_cb = frame_context_manager.SetNeedsClientUpdate(); |
| + context_.MarkFrameContextForUpdate(frame_context_idx); |
| } |
| } |
| } |
| @@ -299,6 +314,14 @@ Vp9Parser::Result Vp9Parser::ParseNextFrame( |
| return kOk; |
| } |
| +Vp9Parser::ContextRefreshCallback Vp9Parser::GetContextRefreshCb( |
| + const std::unique_ptr<Vp9FrameHeader>& frame_hdr) { |
| + auto& frame_context_manager = |
| + context_.frame_context_managers[frame_hdr->frame_context_idx]; |
| + |
| + return frame_context_manager.GetUpdateCb(); |
| +} |
| + |
| // Annex B Superframes |
| std::deque<Vp9Parser::FrameInfo> Vp9Parser::ParseSuperframe() { |
| const uint8_t* stream = stream_; |