2 * Copyright (C) 2015 Pedro Arthur <bygrandao@gmail.com>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "libavutil/mem.h"
22 #include "swscale_internal.h"
24 typedef struct GammaContext
29 // gamma_convert expects 16 bit rgb format
30 // it writes directly in src slice thus it must be modifiable (done through cascade context)
31 static int gamma_convert(SwsInternal
*c
, SwsFilterDescriptor
*desc
, int sliceY
, int sliceH
)
33 GammaContext
*instance
= desc
->instance
;
34 uint16_t *table
= instance
->table
;
35 int srcW
= desc
->src
->width
;
38 for (i
= 0; i
< sliceH
; ++i
) {
39 uint8_t ** src
= desc
->src
->plane
[0].line
;
40 int src_pos
= sliceY
+i
- desc
->src
->plane
[0].sliceY
;
42 uint16_t *src1
= (uint16_t*)*(src
+src_pos
);
44 for (j
= 0; j
< srcW
; ++j
) {
45 uint16_t r
= AV_RL16(src1
+ j
*4 + 0);
46 uint16_t g
= AV_RL16(src1
+ j
*4 + 1);
47 uint16_t b
= AV_RL16(src1
+ j
*4 + 2);
49 AV_WL16(src1
+ j
*4 + 0, table
[r
]);
50 AV_WL16(src1
+ j
*4 + 1, table
[g
]);
51 AV_WL16(src1
+ j
*4 + 2, table
[b
]);
59 int ff_init_gamma_convert(SwsFilterDescriptor
*desc
, SwsSlice
* src
, uint16_t *table
)
61 GammaContext
*li
= av_malloc(sizeof(GammaContext
));
63 return AVERROR(ENOMEM
);
69 desc
->process
= &gamma_convert
;