Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/media/libtheora/lib/decode.c
Line
Count
Source (jump to first uncovered line)
1
/********************************************************************
2
 *                                                                  *
3
 * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE.   *
4
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7
 *                                                                  *
8
 * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009                *
9
 * by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
10
 *                                                                  *
11
 ********************************************************************
12
13
  function:
14
    last mod: $Id: decode.c 17576 2010-10-29 01:07:51Z tterribe $
15
16
 ********************************************************************/
17
18
#include <stdlib.h>
19
#include <string.h>
20
#include <ogg/ogg.h>
21
#include "decint.h"
22
#if defined(OC_DUMP_IMAGES)
23
# include <stdio.h>
24
# include "png.h"
25
#endif
26
#if defined(HAVE_CAIRO)
27
# include <cairo.h>
28
#endif
29
30
31
/*No post-processing.*/
32
0
#define OC_PP_LEVEL_DISABLED  (0)
33
/*Keep track of DC qi for each block only.*/
34
0
#define OC_PP_LEVEL_TRACKDCQI (1)
35
/*Deblock the luma plane.*/
36
0
#define OC_PP_LEVEL_DEBLOCKY  (2)
37
/*Dering the luma plane.*/
38
0
#define OC_PP_LEVEL_DERINGY   (3)
39
/*Stronger luma plane deringing.*/
40
0
#define OC_PP_LEVEL_SDERINGY  (4)
41
/*Deblock the chroma planes.*/
42
0
#define OC_PP_LEVEL_DEBLOCKC  (5)
43
/*Dering the chroma planes.*/
44
#define OC_PP_LEVEL_DERINGC   (6)
45
/*Stronger chroma plane deringing.*/
46
0
#define OC_PP_LEVEL_SDERINGC  (7)
47
/*Maximum valid post-processing level.*/
48
0
#define OC_PP_LEVEL_MAX       (7)
49
50
51
52
/*The mode alphabets for the various mode coding schemes.
53
  Scheme 0 uses a custom alphabet, which is not stored in this table.*/
54
static const unsigned char OC_MODE_ALPHABETS[7][OC_NMODES]={
55
  /*Last MV dominates */
56
  {
57
    OC_MODE_INTER_MV_LAST,OC_MODE_INTER_MV_LAST2,OC_MODE_INTER_MV,
58
    OC_MODE_INTER_NOMV,OC_MODE_INTRA,OC_MODE_GOLDEN_NOMV,OC_MODE_GOLDEN_MV,
59
    OC_MODE_INTER_MV_FOUR
60
  },
61
  {
62
    OC_MODE_INTER_MV_LAST,OC_MODE_INTER_MV_LAST2,OC_MODE_INTER_NOMV,
63
    OC_MODE_INTER_MV,OC_MODE_INTRA,OC_MODE_GOLDEN_NOMV,OC_MODE_GOLDEN_MV,
64
    OC_MODE_INTER_MV_FOUR
65
  },
66
  {
67
    OC_MODE_INTER_MV_LAST,OC_MODE_INTER_MV,OC_MODE_INTER_MV_LAST2,
68
    OC_MODE_INTER_NOMV,OC_MODE_INTRA,OC_MODE_GOLDEN_NOMV,OC_MODE_GOLDEN_MV,
69
    OC_MODE_INTER_MV_FOUR
70
  },
71
  {
72
    OC_MODE_INTER_MV_LAST,OC_MODE_INTER_MV,OC_MODE_INTER_NOMV,
73
    OC_MODE_INTER_MV_LAST2,OC_MODE_INTRA,OC_MODE_GOLDEN_NOMV,
74
    OC_MODE_GOLDEN_MV,OC_MODE_INTER_MV_FOUR
75
  },
76
  /*No MV dominates.*/
77
  {
78
    OC_MODE_INTER_NOMV,OC_MODE_INTER_MV_LAST,OC_MODE_INTER_MV_LAST2,
79
    OC_MODE_INTER_MV,OC_MODE_INTRA,OC_MODE_GOLDEN_NOMV,OC_MODE_GOLDEN_MV,
80
    OC_MODE_INTER_MV_FOUR
81
  },
82
  {
83
    OC_MODE_INTER_NOMV,OC_MODE_GOLDEN_NOMV,OC_MODE_INTER_MV_LAST,
84
    OC_MODE_INTER_MV_LAST2,OC_MODE_INTER_MV,OC_MODE_INTRA,OC_MODE_GOLDEN_MV,
85
    OC_MODE_INTER_MV_FOUR
86
  },
87
  /*Default ordering.*/
88
  {
89
    OC_MODE_INTER_NOMV,OC_MODE_INTRA,OC_MODE_INTER_MV,OC_MODE_INTER_MV_LAST,
90
    OC_MODE_INTER_MV_LAST2,OC_MODE_GOLDEN_NOMV,OC_MODE_GOLDEN_MV,
91
    OC_MODE_INTER_MV_FOUR
92
  }
93
};
94
95
96
/*The original DCT tokens are extended and reordered during the construction of
97
   the Huffman tables.
98
  The extension means more bits can be read with fewer calls to the bitpacker
99
   during the Huffman decoding process (at the cost of larger Huffman tables),
100
   and fewer tokens require additional extra bits (reducing the average storage
101
   per decoded token).
102
  The revised ordering reveals essential information in the token value
103
   itself; specifically, whether or not there are additional extra bits to read
104
   and the parameter to which those extra bits are applied.
105
  The token is used to fetch a code word from the OC_DCT_CODE_WORD table below.
106
  The extra bits are added into code word at the bit position inferred from the
107
   token value, giving the final code word from which all required parameters
108
   are derived.
109
  The number of EOBs and the leading zero run length can be extracted directly.
110
  The coefficient magnitude is optionally negated before extraction, according
111
   to a 'flip' bit.*/
112
113
/*The number of additional extra bits that are decoded with each of the
114
   internal DCT tokens.*/
115
static const unsigned char OC_INTERNAL_DCT_TOKEN_EXTRA_BITS[15]={
116
  12,4,3,3,4,4,5,5,8,8,8,8,3,3,6
117
};
118
119
/*Whether or not an internal token needs any additional extra bits.*/
120
#define OC_DCT_TOKEN_NEEDS_MORE(token) \
121
0
 (token<(int)(sizeof(OC_INTERNAL_DCT_TOKEN_EXTRA_BITS)/ \
122
0
  sizeof(*OC_INTERNAL_DCT_TOKEN_EXTRA_BITS)))
123
124
/*This token (OC_DCT_REPEAT_RUN3_TOKEN) requires more than 8 extra bits.*/
125
0
#define OC_DCT_TOKEN_FAT_EOB (0)
126
127
/*The number of EOBs to use for an end-of-frame token.
128
  Note: We want to set eobs to PTRDIFF_MAX here, but that requires C99, which
129
   is not yet available everywhere; this should be equivalent.*/
130
0
#define OC_DCT_EOB_FINISH (~(size_t)0>>1)
131
132
/*The location of the (6) run length bits in the code word.
133
  These are placed at index 0 and given 8 bits (even though 6 would suffice)
134
   because it may be faster to extract the lower byte on some platforms.*/
135
0
#define OC_DCT_CW_RLEN_SHIFT (0)
136
/*The location of the (12) EOB bits in the code word.*/
137
0
#define OC_DCT_CW_EOB_SHIFT  (8)
138
/*The location of the (1) flip bit in the code word.
139
  This must be right under the magnitude bits.*/
140
0
#define OC_DCT_CW_FLIP_BIT   (20)
141
/*The location of the (11) token magnitude bits in the code word.
142
  These must be last, and rely on a sign-extending right shift.*/
143
0
#define OC_DCT_CW_MAG_SHIFT  (21)
144
145
/*Pack the given fields into a code word.*/
146
#define OC_DCT_CW_PACK(_eobs,_rlen,_mag,_flip) \
147
 ((_eobs)<<OC_DCT_CW_EOB_SHIFT| \
148
 (_rlen)<<OC_DCT_CW_RLEN_SHIFT| \
149
 (_flip)<<OC_DCT_CW_FLIP_BIT| \
150
 (_mag)-(_flip)<<OC_DCT_CW_MAG_SHIFT)
151
152
/*A special code word value that signals the end of the frame (a long EOB run
153
   of zero).*/
154
0
#define OC_DCT_CW_FINISH (0)
155
156
/*The position at which to insert the extra bits in the code word.
157
  We use this formulation because Intel has no useful cmov.
158
  A real architecture would probably do better with two of those.
159
  This translates to 11 instructions(!), and is _still_ faster than either a
160
   table lookup (just barely) or the naive double-ternary implementation (which
161
   gcc translates to a jump and a cmov).
162
  This assumes OC_DCT_CW_RLEN_SHIFT is zero, but could easily be reworked if
163
   you want to make one of the other shifts zero.*/
164
#define OC_DCT_TOKEN_EB_POS(_token) \
165
0
 ((OC_DCT_CW_EOB_SHIFT-OC_DCT_CW_MAG_SHIFT&-((_token)<2)) \
166
0
 +(OC_DCT_CW_MAG_SHIFT&-((_token)<12)))
167
168
/*The code words for each internal token.
169
  See the notes at OC_DCT_TOKEN_MAP for the reasons why things are out of
170
   order.*/
171
static const ogg_int32_t OC_DCT_CODE_WORD[92]={
172
  /*These tokens require additional extra bits for the EOB count.*/
173
  /*OC_DCT_REPEAT_RUN3_TOKEN (12 extra bits)*/
174
  OC_DCT_CW_FINISH,
175
  /*OC_DCT_REPEAT_RUN2_TOKEN (4 extra bits)*/
176
  OC_DCT_CW_PACK(16, 0,  0,0),
177
  /*These tokens require additional extra bits for the magnitude.*/
178
  /*OC_DCT_VAL_CAT5 (4 extra bits-1 already read)*/
179
  OC_DCT_CW_PACK( 0, 0, 13,0),
180
  OC_DCT_CW_PACK( 0, 0, 13,1),
181
  /*OC_DCT_VAL_CAT6 (5 extra bits-1 already read)*/
182
  OC_DCT_CW_PACK( 0, 0, 21,0),
183
  OC_DCT_CW_PACK( 0, 0, 21,1),
184
  /*OC_DCT_VAL_CAT7 (6 extra bits-1 already read)*/
185
  OC_DCT_CW_PACK( 0, 0, 37,0),
186
  OC_DCT_CW_PACK( 0, 0, 37,1),
187
  /*OC_DCT_VAL_CAT8 (10 extra bits-2 already read)*/
188
  OC_DCT_CW_PACK( 0, 0, 69,0),
189
  OC_DCT_CW_PACK( 0, 0,325,0),
190
  OC_DCT_CW_PACK( 0, 0, 69,1),
191
  OC_DCT_CW_PACK( 0, 0,325,1),
192
  /*These tokens require additional extra bits for the run length.*/
193
  /*OC_DCT_RUN_CAT1C (4 extra bits-1 already read)*/
194
  OC_DCT_CW_PACK( 0,10, +1,0),
195
  OC_DCT_CW_PACK( 0,10, -1,0),
196
  /*OC_DCT_ZRL_TOKEN (6 extra bits)
197
    Flip is set to distinguish this from OC_DCT_CW_FINISH.*/
198
  OC_DCT_CW_PACK( 0, 0,  0,1),
199
  /*The remaining tokens require no additional extra bits.*/
200
  /*OC_DCT_EOB1_TOKEN (0 extra bits)*/
201
  OC_DCT_CW_PACK( 1, 0,  0,0),
202
  /*OC_DCT_EOB2_TOKEN (0 extra bits)*/
203
  OC_DCT_CW_PACK( 2, 0,  0,0),
204
  /*OC_DCT_EOB3_TOKEN (0 extra bits)*/
205
  OC_DCT_CW_PACK( 3, 0,  0,0),
206
  /*OC_DCT_RUN_CAT1A (1 extra bit-1 already read)x5*/
207
  OC_DCT_CW_PACK( 0, 1, +1,0),
208
  OC_DCT_CW_PACK( 0, 1, -1,0),
209
  OC_DCT_CW_PACK( 0, 2, +1,0),
210
  OC_DCT_CW_PACK( 0, 2, -1,0),
211
  OC_DCT_CW_PACK( 0, 3, +1,0),
212
  OC_DCT_CW_PACK( 0, 3, -1,0),
213
  OC_DCT_CW_PACK( 0, 4, +1,0),
214
  OC_DCT_CW_PACK( 0, 4, -1,0),
215
  OC_DCT_CW_PACK( 0, 5, +1,0),
216
  OC_DCT_CW_PACK( 0, 5, -1,0),
217
  /*OC_DCT_RUN_CAT2A (2 extra bits-2 already read)*/
218
  OC_DCT_CW_PACK( 0, 1, +2,0),
219
  OC_DCT_CW_PACK( 0, 1, +3,0),
220
  OC_DCT_CW_PACK( 0, 1, -2,0),
221
  OC_DCT_CW_PACK( 0, 1, -3,0),
222
  /*OC_DCT_RUN_CAT1B (3 extra bits-3 already read)*/
223
  OC_DCT_CW_PACK( 0, 6, +1,0),
224
  OC_DCT_CW_PACK( 0, 7, +1,0),
225
  OC_DCT_CW_PACK( 0, 8, +1,0),
226
  OC_DCT_CW_PACK( 0, 9, +1,0),
227
  OC_DCT_CW_PACK( 0, 6, -1,0),
228
  OC_DCT_CW_PACK( 0, 7, -1,0),
229
  OC_DCT_CW_PACK( 0, 8, -1,0),
230
  OC_DCT_CW_PACK( 0, 9, -1,0),
231
  /*OC_DCT_RUN_CAT2B (3 extra bits-3 already read)*/
232
  OC_DCT_CW_PACK( 0, 2, +2,0),
233
  OC_DCT_CW_PACK( 0, 3, +2,0),
234
  OC_DCT_CW_PACK( 0, 2, +3,0),
235
  OC_DCT_CW_PACK( 0, 3, +3,0),
236
  OC_DCT_CW_PACK( 0, 2, -2,0),
237
  OC_DCT_CW_PACK( 0, 3, -2,0),
238
  OC_DCT_CW_PACK( 0, 2, -3,0),
239
  OC_DCT_CW_PACK( 0, 3, -3,0),
240
  /*OC_DCT_SHORT_ZRL_TOKEN (3 extra bits-3 already read)
241
    Flip is set on the first one to distinguish it from OC_DCT_CW_FINISH.*/
242
  OC_DCT_CW_PACK( 0, 0,  0,1),
243
  OC_DCT_CW_PACK( 0, 1,  0,0),
244
  OC_DCT_CW_PACK( 0, 2,  0,0),
245
  OC_DCT_CW_PACK( 0, 3,  0,0),
246
  OC_DCT_CW_PACK( 0, 4,  0,0),
247
  OC_DCT_CW_PACK( 0, 5,  0,0),
248
  OC_DCT_CW_PACK( 0, 6,  0,0),
249
  OC_DCT_CW_PACK( 0, 7,  0,0),
250
  /*OC_ONE_TOKEN (0 extra bits)*/
251
  OC_DCT_CW_PACK( 0, 0, +1,0),
252
  /*OC_MINUS_ONE_TOKEN (0 extra bits)*/
253
  OC_DCT_CW_PACK( 0, 0, -1,0),
254
  /*OC_TWO_TOKEN (0 extra bits)*/
255
  OC_DCT_CW_PACK( 0, 0, +2,0),
256
  /*OC_MINUS_TWO_TOKEN (0 extra bits)*/
257
  OC_DCT_CW_PACK( 0, 0, -2,0),
258
  /*OC_DCT_VAL_CAT2 (1 extra bit-1 already read)x4*/
259
  OC_DCT_CW_PACK( 0, 0, +3,0),
260
  OC_DCT_CW_PACK( 0, 0, -3,0),
261
  OC_DCT_CW_PACK( 0, 0, +4,0),
262
  OC_DCT_CW_PACK( 0, 0, -4,0),
263
  OC_DCT_CW_PACK( 0, 0, +5,0),
264
  OC_DCT_CW_PACK( 0, 0, -5,0),
265
  OC_DCT_CW_PACK( 0, 0, +6,0),
266
  OC_DCT_CW_PACK( 0, 0, -6,0),
267
  /*OC_DCT_VAL_CAT3 (2 extra bits-2 already read)*/
268
  OC_DCT_CW_PACK( 0, 0, +7,0),
269
  OC_DCT_CW_PACK( 0, 0, +8,0),
270
  OC_DCT_CW_PACK( 0, 0, -7,0),
271
  OC_DCT_CW_PACK( 0, 0, -8,0),
272
  /*OC_DCT_VAL_CAT4 (3 extra bits-3 already read)*/
273
  OC_DCT_CW_PACK( 0, 0, +9,0),
274
  OC_DCT_CW_PACK( 0, 0,+10,0),
275
  OC_DCT_CW_PACK( 0, 0,+11,0),
276
  OC_DCT_CW_PACK( 0, 0,+12,0),
277
  OC_DCT_CW_PACK( 0, 0, -9,0),
278
  OC_DCT_CW_PACK( 0, 0,-10,0),
279
  OC_DCT_CW_PACK( 0, 0,-11,0),
280
  OC_DCT_CW_PACK( 0, 0,-12,0),
281
  /*OC_DCT_REPEAT_RUN1_TOKEN (3 extra bits-3 already read)*/
282
  OC_DCT_CW_PACK( 8, 0,  0,0),
283
  OC_DCT_CW_PACK( 9, 0,  0,0),
284
  OC_DCT_CW_PACK(10, 0,  0,0),
285
  OC_DCT_CW_PACK(11, 0,  0,0),
286
  OC_DCT_CW_PACK(12, 0,  0,0),
287
  OC_DCT_CW_PACK(13, 0,  0,0),
288
  OC_DCT_CW_PACK(14, 0,  0,0),
289
  OC_DCT_CW_PACK(15, 0,  0,0),
290
  /*OC_DCT_REPEAT_RUN0_TOKEN (2 extra bits-2 already read)*/
291
  OC_DCT_CW_PACK( 4, 0,  0,0),
292
  OC_DCT_CW_PACK( 5, 0,  0,0),
293
  OC_DCT_CW_PACK( 6, 0,  0,0),
294
  OC_DCT_CW_PACK( 7, 0,  0,0),
295
};
296
297
298
299
0
static int oc_sb_run_unpack(oc_pack_buf *_opb){
300
0
  /*Coding scheme:
301
0
       Codeword            Run Length
302
0
     0                       1
303
0
     10x                     2-3
304
0
     110x                    4-5
305
0
     1110xx                  6-9
306
0
     11110xxx                10-17
307
0
     111110xxxx              18-33
308
0
     111111xxxxxxxxxxxx      34-4129*/
309
0
  static const ogg_int16_t OC_SB_RUN_TREE[22]={
310
0
    4,
311
0
     -(1<<8|1),-(1<<8|1),-(1<<8|1),-(1<<8|1),
312
0
     -(1<<8|1),-(1<<8|1),-(1<<8|1),-(1<<8|1),
313
0
     -(3<<8|2),-(3<<8|2),-(3<<8|3),-(3<<8|3),
314
0
     -(4<<8|4),-(4<<8|5),-(4<<8|2<<4|6-6),17,
315
0
      2,
316
0
       -(2<<8|2<<4|10-6),-(2<<8|2<<4|14-6),-(2<<8|4<<4|18-6),-(2<<8|12<<4|34-6)
317
0
  };
318
0
  int ret;
319
0
  ret=oc_huff_token_decode(_opb,OC_SB_RUN_TREE);
320
0
  if(ret>=0x10){
321
0
    int offs;
322
0
    offs=ret&0x1F;
323
0
    ret=6+offs+(int)oc_pack_read(_opb,ret-offs>>4);
324
0
  }
325
0
  return ret;
326
0
}
327
328
0
static int oc_block_run_unpack(oc_pack_buf *_opb){
329
0
  /*Coding scheme:
330
0
     Codeword             Run Length
331
0
     0x                      1-2
332
0
     10x                     3-4
333
0
     110x                    5-6
334
0
     1110xx                  7-10
335
0
     11110xx                 11-14
336
0
     11111xxxx               15-30*/
337
0
  static const ogg_int16_t OC_BLOCK_RUN_TREE[61]={
338
0
    5,
339
0
     -(2<<8|1),-(2<<8|1),-(2<<8|1),-(2<<8|1),
340
0
     -(2<<8|1),-(2<<8|1),-(2<<8|1),-(2<<8|1),
341
0
     -(2<<8|2),-(2<<8|2),-(2<<8|2),-(2<<8|2),
342
0
     -(2<<8|2),-(2<<8|2),-(2<<8|2),-(2<<8|2),
343
0
     -(3<<8|3),-(3<<8|3),-(3<<8|3),-(3<<8|3),
344
0
     -(3<<8|4),-(3<<8|4),-(3<<8|4),-(3<<8|4),
345
0
     -(4<<8|5),-(4<<8|5),-(4<<8|6),-(4<<8|6),
346
0
     33,       36,       39,       44,
347
0
      1,-(1<<8|7),-(1<<8|8),
348
0
      1,-(1<<8|9),-(1<<8|10),
349
0
      2,-(2<<8|11),-(2<<8|12),-(2<<8|13),-(2<<8|14),
350
0
      4,
351
0
       -(4<<8|15),-(4<<8|16),-(4<<8|17),-(4<<8|18),
352
0
       -(4<<8|19),-(4<<8|20),-(4<<8|21),-(4<<8|22),
353
0
       -(4<<8|23),-(4<<8|24),-(4<<8|25),-(4<<8|26),
354
0
       -(4<<8|27),-(4<<8|28),-(4<<8|29),-(4<<8|30)
355
0
  };
356
0
  return oc_huff_token_decode(_opb,OC_BLOCK_RUN_TREE);
357
0
}
358
359
360
361
0
void oc_dec_accel_init_c(oc_dec_ctx *_dec){
362
# if defined(OC_DEC_USE_VTABLE)
363
  _dec->opt_vtable.dc_unpredict_mcu_plane=
364
   oc_dec_dc_unpredict_mcu_plane_c;
365
# endif
366
}
367
368
static int oc_dec_init(oc_dec_ctx *_dec,const th_info *_info,
369
0
 const th_setup_info *_setup){
370
0
  int qti;
371
0
  int pli;
372
0
  int qi;
373
0
  int ret;
374
0
  ret=oc_state_init(&_dec->state,_info,3);
375
0
  if(ret<0)return ret;
376
0
  ret=oc_huff_trees_copy(_dec->huff_tables,
377
0
   (const ogg_int16_t *const *)_setup->huff_tables);
378
0
  if(ret<0){
379
0
    oc_state_clear(&_dec->state);
380
0
    return ret;
381
0
  }
382
0
  /*For each fragment, allocate one byte for every DCT coefficient token, plus
383
0
     one byte for extra-bits for each token, plus one more byte for the long
384
0
     EOB run, just in case it's the very last token and has a run length of
385
0
     one.*/
386
0
  _dec->dct_tokens=(unsigned char *)_ogg_malloc((64+64+1)*
387
0
   _dec->state.nfrags*sizeof(_dec->dct_tokens[0]));
388
0
  if(_dec->dct_tokens==NULL){
389
0
    oc_huff_trees_clear(_dec->huff_tables);
390
0
    oc_state_clear(&_dec->state);
391
0
    return TH_EFAULT;
392
0
  }
393
0
  for(qi=0;qi<64;qi++)for(pli=0;pli<3;pli++)for(qti=0;qti<2;qti++){
394
0
    _dec->state.dequant_tables[qi][pli][qti]=
395
0
     _dec->state.dequant_table_data[qi][pli][qti];
396
0
  }
397
0
  oc_dequant_tables_init(_dec->state.dequant_tables,_dec->pp_dc_scale,
398
0
   &_setup->qinfo);
399
0
  for(qi=0;qi<64;qi++){
400
0
    int qsum;
401
0
    qsum=0;
402
0
    for(qti=0;qti<2;qti++)for(pli=0;pli<3;pli++){
403
0
      qsum+=_dec->state.dequant_tables[qi][pli][qti][12]+
404
0
       _dec->state.dequant_tables[qi][pli][qti][17]+
405
0
       _dec->state.dequant_tables[qi][pli][qti][18]+
406
0
       _dec->state.dequant_tables[qi][pli][qti][24]<<(pli==0);
407
0
    }
408
0
    _dec->pp_sharp_mod[qi]=-(qsum>>11);
409
0
  }
410
0
  memcpy(_dec->state.loop_filter_limits,_setup->qinfo.loop_filter_limits,
411
0
   sizeof(_dec->state.loop_filter_limits));
412
0
  oc_dec_accel_init(_dec);
413
0
  _dec->pp_level=OC_PP_LEVEL_DISABLED;
414
0
  _dec->dc_qis=NULL;
415
0
  _dec->variances=NULL;
416
0
  _dec->pp_frame_data=NULL;
417
0
  _dec->stripe_cb.ctx=NULL;
418
0
  _dec->stripe_cb.stripe_decoded=NULL;
419
#if defined(HAVE_CAIRO)
420
  _dec->telemetry=0;
421
  _dec->telemetry_bits=0;
422
  _dec->telemetry_qi=0;
423
  _dec->telemetry_mbmode=0;
424
  _dec->telemetry_mv=0;
425
  _dec->telemetry_frame_data=NULL;
426
#endif
427
  return 0;
428
0
}
429
430
0
static void oc_dec_clear(oc_dec_ctx *_dec){
431
#if defined(HAVE_CAIRO)
432
  _ogg_free(_dec->telemetry_frame_data);
433
#endif
434
0
  _ogg_free(_dec->pp_frame_data);
435
0
  _ogg_free(_dec->variances);
436
0
  _ogg_free(_dec->dc_qis);
437
0
  _ogg_free(_dec->dct_tokens);
438
0
  oc_huff_trees_clear(_dec->huff_tables);
439
0
  oc_state_clear(&_dec->state);
440
0
}
441
442
443
0
static int oc_dec_frame_header_unpack(oc_dec_ctx *_dec){
444
0
  long val;
445
0
  /*Check to make sure this is a data packet.*/
446
0
  val=oc_pack_read1(&_dec->opb);
447
0
  if(val!=0)return TH_EBADPACKET;
448
0
  /*Read in the frame type (I or P).*/
449
0
  val=oc_pack_read1(&_dec->opb);
450
0
  _dec->state.frame_type=(int)val;
451
0
  /*Read in the qi list.*/
452
0
  val=oc_pack_read(&_dec->opb,6);
453
0
  _dec->state.qis[0]=(unsigned char)val;
454
0
  val=oc_pack_read1(&_dec->opb);
455
0
  if(!val)_dec->state.nqis=1;
456
0
  else{
457
0
    val=oc_pack_read(&_dec->opb,6);
458
0
    _dec->state.qis[1]=(unsigned char)val;
459
0
    val=oc_pack_read1(&_dec->opb);
460
0
    if(!val)_dec->state.nqis=2;
461
0
    else{
462
0
      val=oc_pack_read(&_dec->opb,6);
463
0
      _dec->state.qis[2]=(unsigned char)val;
464
0
      _dec->state.nqis=3;
465
0
    }
466
0
  }
467
0
  if(_dec->state.frame_type==OC_INTRA_FRAME){
468
0
    /*Keyframes have 3 unused configuration bits, holdovers from VP3 days.
469
0
      Most of the other unused bits in the VP3 headers were eliminated.
470
0
      I don't know why these remain.*/
471
0
    /*I wanted to eliminate wasted bits, but not all config wiggle room
472
0
       --Monty.*/
473
0
    val=oc_pack_read(&_dec->opb,3);
474
0
    if(val!=0)return TH_EIMPL;
475
0
  }
476
0
  return 0;
477
0
}
478
479
/*Mark all fragments as coded and in OC_MODE_INTRA.
480
  This also builds up the coded fragment list (in coded order), and clears the
481
   uncoded fragment list.
482
  It does not update the coded macro block list nor the super block flags, as
483
   those are not used when decoding INTRA frames.*/
