3 * Copyright (c) 2005 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
46 typedef struct LOCOContext
{
47 AVCodecContext
*avctx
;
52 typedef struct RICEContext
{
54 int save
, run
, run2
; /* internal rice decoder state */
55 int sum
, count
; /* sum and count for getting rice parameter */
59 static int loco_get_rice_param(RICEContext
*r
)
64 while (r
->sum
> val
&& cnt
< 9) {
72 static inline void loco_update_rice_param(RICEContext
*r
, int val
)
83 static inline int loco_get_rice(RICEContext
*r
)
86 if (r
->run
> 0) { /* we have zero run */
88 loco_update_rice_param(r
, 0);
91 v
= get_ur_golomb_jpegls(&r
->gb
, loco_get_rice_param(r
), INT_MAX
, 0);
92 loco_update_rice_param(r
, (v
+ 1) >> 1);
95 r
->run
= get_ur_golomb_jpegls(&r
->gb
, 2, INT_MAX
, 0);
97 r
->save
+= r
->run
+ 1;
103 v
= ((v
>> 1) + r
->lossy
) ^ -(v
& 1);
116 /* LOCO main predictor - LOCO-I/JPEG-LS predictor */
117 static inline int loco_predict(uint8_t* data
, int stride
, int step
)
123 c
= data
[-stride
- step
];
125 return mid_pred(a
, a
+ b
- c
, b
);
128 static int loco_decode_plane(LOCOContext
*l
, uint8_t *data
, int width
, int height
,
129 int stride
, const uint8_t *buf
, int buf_size
, int step
)
135 init_get_bits(&rc
.gb
, buf
, buf_size
*8);
144 /* restore top left pixel */
145 val
= loco_get_rice(&rc
);
147 /* restore top line */
148 for (i
= 1; i
< width
; i
++) {
149 val
= loco_get_rice(&rc
);
150 data
[i
* step
] = data
[i
* step
- step
] + val
;
153 for (j
= 1; j
< height
; j
++) {
154 /* restore left column */
155 val
= loco_get_rice(&rc
);
156 data
[0] = data
[-stride
] + val
;
157 /* restore all other pixels */
158 for (i
= 1; i
< width
; i
++) {
159 val
= loco_get_rice(&rc
);
160 data
[i
* step
] = loco_predict(&data
[i
* step
], stride
, step
) + val
;
165 return (get_bits_count(&rc
.gb
) + 7) >> 3;
168 static int decode_frame(AVCodecContext
*avctx
,
169 void *data
, int *got_frame
,
172 LOCOContext
* const l
= avctx
->priv_data
;
173 const uint8_t *buf
= avpkt
->data
;
174 int buf_size
= avpkt
->size
;
175 AVFrame
* const p
= data
;
178 if ((ret
= ff_get_buffer(avctx
, p
, 0)) < 0) {
179 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
185 case LOCO_CYUY2
: case LOCO_YUY2
: case LOCO_UYVY
:
186 decoded
= loco_decode_plane(l
, p
->data
[0], avctx
->width
, avctx
->height
,
187 p
->linesize
[0], buf
, buf_size
, 1);
188 if (decoded
>= buf_size
)
190 buf
+= decoded
; buf_size
-= decoded
;
192 decoded
= loco_decode_plane(l
, p
->data
[1], avctx
->width
/ 2, avctx
->height
,
193 p
->linesize
[1], buf
, buf_size
, 1);
194 if (decoded
>= buf_size
)
196 buf
+= decoded
; buf_size
-= decoded
;
198 decoded
= loco_decode_plane(l
, p
->data
[2], avctx
->width
/ 2, avctx
->height
,
199 p
->linesize
[2], buf
, buf_size
, 1);
201 case LOCO_CYV12
: case LOCO_YV12
:
202 decoded
= loco_decode_plane(l
, p
->data
[0], avctx
->width
, avctx
->height
,
203 p
->linesize
[0], buf
, buf_size
, 1);
204 if (decoded
>= buf_size
)
206 buf
+= decoded
; buf_size
-= decoded
;
208 decoded
= loco_decode_plane(l
, p
->data
[2], avctx
->width
/ 2, avctx
->height
/ 2,
209 p
->linesize
[2], buf
, buf_size
, 1);
210 if (decoded
>= buf_size
)
212 buf
+= decoded
; buf_size
-= decoded
;
214 decoded
= loco_decode_plane(l
, p
->data
[1], avctx
->width
/ 2, avctx
->height
/ 2,
215 p
->linesize
[1], buf
, buf_size
, 1);
217 case LOCO_CRGB
: case LOCO_RGB
:
218 decoded
= loco_decode_plane(l
, p
->data
[0] + p
->linesize
[0]*(avctx
->height
-1), avctx
->width
, avctx
->height
,
219 -p
->linesize
[0], buf
, buf_size
, 3);
220 if (decoded
>= buf_size
)
222 buf
+= decoded
; buf_size
-= decoded
;
224 decoded
= loco_decode_plane(l
, p
->data
[0] + p
->linesize
[0]*(avctx
->height
-1) + 1, avctx
->width
, avctx
->height
,
225 -p
->linesize
[0], buf
, buf_size
, 3);
226 if (decoded
>= buf_size
)
228 buf
+= decoded
; buf_size
-= decoded
;
230 decoded
= loco_decode_plane(l
, p
->data
[0] + p
->linesize
[0]*(avctx
->height
-1) + 2, avctx
->width
, avctx
->height
,
231 -p
->linesize
[0], buf
, buf_size
, 3);
234 decoded
= loco_decode_plane(l
, p
->data
[0], avctx
->width
, avctx
->height
,
235 p
->linesize
[0], buf
, buf_size
, 4);
236 if (decoded
>= buf_size
)
238 buf
+= decoded
; buf_size
-= decoded
;
240 decoded
= loco_decode_plane(l
, p
->data
[0] + 1, avctx
->width
, avctx
->height
,
241 p
->linesize
[0], buf
, buf_size
, 4);
242 if (decoded
>= buf_size
)
244 buf
+= decoded
; buf_size
-= decoded
;
246 decoded
= loco_decode_plane(l
, p
->data
[0] + 2, avctx
->width
, avctx
->height
,
247 p
->linesize
[0], buf
, buf_size
, 4);
248 if (decoded
>= buf_size
)
250 buf
+= decoded
; buf_size
-= decoded
;
252 decoded
= loco_decode_plane(l
, p
->data
[0] + 3, avctx
->width
, avctx
->height
,
253 p
->linesize
[0], buf
, buf_size
, 4);
261 av_log(avctx
, AV_LOG_ERROR
, "Input data too small.\n");
262 return AVERROR(EINVAL
);
265 static av_cold
int decode_init(AVCodecContext
*avctx
)
267 LOCOContext
* const l
= avctx
->priv_data
;
271 if (avctx
->extradata_size
< 12) {
272 av_log(avctx
, AV_LOG_ERROR
, "Extradata size must be >= 12 instead of %i\n",
273 avctx
->extradata_size
);
274 return AVERROR_INVALIDDATA
;
276 version
= AV_RL32(avctx
->extradata
);
282 l
->lossy
= AV_RL32(avctx
->extradata
+ 8);
285 l
->lossy
= AV_RL32(avctx
->extradata
+ 8);
286 av_log_ask_for_sample(avctx
, "This is LOCO codec version %i.\n", version
);
289 l
->mode
= AV_RL32(avctx
->extradata
+ 4);
294 avctx
->pix_fmt
= AV_PIX_FMT_YUV422P
;
298 avctx
->pix_fmt
= AV_PIX_FMT_BGR24
;
302 avctx
->pix_fmt
= AV_PIX_FMT_YUV420P
;
306 avctx
->pix_fmt
= AV_PIX_FMT_RGB32
;
309 av_log(avctx
, AV_LOG_INFO
, "Unknown colorspace, index = %i\n", l
->mode
);
310 return AVERROR_INVALIDDATA
;
312 if (avctx
->debug
& FF_DEBUG_PICT_INFO
)
313 av_log(avctx
, AV_LOG_INFO
, "lossy:%i, version:%i, mode: %i\n", l
->lossy
, version
, l
->mode
);
318 AVCodec ff_loco_decoder
= {
320 .type
= AVMEDIA_TYPE_VIDEO
,
321 .id
= AV_CODEC_ID_LOCO
,
322 .priv_data_size
= sizeof(LOCOContext
),
324 .decode
= decode_frame
,
325 .capabilities
= CODEC_CAP_DR1
,
326 .long_name
= NULL_IF_CONFIG_SMALL("LOCO"),