• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * VP9 compatible video decoder
3  *
4  * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
5  * Copyright (C) 2013 Clément Bœsch <u pkh me>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #ifndef AVCODEC_VP9SHARED_H
25 #define AVCODEC_VP9SHARED_H
26 
27 #include <stddef.h>
28 #include <stdint.h>
29 
30 #include "vp9.h"
31 #include "thread.h"
32 #include "vp56.h"
33 
34 enum BlockPartition {
35     PARTITION_NONE,    // [ ] <-.
36     PARTITION_H,       // [-]   |
37     PARTITION_V,       // [|]   |
38     PARTITION_SPLIT,   // [+] --'
39 };
40 
41 enum InterPredMode {
42     NEARESTMV = 10,
43     NEARMV    = 11,
44     ZEROMV    = 12,
45     NEWMV     = 13,
46 };
47 
48 enum CompPredMode {
49     PRED_SINGLEREF,
50     PRED_COMPREF,
51     PRED_SWITCHABLE,
52 };
53 
54 typedef struct VP9mvrefPair {
55     VP56mv mv[2];
56     int8_t ref[2];
57 } VP9mvrefPair;
58 
59 typedef struct VP9Frame {
60     ThreadFrame tf;
61     AVBufferRef *extradata;
62     uint8_t *segmentation_map;
63     VP9mvrefPair *mv;
64     int uses_2pass;
65 
66     AVBufferRef *hwaccel_priv_buf;
67     void *hwaccel_picture_private;
68 } VP9Frame;
69 
70 enum BlockLevel {
71     BL_64X64,
72     BL_32X32,
73     BL_16X16,
74     BL_8X8,
75 };
76 
77 enum BlockSize {
78     BS_64x64,
79     BS_64x32,
80     BS_32x64,
81     BS_32x32,
82     BS_32x16,
83     BS_16x32,
84     BS_16x16,
85     BS_16x8,
86     BS_8x16,
87     BS_8x8,
88     BS_8x4,
89     BS_4x8,
90     BS_4x4,
91     N_BS_SIZES,
92 };
93 
94 typedef struct VP9BitstreamHeader {
95     // bitstream header
96     uint8_t profile;
97     uint8_t bpp;
98     uint8_t keyframe;
99     uint8_t invisible;
100     uint8_t errorres;
101     uint8_t intraonly;
102     uint8_t resetctx;
103     uint8_t refreshrefmask;
104     uint8_t highprecisionmvs;
105     enum FilterMode filtermode;
106     uint8_t allowcompinter;
107     uint8_t refreshctx;
108     uint8_t parallelmode;
109     uint8_t framectxid;
110     uint8_t use_last_frame_mvs;
111     uint8_t refidx[3];
112     uint8_t signbias[3];
113     uint8_t fixcompref;
114     uint8_t varcompref[2];
115     struct {
116         uint8_t level;
117         int8_t sharpness;
118     } filter;
119     struct {
120         uint8_t enabled;
121         uint8_t updated;
122         int8_t mode[2];
123         int8_t ref[4];
124     } lf_delta;
125     uint8_t yac_qi;
126     int8_t ydc_qdelta, uvdc_qdelta, uvac_qdelta;
127     uint8_t lossless;
128 #define MAX_SEGMENT 8
129     struct {
130         uint8_t enabled;
131         uint8_t temporal;
132         uint8_t absolute_vals;
133         uint8_t update_map;
134         uint8_t prob[7];
135         uint8_t pred_prob[3];
136         struct {
137             uint8_t q_enabled;
138             uint8_t lf_enabled;
139             uint8_t ref_enabled;
140             uint8_t skip_enabled;
141             uint8_t ref_val;
142             int16_t q_val;
143             int8_t lf_val;
144             int16_t qmul[2][2];
145             uint8_t lflvl[4][2];
146         } feat[MAX_SEGMENT];
147     } segmentation;
148     enum TxfmMode txfmmode;
149     enum CompPredMode comppredmode;
150     struct {
151         unsigned log2_tile_cols, log2_tile_rows;
152         unsigned tile_cols, tile_rows;
153     } tiling;
154 
155     int uncompressed_header_size;
156     int compressed_header_size;
157 } VP9BitstreamHeader;
158 
159 typedef struct VP9SharedContext {
160     VP9BitstreamHeader h;
161 
162     ThreadFrame refs[8];
163 #define CUR_FRAME 0
164 #define REF_FRAME_MVPAIR 1
165 #define REF_FRAME_SEGMAP 2
166     VP9Frame frames[3];
167 } VP9SharedContext;
168 
169 #endif /* AVCODEC_VP9SHARED_H */
170