484
0
static void oc_dec_mark_all_intra(oc_dec_ctx *_dec){
485
0
  const oc_sb_map   *sb_maps;
486
0
  const oc_sb_flags *sb_flags;
487
0
  oc_fragment       *frags;
488
0
  ptrdiff_t         *coded_fragis;
489
0
  ptrdiff_t          ncoded_fragis;
490
0
  ptrdiff_t          prev_ncoded_fragis;
491
0
  unsigned           nsbs;
492
0
  unsigned           sbi;
493
0
  int                pli;
494
0
  coded_fragis=_dec->state.coded_fragis;
495
0
  prev_ncoded_fragis=ncoded_fragis=0;
496
0
  sb_maps=(const oc_sb_map *)_dec->state.sb_maps;
497
0
  sb_flags=_dec->state.sb_flags;
498
0
  frags=_dec->state.frags;
499
0
  sbi=nsbs=0;
500
0
  for(pli=0;pli<3;pli++){
501
0
    nsbs+=_dec->state.fplanes[pli].nsbs;
502
0
    for(;sbi<nsbs;sbi++){
503
0
      int quadi;
504
0
      for(quadi=0;quadi<4;quadi++)if(sb_flags[sbi].quad_valid&1<<quadi){
505
0
        int bi;
506
0
        for(bi=0;bi<4;bi++){
507
0
          ptrdiff_t fragi;
508
0
          fragi=sb_maps[sbi][quadi][bi];
509
0
          if(fragi>=0){
510
0
            frags[fragi].coded=1;
511
0
            frags[fragi].refi=OC_FRAME_SELF;
512
0
            frags[fragi].mb_mode=OC_MODE_INTRA;
513
0
            coded_fragis[ncoded_fragis++]=fragi;
514
0
          }
515
0
        }
516
0
      }
517
0
    }
518
0
    _dec->state.ncoded_fragis[pli]=ncoded_fragis-prev_ncoded_fragis;
519
0
    prev_ncoded_fragis=ncoded_fragis;
520
0
  }
521
0
  _dec->state.ntotal_coded_fragis=ncoded_fragis;
522
0
}
523
524
/*Decodes the bit flags indicating whether each super block is partially coded
525
   or not.
526
  Return: The number of partially coded super blocks.*/
527
0
static unsigned oc_dec_partial_sb_flags_unpack(oc_dec_ctx *_dec){
528
0
  oc_sb_flags *sb_flags;
529
0
  unsigned     nsbs;
530
0
  unsigned     sbi;
531
0
  unsigned     npartial;
532
0
  unsigned     run_count;
533
0
  long         val;
534
0
  int          flag;
535
0
  val=oc_pack_read1(&_dec->opb);
536
0
  flag=(int)val;
537
0
  sb_flags=_dec->state.sb_flags;
538
0
  nsbs=_dec->state.nsbs;
539
0
  sbi=npartial=0;
540
0
  while(sbi<nsbs){
541
0
    int full_run;
542
0
    run_count=oc_sb_run_unpack(&_dec->opb);
543
0
    full_run=run_count>=4129;
544
0
    do{
545
0
      sb_flags[sbi].coded_partially=flag;
546
0
      sb_flags[sbi].coded_fully=0;
547
0
      npartial+=flag;
548
0
      sbi++;
549
0
    }
550
0
    while(--run_count>0&&sbi<nsbs);
551
0
    if(full_run&&sbi<nsbs){
552
0
      val=oc_pack_read1(&_dec->opb);
553
0
      flag=(int)val;
554
0
    }
555
0
    else flag=!flag;
556
0
  }
557
0
  /*TODO: run_count should be 0 here.
558
0
    If it's not, we should issue a warning of some kind.*/
559
0
  return npartial;
560
0
}
561
562
/*Decodes the bit flags for whether or not each non-partially-coded super
563
   block is fully coded or not.
564
  This function should only be called if there is at least one
565
   non-partially-coded super block.
566
  Return: The number of partially coded super blocks.*/
567
0
static void oc_dec_coded_sb_flags_unpack(oc_dec_ctx *_dec){
568
0
  oc_sb_flags *sb_flags;
569
0
  unsigned     nsbs;
570
0
  unsigned     sbi;
571
0
  unsigned     run_count;
572
0
  long         val;
573
0
  int          flag;
574
0
  sb_flags=_dec->state.sb_flags;
575
0
  nsbs=_dec->state.nsbs;
576
0
  /*Skip partially coded super blocks.*/
577
0
  for(sbi=0;sb_flags[sbi].coded_partially;sbi++);
578
0
  val=oc_pack_read1(&_dec->opb);
579
0
  flag=(int)val;
580
0
  do{
581
0
    int full_run;
582
0
    run_count=oc_sb_run_unpack(&_dec->opb);
583
0
    full_run=run_count>=4129;
584
0
    for(;sbi<nsbs;sbi++){
585
0
      if(sb_flags[sbi].coded_partially)continue;
586
0
      if(run_count--<=0)break;
587
0
      sb_flags[sbi].coded_fully=flag;
588
0
    }
589
0
    if(full_run&&sbi<nsbs){
590
0
      val=oc_pack_read1(&_dec->opb);
591
0
      flag=(int)val;
592
0
    }
593
0
    else flag=!flag;
594
0
  }
595
0
  while(sbi<nsbs);
596
0
  /*TODO: run_count should be 0 here.
597
0
    If it's not, we should issue a warning of some kind.*/
598
0
}
599
600
0
static void oc_dec_coded_flags_unpack(oc_dec_ctx *_dec){
601
0
  const oc_sb_map   *sb_maps;
602
0
  const oc_sb_flags *sb_flags;
603
0
  signed char       *mb_modes;
604
0
  oc_fragment       *frags;
605
0
  unsigned           nsbs;
606
0
  unsigned           sbi;
607
0
  unsigned           npartial;
608
0
  long               val;
609
0
  int                pli;
610
0
  int                flag;
611
0
  int                run_count;
612
0
  ptrdiff_t         *coded_fragis;
613
0
  ptrdiff_t         *uncoded_fragis;
614
0
  ptrdiff_t          ncoded_fragis;
615
0
  ptrdiff_t          nuncoded_fragis;
616
0
  ptrdiff_t          prev_ncoded_fragis;
617
0
  npartial=oc_dec_partial_sb_flags_unpack(_dec);
618
0
  if(npartial<_dec->state.nsbs)oc_dec_coded_sb_flags_unpack(_dec);
619
0
  if(npartial>0){
620
0
    val=oc_pack_read1(&_dec->opb);
621
0
    flag=!(int)val;
622
0
  }
623
0
  else flag=0;
624
0
  sb_maps=(const oc_sb_map *)_dec->state.sb_maps;
625
0
  sb_flags=_dec->state.sb_flags;
626
0
  mb_modes=_dec->state.mb_modes;
627
0
  frags=_dec->state.frags;
628
0
  sbi=nsbs=run_count=0;
629
0
  coded_fragis=_dec->state.coded_fragis;
630
0
  uncoded_fragis=coded_fragis+_dec->state.nfrags;
631
0
  prev_ncoded_fragis=ncoded_fragis=nuncoded_fragis=0;
632
0
  for(pli=0;pli<3;pli++){
633
0
    nsbs+=_dec->state.fplanes[pli].nsbs;
634
0
    for(;sbi<nsbs;sbi++){
635
0
      int quadi;
636
0
      for(quadi=0;quadi<4;quadi++)if(sb_flags[sbi].quad_valid&1<<quadi){
637
0
        int quad_coded;
638
0
        int bi;
639
0
        quad_coded=0;
640
0
        for(bi=0;bi<4;bi++){
641
0
          ptrdiff_t fragi;
642
0
          fragi=sb_maps[sbi][quadi][bi];
643
0
          if(fragi>=0){
644
0
            int coded;
645
0
            if(sb_flags[sbi].coded_fully)coded=1;
646
0
            else if(!sb_flags[sbi].coded_partially)coded=0;
647
0
            else{
648
0
              if(run_count<=0){
649
0
                run_count=oc_block_run_unpack(&_dec->opb);
650
0
                flag=!flag;
651
0
              }
652
0
              run_count--;
653
0
              coded=flag;
654
0
            }
655
0
            if(coded)coded_fragis[ncoded_fragis++]=fragi;
656
0
            else *(uncoded_fragis-++nuncoded_fragis)=fragi;
657
0
            quad_coded|=coded;
658
0
            frags[fragi].coded=coded;
659
0
            frags[fragi].refi=OC_FRAME_NONE;
660
0
          }
661
0
        }
662
0
        /*Remember if there's a coded luma block in this macro block.*/
663
0
        if(!pli)mb_modes[sbi<<2|quadi]=quad_coded;
664
0
      }
665
0
    }
666
0
    _dec->state.ncoded_fragis[pli]=ncoded_fragis-prev_ncoded_fragis;
667
0
    prev_ncoded_fragis=ncoded_fragis;
668
0
  }
669
0
  _dec->state.ntotal_coded_fragis=ncoded_fragis;
670
0
  /*TODO: run_count should be 0 here.
671
0
    If it's not, we should issue a warning of some kind.*/
672
0
}
673
674
675
/*Coding scheme:
676
   Codeword            Mode Index
677
   0                       0
678
   10                      1
679
   110                     2
680
   1110                    3
681
   11110                   4
682
   111110                  5
683
   1111110                 6
684
   1111111                 7*/
