1 |
|
|
/* |
2 |
|
|
* Apple ProRes compatible decoder |
3 |
|
|
* |
4 |
|
|
* Copyright (c) 2010-2011 Maxim Poliakovski |
5 |
|
|
* |
6 |
|
|
* This file is part of FFmpeg. |
7 |
|
|
* |
8 |
|
|
* FFmpeg is free software; you can redistribute it and/or |
9 |
|
|
* modify it under the terms of the GNU Lesser General Public |
10 |
|
|
* License as published by the Free Software Foundation; either |
11 |
|
|
* version 2.1 of the License, or (at your option) any later version. |
12 |
|
|
* |
13 |
|
|
* FFmpeg is distributed in the hope that it will be useful, |
14 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 |
|
|
* Lesser General Public License for more details. |
17 |
|
|
* |
18 |
|
|
* You should have received a copy of the GNU Lesser General Public |
19 |
|
|
* License along with FFmpeg; if not, write to the Free Software |
20 |
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 |
|
|
*/ |
22 |
|
|
|
23 |
|
|
#include "config.h" |
24 |
|
|
#include "libavutil/attributes.h" |
25 |
|
|
#include "libavutil/common.h" |
26 |
|
|
#include "idctdsp.h" |
27 |
|
|
#include "proresdsp.h" |
28 |
|
|
#include "simple_idct.h" |
29 |
|
|
|
30 |
|
|
#define CLIP_MIN (1 << 2) ///< minimum value for clipping resulting pixels |
31 |
|
|
#define CLIP_MAX_10 (1 << 10) - CLIP_MIN - 1 ///< maximum value for clipping resulting pixels |
32 |
|
|
#define CLIP_MAX_12 (1 << 12) - CLIP_MIN - 1 ///< maximum value for clipping resulting pixels |
33 |
|
|
|
34 |
|
|
#define CLIP_10(x) (av_clip((x), CLIP_MIN, CLIP_MAX_10)) |
35 |
|
|
#define CLIP_12(x) (av_clip((x), CLIP_MIN, CLIP_MAX_12)) |
36 |
|
|
|
37 |
|
|
/** |
38 |
|
|
* Add bias value, clamp and output pixels of a slice |
39 |
|
|
*/ |
40 |
|
|
|
41 |
|
4867476 |
static inline void put_pixel(uint16_t *dst, ptrdiff_t linesize, const int16_t *in, int bits_per_raw_sample) { |
42 |
|
|
int x, y, src_offset, dst_offset; |
43 |
|
|
|
44 |
✓✓ |
43807284 |
for (y = 0, dst_offset = 0; y < 8; y++, dst_offset += linesize) { |
45 |
✓✓ |
350458272 |
for (x = 0; x < 8; x++) { |
46 |
|
311518464 |
src_offset = (y << 3) + x; |
47 |
|
|
|
48 |
✓✓ |
311518464 |
if (bits_per_raw_sample == 10) { |
49 |
|
154963968 |
dst[dst_offset + x] = CLIP_10(in[src_offset]); |
50 |
|
|
} else {//12b |
51 |
|
156554496 |
dst[dst_offset + x] = CLIP_12(in[src_offset]); |
52 |
|
|
} |
53 |
|
|
} |
54 |
|
|
} |
55 |
|
4867476 |
} |
56 |
|
|
|
57 |
|
2421312 |
static void put_pixels_10(uint16_t *dst, ptrdiff_t linesize, const int16_t *in) |
58 |
|
|
{ |
59 |
|
2421312 |
put_pixel(dst, linesize, in, 10); |
60 |
|
2421312 |
} |
61 |
|
|
|
62 |
|
2446164 |
static void put_pixels_12(uint16_t *dst, ptrdiff_t linesize, const int16_t *in) |
63 |
|
|
{ |
64 |
|
2446164 |
put_pixel(dst, linesize, in, 12); |
65 |
|
2446164 |
} |
66 |
|
|
|
67 |
|
2421312 |
static void prores_idct_put_10_c(uint16_t *out, ptrdiff_t linesize, int16_t *block, const int16_t *qmat) |
68 |
|
|
{ |
69 |
|
2421312 |
ff_prores_idct_10(block, qmat); |
70 |
|
2421312 |
put_pixels_10(out, linesize >> 1, block); |
71 |
|
2421312 |
} |
72 |
|
|
|
73 |
|
2446164 |
static void prores_idct_put_12_c(uint16_t *out, ptrdiff_t linesize, int16_t *block, const int16_t *qmat) |
74 |
|
|
{ |
75 |
|
2446164 |
ff_prores_idct_12(block, qmat); |
76 |
|
2446164 |
put_pixels_12(out, linesize >> 1, block); |
77 |
|
2446164 |
} |
78 |
|
|
|
79 |
|
64 |
av_cold int ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx) |
80 |
|
|
{ |
81 |
✓✓ |
64 |
if (avctx->bits_per_raw_sample == 10) { |
82 |
|
40 |
dsp->idct_put = prores_idct_put_10_c; |
83 |
|
40 |
dsp->idct_permutation_type = FF_IDCT_PERM_NONE; |
84 |
✓✗ |
24 |
} else if (avctx->bits_per_raw_sample == 12) { |
85 |
|
24 |
dsp->idct_put = prores_idct_put_12_c; |
86 |
|
24 |
dsp->idct_permutation_type = FF_IDCT_PERM_NONE; |
87 |
|
|
} else { |
88 |
|
|
return AVERROR_BUG; |
89 |
|
|
} |
90 |
|
|
|
91 |
|
|
if (ARCH_X86) |
92 |
|
64 |
ff_proresdsp_init_x86(dsp, avctx); |
93 |
|
|
|
94 |
|
64 |
ff_init_scantable_permutation(dsp->idct_permutation, |
95 |
|
64 |
dsp->idct_permutation_type); |
96 |
|
64 |
return 0; |
97 |
|
|
} |