Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: media/filters/vp9_parser.h

Issue 1258083004: Add a Vp9Parser implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ReadBool, fix compile warning Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/BUILD.gn ('k') | media/filters/vp9_parser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/vp9_parser.h
diff --git a/media/filters/vp9_parser.h b/media/filters/vp9_parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..877043179096747e3cc30ba2aaa7bac9117d5df2
--- /dev/null
+++ b/media/filters/vp9_parser.h
@@ -0,0 +1,220 @@
+// Copyright 2015 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.
+//
+// This file contains an implementation of a VP9 bitstream parser. The main
+// purpose of this parser is to support hardware decode acceleration. Some
+// accelerators, e.g. libva which implements VA-API, require the caller
+// (chrome) to feed them parsed VP9 frame header.
+//
+// Example usage:
+// {
+// Vp9Parser parser;
+// uint8_t* frame_stream;
+// size_t frame_size;
+//
+// // Get frames from, say, WebM parser or IVF parser.
+// while (GetVp9Frame(&frame_stream, &frame_size)) {
+// Vp9FrameHeader header;
+// if (!parser.ParseFrame(frame_stream, frame_size, &header)) {
+// // Parse failed.
+// return false;
+// }
+// // Got a frame parsed successfully.
+// }
+// }
+
+#ifndef MEDIA_FILTERS_VP9_PARSER_H_
+#define MEDIA_FILTERS_VP9_PARSER_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "base/macros.h"
+#include "media/base/media_export.h"
+#include "media/filters/vp9_raw_bits_reader.h"
+
+namespace media {
+
+const int kVp9MaxProfile = 4;
+const int kVp9NumRefFramesLog2 = 3;
+const int kVp9NumRefFrames = 1 << kVp9NumRefFramesLog2;
+const uint8_t kVp9MaxProb = 255;
+const int kVp9NumRefsPerFrame = 3;
+
+enum class Vp9ColorSpace {
+ UNKNOWN = 0,
+ BT_601 = 1,
+ BT_709 = 2,
+ SMPTE_170 = 3,
+ SMPTE_240 = 4,
+ BT_2020 = 5,
+ RESERVED = 6,
+ SRGB = 7,
+};
+
+enum class Vp9InterpFilter {
+ INTERP_FILTER_SELECT = 0,
+ EIGHTTAP_SMOOTH = 1,
+ EIGHTTAP = 2,
+ EIGHTTAP_SHARP = 3,
+ BILINEAR = 4,
+};
+
+// Members of Vp9FrameHeader will be 0-initialized by Vp9Parser::ParseFrame.
+struct MEDIA_EXPORT Vp9Segmentation {
+ static const int kNumSegments = 8;
+ static const int kNumTreeProbs = kNumSegments - 1;
+ static const int kNumPredictionProbs = 3;
+ static const int kNumFeatures = 4;
+
+ bool enabled;
+
+ bool update_map;
+ uint8_t tree_probs[kNumTreeProbs];
+ bool temporal_update;
+ uint8_t pred_probs[kNumPredictionProbs];
+
+ bool update_data;
+ bool abs_delta;
+ bool feature_enabled[kNumSegments][kNumFeatures];
+ int8_t feature_data[kNumSegments][kNumFeatures];
+};
+
+// Members of Vp9FrameHeader will be 0-initialized by Vp9Parser::ParseFrame.
+struct MEDIA_EXPORT Vp9LoopFilter {
+ static const int kNumRefDeltas = 4;
+ static const int kNumModeDeltas = 2;
+
+ uint8_t filter_level;
+ uint8_t sharpness_level;
+
+ bool mode_ref_delta_enabled;
+ bool mode_ref_delta_update;
+ bool update_ref_deltas[kNumRefDeltas];
+ int8_t ref_deltas[kNumRefDeltas];
+ bool update_mode_deltas[kNumModeDeltas];
+ int8_t mode_deltas[kNumModeDeltas];
+};
+
+// Members of Vp9FrameHeader will be 0-initialized by Vp9Parser::ParseFrame.
+struct MEDIA_EXPORT Vp9QuantizationParams {
+ bool IsLossless() const {
+ return base_qindex == 0 && y_dc_delta == 0 && uv_dc_delta == 0 &&
+ uv_ac_delta == 0;
+ }
+
+ uint8_t base_qindex;
+ int8_t y_dc_delta;
+ int8_t uv_dc_delta;
+ int8_t uv_ac_delta;
+};
+
+// VP9 frame header.
+struct MEDIA_EXPORT Vp9FrameHeader {
+ enum FrameType {
+ KEYFRAME = 0,
+ INTERFRAME = 1,
+ };
+
+ bool IsKeyframe() const { return frame_type == KEYFRAME; }
+
+ uint8_t profile;
+
+ bool show_existing_frame;
+ uint8_t frame_to_show;
+
+ FrameType frame_type;
+
+ bool show_frame;
+ bool error_resilient_mode;
+
+ uint8_t bit_depth;
+ Vp9ColorSpace color_space;
+ bool yuv_range;
+ uint8_t subsampling_x;
+ uint8_t subsampling_y;
+
+ // The range of width and height is 1..2^16.
+ uint32_t width;
+ uint32_t height;
+ uint32_t display_width;
+ uint32_t display_height;
+
+ bool intra_only;
+ uint8_t reset_context;
+ bool refresh_flag[kVp9NumRefFrames];
+ uint8_t frame_refs[kVp9NumRefsPerFrame];
+ bool ref_sign_biases[kVp9NumRefsPerFrame];
+ bool allow_high_precision_mv;
+ Vp9InterpFilter interp_filter;
+
+ bool refresh_frame_context;
+ bool frame_parallel_decoding_mode;
+ uint8_t frame_context_idx;
+
+ Vp9LoopFilter loop_filter;
+ Vp9QuantizationParams quant_params;
+ Vp9Segmentation segment;
+
+ uint8_t log2_tile_cols;
+ uint8_t log2_tile_rows;
+
+ // Size of compressed header in bytes.
+ size_t first_partition_size;
+
+ // Size of uncompressed header in bytes.
+ size_t uncompressed_header_size;
+};
+
+// A parser for VP9 bitstream.
+class MEDIA_EXPORT Vp9Parser {
+ public:
+ Vp9Parser();
+
+ // Parses one frame and fills parsing result to |fhdr|. Returns true on
+ // success, false otherwise.
+ // |stream| is the address of VP9 bitstream with |size|.
+ bool ParseFrame(const uint8_t* stream, size_t size, Vp9FrameHeader* fhdr);
+
+ private:
+ // The parsing context to keep track of references.
+ struct ReferenceSlot {
+ uint32_t width;
+ uint32_t height;
+ };
+
+ uint8_t ReadProfile();
+ bool VerifySyncCode();
+ bool ReadBitDepthColorSpaceSampling(Vp9FrameHeader* fhdr);
+ void ReadFrameSize(Vp9FrameHeader* fhdr);
+ bool ReadFrameSizeFromRefs(Vp9FrameHeader* fhdr);
+ void ReadDisplayFrameSize(Vp9FrameHeader* fhdr);
+ Vp9InterpFilter ReadInterpFilter();
+ void ReadLoopFilter(Vp9LoopFilter* loop_filter);
+ void ReadQuantization(Vp9QuantizationParams* quants);
+ void ReadSegmentationMap(Vp9Segmentation* segment);
+ void ReadSegmentationData(Vp9Segmentation* segment);
+ void ReadSegmentation(Vp9Segmentation* segment);
+ void ReadTiles(Vp9FrameHeader* fhdr);
+ bool ParseUncompressedHeader(Vp9FrameHeader* fhdr);
+ void UpdateSlots(const Vp9FrameHeader* fhdr);
+
+ // Start address of VP9 bitstream buffer.
+ const uint8_t* stream_;
+
+ // Size of |stream_| in bytes.
+ size_t size_;
+
+ // Raw bits decoder for uncompressed frame header.
+ Vp9RawBitsReader reader_;
+
+ // The parsing context to keep track of references.
+ ReferenceSlot ref_slots_[kVp9NumRefFrames];
+
+ DISALLOW_COPY_AND_ASSIGN(Vp9Parser);
+};
+
+} // namespace media
+
+#endif // MEDIA_FILTERS_VP9_PARSER_H_
« no previous file with comments | « media/BUILD.gn ('k') | media/filters/vp9_parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698