685
static const ogg_int16_t OC_VLC_MODE_TREE[26]={
686
  4,
687
   -(1<<8|0),-(1<<8|0),-(1<<8|0),-(1<<8|0),
688
   -(1<<8|0),-(1<<8|0),-(1<<8|0),-(1<<8|0),
689
   -(2<<8|1),-(2<<8|1),-(2<<8|1),-(2<<8|1),
690
   -(3<<8|2),-(3<<8|2),-(4<<8|3),17,
691
    3,
692
     -(1<<8|4),-(1<<8|4),-(1<<8|4),-(1<<8|4),
693
     -(2<<8|5),-(2<<8|5),-(3<<8|6),-(3<<8|7)
694
};
695
696
static const ogg_int16_t OC_CLC_MODE_TREE[9]={
697
  3,
698
   -(3<<8|0),-(3<<8|1),-(3<<8|2),-(3<<8|3),
699
   -(3<<8|4),-(3<<8|5),-(3<<8|6),-(3<<8|7)
700
};
701
702
/*Unpacks the list of macro block modes for INTER frames.*/
703
0
static void oc_dec_mb_modes_unpack(oc_dec_ctx *_dec){
704
0
  signed char         *mb_modes;
705
0
  const unsigned char *alphabet;
706
0
  unsigned char        scheme0_alphabet[8];
707
0
  const ogg_int16_t   *mode_tree;
708
0
  size_t               nmbs;
709
0
  size_t               mbi;
710
0
  long                 val;
711
0
  int                  mode_scheme;
712
0
  val=oc_pack_read(&_dec->opb,3);
713
0
  mode_scheme=(int)val;
714
0
  if(mode_scheme==0){
715
0
    int mi;
716
0
    /*Just in case, initialize the modes to something.
717
0
      If the bitstream doesn't contain each index exactly once, it's likely
718
0
       corrupt and the rest of the packet is garbage anyway, but this way we
719
0
       won't crash, and we'll decode SOMETHING.*/
720
0
    /*LOOP VECTORIZES*/
721
0
    for(mi=0;mi<OC_NMODES;mi++)scheme0_alphabet[mi]=OC_MODE_INTER_NOMV;
722
0
    for(mi=0;mi<OC_NMODES;mi++){
723
0
      val=oc_pack_read(&_dec->opb,3);
724
0
      scheme0_alphabet[val]=OC_MODE_ALPHABETS[6][mi];
725
0
    }
726
0
    alphabet=scheme0_alphabet;
727
0
  }
728
0
  else alphabet=OC_MODE_ALPHABETS[mode_scheme-1];
729
0
  mode_tree=mode_scheme==7?OC_CLC_MODE_TREE:OC_VLC_MODE_TREE;
730
0
  mb_modes=_dec->state.mb_modes;
731
0
  nmbs=_dec->state.nmbs;
732
0
  for(mbi=0;mbi<nmbs;mbi++){
733
0
    if(mb_modes[mbi]>0){
734
0
      /*We have a coded luma block; decode a mode.*/
735
0
      mb_modes[mbi]=alphabet[oc_huff_token_decode(&_dec->opb,mode_tree)];
736
0
    }
737
0
    /*For other valid macro blocks, INTER_NOMV is forced, but we rely on the
738
0
       fact that OC_MODE_INTER_NOMV is already 0.*/
739
0
  }
740
0
}
741
742
743
744
static const ogg_int16_t OC_VLC_MV_COMP_TREE[101]={
745
  5,
746
   -(3<<8|32+0),-(3<<8|32+0),-(3<<8|32+0),-(3<<8|32+0),
747
   -(3<<8|32+1),-(3<<8|32+1),-(3<<8|32+1),-(3<<8|32+1),
748
   -(3<<8|32-1),-(3<<8|32-1),-(3<<8|32-1),-(3<<8|32-1),
749
   -(4<<8|32+2),-(4<<8|32+2),-(4<<8|32-2),-(4<<8|32-2),
750
   -(4<<8|32+3),-(4<<8|32+3),-(4<<8|32-3),-(4<<8|32-3),
751
   33,          36,          39,          42,
752
   45,          50,          55,          60,
753
   65,          74,          83,          92,
754
    1,-(1<<8|32+4),-(1<<8|32-4),
755
    1,-(1<<8|32+5),-(1<<8|32-5),
756
    1,-(1<<8|32+6),-(1<<8|32-6),
757
    1,-(1<<8|32+7),-(1<<8|32-7),
758
    2,-(2<<8|32+8),-(2<<8|32-8),-(2<<8|32+9),-(2<<8|32-9),
759
    2,-(2<<8|32+10),-(2<<8|32-10),-(2<<8|32+11),-(2<<8|32-11),
760
    2,-(2<<8|32+12),-(2<<8|32-12),-(2<<8|32+13),-(2<<8|32-13),
761
    2,-(2<<8|32+14),-(2<<8|32-14),-(2<<8|32+15),-(2<<8|32-15),
762
    3,
763
     -(3<<8|32+16),-(3<<8|32-16),-(3<<8|32+17),-(3<<8|32-17),
764
     -(3<<8|32+18),-(3<<8|32-18),-(3<<8|32+19),-(3<<8|32-19),
765
    3,
766
     -(3<<8|32+20),-(3<<8|32-20),-(3<<8|32+21),-(3<<8|32-21),
767
     -(3<<8|32+22),-(3<<8|32-22),-(3<<8|32+23),-(3<<8|32-23),
768
    3,
769
     -(3<<8|32+24),-(3<<8|32-24),-(3<<8|32+25),-(3<<8|32-25),
770
     -(3<<8|32+26),-(3<<8|32-26),-(3<<8|32+27),-(3<<8|32-27),
771
    3,
772
     -(3<<8|32+28),-(3<<8|32-28),-(3<<8|32+29),-(3<<8|32-29),
773
     -(3<<8|32+30),-(3<<8|32-30),-(3<<8|32+31),-(3<<8|32-31)
774
};
775
776
static const ogg_int16_t OC_CLC_MV_COMP_TREE[65]={
777
  6,
778
   -(6<<8|32 +0),-(6<<8|32 -0),-(6<<8|32 +1),-(6<<8|32 -1),
779
   -(6<<8|32 +2),-(6<<8|32 -2),-(6<<8|32 +3),-(6<<8|32 -3),
780
   -(6<<8|32 +4),-(6<<8|32 -4),-(6<<8|32 +5),-(6<<8|32 -5),
781
   -(6<<8|32 +6),-(6<<8|32 -6),-(6<<8|32 +7),-(6<<8|32 -7),
782
   -(6<<8|32 +8),-(6<<8|32 -8),-(6<<8|32 +9),-(6<<8|32 -9),
783
   -(6<<8|32+10),-(6<<8|32-10),-(6<<8|32+11),-(6<<8|32-11),
784
   -(6<<8|32+12),-(6<<8|32-12),-(6<<8|32+13),-(6<<8|32-13),
785
   -(6<<8|32+14),-(6<<8|32-14),-(6<<8|32+15),-(6<<8|32-15),
786
   -(6<<8|32+16),-(6<<8|32-16),-(6<<8|32+17),-(6<<8|32-17),
787
   -(6<<8|32+18),-(6<<8|32-18),-(6<<8|32+19),-(6<<8|32-19),
788
   -(6<<8|32+20),-(6<<8|32-20),-(6<<8|32+21),-(6<<8|32-21),
789
   -(6<<8|32+22),-(6<<8|32-22),-(6<<8|32+23),-(6<<8|32-23),
790
   -(6<<8|32+24),-(6<<8|32-24),-(6<<8|32+25),-(6<<8|32-25),
791
   -(6<<8|32+26),-(6<<8|32-26),-(6<<8|32+27),-(6<<8|32-27),
792
   -(6<<8|32+28),-(6<<8|32-28),-(6<<8|32+29),-(6<<8|32-29),
793
   -(6<<8|32+30),-(6<<8|32-30),-(6<<8|32+31),-(6<<8|32-31)
794
};
795
796
797
0
static oc_mv oc_mv_unpack(oc_pack_buf *_opb,const ogg_int16_t *_tree){
798
0
  int dx;
799
0
  int dy;
800
0
  dx=oc_huff_token_decode(_opb,_tree)-32;
801
0
  dy=oc_huff_token_decode(_opb,_tree)-32;
802
0
  return OC_MV(dx,dy);
803
0
}
804
805
/*Unpacks the list of motion vectors for INTER frames, and propagtes the macro
806
   block modes and motion vectors to the individual fragments.*/
807
0
static void oc_dec_mv_unpack_and_frag_modes_fill(oc_dec_ctx *_dec){
808
0
  const oc_mb_map        *mb_maps;
809
0
  const signed char      *mb_modes;
810
0
  oc_set_chroma_mvs_func  set_chroma_mvs;
811
0
  const ogg_int16_t      *mv_comp_tree;
812
0
  oc_fragment            *frags;
813
0
  oc_mv                  *frag_mvs;
814
0
  const unsigned char    *map_idxs;
815
0
  int                     map_nidxs;
816
0
  oc_mv                   last_mv;
817
0
  oc_mv                   prior_mv;
818
0
  oc_mv                   cbmvs[4];
819
0
  size_t                  nmbs;
820
0
  size_t                  mbi;
821
0
  long                    val;
822
0
  set_chroma_mvs=OC_SET_CHROMA_MVS_TABLE[_dec->state.info.pixel_fmt];
823
0
  val=oc_pack_read1(&_dec->opb);
824
0
  mv_comp_tree=val?OC_CLC_MV_COMP_TREE:OC_VLC_MV_COMP_TREE;
825
0
  map_idxs=OC_MB_MAP_IDXS[_dec->state.info.pixel_fmt];
826
0
  map_nidxs=OC_MB_MAP_NIDXS[_dec->state.info.pixel_fmt];
827
0
  prior_mv=last_mv=0;
828
0
  frags=_dec->state.frags;
829
0
  frag_mvs=_dec->state.frag_mvs;
830
0
  mb_maps=(const oc_mb_map *)_dec->state.mb_maps;
831
0
  mb_modes=_dec->state.mb_modes;
832
0
  nmbs=_dec->state.nmbs;
833
0
  for(mbi=0;mbi<nmbs;mbi++){
834
0
    int mb_mode;
835
0
    mb_mode=mb_modes[mbi];
836
0
    if(mb_mode!=OC_MODE_INVALID){
837
0
      oc_mv     mbmv;
838
0
      ptrdiff_t fragi;
839
0
      int       mapi;
840
0
      int       mapii;
841
0
      int       refi;
842
0
      if(mb_mode==OC_MODE_INTER_MV_FOUR){
843
0
        oc_mv lbmvs[4];
844
0
        int   bi;
845
0
        prior_mv=last_mv;
846
0
        for(bi=0;bi<4;bi++){
847
0
          fragi=mb_maps[mbi][0][bi];
848
0
          if(frags[fragi].coded){
849
0
            frags[fragi].refi=OC_FRAME_PREV;
850
0
            frags[fragi].mb_mode=OC_MODE_INTER_MV_FOUR;
851
0
            lbmvs[bi]=last_mv=oc_mv_unpack(&_dec->opb,mv_comp_tree);
852
0
            frag_mvs[fragi]=lbmvs[bi];
853
0
          }
854
0
          else lbmvs[bi]=0;
855
0
        }
856
0
        (*set_chroma_mvs)(cbmvs,lbmvs);
857
0
        for(mapii=4;mapii<map_nidxs;mapii++){
858
0
          mapi=map_idxs[mapii];
859
0
          bi=mapi&3;
860
0
          fragi=mb_maps[mbi][mapi>>2][bi];
861
0
          if(frags[fragi].coded){
862
0
            frags[fragi].refi=OC_FRAME_PREV;
863
0
            frags[fragi].mb_mode=OC_MODE_INTER_MV_FOUR;
864
0
            frag_mvs[fragi]=cbmvs[bi];
865
0
          }
866
0
        }
867
0
      }
868
0
      else{
869
0
        switch(mb_mode){
870
0
          case OC_MODE_INTER_MV:{
871
0
            prior_mv=last_mv;
872
0
            last_mv=mbmv=oc_mv_unpack(&_dec->opb,mv_comp_tree);
873
0
          }break;
874
0
          case OC_MODE_INTER_MV_LAST:mbmv=last_mv;break;
875
0
          case OC_MODE_INTER_MV_LAST2:{
876
0
            mbmv=prior_mv;
877
0
            prior_mv=last_mv;
878
0
            last_mv=mbmv;
879
0
          }break;
880
0
          case OC_MODE_GOLDEN_MV:{
881
0
            mbmv=oc_mv_unpack(&_dec->opb,mv_comp_tree);
882
0
          }break;
883
0
          default:mbmv=0;break;
884
0
        }
885
0
        /*Fill in the MVs for the fragments.*/
886
0
        refi=OC_FRAME_FOR_MODE(mb_mode);
887
0
        mapii=0;
888
0
        do{
889
0
          mapi=map_idxs[mapii];
890
0
          fragi=mb_maps[mbi][mapi>>2][mapi&3];
891
0
          if(frags[fragi].coded){
892
0
            frags[fragi].refi=refi;
893
0
            frags[fragi].mb_mode=mb_mode;
894
0
            frag_mvs[fragi]=mbmv;
895
0
          }
896
0
        }
897
0
        while(++mapii<map_nidxs);
898
0
      }
899
0
    }
900
0
  }
901
0
}
902
903
0
static void oc_dec_block_qis_unpack(oc_dec_ctx *_dec){
904
0
  oc_fragment     *frags;
905
0
  const ptrdiff_t *coded_fragis;
906
0
  ptrdiff_t        ncoded_fragis;
907
0
  ptrdiff_t        fragii;
908
0
  ptrdiff_t        fragi;
909
0
  ncoded_fragis=_dec->state.ntotal_coded_fragis;
910
0
  if(ncoded_fragis<=0)return;
911
0
  frags=_dec->state.frags;
912
0
  coded_fragis=_dec->state.coded_fragis;
913
0
  if(_dec->state.nqis==1){
914
0
    /*If this frame has only a single qi value, then just use it for all coded
915
0
       fragments.*/
916
0
    for(fragii=0;fragii<ncoded_fragis;fragii++){
917
0
      frags[coded_fragis[fragii]].qii=0;
918
0
    }
919
0
  }
920
0
  else{
921
0
    long val;
922
0
    int  flag;
923
0
    int  nqi1;
924
0
    int  run_count;
925
0
    /*Otherwise, we decode a qi index for each fragment, using two passes of
926
0
      the same binary RLE scheme used for super-block coded bits.
927
0
     The first pass marks each fragment as having a qii of 0 or greater than
928
0
      0, and the second pass (if necessary), distinguishes between a qii of
929
0
      1 and 2.
930
0
     At first we just store the qii in the fragment.
931
0
     After all the qii's are decoded, we make a final pass to replace them
932
0
      with the corresponding qi's for this frame.*/
933
0
    val=oc_pack_read1(&_dec->opb);
934
0
    flag=(int)val;
935
0
    nqi1=0;
936
0
    fragii=0;
937
0
    while(fragii<ncoded_fragis){
938
0
      int full_run;
939
0
      run_count=oc_sb_run_unpack(&_dec->opb);
940
0
      full_run=run_count>=4129;
941
0
      do{
942
0
        frags[coded_fragis[fragii++]].qii=flag;
943
0
        nqi1+=flag;
944
0
      }
945
0
      while(--run_count>0&&fragii<ncoded_fragis);
946
0
      if(full_run&&fragii<ncoded_fragis){
947
0
        val=oc_pack_read1(&_dec->opb);
948
0
        flag=(int)val;
949
0
      }
950
0
      else flag=!flag;
951
0
    }
952
0
    /*TODO: run_count should be 0 here.
953
0
      If it's not, we should issue a warning of some kind.*/
954
0
    /*If we have 3 different qi's for this frame, and there was at least one
955
0
       fragment with a non-zero qi, make the second pass.*/
956
0
    if(_dec->state.nqis==3&&nqi1>0){
957
0
      /*Skip qii==0 fragments.*/
958
0
      for(fragii=0;frags[coded_fragis[fragii]].qii==0;fragii++);
959
0
      val=oc_pack_read1(&_dec->opb);
960
0
      flag=(int)val;
961
0
      do{
962
0
        int full_run;
963
0
        run_count=oc_sb_run_unpack(&_dec->opb);
964
0
        full_run=run_count>=4129;
965
0
        for(;fragii<ncoded_fragis;fragii++){
966
0
          fragi=coded_fragis[fragii];
967
0
          if(frags[fragi].qii==0)continue;
968
0
          if(run_count--<=0)break;
969
0
          frags[fragi].qii+=flag;
970
0
        }
971
0
        if(full_run&&fragii<ncoded_fragis){
972
0
          val=oc_pack_read1(&_dec->opb);
973
0
          flag=(int)val;
974
0
        }
975
0
        else flag=!flag;
976
0
      }
977
0
      while(fragii<ncoded_fragis);
978
0
      /*TODO: run_count should be 0 here.
979
0
        If it's not, we should issue a warning of some kind.*/
980
0
    }
981
0
  }
982
0
}
983
984
985
986
/*Unpacks the DC coefficient tokens.
987
  Unlike when unpacking the AC coefficient tokens, we actually need to decode
988
   the DC coefficient values now so that we can do DC prediction.
989
  _huff_idx:   The index of the Huffman table to use for each color plane.
990
  _ntoks_left: The number of tokens left to be decoded in each color plane for
991
                each coefficient.
992
               This is updated as EOB tokens and zero run tokens are decoded.
993
  Return: The length of any outstanding EOB run.*/
994
static ptrdiff_t oc_dec_dc_coeff_unpack(oc_dec_ctx *_dec,int _huff_idxs[2],
995
0
 ptrdiff_t _ntoks_left[3][64]){
996
0
  unsigned char   *dct_tokens;
997
0
  oc_fragment     *frags;
998
0
  const ptrdiff_t *coded_fragis;
999
0
  ptrdiff_t        ncoded_fragis;
1000
0
  ptrdiff_t        fragii;
1001
0
  ptrdiff_t        eobs;
1002
0
  ptrdiff_t        ti;
1003
0
  int              pli;
1004
0
  dct_tokens=_dec->dct_tokens;
1005
0
  frags=_dec->state.frags;
1006
0
  coded_fragis=_dec->state.coded_fragis;
1007
0
  ncoded_fragis=fragii=eobs=ti=0;
1008
0
  for(pli=0;pli<3;pli++){
1009
0
    ptrdiff_t run_counts[64];
1010
0
    ptrdiff_t eob_count;
1011
0
    ptrdiff_t eobi;
1012
0
    int       rli;
1013
0
    ncoded_fragis+=_dec->state.ncoded_fragis[pli];
1014
0
    memset(run_counts,0,sizeof(run_counts));
1015
0
    _dec->eob_runs[pli][0]=eobs;
1016
0
    _dec->ti0[pli][0]=ti;
1017
0
    /*Continue any previous EOB run, if there was one.*/
1018
0
    eobi=eobs;
1019
0
    if(ncoded_fragis-fragii<eobi)eobi=ncoded_fragis-fragii;
1020
0
    eob_count=eobi;
1021
0
    eobs-=eobi;
1022
0
    while(eobi-->0)frags[coded_fragis[fragii++]].dc=0;
1023
0
    while(fragii<ncoded_fragis){
1024
0
      int token;
1025
0
      int cw;
1026
0
      int eb;
1027
0
      int skip;
1028
0
      token=oc_huff_token_decode(&_dec->opb,
1029
0
       _dec->huff_tables[_huff_idxs[pli+1>>1]]);
1030
0
      dct_tokens[ti++]=(unsigned char)token;
1031
0
      if(OC_DCT_TOKEN_NEEDS_MORE(token)){
1032
0
        eb=(int)oc_pack_read(&_dec->opb,
1033
0
         OC_INTERNAL_DCT_TOKEN_EXTRA_BITS[token]);
1034
0
        dct_tokens[ti++]=(unsigned char)eb;
1035
0
        if(token==OC_DCT_TOKEN_FAT_EOB)dct_tokens[ti++]=(unsigned char)(eb>>8);
1036
0
        eb<<=OC_DCT_TOKEN_EB_POS(token);
1037
0
      }
1038
0
      else eb=0;
1039
0
      cw=OC_DCT_CODE_WORD[token]+eb;
1040
0
      eobs=cw>>OC_DCT_CW_EOB_SHIFT&0xFFF;
1041
0
      if(cw==OC_DCT_CW_FINISH)eobs=OC_DCT_EOB_FINISH;
1042
0
      if(eobs){
1043
0
        eobi=OC_MINI(eobs,ncoded_fragis-fragii);
1044
0
        eob_count+=eobi;
1045
0
        eobs-=eobi;
1046
0
        while(eobi-->0)frags[coded_fragis[fragii++]].dc=0;
1047
0
      }
1048
0
      else{
1049
0
        int coeff;
1050
0
        skip=(unsigned char)(cw>>OC_DCT_CW_RLEN_SHIFT);
1051
0
        cw^=-(cw&1<<OC_DCT_CW_FLIP_BIT);
1052
0
        coeff=cw>>OC_DCT_CW_MAG_SHIFT;
1053
0
        if(skip)coeff=0;
1054
0
        run_counts[skip]++;
1055
0
        frags[coded_fragis[fragii++]].dc=coeff;
1056
0
      }
1057
0
    }
1058
0
    /*Add the total EOB count to the longest run length.*/
1059
0
    run_counts[63]+=eob_count;
1060
0
    /*And convert the run_counts array to a moment table.*/
1061
0
    for(rli=63;rli-->0;)run_counts[rli]+=run_counts[rli+1];
1062
0
    /*Finally, subtract off the number of coefficients that have been
1063
0
       accounted for by runs started in this coefficient.*/
1064
0
    for(rli=64;rli-->0;)_ntoks_left[pli][rli]-=run_counts[rli];
1065
0
  }
1066
0
  _dec->dct_tokens_count=ti;
1067
0
  return eobs;
1068
0
}
1069
1070
/*Unpacks the AC coefficient tokens.
1071
  This can completely discard coefficient values while unpacking, and so is
1072
   somewhat simpler than unpacking the DC coefficient tokens.
1073
  _huff_idx:   The index of the Huffman table to use for each color plane.
1074
  _ntoks_left: The number of tokens left to be decoded in each color plane for
1075
                each coefficient.
1076
               This is updated as EOB tokens and zero run tokens are decoded.
1077
  _eobs:       The length of any outstanding EOB run from previous
1078
                coefficients.
1079
  Return: The length of any outstanding EOB run.*/
