yading@10
|
1 /*
|
yading@10
|
2 * Copyright (C) 2007 Marco Gerards <marco@gnu.org>
|
yading@10
|
3 * Copyright (C) 2009 David Conrad
|
yading@10
|
4 * Copyright (C) 2011 Jordi Ortiz
|
yading@10
|
5 *
|
yading@10
|
6 * This file is part of FFmpeg.
|
yading@10
|
7 *
|
yading@10
|
8 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
9 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
10 * License as published by the Free Software Foundation; either
|
yading@10
|
11 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
12 *
|
yading@10
|
13 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
16 * Lesser General Public License for more details.
|
yading@10
|
17 *
|
yading@10
|
18 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
19 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
21 */
|
yading@10
|
22
|
yading@10
|
23 /**
|
yading@10
|
24 * @file
|
yading@10
|
25 * Dirac Decoder
|
yading@10
|
26 * @author Marco Gerards <marco@gnu.org>, David Conrad, Jordi Ortiz <nenjordi@gmail.com>
|
yading@10
|
27 */
|
yading@10
|
28
|
yading@10
|
29 #include "avcodec.h"
|
yading@10
|
30 #include "dsputil.h"
|
yading@10
|
31 #include "get_bits.h"
|
yading@10
|
32 #include "bytestream.h"
|
yading@10
|
33 #include "internal.h"
|
yading@10
|
34 #include "golomb.h"
|
yading@10
|
35 #include "dirac_arith.h"
|
yading@10
|
36 #include "mpeg12data.h"
|
yading@10
|
37 #include "dirac_dwt.h"
|
yading@10
|
38 #include "dirac.h"
|
yading@10
|
39 #include "diracdsp.h"
|
yading@10
|
40 #include "videodsp.h" // for ff_emulated_edge_mc_8
|
yading@10
|
41
|
yading@10
|
42 /**
|
yading@10
|
43 * The spec limits the number of wavelet decompositions to 4 for both
|
yading@10
|
44 * level 1 (VC-2) and 128 (long-gop default).
|
yading@10
|
45 * 5 decompositions is the maximum before >16-bit buffers are needed.
|
yading@10
|
46 * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting
|
yading@10
|
47 * the others to 4 decompositions (or 3 for the fidelity filter).
|
yading@10
|
48 *
|
yading@10
|
49 * We use this instead of MAX_DECOMPOSITIONS to save some memory.
|
yading@10
|
50 */
|
yading@10
|
51 #define MAX_DWT_LEVELS 5
|
yading@10
|
52
|
yading@10
|
53 /**
|
yading@10
|
54 * The spec limits this to 3 for frame coding, but in practice can be as high as 6
|
yading@10
|
55 */
|
yading@10
|
56 #define MAX_REFERENCE_FRAMES 8
|
yading@10
|
57 #define MAX_DELAY 5 /* limit for main profile for frame coding (TODO: field coding) */
|
yading@10
|
58 #define MAX_FRAMES (MAX_REFERENCE_FRAMES + MAX_DELAY + 1)
|
yading@10
|
59 #define MAX_QUANT 68 /* max quant for VC-2 */
|
yading@10
|
60 #define MAX_BLOCKSIZE 32 /* maximum xblen/yblen we support */
|
yading@10
|
61
|
yading@10
|
62 /**
|
yading@10
|
63 * DiracBlock->ref flags, if set then the block does MC from the given ref
|
yading@10
|
64 */
|
yading@10
|
65 #define DIRAC_REF_MASK_REF1 1
|
yading@10
|
66 #define DIRAC_REF_MASK_REF2 2
|
yading@10
|
67 #define DIRAC_REF_MASK_GLOBAL 4
|
yading@10
|
68
|
yading@10
|
69 /**
|
yading@10
|
70 * Value of Picture.reference when Picture is not a reference picture, but
|
yading@10
|
71 * is held for delayed output.
|
yading@10
|
72 */
|
yading@10
|
73 #define DELAYED_PIC_REF 4
|
yading@10
|
74
|
yading@10
|
75 #define ff_emulated_edge_mc ff_emulated_edge_mc_8 /* Fix: change the calls to this function regarding bit depth */
|
yading@10
|
76
|
yading@10
|
77 #define CALC_PADDING(size, depth) \
|
yading@10
|
78 (((size + (1 << depth) - 1) >> depth) << depth)
|
yading@10
|
79
|
yading@10
|
80 #define DIVRNDUP(a, b) (((a) + (b) - 1) / (b))
|
yading@10
|
81
|
yading@10
|
82 typedef struct {
|
yading@10
|
83 AVFrame avframe;
|
yading@10
|
84 int interpolated[3]; /* 1 if hpel[] is valid */
|
yading@10
|
85 uint8_t *hpel[3][4];
|
yading@10
|
86 uint8_t *hpel_base[3][4];
|
yading@10
|
87 } DiracFrame;
|
yading@10
|
88
|
yading@10
|
89 typedef struct {
|
yading@10
|
90 union {
|
yading@10
|
91 int16_t mv[2][2];
|
yading@10
|
92 int16_t dc[3];
|
yading@10
|
93 } u; /* anonymous unions aren't in C99 :( */
|
yading@10
|
94 uint8_t ref;
|
yading@10
|
95 } DiracBlock;
|
yading@10
|
96
|
yading@10
|
97 typedef struct SubBand {
|
yading@10
|
98 int level;
|
yading@10
|
99 int orientation;
|
yading@10
|
100 int stride;
|
yading@10
|
101 int width;
|
yading@10
|
102 int height;
|
yading@10
|
103 int quant;
|
yading@10
|
104 IDWTELEM *ibuf;
|
yading@10
|
105 struct SubBand *parent;
|
yading@10
|
106
|
yading@10
|
107 /* for low delay */
|
yading@10
|
108 unsigned length;
|
yading@10
|
109 const uint8_t *coeff_data;
|
yading@10
|
110 } SubBand;
|
yading@10
|
111
|
yading@10
|
112 typedef struct Plane {
|
yading@10
|
113 int width;
|
yading@10
|
114 int height;
|
yading@10
|
115 int stride;
|
yading@10
|
116
|
yading@10
|
117 int idwt_width;
|
yading@10
|
118 int idwt_height;
|
yading@10
|
119 int idwt_stride;
|
yading@10
|
120 IDWTELEM *idwt_buf;
|
yading@10
|
121 IDWTELEM *idwt_buf_base;
|
yading@10
|
122 IDWTELEM *idwt_tmp;
|
yading@10
|
123
|
yading@10
|
124 /* block length */
|
yading@10
|
125 uint8_t xblen;
|
yading@10
|
126 uint8_t yblen;
|
yading@10
|
127 /* block separation (block n+1 starts after this many pixels in block n) */
|
yading@10
|
128 uint8_t xbsep;
|
yading@10
|
129 uint8_t ybsep;
|
yading@10
|
130 /* amount of overspill on each edge (half of the overlap between blocks) */
|
yading@10
|
131 uint8_t xoffset;
|
yading@10
|
132 uint8_t yoffset;
|
yading@10
|
133
|
yading@10
|
134 SubBand band[MAX_DWT_LEVELS][4];
|
yading@10
|
135 } Plane;
|
yading@10
|
136
|
yading@10
|
137 typedef struct DiracContext {
|
yading@10
|
138 AVCodecContext *avctx;
|
yading@10
|
139 DSPContext dsp;
|
yading@10
|
140 DiracDSPContext diracdsp;
|
yading@10
|
141 GetBitContext gb;
|
yading@10
|
142 dirac_source_params source;
|
yading@10
|
143 int seen_sequence_header;
|
yading@10
|
144 int frame_number; /* number of the next frame to display */
|
yading@10
|
145 Plane plane[3];
|
yading@10
|
146 int chroma_x_shift;
|
yading@10
|
147 int chroma_y_shift;
|
yading@10
|
148
|
yading@10
|
149 int zero_res; /* zero residue flag */
|
yading@10
|
150 int is_arith; /* whether coeffs use arith or golomb coding */
|
yading@10
|
151 int low_delay; /* use the low delay syntax */
|
yading@10
|
152 int globalmc_flag; /* use global motion compensation */
|
yading@10
|
153 int num_refs; /* number of reference pictures */
|
yading@10
|
154
|
yading@10
|
155 /* wavelet decoding */
|
yading@10
|
156 unsigned wavelet_depth; /* depth of the IDWT */
|
yading@10
|
157 unsigned wavelet_idx;
|
yading@10
|
158
|
yading@10
|
159 /**
|
yading@10
|
160 * schroedinger older than 1.0.8 doesn't store
|
yading@10
|
161 * quant delta if only one codebook exists in a band
|
yading@10
|
162 */
|
yading@10
|
163 unsigned old_delta_quant;
|
yading@10
|
164 unsigned codeblock_mode;
|
yading@10
|
165
|
yading@10
|
166 struct {
|
yading@10
|
167 unsigned width;
|
yading@10
|
168 unsigned height;
|
yading@10
|
169 } codeblock[MAX_DWT_LEVELS+1];
|
yading@10
|
170
|
yading@10
|
171 struct {
|
yading@10
|
172 unsigned num_x; /* number of horizontal slices */
|
yading@10
|
173 unsigned num_y; /* number of vertical slices */
|
yading@10
|
174 AVRational bytes; /* average bytes per slice */
|
yading@10
|
175 uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
|
yading@10
|
176 } lowdelay;
|
yading@10
|
177
|
yading@10
|
178 struct {
|
yading@10
|
179 int pan_tilt[2]; /* pan/tilt vector */
|
yading@10
|
180 int zrs[2][2]; /* zoom/rotate/shear matrix */
|
yading@10
|
181 int perspective[2]; /* perspective vector */
|
yading@10
|
182 unsigned zrs_exp;
|
yading@10
|
183 unsigned perspective_exp;
|
yading@10
|
184 } globalmc[2];
|
yading@10
|
185
|
yading@10
|
186 /* motion compensation */
|
yading@10
|
187 uint8_t mv_precision; /* [DIRAC_STD] REFS_WT_PRECISION */
|
yading@10
|
188 int16_t weight[2]; /* [DIRAC_STD] REF1_WT and REF2_WT */
|
yading@10
|
189 unsigned weight_log2denom; /* [DIRAC_STD] REFS_WT_PRECISION */
|
yading@10
|
190
|
yading@10
|
191 int blwidth; /* number of blocks (horizontally) */
|
yading@10
|
192 int blheight; /* number of blocks (vertically) */
|
yading@10
|
193 int sbwidth; /* number of superblocks (horizontally) */
|
yading@10
|
194 int sbheight; /* number of superblocks (vertically) */
|
yading@10
|
195
|
yading@10
|
196 uint8_t *sbsplit;
|
yading@10
|
197 DiracBlock *blmotion;
|
yading@10
|
198
|
yading@10
|
199 uint8_t *edge_emu_buffer[4];
|
yading@10
|
200 uint8_t *edge_emu_buffer_base;
|
yading@10
|
201
|
yading@10
|
202 uint16_t *mctmp; /* buffer holding the MC data multipled by OBMC weights */
|
yading@10
|
203 uint8_t *mcscratch;
|
yading@10
|
204
|
yading@10
|
205 DECLARE_ALIGNED(16, uint8_t, obmc_weight)[3][MAX_BLOCKSIZE*MAX_BLOCKSIZE];
|
yading@10
|
206
|
yading@10
|
207 void (*put_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
|
yading@10
|
208 void (*avg_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
|
yading@10
|
209 void (*add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen);
|
yading@10
|
210 dirac_weight_func weight_func;
|
yading@10
|
211 dirac_biweight_func biweight_func;
|
yading@10
|
212
|
yading@10
|
213 DiracFrame *current_picture;
|
yading@10
|
214 DiracFrame *ref_pics[2];
|
yading@10
|
215
|
yading@10
|
216 DiracFrame *ref_frames[MAX_REFERENCE_FRAMES+1];
|
yading@10
|
217 DiracFrame *delay_frames[MAX_DELAY+1];
|
yading@10
|
218 DiracFrame all_frames[MAX_FRAMES];
|
yading@10
|
219 } DiracContext;
|
yading@10
|
220
|
yading@10
|
221 /**
|
yading@10
|
222 * Dirac Specification ->
|
yading@10
|
223 * Parse code values. 9.6.1 Table 9.1
|
yading@10
|
224 */
|
yading@10
|
225 enum dirac_parse_code {
|
yading@10
|
226 pc_seq_header = 0x00,
|
yading@10
|
227 pc_eos = 0x10,
|
yading@10
|
228 pc_aux_data = 0x20,
|
yading@10
|
229 pc_padding = 0x30,
|
yading@10
|
230 };
|
yading@10
|
231
|
yading@10
|
232 enum dirac_subband {
|
yading@10
|
233 subband_ll = 0,
|
yading@10
|
234 subband_hl = 1,
|
yading@10
|
235 subband_lh = 2,
|
yading@10
|
236 subband_hh = 3
|
yading@10
|
237 };
|
yading@10
|
238
|
yading@10
|
239 static const uint8_t default_qmat[][4][4] = {
|
yading@10
|
240 { { 5, 3, 3, 0}, { 0, 4, 4, 1}, { 0, 5, 5, 2}, { 0, 6, 6, 3} },
|
yading@10
|
241 { { 4, 2, 2, 0}, { 0, 4, 4, 2}, { 0, 5, 5, 3}, { 0, 7, 7, 5} },
|
yading@10
|
242 { { 5, 3, 3, 0}, { 0, 4, 4, 1}, { 0, 5, 5, 2}, { 0, 6, 6, 3} },
|
yading@10
|
243 { { 8, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0} },
|
yading@10
|
244 { { 8, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0} },
|
yading@10
|
245 { { 0, 4, 4, 8}, { 0, 8, 8, 12}, { 0, 13, 13, 17}, { 0, 17, 17, 21} },
|
yading@10
|
246 { { 3, 1, 1, 0}, { 0, 4, 4, 2}, { 0, 6, 6, 5}, { 0, 9, 9, 7} },
|
yading@10
|
247 };
|
yading@10
|
248
|
yading@10
|
249 static const int qscale_tab[MAX_QUANT+1] = {
|
yading@10
|
250 4, 5, 6, 7, 8, 10, 11, 13,
|
yading@10
|
251 16, 19, 23, 27, 32, 38, 45, 54,
|
yading@10
|
252 64, 76, 91, 108, 128, 152, 181, 215,
|
yading@10
|
253 256, 304, 362, 431, 512, 609, 724, 861,
|
yading@10
|
254 1024, 1218, 1448, 1722, 2048, 2435, 2896, 3444,
|
yading@10
|
255 4096, 4871, 5793, 6889, 8192, 9742, 11585, 13777,
|
yading@10
|
256 16384, 19484, 23170, 27554, 32768, 38968, 46341, 55109,
|
yading@10
|
257 65536, 77936
|
yading@10
|
258 };
|
yading@10
|
259
|
yading@10
|
260 static const int qoffset_intra_tab[MAX_QUANT+1] = {
|
yading@10
|
261 1, 2, 3, 4, 4, 5, 6, 7,
|
yading@10
|
262 8, 10, 12, 14, 16, 19, 23, 27,
|
yading@10
|
263 32, 38, 46, 54, 64, 76, 91, 108,
|
yading@10
|
264 128, 152, 181, 216, 256, 305, 362, 431,
|
yading@10
|
265 512, 609, 724, 861, 1024, 1218, 1448, 1722,
|
yading@10
|
266 2048, 2436, 2897, 3445, 4096, 4871, 5793, 6889,
|
yading@10
|
267 8192, 9742, 11585, 13777, 16384, 19484, 23171, 27555,
|
yading@10
|
268 32768, 38968
|
yading@10
|
269 };
|
yading@10
|
270
|
yading@10
|
271 static const int qoffset_inter_tab[MAX_QUANT+1] = {
|
yading@10
|
272 1, 2, 2, 3, 3, 4, 4, 5,
|
yading@10
|
273 6, 7, 9, 10, 12, 14, 17, 20,
|
yading@10
|
274 24, 29, 34, 41, 48, 57, 68, 81,
|
yading@10
|
275 96, 114, 136, 162, 192, 228, 272, 323,
|
yading@10
|
276 384, 457, 543, 646, 768, 913, 1086, 1292,
|
yading@10
|
277 1536, 1827, 2172, 2583, 3072, 3653, 4344, 5166,
|
yading@10
|
278 6144, 7307, 8689, 10333, 12288, 14613, 17378, 20666,
|
yading@10
|
279 24576, 29226
|
yading@10
|
280 };
|
yading@10
|
281
|
yading@10
|
282 /* magic number division by 3 from schroedinger */
|
yading@10
|
283 static inline int divide3(int x)
|
yading@10
|
284 {
|
yading@10
|
285 return ((x+1)*21845 + 10922) >> 16;
|
yading@10
|
286 }
|
yading@10
|
287
|
yading@10
|
288 static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum)
|
yading@10
|
289 {
|
yading@10
|
290 DiracFrame *remove_pic = NULL;
|
yading@10
|
291 int i, remove_idx = -1;
|
yading@10
|
292
|
yading@10
|
293 for (i = 0; framelist[i]; i++)
|
yading@10
|
294 if (framelist[i]->avframe.display_picture_number == picnum) {
|
yading@10
|
295 remove_pic = framelist[i];
|
yading@10
|
296 remove_idx = i;
|
yading@10
|
297 }
|
yading@10
|
298
|
yading@10
|
299 if (remove_pic)
|
yading@10
|
300 for (i = remove_idx; framelist[i]; i++)
|
yading@10
|
301 framelist[i] = framelist[i+1];
|
yading@10
|
302
|
yading@10
|
303 return remove_pic;
|
yading@10
|
304 }
|
yading@10
|
305
|
yading@10
|
306 static int add_frame(DiracFrame *framelist[], int maxframes, DiracFrame *frame)
|
yading@10
|
307 {
|
yading@10
|
308 int i;
|
yading@10
|
309 for (i = 0; i < maxframes; i++)
|
yading@10
|
310 if (!framelist[i]) {
|
yading@10
|
311 framelist[i] = frame;
|
yading@10
|
312 return 0;
|
yading@10
|
313 }
|
yading@10
|
314 return -1;
|
yading@10
|
315 }
|
yading@10
|
316
|
yading@10
|
317 static int alloc_sequence_buffers(DiracContext *s)
|
yading@10
|
318 {
|
yading@10
|
319 int sbwidth = DIVRNDUP(s->source.width, 4);
|
yading@10
|
320 int sbheight = DIVRNDUP(s->source.height, 4);
|
yading@10
|
321 int i, w, h, top_padding;
|
yading@10
|
322
|
yading@10
|
323 /* todo: think more about this / use or set Plane here */
|
yading@10
|
324 for (i = 0; i < 3; i++) {
|
yading@10
|
325 int max_xblen = MAX_BLOCKSIZE >> (i ? s->chroma_x_shift : 0);
|
yading@10
|
326 int max_yblen = MAX_BLOCKSIZE >> (i ? s->chroma_y_shift : 0);
|
yading@10
|
327 w = s->source.width >> (i ? s->chroma_x_shift : 0);
|
yading@10
|
328 h = s->source.height >> (i ? s->chroma_y_shift : 0);
|
yading@10
|
329
|
yading@10
|
330 /* we allocate the max we support here since num decompositions can
|
yading@10
|
331 * change from frame to frame. Stride is aligned to 16 for SIMD, and
|
yading@10
|
332 * 1<<MAX_DWT_LEVELS top padding to avoid if(y>0) in arith decoding
|
yading@10
|
333 * MAX_BLOCKSIZE padding for MC: blocks can spill up to half of that
|
yading@10
|
334 * on each side */
|
yading@10
|
335 top_padding = FFMAX(1<<MAX_DWT_LEVELS, max_yblen/2);
|
yading@10
|
336 w = FFALIGN(CALC_PADDING(w, MAX_DWT_LEVELS), 8); /* FIXME: Should this be 16 for SSE??? */
|
yading@10
|
337 h = top_padding + CALC_PADDING(h, MAX_DWT_LEVELS) + max_yblen/2;
|
yading@10
|
338
|
yading@10
|
339 s->plane[i].idwt_buf_base = av_mallocz((w+max_xblen)*h * sizeof(IDWTELEM));
|
yading@10
|
340 s->plane[i].idwt_tmp = av_malloc((w+16) * sizeof(IDWTELEM));
|
yading@10
|
341 s->plane[i].idwt_buf = s->plane[i].idwt_buf_base + top_padding*w;
|
yading@10
|
342 if (!s->plane[i].idwt_buf_base || !s->plane[i].idwt_tmp)
|
yading@10
|
343 return AVERROR(ENOMEM);
|
yading@10
|
344 }
|
yading@10
|
345
|
yading@10
|
346 w = s->source.width;
|
yading@10
|
347 h = s->source.height;
|
yading@10
|
348
|
yading@10
|
349 /* fixme: allocate using real stride here */
|
yading@10
|
350 s->sbsplit = av_malloc(sbwidth * sbheight);
|
yading@10
|
351 s->blmotion = av_malloc(sbwidth * sbheight * 16 * sizeof(*s->blmotion));
|
yading@10
|
352 s->edge_emu_buffer_base = av_malloc((w+64)*MAX_BLOCKSIZE);
|
yading@10
|
353
|
yading@10
|
354 s->mctmp = av_malloc((w+64+MAX_BLOCKSIZE) * (h+MAX_BLOCKSIZE) * sizeof(*s->mctmp));
|
yading@10
|
355 s->mcscratch = av_malloc((w+64)*MAX_BLOCKSIZE);
|
yading@10
|
356
|
yading@10
|
357 if (!s->sbsplit || !s->blmotion || !s->mctmp || !s->mcscratch)
|
yading@10
|
358 return AVERROR(ENOMEM);
|
yading@10
|
359 return 0;
|
yading@10
|
360 }
|
yading@10
|
361
|
yading@10
|
362 static void free_sequence_buffers(DiracContext *s)
|
yading@10
|
363 {
|
yading@10
|
364 int i, j, k;
|
yading@10
|
365
|
yading@10
|
366 for (i = 0; i < MAX_FRAMES; i++) {
|
yading@10
|
367 if (s->all_frames[i].avframe.data[0]) {
|
yading@10
|
368 av_frame_unref(&s->all_frames[i].avframe);
|
yading@10
|
369 memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
|
yading@10
|
370 }
|
yading@10
|
371
|
yading@10
|
372 for (j = 0; j < 3; j++)
|
yading@10
|
373 for (k = 1; k < 4; k++)
|
yading@10
|
374 av_freep(&s->all_frames[i].hpel_base[j][k]);
|
yading@10
|
375 }
|
yading@10
|
376
|
yading@10
|
377 memset(s->ref_frames, 0, sizeof(s->ref_frames));
|
yading@10
|
378 memset(s->delay_frames, 0, sizeof(s->delay_frames));
|
yading@10
|
379
|
yading@10
|
380 for (i = 0; i < 3; i++) {
|
yading@10
|
381 av_freep(&s->plane[i].idwt_buf_base);
|
yading@10
|
382 av_freep(&s->plane[i].idwt_tmp);
|
yading@10
|
383 }
|
yading@10
|
384
|
yading@10
|
385 av_freep(&s->sbsplit);
|
yading@10
|
386 av_freep(&s->blmotion);
|
yading@10
|
387 av_freep(&s->edge_emu_buffer_base);
|
yading@10
|
388
|
yading@10
|
389 av_freep(&s->mctmp);
|
yading@10
|
390 av_freep(&s->mcscratch);
|
yading@10
|
391 }
|
yading@10
|
392
|
yading@10
|
393 static av_cold int dirac_decode_init(AVCodecContext *avctx)
|
yading@10
|
394 {
|
yading@10
|
395 DiracContext *s = avctx->priv_data;
|
yading@10
|
396 s->avctx = avctx;
|
yading@10
|
397 s->frame_number = -1;
|
yading@10
|
398
|
yading@10
|
399 if (avctx->flags&CODEC_FLAG_EMU_EDGE) {
|
yading@10
|
400 av_log(avctx, AV_LOG_ERROR, "Edge emulation not supported!\n");
|
yading@10
|
401 return AVERROR_PATCHWELCOME;
|
yading@10
|
402 }
|
yading@10
|
403
|
yading@10
|
404 ff_dsputil_init(&s->dsp, avctx);
|
yading@10
|
405 ff_diracdsp_init(&s->diracdsp);
|
yading@10
|
406
|
yading@10
|
407 return 0;
|
yading@10
|
408 }
|
yading@10
|
409
|
yading@10
|
410 static void dirac_decode_flush(AVCodecContext *avctx)
|
yading@10
|
411 {
|
yading@10
|
412 DiracContext *s = avctx->priv_data;
|
yading@10
|
413 free_sequence_buffers(s);
|
yading@10
|
414 s->seen_sequence_header = 0;
|
yading@10
|
415 s->frame_number = -1;
|
yading@10
|
416 }
|
yading@10
|
417
|
yading@10
|
418 static av_cold int dirac_decode_end(AVCodecContext *avctx)
|
yading@10
|
419 {
|
yading@10
|
420 dirac_decode_flush(avctx);
|
yading@10
|
421 return 0;
|
yading@10
|
422 }
|
yading@10
|
423
|
yading@10
|
424 #define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0))
|
yading@10
|
425
|
yading@10
|
426 static inline void coeff_unpack_arith(DiracArith *c, int qfactor, int qoffset,
|
yading@10
|
427 SubBand *b, IDWTELEM *buf, int x, int y)
|
yading@10
|
428 {
|
yading@10
|
429 int coeff, sign;
|
yading@10
|
430 int sign_pred = 0;
|
yading@10
|
431 int pred_ctx = CTX_ZPZN_F1;
|
yading@10
|
432
|
yading@10
|
433 /* Check if the parent subband has a 0 in the corresponding position */
|
yading@10
|
434 if (b->parent)
|
yading@10
|
435 pred_ctx += !!b->parent->ibuf[b->parent->stride * (y>>1) + (x>>1)] << 1;
|
yading@10
|
436
|
yading@10
|
437 if (b->orientation == subband_hl)
|
yading@10
|
438 sign_pred = buf[-b->stride];
|
yading@10
|
439
|
yading@10
|
440 /* Determine if the pixel has only zeros in its neighbourhood */
|
yading@10
|
441 if (x) {
|
yading@10
|
442 pred_ctx += !(buf[-1] | buf[-b->stride] | buf[-1-b->stride]);
|
yading@10
|
443 if (b->orientation == subband_lh)
|
yading@10
|
444 sign_pred = buf[-1];
|
yading@10
|
445 } else {
|
yading@10
|
446 pred_ctx += !buf[-b->stride];
|
yading@10
|
447 }
|
yading@10
|
448
|
yading@10
|
449 coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA);
|
yading@10
|
450 if (coeff) {
|
yading@10
|
451 coeff = (coeff * qfactor + qoffset + 2) >> 2;
|
yading@10
|
452 sign = dirac_get_arith_bit(c, SIGN_CTX(sign_pred));
|
yading@10
|
453 coeff = (coeff ^ -sign) + sign;
|
yading@10
|
454 }
|
yading@10
|
455 *buf = coeff;
|
yading@10
|
456 }
|
yading@10
|
457
|
yading@10
|
458 static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
|
yading@10
|
459 {
|
yading@10
|
460 int sign, coeff;
|
yading@10
|
461
|
yading@10
|
462 coeff = svq3_get_ue_golomb(gb);
|
yading@10
|
463 if (coeff) {
|
yading@10
|
464 coeff = (coeff * qfactor + qoffset + 2) >> 2;
|
yading@10
|
465 sign = get_bits1(gb);
|
yading@10
|
466 coeff = (coeff ^ -sign) + sign;
|
yading@10
|
467 }
|
yading@10
|
468 return coeff;
|
yading@10
|
469 }
|
yading@10
|
470
|
yading@10
|
471 /**
|
yading@10
|
472 * Decode the coeffs in the rectangle defined by left, right, top, bottom
|
yading@10
|
473 * [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock()
|
yading@10
|
474 */
|
yading@10
|
475 static inline void codeblock(DiracContext *s, SubBand *b,
|
yading@10
|
476 GetBitContext *gb, DiracArith *c,
|
yading@10
|
477 int left, int right, int top, int bottom,
|
yading@10
|
478 int blockcnt_one, int is_arith)
|
yading@10
|
479 {
|
yading@10
|
480 int x, y, zero_block;
|
yading@10
|
481 int qoffset, qfactor;
|
yading@10
|
482 IDWTELEM *buf;
|
yading@10
|
483
|
yading@10
|
484 /* check for any coded coefficients in this codeblock */
|
yading@10
|
485 if (!blockcnt_one) {
|
yading@10
|
486 if (is_arith)
|
yading@10
|
487 zero_block = dirac_get_arith_bit(c, CTX_ZERO_BLOCK);
|
yading@10
|
488 else
|
yading@10
|
489 zero_block = get_bits1(gb);
|
yading@10
|
490
|
yading@10
|
491 if (zero_block)
|
yading@10
|
492 return;
|
yading@10
|
493 }
|
yading@10
|
494
|
yading@10
|
495 if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
|
yading@10
|
496 int quant = b->quant;
|
yading@10
|
497 if (is_arith)
|
yading@10
|
498 quant += dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA);
|
yading@10
|
499 else
|
yading@10
|
500 quant += dirac_get_se_golomb(gb);
|
yading@10
|
501 if (quant < 0) {
|
yading@10
|
502 av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n");
|
yading@10
|
503 return;
|
yading@10
|
504 }
|
yading@10
|
505 b->quant = quant;
|
yading@10
|
506 }
|
yading@10
|
507
|
yading@10
|
508 b->quant = FFMIN(b->quant, MAX_QUANT);
|
yading@10
|
509
|
yading@10
|
510 qfactor = qscale_tab[b->quant];
|
yading@10
|
511 /* TODO: context pointer? */
|
yading@10
|
512 if (!s->num_refs)
|
yading@10
|
513 qoffset = qoffset_intra_tab[b->quant];
|
yading@10
|
514 else
|
yading@10
|
515 qoffset = qoffset_inter_tab[b->quant];
|
yading@10
|
516
|
yading@10
|
517 buf = b->ibuf + top * b->stride;
|
yading@10
|
518 for (y = top; y < bottom; y++) {
|
yading@10
|
519 for (x = left; x < right; x++) {
|
yading@10
|
520 /* [DIRAC_STD] 13.4.4 Subband coefficients. coeff_unpack() */
|
yading@10
|
521 if (is_arith)
|
yading@10
|
522 coeff_unpack_arith(c, qfactor, qoffset, b, buf+x, x, y);
|
yading@10
|
523 else
|
yading@10
|
524 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset);
|
yading@10
|
525 }
|
yading@10
|
526 buf += b->stride;
|
yading@10
|
527 }
|
yading@10
|
528 }
|
yading@10
|
529
|
yading@10
|
530 /**
|
yading@10
|
531 * Dirac Specification ->
|
yading@10
|
532 * 13.3 intra_dc_prediction(band)
|
yading@10
|
533 */
|
yading@10
|
534 static inline void intra_dc_prediction(SubBand *b)
|
yading@10
|
535 {
|
yading@10
|
536 IDWTELEM *buf = b->ibuf;
|
yading@10
|
537 int x, y;
|
yading@10
|
538
|
yading@10
|
539 for (x = 1; x < b->width; x++)
|
yading@10
|
540 buf[x] += buf[x-1];
|
yading@10
|
541 buf += b->stride;
|
yading@10
|
542
|
yading@10
|
543 for (y = 1; y < b->height; y++) {
|
yading@10
|
544 buf[0] += buf[-b->stride];
|
yading@10
|
545
|
yading@10
|
546 for (x = 1; x < b->width; x++) {
|
yading@10
|
547 int pred = buf[x - 1] + buf[x - b->stride] + buf[x - b->stride-1];
|
yading@10
|
548 buf[x] += divide3(pred);
|
yading@10
|
549 }
|
yading@10
|
550 buf += b->stride;
|
yading@10
|
551 }
|
yading@10
|
552 }
|
yading@10
|
553
|
yading@10
|
554 /**
|
yading@10
|
555 * Dirac Specification ->
|
yading@10
|
556 * 13.4.2 Non-skipped subbands. subband_coeffs()
|
yading@10
|
557 */
|
yading@10
|
558 static av_always_inline void decode_subband_internal(DiracContext *s, SubBand *b, int is_arith)
|
yading@10
|
559 {
|
yading@10
|
560 int cb_x, cb_y, left, right, top, bottom;
|
yading@10
|
561 DiracArith c;
|
yading@10
|
562 GetBitContext gb;
|
yading@10
|
563 int cb_width = s->codeblock[b->level + (b->orientation != subband_ll)].width;
|
yading@10
|
564 int cb_height = s->codeblock[b->level + (b->orientation != subband_ll)].height;
|
yading@10
|
565 int blockcnt_one = (cb_width + cb_height) == 2;
|
yading@10
|
566
|
yading@10
|
567 if (!b->length)
|
yading@10
|
568 return;
|
yading@10
|
569
|
yading@10
|
570 init_get_bits(&gb, b->coeff_data, b->length*8);
|
yading@10
|
571
|
yading@10
|
572 if (is_arith)
|
yading@10
|
573 ff_dirac_init_arith_decoder(&c, &gb, b->length);
|
yading@10
|
574
|
yading@10
|
575 top = 0;
|
yading@10
|
576 for (cb_y = 0; cb_y < cb_height; cb_y++) {
|
yading@10
|
577 bottom = (b->height * (cb_y+1)) / cb_height;
|
yading@10
|
578 left = 0;
|
yading@10
|
579 for (cb_x = 0; cb_x < cb_width; cb_x++) {
|
yading@10
|
580 right = (b->width * (cb_x+1)) / cb_width;
|
yading@10
|
581 codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith);
|
yading@10
|
582 left = right;
|
yading@10
|
583 }
|
yading@10
|
584 top = bottom;
|
yading@10
|
585 }
|
yading@10
|
586
|
yading@10
|
587 if (b->orientation == subband_ll && s->num_refs == 0)
|
yading@10
|
588 intra_dc_prediction(b);
|
yading@10
|
589 }
|
yading@10
|
590
|
yading@10
|
591 static int decode_subband_arith(AVCodecContext *avctx, void *b)
|
yading@10
|
592 {
|
yading@10
|
593 DiracContext *s = avctx->priv_data;
|
yading@10
|
594 decode_subband_internal(s, b, 1);
|
yading@10
|
595 return 0;
|
yading@10
|
596 }
|
yading@10
|
597
|
yading@10
|
598 static int decode_subband_golomb(AVCodecContext *avctx, void *arg)
|
yading@10
|
599 {
|
yading@10
|
600 DiracContext *s = avctx->priv_data;
|
yading@10
|
601 SubBand **b = arg;
|
yading@10
|
602 decode_subband_internal(s, *b, 0);
|
yading@10
|
603 return 0;
|
yading@10
|
604 }
|
yading@10
|
605
|
yading@10
|
606 /**
|
yading@10
|
607 * Dirac Specification ->
|
yading@10
|
608 * [DIRAC_STD] 13.4.1 core_transform_data()
|
yading@10
|
609 */
|
yading@10
|
610 static void decode_component(DiracContext *s, int comp)
|
yading@10
|
611 {
|
yading@10
|
612 AVCodecContext *avctx = s->avctx;
|
yading@10
|
613 SubBand *bands[3*MAX_DWT_LEVELS+1];
|
yading@10
|
614 enum dirac_subband orientation;
|
yading@10
|
615 int level, num_bands = 0;
|
yading@10
|
616
|
yading@10
|
617 /* Unpack all subbands at all levels. */
|
yading@10
|
618 for (level = 0; level < s->wavelet_depth; level++) {
|
yading@10
|
619 for (orientation = !!level; orientation < 4; orientation++) {
|
yading@10
|
620 SubBand *b = &s->plane[comp].band[level][orientation];
|
yading@10
|
621 bands[num_bands++] = b;
|
yading@10
|
622
|
yading@10
|
623 align_get_bits(&s->gb);
|
yading@10
|
624 /* [DIRAC_STD] 13.4.2 subband() */
|
yading@10
|
625 b->length = svq3_get_ue_golomb(&s->gb);
|
yading@10
|
626 if (b->length) {
|
yading@10
|
627 b->quant = svq3_get_ue_golomb(&s->gb);
|
yading@10
|
628 align_get_bits(&s->gb);
|
yading@10
|
629 b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
|
yading@10
|
630 b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
|
yading@10
|
631 skip_bits_long(&s->gb, b->length*8);
|
yading@10
|
632 }
|
yading@10
|
633 }
|
yading@10
|
634 /* arithmetic coding has inter-level dependencies, so we can only execute one level at a time */
|
yading@10
|
635 if (s->is_arith)
|
yading@10
|
636 avctx->execute(avctx, decode_subband_arith, &s->plane[comp].band[level][!!level],
|
yading@10
|
637 NULL, 4-!!level, sizeof(SubBand));
|
yading@10
|
638 }
|
yading@10
|
639 /* golomb coding has no inter-level dependencies, so we can execute all subbands in parallel */
|
yading@10
|
640 if (!s->is_arith)
|
yading@10
|
641 avctx->execute(avctx, decode_subband_golomb, bands, NULL, num_bands, sizeof(SubBand*));
|
yading@10
|
642 }
|
yading@10
|
643
|
yading@10
|
644 /* [DIRAC_STD] 13.5.5.2 Luma slice subband data. luma_slice_band(level,orient,sx,sy) --> if b2 == NULL */
|
yading@10
|
645 /* [DIRAC_STD] 13.5.5.3 Chroma slice subband data. chroma_slice_band(level,orient,sx,sy) --> if b2 != NULL */
|
yading@10
|
646 static void lowdelay_subband(DiracContext *s, GetBitContext *gb, int quant,
|
yading@10
|
647 int slice_x, int slice_y, int bits_end,
|
yading@10
|
648 SubBand *b1, SubBand *b2)
|
yading@10
|
649 {
|
yading@10
|
650 int left = b1->width * slice_x / s->lowdelay.num_x;
|
yading@10
|
651 int right = b1->width *(slice_x+1) / s->lowdelay.num_x;
|
yading@10
|
652 int top = b1->height * slice_y / s->lowdelay.num_y;
|
yading@10
|
653 int bottom = b1->height *(slice_y+1) / s->lowdelay.num_y;
|
yading@10
|
654
|
yading@10
|
655 int qfactor = qscale_tab[FFMIN(quant, MAX_QUANT)];
|
yading@10
|
656 int qoffset = qoffset_intra_tab[FFMIN(quant, MAX_QUANT)];
|
yading@10
|
657
|
yading@10
|
658 IDWTELEM *buf1 = b1->ibuf + top * b1->stride;
|
yading@10
|
659 IDWTELEM *buf2 = b2 ? b2->ibuf + top * b2->stride : NULL;
|
yading@10
|
660 int x, y;
|
yading@10
|
661 /* we have to constantly check for overread since the spec explictly
|
yading@10
|
662 requires this, with the meaning that all remaining coeffs are set to 0 */
|
yading@10
|
663 if (get_bits_count(gb) >= bits_end)
|
yading@10
|
664 return;
|
yading@10
|
665
|
yading@10
|
666 for (y = top; y < bottom; y++) {
|
yading@10
|
667 for (x = left; x < right; x++) {
|
yading@10
|
668 buf1[x] = coeff_unpack_golomb(gb, qfactor, qoffset);
|
yading@10
|
669 if (get_bits_count(gb) >= bits_end)
|
yading@10
|
670 return;
|
yading@10
|
671 if (buf2) {
|
yading@10
|
672 buf2[x] = coeff_unpack_golomb(gb, qfactor, qoffset);
|
yading@10
|
673 if (get_bits_count(gb) >= bits_end)
|
yading@10
|
674 return;
|
yading@10
|
675 }
|
yading@10
|
676 }
|
yading@10
|
677 buf1 += b1->stride;
|
yading@10
|
678 if (buf2)
|
yading@10
|
679 buf2 += b2->stride;
|
yading@10
|
680 }
|
yading@10
|
681 }
|
yading@10
|
682
|
yading@10
|
683 struct lowdelay_slice {
|
yading@10
|
684 GetBitContext gb;
|
yading@10
|
685 int slice_x;
|
yading@10
|
686 int slice_y;
|
yading@10
|
687 int bytes;
|
yading@10
|
688 };
|
yading@10
|
689
|
yading@10
|
690
|
yading@10
|
691 /**
|
yading@10
|
692 * Dirac Specification ->
|
yading@10
|
693 * 13.5.2 Slices. slice(sx,sy)
|
yading@10
|
694 */
|
yading@10
|
695 static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
|
yading@10
|
696 {
|
yading@10
|
697 DiracContext *s = avctx->priv_data;
|
yading@10
|
698 struct lowdelay_slice *slice = arg;
|
yading@10
|
699 GetBitContext *gb = &slice->gb;
|
yading@10
|
700 enum dirac_subband orientation;
|
yading@10
|
701 int level, quant, chroma_bits, chroma_end;
|
yading@10
|
702
|
yading@10
|
703 int quant_base = get_bits(gb, 7); /*[DIRAC_STD] qindex */
|
yading@10
|
704 int length_bits = av_log2(8 * slice->bytes)+1;
|
yading@10
|
705 int luma_bits = get_bits_long(gb, length_bits);
|
yading@10
|
706 int luma_end = get_bits_count(gb) + FFMIN(luma_bits, get_bits_left(gb));
|
yading@10
|
707
|
yading@10
|
708 /* [DIRAC_STD] 13.5.5.2 luma_slice_band */
|
yading@10
|
709 for (level = 0; level < s->wavelet_depth; level++)
|
yading@10
|
710 for (orientation = !!level; orientation < 4; orientation++) {
|
yading@10
|
711 quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
|
yading@10
|
712 lowdelay_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end,
|
yading@10
|
713 &s->plane[0].band[level][orientation], NULL);
|
yading@10
|
714 }
|
yading@10
|
715
|
yading@10
|
716 /* consume any unused bits from luma */
|
yading@10
|
717 skip_bits_long(gb, get_bits_count(gb) - luma_end);
|
yading@10
|
718
|
yading@10
|
719 chroma_bits = 8*slice->bytes - 7 - length_bits - luma_bits;
|
yading@10
|
720 chroma_end = get_bits_count(gb) + FFMIN(chroma_bits, get_bits_left(gb));
|
yading@10
|
721 /* [DIRAC_STD] 13.5.5.3 chroma_slice_band */
|
yading@10
|
722 for (level = 0; level < s->wavelet_depth; level++)
|
yading@10
|
723 for (orientation = !!level; orientation < 4; orientation++) {
|
yading@10
|
724 quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
|
yading@10
|
725 lowdelay_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end,
|
yading@10
|
726 &s->plane[1].band[level][orientation],
|
yading@10
|
727 &s->plane[2].band[level][orientation]);
|
yading@10
|
728 }
|
yading@10
|
729
|
yading@10
|
730 return 0;
|
yading@10
|
731 }
|
yading@10
|
732
|
yading@10
|
733 /**
|
yading@10
|
734 * Dirac Specification ->
|
yading@10
|
735 * 13.5.1 low_delay_transform_data()
|
yading@10
|
736 */
|
yading@10
|
737 static void decode_lowdelay(DiracContext *s)
|
yading@10
|
738 {
|
yading@10
|
739 AVCodecContext *avctx = s->avctx;
|
yading@10
|
740 int slice_x, slice_y, bytes, bufsize;
|
yading@10
|
741 const uint8_t *buf;
|
yading@10
|
742 struct lowdelay_slice *slices;
|
yading@10
|
743 int slice_num = 0;
|
yading@10
|
744
|
yading@10
|
745 slices = av_mallocz(s->lowdelay.num_x * s->lowdelay.num_y * sizeof(struct lowdelay_slice));
|
yading@10
|
746
|
yading@10
|
747 align_get_bits(&s->gb);
|
yading@10
|
748 /*[DIRAC_STD] 13.5.2 Slices. slice(sx,sy) */
|
yading@10
|
749 buf = s->gb.buffer + get_bits_count(&s->gb)/8;
|
yading@10
|
750 bufsize = get_bits_left(&s->gb);
|
yading@10
|
751
|
yading@10
|
752 for (slice_y = 0; bufsize > 0 && slice_y < s->lowdelay.num_y; slice_y++)
|
yading@10
|
753 for (slice_x = 0; bufsize > 0 && slice_x < s->lowdelay.num_x; slice_x++) {
|
yading@10
|
754 bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
|
yading@10
|
755 - slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
|
yading@10
|
756
|
yading@10
|
757 slices[slice_num].bytes = bytes;
|
yading@10
|
758 slices[slice_num].slice_x = slice_x;
|
yading@10
|
759 slices[slice_num].slice_y = slice_y;
|
yading@10
|
760 init_get_bits(&slices[slice_num].gb, buf, bufsize);
|
yading@10
|
761 slice_num++;
|
yading@10
|
762
|
yading@10
|
763 buf += bytes;
|
yading@10
|
764 bufsize -= bytes*8;
|
yading@10
|
765 }
|
yading@10
|
766
|
yading@10
|
767 avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
|
yading@10
|
768 sizeof(struct lowdelay_slice)); /* [DIRAC_STD] 13.5.2 Slices */
|
yading@10
|
769 intra_dc_prediction(&s->plane[0].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
|
yading@10
|
770 intra_dc_prediction(&s->plane[1].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
|
yading@10
|
771 intra_dc_prediction(&s->plane[2].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
|
yading@10
|
772 av_free(slices);
|
yading@10
|
773 }
|
yading@10
|
774
|
yading@10
|
775 static void init_planes(DiracContext *s)
|
yading@10
|
776 {
|
yading@10
|
777 int i, w, h, level, orientation;
|
yading@10
|
778
|
yading@10
|
779 for (i = 0; i < 3; i++) {
|
yading@10
|
780 Plane *p = &s->plane[i];
|
yading@10
|
781
|
yading@10
|
782 p->width = s->source.width >> (i ? s->chroma_x_shift : 0);
|
yading@10
|
783 p->height = s->source.height >> (i ? s->chroma_y_shift : 0);
|
yading@10
|
784 p->idwt_width = w = CALC_PADDING(p->width , s->wavelet_depth);
|
yading@10
|
785 p->idwt_height = h = CALC_PADDING(p->height, s->wavelet_depth);
|
yading@10
|
786 p->idwt_stride = FFALIGN(p->idwt_width, 8);
|
yading@10
|
787
|
yading@10
|
788 for (level = s->wavelet_depth-1; level >= 0; level--) {
|
yading@10
|
789 w = w>>1;
|
yading@10
|
790 h = h>>1;
|
yading@10
|
791 for (orientation = !!level; orientation < 4; orientation++) {
|
yading@10
|
792 SubBand *b = &p->band[level][orientation];
|
yading@10
|
793
|
yading@10
|
794 b->ibuf = p->idwt_buf;
|
yading@10
|
795 b->level = level;
|
yading@10
|
796 b->stride = p->idwt_stride << (s->wavelet_depth - level);
|
yading@10
|
797 b->width = w;
|
yading@10
|
798 b->height = h;
|
yading@10
|
799 b->orientation = orientation;
|
yading@10
|
800
|
yading@10
|
801 if (orientation & 1)
|
yading@10
|
802 b->ibuf += w;
|
yading@10
|
803 if (orientation > 1)
|
yading@10
|
804 b->ibuf += b->stride>>1;
|
yading@10
|
805
|
yading@10
|
806 if (level)
|
yading@10
|
807 b->parent = &p->band[level-1][orientation];
|
yading@10
|
808 }
|
yading@10
|
809 }
|
yading@10
|
810
|
yading@10
|
811 if (i > 0) {
|
yading@10
|
812 p->xblen = s->plane[0].xblen >> s->chroma_x_shift;
|
yading@10
|
813 p->yblen = s->plane[0].yblen >> s->chroma_y_shift;
|
yading@10
|
814 p->xbsep = s->plane[0].xbsep >> s->chroma_x_shift;
|
yading@10
|
815 p->ybsep = s->plane[0].ybsep >> s->chroma_y_shift;
|
yading@10
|
816 }
|
yading@10
|
817
|
yading@10
|
818 p->xoffset = (p->xblen - p->xbsep)/2;
|
yading@10
|
819 p->yoffset = (p->yblen - p->ybsep)/2;
|
yading@10
|
820 }
|
yading@10
|
821 }
|
yading@10
|
822
|
yading@10
|
823 /**
|
yading@10
|
824 * Unpack the motion compensation parameters
|
yading@10
|
825 * Dirac Specification ->
|
yading@10
|
826 * 11.2 Picture prediction data. picture_prediction()
|
yading@10
|
827 */
|
yading@10
|
828 static int dirac_unpack_prediction_parameters(DiracContext *s)
|
yading@10
|
829 {
|
yading@10
|
830 static const uint8_t default_blen[] = { 4, 12, 16, 24 };
|
yading@10
|
831 static const uint8_t default_bsep[] = { 4, 8, 12, 16 };
|
yading@10
|
832
|
yading@10
|
833 GetBitContext *gb = &s->gb;
|
yading@10
|
834 unsigned idx, ref;
|
yading@10
|
835
|
yading@10
|
836 align_get_bits(gb);
|
yading@10
|
837 /* [DIRAC_STD] 11.2.2 Block parameters. block_parameters() */
|
yading@10
|
838 /* Luma and Chroma are equal. 11.2.3 */
|
yading@10
|
839 idx = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
|
yading@10
|
840
|
yading@10
|
841 if (idx > 4) {
|
yading@10
|
842 av_log(s->avctx, AV_LOG_ERROR, "Block prediction index too high\n");
|
yading@10
|
843 return -1;
|
yading@10
|
844 }
|
yading@10
|
845
|
yading@10
|
846 if (idx == 0) {
|
yading@10
|
847 s->plane[0].xblen = svq3_get_ue_golomb(gb);
|
yading@10
|
848 s->plane[0].yblen = svq3_get_ue_golomb(gb);
|
yading@10
|
849 s->plane[0].xbsep = svq3_get_ue_golomb(gb);
|
yading@10
|
850 s->plane[0].ybsep = svq3_get_ue_golomb(gb);
|
yading@10
|
851 } else {
|
yading@10
|
852 /*[DIRAC_STD] preset_block_params(index). Table 11.1 */
|
yading@10
|
853 s->plane[0].xblen = default_blen[idx-1];
|
yading@10
|
854 s->plane[0].yblen = default_blen[idx-1];
|
yading@10
|
855 s->plane[0].xbsep = default_bsep[idx-1];
|
yading@10
|
856 s->plane[0].ybsep = default_bsep[idx-1];
|
yading@10
|
857 }
|
yading@10
|
858 /*[DIRAC_STD] 11.2.4 motion_data_dimensions()
|
yading@10
|
859 Calculated in function dirac_unpack_block_motion_data */
|
yading@10
|
860
|
yading@10
|
861 if (!s->plane[0].xbsep || !s->plane[0].ybsep || s->plane[0].xbsep < s->plane[0].xblen/2 || s->plane[0].ybsep < s->plane[0].yblen/2) {
|
yading@10
|
862 av_log(s->avctx, AV_LOG_ERROR, "Block separation too small\n");
|
yading@10
|
863 return -1;
|
yading@10
|
864 }
|
yading@10
|
865 if (s->plane[0].xbsep > s->plane[0].xblen || s->plane[0].ybsep > s->plane[0].yblen) {
|
yading@10
|
866 av_log(s->avctx, AV_LOG_ERROR, "Block separation greater than size\n");
|
yading@10
|
867 return -1;
|
yading@10
|
868 }
|
yading@10
|
869 if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > MAX_BLOCKSIZE) {
|
yading@10
|
870 av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n");
|
yading@10
|
871 return -1;
|
yading@10
|
872 }
|
yading@10
|
873
|
yading@10
|
874 /*[DIRAC_STD] 11.2.5 Motion vector precision. motion_vector_precision()
|
yading@10
|
875 Read motion vector precision */
|
yading@10
|
876 s->mv_precision = svq3_get_ue_golomb(gb);
|
yading@10
|
877 if (s->mv_precision > 3) {
|
yading@10
|
878 av_log(s->avctx, AV_LOG_ERROR, "MV precision finer than eighth-pel\n");
|
yading@10
|
879 return -1;
|
yading@10
|
880 }
|
yading@10
|
881
|
yading@10
|
882 /*[DIRAC_STD] 11.2.6 Global motion. global_motion()
|
yading@10
|
883 Read the global motion compensation parameters */
|
yading@10
|
884 s->globalmc_flag = get_bits1(gb);
|
yading@10
|
885 if (s->globalmc_flag) {
|
yading@10
|
886 memset(s->globalmc, 0, sizeof(s->globalmc));
|
yading@10
|
887 /* [DIRAC_STD] pan_tilt(gparams) */
|
yading@10
|
888 for (ref = 0; ref < s->num_refs; ref++) {
|
yading@10
|
889 if (get_bits1(gb)) {
|
yading@10
|
890 s->globalmc[ref].pan_tilt[0] = dirac_get_se_golomb(gb);
|
yading@10
|
891 s->globalmc[ref].pan_tilt[1] = dirac_get_se_golomb(gb);
|
yading@10
|
892 }
|
yading@10
|
893 /* [DIRAC_STD] zoom_rotate_shear(gparams)
|
yading@10
|
894 zoom/rotation/shear parameters */
|
yading@10
|
895 if (get_bits1(gb)) {
|
yading@10
|
896 s->globalmc[ref].zrs_exp = svq3_get_ue_golomb(gb);
|
yading@10
|
897 s->globalmc[ref].zrs[0][0] = dirac_get_se_golomb(gb);
|
yading@10
|
898 s->globalmc[ref].zrs[0][1] = dirac_get_se_golomb(gb);
|
yading@10
|
899 s->globalmc[ref].zrs[1][0] = dirac_get_se_golomb(gb);
|
yading@10
|
900 s->globalmc[ref].zrs[1][1] = dirac_get_se_golomb(gb);
|
yading@10
|
901 } else {
|
yading@10
|
902 s->globalmc[ref].zrs[0][0] = 1;
|
yading@10
|
903 s->globalmc[ref].zrs[1][1] = 1;
|
yading@10
|
904 }
|
yading@10
|
905 /* [DIRAC_STD] perspective(gparams) */
|
yading@10
|
906 if (get_bits1(gb)) {
|
yading@10
|
907 s->globalmc[ref].perspective_exp = svq3_get_ue_golomb(gb);
|
yading@10
|
908 s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb);
|
yading@10
|
909 s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb);
|
yading@10
|
910 }
|
yading@10
|
911 }
|
yading@10
|
912 }
|
yading@10
|
913
|
yading@10
|
914 /*[DIRAC_STD] 11.2.7 Picture prediction mode. prediction_mode()
|
yading@10
|
915 Picture prediction mode, not currently used. */
|
yading@10
|
916 if (svq3_get_ue_golomb(gb)) {
|
yading@10
|
917 av_log(s->avctx, AV_LOG_ERROR, "Unknown picture prediction mode\n");
|
yading@10
|
918 return -1;
|
yading@10
|
919 }
|
yading@10
|
920
|
yading@10
|
921 /* [DIRAC_STD] 11.2.8 Reference picture weight. reference_picture_weights()
|
yading@10
|
922 just data read, weight calculation will be done later on. */
|
yading@10
|
923 s->weight_log2denom = 1;
|
yading@10
|
924 s->weight[0] = 1;
|
yading@10
|
925 s->weight[1] = 1;
|
yading@10
|
926
|
yading@10
|
927 if (get_bits1(gb)) {
|
yading@10
|
928 s->weight_log2denom = svq3_get_ue_golomb(gb);
|
yading@10
|
929 s->weight[0] = dirac_get_se_golomb(gb);
|
yading@10
|
930 if (s->num_refs == 2)
|
yading@10
|
931 s->weight[1] = dirac_get_se_golomb(gb);
|
yading@10
|
932 }
|
yading@10
|
933 return 0;
|
yading@10
|
934 }
|
yading@10
|
935
|
yading@10
|
936 /**
|
yading@10
|
937 * Dirac Specification ->
|
yading@10
|
938 * 11.3 Wavelet transform data. wavelet_transform()
|
yading@10
|
939 */
|
yading@10
|
940 static int dirac_unpack_idwt_params(DiracContext *s)
|
yading@10
|
941 {
|
yading@10
|
942 GetBitContext *gb = &s->gb;
|
yading@10
|
943 int i, level;
|
yading@10
|
944 unsigned tmp;
|
yading@10
|
945
|
yading@10
|
946 #define CHECKEDREAD(dst, cond, errmsg) \
|
yading@10
|
947 tmp = svq3_get_ue_golomb(gb); \
|
yading@10
|
948 if (cond) { \
|
yading@10
|
949 av_log(s->avctx, AV_LOG_ERROR, errmsg); \
|
yading@10
|
950 return -1; \
|
yading@10
|
951 }\
|
yading@10
|
952 dst = tmp;
|
yading@10
|
953
|
yading@10
|
954 align_get_bits(gb);
|
yading@10
|
955
|
yading@10
|
956 s->zero_res = s->num_refs ? get_bits1(gb) : 0;
|
yading@10
|
957 if (s->zero_res)
|
yading@10
|
958 return 0;
|
yading@10
|
959
|
yading@10
|
960 /*[DIRAC_STD] 11.3.1 Transform parameters. transform_parameters() */
|
yading@10
|
961 CHECKEDREAD(s->wavelet_idx, tmp > 6, "wavelet_idx is too big\n")
|
yading@10
|
962
|
yading@10
|
963 CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n")
|
yading@10
|
964
|
yading@10
|
965 if (!s->low_delay) {
|
yading@10
|
966 /* Codeblock parameters (core syntax only) */
|
yading@10
|
967 if (get_bits1(gb)) {
|
yading@10
|
968 for (i = 0; i <= s->wavelet_depth; i++) {
|
yading@10
|
969 CHECKEDREAD(s->codeblock[i].width , tmp < 1, "codeblock width invalid\n")
|
yading@10
|
970 CHECKEDREAD(s->codeblock[i].height, tmp < 1, "codeblock height invalid\n")
|
yading@10
|
971 }
|
yading@10
|
972
|
yading@10
|
973 CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n")
|
yading@10
|
974 } else
|
yading@10
|
975 for (i = 0; i <= s->wavelet_depth; i++)
|
yading@10
|
976 s->codeblock[i].width = s->codeblock[i].height = 1;
|
yading@10
|
977 } else {
|
yading@10
|
978 /* Slice parameters + quantization matrix*/
|
yading@10
|
979 /*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
|
yading@10
|
980 s->lowdelay.num_x = svq3_get_ue_golomb(gb);
|
yading@10
|
981 s->lowdelay.num_y = svq3_get_ue_golomb(gb);
|
yading@10
|
982 s->lowdelay.bytes.num = svq3_get_ue_golomb(gb);
|
yading@10
|
983 s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);
|
yading@10
|
984
|
yading@10
|
985 if (s->lowdelay.bytes.den <= 0) {
|
yading@10
|
986 av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
|
yading@10
|
987 return AVERROR_INVALIDDATA;
|
yading@10
|
988 }
|
yading@10
|
989
|
yading@10
|
990 /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
|
yading@10
|
991 if (get_bits1(gb)) {
|
yading@10
|
992 av_log(s->avctx,AV_LOG_DEBUG,"Low Delay: Has Custom Quantization Matrix!\n");
|
yading@10
|
993 /* custom quantization matrix */
|
yading@10
|
994 s->lowdelay.quant[0][0] = svq3_get_ue_golomb(gb);
|
yading@10
|
995 for (level = 0; level < s->wavelet_depth; level++) {
|
yading@10
|
996 s->lowdelay.quant[level][1] = svq3_get_ue_golomb(gb);
|
yading@10
|
997 s->lowdelay.quant[level][2] = svq3_get_ue_golomb(gb);
|
yading@10
|
998 s->lowdelay.quant[level][3] = svq3_get_ue_golomb(gb);
|
yading@10
|
999 }
|
yading@10
|
1000 } else {
|
yading@10
|
1001 if (s->wavelet_depth > 4) {
|
yading@10
|
1002 av_log(s->avctx,AV_LOG_ERROR,"Mandatory custom low delay matrix missing for depth %d\n", s->wavelet_depth);
|
yading@10
|
1003 return AVERROR_INVALIDDATA;
|
yading@10
|
1004 }
|
yading@10
|
1005 /* default quantization matrix */
|
yading@10
|
1006 for (level = 0; level < s->wavelet_depth; level++)
|
yading@10
|
1007 for (i = 0; i < 4; i++) {
|
yading@10
|
1008 s->lowdelay.quant[level][i] = default_qmat[s->wavelet_idx][level][i];
|
yading@10
|
1009 /* haar with no shift differs for different depths */
|
yading@10
|
1010 if (s->wavelet_idx == 3)
|
yading@10
|
1011 s->lowdelay.quant[level][i] += 4*(s->wavelet_depth-1 - level);
|
yading@10
|
1012 }
|
yading@10
|
1013 }
|
yading@10
|
1014 }
|
yading@10
|
1015 return 0;
|
yading@10
|
1016 }
|
yading@10
|
1017
|
yading@10
|
1018 static inline int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y)
|
yading@10
|
1019 {
|
yading@10
|
1020 static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
|
yading@10
|
1021
|
yading@10
|
1022 if (!(x|y))
|
yading@10
|
1023 return 0;
|
yading@10
|
1024 else if (!y)
|
yading@10
|
1025 return sbsplit[-1];
|
yading@10
|
1026 else if (!x)
|
yading@10
|
1027 return sbsplit[-stride];
|
yading@10
|
1028
|
yading@10
|
1029 return avgsplit[sbsplit[-1] + sbsplit[-stride] + sbsplit[-stride-1]];
|
yading@10
|
1030 }
|
yading@10
|
1031
|
yading@10
|
1032 static inline int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask)
|
yading@10
|
1033 {
|
yading@10
|
1034 int pred;
|
yading@10
|
1035
|
yading@10
|
1036 if (!(x|y))
|
yading@10
|
1037 return 0;
|
yading@10
|
1038 else if (!y)
|
yading@10
|
1039 return block[-1].ref & refmask;
|
yading@10
|
1040 else if (!x)
|
yading@10
|
1041 return block[-stride].ref & refmask;
|
yading@10
|
1042
|
yading@10
|
1043 /* return the majority */
|
yading@10
|
1044 pred = (block[-1].ref & refmask) + (block[-stride].ref & refmask) + (block[-stride-1].ref & refmask);
|
yading@10
|
1045 return (pred >> 1) & refmask;
|
yading@10
|
1046 }
|
yading@10
|
1047
|
yading@10
|
1048 static inline void pred_block_dc(DiracBlock *block, int stride, int x, int y)
|
yading@10
|
1049 {
|
yading@10
|
1050 int i, n = 0;
|
yading@10
|
1051
|
yading@10
|
1052 memset(block->u.dc, 0, sizeof(block->u.dc));
|
yading@10
|
1053
|
yading@10
|
1054 if (x && !(block[-1].ref & 3)) {
|
yading@10
|
1055 for (i = 0; i < 3; i++)
|
yading@10
|
1056 block->u.dc[i] += block[-1].u.dc[i];
|
yading@10
|
1057 n++;
|
yading@10
|
1058 }
|
yading@10
|
1059
|
yading@10
|
1060 if (y && !(block[-stride].ref & 3)) {
|
yading@10
|
1061 for (i = 0; i < 3; i++)
|
yading@10
|
1062 block->u.dc[i] += block[-stride].u.dc[i];
|
yading@10
|
1063 n++;
|
yading@10
|
1064 }
|
yading@10
|
1065
|
yading@10
|
1066 if (x && y && !(block[-1-stride].ref & 3)) {
|
yading@10
|
1067 for (i = 0; i < 3; i++)
|
yading@10
|
1068 block->u.dc[i] += block[-1-stride].u.dc[i];
|
yading@10
|
1069 n++;
|
yading@10
|
1070 }
|
yading@10
|
1071
|
yading@10
|
1072 if (n == 2) {
|
yading@10
|
1073 for (i = 0; i < 3; i++)
|
yading@10
|
1074 block->u.dc[i] = (block->u.dc[i]+1)>>1;
|
yading@10
|
1075 } else if (n == 3) {
|
yading@10
|
1076 for (i = 0; i < 3; i++)
|
yading@10
|
1077 block->u.dc[i] = divide3(block->u.dc[i]);
|
yading@10
|
1078 }
|
yading@10
|
1079 }
|
yading@10
|
1080
|
yading@10
|
1081 static inline void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
|
yading@10
|
1082 {
|
yading@10
|
1083 int16_t *pred[3];
|
yading@10
|
1084 int refmask = ref+1;
|
yading@10
|
1085 int mask = refmask | DIRAC_REF_MASK_GLOBAL; /* exclude gmc blocks */
|
yading@10
|
1086 int n = 0;
|
yading@10
|
1087
|
yading@10
|
1088 if (x && (block[-1].ref & mask) == refmask)
|
yading@10
|
1089 pred[n++] = block[-1].u.mv[ref];
|
yading@10
|
1090
|
yading@10
|
1091 if (y && (block[-stride].ref & mask) == refmask)
|
yading@10
|
1092 pred[n++] = block[-stride].u.mv[ref];
|
yading@10
|
1093
|
yading@10
|
1094 if (x && y && (block[-stride-1].ref & mask) == refmask)
|
yading@10
|
1095 pred[n++] = block[-stride-1].u.mv[ref];
|
yading@10
|
1096
|
yading@10
|
1097 switch (n) {
|
yading@10
|
1098 case 0:
|
yading@10
|
1099 block->u.mv[ref][0] = 0;
|
yading@10
|
1100 block->u.mv[ref][1] = 0;
|
yading@10
|
1101 break;
|
yading@10
|
1102 case 1:
|
yading@10
|
1103 block->u.mv[ref][0] = pred[0][0];
|
yading@10
|
1104 block->u.mv[ref][1] = pred[0][1];
|
yading@10
|
1105 break;
|
yading@10
|
1106 case 2:
|
yading@10
|
1107 block->u.mv[ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
|
yading@10
|
1108 block->u.mv[ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
|
yading@10
|
1109 break;
|
yading@10
|
1110 case 3:
|
yading@10
|
1111 block->u.mv[ref][0] = mid_pred(pred[0][0], pred[1][0], pred[2][0]);
|
yading@10
|
1112 block->u.mv[ref][1] = mid_pred(pred[0][1], pred[1][1], pred[2][1]);
|
yading@10
|
1113 break;
|
yading@10
|
1114 }
|
yading@10
|
1115 }
|
yading@10
|
1116
|
yading@10
|
1117 static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
|
yading@10
|
1118 {
|
yading@10
|
1119 int ez = s->globalmc[ref].zrs_exp;
|
yading@10
|
1120 int ep = s->globalmc[ref].perspective_exp;
|
yading@10
|
1121 int (*A)[2] = s->globalmc[ref].zrs;
|
yading@10
|
1122 int *b = s->globalmc[ref].pan_tilt;
|
yading@10
|
1123 int *c = s->globalmc[ref].perspective;
|
yading@10
|
1124
|
yading@10
|
1125 int m = (1<<ep) - (c[0]*x + c[1]*y);
|
yading@10
|
1126 int mx = m * ((A[0][0] * x + A[0][1]*y) + (1<<ez) * b[0]);
|
yading@10
|
1127 int my = m * ((A[1][0] * x + A[1][1]*y) + (1<<ez) * b[1]);
|
yading@10
|
1128
|
yading@10
|
1129 block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
|
yading@10
|
1130 block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
|
yading@10
|
1131 }
|
yading@10
|
1132
|
yading@10
|
1133 static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block,
|
yading@10
|
1134 int stride, int x, int y)
|
yading@10
|
1135 {
|
yading@10
|
1136 int i;
|
yading@10
|
1137
|
yading@10
|
1138 block->ref = pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF1);
|
yading@10
|
1139 block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF1);
|
yading@10
|
1140
|
yading@10
|
1141 if (s->num_refs == 2) {
|
yading@10
|
1142 block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF2);
|
yading@10
|
1143 block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF2) << 1;
|
yading@10
|
1144 }
|
yading@10
|
1145
|
yading@10
|
1146 if (!block->ref) {
|
yading@10
|
1147 pred_block_dc(block, stride, x, y);
|
yading@10
|
1148 for (i = 0; i < 3; i++)
|
yading@10
|
1149 block->u.dc[i] += dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
|
yading@10
|
1150 return;
|
yading@10
|
1151 }
|
yading@10
|
1152
|
yading@10
|
1153 if (s->globalmc_flag) {
|
yading@10
|
1154 block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_GLOBAL);
|
yading@10
|
1155 block->ref ^= dirac_get_arith_bit(arith, CTX_GLOBAL_BLOCK) << 2;
|
yading@10
|
1156 }
|
yading@10
|
1157
|
yading@10
|
1158 for (i = 0; i < s->num_refs; i++)
|
yading@10
|
1159 if (block->ref & (i+1)) {
|
yading@10
|
1160 if (block->ref & DIRAC_REF_MASK_GLOBAL) {
|
yading@10
|
1161 global_mv(s, block, x, y, i);
|
yading@10
|
1162 } else {
|
yading@10
|
1163 pred_mv(block, stride, x, y, i);
|
yading@10
|
1164 block->u.mv[i][0] += dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
|
yading@10
|
1165 block->u.mv[i][1] += dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
|
yading@10
|
1166 }
|
yading@10
|
1167 }
|
yading@10
|
1168 }
|
yading@10
|
1169
|
yading@10
|
1170 /**
|
yading@10
|
1171 * Copies the current block to the other blocks covered by the current superblock split mode
|
yading@10
|
1172 */
|
yading@10
|
1173 static void propagate_block_data(DiracBlock *block, int stride, int size)
|
yading@10
|
1174 {
|
yading@10
|
1175 int x, y;
|
yading@10
|
1176 DiracBlock *dst = block;
|
yading@10
|
1177
|
yading@10
|
1178 for (x = 1; x < size; x++)
|
yading@10
|
1179 dst[x] = *block;
|
yading@10
|
1180
|
yading@10
|
1181 for (y = 1; y < size; y++) {
|
yading@10
|
1182 dst += stride;
|
yading@10
|
1183 for (x = 0; x < size; x++)
|
yading@10
|
1184 dst[x] = *block;
|
yading@10
|
1185 }
|
yading@10
|
1186 }
|
yading@10
|
1187
|
yading@10
|
1188 /**
|
yading@10
|
1189 * Dirac Specification ->
|
yading@10
|
1190 * 12. Block motion data syntax
|
yading@10
|
1191 */
|
yading@10
|
1192 static int dirac_unpack_block_motion_data(DiracContext *s)
|
yading@10
|
1193 {
|
yading@10
|
1194 GetBitContext *gb = &s->gb;
|
yading@10
|
1195 uint8_t *sbsplit = s->sbsplit;
|
yading@10
|
1196 int i, x, y, q, p;
|
yading@10
|
1197 DiracArith arith[8];
|
yading@10
|
1198
|
yading@10
|
1199 align_get_bits(gb);
|
yading@10
|
1200
|
yading@10
|
1201 /* [DIRAC_STD] 11.2.4 and 12.2.1 Number of blocks and superblocks */
|
yading@10
|
1202 s->sbwidth = DIVRNDUP(s->source.width, 4*s->plane[0].xbsep);
|
yading@10
|
1203 s->sbheight = DIVRNDUP(s->source.height, 4*s->plane[0].ybsep);
|
yading@10
|
1204 s->blwidth = 4 * s->sbwidth;
|
yading@10
|
1205 s->blheight = 4 * s->sbheight;
|
yading@10
|
1206
|
yading@10
|
1207 /* [DIRAC_STD] 12.3.1 Superblock splitting modes. superblock_split_modes()
|
yading@10
|
1208 decode superblock split modes */
|
yading@10
|
1209 ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb)); /* svq3_get_ue_golomb(gb) is the length */
|
yading@10
|
1210 for (y = 0; y < s->sbheight; y++) {
|
yading@10
|
1211 for (x = 0; x < s->sbwidth; x++) {
|
yading@10
|
1212 unsigned int split = dirac_get_arith_uint(arith, CTX_SB_F1, CTX_SB_DATA);
|
yading@10
|
1213 if (split > 2)
|
yading@10
|
1214 return -1;
|
yading@10
|
1215 sbsplit[x] = (split + pred_sbsplit(sbsplit+x, s->sbwidth, x, y)) % 3;
|
yading@10
|
1216 }
|
yading@10
|
1217 sbsplit += s->sbwidth;
|
yading@10
|
1218 }
|
yading@10
|
1219
|
yading@10
|
1220 /* setup arith decoding */
|
yading@10
|
1221 ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb));
|
yading@10
|
1222 for (i = 0; i < s->num_refs; i++) {
|
yading@10
|
1223 ff_dirac_init_arith_decoder(arith + 4 + 2 * i, gb, svq3_get_ue_golomb(gb));
|
yading@10
|
1224 ff_dirac_init_arith_decoder(arith + 5 + 2 * i, gb, svq3_get_ue_golomb(gb));
|
yading@10
|
1225 }
|
yading@10
|
1226 for (i = 0; i < 3; i++)
|
yading@10
|
1227 ff_dirac_init_arith_decoder(arith+1+i, gb, svq3_get_ue_golomb(gb));
|
yading@10
|
1228
|
yading@10
|
1229 for (y = 0; y < s->sbheight; y++)
|
yading@10
|
1230 for (x = 0; x < s->sbwidth; x++) {
|
yading@10
|
1231 int blkcnt = 1 << s->sbsplit[y * s->sbwidth + x];
|
yading@10
|
1232 int step = 4 >> s->sbsplit[y * s->sbwidth + x];
|
yading@10
|
1233
|
yading@10
|
1234 for (q = 0; q < blkcnt; q++)
|
yading@10
|
1235 for (p = 0; p < blkcnt; p++) {
|
yading@10
|
1236 int bx = 4 * x + p*step;
|
yading@10
|
1237 int by = 4 * y + q*step;
|
yading@10
|
1238 DiracBlock *block = &s->blmotion[by*s->blwidth + bx];
|
yading@10
|
1239 decode_block_params(s, arith, block, s->blwidth, bx, by);
|
yading@10
|
1240 propagate_block_data(block, s->blwidth, step);
|
yading@10
|
1241 }
|
yading@10
|
1242 }
|
yading@10
|
1243
|
yading@10
|
1244 return 0;
|
yading@10
|
1245 }
|
yading@10
|
1246
|
yading@10
|
1247 static int weight(int i, int blen, int offset)
|
yading@10
|
1248 {
|
yading@10
|
1249 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \
|
yading@10
|
1250 (1 + (6*(i) + offset - 1) / (2*offset - 1))
|
yading@10
|
1251
|
yading@10
|
1252 if (i < 2*offset)
|
yading@10
|
1253 return ROLLOFF(i);
|
yading@10
|
1254 else if (i > blen-1 - 2*offset)
|
yading@10
|
1255 return ROLLOFF(blen-1 - i);
|
yading@10
|
1256 return 8;
|
yading@10
|
1257 }
|
yading@10
|
1258
|
yading@10
|
1259 static void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride,
|
yading@10
|
1260 int left, int right, int wy)
|
yading@10
|
1261 {
|
yading@10
|
1262 int x;
|
yading@10
|
1263 for (x = 0; left && x < p->xblen >> 1; x++)
|
yading@10
|
1264 obmc_weight[x] = wy*8;
|
yading@10
|
1265 for (; x < p->xblen >> right; x++)
|
yading@10
|
1266 obmc_weight[x] = wy*weight(x, p->xblen, p->xoffset);
|
yading@10
|
1267 for (; x < p->xblen; x++)
|
yading@10
|
1268 obmc_weight[x] = wy*8;
|
yading@10
|
1269 for (; x < stride; x++)
|
yading@10
|
1270 obmc_weight[x] = 0;
|
yading@10
|
1271 }
|
yading@10
|
1272
|
yading@10
|
1273 static void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride,
|
yading@10
|
1274 int left, int right, int top, int bottom)
|
yading@10
|
1275 {
|
yading@10
|
1276 int y;
|
yading@10
|
1277 for (y = 0; top && y < p->yblen >> 1; y++) {
|
yading@10
|
1278 init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
|
yading@10
|
1279 obmc_weight += stride;
|
yading@10
|
1280 }
|
yading@10
|
1281 for (; y < p->yblen >> bottom; y++) {
|
yading@10
|
1282 int wy = weight(y, p->yblen, p->yoffset);
|
yading@10
|
1283 init_obmc_weight_row(p, obmc_weight, stride, left, right, wy);
|
yading@10
|
1284 obmc_weight += stride;
|
yading@10
|
1285 }
|
yading@10
|
1286 for (; y < p->yblen; y++) {
|
yading@10
|
1287 init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
|
yading@10
|
1288 obmc_weight += stride;
|
yading@10
|
1289 }
|
yading@10
|
1290 }
|
yading@10
|
1291
|
yading@10
|
1292 static void init_obmc_weights(DiracContext *s, Plane *p, int by)
|
yading@10
|
1293 {
|
yading@10
|
1294 int top = !by;
|
yading@10
|
1295 int bottom = by == s->blheight-1;
|
yading@10
|
1296
|
yading@10
|
1297 /* don't bother re-initing for rows 2 to blheight-2, the weights don't change */
|
yading@10
|
1298 if (top || bottom || by == 1) {
|
yading@10
|
1299 init_obmc_weight(p, s->obmc_weight[0], MAX_BLOCKSIZE, 1, 0, top, bottom);
|
yading@10
|
1300 init_obmc_weight(p, s->obmc_weight[1], MAX_BLOCKSIZE, 0, 0, top, bottom);
|
yading@10
|
1301 init_obmc_weight(p, s->obmc_weight[2], MAX_BLOCKSIZE, 0, 1, top, bottom);
|
yading@10
|
1302 }
|
yading@10
|
1303 }
|
yading@10
|
1304
|
yading@10
|
1305 static const uint8_t epel_weights[4][4][4] = {
|
yading@10
|
1306 {{ 16, 0, 0, 0 },
|
yading@10
|
1307 { 12, 4, 0, 0 },
|
yading@10
|
1308 { 8, 8, 0, 0 },
|
yading@10
|
1309 { 4, 12, 0, 0 }},
|
yading@10
|
1310 {{ 12, 0, 4, 0 },
|
yading@10
|
1311 { 9, 3, 3, 1 },
|
yading@10
|
1312 { 6, 6, 2, 2 },
|
yading@10
|
1313 { 3, 9, 1, 3 }},
|
yading@10
|
1314 {{ 8, 0, 8, 0 },
|
yading@10
|
1315 { 6, 2, 6, 2 },
|
yading@10
|
1316 { 4, 4, 4, 4 },
|
yading@10
|
1317 { 2, 6, 2, 6 }},
|
yading@10
|
1318 {{ 4, 0, 12, 0 },
|
yading@10
|
1319 { 3, 1, 9, 3 },
|
yading@10
|
1320 { 2, 2, 6, 6 },
|
yading@10
|
1321 { 1, 3, 3, 9 }}
|
yading@10
|
1322 };
|
yading@10
|
1323
|
yading@10
|
1324 /**
|
yading@10
|
1325 * For block x,y, determine which of the hpel planes to do bilinear
|
yading@10
|
1326 * interpolation from and set src[] to the location in each hpel plane
|
yading@10
|
1327 * to MC from.
|
yading@10
|
1328 *
|
yading@10
|
1329 * @return the index of the put_dirac_pixels_tab function to use
|
yading@10
|
1330 * 0 for 1 plane (fpel,hpel), 1 for 2 planes (qpel), 2 for 4 planes (qpel), and 3 for epel
|
yading@10
|
1331 */
|
yading@10
|
1332 static int mc_subpel(DiracContext *s, DiracBlock *block, const uint8_t *src[5],
|
yading@10
|
1333 int x, int y, int ref, int plane)
|
yading@10
|
1334 {
|
yading@10
|
1335 Plane *p = &s->plane[plane];
|
yading@10
|
1336 uint8_t **ref_hpel = s->ref_pics[ref]->hpel[plane];
|
yading@10
|
1337 int motion_x = block->u.mv[ref][0];
|
yading@10
|
1338 int motion_y = block->u.mv[ref][1];
|
yading@10
|
1339 int mx, my, i, epel, nplanes = 0;
|
yading@10
|
1340
|
yading@10
|
1341 if (plane) {
|
yading@10
|
1342 motion_x >>= s->chroma_x_shift;
|
yading@10
|
1343 motion_y >>= s->chroma_y_shift;
|
yading@10
|
1344 }
|
yading@10
|
1345
|
yading@10
|
1346 mx = motion_x & ~(-1 << s->mv_precision);
|
yading@10
|
1347 my = motion_y & ~(-1 << s->mv_precision);
|
yading@10
|
1348 motion_x >>= s->mv_precision;
|
yading@10
|
1349 motion_y >>= s->mv_precision;
|
yading@10
|
1350 /* normalize subpel coordinates to epel */
|
yading@10
|
1351 /* TODO: template this function? */
|
yading@10
|
1352 mx <<= 3 - s->mv_precision;
|
yading@10
|
1353 my <<= 3 - s->mv_precision;
|
yading@10
|
1354
|
yading@10
|
1355 x += motion_x;
|
yading@10
|
1356 y += motion_y;
|
yading@10
|
1357 epel = (mx|my)&1;
|
yading@10
|
1358
|
yading@10
|
1359 /* hpel position */
|
yading@10
|
1360 if (!((mx|my)&3)) {
|
yading@10
|
1361 nplanes = 1;
|
yading@10
|
1362 src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->stride + x;
|
yading@10
|
1363 } else {
|
yading@10
|
1364 /* qpel or epel */
|
yading@10
|
1365 nplanes = 4;
|
yading@10
|
1366 for (i = 0; i < 4; i++)
|
yading@10
|
1367 src[i] = ref_hpel[i] + y*p->stride + x;
|
yading@10
|
1368
|
yading@10
|
1369 /* if we're interpolating in the right/bottom halves, adjust the planes as needed
|
yading@10
|
1370 we increment x/y because the edge changes for half of the pixels */
|
yading@10
|
1371 if (mx > 4) {
|
yading@10
|
1372 src[0] += 1;
|
yading@10
|
1373 src[2] += 1;
|
yading@10
|
1374 x++;
|
yading@10
|
1375 }
|
yading@10
|
1376 if (my > 4) {
|
yading@10
|
1377 src[0] += p->stride;
|
yading@10
|
1378 src[1] += p->stride;
|
yading@10
|
1379 y++;
|
yading@10
|
1380 }
|
yading@10
|
1381
|
yading@10
|
1382 /* hpel planes are:
|
yading@10
|
1383 [0]: F [1]: H
|
yading@10
|
1384 [2]: V [3]: C */
|
yading@10
|
1385 if (!epel) {
|
yading@10
|
1386 /* check if we really only need 2 planes since either mx or my is
|
yading@10
|
1387 a hpel position. (epel weights of 0 handle this there) */
|
yading@10
|
1388 if (!(mx&3)) {
|
yading@10
|
1389 /* mx == 0: average [0] and [2]
|
yading@10
|
1390 mx == 4: average [1] and [3] */
|
yading@10
|
1391 src[!mx] = src[2 + !!mx];
|
yading@10
|
1392 nplanes = 2;
|
yading@10
|
1393 } else if (!(my&3)) {
|
yading@10
|
1394 src[0] = src[(my>>1) ];
|
yading@10
|
1395 src[1] = src[(my>>1)+1];
|
yading@10
|
1396 nplanes = 2;
|
yading@10
|
1397 }
|
yading@10
|
1398 } else {
|
yading@10
|
1399 /* adjust the ordering if needed so the weights work */
|
yading@10
|
1400 if (mx > 4) {
|
yading@10
|
1401 FFSWAP(const uint8_t *, src[0], src[1]);
|
yading@10
|
1402 FFSWAP(const uint8_t *, src[2], src[3]);
|
yading@10
|
1403 }
|
yading@10
|
1404 if (my > 4) {
|
yading@10
|
1405 FFSWAP(const uint8_t *, src[0], src[2]);
|
yading@10
|
1406 FFSWAP(const uint8_t *, src[1], src[3]);
|
yading@10
|
1407 }
|
yading@10
|
1408 src[4] = epel_weights[my&3][mx&3];
|
yading@10
|
1409 }
|
yading@10
|
1410 }
|
yading@10
|
1411
|
yading@10
|
1412 /* fixme: v/h _edge_pos */
|
yading@10
|
1413 if (x + p->xblen > p->width +EDGE_WIDTH/2 ||
|
yading@10
|
1414 y + p->yblen > p->height+EDGE_WIDTH/2 ||
|
yading@10
|
1415 x < 0 || y < 0) {
|
yading@10
|
1416 for (i = 0; i < nplanes; i++) {
|
yading@10
|
1417 ff_emulated_edge_mc(s->edge_emu_buffer[i], src[i], p->stride,
|
yading@10
|
1418 p->xblen, p->yblen, x, y,
|
yading@10
|
1419 p->width+EDGE_WIDTH/2, p->height+EDGE_WIDTH/2);
|
yading@10
|
1420 src[i] = s->edge_emu_buffer[i];
|
yading@10
|
1421 }
|
yading@10
|
1422 }
|
yading@10
|
1423 return (nplanes>>1) + epel;
|
yading@10
|
1424 }
|
yading@10
|
1425
|
yading@10
|
1426 static void add_dc(uint16_t *dst, int dc, int stride,
|
yading@10
|
1427 uint8_t *obmc_weight, int xblen, int yblen)
|
yading@10
|
1428 {
|
yading@10
|
1429 int x, y;
|
yading@10
|
1430 dc += 128;
|
yading@10
|
1431
|
yading@10
|
1432 for (y = 0; y < yblen; y++) {
|
yading@10
|
1433 for (x = 0; x < xblen; x += 2) {
|
yading@10
|
1434 dst[x ] += dc * obmc_weight[x ];
|
yading@10
|
1435 dst[x+1] += dc * obmc_weight[x+1];
|
yading@10
|
1436 }
|
yading@10
|
1437 dst += stride;
|
yading@10
|
1438 obmc_weight += MAX_BLOCKSIZE;
|
yading@10
|
1439 }
|
yading@10
|
1440 }
|
yading@10
|
1441
|
yading@10
|
1442 static void block_mc(DiracContext *s, DiracBlock *block,
|
yading@10
|
1443 uint16_t *mctmp, uint8_t *obmc_weight,
|
yading@10
|
1444 int plane, int dstx, int dsty)
|
yading@10
|
1445 {
|
yading@10
|
1446 Plane *p = &s->plane[plane];
|
yading@10
|
1447 const uint8_t *src[5];
|
yading@10
|
1448 int idx;
|
yading@10
|
1449
|
yading@10
|
1450 switch (block->ref&3) {
|
yading@10
|
1451 case 0: /* DC */
|
yading@10
|
1452 add_dc(mctmp, block->u.dc[plane], p->stride, obmc_weight, p->xblen, p->yblen);
|
yading@10
|
1453 return;
|
yading@10
|
1454 case 1:
|
yading@10
|
1455 case 2:
|
yading@10
|
1456 idx = mc_subpel(s, block, src, dstx, dsty, (block->ref&3)-1, plane);
|
yading@10
|
1457 s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
|
yading@10
|
1458 if (s->weight_func)
|
yading@10
|
1459 s->weight_func(s->mcscratch, p->stride, s->weight_log2denom,
|
yading@10
|
1460 s->weight[0] + s->weight[1], p->yblen);
|
yading@10
|
1461 break;
|
yading@10
|
1462 case 3:
|
yading@10
|
1463 idx = mc_subpel(s, block, src, dstx, dsty, 0, plane);
|
yading@10
|
1464 s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
|
yading@10
|
1465 idx = mc_subpel(s, block, src, dstx, dsty, 1, plane);
|
yading@10
|
1466 if (s->biweight_func) {
|
yading@10
|
1467 /* fixme: +32 is a quick hack */
|
yading@10
|
1468 s->put_pixels_tab[idx](s->mcscratch + 32, src, p->stride, p->yblen);
|
yading@10
|
1469 s->biweight_func(s->mcscratch, s->mcscratch+32, p->stride, s->weight_log2denom,
|
yading@10
|
1470 s->weight[0], s->weight[1], p->yblen);
|
yading@10
|
1471 } else
|
yading@10
|
1472 s->avg_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
|
yading@10
|
1473 break;
|
yading@10
|
1474 }
|
yading@10
|
1475 s->add_obmc(mctmp, s->mcscratch, p->stride, obmc_weight, p->yblen);
|
yading@10
|
1476 }
|
yading@10
|
1477
|
yading@10
|
1478 static void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty)
|
yading@10
|
1479 {
|
yading@10
|
1480 Plane *p = &s->plane[plane];
|
yading@10
|
1481 int x, dstx = p->xbsep - p->xoffset;
|
yading@10
|
1482
|
yading@10
|
1483 block_mc(s, block, mctmp, s->obmc_weight[0], plane, -p->xoffset, dsty);
|
yading@10
|
1484 mctmp += p->xbsep;
|
yading@10
|
1485
|
yading@10
|
1486 for (x = 1; x < s->blwidth-1; x++) {
|
yading@10
|
1487 block_mc(s, block+x, mctmp, s->obmc_weight[1], plane, dstx, dsty);
|
yading@10
|
1488 dstx += p->xbsep;
|
yading@10
|
1489 mctmp += p->xbsep;
|
yading@10
|
1490 }
|
yading@10
|
1491 block_mc(s, block+x, mctmp, s->obmc_weight[2], plane, dstx, dsty);
|
yading@10
|
1492 }
|
yading@10
|
1493
|
yading@10
|
1494 static void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen)
|
yading@10
|
1495 {
|
yading@10
|
1496 int idx = 0;
|
yading@10
|
1497 if (xblen > 8)
|
yading@10
|
1498 idx = 1;
|
yading@10
|
1499 if (xblen > 16)
|
yading@10
|
1500 idx = 2;
|
yading@10
|
1501
|
yading@10
|
1502 memcpy(s->put_pixels_tab, s->diracdsp.put_dirac_pixels_tab[idx], sizeof(s->put_pixels_tab));
|
yading@10
|
1503 memcpy(s->avg_pixels_tab, s->diracdsp.avg_dirac_pixels_tab[idx], sizeof(s->avg_pixels_tab));
|
yading@10
|
1504 s->add_obmc = s->diracdsp.add_dirac_obmc[idx];
|
yading@10
|
1505 if (s->weight_log2denom > 1 || s->weight[0] != 1 || s->weight[1] != 1) {
|
yading@10
|
1506 s->weight_func = s->diracdsp.weight_dirac_pixels_tab[idx];
|
yading@10
|
1507 s->biweight_func = s->diracdsp.biweight_dirac_pixels_tab[idx];
|
yading@10
|
1508 } else {
|
yading@10
|
1509 s->weight_func = NULL;
|
yading@10
|
1510 s->biweight_func = NULL;
|
yading@10
|
1511 }
|
yading@10
|
1512 }
|
yading@10
|
1513
|
yading@10
|
1514 static void interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height)
|
yading@10
|
1515 {
|
yading@10
|
1516 /* chroma allocates an edge of 8 when subsampled
|
yading@10
|
1517 which for 4:2:2 means an h edge of 16 and v edge of 8
|
yading@10
|
1518 just use 8 for everything for the moment */
|
yading@10
|
1519 int i, edge = EDGE_WIDTH/2;
|
yading@10
|
1520
|
yading@10
|
1521 ref->hpel[plane][0] = ref->avframe.data[plane];
|
yading@10
|
1522 s->dsp.draw_edges(ref->hpel[plane][0], ref->avframe.linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM); /* EDGE_TOP | EDGE_BOTTOM values just copied to make it build, this needs to be ensured */
|
yading@10
|
1523
|
yading@10
|
1524 /* no need for hpel if we only have fpel vectors */
|
yading@10
|
1525 if (!s->mv_precision)
|
yading@10
|
1526 return;
|
yading@10
|
1527
|
yading@10
|
1528 for (i = 1; i < 4; i++) {
|
yading@10
|
1529 if (!ref->hpel_base[plane][i])
|
yading@10
|
1530 ref->hpel_base[plane][i] = av_malloc((height+2*edge) * ref->avframe.linesize[plane] + 32);
|
yading@10
|
1531 /* we need to be 16-byte aligned even for chroma */
|
yading@10
|
1532 ref->hpel[plane][i] = ref->hpel_base[plane][i] + edge*ref->avframe.linesize[plane] + 16;
|
yading@10
|
1533 }
|
yading@10
|
1534
|
yading@10
|
1535 if (!ref->interpolated[plane]) {
|
yading@10
|
1536 s->diracdsp.dirac_hpel_filter(ref->hpel[plane][1], ref->hpel[plane][2],
|
yading@10
|
1537 ref->hpel[plane][3], ref->hpel[plane][0],
|
yading@10
|
1538 ref->avframe.linesize[plane], width, height);
|
yading@10
|
1539 s->dsp.draw_edges(ref->hpel[plane][1], ref->avframe.linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
|
yading@10
|
1540 s->dsp.draw_edges(ref->hpel[plane][2], ref->avframe.linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
|
yading@10
|
1541 s->dsp.draw_edges(ref->hpel[plane][3], ref->avframe.linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
|
yading@10
|
1542 }
|
yading@10
|
1543 ref->interpolated[plane] = 1;
|
yading@10
|
1544 }
|
yading@10
|
1545
|
yading@10
|
1546 /**
|
yading@10
|
1547 * Dirac Specification ->
|
yading@10
|
1548 * 13.0 Transform data syntax. transform_data()
|
yading@10
|
1549 */
|
yading@10
|
1550 static int dirac_decode_frame_internal(DiracContext *s)
|
yading@10
|
1551 {
|
yading@10
|
1552 DWTContext d;
|
yading@10
|
1553 int y, i, comp, dsty;
|
yading@10
|
1554
|
yading@10
|
1555 if (s->low_delay) {
|
yading@10
|
1556 /* [DIRAC_STD] 13.5.1 low_delay_transform_data() */
|
yading@10
|
1557 for (comp = 0; comp < 3; comp++) {
|
yading@10
|
1558 Plane *p = &s->plane[comp];
|
yading@10
|
1559 memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height * sizeof(IDWTELEM));
|
yading@10
|
1560 }
|
yading@10
|
1561 if (!s->zero_res)
|
yading@10
|
1562 decode_lowdelay(s);
|
yading@10
|
1563 }
|
yading@10
|
1564
|
yading@10
|
1565 for (comp = 0; comp < 3; comp++) {
|
yading@10
|
1566 Plane *p = &s->plane[comp];
|
yading@10
|
1567 uint8_t *frame = s->current_picture->avframe.data[comp];
|
yading@10
|
1568
|
yading@10
|
1569 /* FIXME: small resolutions */
|
yading@10
|
1570 for (i = 0; i < 4; i++)
|
yading@10
|
1571 s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16);
|
yading@10
|
1572
|
yading@10
|
1573 if (!s->zero_res && !s->low_delay)
|
yading@10
|
1574 {
|
yading@10
|
1575 memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height * sizeof(IDWTELEM));
|
yading@10
|
1576 decode_component(s, comp); /* [DIRAC_STD] 13.4.1 core_transform_data() */
|
yading@10
|
1577 }
|
yading@10
|
1578 if (ff_spatial_idwt_init2(&d, p->idwt_buf, p->idwt_width, p->idwt_height, p->idwt_stride,
|
yading@10
|
1579 s->wavelet_idx+2, s->wavelet_depth, p->idwt_tmp))
|
yading@10
|
1580 return -1;
|
yading@10
|
1581
|
yading@10
|
1582 if (!s->num_refs) { /* intra */
|
yading@10
|
1583 for (y = 0; y < p->height; y += 16) {
|
yading@10
|
1584 ff_spatial_idwt_slice2(&d, y+16); /* decode */
|
yading@10
|
1585 s->diracdsp.put_signed_rect_clamped(frame + y*p->stride, p->stride,
|
yading@10
|
1586 p->idwt_buf + y*p->idwt_stride, p->idwt_stride, p->width, 16);
|
yading@10
|
1587 }
|
yading@10
|
1588 } else { /* inter */
|
yading@10
|
1589 int rowheight = p->ybsep*p->stride;
|
yading@10
|
1590
|
yading@10
|
1591 select_dsp_funcs(s, p->width, p->height, p->xblen, p->yblen);
|
yading@10
|
1592
|
yading@10
|
1593 for (i = 0; i < s->num_refs; i++)
|
yading@10
|
1594 interpolate_refplane(s, s->ref_pics[i], comp, p->width, p->height);
|
yading@10
|
1595
|
yading@10
|
1596 memset(s->mctmp, 0, 4*p->yoffset*p->stride);
|
yading@10
|
1597
|
yading@10
|
1598 dsty = -p->yoffset;
|
yading@10
|
1599 for (y = 0; y < s->blheight; y++) {
|
yading@10
|
1600 int h = 0,
|
yading@10
|
1601 start = FFMAX(dsty, 0);
|
yading@10
|
1602 uint16_t *mctmp = s->mctmp + y*rowheight;
|
yading@10
|
1603 DiracBlock *blocks = s->blmotion + y*s->blwidth;
|
yading@10
|
1604
|
yading@10
|
1605 init_obmc_weights(s, p, y);
|
yading@10
|
1606
|
yading@10
|
1607 if (y == s->blheight-1 || start+p->ybsep > p->height)
|
yading@10
|
1608 h = p->height - start;
|
yading@10
|
1609 else
|
yading@10
|
1610 h = p->ybsep - (start - dsty);
|
yading@10
|
1611 if (h < 0)
|
yading@10
|
1612 break;
|
yading@10
|
1613
|
yading@10
|
1614 memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
|
yading@10
|
1615 mc_row(s, blocks, mctmp, comp, dsty);
|
yading@10
|
1616
|
yading@10
|
1617 mctmp += (start - dsty)*p->stride + p->xoffset;
|
yading@10
|
1618 ff_spatial_idwt_slice2(&d, start + h); /* decode */
|
yading@10
|
1619 s->diracdsp.add_rect_clamped(frame + start*p->stride, mctmp, p->stride,
|
yading@10
|
1620 p->idwt_buf + start*p->idwt_stride, p->idwt_stride, p->width, h);
|
yading@10
|
1621
|
yading@10
|
1622 dsty += p->ybsep;
|
yading@10
|
1623 }
|
yading@10
|
1624 }
|
yading@10
|
1625 }
|
yading@10
|
1626
|
yading@10
|
1627
|
yading@10
|
1628 return 0;
|
yading@10
|
1629 }
|
yading@10
|
1630
|
yading@10
|
1631 /**
|
yading@10
|
1632 * Dirac Specification ->
|
yading@10
|
1633 * 11.1.1 Picture Header. picture_header()
|
yading@10
|
1634 */
|
yading@10
|
1635 static int dirac_decode_picture_header(DiracContext *s)
|
yading@10
|
1636 {
|
yading@10
|
1637 int retire, picnum;
|
yading@10
|
1638 int i, j, refnum, refdist;
|
yading@10
|
1639 GetBitContext *gb = &s->gb;
|
yading@10
|
1640
|
yading@10
|
1641 /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */
|
yading@10
|
1642 picnum = s->current_picture->avframe.display_picture_number = get_bits_long(gb, 32);
|
yading@10
|
1643
|
yading@10
|
1644
|
yading@10
|
1645 av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum);
|
yading@10
|
1646
|
yading@10
|
1647 /* if this is the first keyframe after a sequence header, start our
|
yading@10
|
1648 reordering from here */
|
yading@10
|
1649 if (s->frame_number < 0)
|
yading@10
|
1650 s->frame_number = picnum;
|
yading@10
|
1651
|
yading@10
|
1652 s->ref_pics[0] = s->ref_pics[1] = NULL;
|
yading@10
|
1653 for (i = 0; i < s->num_refs; i++) {
|
yading@10
|
1654 refnum = picnum + dirac_get_se_golomb(gb);
|
yading@10
|
1655 refdist = INT_MAX;
|
yading@10
|
1656
|
yading@10
|
1657 /* find the closest reference to the one we want */
|
yading@10
|
1658 /* Jordi: this is needed if the referenced picture hasn't yet arrived */
|
yading@10
|
1659 for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++)
|
yading@10
|
1660 if (s->ref_frames[j]
|
yading@10
|
1661 && FFABS(s->ref_frames[j]->avframe.display_picture_number - refnum) < refdist) {
|
yading@10
|
1662 s->ref_pics[i] = s->ref_frames[j];
|
yading@10
|
1663 refdist = FFABS(s->ref_frames[j]->avframe.display_picture_number - refnum);
|
yading@10
|
1664 }
|
yading@10
|
1665
|
yading@10
|
1666 if (!s->ref_pics[i] || refdist)
|
yading@10
|
1667 av_log(s->avctx, AV_LOG_DEBUG, "Reference not found\n");
|
yading@10
|
1668
|
yading@10
|
1669 /* if there were no references at all, allocate one */
|
yading@10
|
1670 if (!s->ref_pics[i])
|
yading@10
|
1671 for (j = 0; j < MAX_FRAMES; j++)
|
yading@10
|
1672 if (!s->all_frames[j].avframe.data[0]) {
|
yading@10
|
1673 s->ref_pics[i] = &s->all_frames[j];
|
yading@10
|
1674 ff_get_buffer(s->avctx, &s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
|
yading@10
|
1675 break;
|
yading@10
|
1676 }
|
yading@10
|
1677 }
|
yading@10
|
1678
|
yading@10
|
1679 /* retire the reference frames that are not used anymore */
|
yading@10
|
1680 if (s->current_picture->avframe.reference) {
|
yading@10
|
1681 retire = picnum + dirac_get_se_golomb(gb);
|
yading@10
|
1682 if (retire != picnum) {
|
yading@10
|
1683 DiracFrame *retire_pic = remove_frame(s->ref_frames, retire);
|
yading@10
|
1684
|
yading@10
|
1685 if (retire_pic)
|
yading@10
|
1686 retire_pic->avframe.reference &= DELAYED_PIC_REF;
|
yading@10
|
1687 else
|
yading@10
|
1688 av_log(s->avctx, AV_LOG_DEBUG, "Frame to retire not found\n");
|
yading@10
|
1689 }
|
yading@10
|
1690
|
yading@10
|
1691 /* if reference array is full, remove the oldest as per the spec */
|
yading@10
|
1692 while (add_frame(s->ref_frames, MAX_REFERENCE_FRAMES, s->current_picture)) {
|
yading@10
|
1693 av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n");
|
yading@10
|
1694 remove_frame(s->ref_frames, s->ref_frames[0]->avframe.display_picture_number)->avframe.reference &= DELAYED_PIC_REF;
|
yading@10
|
1695 }
|
yading@10
|
1696 }
|
yading@10
|
1697
|
yading@10
|
1698 if (s->num_refs) {
|
yading@10
|
1699 if (dirac_unpack_prediction_parameters(s)) /* [DIRAC_STD] 11.2 Picture Prediction Data. picture_prediction() */
|
yading@10
|
1700 return -1;
|
yading@10
|
1701 if (dirac_unpack_block_motion_data(s)) /* [DIRAC_STD] 12. Block motion data syntax */
|
yading@10
|
1702 return -1;
|
yading@10
|
1703 }
|
yading@10
|
1704 if (dirac_unpack_idwt_params(s)) /* [DIRAC_STD] 11.3 Wavelet transform data */
|
yading@10
|
1705 return -1;
|
yading@10
|
1706
|
yading@10
|
1707 init_planes(s);
|
yading@10
|
1708 return 0;
|
yading@10
|
1709 }
|
yading@10
|
1710
|
yading@10
|
1711 static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
|
yading@10
|
1712 {
|
yading@10
|
1713 DiracFrame *out = s->delay_frames[0];
|
yading@10
|
1714 int i, out_idx = 0;
|
yading@10
|
1715 int ret;
|
yading@10
|
1716
|
yading@10
|
1717 /* find frame with lowest picture number */
|
yading@10
|
1718 for (i = 1; s->delay_frames[i]; i++)
|
yading@10
|
1719 if (s->delay_frames[i]->avframe.display_picture_number < out->avframe.display_picture_number) {
|
yading@10
|
1720 out = s->delay_frames[i];
|
yading@10
|
1721 out_idx = i;
|
yading@10
|
1722 }
|
yading@10
|
1723
|
yading@10
|
1724 for (i = out_idx; s->delay_frames[i]; i++)
|
yading@10
|
1725 s->delay_frames[i] = s->delay_frames[i+1];
|
yading@10
|
1726
|
yading@10
|
1727 if (out) {
|
yading@10
|
1728 out->avframe.reference ^= DELAYED_PIC_REF;
|
yading@10
|
1729 *got_frame = 1;
|
yading@10
|
1730 if((ret = av_frame_ref(picture, &out->avframe)) < 0)
|
yading@10
|
1731 return ret;
|
yading@10
|
1732 }
|
yading@10
|
1733
|
yading@10
|
1734 return 0;
|
yading@10
|
1735 }
|
yading@10
|
1736
|
yading@10
|
1737 /**
|
yading@10
|
1738 * Dirac Specification ->
|
yading@10
|
1739 * 9.6 Parse Info Header Syntax. parse_info()
|
yading@10
|
1740 * 4 byte start code + byte parse code + 4 byte size + 4 byte previous size
|
yading@10
|
1741 */
|
yading@10
|
1742 #define DATA_UNIT_HEADER_SIZE 13
|
yading@10
|
1743
|
yading@10
|
1744 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3
|
yading@10
|
1745 inside the function parse_sequence() */
|
yading@10
|
1746 static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size)
|
yading@10
|
1747 {
|
yading@10
|
1748 DiracContext *s = avctx->priv_data;
|
yading@10
|
1749 DiracFrame *pic = NULL;
|
yading@10
|
1750 int ret, i, parse_code = buf[4];
|
yading@10
|
1751 unsigned tmp;
|
yading@10
|
1752
|
yading@10
|
1753 if (size < DATA_UNIT_HEADER_SIZE)
|
yading@10
|
1754 return -1;
|
yading@10
|
1755
|
yading@10
|
1756 init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE));
|
yading@10
|
1757
|
yading@10
|
1758 if (parse_code == pc_seq_header) {
|
yading@10
|
1759 if (s->seen_sequence_header)
|
yading@10
|
1760 return 0;
|
yading@10
|
1761
|
yading@10
|
1762 /* [DIRAC_STD] 10. Sequence header */
|
yading@10
|
1763 if (avpriv_dirac_parse_sequence_header(avctx, &s->gb, &s->source))
|
yading@10
|
1764 return -1;
|
yading@10
|
1765
|
yading@10
|
1766 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
|
yading@10
|
1767
|
yading@10
|
1768 if (alloc_sequence_buffers(s))
|
yading@10
|
1769 return -1;
|
yading@10
|
1770
|
yading@10
|
1771 s->seen_sequence_header = 1;
|
yading@10
|
1772 } else if (parse_code == pc_eos) { /* [DIRAC_STD] End of Sequence */
|
yading@10
|
1773 free_sequence_buffers(s);
|
yading@10
|
1774 s->seen_sequence_header = 0;
|
yading@10
|
1775 } else if (parse_code == pc_aux_data) {
|
yading@10
|
1776 if (buf[13] == 1) { /* encoder implementation/version */
|
yading@10
|
1777 int ver[3];
|
yading@10
|
1778 /* versions older than 1.0.8 don't store quant delta for
|
yading@10
|
1779 subbands with only one codeblock */
|
yading@10
|
1780 if (sscanf(buf+14, "Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
|
yading@10
|
1781 if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
|
yading@10
|
1782 s->old_delta_quant = 1;
|
yading@10
|
1783 }
|
yading@10
|
1784 } else if (parse_code & 0x8) { /* picture data unit */
|
yading@10
|
1785 if (!s->seen_sequence_header) {
|
yading@10
|
1786 av_log(avctx, AV_LOG_DEBUG, "Dropping frame without sequence header\n");
|
yading@10
|
1787 return -1;
|
yading@10
|
1788 }
|
yading@10
|
1789
|
yading@10
|
1790 /* find an unused frame */
|
yading@10
|
1791 for (i = 0; i < MAX_FRAMES; i++)
|
yading@10
|
1792 if (s->all_frames[i].avframe.data[0] == NULL)
|
yading@10
|
1793 pic = &s->all_frames[i];
|
yading@10
|
1794 if (!pic) {
|
yading@10
|
1795 av_log(avctx, AV_LOG_ERROR, "framelist full\n");
|
yading@10
|
1796 return -1;
|
yading@10
|
1797 }
|
yading@10
|
1798
|
yading@10
|
1799 avcodec_get_frame_defaults(&pic->avframe);
|
yading@10
|
1800
|
yading@10
|
1801 /* [DIRAC_STD] Defined in 9.6.1 ... */
|
yading@10
|
1802 tmp = parse_code & 0x03; /* [DIRAC_STD] num_refs() */
|
yading@10
|
1803 if (tmp > 2) {
|
yading@10
|
1804 av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n");
|
yading@10
|
1805 return -1;
|
yading@10
|
1806 }
|
yading@10
|
1807 s->num_refs = tmp;
|
yading@10
|
1808 s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */
|
yading@10
|
1809 s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */
|
yading@10
|
1810 pic->avframe.reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */
|
yading@10
|
1811 pic->avframe.key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
|
yading@10
|
1812 pic->avframe.pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
|
yading@10
|
1813
|
yading@10
|
1814 if ((ret = ff_get_buffer(avctx, &pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
|
yading@10
|
1815 return ret;
|
yading@10
|
1816 s->current_picture = pic;
|
yading@10
|
1817 s->plane[0].stride = pic->avframe.linesize[0];
|
yading@10
|
1818 s->plane[1].stride = pic->avframe.linesize[1];
|
yading@10
|
1819 s->plane[2].stride = pic->avframe.linesize[2];
|
yading@10
|
1820
|
yading@10
|
1821 /* [DIRAC_STD] 11.1 Picture parse. picture_parse() */
|
yading@10
|
1822 if (dirac_decode_picture_header(s))
|
yading@10
|
1823 return -1;
|
yading@10
|
1824
|
yading@10
|
1825 /* [DIRAC_STD] 13.0 Transform data syntax. transform_data() */
|
yading@10
|
1826 if (dirac_decode_frame_internal(s))
|
yading@10
|
1827 return -1;
|
yading@10
|
1828 }
|
yading@10
|
1829 return 0;
|
yading@10
|
1830 }
|
yading@10
|
1831
|
yading@10
|
1832 static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt)
|
yading@10
|
1833 {
|
yading@10
|
1834 DiracContext *s = avctx->priv_data;
|
yading@10
|
1835 DiracFrame *picture = data;
|
yading@10
|
1836 uint8_t *buf = pkt->data;
|
yading@10
|
1837 int buf_size = pkt->size;
|
yading@10
|
1838 int i, data_unit_size, buf_idx = 0;
|
yading@10
|
1839 int ret;
|
yading@10
|
1840
|
yading@10
|
1841 /* release unused frames */
|
yading@10
|
1842 for (i = 0; i < MAX_FRAMES; i++)
|
yading@10
|
1843 if (s->all_frames[i].avframe.data[0] && !s->all_frames[i].avframe.reference) {
|
yading@10
|
1844 av_frame_unref(&s->all_frames[i].avframe);
|
yading@10
|
1845 memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
|
yading@10
|
1846 }
|
yading@10
|
1847
|
yading@10
|
1848 s->current_picture = NULL;
|
yading@10
|
1849 *got_frame = 0;
|
yading@10
|
1850
|
yading@10
|
1851 /* end of stream, so flush delayed pics */
|
yading@10
|
1852 if (buf_size == 0)
|
yading@10
|
1853 return get_delayed_pic(s, (AVFrame *)data, got_frame);
|
yading@10
|
1854
|
yading@10
|
1855 for (;;) {
|
yading@10
|
1856 /*[DIRAC_STD] Here starts the code from parse_info() defined in 9.6
|
yading@10
|
1857 [DIRAC_STD] PARSE_INFO_PREFIX = "BBCD" as defined in ISO/IEC 646
|
yading@10
|
1858 BBCD start code search */
|
yading@10
|
1859 for (; buf_idx + DATA_UNIT_HEADER_SIZE < buf_size; buf_idx++) {
|
yading@10
|
1860 if (buf[buf_idx ] == 'B' && buf[buf_idx+1] == 'B' &&
|
yading@10
|
1861 buf[buf_idx+2] == 'C' && buf[buf_idx+3] == 'D')
|
yading@10
|
1862 break;
|
yading@10
|
1863 }
|
yading@10
|
1864 /* BBCD found or end of data */
|
yading@10
|
1865 if (buf_idx + DATA_UNIT_HEADER_SIZE >= buf_size)
|
yading@10
|
1866 break;
|
yading@10
|
1867
|
yading@10
|
1868 data_unit_size = AV_RB32(buf+buf_idx+5);
|
yading@10
|
1869 if (buf_idx + data_unit_size > buf_size || !data_unit_size) {
|
yading@10
|
1870 if(buf_idx + data_unit_size > buf_size)
|
yading@10
|
1871 av_log(s->avctx, AV_LOG_ERROR,
|
yading@10
|
1872 "Data unit with size %d is larger than input buffer, discarding\n",
|
yading@10
|
1873 data_unit_size);
|
yading@10
|
1874 buf_idx += 4;
|
yading@10
|
1875 continue;
|
yading@10
|
1876 }
|
yading@10
|
1877 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 inside the function parse_sequence() */
|
yading@10
|
1878 if (dirac_decode_data_unit(avctx, buf+buf_idx, data_unit_size))
|
yading@10
|
1879 {
|
yading@10
|
1880 av_log(s->avctx, AV_LOG_ERROR,"Error in dirac_decode_data_unit\n");
|
yading@10
|
1881 return -1;
|
yading@10
|
1882 }
|
yading@10
|
1883 buf_idx += data_unit_size;
|
yading@10
|
1884 }
|
yading@10
|
1885
|
yading@10
|
1886 if (!s->current_picture)
|
yading@10
|
1887 return buf_size;
|
yading@10
|
1888
|
yading@10
|
1889 if (s->current_picture->avframe.display_picture_number > s->frame_number) {
|
yading@10
|
1890 DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number);
|
yading@10
|
1891
|
yading@10
|
1892 s->current_picture->avframe.reference |= DELAYED_PIC_REF;
|
yading@10
|
1893
|
yading@10
|
1894 if (add_frame(s->delay_frames, MAX_DELAY, s->current_picture)) {
|
yading@10
|
1895 int min_num = s->delay_frames[0]->avframe.display_picture_number;
|
yading@10
|
1896 /* Too many delayed frames, so we display the frame with the lowest pts */
|
yading@10
|
1897 av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n");
|
yading@10
|
1898 delayed_frame = s->delay_frames[0];
|
yading@10
|
1899
|
yading@10
|
1900 for (i = 1; s->delay_frames[i]; i++)
|
yading@10
|
1901 if (s->delay_frames[i]->avframe.display_picture_number < min_num)
|
yading@10
|
1902 min_num = s->delay_frames[i]->avframe.display_picture_number;
|
yading@10
|
1903
|
yading@10
|
1904 delayed_frame = remove_frame(s->delay_frames, min_num);
|
yading@10
|
1905 add_frame(s->delay_frames, MAX_DELAY, s->current_picture);
|
yading@10
|
1906 }
|
yading@10
|
1907
|
yading@10
|
1908 if (delayed_frame) {
|
yading@10
|
1909 delayed_frame->avframe.reference ^= DELAYED_PIC_REF;
|
yading@10
|
1910 if((ret=av_frame_ref(data, &delayed_frame->avframe)) < 0)
|
yading@10
|
1911 return ret;
|
yading@10
|
1912 *got_frame = 1;
|
yading@10
|
1913 }
|
yading@10
|
1914 } else if (s->current_picture->avframe.display_picture_number == s->frame_number) {
|
yading@10
|
1915 /* The right frame at the right time :-) */
|
yading@10
|
1916 if((ret=av_frame_ref(data, &s->current_picture->avframe)) < 0)
|
yading@10
|
1917 return ret;
|
yading@10
|
1918 *got_frame = 1;
|
yading@10
|
1919 }
|
yading@10
|
1920
|
yading@10
|
1921 if (*got_frame)
|
yading@10
|
1922 s->frame_number = picture->avframe.display_picture_number + 1;
|
yading@10
|
1923
|
yading@10
|
1924 return buf_idx;
|
yading@10
|
1925 }
|
yading@10
|
1926
|
yading@10
|
1927 AVCodec ff_dirac_decoder = {
|
yading@10
|
1928 .name = "dirac",
|
yading@10
|
1929 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
1930 .id = AV_CODEC_ID_DIRAC,
|
yading@10
|
1931 .priv_data_size = sizeof(DiracContext),
|
yading@10
|
1932 .init = dirac_decode_init,
|
yading@10
|
1933 .close = dirac_decode_end,
|
yading@10
|
1934 .decode = dirac_decode_frame,
|
yading@10
|
1935 .capabilities = CODEC_CAP_DELAY,
|
yading@10
|
1936 .flush = dirac_decode_flush,
|
yading@10
|
1937 .long_name = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"),
|
yading@10
|
1938 };
|