yading@10
|
1 /*
|
yading@10
|
2 * JPEG-LS encoder
|
yading@10
|
3 * Copyright (c) 2003 Michael Niedermayer
|
yading@10
|
4 * Copyright (c) 2006 Konstantin Shishkov
|
yading@10
|
5 *
|
yading@10
|
6 * This file is part of FFmpeg.
|
yading@10
|
7 *
|
yading@10
|
8 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
9 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
10 * License as published by the Free Software Foundation; either
|
yading@10
|
11 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
12 *
|
yading@10
|
13 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
16 * Lesser General Public License for more details.
|
yading@10
|
17 *
|
yading@10
|
18 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
19 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
21 */
|
yading@10
|
22
|
yading@10
|
23 /**
|
yading@10
|
24 * @file
|
yading@10
|
25 * JPEG-LS encoder.
|
yading@10
|
26 */
|
yading@10
|
27
|
yading@10
|
28 #include "avcodec.h"
|
yading@10
|
29 #include "get_bits.h"
|
yading@10
|
30 #include "put_bits.h"
|
yading@10
|
31 #include "golomb.h"
|
yading@10
|
32 #include "internal.h"
|
yading@10
|
33 #include "mathops.h"
|
yading@10
|
34 #include "mjpeg.h"
|
yading@10
|
35 #include "jpegls.h"
|
yading@10
|
36
|
yading@10
|
37
|
yading@10
|
38 /**
|
yading@10
|
39 * Encode error from regular symbol
|
yading@10
|
40 */
|
yading@10
|
41 static inline void ls_encode_regular(JLSState *state, PutBitContext *pb, int Q, int err){
|
yading@10
|
42 int k;
|
yading@10
|
43 int val;
|
yading@10
|
44 int map;
|
yading@10
|
45
|
yading@10
|
46 for(k = 0; (state->N[Q] << k) < state->A[Q]; k++);
|
yading@10
|
47
|
yading@10
|
48 map = !state->near && !k && (2 * state->B[Q] <= -state->N[Q]);
|
yading@10
|
49
|
yading@10
|
50 if(err < 0)
|
yading@10
|
51 err += state->range;
|
yading@10
|
52 if(err >= ((state->range + 1) >> 1)) {
|
yading@10
|
53 err -= state->range;
|
yading@10
|
54 val = 2 * FFABS(err) - 1 - map;
|
yading@10
|
55 } else
|
yading@10
|
56 val = 2 * err + map;
|
yading@10
|
57
|
yading@10
|
58 set_ur_golomb_jpegls(pb, val, k, state->limit, state->qbpp);
|
yading@10
|
59
|
yading@10
|
60 ff_jpegls_update_state_regular(state, Q, err);
|
yading@10
|
61 }
|
yading@10
|
62
|
yading@10
|
63 /**
|
yading@10
|
64 * Encode error from run termination
|
yading@10
|
65 */
|
yading@10
|
66 static inline void ls_encode_runterm(JLSState *state, PutBitContext *pb, int RItype, int err, int limit_add){
|
yading@10
|
67 int k;
|
yading@10
|
68 int val, map;
|
yading@10
|
69 int Q = 365 + RItype;
|
yading@10
|
70 int temp;
|
yading@10
|
71
|
yading@10
|
72 temp = state->A[Q];
|
yading@10
|
73 if(RItype)
|
yading@10
|
74 temp += state->N[Q] >> 1;
|
yading@10
|
75 for(k = 0; (state->N[Q] << k) < temp; k++);
|
yading@10
|
76 map = 0;
|
yading@10
|
77 if(!k && err && (2 * state->B[Q] < state->N[Q]))
|
yading@10
|
78 map = 1;
|
yading@10
|
79
|
yading@10
|
80 if(err < 0)
|
yading@10
|
81 val = - (2 * err) - 1 - RItype + map;
|
yading@10
|
82 else
|
yading@10
|
83 val = 2 * err - RItype - map;
|
yading@10
|
84 set_ur_golomb_jpegls(pb, val, k, state->limit - limit_add - 1, state->qbpp);
|
yading@10
|
85
|
yading@10
|
86 if(err < 0)
|
yading@10
|
87 state->B[Q]++;
|
yading@10
|
88 state->A[Q] += (val + 1 - RItype) >> 1;
|
yading@10
|
89
|
yading@10
|
90 ff_jpegls_downscale_state(state, Q);
|
yading@10
|
91 }
|
yading@10
|
92
|
yading@10
|
93 /**
|
yading@10
|
94 * Encode run value as specified by JPEG-LS standard
|
yading@10
|
95 */
|
yading@10
|
96 static inline void ls_encode_run(JLSState *state, PutBitContext *pb, int run, int comp, int trail){
|
yading@10
|
97 while(run >= (1 << ff_log2_run[state->run_index[comp]])){
|
yading@10
|
98 put_bits(pb, 1, 1);
|
yading@10
|
99 run -= 1 << ff_log2_run[state->run_index[comp]];
|
yading@10
|
100 if(state->run_index[comp] < 31)
|
yading@10
|
101 state->run_index[comp]++;
|
yading@10
|
102 }
|
yading@10
|
103 /* if hit EOL, encode another full run, else encode aborted run */
|
yading@10
|
104 if(!trail && run) {
|
yading@10
|
105 put_bits(pb, 1, 1);
|
yading@10
|
106 }else if(trail){
|
yading@10
|
107 put_bits(pb, 1, 0);
|
yading@10
|
108 if(ff_log2_run[state->run_index[comp]])
|
yading@10
|
109 put_bits(pb, ff_log2_run[state->run_index[comp]], run);
|
yading@10
|
110 }
|
yading@10
|
111 }
|
yading@10
|
112
|
yading@10
|
113 /**
|
yading@10
|
114 * Encode one line of image
|
yading@10
|
115 */
|
yading@10
|
116 static inline void ls_encode_line(JLSState *state, PutBitContext *pb, void *last, void *cur, int last2, int w, int stride, int comp, int bits){
|
yading@10
|
117 int x = 0;
|
yading@10
|
118 int Ra, Rb, Rc, Rd;
|
yading@10
|
119 int D0, D1, D2;
|
yading@10
|
120
|
yading@10
|
121 while(x < w) {
|
yading@10
|
122 int err, pred, sign;
|
yading@10
|
123
|
yading@10
|
124 /* compute gradients */
|
yading@10
|
125 Ra = x ? R(cur, x - stride) : R(last, x);
|
yading@10
|
126 Rb = R(last, x);
|
yading@10
|
127 Rc = x ? R(last, x - stride) : last2;
|
yading@10
|
128 Rd = (x >= w - stride) ? R(last, x) : R(last, x + stride);
|
yading@10
|
129 D0 = Rd - Rb;
|
yading@10
|
130 D1 = Rb - Rc;
|
yading@10
|
131 D2 = Rc - Ra;
|
yading@10
|
132
|
yading@10
|
133 /* run mode */
|
yading@10
|
134 if((FFABS(D0) <= state->near) && (FFABS(D1) <= state->near) && (FFABS(D2) <= state->near)) {
|
yading@10
|
135 int RUNval, RItype, run;
|
yading@10
|
136
|
yading@10
|
137 run = 0;
|
yading@10
|
138 RUNval = Ra;
|
yading@10
|
139 while(x < w && (FFABS(R(cur, x) - RUNval) <= state->near)){
|
yading@10
|
140 run++;
|
yading@10
|
141 W(cur, x, Ra);
|
yading@10
|
142 x += stride;
|
yading@10
|
143 }
|
yading@10
|
144 ls_encode_run(state, pb, run, comp, x < w);
|
yading@10
|
145 if(x >= w)
|
yading@10
|
146 return;
|
yading@10
|
147 Rb = R(last, x);
|
yading@10
|
148 RItype = (FFABS(Ra - Rb) <= state->near);
|
yading@10
|
149 pred = RItype ? Ra : Rb;
|
yading@10
|
150 err = R(cur, x) - pred;
|
yading@10
|
151
|
yading@10
|
152 if(!RItype && Ra > Rb)
|
yading@10
|
153 err = -err;
|
yading@10
|
154
|
yading@10
|
155 if(state->near){
|
yading@10
|
156 if(err > 0)
|
yading@10
|
157 err = (state->near + err) / state->twonear;
|
yading@10
|
158 else
|
yading@10
|
159 err = -(state->near - err) / state->twonear;
|
yading@10
|
160
|
yading@10
|
161 if(RItype || (Rb >= Ra))
|
yading@10
|
162 Ra = av_clip(pred + err * state->twonear, 0, state->maxval);
|
yading@10
|
163 else
|
yading@10
|
164 Ra = av_clip(pred - err * state->twonear, 0, state->maxval);
|
yading@10
|
165 W(cur, x, Ra);
|
yading@10
|
166 }
|
yading@10
|
167 if(err < 0)
|
yading@10
|
168 err += state->range;
|
yading@10
|
169 if(err >= ((state->range + 1) >> 1))
|
yading@10
|
170 err -= state->range;
|
yading@10
|
171
|
yading@10
|
172 ls_encode_runterm(state, pb, RItype, err, ff_log2_run[state->run_index[comp]]);
|
yading@10
|
173
|
yading@10
|
174 if(state->run_index[comp] > 0)
|
yading@10
|
175 state->run_index[comp]--;
|
yading@10
|
176 } else { /* regular mode */
|
yading@10
|
177 int context;
|
yading@10
|
178
|
yading@10
|
179 context = ff_jpegls_quantize(state, D0) * 81 + ff_jpegls_quantize(state, D1) * 9 + ff_jpegls_quantize(state, D2);
|
yading@10
|
180 pred = mid_pred(Ra, Ra + Rb - Rc, Rb);
|
yading@10
|
181
|
yading@10
|
182 if(context < 0){
|
yading@10
|
183 context = -context;
|
yading@10
|
184 sign = 1;
|
yading@10
|
185 pred = av_clip(pred - state->C[context], 0, state->maxval);
|
yading@10
|
186 err = pred - R(cur, x);
|
yading@10
|
187 }else{
|
yading@10
|
188 sign = 0;
|
yading@10
|
189 pred = av_clip(pred + state->C[context], 0, state->maxval);
|
yading@10
|
190 err = R(cur, x) - pred;
|
yading@10
|
191 }
|
yading@10
|
192
|
yading@10
|
193 if(state->near){
|
yading@10
|
194 if(err > 0)
|
yading@10
|
195 err = (state->near + err) / state->twonear;
|
yading@10
|
196 else
|
yading@10
|
197 err = -(state->near - err) / state->twonear;
|
yading@10
|
198 if(!sign)
|
yading@10
|
199 Ra = av_clip(pred + err * state->twonear, 0, state->maxval);
|
yading@10
|
200 else
|
yading@10
|
201 Ra = av_clip(pred - err * state->twonear, 0, state->maxval);
|
yading@10
|
202 W(cur, x, Ra);
|
yading@10
|
203 }
|
yading@10
|
204
|
yading@10
|
205 ls_encode_regular(state, pb, context, err);
|
yading@10
|
206 }
|
yading@10
|
207 x += stride;
|
yading@10
|
208 }
|
yading@10
|
209 }
|
yading@10
|
210
|
yading@10
|
211 static void ls_store_lse(JLSState *state, PutBitContext *pb){
|
yading@10
|
212 /* Test if we have default params and don't need to store LSE */
|
yading@10
|
213 JLSState state2 = { 0 };
|
yading@10
|
214 state2.bpp = state->bpp;
|
yading@10
|
215 state2.near = state->near;
|
yading@10
|
216 ff_jpegls_reset_coding_parameters(&state2, 1);
|
yading@10
|
217 if(state->T1 == state2.T1 && state->T2 == state2.T2 && state->T3 == state2.T3 && state->reset == state2.reset)
|
yading@10
|
218 return;
|
yading@10
|
219 /* store LSE type 1 */
|
yading@10
|
220 put_marker(pb, LSE);
|
yading@10
|
221 put_bits(pb, 16, 13);
|
yading@10
|
222 put_bits(pb, 8, 1);
|
yading@10
|
223 put_bits(pb, 16, state->maxval);
|
yading@10
|
224 put_bits(pb, 16, state->T1);
|
yading@10
|
225 put_bits(pb, 16, state->T2);
|
yading@10
|
226 put_bits(pb, 16, state->T3);
|
yading@10
|
227 put_bits(pb, 16, state->reset);
|
yading@10
|
228 }
|
yading@10
|
229
|
yading@10
|
230 static int encode_picture_ls(AVCodecContext *avctx, AVPacket *pkt,
|
yading@10
|
231 const AVFrame *pict, int *got_packet)
|
yading@10
|
232 {
|
yading@10
|
233 JpeglsContext * const s = avctx->priv_data;
|
yading@10
|
234 AVFrame * const p = &s->picture;
|
yading@10
|
235 const int near = avctx->prediction_method;
|
yading@10
|
236 PutBitContext pb, pb2;
|
yading@10
|
237 GetBitContext gb;
|
yading@10
|
238 uint8_t *buf2, *zero, *cur, *last;
|
yading@10
|
239 JLSState *state;
|
yading@10
|
240 int i, size, ret;
|
yading@10
|
241 int comps;
|
yading@10
|
242
|
yading@10
|
243 *p = *pict;
|
yading@10
|
244 p->pict_type= AV_PICTURE_TYPE_I;
|
yading@10
|
245 p->key_frame= 1;
|
yading@10
|
246
|
yading@10
|
247 if(avctx->pix_fmt == AV_PIX_FMT_GRAY8 || avctx->pix_fmt == AV_PIX_FMT_GRAY16)
|
yading@10
|
248 comps = 1;
|
yading@10
|
249 else
|
yading@10
|
250 comps = 3;
|
yading@10
|
251
|
yading@10
|
252 if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*comps*4 +
|
yading@10
|
253 FF_MIN_BUFFER_SIZE)) < 0)
|
yading@10
|
254 return ret;
|
yading@10
|
255
|
yading@10
|
256 buf2 = av_malloc(pkt->size);
|
yading@10
|
257
|
yading@10
|
258 init_put_bits(&pb, pkt->data, pkt->size);
|
yading@10
|
259 init_put_bits(&pb2, buf2, pkt->size);
|
yading@10
|
260
|
yading@10
|
261 /* write our own JPEG header, can't use mjpeg_picture_header */
|
yading@10
|
262 put_marker(&pb, SOI);
|
yading@10
|
263 put_marker(&pb, SOF48);
|
yading@10
|
264 put_bits(&pb, 16, 8 + comps * 3); // header size depends on components
|
yading@10
|
265 put_bits(&pb, 8, (avctx->pix_fmt == AV_PIX_FMT_GRAY16) ? 16 : 8); // bpp
|
yading@10
|
266 put_bits(&pb, 16, avctx->height);
|
yading@10
|
267 put_bits(&pb, 16, avctx->width);
|
yading@10
|
268 put_bits(&pb, 8, comps); // components
|
yading@10
|
269 for(i = 1; i <= comps; i++) {
|
yading@10
|
270 put_bits(&pb, 8, i); // component ID
|
yading@10
|
271 put_bits(&pb, 8, 0x11); // subsampling: none
|
yading@10
|
272 put_bits(&pb, 8, 0); // Tiq, used by JPEG-LS ext
|
yading@10
|
273 }
|
yading@10
|
274
|
yading@10
|
275 put_marker(&pb, SOS);
|
yading@10
|
276 put_bits(&pb, 16, 6 + comps * 2);
|
yading@10
|
277 put_bits(&pb, 8, comps);
|
yading@10
|
278 for(i = 1; i <= comps; i++) {
|
yading@10
|
279 put_bits(&pb, 8, i); // component ID
|
yading@10
|
280 put_bits(&pb, 8, 0); // mapping index: none
|
yading@10
|
281 }
|
yading@10
|
282 put_bits(&pb, 8, near);
|
yading@10
|
283 put_bits(&pb, 8, (comps > 1) ? 1 : 0); // interleaving: 0 - plane, 1 - line
|
yading@10
|
284 put_bits(&pb, 8, 0); // point transform: none
|
yading@10
|
285
|
yading@10
|
286 state = av_mallocz(sizeof(JLSState));
|
yading@10
|
287 /* initialize JPEG-LS state from JPEG parameters */
|
yading@10
|
288 state->near = near;
|
yading@10
|
289 state->bpp = (avctx->pix_fmt == AV_PIX_FMT_GRAY16) ? 16 : 8;
|
yading@10
|
290 ff_jpegls_reset_coding_parameters(state, 0);
|
yading@10
|
291 ff_jpegls_init_state(state);
|
yading@10
|
292
|
yading@10
|
293 ls_store_lse(state, &pb);
|
yading@10
|
294
|
yading@10
|
295 zero = av_mallocz(FFABS(p->linesize[0]));
|
yading@10
|
296 if (!zero) {
|
yading@10
|
297 av_free(state);
|
yading@10
|
298 return AVERROR(ENOMEM);
|
yading@10
|
299 }
|
yading@10
|
300 last = zero;
|
yading@10
|
301 cur = p->data[0];
|
yading@10
|
302 if(avctx->pix_fmt == AV_PIX_FMT_GRAY8){
|
yading@10
|
303 int t = 0;
|
yading@10
|
304
|
yading@10
|
305 for(i = 0; i < avctx->height; i++) {
|
yading@10
|
306 ls_encode_line(state, &pb2, last, cur, t, avctx->width, 1, 0, 8);
|
yading@10
|
307 t = last[0];
|
yading@10
|
308 last = cur;
|
yading@10
|
309 cur += p->linesize[0];
|
yading@10
|
310 }
|
yading@10
|
311 }else if(avctx->pix_fmt == AV_PIX_FMT_GRAY16){
|
yading@10
|
312 int t = 0;
|
yading@10
|
313
|
yading@10
|
314 for(i = 0; i < avctx->height; i++) {
|
yading@10
|
315 ls_encode_line(state, &pb2, last, cur, t, avctx->width, 1, 0, 16);
|
yading@10
|
316 t = *((uint16_t*)last);
|
yading@10
|
317 last = cur;
|
yading@10
|
318 cur += p->linesize[0];
|
yading@10
|
319 }
|
yading@10
|
320 }else if(avctx->pix_fmt == AV_PIX_FMT_RGB24){
|
yading@10
|
321 int j, width;
|
yading@10
|
322 int Rc[3] = {0, 0, 0};
|
yading@10
|
323
|
yading@10
|
324 width = avctx->width * 3;
|
yading@10
|
325 for(i = 0; i < avctx->height; i++) {
|
yading@10
|
326 for(j = 0; j < 3; j++) {
|
yading@10
|
327 ls_encode_line(state, &pb2, last + j, cur + j, Rc[j], width, 3, j, 8);
|
yading@10
|
328 Rc[j] = last[j];
|
yading@10
|
329 }
|
yading@10
|
330 last = cur;
|
yading@10
|
331 cur += s->picture.linesize[0];
|
yading@10
|
332 }
|
yading@10
|
333 }else if(avctx->pix_fmt == AV_PIX_FMT_BGR24){
|
yading@10
|
334 int j, width;
|
yading@10
|
335 int Rc[3] = {0, 0, 0};
|
yading@10
|
336
|
yading@10
|
337 width = avctx->width * 3;
|
yading@10
|
338 for(i = 0; i < avctx->height; i++) {
|
yading@10
|
339 for(j = 2; j >= 0; j--) {
|
yading@10
|
340 ls_encode_line(state, &pb2, last + j, cur + j, Rc[j], width, 3, j, 8);
|
yading@10
|
341 Rc[j] = last[j];
|
yading@10
|
342 }
|
yading@10
|
343 last = cur;
|
yading@10
|
344 cur += s->picture.linesize[0];
|
yading@10
|
345 }
|
yading@10
|
346 }
|
yading@10
|
347
|
yading@10
|
348 av_freep(&zero);
|
yading@10
|
349 av_freep(&state);
|
yading@10
|
350
|
yading@10
|
351 // the specification says that after doing 0xff escaping unused bits in the
|
yading@10
|
352 // last byte must be set to 0, so just append 7 "optional" zero-bits to
|
yading@10
|
353 // avoid special-casing.
|
yading@10
|
354 put_bits(&pb2, 7, 0);
|
yading@10
|
355 size = put_bits_count(&pb2);
|
yading@10
|
356 flush_put_bits(&pb2);
|
yading@10
|
357 /* do escape coding */
|
yading@10
|
358 init_get_bits(&gb, buf2, size);
|
yading@10
|
359 size -= 7;
|
yading@10
|
360 while(get_bits_count(&gb) < size){
|
yading@10
|
361 int v;
|
yading@10
|
362 v = get_bits(&gb, 8);
|
yading@10
|
363 put_bits(&pb, 8, v);
|
yading@10
|
364 if(v == 0xFF){
|
yading@10
|
365 v = get_bits(&gb, 7);
|
yading@10
|
366 put_bits(&pb, 8, v);
|
yading@10
|
367 }
|
yading@10
|
368 }
|
yading@10
|
369 avpriv_align_put_bits(&pb);
|
yading@10
|
370 av_free(buf2);
|
yading@10
|
371
|
yading@10
|
372 /* End of image */
|
yading@10
|
373 put_marker(&pb, EOI);
|
yading@10
|
374 flush_put_bits(&pb);
|
yading@10
|
375
|
yading@10
|
376 emms_c();
|
yading@10
|
377
|
yading@10
|
378 pkt->size = put_bits_count(&pb) >> 3;
|
yading@10
|
379 pkt->flags |= AV_PKT_FLAG_KEY;
|
yading@10
|
380 *got_packet = 1;
|
yading@10
|
381 return 0;
|
yading@10
|
382 }
|
yading@10
|
383
|
yading@10
|
384 static av_cold int encode_init_ls(AVCodecContext *ctx) {
|
yading@10
|
385 JpeglsContext *c = (JpeglsContext*)ctx->priv_data;
|
yading@10
|
386
|
yading@10
|
387 c->avctx = ctx;
|
yading@10
|
388 ctx->coded_frame = &c->picture;
|
yading@10
|
389
|
yading@10
|
390 if(ctx->pix_fmt != AV_PIX_FMT_GRAY8 && ctx->pix_fmt != AV_PIX_FMT_GRAY16 && ctx->pix_fmt != AV_PIX_FMT_RGB24 && ctx->pix_fmt != AV_PIX_FMT_BGR24){
|
yading@10
|
391 av_log(ctx, AV_LOG_ERROR, "Only grayscale and RGB24/BGR24 images are supported\n");
|
yading@10
|
392 return -1;
|
yading@10
|
393 }
|
yading@10
|
394 return 0;
|
yading@10
|
395 }
|
yading@10
|
396
|
yading@10
|
397 AVCodec ff_jpegls_encoder = {
|
yading@10
|
398 .name = "jpegls",
|
yading@10
|
399 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
400 .id = AV_CODEC_ID_JPEGLS,
|
yading@10
|
401 .priv_data_size = sizeof(JpeglsContext),
|
yading@10
|
402 .init = encode_init_ls,
|
yading@10
|
403 .encode2 = encode_picture_ls,
|
yading@10
|
404 .pix_fmts = (const enum AVPixelFormat[]){
|
yading@10
|
405 AV_PIX_FMT_BGR24, AV_PIX_FMT_RGB24, AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
|
yading@10
|
406 AV_PIX_FMT_NONE
|
yading@10
|
407 },
|
yading@10
|
408 .long_name = NULL_IF_CONFIG_SMALL("JPEG-LS"),
|
yading@10
|
409 };
|