1080
static int oc_dec_ac_coeff_unpack(oc_dec_ctx *_dec,int _zzi,int _huff_idxs[2],
1081
0
 ptrdiff_t _ntoks_left[3][64],ptrdiff_t _eobs){
1082
0
  unsigned char *dct_tokens;
1083
0
  ptrdiff_t      ti;
1084
0
  int            pli;
1085
0
  dct_tokens=_dec->dct_tokens;
1086
0
  ti=_dec->dct_tokens_count;
1087
0
  for(pli=0;pli<3;pli++){
1088
0
    ptrdiff_t run_counts[64];
1089
0
    ptrdiff_t eob_count;
1090
0
    size_t    ntoks_left;
1091
0
    size_t    ntoks;
1092
0
    int       rli;
1093
0
    _dec->eob_runs[pli][_zzi]=_eobs;
1094
0
    _dec->ti0[pli][_zzi]=ti;
1095
0
    ntoks_left=_ntoks_left[pli][_zzi];
1096
0
    memset(run_counts,0,sizeof(run_counts));
1097
0
    eob_count=0;
1098
0
    ntoks=0;
1099
0
    while(ntoks+_eobs<ntoks_left){
1100
0
      int token;
1101
0
      int cw;
1102
0
      int eb;
1103
0
      int skip;
1104
0
      ntoks+=_eobs;
1105
0
      eob_count+=_eobs;
1106
0
      token=oc_huff_token_decode(&_dec->opb,
1107
0
       _dec->huff_tables[_huff_idxs[pli+1>>1]]);
1108
0
      dct_tokens[ti++]=(unsigned char)token;
1109
0
      if(OC_DCT_TOKEN_NEEDS_MORE(token)){
1110
0
        eb=(int)oc_pack_read(&_dec->opb,
1111
0
         OC_INTERNAL_DCT_TOKEN_EXTRA_BITS[token]);
1112
0
        dct_tokens[ti++]=(unsigned char)eb;
1113
0
        if(token==OC_DCT_TOKEN_FAT_EOB)dct_tokens[ti++]=(unsigned char)(eb>>8);
1114
0
        eb<<=OC_DCT_TOKEN_EB_POS(token);
1115
0
      }
1116
0
      else eb=0;
1117
0
      cw=OC_DCT_CODE_WORD[token]+eb;
1118
0
      skip=(unsigned char)(cw>>OC_DCT_CW_RLEN_SHIFT);
1119
0
      _eobs=cw>>OC_DCT_CW_EOB_SHIFT&0xFFF;
1120
0
      if(cw==OC_DCT_CW_FINISH)_eobs=OC_DCT_EOB_FINISH;
1121
0
      if(_eobs==0){
1122
0
        run_counts[skip]++;
1123
0
        ntoks++;
1124
0
      }
1125
0
    }
1126
0
    /*Add the portion of the last EOB run actually used by this coefficient.*/
1127
0
    eob_count+=ntoks_left-ntoks;
1128
0
    /*And remove it from the remaining EOB count.*/
1129
0
    _eobs-=ntoks_left-ntoks;
1130
0
    /*Add the total EOB count to the longest run length.*/
1131
0
    run_counts[63]+=eob_count;
1132
0
    /*And convert the run_counts array to a moment table.*/
1133
0
    for(rli=63;rli-->0;)run_counts[rli]+=run_counts[rli+1];
1134
0
    /*Finally, subtract off the number of coefficients that have been
1135
0
       accounted for by runs started in this coefficient.*/
1136
0
    for(rli=64-_zzi;rli-->0;)_ntoks_left[pli][_zzi+rli]-=run_counts[rli];
1137
0
  }
1138
0
  _dec->dct_tokens_count=ti;
1139
0
  return _eobs;
1140
0
}
1141
1142
/*Tokens describing the DCT coefficients that belong to each fragment are
1143
   stored in the bitstream grouped by coefficient, not by fragment.
1144
1145
  This means that we either decode all the tokens in order, building up a
1146
   separate coefficient list for each fragment as we go, and then go back and
1147
   do the iDCT on each fragment, or we have to create separate lists of tokens
1148
   for each coefficient, so that we can pull the next token required off the
1149
   head of the appropriate list when decoding a specific fragment.
1150
1151
  The former was VP3's choice, and it meant 2*w*h extra storage for all the
1152
   decoded coefficient values.
1153
1154
  We take the second option, which lets us store just one to three bytes per
1155
   token (generally far fewer than the number of coefficients, due to EOB
1156
   tokens and zero runs), and which requires us to only maintain a counter for
1157
   each of the 64 coefficients, instead of a counter for every fragment to
1158
   determine where the next token goes.
1159
1160
  We actually use 3 counters per coefficient, one for each color plane, so we
1161
   can decode all color planes simultaneously.
1162
  This lets color conversion, etc., be done as soon as a full MCU (one or
1163
   two super block rows) is decoded, while the image data is still in cache.*/
1164
1165
0
static void oc_dec_residual_tokens_unpack(oc_dec_ctx *_dec){
1166
0
  static const unsigned char OC_HUFF_LIST_MAX[5]={1,6,15,28,64};
1167
0
  ptrdiff_t  ntoks_left[3][64];
1168
0
  int        huff_idxs[2];
1169
0
  ptrdiff_t  eobs;
1170
0
  long       val;
1171
0
  int        pli;
1172
0
  int        zzi;
1173
0
  int        hgi;
1174
0
  for(pli=0;pli<3;pli++)for(zzi=0;zzi<64;zzi++){
1175
0
    ntoks_left[pli][zzi]=_dec->state.ncoded_fragis[pli];
1176
0
  }
1177
0
  val=oc_pack_read(&_dec->opb,4);
1178
0
  huff_idxs[0]=(int)val;
1179
0
  val=oc_pack_read(&_dec->opb,4);
1180
0
  huff_idxs[1]=(int)val;
1181
0
  _dec->eob_runs[0][0]=0;
1182
0
  eobs=oc_dec_dc_coeff_unpack(_dec,huff_idxs,ntoks_left);
1183
#if defined(HAVE_CAIRO)
1184
  _dec->telemetry_dc_bytes=oc_pack_bytes_left(&_dec->opb);
1185
#endif
1186
0
  val=oc_pack_read(&_dec->opb,4);
1187
0
  huff_idxs[0]=(int)val;
1188
0
  val=oc_pack_read(&_dec->opb,4);
1189
0
  huff_idxs[1]=(int)val;
1190
0
  zzi=1;
1191
0
  for(hgi=1;hgi<5;hgi++){
1192
0
    huff_idxs[0]+=16;
1193
0
    huff_idxs[1]+=16;
1194
0
    for(;zzi<OC_HUFF_LIST_MAX[hgi];zzi++){
1195
0
      eobs=oc_dec_ac_coeff_unpack(_dec,zzi,huff_idxs,ntoks_left,eobs);
1196
0
    }
1197
0
  }
1198
0
  /*TODO: eobs should be exactly zero, or 4096 or greater.
1199
0
    The second case occurs when an EOB run of size zero is encountered, which
1200
0
     gets treated as an infinite EOB run (where infinity is PTRDIFF_MAX).
1201
0
    If neither of these conditions holds, then a warning should be issued.*/
1202
0
}
1203
1204
1205
0
static int oc_dec_postprocess_init(oc_dec_ctx *_dec){
1206
0
  /*pp_level 0: disabled; free any memory used and return*/
1207
0
  if(_dec->pp_level<=OC_PP_LEVEL_DISABLED){
1208
0
    if(_dec->dc_qis!=NULL){
1209
0
      _ogg_free(_dec->dc_qis);
1210
0
      _dec->dc_qis=NULL;
1211
0
      _ogg_free(_dec->variances);
1212
0
      _dec->variances=NULL;
1213
0
      _ogg_free(_dec->pp_frame_data);
1214
0
      _dec->pp_frame_data=NULL;
1215
0
    }
1216
0
    return 1;
1217
0
  }
1218
0
  if(_dec->dc_qis==NULL){
1219
0
    /*If we haven't been tracking DC quantization indices, there's no point in
1220
0
       starting now.*/
1221
0
    if(_dec->state.frame_type!=OC_INTRA_FRAME)return 1;
1222
0
    _dec->dc_qis=(unsigned char *)_ogg_malloc(
1223
0
     _dec->state.nfrags*sizeof(_dec->dc_qis[0]));
1224
0
    if(_dec->dc_qis==NULL)return 1;
1225
0
    memset(_dec->dc_qis,_dec->state.qis[0],_dec->state.nfrags);
1226
0
  }
1227
0
  else{
1228
0
    unsigned char   *dc_qis;
1229
0
    const ptrdiff_t *coded_fragis;
1230
0
    ptrdiff_t        ncoded_fragis;
1231
0
    ptrdiff_t        fragii;
1232
0
    unsigned char    qi0;
1233
0
    /*Update the DC quantization index of each coded block.*/
1234
0
    dc_qis=_dec->dc_qis;
1235
0
    coded_fragis=_dec->state.coded_fragis;
1236
0
    ncoded_fragis=_dec->state.ncoded_fragis[0]+
1237
0
     _dec->state.ncoded_fragis[1]+_dec->state.ncoded_fragis[2];
1238
0
    qi0=(unsigned char)_dec->state.qis[0];
1239
0
    for(fragii=0;fragii<ncoded_fragis;fragii++){
1240
0
      dc_qis[coded_fragis[fragii]]=qi0;
1241
0
    }
1242
0
  }
1243
0
  /*pp_level 1: Stop after updating DC quantization indices.*/
1244
0
  if(_dec->pp_level<=OC_PP_LEVEL_TRACKDCQI){
1245
0
    if(_dec->variances!=NULL){
1246
0
      _ogg_free(_dec->variances);
1247
0
      _dec->variances=NULL;
1248
0
      _ogg_free(_dec->pp_frame_data);
1249
0
      _dec->pp_frame_data=NULL;
1250
0
    }
1251
0
    return 1;
1252
0
  }
1253
0
  if(_dec->variances==NULL){
1254
0
    size_t frame_sz;
1255
0
    size_t c_sz;
1256
0
    int    c_w;
1257
0
    int    c_h;
1258
0
    frame_sz=_dec->state.info.frame_width*(size_t)_dec->state.info.frame_height;
1259
0
    c_w=_dec->state.info.frame_width>>!(_dec->state.info.pixel_fmt&1);
1260
0
    c_h=_dec->state.info.frame_height>>!(_dec->state.info.pixel_fmt&2);
1261
0
    c_sz=c_w*(size_t)c_h;
1262
0
    /*Allocate space for the chroma planes, even if we're not going to use
1263
0
       them; this simplifies allocation state management, though it may waste
1264
0
       memory on the few systems that don't overcommit pages.*/
1265
0
    frame_sz+=c_sz<<1;
1266
0
    _dec->pp_frame_data=(unsigned char *)_ogg_malloc(
1267
0
     frame_sz*sizeof(_dec->pp_frame_data[0]));
1268
0
    _dec->variances=(int *)_ogg_malloc(
1269
0
     _dec->state.nfrags*sizeof(_dec->variances[0]));
1270
0
    if(_dec->variances==NULL||_dec->pp_frame_data==NULL){
1271
0
      _ogg_free(_dec->pp_frame_data);
1272
0
      _dec->pp_frame_data=NULL;
1273
0
      _ogg_free(_dec->variances);
1274
0
      _dec->variances=NULL;
1275
0
      return 1;
1276
0
    }
1277
0
    /*Force an update of the PP buffer pointers.*/
1278
0
    _dec->pp_frame_state=0;
1279
0
  }
1280
0
  /*Update the PP buffer pointers if necessary.*/
1281
0
  if(_dec->pp_frame_state!=1+(_dec->pp_level>=OC_PP_LEVEL_DEBLOCKC)){
1282
0
    if(_dec->pp_level<OC_PP_LEVEL_DEBLOCKC){
1283
0
      /*If chroma processing is disabled, just use the PP luma plane.*/
1284
0
      _dec->pp_frame_buf[0].width=_dec->state.info.frame_width;
1285
0
      _dec->pp_frame_buf[0].height=_dec->state.info.frame_height;
1286
0
      _dec->pp_frame_buf[0].stride=-_dec->pp_frame_buf[0].width;
1287
0
      _dec->pp_frame_buf[0].data=_dec->pp_frame_data+
1288
0
       (1-_dec->pp_frame_buf[0].height)*(ptrdiff_t)_dec->pp_frame_buf[0].stride;
1289
0
    }
1290
0
    else{
1291
0
      size_t y_sz;
1292
0
      size_t c_sz;
1293
0
      int    c_w;
1294
0
      int    c_h;
1295
0
      /*Otherwise, set up pointers to all three PP planes.*/
1296
0
      y_sz=_dec->state.info.frame_width*(size_t)_dec->state.info.frame_height;
1297
0
      c_w=_dec->state.info.frame_width>>!(_dec->state.info.pixel_fmt&1);
1298
0
      c_h=_dec->state.info.frame_height>>!(_dec->state.info.pixel_fmt&2);
1299
0
      c_sz=c_w*(size_t)c_h;
1300
0
      _dec->pp_frame_buf[0].width=_dec->state.info.frame_width;
1301
0
      _dec->pp_frame_buf[0].height=_dec->state.info.frame_height;
1302
0
      _dec->pp_frame_buf[0].stride=_dec->pp_frame_buf[0].width;
1303
0
      _dec->pp_frame_buf[0].data=_dec->pp_frame_data;
1304
0
      _dec->pp_frame_buf[1].width=c_w;
1305
0
      _dec->pp_frame_buf[1].height=c_h;
1306
0
      _dec->pp_frame_buf[1].stride=_dec->pp_frame_buf[1].width;
1307
0
      _dec->pp_frame_buf[1].data=_dec->pp_frame_buf[0].data+y_sz;
1308
0
      _dec->pp_frame_buf[2].width=c_w;
1309
0
      _dec->pp_frame_buf[2].height=c_h;
1310
0
      _dec->pp_frame_buf[2].stride=_dec->pp_frame_buf[2].width;
1311
0
      _dec->pp_frame_buf[2].data=_dec->pp_frame_buf[1].data+c_sz;
1312
0
      oc_ycbcr_buffer_flip(_dec->pp_frame_buf,_dec->pp_frame_buf);
1313
0
    }
1314
0
    _dec->pp_frame_state=1+(_dec->pp_level>=OC_PP_LEVEL_DEBLOCKC);
1315
0
  }
1316
0
  /*If we're not processing chroma, copy the reference frame's chroma planes.*/
1317
0
  if(_dec->pp_level<OC_PP_LEVEL_DEBLOCKC){
1318
0
    memcpy(_dec->pp_frame_buf+1,
1319
0
     _dec->state.ref_frame_bufs[_dec->state.ref_frame_idx[OC_FRAME_SELF]]+1,
1320
0
     sizeof(_dec->pp_frame_buf[1])*2);
1321
0
  }
1322
0
  return 0;
1323
0
}
1324
1325
1326
/*Initialize the main decoding pipeline.*/
1327
static void oc_dec_pipeline_init(oc_dec_ctx *_dec,
1328
0
 oc_dec_pipeline_state *_pipe){
1329
0
  const ptrdiff_t *coded_fragis;
1330
0
  const ptrdiff_t *uncoded_fragis;
1331
0
  int              flimit;
1332
0
  int              pli;
1333
0
  int              qii;
1334
0
  int              qti;
1335
0
  int              zzi;
1336
0
  /*If chroma is sub-sampled in the vertical direction, we have to decode two
1337
0
     super block rows of Y' for each super block row of Cb and Cr.*/
1338
0
  _pipe->mcu_nvfrags=4<<!(_dec->state.info.pixel_fmt&2);
1339
0
  /*Initialize the token and extra bits indices for each plane and
1340
0
     coefficient.*/
1341
0
  memcpy(_pipe->ti,_dec->ti0,sizeof(_pipe->ti));
1342
0
  /*Also copy over the initial the EOB run counts.*/
1343
0
  memcpy(_pipe->eob_runs,_dec->eob_runs,sizeof(_pipe->eob_runs));
1344
0
  /*Set up per-plane pointers to the coded and uncoded fragments lists.*/
1345
0
  coded_fragis=_dec->state.coded_fragis;
1346
0
  uncoded_fragis=coded_fragis+_dec->state.nfrags;
1347
0
  for(pli=0;pli<3;pli++){
1348
0
    ptrdiff_t ncoded_fragis;
1349
0
    _pipe->coded_fragis[pli]=coded_fragis;
1350
0
    _pipe->uncoded_fragis[pli]=uncoded_fragis;
1351
0
    ncoded_fragis=_dec->state.ncoded_fragis[pli];
1352
0
    coded_fragis+=ncoded_fragis;
1353
0
    uncoded_fragis+=ncoded_fragis-_dec->state.fplanes[pli].nfrags;
1354
0
  }
1355
0
  /*Set up condensed quantizer tables.*/
1356
0
  for(pli=0;pli<3;pli++){
1357
0
    for(qii=0;qii<_dec->state.nqis;qii++){
1358
0
      for(qti=0;qti<2;qti++){
1359
0
        _pipe->dequant[pli][qii][qti]=
1360
0
         _dec->state.dequant_tables[_dec->state.qis[qii]][pli][qti];
1361
0
      }
1362
0
    }
1363
0
  }
1364
0
  /*Set the previous DC predictor to 0 for all color planes and frame types.*/
1365
0
  memset(_pipe->pred_last,0,sizeof(_pipe->pred_last));
1366
0
  /*Initialize the bounding value array for the loop filter.*/
1367
0
  flimit=_dec->state.loop_filter_limits[_dec->state.qis[0]];
1368
0
  _pipe->loop_filter=flimit!=0;
1369
0
  if(flimit!=0)oc_loop_filter_init(&_dec->state,_pipe->bounding_values,flimit);
1370
0
  /*Initialize any buffers needed for post-processing.
1371
0
    We also save the current post-processing level, to guard against the user
1372
0
     changing it from a callback.*/
1373
0
  if(!oc_dec_postprocess_init(_dec))_pipe->pp_level=_dec->pp_level;
1374
0
  /*If we don't have enough information to post-process, disable it, regardless
1375
0
     of the user-requested level.*/
1376
0
  else{
1377
0
    _pipe->pp_level=OC_PP_LEVEL_DISABLED;
1378
0
    memcpy(_dec->pp_frame_buf,
1379
0
     _dec->state.ref_frame_bufs[_dec->state.ref_frame_idx[OC_FRAME_SELF]],
1380
0
     sizeof(_dec->pp_frame_buf[0])*3);
1381
0
  }
1382
0
  /*Clear down the DCT coefficient buffer for the first block.*/
1383
0
  for(zzi=0;zzi<64;zzi++)_pipe->dct_coeffs[zzi]=0;
1384
0
}
1385
1386
/*Undo the DC prediction in a single plane of an MCU (one or two super block
1387
   rows).
1388
  As a side effect, the number of coded and uncoded fragments in this plane of
1389
   the MCU is also computed.*/
1390
void oc_dec_dc_unpredict_mcu_plane_c(oc_dec_ctx *_dec,
1391
0
 oc_dec_pipeline_state *_pipe,int _pli){
1392
0
  const oc_fragment_plane *fplane;
1393
0
  oc_fragment             *frags;
1394
0
  int                     *pred_last;
1395
0
  ptrdiff_t                ncoded_fragis;
1396
0
  ptrdiff_t                fragi;
1397
0
  int                      fragx;
1398
0
  int                      fragy;
1399
0
  int                      fragy0;
1400
0
  int                      fragy_end;
1401
0
  int                      nhfrags;
1402
0
  /*Compute the first and last fragment row of the current MCU for this
1403
0
     plane.*/
1404
0
  fplane=_dec->state.fplanes+_pli;
1405
0
  fragy0=_pipe->fragy0[_pli];
1406
0
  fragy_end=_pipe->fragy_end[_pli];
1407
0
  nhfrags=fplane->nhfrags;
1408
0
  pred_last=_pipe->pred_last[_pli];
1409
0
  frags=_dec->state.frags;
1410
0
  ncoded_fragis=0;
1411
0
  fragi=fplane->froffset+fragy0*(ptrdiff_t)nhfrags;
1412
0
  for(fragy=fragy0;fragy<fragy_end;fragy++){
1413
0
    if(fragy==0){
1414
0
      /*For the first row, all of the cases reduce to just using the previous
1415
0
         predictor for the same reference frame.*/
1416
0
      for(fragx=0;fragx<nhfrags;fragx++,fragi++){
1417
0
        if(frags[fragi].coded){
1418
0
          int refi;
1419
0
          refi=frags[fragi].refi;
1420
0
          pred_last[refi]=frags[fragi].dc+=pred_last[refi];
1421
0
          ncoded_fragis++;
1422
0
        }
1423
0
      }
1424
0
    }
1425
0
    else{
1426
0
      oc_fragment *u_frags;
1427
0
      int          l_ref;
1428
0
      int          ul_ref;
1429
0
      int          u_ref;
1430
0
      u_frags=frags-nhfrags;
1431
0
      l_ref=-1;
1432
0
      ul_ref=-1;
1433
0
      u_ref=u_frags[fragi].refi;
1434
0
      for(fragx=0;fragx<nhfrags;fragx++,fragi++){
1435
0
        int ur_ref;
1436
0
        if(fragx+1>=nhfrags)ur_ref=-1;
1437
0
        else ur_ref=u_frags[fragi+1].refi;
1438
0
        if(frags[fragi].coded){
1439
0
          int pred;
1440
0
          int refi;
1441
0
          refi=frags[fragi].refi;
1442
0
          /*We break out a separate case based on which of our neighbors use
1443
0
             the same reference frames.
1444
0
            This is somewhat faster than trying to make a generic case which
1445
0
             handles all of them, since it reduces lots of poorly predicted
1446
0
             jumps to one switch statement, and also lets a number of the
1447
0
             multiplications be optimized out by strength reduction.*/
1448
0
          switch((l_ref==refi)|(ul_ref==refi)<<1|
1449
0
           (u_ref==refi)<<2|(ur_ref==refi)<<3){
1450
0
            default:pred=pred_last[refi];break;
1451
0
            case  1:
1452
0
            case  3:pred=frags[fragi-1].dc;break;
1453
0
            case  2:pred=u_frags[fragi-1].dc;break;
1454
0
            case  4:
1455
0
            case  6:
1456
0
            case 12:pred=u_frags[fragi].dc;break;
1457
0
            case  5:pred=(frags[fragi-1].dc+u_frags[fragi].dc)/2;break;
1458
0
            case  8:pred=u_frags[fragi+1].dc;break;
1459
0
            case  9:
1460
0
            case 11:
1461
0
            case 13:{
1462
0
              /*The TI compiler mis-compiles this line.*/
1463
0
              pred=(75*frags[fragi-1].dc+53*u_frags[fragi+1].dc)/128;
1464
0
            }break;
1465
0
            case 10:pred=(u_frags[fragi-1].dc+u_frags[fragi+1].dc)/2;break;
1466
0
            case 14:{
1467
0
              pred=(3*(u_frags[fragi-1].dc+u_frags[fragi+1].dc)
1468
0
               +10*u_frags[fragi].dc)/16;
1469
0
            }break;
1470
0
            case  7:
1471
0
            case 15:{
1472
0
              int p0;
1473
0
              int p1;
1474
0
              int p2;
1475
0
              p0=frags[fragi-1].dc;
1476
0
              p1=u_frags[fragi-1].dc;
1477
0
              p2=u_frags[fragi].dc;
1478
0
              pred=(29*(p0+p2)-26*p1)/32;
1479
0
              if(abs(pred-p2)>128)pred=p2;
1480
0
              else if(abs(pred-p0)>128)pred=p0;
1481
0
              else if(abs(pred-p1)>128)pred=p1;
1482
0
            }break;
1483
0
          }
1484
0
          pred_last[refi]=frags[fragi].dc+=pred;
1485
0
          ncoded_fragis++;
1486
0
          l_ref=refi;
1487
0
        }
1488
0
        else l_ref=-1;
1489
0
        ul_ref=u_ref;
1490
0
        u_ref=ur_ref;
1491
0
      }
1492
0
    }
1493
0
  }
1494
0
  _pipe->ncoded_fragis[_pli]=ncoded_fragis;
1495
0
  /*Also save the number of uncoded fragments so we know how many to copy.*/
1496
0
  _pipe->nuncoded_fragis[_pli]=
1497
0
   (fragy_end-fragy0)*(ptrdiff_t)nhfrags-ncoded_fragis;
1498
0
}
1499
1500
/*Reconstructs all coded fragments in a single MCU (one or two super block
1501
   rows).
1502
  This requires that each coded fragment have a proper macro block mode and
1503
   motion vector (if not in INTRA mode), and have its DC value decoded, with
1504
   the DC prediction process reversed, and the number of coded and uncoded
1505
   fragments in this plane of the MCU be counted.
1506
  The token lists for each color plane and coefficient should also be filled
1507
   in, along with initial token offsets, extra bits offsets, and EOB run
1508
   counts.*/
