summaryrefslogtreecommitdiff
path: root/include/gst/codecparsers/gstvp8parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/gst/codecparsers/gstvp8parser.h')
-rw-r--r--include/gst/codecparsers/gstvp8parser.h346
1 files changed, 346 insertions, 0 deletions
diff --git a/include/gst/codecparsers/gstvp8parser.h b/include/gst/codecparsers/gstvp8parser.h
new file mode 100644
index 0000000000..2e56e6fb29
--- /dev/null
+++ b/include/gst/codecparsers/gstvp8parser.h
@@ -0,0 +1,346 @@
+/*
+ * gstvp8parser.h - VP8 parser
+ *
+ * Copyright (C) 2013-2014 Intel Corporation
+ * Author: Halley Zhao <halley.zhao@intel.com>
+ * Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GST_VP8_PARSER_H
+#define GST_VP8_PARSER_H
+
+#include <gst/gst.h>
+#include <gst/codecparsers/codecparsers-prelude.h>
+
+#ifndef GST_USE_UNSTABLE_API
+#warning "The VP8 parsing library is unstable API and may change in future."
+#warning "You can define GST_USE_UNSTABLE_API to avoid this warning."
+#endif
+
+G_BEGIN_DECLS
+
+typedef struct _GstVp8FrameHdr GstVp8FrameHdr;
+typedef struct _GstVp8QuantIndices GstVp8QuantIndices;
+typedef struct _GstVp8Segmentation GstVp8Segmentation;
+typedef struct _GstVp8MbLfAdjustments GstVp8MbLfAdjustments;
+typedef struct _GstVp8TokenProbs GstVp8TokenProbs;
+typedef struct _GstVp8MvProbs GstVp8MvProbs;
+typedef struct _GstVp8ModeProbs GstVp8ModeProbs;
+typedef struct _GstVp8Parser GstVp8Parser;
+
+/**
+ * GstVp8ParserResult:
+ * @GST_VP8_PARSER_OK: The parsing succeeded
+ * @GST_VP8_PARSER_BROKEN_DATA: The data to parse is broken
+ * @GST_VP8_PARSER_ERROR: An error accured when parsing
+ *
+ * The result of parsing VP8 data.
+ */
+typedef enum {
+ GST_VP8_PARSER_OK,
+ GST_VP8_PARSER_BROKEN_DATA,
+ GST_VP8_PARSER_ERROR,
+} GstVp8ParserResult;
+
+/**
+ * GstVpQuantIndices:
+ * @y_ac_qi: indicates the dequantization table index used for the
+ * luma AC coefficients
+ * @y_dc_delta: indicates the delta value that is added to the
+ * baseline index to obtain the luma DC coefficient dequantization
+ * index
+ * @y2_dc_delta: indicates the delta value that is added to the
+ * baseline index to obtain the Y2 block DC coefficient dequantization
+ * index
+ * @y2_ac_delta: indicates the delta value that is added to the
+ * baseline index to obtain the Y2 block AC coefficient dequantization
+ * index
+ * @uv_dc_delta: indicates the delta value that is added to the
+ * baseline index to obtain the chroma DC coefficient dequantization
+ * index
+ * @uv_ac_delta: indicates the delta value that is added to the
+ * baseline index to obtain the chroma AC coefficient dequantization
+ * index
+ *
+ * Dequantization indices.
+ */
+struct _GstVp8QuantIndices
+{
+ guint8 y_ac_qi;
+ gint8 y_dc_delta;
+ gint8 y2_dc_delta;
+ gint8 y2_ac_delta;
+ gint8 uv_dc_delta;
+ gint8 uv_ac_delta;
+};
+
+/**
+ * GstVp8Segmentation:
+ * @segmentation_enabled: enables the segmentation feature for the
+ * current frame
+ * @update_mb_segmentation_map: determines if the MB segmentation map
+ * is updated in the current frame
+ * @update_segment_feature_data: indicates if the segment feature data
+ * is updated in the current frame
+ * @segment_feature_mode: indicates the feature data update mode (0:
+ * delta, 1: absolute value)
+ * @quantizer_update_value: indicates the update value for the segment
+ * quantizer
+ * @lf_update_value: indicates the update value for the loop filter level
+ * @segment_prob: indicates the branch probabilities of the segment_id
+ * decoding tree
+ *
+ * Segmentation feature data.
+ */
+struct _GstVp8Segmentation
+{
+ guint8 segmentation_enabled;
+ guint8 update_mb_segmentation_map;
+ guint8 update_segment_feature_data;
+
+ /* if update_segment_feature_data == 1 */
+ guint8 segment_feature_mode;
+ gint8 quantizer_update_value[4];
+ gint8 lf_update_value[4];
+
+ /* if update_mb_segmentation_map == 1 */
+ guint8 segment_prob[3];
+};
+
+/**
+ * GstVp8MbLfAdjustments:
+ * @loop_filter_adj_enable: indicates if the MB-level loop filter
+ * adjustment is on for the current frame
+ * @mode_ref_lf_delta_update: indicates if the delta values used in an
+ * adjustment are updated in the current frame
+ * @ref_frame_delta: indicates the adjustment delta value
+ * corresponding to a certain used reference frame
+ * @mb_mode_delta: indicates the adjustment delta value corresponding
+ * to a certain MB prediction mode
+ *
+ * MB-level loop filter adjustments.
+ */
+struct _GstVp8MbLfAdjustments
+{
+ guint8 loop_filter_adj_enable;
+ guint8 mode_ref_lf_delta_update;
+
+ /* if mode_ref_lf_delta_update == 1 */
+ gint8 ref_frame_delta[4];
+ gint8 mb_mode_delta[4];
+};
+
+/**
+ * GstVp8TokenProbs:
+ * @prob: token probability
+ *
+ * Token probabilities, with cumulative updates applied.
+ *
+ * Each probability value in this matrix is live across frames, until
+ * they are reset to their default values on key frame.
+ */
+struct _GstVp8TokenProbs
+{
+ guint8 prob[4][8][3][11];
+};
+
+/**
+ * GstVp8MvProbs:
+ * @prob: MV probability
+ *
+ * Probabilities used for motion vector decoding, with cumulative
+ * updates applied.
+ *
+ * Each probability value in this matrix is live across frames, until
+ * they are reset to their default values on key frame.
+ */
+struct _GstVp8MvProbs
+{
+ guint8 prob[2][19];
+};
+
+/**
+ * GstVp8ModeProbs:
+ * @y_prob: indicates the branch probabilities of the luma
+ * intra-prediction mode decoding tree
+ * @uv_prob: indicates the branch probabilities of the chroma
+ * intra-prediction mode decoding tree
+ *
+ * Probabilities used for intra-prediction mode decoding tree.
+ *
+ * Each probability value in thie structure is live across frames,
+ * until they are reset to their default values on key frame.
+ */
+struct _GstVp8ModeProbs
+{
+ guint8 y_prob[4];
+ guint8 uv_prob[3];
+};
+
+/**
+ * GstVp8FrameHdr:
+ * @key_frame: indicates whether the frame is a key frame (1), or an
+ * inter frame (0)
+ * @version: version number
+ * @show_frame: indicates whether the frame is meant to be displayed (1),
+ * or not (0)
+ * @data_chunk_size: the size in bytes of the Uncompressed Data Chunk
+ * @first_part_size: the size in bytes of the first partition (control
+ * partition), excluding the uncompressed data chunk
+ * @width: the frame width in pixels
+ * @height: the frame height in pixels
+ * @horiz_scale_code: horizontal scale code value
+ * @vert_scale_code: vertical scale code value
+ * @color_space: defines the YUV color space of the sequence
+ * @clamping_type: specifies if the decoder is required to clamp the
+ * reconstructed pixel values
+ * @filter_type: determines whether the normal or the simple loop
+ * filter is used
+ * @loop_filter_level: controls the deblocking filter
+ * @sharpness_level: controls the deblocking filter
+ * @log2_nbr_of_dct_partitions: determines the number of separate
+ * partitions containing the DCT coefficients of the macroblocks
+ * @partition_size: determines the size of each separate partition
+ * containing the DCT coefficients of the macroblocks, including the
+ * very last one (calculated size)
+ * @quant_indices: dequantization indices (see #GstVp8QuantIndices)
+ * @token_probs: token probabilities (see #GstVp8TokenProbs)
+ * @mv_probs: probabilities used for motion vector decoding
+ * (see #GstVp8MvProbs)
+ * @mode_probs: probabilities used for intra-prediction mode decoding
+ * tree (see #GstVp8ModeProbs)
+ * @refresh_entropy_probs: determines whether updated token
+ * probabilities are used only for this frame or until further update
+ * @refresh_golden_frame: determines if the current decoded frame
+ * refreshes the golden frame
+ * @refresh_alternate_frame: determines if the current decoded frame
+ * refreshes the alternate reference frame
+ * @copy_buffer_to_golden: determines if the golden reference is
+ * replaced by another reference
+ * @copy_buffer_to_alternate: determines if the alternate reference is
+ * replaced by another reference
+ * @sign_bias_golden: controls the sign of motion vectors when the
+ * golden frame is referenced
+ * @sign_bias_alternate: controls the sign of motion vectors when the
+ * alternate frame is referenced
+ * @refresh_last: determines if the current decoded frame refreshes
+ * the last frame reference buffer
+ * @mb_no_skip_coeff: enables (0) or disables (1) the skipping of
+ * macroblocks containing no non-zero coefficients
+ * @prob_skip_false: indicates the probability that the macroblock is
+ * not skipped
+ * @prob_intra: indicates the probability of an intra macroblock
+ * @prob_last: indicates the probability that the last reference frame
+ * is used for inter-prediction
+ * @prob_gf: indicates the probability that the golden reference frame
+ * is used for inter-prediction
+ * @rd_range: last range decoder value for "Range"
+ * @rd_value: last range decoder value for "Value"
+ * @rd_count: number of bits left in range decoder "Value" (@rd_value)
+ * @header_size: the size in bits of the Frame Header, thus excluding
+ * any Uncompressed Data Chunk bytes
+ *
+ * Frame header.
+ */
+struct _GstVp8FrameHdr
+{
+ guint8 key_frame;
+ guint8 version;
+ guint8 show_frame;
+ guint8 data_chunk_size;
+ guint32 first_part_size;
+
+ /* if key_frame == 1 */
+ guint16 width;
+ guint16 height;
+ guint8 horiz_scale_code;
+ guint8 vert_scale_code;
+ guint8 color_space;
+ guint8 clamping_type;
+
+ guint8 filter_type;
+ guint8 loop_filter_level;
+ guint8 sharpness_level;
+ guint8 log2_nbr_of_dct_partitions;
+ guint partition_size[8];
+
+ GstVp8QuantIndices quant_indices;
+ GstVp8TokenProbs token_probs;
+ GstVp8MvProbs mv_probs;
+ GstVp8ModeProbs mode_probs;
+
+ guint8 refresh_entropy_probs;
+ guint8 refresh_last;
+ /* if key_frame != 1 */
+ guint8 refresh_golden_frame;
+ guint8 refresh_alternate_frame;
+ guint8 copy_buffer_to_golden;
+ guint8 copy_buffer_to_alternate;
+ guint8 sign_bias_golden;
+ guint8 sign_bias_alternate;
+
+ guint8 mb_no_skip_coeff;
+ guint8 prob_skip_false;
+
+ /* if key_frame != 1 */
+ guint8 prob_intra;
+ guint8 prob_last;
+ guint8 prob_gf;
+
+ /* Range decoder state */
+ guint8 rd_range;
+ guint8 rd_value;
+ guint8 rd_count;
+
+ /* Size of the Frame Header in bits */
+ guint header_size;
+};
+
+/**
+ * GstVp8Parser:
+ * @segmentation: segmentation feature data
+ * @mb_lf_adjust: MB-level loop filter adjustments
+ * @token_probs: token probabilities
+ * @mv_probs: probabilities used for motion vector decoding
+ * @mode_probs: probabilities used for intra-prediction mode decoding tree.
+ *
+ * Parser context that needs to be live across frames. For instance
+ * the probabilities tables stored in #GstVp8FrameHdr may depend on
+ * the previous frames.
+ */
+struct _GstVp8Parser
+{
+ GstVp8Segmentation segmentation;
+ GstVp8MbLfAdjustments mb_lf_adjust;
+ GstVp8TokenProbs token_probs;
+ GstVp8MvProbs mv_probs;
+ GstVp8ModeProbs mode_probs;
+};
+
+GST_CODEC_PARSERS_API
+void gst_vp8_parser_init (GstVp8Parser * parser);
+
+GST_CODEC_PARSERS_API
+GstVp8ParserResult gst_vp8_parser_parse_frame_header (GstVp8Parser * parser,
+ GstVp8FrameHdr * frame_hdr,
+ const guint8 * data,
+ gsize size);
+
+G_END_DECLS
+
+#endif /* GST_VP8_PARSER_H */