aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/cbs_vp8.h
diff options
context:
space:
mode:
authorDai, Jianhui J <jianhui.j.dai-at-intel.com@ffmpeg.org>2023-11-13 01:53:35 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2023-11-15 10:29:03 -0500
commitc9fe9fb86300c240da5e9c1441445c8dee5c7bce (patch)
tree1c3c464c1a61838f4c1f3f50aa9af4f7bd583aa4 /libavcodec/cbs_vp8.h
parent5cb8accd09054f8d9dd63f325a290a1008ce1e7e (diff)
downloadffmpeg-c9fe9fb86300c240da5e9c1441445c8dee5c7bce.tar.gz
avcodec/cbs_vp8: Add support for VP8 codec bitstream
This commit adds support for VP8 bitstream read methods to the cbs codec. This enables the trace_headers bitstream filter to support VP8, in addition to AV1, H.264, H.265, and VP9. This can be useful for debugging VP8 stream issues. The CBS VP8 implements a simple VP8 boolean decoder using GetBitContext to read the bitstream. Only the read methods `read_unit` and `split_fragment` are implemented. The write methods `write_unit` and `assemble_fragment` return the error code AVERROR_PATCHWELCOME. This is because CBS VP8 write is unlikely to be used by any applications at the moment. The write methods can be added later if there is a real need for them. TESTS: ffmpeg -i fate-suite/vp8/frame_size_change.webm -vcodec copy -bsf:v trace_headers -f null - Signed-off-by: Jianhui Dai <jianhui.j.dai@intel.com> Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Diffstat (limited to 'libavcodec/cbs_vp8.h')
-rw-r--r--libavcodec/cbs_vp8.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/libavcodec/cbs_vp8.h b/libavcodec/cbs_vp8.h
new file mode 100644
index 0000000000..9c09e21a1c
--- /dev/null
+++ b/libavcodec/cbs_vp8.h
@@ -0,0 +1,133 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_CBS_VP8_H
+#define AVCODEC_CBS_VP8_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "cbs.h"
+
+enum {
+ VP8_START_CODE_0 = 0x9D,
+ VP8_START_CODE_1 = 0x01,
+ VP8_START_CODE_2 = 0x2A,
+};
+
+enum {
+ VP8_KEY_FRAME = 0,
+ VP8_NON_KEY_FRAME = 1,
+};
+
+typedef struct VP8RawFrameHeader {
+ // frame tag
+ uint8_t frame_type;
+ uint8_t profile;
+ uint8_t show_frame;
+ uint32_t first_partition_length_in_bytes;
+
+ uint16_t width;
+ uint8_t horizontal_scale;
+ uint16_t height;
+ uint8_t vertical_scale;
+
+ // frame header
+ uint8_t color_space;
+ uint8_t clamping_type;
+
+ // segmentation
+ uint8_t segmentation_enable;
+ uint8_t update_segment_map;
+ uint8_t update_segment_feature_data;
+ uint8_t segment_feature_mode;
+ uint8_t segment_qp_update[4];
+ int8_t segment_qp[4];
+ uint8_t segment_loop_filter_level_update[4];
+ int8_t segment_loop_filter_level[4];
+ uint8_t segment_probs_update[3];
+ uint8_t segment_probs[3];
+
+ // loop filter
+ uint8_t loop_filter_type;
+ uint8_t loop_filter_level;
+ uint8_t loop_filter_sharpness;
+ uint8_t mode_ref_lf_delta_enable;
+ uint8_t mode_ref_lf_delta_update;
+ uint8_t ref_lf_deltas_update[4];
+ int8_t ref_lf_deltas[4];
+ uint8_t mode_lf_deltas_update[4];
+ int8_t mode_lf_deltas[4];
+
+ uint8_t log2_token_partitions;
+
+ // qp
+ uint8_t base_qindex;
+ uint8_t y1dc_delta_q_present;
+ int8_t y1dc_delta_q;
+ uint8_t y2dc_delta_q_present;
+ int8_t y2dc_delta_q;
+ uint8_t y2ac_delta_q_present;
+ int8_t y2ac_delta_q;
+ uint8_t uvdc_delta_q_present;
+ int8_t uvdc_delta_q;
+ uint8_t uvac_delta_q_present;
+ int8_t uvac_delta_q;
+
+ // ref
+ uint8_t refresh_golden_frame;
+ uint8_t refresh_alternate_frame;
+ uint8_t copy_buffer_to_golden;
+ uint8_t copy_buffer_to_alternate;
+ uint8_t ref_frame_sign_bias_golden;
+ uint8_t ref_frame_sign_bias_alternate;
+ uint8_t refresh_last_frame;
+
+ uint8_t refresh_entropy_probs;
+
+ // token probs
+ uint8_t coeff_prob_update[4][8][3][11];
+ uint8_t coeff_prob[4][8][3][11];
+
+ uint8_t mb_no_skip_coeff;
+ uint8_t prob_skip_false;
+
+ uint8_t prob_intra;
+ uint8_t prob_last;
+ uint8_t prob_golden;
+
+ uint8_t intra_16x16_prob_update;
+ uint8_t intra_16x16_prob[4];
+
+ uint8_t intra_chrome_prob_update;
+ uint8_t intra_chrome_prob[3];
+
+ // mv probs
+ uint8_t mv_prob_update[2][19];
+ uint8_t mv_prob[2][19];
+} VP8RawFrameHeader;
+
+typedef struct VP8RawFrame {
+ VP8RawFrameHeader header;
+
+ uint8_t *data;
+ AVBufferRef *data_ref;
+ size_t data_size;
+} VP8RawFrame;
+
+#endif /* AVCODEC_CBS_VP8_H */