1509
static void oc_dec_frags_recon_mcu_plane(oc_dec_ctx *_dec,
1510
0
 oc_dec_pipeline_state *_pipe,int _pli){
1511
0
  unsigned char       *dct_tokens;
1512
0
  const unsigned char *dct_fzig_zag;
1513
0
  ogg_uint16_t         dc_quant[2];
1514
0
  const oc_fragment   *frags;
1515
0
  const ptrdiff_t     *coded_fragis;
1516
0
  ptrdiff_t            ncoded_fragis;
1517
0
  ptrdiff_t            fragii;
1518
0
  ptrdiff_t           *ti;
1519
0
  ptrdiff_t           *eob_runs;
1520
0
  int                  qti;
1521
0
  dct_tokens=_dec->dct_tokens;
1522
0
  dct_fzig_zag=_dec->state.opt_data.dct_fzig_zag;
1523
0
  frags=_dec->state.frags;
1524
0
  coded_fragis=_pipe->coded_fragis[_pli];
1525
0
  ncoded_fragis=_pipe->ncoded_fragis[_pli];
1526
0
  ti=_pipe->ti[_pli];
1527
0
  eob_runs=_pipe->eob_runs[_pli];
1528
0
  for(qti=0;qti<2;qti++)dc_quant[qti]=_pipe->dequant[_pli][0][qti][0];
1529
0
  for(fragii=0;fragii<ncoded_fragis;fragii++){
1530
0
    const ogg_uint16_t *ac_quant;
1531
0
    ptrdiff_t           fragi;
1532
0
    int                 last_zzi;
1533
0
    int                 zzi;
1534
0
    fragi=coded_fragis[fragii];
1535
0
    qti=frags[fragi].mb_mode!=OC_MODE_INTRA;
1536
0
    ac_quant=_pipe->dequant[_pli][frags[fragi].qii][qti];
1537
0
    /*Decode the AC coefficients.*/
1538
0
    for(zzi=0;zzi<64;){
1539
0
      int token;
1540
0
      last_zzi=zzi;
1541
0
      if(eob_runs[zzi]){
1542
0
        eob_runs[zzi]--;
1543
0
        break;
1544
0
      }
1545
0
      else{
1546
0
        ptrdiff_t eob;
1547
0
        int       cw;
1548
0
        int       rlen;
1549
0
        int       coeff;
1550
0
        int       lti;
1551
0
        lti=ti[zzi];
1552
0
        token=dct_tokens[lti++];
1553
0
        cw=OC_DCT_CODE_WORD[token];
1554
0
        /*These parts could be done branchless, but the branches are fairly
1555
0
           predictable and the C code translates into more than a few
1556
0
           instructions, so it's worth it to avoid them.*/
1557
0
        if(OC_DCT_TOKEN_NEEDS_MORE(token)){
1558
0
          cw+=dct_tokens[lti++]<<OC_DCT_TOKEN_EB_POS(token);
1559
0
        }
1560
0
        eob=cw>>OC_DCT_CW_EOB_SHIFT&0xFFF;
1561
0
        if(token==OC_DCT_TOKEN_FAT_EOB){
1562
0
          eob+=dct_tokens[lti++]<<8;
1563
0
          if(eob==0)eob=OC_DCT_EOB_FINISH;
1564
0
        }
1565
0
        rlen=(unsigned char)(cw>>OC_DCT_CW_RLEN_SHIFT);
1566
0
        cw^=-(cw&1<<OC_DCT_CW_FLIP_BIT);
1567
0
        coeff=cw>>OC_DCT_CW_MAG_SHIFT;
1568
0
        eob_runs[zzi]=eob;
1569
0
        ti[zzi]=lti;
1570
0
        zzi+=rlen;
1571
0
        _pipe->dct_coeffs[dct_fzig_zag[zzi]]=
1572
0
         (ogg_int16_t)(coeff*(int)ac_quant[zzi]);
1573
0
        zzi+=!eob;
1574
0
      }
1575
0
    }
1576
0
    /*TODO: zzi should be exactly 64 here.
1577
0
      If it's not, we should report some kind of warning.*/
1578
0
    zzi=OC_MINI(zzi,64);
1579
0
    _pipe->dct_coeffs[0]=(ogg_int16_t)frags[fragi].dc;
1580
0
    /*last_zzi is always initialized.
1581
0
      If your compiler thinks otherwise, it is dumb.*/
1582
0
    oc_state_frag_recon(&_dec->state,fragi,_pli,
1583
0
     _pipe->dct_coeffs,last_zzi,dc_quant[qti]);
1584
0
  }
1585
0
  _pipe->coded_fragis[_pli]+=ncoded_fragis;
1586
0
  /*Right now the reconstructed MCU has only the coded blocks in it.*/
1587
0
  /*TODO: We make the decision here to always copy the uncoded blocks into it
1588
0
     from the reference frame.
1589
0
    We could also copy the coded blocks back over the reference frame, if we
1590
0
     wait for an additional MCU to be decoded, which might be faster if only a
1591
0
     small number of blocks are coded.
1592
0
    However, this introduces more latency, creating a larger cache footprint.
1593
0
    It's unknown which decision is better, but this one results in simpler
1594
0
     code, and the hard case (high bitrate, high resolution) is handled
1595
0
     correctly.*/
1596
0
  /*Copy the uncoded blocks from the previous reference frame.*/
1597
0
  if(_pipe->nuncoded_fragis[_pli]>0){
1598
0
    _pipe->uncoded_fragis[_pli]-=_pipe->nuncoded_fragis[_pli];
1599
0
    oc_frag_copy_list(&_dec->state,
1600
0
     _dec->state.ref_frame_data[OC_FRAME_SELF],
1601
0
     _dec->state.ref_frame_data[OC_FRAME_PREV],
1602
0
     _dec->state.ref_ystride[_pli],_pipe->uncoded_fragis[_pli],
1603
0
     _pipe->nuncoded_fragis[_pli],_dec->state.frag_buf_offs);
1604
0
  }
1605
0
}
1606
1607
/*Filter a horizontal block edge.*/
1608
static void oc_filter_hedge(unsigned char *_dst,int _dst_ystride,
1609
 const unsigned char *_src,int _src_ystride,int _qstep,int _flimit,
1610
0
 int *_variance0,int *_variance1){
1611
0
  unsigned char       *rdst;
1612
0
  const unsigned char *rsrc;
1613
0
  unsigned char       *cdst;
1614
0
  const unsigned char *csrc;
1615
0
  int                  r[10];
1616
0
  int                  sum0;
1617
0
  int                  sum1;
1618
0
  int                  bx;
1619
0
  int                  by;
1620
0
  rdst=_dst;
1621
0
  rsrc=_src;
1622
0
  for(bx=0;bx<8;bx++){
1623
0
    cdst=rdst;
1624
0
    csrc=rsrc;
1625
0
    for(by=0;by<10;by++){
1626
0
      r[by]=*csrc;
1627
0
      csrc+=_src_ystride;
1628
0
    }
1629
0
    sum0=sum1=0;
1630
0
    for(by=0;by<4;by++){
1631
0
      sum0+=abs(r[by+1]-r[by]);
1632
0
      sum1+=abs(r[by+5]-r[by+6]);
1633
0
    }
1634
0
    *_variance0+=OC_MINI(255,sum0);
1635
0
    *_variance1+=OC_MINI(255,sum1);
1636
0
    if(sum0<_flimit&&sum1<_flimit&&r[5]-r[4]<_qstep&&r[4]-r[5]<_qstep){
1637
0
      *cdst=(unsigned char)(r[0]*3+r[1]*2+r[2]+r[3]+r[4]+4>>3);
1638
0
      cdst+=_dst_ystride;
1639
0
      *cdst=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
1640
0
      cdst+=_dst_ystride;
1641
0
      for(by=0;by<4;by++){
1642
0
        *cdst=(unsigned char)(r[by]+r[by+1]+r[by+2]+r[by+3]*2+
1643
0
         r[by+4]+r[by+5]+r[by+6]+4>>3);
1644
0
        cdst+=_dst_ystride;
1645
0
      }
1646
0
      *cdst=(unsigned char)(r[4]+r[5]+r[6]+r[7]*2+r[8]+r[9]*2+4>>3);
1647
0
      cdst+=_dst_ystride;
1648
0
      *cdst=(unsigned char)(r[5]+r[6]+r[7]+r[8]*2+r[9]*3+4>>3);
1649
0
    }
1650
0
    else{
1651
0
      for(by=1;by<=8;by++){
1652
0
        *cdst=(unsigned char)r[by];
1653
0
        cdst+=_dst_ystride;
1654
0
      }
1655
0
    }
1656
0
    rdst++;
1657
0
    rsrc++;
1658
0
  }
1659
0
}
1660
1661
/*Filter a vertical block edge.*/
1662
static void oc_filter_vedge(unsigned char *_dst,int _dst_ystride,
1663
0
 int _qstep,int _flimit,int *_variances){
1664
0
  unsigned char       *rdst;
1665
0
  const unsigned char *rsrc;
1666
0
  unsigned char       *cdst;
1667
0
  int                  r[10];
1668
0
  int                  sum0;
1669
0
  int                  sum1;
1670
0
  int                  bx;
1671
0
  int                  by;
1672
0
  cdst=_dst;
1673
0
  for(by=0;by<8;by++){
1674
0
    rsrc=cdst-1;
1675
0
    rdst=cdst;
1676
0
    for(bx=0;bx<10;bx++)r[bx]=*rsrc++;
1677
0
    sum0=sum1=0;
1678
0
    for(bx=0;bx<4;bx++){
1679
0
      sum0+=abs(r[bx+1]-r[bx]);
1680
0
      sum1+=abs(r[bx+5]-r[bx+6]);
1681
0
    }
1682
0
    _variances[0]+=OC_MINI(255,sum0);
1683
0
    _variances[1]+=OC_MINI(255,sum1);
1684
0
    if(sum0<_flimit&&sum1<_flimit&&r[5]-r[4]<_qstep&&r[4]-r[5]<_qstep){
1685
0
      *rdst++=(unsigned char)(r[0]*3+r[1]*2+r[2]+r[3]+r[4]+4>>3);
1686
0
      *rdst++=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
1687
0
      for(bx=0;bx<4;bx++){
1688
0
        *rdst++=(unsigned char)(r[bx]+r[bx+1]+r[bx+2]+r[bx+3]*2+
1689
0
         r[bx+4]+r[bx+5]+r[bx+6]+4>>3);
1690
0
      }
1691
0
      *rdst++=(unsigned char)(r[4]+r[5]+r[6]+r[7]*2+r[8]+r[9]*2+4>>3);
1692
0
      *rdst=(unsigned char)(r[5]+r[6]+r[7]+r[8]*2+r[9]*3+4>>3);
1693
0
    }
1694
0
    cdst+=_dst_ystride;
1695
0
  }
1696
0
}
1697
1698
static void oc_dec_deblock_frag_rows(oc_dec_ctx *_dec,
1699
 th_img_plane *_dst,th_img_plane *_src,int _pli,int _fragy0,
1700
0
 int _fragy_end){
1701
0
  oc_fragment_plane   *fplane;
1702
0
  int                 *variance;
1703
0
  unsigned char       *dc_qi;
1704
0
  unsigned char       *dst;
1705
0
  const unsigned char *src;
1706
0
  ptrdiff_t            froffset;
1707
0
  int                  dst_ystride;
1708
0
  int                  src_ystride;
1709
0
  int                  nhfrags;
1710
0
  int                  width;
1711
0
  int                  notstart;
1712
0
  int                  notdone;
1713
0
  int                  flimit;
1714
0
  int                  qstep;
1715
0
  int                  y_end;
1716
0
  int                  y;
1717
0
  int                  x;
1718
0
  _dst+=_pli;
1719
0
  _src+=_pli;
1720
0
  fplane=_dec->state.fplanes+_pli;
1721
0
  nhfrags=fplane->nhfrags;
1722
0
  froffset=fplane->froffset+_fragy0*(ptrdiff_t)nhfrags;
1723
0
  variance=_dec->variances+froffset;
1724
0
  dc_qi=_dec->dc_qis+froffset;
1725
0
  notstart=_fragy0>0;
1726
0
  notdone=_fragy_end<fplane->nvfrags;
1727
0
  /*We want to clear an extra row of variances, except at the end.*/
1728
0
  memset(variance+(nhfrags&-notstart),0,
1729
0
   (_fragy_end+notdone-_fragy0-notstart)*(nhfrags*sizeof(variance[0])));
1730
0
  /*Except for the first time, we want to point to the middle of the row.*/
1731
0
  y=(_fragy0<<3)+(notstart<<2);
1732
0
  dst_ystride=_dst->stride;
1733
0
  src_ystride=_src->stride;
1734
0
  dst=_dst->data+y*(ptrdiff_t)dst_ystride;
1735
0
  src=_src->data+y*(ptrdiff_t)src_ystride;
1736
0
  width=_dst->width;
1737
0
  for(;y<4;y++){
1738
0
    memcpy(dst,src,width*sizeof(dst[0]));
1739
0
    dst+=dst_ystride;
1740
0
    src+=src_ystride;
1741
0
  }
1742
0
  /*We also want to skip the last row in the frame for this loop.*/
1743
0
  y_end=_fragy_end-!notdone<<3;
1744
0
  for(;y<y_end;y+=8){
1745
0
    qstep=_dec->pp_dc_scale[*dc_qi];
1746
0
    flimit=(qstep*3)>>2;
1747
0
    oc_filter_hedge(dst,dst_ystride,src-src_ystride,src_ystride,
1748
0
     qstep,flimit,variance,variance+nhfrags);
1749
0
    variance++;
1750
0
    dc_qi++;
1751
0
    for(x=8;x<width;x+=8){
1752
0
      qstep=_dec->pp_dc_scale[*dc_qi];
1753
0
      flimit=(qstep*3)>>2;
1754
0
      oc_filter_hedge(dst+x,dst_ystride,src+x-src_ystride,src_ystride,
1755
0
       qstep,flimit,variance,variance+nhfrags);
1756
0
      oc_filter_vedge(dst+x-(dst_ystride<<2)-4,dst_ystride,
1757
0
       qstep,flimit,variance-1);
1758
0
      variance++;
1759
0
      dc_qi++;
1760
0
    }
1761
0
    dst+=dst_ystride<<3;
1762
0
    src+=src_ystride<<3;
1763
0
  }
1764
0
  /*And finally, handle the last row in the frame, if it's in the range.*/
1765
0
  if(!notdone){
1766
0
    int height;
1767
0
    height=_dst->height;
1768
0
    for(;y<height;y++){
1769
0
      memcpy(dst,src,width*sizeof(dst[0]));
1770
0
      dst+=dst_ystride;
1771
0
      src+=src_ystride;
1772
0
    }
1773
0
    /*Filter the last row of vertical block edges.*/
1774
0
    dc_qi++;
1775
0
    for(x=8;x<width;x+=8){
1776
0
      qstep=_dec->pp_dc_scale[*dc_qi++];
1777
0
      flimit=(qstep*3)>>2;
1778
0
      oc_filter_vedge(dst+x-(dst_ystride<<3)-4,dst_ystride,
1779
0
       qstep,flimit,variance++);
1780
0
    }
1781
0
  }
1782
0
}
1783
1784
static void oc_dering_block(unsigned char *_idata,int _ystride,int _b,
1785
0
 int _dc_scale,int _sharp_mod,int _strong){
1786
0
  static const unsigned char OC_MOD_MAX[2]={24,32};
1787
0
  static const unsigned char OC_MOD_SHIFT[2]={1,0};
1788
0
  const unsigned char *psrc;
1789
0
  const unsigned char *src;
1790
0
  const unsigned char *nsrc;
1791
0
  unsigned char       *dst;
1792
0
  int                  vmod[72];
1793
0
  int                  hmod[72];
1794
0
  int                  mod_hi;
1795
0
  int                  by;
1796
0
  int                  bx;
1797
0
  mod_hi=OC_MINI(3*_dc_scale,OC_MOD_MAX[_strong]);
1798
0
  dst=_idata;
1799
0
  src=dst;
1800
0
  psrc=src-(_ystride&-!(_b&4));
1801
0
  for(by=0;by<9;by++){
1802
0
    for(bx=0;bx<8;bx++){
1803
0
      int mod;
1804
0
      mod=32+_dc_scale-(abs(src[bx]-psrc[bx])<<OC_MOD_SHIFT[_strong]);
1805
0
      vmod[(by<<3)+bx]=mod<-64?_sharp_mod:OC_CLAMPI(0,mod,mod_hi);
1806
0
    }
1807
0
    psrc=src;
1808
0
    src+=_ystride&-(!(_b&8)|by<7);
1809
0
  }
1810
0
  nsrc=dst;
1811
0
  psrc=dst-!(_b&1);
1812
0
  for(bx=0;bx<9;bx++){
1813
0
    src=nsrc;
1814
0
    for(by=0;by<8;by++){
1815
0
      int mod;
1816
0
      mod=32+_dc_scale-(abs(*src-*psrc)<<OC_MOD_SHIFT[_strong]);
1817
0
      hmod[(bx<<3)+by]=mod<-64?_sharp_mod:OC_CLAMPI(0,mod,mod_hi);
1818
0
      psrc+=_ystride;
1819
0
      src+=_ystride;
1820
0
    }
1821
0
    psrc=nsrc;
1822
0
    nsrc+=!(_b&2)|bx<7;
1823
0
  }
1824
0
  src=dst;
1825
0
  psrc=src-(_ystride&-!(_b&4));
1826
0
  nsrc=src+_ystride;
1827
0
  for(by=0;by<8;by++){
1828
0
    int a;
1829
0
    int b;
1830
0
    int w;
1831
0
    a=128;
1832
0
    b=64;
1833
0
    w=hmod[by];
1834
0
    a-=w;
1835
0
    b+=w**(src-!(_b&1));
1836
0
    w=vmod[by<<3];
1837
0
    a-=w;
1838
0
    b+=w*psrc[0];
1839
0
    w=vmod[by+1<<3];
1840
0
    a-=w;
1841
0
    b+=w*nsrc[0];
1842
0
    w=hmod[(1<<3)+by];
1843
0
    a-=w;
1844
0
    b+=w*src[1];
1845
0
    dst[0]=OC_CLAMP255(a*src[0]+b>>7);
1846
0
    for(bx=1;bx<7;bx++){
1847
0
      a=128;
1848
0
      b=64;
1849
0
      w=hmod[(bx<<3)+by];
1850
0
      a-=w;
1851
0
      b+=w*src[bx-1];
1852
0
      w=vmod[(by<<3)+bx];
1853
0
      a-=w;
1854
0
      b+=w*psrc[bx];
1855
0
      w=vmod[(by+1<<3)+bx];
1856
0
      a-=w;
1857
0
      b+=w*nsrc[bx];
1858
0
      w=hmod[(bx+1<<3)+by];
1859
0
      a-=w;
1860
0
      b+=w*src[bx+1];
1861
0
      dst[bx]=OC_CLAMP255(a*src[bx]+b>>7);
1862
0
    }
1863
0
    a=128;
1864
0
    b=64;
1865
0
    w=hmod[(7<<3)+by];
1866
0
    a-=w;
1867
0
    b+=w*src[6];
1868
0
    w=vmod[(by<<3)+7];
1869
0
    a-=w;
1870
0
    b+=w*psrc[7];
1871
0
    w=vmod[(by+1<<3)+7];
1872
0
    a-=w;
1873
0
    b+=w*nsrc[7];
1874
0
    w=hmod[(8<<3)+by];
1875
0
    a-=w;
1876
0
    b+=w*src[7+!(_b&2)];
1877
0
    dst[7]=OC_CLAMP255(a*src[7]+b>>7);
1878
0
    dst+=_ystride;
1879
0
    psrc=src;
1880
0
    src=nsrc;
1881
0
    nsrc+=_ystride&-(!(_b&8)|by<6);
1882
0
  }
1883
0
}
1884
1885
0
#define OC_DERING_THRESH1 (384)
1886
0
#define OC_DERING_THRESH2 (4*OC_DERING_THRESH1)
1887
0
#define OC_DERING_THRESH3 (5*OC_DERING_THRESH1)
1888
0
#define OC_DERING_THRESH4 (10*OC_DERING_THRESH1)
1889
1890
static void oc_dec_dering_frag_rows(oc_dec_ctx *_dec,th_img_plane *_img,
1891
0
 int _pli,int _fragy0,int _fragy_end){
1892
0
  th_img_plane      *iplane;
1893
0
  oc_fragment_plane *fplane;
1894
0
  oc_fragment       *frag;
1895
0
  int               *variance;
1896
0
  unsigned char     *idata;
1897
0
  ptrdiff_t          froffset;
1898
0
  int                ystride;
1899
0
  int                nhfrags;
1900
0
  int                sthresh;
1901
0
  int                strong;
1902
0
  int                y_end;
1903
0
  int                width;
1904
0
  int                height;
1905
0
  int                y;
1906
0
  int                x;
1907
0
  iplane=_img+_pli;
1908
0
  fplane=_dec->state.fplanes+_pli;
1909
0
  nhfrags=fplane->nhfrags;
1910
0
  froffset=fplane->froffset+_fragy0*(ptrdiff_t)nhfrags;
1911
0
  variance=_dec->variances+froffset;
1912
0
  frag=_dec->state.frags+froffset;
1913
0
  strong=_dec->pp_level>=(_pli?OC_PP_LEVEL_SDERINGC:OC_PP_LEVEL_SDERINGY);
1914
0
  sthresh=_pli?OC_DERING_THRESH4:OC_DERING_THRESH3;
1915
0
  y=_fragy0<<3;
1916
0
  ystride=iplane->stride;
1917
0
  idata=iplane->data+y*(ptrdiff_t)ystride;
1918
0
  y_end=_fragy_end<<3;
1919
0
  width=iplane->width;
1920
0
  height=iplane->height;
1921
0
  for(;y<y_end;y+=8){
1922
0
    for(x=0;x<width;x+=8){
1923
0
      int b;
1924
0
      int qi;
1925
0
      int var;
1926
0
      qi=_dec->state.qis[frag->qii];
1927
0
      var=*variance;
1928
0
      b=(x<=0)|(x+8>=width)<<1|(y<=0)<<2|(y+8>=height)<<3;
1929
0
      if(strong&&var>sthresh){
1930
0
        oc_dering_block(idata+x,ystride,b,
1931
0
         _dec->pp_dc_scale[qi],_dec->pp_sharp_mod[qi],1);
1932
0
        if(_pli||!(b&1)&&*(variance-1)>OC_DERING_THRESH4||
1933
0
         !(b&2)&&variance[1]>OC_DERING_THRESH4||
1934
0
         !(b&4)&&*(variance-nhfrags)>OC_DERING_THRESH4||
1935
0
         !(b&8)&&variance[nhfrags]>OC_DERING_THRESH4){
1936
0
          oc_dering_block(idata+x,ystride,b,
1937
0
           _dec->pp_dc_scale[qi],_dec->pp_sharp_mod[qi],1);
1938
0
          oc_dering_block(idata+x,ystride,b,
1939
0
           _dec->pp_dc_scale[qi],_dec->pp_sharp_mod[qi],1);
1940
0
        }
1941
0
      }
1942
0
      else if(var>OC_DERING_THRESH2){
1943
0
        oc_dering_block(idata+x,ystride,b,
1944
0
         _dec->pp_dc_scale[qi],_dec->pp_sharp_mod[qi],1);
1945
0
      }
1946
0
      else if(var>OC_DERING_THRESH1){
1947
0
        oc_dering_block(idata+x,ystride,b,
1948
0
         _dec->pp_dc_scale[qi],_dec->pp_sharp_mod[qi],0);
1949
0
      }
1950
0
      frag++;
1951
0
      variance++;
1952
0
    }
1953
0
    idata+=ystride<<3;
1954
0
  }
1955
0
}
1956
1957
1958
1959
0
th_dec_ctx *th_decode_alloc(const th_info *_info,const th_setup_info *_setup){
1960
0
  oc_dec_ctx *dec;
1961
0
  if(_info==NULL||_setup==NULL)return NULL;
1962
0
  dec=oc_aligned_malloc(sizeof(*dec),16);
1963
0
  if(dec==NULL||oc_dec_init(dec,_info,_setup)<0){
1964
0
    oc_aligned_free(dec);
1965
0
    return NULL;
1966
0
  }
1967
0
  dec->state.curframe_num=0;
1968
0
  return dec;
1969
0
}
1970
1971
0
void th_decode_free(th_dec_ctx *_dec){
1972
0
  if(_dec!=NULL){
1973
0
    oc_dec_clear(_dec);
1974
0
    oc_aligned_free(_dec);
1975
0
  }
1976
0
}
1977
1978
int th_decode_ctl(th_dec_ctx *_dec,int _req,void *_buf,
1979
0
 size_t _buf_sz){
1980
0
  switch(_req){
1981
0
  case TH_DECCTL_GET_PPLEVEL_MAX:{
1982
0
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
1983
0
    if(_buf_sz!=sizeof(int))return TH_EINVAL;
1984
0
    (*(int *)_buf)=OC_PP_LEVEL_MAX;
1985
0
    return 0;
1986
0
  }break;
1987
0
  case TH_DECCTL_SET_PPLEVEL:{
1988
0
    int pp_level;
1989
0
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
1990
0
    if(_buf_sz!=sizeof(int))return TH_EINVAL;
1991
0
    pp_level=*(int *)_buf;
1992
0
    if(pp_level<0||pp_level>OC_PP_LEVEL_MAX)return TH_EINVAL;
1993
0
    _dec->pp_level=pp_level;
1994
0
    return 0;
1995
0
  }break;
1996
0
  case TH_DECCTL_SET_GRANPOS:{
1997
0
    ogg_int64_t granpos;
1998
0
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
1999
0
    if(_buf_sz!=sizeof(ogg_int64_t))return TH_EINVAL;
2000
0
    granpos=*(ogg_int64_t *)_buf;
2001
0
    if(granpos<0)return TH_EINVAL;
2002
0
    _dec->state.granpos=granpos;
2003
0
    _dec->state.keyframe_num=(granpos>>_dec->state.info.keyframe_granule_shift)
2004
0
     -_dec->state.granpos_bias;
2005
0
    _dec->state.curframe_num=_dec->state.keyframe_num
2006
0
     +(granpos&(1<<_dec->state.info.keyframe_granule_shift)-1);
2007
0
    return 0;
2008
0
  }break;
2009
0
  case TH_DECCTL_SET_STRIPE_CB:{
2010
0
    th_stripe_callback *cb;
2011
0
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
2012
0
    if(_buf_sz!=sizeof(th_stripe_callback))return TH_EINVAL;
2013
0
    cb=(th_stripe_callback *)_buf;
2014
0
    _dec->stripe_cb.ctx=cb->ctx;
2015
0
    _dec->stripe_cb.stripe_decoded=cb->stripe_decoded;
2016
0
    return 0;
2017
0
  }break;
2018
#ifdef HAVE_CAIRO
2019
  case TH_DECCTL_SET_TELEMETRY_MBMODE:{
2020
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
2021
    if(_buf_sz!=sizeof(int))return TH_EINVAL;
2022
    _dec->telemetry=1;
2023
    _dec->telemetry_mbmode=*(int *)_buf;
2024
    return 0;
2025
  }break;
2026
  case TH_DECCTL_SET_TELEMETRY_MV:{
2027
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
2028
    if(_buf_sz!=sizeof(int))return TH_EINVAL;
2029
    _dec->telemetry=1;
2030
    _dec->telemetry_mv=*(int *)_buf;
2031
    return 0;
2032
  }break;
2033
  case TH_DECCTL_SET_TELEMETRY_QI:{
2034
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
2035
    if(_buf_sz!=sizeof(int))return TH_EINVAL;
2036
    _dec->telemetry=1;
2037
    _dec->telemetry_qi=*(int *)_buf;
2038
    return 0;
2039
  }break;
2040
  case TH_DECCTL_SET_TELEMETRY_BITS:{
2041
    if(_dec==NULL||_buf==NULL)return TH_EFAULT;
2042
    if(_buf_sz!=sizeof(int))return TH_EINVAL;
2043
    _dec->telemetry=1;
2044
    _dec->telemetry_bits=*(int *)_buf;
2045
    return 0;
2046
  }break;
2047
#endif
2048
0
  default:return TH_EIMPL;
2049
0
  }
2050
0
}
2051
2052
/*We're decoding an INTER frame, but have no initialized reference
2053
   buffers (i.e., decoding did not start on a key frame).
2054
  We initialize them to a solid gray here.*/
