3
* Copyright (c) 2005 Konstantin Shishkov
5
* This file is part of FFmpeg.
7
* FFmpeg 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
* FFmpeg 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 FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30
#include "bitstream.h"
33
enum LOCO_MODE {LOCO_UNKN=0, LOCO_CYUY2=-1, LOCO_CRGB=-2, LOCO_CRGBA=-3, LOCO_CYV12=-4,
34
LOCO_YUY2=1, LOCO_UYVY=2, LOCO_RGB=3, LOCO_RGBA=4, LOCO_YV12=5};
36
typedef struct LOCOContext{
37
AVCodecContext *avctx;
43
typedef struct RICEContext{
45
int save, run, run2; /* internal rice decoder state */
46
int sum, count; /* sum and count for getting rice parameter */
50
static int loco_get_rice_param(RICEContext *r)
55
while(r->sum > val && cnt < 9) {
63
static inline void loco_update_rice_param(RICEContext *r, int val)
74
static inline int loco_get_rice(RICEContext *r)
77
if (r->run > 0) { /* we have zero run */
79
loco_update_rice_param(r, 0);
82
v = get_ur_golomb_jpegls(&r->gb, loco_get_rice_param(r), INT_MAX, 0);
83
loco_update_rice_param(r, (v+1)>>1);
86
r->run = get_ur_golomb_jpegls(&r->gb, 2, INT_MAX, 0);
88
r->save += r->run + 1;
95
v = ((v>>1) + r->lossy) ^ -(v&1);
108
/* LOCO main predictor - LOCO-I/JPEG-LS predictor */
109
static inline int loco_predict(uint8_t* data, int stride, int step)
115
c = data[-stride - step];
117
return mid_pred(a, a + b - c, b);
120
static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int height,
121
int stride, uint8_t *buf, int buf_size, int step)
127
init_get_bits(&rc.gb, buf, buf_size*8);
136
/* restore top left pixel */
137
val = loco_get_rice(&rc);
139
/* restore top line */
140
for (i = 1; i < width; i++) {
141
val = loco_get_rice(&rc);
142
data[i * step] = data[i * step - step] + val;
145
for (j = 1; j < height; j++) {
146
/* restore left column */
147
val = loco_get_rice(&rc);
148
data[0] = data[-stride] + val;
149
/* restore all other pixels */
150
for (i = 1; i < width; i++) {
151
val = loco_get_rice(&rc);
152
data[i * step] = loco_predict(&data[i * step], stride, step) + val;
157
return ((get_bits_count(&rc.gb) + 7) >> 3);
160
static int decode_frame(AVCodecContext *avctx,
161
void *data, int *data_size,
162
uint8_t *buf, int buf_size)
164
LOCOContext * const l = avctx->priv_data;
165
AVFrame * const p= (AVFrame*)&l->pic;
169
avctx->release_buffer(avctx, p);
172
if(avctx->get_buffer(avctx, p) < 0){
173
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
179
case LOCO_CYUY2: case LOCO_YUY2: case LOCO_UYVY:
180
decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height,
181
p->linesize[0], buf, buf_size, 1);
182
buf += decoded; buf_size -= decoded;
183
decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height,
184
p->linesize[1], buf, buf_size, 1);
185
buf += decoded; buf_size -= decoded;
186
decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height,
187
p->linesize[2], buf, buf_size, 1);
189
case LOCO_CYV12: case LOCO_YV12:
190
decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height,
191
p->linesize[0], buf, buf_size, 1);
192
buf += decoded; buf_size -= decoded;
193
decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height / 2,
194
p->linesize[2], buf, buf_size, 1);
195
buf += decoded; buf_size -= decoded;
196
decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height / 2,
197
p->linesize[1], buf, buf_size, 1);
199
case LOCO_CRGB: case LOCO_RGB:
200
decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height,
201
-p->linesize[0], buf, buf_size, 3);
202
buf += decoded; buf_size -= decoded;
203
decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 1, avctx->width, avctx->height,
204
-p->linesize[0], buf, buf_size, 3);
205
buf += decoded; buf_size -= decoded;
206
decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 2, avctx->width, avctx->height,
207
-p->linesize[0], buf, buf_size, 3);
210
decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height,
211
p->linesize[0], buf, buf_size, 4);
212
buf += decoded; buf_size -= decoded;
213
decoded = loco_decode_plane(l, p->data[0] + 1, avctx->width, avctx->height,
214
p->linesize[0], buf, buf_size, 4);
215
buf += decoded; buf_size -= decoded;
216
decoded = loco_decode_plane(l, p->data[0] + 2, avctx->width, avctx->height,
217
p->linesize[0], buf, buf_size, 4);
218
buf += decoded; buf_size -= decoded;
219
decoded = loco_decode_plane(l, p->data[0] + 3, avctx->width, avctx->height,
220
p->linesize[0], buf, buf_size, 4);
224
*data_size = sizeof(AVFrame);
225
*(AVFrame*)data = l->pic;
230
static int decode_init(AVCodecContext *avctx){
231
LOCOContext * const l = avctx->priv_data;
235
if (avctx->extradata_size < 12) {
236
av_log(avctx, AV_LOG_ERROR, "Extradata size must be >= 12 instead of %i\n",
237
avctx->extradata_size);
240
version = AV_RL32(avctx->extradata);
246
l->lossy = AV_RL32(avctx->extradata + 8);
249
l->lossy = AV_RL32(avctx->extradata + 8);
250
av_log(avctx, AV_LOG_INFO, "This is LOCO codec version %i, please upload file for study\n", version);
253
l->mode = AV_RL32(avctx->extradata + 4);
255
case LOCO_CYUY2: case LOCO_YUY2: case LOCO_UYVY:
256
avctx->pix_fmt = PIX_FMT_YUV422P;
258
case LOCO_CRGB: case LOCO_RGB:
259
avctx->pix_fmt = PIX_FMT_BGR24;
261
case LOCO_CYV12: case LOCO_YV12:
262
avctx->pix_fmt = PIX_FMT_YUV420P;
264
case LOCO_CRGBA: case LOCO_RGBA:
265
avctx->pix_fmt = PIX_FMT_RGB32;
268
av_log(avctx, AV_LOG_INFO, "Unknown colorspace, index = %i\n", l->mode);
271
if(avctx->debug & FF_DEBUG_PICT_INFO)
272
av_log(avctx, AV_LOG_INFO, "lossy:%i, version:%i, mode: %i\n", l->lossy, version, l->mode);
277
AVCodec loco_decoder = {