2055
0
static void oc_dec_init_dummy_frame(th_dec_ctx *_dec){
2056
0
  th_info   *info;
2057
0
  size_t     yplane_sz;
2058
0
  size_t     cplane_sz;
2059
0
  ptrdiff_t  yoffset;
2060
0
  int        yhstride;
2061
0
  int        yheight;
2062
0
  int        chstride;
2063
0
  int        cheight;
2064
0
  _dec->state.ref_frame_idx[OC_FRAME_GOLD]=0;
2065
0
  _dec->state.ref_frame_idx[OC_FRAME_PREV]=0;
2066
0
  _dec->state.ref_frame_idx[OC_FRAME_SELF]=0;
2067
0
  _dec->state.ref_frame_data[OC_FRAME_GOLD]=
2068
0
   _dec->state.ref_frame_data[OC_FRAME_PREV]=
2069
0
   _dec->state.ref_frame_data[OC_FRAME_SELF]=
2070
0
   _dec->state.ref_frame_bufs[0][0].data;
2071
0
  memcpy(_dec->pp_frame_buf,_dec->state.ref_frame_bufs[0],
2072
0
   sizeof(_dec->pp_frame_buf[0])*3);
2073
0
  info=&_dec->state.info;
2074
0
  yhstride=abs(_dec->state.ref_ystride[0]);
2075
0
  yheight=info->frame_height+2*OC_UMV_PADDING;
2076
0
  chstride=abs(_dec->state.ref_ystride[1]);
2077
0
  cheight=yheight>>!(info->pixel_fmt&2);
2078
0
  yplane_sz=yhstride*(size_t)yheight+16;
2079
0
  cplane_sz=chstride*(size_t)cheight;
2080
0
  yoffset=yhstride*(ptrdiff_t)(yheight-OC_UMV_PADDING-1)+OC_UMV_PADDING;
2081
0
  memset(_dec->state.ref_frame_data[0]-yoffset,0x80,yplane_sz+2*cplane_sz);
2082
0
}
2083
2084
int th_decode_packetin(th_dec_ctx *_dec,const ogg_packet *_op,
2085
0
 ogg_int64_t *_granpos){
2086
0
  int ret;
2087
0
  if(_dec==NULL||_op==NULL)return TH_EFAULT;
2088
0
  /*A completely empty packet indicates a dropped frame and is treated exactly
2089
0
     like an inter frame with no coded blocks.*/
2090
0
  if(_op->bytes==0){
2091
0
    _dec->state.frame_type=OC_INTER_FRAME;
2092
0
    _dec->state.ntotal_coded_fragis=0;
2093
0
  }
2094
0
  else{
2095
0
    oc_pack_readinit(&_dec->opb,_op->packet,_op->bytes);
2096
0
    ret=oc_dec_frame_header_unpack(_dec);
2097
0
    if(ret<0)return ret;
2098
0
    if(_dec->state.frame_type==OC_INTRA_FRAME)oc_dec_mark_all_intra(_dec);
2099
0
    else oc_dec_coded_flags_unpack(_dec);
2100
0
  }
2101
0
  /*If there have been no reference frames, and we need one, initialize one.*/
2102
0
  if(_dec->state.frame_type!=OC_INTRA_FRAME&&
2103
0
   (_dec->state.ref_frame_idx[OC_FRAME_GOLD]<0||
2104
0
   _dec->state.ref_frame_idx[OC_FRAME_PREV]<0)){
2105
0
    oc_dec_init_dummy_frame(_dec);
2106
0
  }
2107
0
  /*If this was an inter frame with no coded blocks...*/
2108
0
  if(_dec->state.ntotal_coded_fragis<=0){
2109
0
    /*Just update the granule position and return.*/
2110
0
    _dec->state.granpos=(_dec->state.keyframe_num+_dec->state.granpos_bias<<
2111
0
     _dec->state.info.keyframe_granule_shift)
2112
0
     +(_dec->state.curframe_num-_dec->state.keyframe_num);
2113
0
    _dec->state.curframe_num++;
2114
0
    if(_granpos!=NULL)*_granpos=_dec->state.granpos;
2115
0
    return TH_DUPFRAME;
2116
0
  }
2117
0
  else{
2118
0
    th_ycbcr_buffer stripe_buf;
2119
0
    int             stripe_fragy;
2120
0
    int             refi;
2121
0
    int             pli;
2122
0
    int             notstart;
2123
0
    int             notdone;
2124
0
    /*Select a free buffer to use for the reconstructed version of this frame.*/
2125
0
    for(refi=0;refi==_dec->state.ref_frame_idx[OC_FRAME_GOLD]||
2126
0
     refi==_dec->state.ref_frame_idx[OC_FRAME_PREV];refi++);
2127
0
    _dec->state.ref_frame_idx[OC_FRAME_SELF]=refi;
2128
0
    _dec->state.ref_frame_data[OC_FRAME_SELF]=
2129
0
     _dec->state.ref_frame_bufs[refi][0].data;
2130
#if defined(HAVE_CAIRO)
2131
    _dec->telemetry_frame_bytes=_op->bytes;
2132
#endif
2133
0
    if(_dec->state.frame_type==OC_INTRA_FRAME){
2134
0
      _dec->state.keyframe_num=_dec->state.curframe_num;
2135
#if defined(HAVE_CAIRO)
2136
      _dec->telemetry_coding_bytes=
2137
       _dec->telemetry_mode_bytes=
2138
       _dec->telemetry_mv_bytes=oc_pack_bytes_left(&_dec->opb);
2139
#endif
2140
    }
2141
0
    else{
2142
#if defined(HAVE_CAIRO)
2143
      _dec->telemetry_coding_bytes=oc_pack_bytes_left(&_dec->opb);
2144
#endif
2145
      oc_dec_mb_modes_unpack(_dec);
2146
#if defined(HAVE_CAIRO)
2147
      _dec->telemetry_mode_bytes=oc_pack_bytes_left(&_dec->opb);
2148
#endif
2149
      oc_dec_mv_unpack_and_frag_modes_fill(_dec);
2150
#if defined(HAVE_CAIRO)
2151
      _dec->telemetry_mv_bytes=oc_pack_bytes_left(&_dec->opb);
2152
#endif
2153
    }
2154
0
    oc_dec_block_qis_unpack(_dec);
2155
#if defined(HAVE_CAIRO)
2156
    _dec->telemetry_qi_bytes=oc_pack_bytes_left(&_dec->opb);
2157
#endif
2158
    oc_dec_residual_tokens_unpack(_dec);
2159
0
    /*Update granule position.
2160
0
      This must be done before the striped decode callbacks so that the
2161
0
       application knows what to do with the frame data.*/
2162
0
    _dec->state.granpos=(_dec->state.keyframe_num+_dec->state.granpos_bias<<
2163
0
     _dec->state.info.keyframe_granule_shift)
2164
0
     +(_dec->state.curframe_num-_dec->state.keyframe_num);
2165
0
    _dec->state.curframe_num++;
2166
0
    if(_granpos!=NULL)*_granpos=_dec->state.granpos;
2167
0
    /*All of the rest of the operations -- DC prediction reversal,
2168
0
       reconstructing coded fragments, copying uncoded fragments, loop
2169
0
       filtering, extending borders, and out-of-loop post-processing -- should
2170
0
       be pipelined.
2171
0
      I.e., DC prediction reversal, reconstruction, and uncoded fragment
2172
0
       copying are done for one or two super block rows, then loop filtering is
2173
0
       run as far as it can, then bordering copying, then post-processing.
2174
0
      For 4:2:0 video a Minimum Codable Unit or MCU contains two luma super
2175
0
       block rows, and one chroma.
2176
0
      Otherwise, an MCU consists of one super block row from each plane.
2177
0
      Inside each MCU, we perform all of the steps on one color plane before
2178
0
       moving on to the next.
2179
0
      After reconstruction, the additional filtering stages introduce a delay
2180
0
       since they need some pixels from the next fragment row.
2181
0
      Thus the actual number of decoded rows available is slightly smaller for
2182
0
       the first MCU, and slightly larger for the last.
2183
0
2184
0
      This entire process allows us to operate on the data while it is still in
2185
0
       cache, resulting in big performance improvements.
2186
0
      An application callback allows further application processing (blitting
2187
0
       to video memory, color conversion, etc.) to also use the data while it's
2188
0
       in cache.*/
2189
0
    oc_dec_pipeline_init(_dec,&_dec->pipe);
2190
0
    oc_ycbcr_buffer_flip(stripe_buf,_dec->pp_frame_buf);
2191
0
    notstart=0;
2192
0
    notdone=1;
2193
0
    for(stripe_fragy=0;notdone;stripe_fragy+=_dec->pipe.mcu_nvfrags){
2194
0
      int avail_fragy0;
2195
0
      int avail_fragy_end;
2196
0
      avail_fragy0=avail_fragy_end=_dec->state.fplanes[0].nvfrags;
2197
0
      notdone=stripe_fragy+_dec->pipe.mcu_nvfrags<avail_fragy_end;
2198
0
      for(pli=0;pli<3;pli++){
2199
0
        oc_fragment_plane *fplane;
2200
0
        int                frag_shift;
2201
0
        int                pp_offset;
2202
0
        int                sdelay;
2203
0
        int                edelay;
2204
0
        fplane=_dec->state.fplanes+pli;
2205
0
        /*Compute the first and last fragment row of the current MCU for this
2206
0
           plane.*/
2207
0
        frag_shift=pli!=0&&!(_dec->state.info.pixel_fmt&2);
2208
0
        _dec->pipe.fragy0[pli]=stripe_fragy>>frag_shift;
2209
0
        _dec->pipe.fragy_end[pli]=OC_MINI(fplane->nvfrags,
2210
0
         _dec->pipe.fragy0[pli]+(_dec->pipe.mcu_nvfrags>>frag_shift));
2211
0
        oc_dec_dc_unpredict_mcu_plane(_dec,&_dec->pipe,pli);
2212
0
        oc_dec_frags_recon_mcu_plane(_dec,&_dec->pipe,pli);
2213
0
        sdelay=edelay=0;
2214
0
        if(_dec->pipe.loop_filter){
2215
0
          sdelay+=notstart;
2216
0
          edelay+=notdone;
2217
0
          oc_state_loop_filter_frag_rows(&_dec->state,
2218
0
           _dec->pipe.bounding_values,OC_FRAME_SELF,pli,
2219
0
           _dec->pipe.fragy0[pli]-sdelay,_dec->pipe.fragy_end[pli]-edelay);
2220
0
        }
2221
0
        /*To fill the borders, we have an additional two pixel delay, since a
2222
0
           fragment in the next row could filter its top edge, using two pixels
2223
0
           from a fragment in this row.
2224
0
          But there's no reason to delay a full fragment between the two.*/
2225
0
        oc_state_borders_fill_rows(&_dec->state,refi,pli,
2226
0
         (_dec->pipe.fragy0[pli]-sdelay<<3)-(sdelay<<1),
2227
0
         (_dec->pipe.fragy_end[pli]-edelay<<3)-(edelay<<1));
2228
0
        /*Out-of-loop post-processing.*/
2229
0
        pp_offset=3*(pli!=0);
2230
0
        if(_dec->pipe.pp_level>=OC_PP_LEVEL_DEBLOCKY+pp_offset){
2231
0
          /*Perform de-blocking in one plane.*/
2232
0
          sdelay+=notstart;
2233
0
          edelay+=notdone;
2234
0
          oc_dec_deblock_frag_rows(_dec,_dec->pp_frame_buf,
2235
0
           _dec->state.ref_frame_bufs[refi],pli,
2236
0
           _dec->pipe.fragy0[pli]-sdelay,_dec->pipe.fragy_end[pli]-edelay);
2237
0
          if(_dec->pipe.pp_level>=OC_PP_LEVEL_DERINGY+pp_offset){
2238
0
            /*Perform de-ringing in one plane.*/
2239
0
            sdelay+=notstart;
2240
0
            edelay+=notdone;
2241
0
            oc_dec_dering_frag_rows(_dec,_dec->pp_frame_buf,pli,
2242
0
             _dec->pipe.fragy0[pli]-sdelay,_dec->pipe.fragy_end[pli]-edelay);
2243
0
          }
2244
0
        }
2245
0
        /*If no post-processing is done, we still need to delay a row for the
2246
0
           loop filter, thanks to the strange filtering order VP3 chose.*/
2247
0
        else if(_dec->pipe.loop_filter){
2248
0
          sdelay+=notstart;
2249
0
          edelay+=notdone;
2250
0
        }
2251
0
        /*Compute the intersection of the available rows in all planes.
2252
0
          If chroma is sub-sampled, the effect of each of its delays is
2253
0
           doubled, but luma might have more post-processing filters enabled
2254
0
           than chroma, so we don't know up front which one is the limiting
2255
0
           factor.*/
2256
0
        avail_fragy0=OC_MINI(avail_fragy0,
2257
0
         _dec->pipe.fragy0[pli]-sdelay<<frag_shift);
2258
0
        avail_fragy_end=OC_MINI(avail_fragy_end,
2259
0
         _dec->pipe.fragy_end[pli]-edelay<<frag_shift);
2260
0
      }
2261
0
      if(_dec->stripe_cb.stripe_decoded!=NULL){
2262
0
        /*The callback might want to use the FPU, so let's make sure they can.
2263
0
          We violate all kinds of ABI restrictions by not doing this until
2264
0
           now, but none of them actually matter since we don't use floating
2265
0
           point ourselves.*/
2266
0
        oc_restore_fpu(&_dec->state);
2267
0
        /*Make the callback, ensuring we flip the sense of the "start" and
2268
0
           "end" of the available region upside down.*/
2269
0
        (*_dec->stripe_cb.stripe_decoded)(_dec->stripe_cb.ctx,stripe_buf,
2270
0
         _dec->state.fplanes[0].nvfrags-avail_fragy_end,
2271
0
         _dec->state.fplanes[0].nvfrags-avail_fragy0);
2272
0
      }
2273
0
      notstart=1;
2274
0
    }
2275
0
    /*Finish filling in the reference frame borders.*/
2276
0
    for(pli=0;pli<3;pli++)oc_state_borders_fill_caps(&_dec->state,refi,pli);
2277
0
    /*Update the reference frame indices.*/
2278
0
    if(_dec->state.frame_type==OC_INTRA_FRAME){
2279
0
      /*The new frame becomes both the previous and gold reference frames.*/
2280
0
      _dec->state.ref_frame_idx[OC_FRAME_GOLD]=
2281
0
       _dec->state.ref_frame_idx[OC_FRAME_PREV]=
2282
0
       _dec->state.ref_frame_idx[OC_FRAME_SELF];
2283
0
      _dec->state.ref_frame_data[OC_FRAME_GOLD]=
2284
0
       _dec->state.ref_frame_data[OC_FRAME_PREV]=
2285
0
       _dec->state.ref_frame_data[OC_FRAME_SELF];
2286
0
    }
2287
0
    else{
2288
0
      /*Otherwise, just replace the previous reference frame.*/
2289
0
      _dec->state.ref_frame_idx[OC_FRAME_PREV]=
2290
0
       _dec->state.ref_frame_idx[OC_FRAME_SELF];
2291
0
      _dec->state.ref_frame_data[OC_FRAME_PREV]=
2292
0
       _dec->state.ref_frame_data[OC_FRAME_SELF];
2293
0
    }
2294
0
    /*Restore the FPU before dump_frame, since that _does_ use the FPU (for PNG
2295
0
       gamma values, if nothing else).*/
2296
0
    oc_restore_fpu(&_dec->state);
2297
#if defined(OC_DUMP_IMAGES)
2298
    /*We only dump images if there were some coded blocks.*/
2299
    oc_state_dump_frame(&_dec->state,OC_FRAME_SELF,"dec");
2300
#endif
2301
    return 0;
2302
0
  }
2303
0
}
2304
2305
0
int th_decode_ycbcr_out(th_dec_ctx *_dec,th_ycbcr_buffer _ycbcr){
2306
0
  if(_dec==NULL||_ycbcr==NULL)return TH_EFAULT;
2307
0
  oc_ycbcr_buffer_flip(_ycbcr,_dec->pp_frame_buf);
2308
#if defined(HAVE_CAIRO)
2309
  /*If telemetry ioctls are active, we need to draw to the output buffer.
2310
    Stuff the plane into cairo.*/
2311
  if(_dec->telemetry){
2312
    cairo_surface_t *cs;
2313
    unsigned char   *data;
2314
    unsigned char   *y_row;
2315
    unsigned char   *u_row;
2316
    unsigned char   *v_row;
2317
    unsigned char   *rgb_row;
2318
    int              cstride;
2319
    int              w;
2320
    int              h;
2321
    int              x;
2322
    int              y;
2323
    int              hdec;
2324
    int              vdec;
2325
    w=_ycbcr[0].width;
2326
    h=_ycbcr[0].height;
2327
    hdec=!(_dec->state.info.pixel_fmt&1);
2328
    vdec=!(_dec->state.info.pixel_fmt&2);
2329
    /*Lazy data buffer init.
2330
      We could try to re-use the post-processing buffer, which would save
2331
       memory, but complicate the allocation logic there.
2332
      I don't think anyone cares about memory usage when using telemetry; it is
2333
       not meant for embedded devices.*/
2334
    if(_dec->telemetry_frame_data==NULL){
2335
      _dec->telemetry_frame_data=_ogg_malloc(
2336
       (w*h+2*(w>>hdec)*(h>>vdec))*sizeof(*_dec->telemetry_frame_data));
2337
      if(_dec->telemetry_frame_data==NULL)return 0;
2338
    }
2339
    cs=cairo_image_surface_create(CAIRO_FORMAT_RGB24,w,h);
2340
    /*Sadly, no YUV support in Cairo (yet); convert into the RGB buffer.*/
2341
    data=cairo_image_surface_get_data(cs);
2342
    if(data==NULL){
2343
      cairo_surface_destroy(cs);
2344
      return 0;
2345
    }
2346
    cstride=cairo_image_surface_get_stride(cs);
2347
    y_row=_ycbcr[0].data;
2348
    u_row=_ycbcr[1].data;
2349
    v_row=_ycbcr[2].data;
2350
    rgb_row=data;
2351
    for(y=0;y<h;y++){
2352
      for(x=0;x<w;x++){
2353
        int r;
2354
        int g;
2355
        int b;
2356
        r=(1904000*y_row[x]+2609823*v_row[x>>hdec]-363703744)/1635200;
2357
        g=(3827562*y_row[x]-1287801*u_row[x>>hdec]
2358
         -2672387*v_row[x>>hdec]+447306710)/3287200;
2359
        b=(952000*y_row[x]+1649289*u_row[x>>hdec]-225932192)/817600;
2360
        rgb_row[4*x+0]=OC_CLAMP255(b);
2361
        rgb_row[4*x+1]=OC_CLAMP255(g);
2362
        rgb_row[4*x+2]=OC_CLAMP255(r);
2363
      }
2364
      y_row+=_ycbcr[0].stride;
2365
      u_row+=_ycbcr[1].stride&-((y&1)|!vdec);
2366
      v_row+=_ycbcr[2].stride&-((y&1)|!vdec);
2367
      rgb_row+=cstride;
2368
    }
2369
    /*Draw coded identifier for each macroblock (stored in Hilbert order).*/
2370
    {
2371
      cairo_t           *c;
2372
      const oc_fragment *frags;
2373
      oc_mv             *frag_mvs;
2374
      const signed char *mb_modes;
2375
      oc_mb_map         *mb_maps;
2376
      size_t             nmbs;
2377
      size_t             mbi;
2378
      int                row2;
2379
      int                col2;
2380
      int                qim[3]={0,0,0};
2381
      if(_dec->state.nqis==2){
2382
        int bqi;
2383
        bqi=_dec->state.qis[0];
2384
        if(_dec->state.qis[1]>bqi)qim[1]=1;
2385
        if(_dec->state.qis[1]<bqi)qim[1]=-1;
2386
      }
2387
      if(_dec->state.nqis==3){
2388
        int bqi;
2389
        int cqi;
2390
        int dqi;
2391
        bqi=_dec->state.qis[0];
2392
        cqi=_dec->state.qis[1];
2393
        dqi=_dec->state.qis[2];
2394
        if(cqi>bqi&&dqi>bqi){
2395
          if(dqi>cqi){
2396
            qim[1]=1;
2397
            qim[2]=2;
2398
          }
2399
          else{
2400
            qim[1]=2;
2401
            qim[2]=1;
2402
          }
2403
        }
2404
        else if(cqi<bqi&&dqi<bqi){
2405
          if(dqi<cqi){
2406
            qim[1]=-1;
2407
            qim[2]=-2;
2408
          }
2409
          else{
2410
            qim[1]=-2;
2411
            qim[2]=-1;
2412
          }
2413
        }
2414
        else{
2415
          if(cqi<bqi)qim[1]=-1;
2416
          else qim[1]=1;
2417
          if(dqi<bqi)qim[2]=-1;
2418
          else qim[2]=1;
2419
        }
2420
      }
2421
      c=cairo_create(cs);
2422
      frags=_dec->state.frags;
2423
      frag_mvs=_dec->state.frag_mvs;
2424
      mb_modes=_dec->state.mb_modes;
2425
      mb_maps=_dec->state.mb_maps;
2426
      nmbs=_dec->state.nmbs;
2427
      row2=0;
2428
      col2=0;
2429
      for(mbi=0;mbi<nmbs;mbi++){
2430
        float x;
2431
        float y;
2432
        int   bi;
2433
        y=h-(row2+((col2+1>>1)&1))*16-16;
2434
        x=(col2>>1)*16;
2435
        cairo_set_line_width(c,1.);
2436
        /*Keyframe (all intra) red box.*/
2437
        if(_dec->state.frame_type==OC_INTRA_FRAME){
2438
          if(_dec->telemetry_mbmode&0x02){
2439
            cairo_set_source_rgba(c,1.,0,0,.5);
2440
            cairo_rectangle(c,x+2.5,y+2.5,11,11);
2441
            cairo_stroke_preserve(c);
2442
            cairo_set_source_rgba(c,1.,0,0,.25);
2443
            cairo_fill(c);
2444
          }
2445
        }
2446
        else{
2447
          ptrdiff_t fragi;
2448
          int       frag_mvx;
2449
          int       frag_mvy;
2450
          for(bi=0;bi<4;bi++){
2451
            fragi=mb_maps[mbi][0][bi];
2452
            if(fragi>=0&&frags[fragi].coded){
2453
              frag_mvx=OC_MV_X(frag_mvs[fragi]);
2454
              frag_mvy=OC_MV_Y(frag_mvs[fragi]);
2455
              break;
2456
            }
2457
          }
2458
          if(bi<4){
2459
            switch(mb_modes[mbi]){
2460
              case OC_MODE_INTRA:{
2461
                if(_dec->telemetry_mbmode&0x02){
2462
                  cairo_set_source_rgba(c,1.,0,0,.5);
2463
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2464
                  cairo_stroke_preserve(c);
2465
                  cairo_set_source_rgba(c,1.,0,0,.25);
2466
                  cairo_fill(c);
2467
                }
2468
              }break;
2469
              case OC_MODE_INTER_NOMV:{
2470
                if(_dec->telemetry_mbmode&0x01){
2471
                  cairo_set_source_rgba(c,0,0,1.,.5);
2472
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2473
                  cairo_stroke_preserve(c);
2474
                  cairo_set_source_rgba(c,0,0,1.,.25);
2475
                  cairo_fill(c);
2476
                }
2477
              }break;
2478
              case OC_MODE_INTER_MV:{
2479
                if(_dec->telemetry_mbmode&0x04){
2480
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2481
                  cairo_set_source_rgba(c,0,1.,0,.5);
2482
                  cairo_stroke(c);
2483
                }
2484
                if(_dec->telemetry_mv&0x04){
2485
                  cairo_move_to(c,x+8+frag_mvx,y+8-frag_mvy);
2486
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2487
                  cairo_set_line_width(c,3.);
2488
                  cairo_line_to(c,x+8+frag_mvx*.66,y+8-frag_mvy*.66);
2489
                  cairo_stroke_preserve(c);
2490
                  cairo_set_line_width(c,2.);
2491
                  cairo_line_to(c,x+8+frag_mvx*.33,y+8-frag_mvy*.33);
2492
                  cairo_stroke_preserve(c);
2493
                  cairo_set_line_width(c,1.);
2494
                  cairo_line_to(c,x+8,y+8);
2495
                  cairo_stroke(c);
2496
                }
2497
              }break;
2498
              case OC_MODE_INTER_MV_LAST:{
2499
                if(_dec->telemetry_mbmode&0x08){
2500
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2501
                  cairo_set_source_rgba(c,0,1.,0,.5);
2502
                  cairo_move_to(c,x+13.5,y+2.5);
2503
                  cairo_line_to(c,x+2.5,y+8);
2504
                  cairo_line_to(c,x+13.5,y+13.5);
2505
                  cairo_stroke(c);
2506
                }
2507
                if(_dec->telemetry_mv&0x08){
2508
                  cairo_move_to(c,x+8+frag_mvx,y+8-frag_mvy);
2509
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2510
                  cairo_set_line_width(c,3.);
2511
                  cairo_line_to(c,x+8+frag_mvx*.66,y+8-frag_mvy*.66);
2512
                  cairo_stroke_preserve(c);
2513
                  cairo_set_line_width(c,2.);
2514
                  cairo_line_to(c,x+8+frag_mvx*.33,y+8-frag_mvy*.33);
2515
                  cairo_stroke_preserve(c);
2516
                  cairo_set_line_width(c,1.);
2517
                  cairo_line_to(c,x+8,y+8);
2518
                  cairo_stroke(c);
2519
                }
2520
              }break;
2521
              case OC_MODE_INTER_MV_LAST2:{
2522
                if(_dec->telemetry_mbmode&0x10){
2523
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2524
                  cairo_set_source_rgba(c,0,1.,0,.5);
2525
                  cairo_move_to(c,x+8,y+2.5);
2526
                  cairo_line_to(c,x+2.5,y+8);
2527
                  cairo_line_to(c,x+8,y+13.5);
2528
                  cairo_move_to(c,x+13.5,y+2.5);
2529
                  cairo_line_to(c,x+8,y+8);
2530
                  cairo_line_to(c,x+13.5,y+13.5);
2531
                  cairo_stroke(c);
2532
                }
2533
                if(_dec->telemetry_mv&0x10){
2534
                  cairo_move_to(c,x+8+frag_mvx,y+8-frag_mvy);
2535
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2536
                  cairo_set_line_width(c,3.);
2537
                  cairo_line_to(c,x+8+frag_mvx*.66,y+8-frag_mvy*.66);
2538
                  cairo_stroke_preserve(c);
2539
                  cairo_set_line_width(c,2.);
2540
                  cairo_line_to(c,x+8+frag_mvx*.33,y+8-frag_mvy*.33);
2541
                  cairo_stroke_preserve(c);
2542
                  cairo_set_line_width(c,1.);
2543
                  cairo_line_to(c,x+8,y+8);
2544
                  cairo_stroke(c);
2545
                }
2546
              }break;
2547
              case OC_MODE_GOLDEN_NOMV:{
2548
                if(_dec->telemetry_mbmode&0x20){
2549
                  cairo_set_source_rgba(c,1.,1.,0,.5);
2550
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2551
                  cairo_stroke_preserve(c);
2552
                  cairo_set_source_rgba(c,1.,1.,0,.25);
2553
                  cairo_fill(c);
2554
                }
2555
              }break;
2556
              case OC_MODE_GOLDEN_MV:{
2557
                if(_dec->telemetry_mbmode&0x40){
2558
                  cairo_rectangle(c,x+2.5,y+2.5,11,11);
2559
                  cairo_set_source_rgba(c,1.,1.,0,.5);
2560
                  cairo_stroke(c);
2561
                }
2562
                if(_dec->telemetry_mv&0x40){
2563
                  cairo_move_to(c,x+8+frag_mvx,y+8-frag_mvy);
2564
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2565
                  cairo_set_line_width(c,3.);
2566
                  cairo_line_to(c,x+8+frag_mvx*.66,y+8-frag_mvy*.66);
2567
                  cairo_stroke_preserve(c);
2568
                  cairo_set_line_width(c,2.);
2569
                  cairo_line_to(c,x+8+frag_mvx*.33,y+8-frag_mvy*.33);
2570
                  cairo_stroke_preserve(c);
2571
                  cairo_set_line_width(c,1.);
2572
                  cairo_line_to(c,x+8,y+8);
2573
                  cairo_stroke(c);
2574
                }
2575
              }break;
2576
              case OC_MODE_INTER_MV_FOUR:{
2577
                if(_dec->telemetry_mbmode&0x80){
2578
                  cairo_rectangle(c,x+2.5,y+2.5,4,4);
2579
                  cairo_rectangle(c,x+9.5,y+2.5,4,4);
2580
                  cairo_rectangle(c,x+2.5,y+9.5,4,4);
2581
                  cairo_rectangle(c,x+9.5,y+9.5,4,4);
2582
                  cairo_set_source_rgba(c,0,1.,0,.5);
2583
                  cairo_stroke(c);
2584
                }
2585
                /*4mv is odd, coded in raster order.*/
2586
                fragi=mb_maps[mbi][0][0];
2587
                if(frags[fragi].coded&&_dec->telemetry_mv&0x80){
2588
                  frag_mvx=OC_MV_X(frag_mvs[fragi]);
2589
                  frag_mvx=OC_MV_Y(frag_mvs[fragi]);
2590
                  cairo_move_to(c,x+4+frag_mvx,y+12-frag_mvy);
2591
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2592
                  cairo_set_line_width(c,3.);
2593
                  cairo_line_to(c,x+4+frag_mvx*.66,y+12-frag_mvy*.66);
2594
                  cairo_stroke_preserve(c);
2595
                  cairo_set_line_width(c,2.);
2596
                  cairo_line_to(c,x+4+frag_mvx*.33,y+12-frag_mvy*.33);
2597
                  cairo_stroke_preserve(c);
2598
                  cairo_set_line_width(c,1.);
2599
                  cairo_line_to(c,x+4,y+12);
2600
                  cairo_stroke(c);
2601
                }
2602
                fragi=mb_maps[mbi][0][1];
2603
                if(frags[fragi].coded&&_dec->telemetry_mv&0x80){
2604
                  frag_mvx=OC_MV_X(frag_mvs[fragi]);
2605
                  frag_mvx=OC_MV_Y(frag_mvs[fragi]);
2606
                  cairo_move_to(c,x+12+frag_mvx,y+12-frag_mvy);
2607
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2608
                  cairo_set_line_width(c,3.);
2609
                  cairo_line_to(c,x+12+frag_mvx*.66,y+12-frag_mvy*.66);
2610
                  cairo_stroke_preserve(c);
2611
                  cairo_set_line_width(c,2.);
2612
                  cairo_line_to(c,x+12+frag_mvx*.33,y+12-frag_mvy*.33);
2613
                  cairo_stroke_preserve(c);
2614
                  cairo_set_line_width(c,1.);
2615
                  cairo_line_to(c,x+12,y+12);
2616
                  cairo_stroke(c);
2617
                }
2618
                fragi=mb_maps[mbi][0][2];
2619
                if(frags[fragi].coded&&_dec->telemetry_mv&0x80){
2620
                  frag_mvx=OC_MV_X(frag_mvs[fragi]);
2621
                  frag_mvx=OC_MV_Y(frag_mvs[fragi]);
2622
                  cairo_move_to(c,x+4+frag_mvx,y+4-frag_mvy);
2623
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2624
                  cairo_set_line_width(c,3.);
2625
                  cairo_line_to(c,x+4+frag_mvx*.66,y+4-frag_mvy*.66);
2626
                  cairo_stroke_preserve(c);
2627
                  cairo_set_line_width(c,2.);
2628
                  cairo_line_to(c,x+4+frag_mvx*.33,y+4-frag_mvy*.33);
2629
                  cairo_stroke_preserve(c);
2630
                  cairo_set_line_width(c,1.);
2631
                  cairo_line_to(c,x+4,y+4);
2632
                  cairo_stroke(c);
2633
                }
2634
                fragi=mb_maps[mbi][0][3];
2635
                if(frags[fragi].coded&&_dec->telemetry_mv&0x80){
2636
                  frag_mvx=OC_MV_X(frag_mvs[fragi]);
2637
                  frag_mvx=OC_MV_Y(frag_mvs[fragi]);
2638
                  cairo_move_to(c,x+12+frag_mvx,y+4-frag_mvy);
2639
                  cairo_set_source_rgba(c,1.,1.,1.,.9);
2640
                  cairo_set_line_width(c,3.);
2641
                  cairo_line_to(c,x+12+frag_mvx*.66,y+4-frag_mvy*.66);
2642
                  cairo_stroke_preserve(c);
2643
                  cairo_set_line_width(c,2.);
2644
                  cairo_line_to(c,x+12+frag_mvx*.33,y+4-frag_mvy*.33);
2645
                  cairo_stroke_preserve(c);
2646
                  cairo_set_line_width(c,1.);
2647
                  cairo_line_to(c,x+12,y+4);
2648
                  cairo_stroke(c);
2649
                }
2650
              }break;
2651
            }
2652
          }
2653
        }
2654
        /*qii illustration.*/
2655
        if(_dec->telemetry_qi&0x2){
2656
          cairo_set_line_cap(c,CAIRO_LINE_CAP_SQUARE);
2657
          for(bi=0;bi<4;bi++){
2658
            ptrdiff_t fragi;
2659
            int       qiv;
2660
            int       xp;
2661
            int       yp;
2662
            xp=x+(bi&1)*8;
2663
            yp=y+8-(bi&2)*4;
2664
            fragi=mb_maps[mbi][0][bi];
2665
            if(fragi>=0&&frags[fragi].coded){
2666
              qiv=qim[frags[fragi].qii];
2667
              cairo_set_line_width(c,3.);
2668
              cairo_set_source_rgba(c,0.,0.,0.,.5);
2669
              switch(qiv){
2670
                /*Double plus:*/
2671
                case 2:{
2672
                  if((bi&1)^((bi&2)>>1)){
2673
                    cairo_move_to(c,xp+2.5,yp+1.5);
2674
                    cairo_line_to(c,xp+2.5,yp+3.5);
2675
                    cairo_move_to(c,xp+1.5,yp+2.5);
2676
                    cairo_line_to(c,xp+3.5,yp+2.5);
2677
                    cairo_move_to(c,xp+5.5,yp+4.5);
2678
                    cairo_line_to(c,xp+5.5,yp+6.5);
2679
                    cairo_move_to(c,xp+4.5,yp+5.5);
2680
                    cairo_line_to(c,xp+6.5,yp+5.5);
2681
                    cairo_stroke_preserve(c);
2682
                    cairo_set_source_rgba(c,0.,1.,1.,1.);
2683
                  }
2684
                  else{
2685
                    cairo_move_to(c,xp+5.5,yp+1.5);
2686
                    cairo_line_to(c,xp+5.5,yp+3.5);
2687
                    cairo_move_to(c,xp+4.5,yp+2.5);
2688
                    cairo_line_to(c,xp+6.5,yp+2.5);
2689
                    cairo_move_to(c,xp+2.5,yp+4.5);
2690
                    cairo_line_to(c,xp+2.5,yp+6.5);
2691
                    cairo_move_to(c,xp+1.5,yp+5.5);
2692
                    cairo_line_to(c,xp+3.5,yp+5.5);
2693
                    cairo_stroke_preserve(c);
2694
                    cairo_set_source_rgba(c,0.,1.,1.,1.);
2695
                  }
2696
                }break;
2697
                /*Double minus:*/
2698
                case -2:{
2699
                  cairo_move_to(c,xp+2.5,yp+2.5);
2700
                  cairo_line_to(c,xp+5.5,yp+2.5);
2701
                  cairo_move_to(c,xp+2.5,yp+5.5);
2702
                  cairo_line_to(c,xp+5.5,yp+5.5);
2703
                  cairo_stroke_preserve(c);
2704
                  cairo_set_source_rgba(c,1.,1.,1.,1.);
2705
                }break;
2706
                /*Plus:*/
2707
                case 1:{
2708
                  if(bi&2==0)yp-=2;
2709
                  if(bi&1==0)xp-=2;
2710
                  cairo_move_to(c,xp+4.5,yp+2.5);
2711
                  cairo_line_to(c,xp+4.5,yp+6.5);
2712
                  cairo_move_to(c,xp+2.5,yp+4.5);
2713
                  cairo_line_to(c,xp+6.5,yp+4.5);
2714
                  cairo_stroke_preserve(c);
2715
                  cairo_set_source_rgba(c,.1,1.,.3,1.);
2716
                  break;
2717
                }
2718
                /*Fall through.*/
2719
                /*Minus:*/
2720
                case -1:{
2721
                  cairo_move_to(c,xp+2.5,yp+4.5);
2722
                  cairo_line_to(c,xp+6.5,yp+4.5);
2723
                  cairo_stroke_preserve(c);
2724
                  cairo_set_source_rgba(c,1.,.3,.1,1.);
2725
                }break;
2726
                default:continue;
2727
              }
2728
              cairo_set_line_width(c,1.);
2729
              cairo_stroke(c);
2730
            }
2731
          }
2732
        }
2733
        col2++;
2734
        if((col2>>1)>=_dec->state.nhmbs){
2735
          col2=0;
2736
          row2+=2;
2737
        }
2738
      }
2739
      /*Bit usage indicator[s]:*/
2740
      if(_dec->telemetry_bits){
2741
        int widths[6];
2742
        int fpsn;
2743
        int fpsd;
2744
        int mult;
2745
        int fullw;
2746
        int padw;
2747
        int i;
2748
        fpsn=_dec->state.info.fps_numerator;
2749
        fpsd=_dec->state.info.fps_denominator;
2750
        mult=(_dec->telemetry_bits>=0xFF?1:_dec->telemetry_bits);
2751
        fullw=250.f*h*fpsd*mult/fpsn;
2752
        padw=w-24;
2753
        /*Header and coded block bits.*/
2754
        if(_dec->telemetry_frame_bytes<0||
2755
         _dec->telemetry_frame_bytes==OC_LOTS_OF_BITS){
2756
          _dec->telemetry_frame_bytes=0;
2757
        }
2758
        if(_dec->telemetry_coding_bytes<0||
2759
         _dec->telemetry_coding_bytes>_dec->telemetry_frame_bytes){
2760
          _dec->telemetry_coding_bytes=0;
2761
        }
2762
        if(_dec->telemetry_mode_bytes<0||
2763
         _dec->telemetry_mode_bytes>_dec->telemetry_frame_bytes){
2764
          _dec->telemetry_mode_bytes=0;
2765
        }
2766
        if(_dec->telemetry_mv_bytes<0||
2767
         _dec->telemetry_mv_bytes>_dec->telemetry_frame_bytes){
2768
          _dec->telemetry_mv_bytes=0;
2769
        }
2770
        if(_dec->telemetry_qi_bytes<0||
2771
         _dec->telemetry_qi_bytes>_dec->telemetry_frame_bytes){
2772
          _dec->telemetry_qi_bytes=0;
2773
        }
2774
        if(_dec->telemetry_dc_bytes<0||
2775
         _dec->telemetry_dc_bytes>_dec->telemetry_frame_bytes){
2776
          _dec->telemetry_dc_bytes=0;
2777
        }
2778
        widths[0]=padw*(_dec->telemetry_frame_bytes-_dec->telemetry_coding_bytes)/fullw;
2779
        widths[1]=padw*(_dec->telemetry_coding_bytes-_dec->telemetry_mode_bytes)/fullw;
2780
        widths[2]=padw*(_dec->telemetry_mode_bytes-_dec->telemetry_mv_bytes)/fullw;
2781
        widths[3]=padw*(_dec->telemetry_mv_bytes-_dec->telemetry_qi_bytes)/fullw;
2782
        widths[4]=padw*(_dec->telemetry_qi_bytes-_dec->telemetry_dc_bytes)/fullw;
2783
        widths[5]=padw*(_dec->telemetry_dc_bytes)/fullw;
2784
        for(i=0;i<6;i++)if(widths[i]>w)widths[i]=w;
2785
        cairo_set_source_rgba(c,.0,.0,.0,.6);
2786
        cairo_rectangle(c,10,h-33,widths[0]+1,5);
2787
        cairo_rectangle(c,10,h-29,widths[1]+1,5);
2788
        cairo_rectangle(c,10,h-25,widths[2]+1,5);
2789
        cairo_rectangle(c,10,h-21,widths[3]+1,5);
2790
        cairo_rectangle(c,10,h-17,widths[4]+1,5);
2791
        cairo_rectangle(c,10,h-13,widths[5]+1,5);
2792
        cairo_fill(c);
2793
        cairo_set_source_rgb(c,1,0,0);
2794
        cairo_rectangle(c,10.5,h-32.5,widths[0],4);
2795
        cairo_fill(c);
2796
        cairo_set_source_rgb(c,0,1,0);
2797
        cairo_rectangle(c,10.5,h-28.5,widths[1],4);
2798
        cairo_fill(c);
2799
        cairo_set_source_rgb(c,0,0,1);
2800
        cairo_rectangle(c,10.5,h-24.5,widths[2],4);
2801
        cairo_fill(c);
2802
        cairo_set_source_rgb(c,.6,.4,.0);
2803
        cairo_rectangle(c,10.5,h-20.5,widths[3],4);
2804
        cairo_fill(c);
2805
        cairo_set_source_rgb(c,.3,.3,.3);
2806
        cairo_rectangle(c,10.5,h-16.5,widths[4],4);
2807
        cairo_fill(c);
2808
        cairo_set_source_rgb(c,.5,.5,.8);
2809
        cairo_rectangle(c,10.5,h-12.5,widths[5],4);
2810
        cairo_fill(c);
2811
      }
2812
      /*Master qi indicator[s]:*/
2813
      if(_dec->telemetry_qi&0x1){
2814
        cairo_text_extents_t extents;
2815
        char                 buffer[10];
2816
        int                  p;
2817
        int                  y;
2818
        p=0;
2819
        y=h-7.5;
2820
        if(_dec->state.qis[0]>=10)buffer[p++]=48+_dec->state.qis[0]/10;
2821
        buffer[p++]=48+_dec->state.qis[0]%10;
2822
        if(_dec->state.nqis>=2){
2823
          buffer[p++]=' ';
2824
          if(_dec->state.qis[1]>=10)buffer[p++]=48+_dec->state.qis[1]/10;
2825
          buffer[p++]=48+_dec->state.qis[1]%10;
2826
        }
2827
        if(_dec->state.nqis==3){
2828
          buffer[p++]=' ';
2829
          if(_dec->state.qis[2]>=10)buffer[p++]=48+_dec->state.qis[2]/10;
2830
          buffer[p++]=48+_dec->state.qis[2]%10;
2831
        }
2832
        buffer[p++]='\0';
2833
        cairo_select_font_face(c,"sans",
2834
         CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_BOLD);
2835
        cairo_set_font_size(c,18);
2836
        cairo_text_extents(c,buffer,&extents);
2837
        cairo_set_source_rgb(c,1,1,1);
2838
        cairo_move_to(c,w-extents.x_advance-10,y);
2839
        cairo_show_text(c,buffer);
2840
        cairo_set_source_rgb(c,0,0,0);
2841
        cairo_move_to(c,w-extents.x_advance-10,y);
2842
        cairo_text_path(c,buffer);
2843
        cairo_set_line_width(c,.8);
2844
        cairo_set_line_join(c,CAIRO_LINE_JOIN_ROUND);
2845
        cairo_stroke(c);
2846
      }
2847
      cairo_destroy(c);
2848
    }
2849
    /*Out of the Cairo plane into the telemetry YUV buffer.*/
2850
    _ycbcr[0].data=_dec->telemetry_frame_data;
2851
    _ycbcr[0].stride=_ycbcr[0].width;
2852
    _ycbcr[1].data=_ycbcr[0].data+h*_ycbcr[0].stride;
2853
    _ycbcr[1].stride=_ycbcr[1].width;
2854
    _ycbcr[2].data=_ycbcr[1].data+(h>>vdec)*_ycbcr[1].stride;
2855
    _ycbcr[2].stride=_ycbcr[2].width;
2856
    y_row=_ycbcr[0].data;
2857
    u_row=_ycbcr[1].data;
2858
    v_row=_ycbcr[2].data;
2859
    rgb_row=data;
2860
    /*This is one of the few places it's worth handling chroma on a
2861
       case-by-case basis.*/
2862
    switch(_dec->state.info.pixel_fmt){
2863
      case TH_PF_420:{
2864
        for(y=0;y<h;y+=2){
2865
          unsigned char *y_row2;
2866
          unsigned char *rgb_row2;
2867
          y_row2=y_row+_ycbcr[0].stride;
2868
          rgb_row2=rgb_row+cstride;
2869
          for(x=0;x<w;x+=2){
2870
            int y;
2871
            int u;
2872
            int v;
2873
            y=(65481*rgb_row[4*x+2]+128553*rgb_row[4*x+1]
2874
             +24966*rgb_row[4*x+0]+4207500)/255000;
2875
            y_row[x]=OC_CLAMP255(y);
2876
            y=(65481*rgb_row[4*x+6]+128553*rgb_row[4*x+5]
2877
             +24966*rgb_row[4*x+4]+4207500)/255000;
2878
            y_row[x+1]=OC_CLAMP255(y);
2879
            y=(65481*rgb_row2[4*x+2]+128553*rgb_row2[4*x+1]
2880
             +24966*rgb_row2[4*x+0]+4207500)/255000;
2881
            y_row2[x]=OC_CLAMP255(y);
2882
            y=(65481*rgb_row2[4*x+6]+128553*rgb_row2[4*x+5]
2883
             +24966*rgb_row2[4*x+4]+4207500)/255000;
2884
            y_row2[x+1]=OC_CLAMP255(y);
2885
            u=(-8372*(rgb_row[4*x+2]+rgb_row[4*x+6]
2886
             +rgb_row2[4*x+2]+rgb_row2[4*x+6])
2887
             -16436*(rgb_row[4*x+1]+rgb_row[4*x+5]
2888
             +rgb_row2[4*x+1]+rgb_row2[4*x+5])
2889
             +24808*(rgb_row[4*x+0]+rgb_row[4*x+4]
2890
             +rgb_row2[4*x+0]+rgb_row2[4*x+4])+29032005)/225930;
2891
            v=(39256*(rgb_row[4*x+2]+rgb_row[4*x+6]
2892
             +rgb_row2[4*x+2]+rgb_row2[4*x+6])
2893
             -32872*(rgb_row[4*x+1]+rgb_row[4*x+5]
2894
              +rgb_row2[4*x+1]+rgb_row2[4*x+5])
2895
             -6384*(rgb_row[4*x+0]+rgb_row[4*x+4]
2896
              +rgb_row2[4*x+0]+rgb_row2[4*x+4])+45940035)/357510;
2897
            u_row[x>>1]=OC_CLAMP255(u);
2898
            v_row[x>>1]=OC_CLAMP255(v);
2899
          }
2900
          y_row+=_ycbcr[0].stride<<1;
2901
          u_row+=_ycbcr[1].stride;
2902
          v_row+=_ycbcr[2].stride;
2903
          rgb_row+=cstride<<1;
2904
        }
2905
      }break;
2906
      case TH_PF_422:{
2907
        for(y=0;y<h;y++){
2908
          for(x=0;x<w;x+=2){
2909
            int y;
2910
            int u;
2911
            int v;
2912
            y=(65481*rgb_row[4*x+2]+128553*rgb_row[4*x+1]
2913
             +24966*rgb_row[4*x+0]+4207500)/255000;
2914
            y_row[x]=OC_CLAMP255(y);
2915
            y=(65481*rgb_row[4*x+6]+128553*rgb_row[4*x+5]
2916
             +24966*rgb_row[4*x+4]+4207500)/255000;
2917
            y_row[x+1]=OC_CLAMP255(y);
2918
            u=(-16744*(rgb_row[4*x+2]+rgb_row[4*x+6])
2919
             -32872*(rgb_row[4*x+1]+rgb_row[4*x+5])
2920
             +49616*(rgb_row[4*x+0]+rgb_row[4*x+4])+29032005)/225930;
2921
            v=(78512*(rgb_row[4*x+2]+rgb_row[4*x+6])
2922
             -65744*(rgb_row[4*x+1]+rgb_row[4*x+5])
2923
             -12768*(rgb_row[4*x+0]+rgb_row[4*x+4])+45940035)/357510;
2924
            u_row[x>>1]=OC_CLAMP255(u);
2925
            v_row[x>>1]=OC_CLAMP255(v);
2926
          }
2927
          y_row+=_ycbcr[0].stride;
2928
          u_row+=_ycbcr[1].stride;
2929
          v_row+=_ycbcr[2].stride;
2930
          rgb_row+=cstride;
2931
        }
2932
      }break;
2933
      /*case TH_PF_444:*/
2934
      default:{
2935
        for(y=0;y<h;y++){
2936
          for(x=0;x<w;x++){
2937
            int y;
2938
            int u;
2939
            int v;
2940
            y=(65481*rgb_row[4*x+2]+128553*rgb_row[4*x+1]
2941
             +24966*rgb_row[4*x+0]+4207500)/255000;
2942
            u=(-33488*rgb_row[4*x+2]-65744*rgb_row[4*x+1]
2943
             +99232*rgb_row[4*x+0]+29032005)/225930;
2944
            v=(157024*rgb_row[4*x+2]-131488*rgb_row[4*x+1]
2945
             -25536*rgb_row[4*x+0]+45940035)/357510;
2946
            y_row[x]=OC_CLAMP255(y);
2947
            u_row[x]=OC_CLAMP255(u);
2948
            v_row[x]=OC_CLAMP255(v);
2949
          }
2950
          y_row+=_ycbcr[0].stride;
2951
          u_row+=_ycbcr[1].stride;
2952
          v_row+=_ycbcr[2].stride;
2953
          rgb_row+=cstride;
2954
        }
2955
      }break;
2956
    }
2957
    /*Finished.
2958
      Destroy the surface.*/
2959
    cairo_surface_destroy(cs);
2960
  }
2961
#endif
2962
  return 0;
2963
0
}