annotate loco.c @ 11877:17092b43bd64 libavcodec

nellymoserdec: Simplify calculation of numbers of blocks
author mstorsjo
date Mon, 14 Jun 2010 14:06:38 +0000
parents 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
1 /*
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
2 * LOCO codec
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
3 * Copyright (c) 2005 Konstantin Shishkov
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
15 * Lesser General Public License for more details.
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
16 *
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
21
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
24 * LOCO codec.
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
26
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
27 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
28 #include "get_bits.h"
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
29 #include "golomb.h"
8627
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 7040
diff changeset
30 #include "mathops.h"
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
31
2587
1e8fbc2b64e0 support some more color modes; patch by Kostya
melanson
parents: 2558
diff changeset
32 enum LOCO_MODE {LOCO_UNKN=0, LOCO_CYUY2=-1, LOCO_CRGB=-2, LOCO_CRGBA=-3, LOCO_CYV12=-4,
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
33 LOCO_YUY2=1, LOCO_UYVY=2, LOCO_RGB=3, LOCO_RGBA=4, LOCO_YV12=5};
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
34
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
35 typedef struct LOCOContext{
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
36 AVCodecContext *avctx;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
37 AVFrame pic;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
38 int lossy;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
39 int mode;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
40 } LOCOContext;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
41
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
42 typedef struct RICEContext{
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
43 GetBitContext gb;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
44 int save, run, run2; /* internal rice decoder state */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
45 int sum, count; /* sum and count for getting rice parameter */
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
46 int lossy;
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
47 }RICEContext;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
48
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
49 static int loco_get_rice_param(RICEContext *r)
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
50 {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
51 int cnt = 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
52 int val = r->count;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
53
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
54 while(r->sum > val && cnt < 9) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
55 val <<= 1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
56 cnt++;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
57 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
58
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
59 return cnt;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
60 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
61
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
62 static inline void loco_update_rice_param(RICEContext *r, int val)
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
63 {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
64 r->sum += val;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
65 r->count++;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
66
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
67 if(r->count == 16) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
68 r->sum >>= 1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
69 r->count >>= 1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
70 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
71 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
72
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
73 static inline int loco_get_rice(RICEContext *r)
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
74 {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
75 int v;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
76 if (r->run > 0) { /* we have zero run */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
77 r->run--;
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
78 loco_update_rice_param(r, 0);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
79 return 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
80 }
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
81 v = get_ur_golomb_jpegls(&r->gb, loco_get_rice_param(r), INT_MAX, 0);
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
82 loco_update_rice_param(r, (v+1)>>1);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
83 if (!v) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
84 if (r->save >= 0) {
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
85 r->run = get_ur_golomb_jpegls(&r->gb, 2, INT_MAX, 0);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
86 if(r->run > 1)
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
87 r->save += r->run + 1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
88 else
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
89 r->save -= 3;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
90 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
91 else
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
92 r->run2++;
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
93 } else {
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
94 v = ((v>>1) + r->lossy) ^ -(v&1);
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
95 if (r->run2 > 0) {
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
96 if (r->run2 > 2)
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
97 r->save += r->run2;
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
98 else
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
99 r->save -= 3;
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
100 r->run2 = 0;
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
101 }
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
102 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
103
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
104 return v;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
105 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
106
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
107 /* LOCO main predictor - LOCO-I/JPEG-LS predictor */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
108 static inline int loco_predict(uint8_t* data, int stride, int step)
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
109 {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
110 int a, b, c;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
111
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
112 a = data[-stride];
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
113 b = data[-step];
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
114 c = data[-stride - step];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
115
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
116 return mid_pred(a, a + b - c, b);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
117 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
118
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
119 static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int height,
6218
michael
parents: 5215
diff changeset
120 int stride, const uint8_t *buf, int buf_size, int step)
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
121 {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
122 RICEContext rc;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
123 int val;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
124 int i, j;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
125
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
126 init_get_bits(&rc.gb, buf, buf_size*8);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
127 rc.save = 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
128 rc.run = 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
129 rc.run2 = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
130 rc.lossy = l->lossy;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
131
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
132 rc.sum = 8;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
133 rc.count = 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
134
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
135 /* restore top left pixel */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
136 val = loco_get_rice(&rc);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
137 data[0] = 128 + val;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
138 /* restore top line */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
139 for (i = 1; i < width; i++) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
140 val = loco_get_rice(&rc);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
141 data[i * step] = data[i * step - step] + val;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
142 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
143 data += stride;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
144 for (j = 1; j < height; j++) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
145 /* restore left column */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
146 val = loco_get_rice(&rc);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
147 data[0] = data[-stride] + val;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
148 /* restore all other pixels */
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
149 for (i = 1; i < width; i++) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
150 val = loco_get_rice(&rc);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
151 data[i * step] = loco_predict(&data[i * step], stride, step) + val;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
152 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
153 data += stride;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
154 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
155
6750
c93570aeb3eb Remove unnecessary parentheses from return calls.
diego
parents: 6710
diff changeset
156 return (get_bits_count(&rc.gb) + 7) >> 3;
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
157 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
158
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
159 static int decode_frame(AVCodecContext *avctx,
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
160 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
161 AVPacket *avpkt)
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
162 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
163 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
164 int buf_size = avpkt->size;
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
165 LOCOContext * const l = avctx->priv_data;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
166 AVFrame * const p= (AVFrame*)&l->pic;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
167 int decoded;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
168
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
169 if(p->data[0])
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
170 avctx->release_buffer(avctx, p);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
171
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
172 p->reference = 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
173 if(avctx->get_buffer(avctx, p) < 0){
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
174 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
175 return -1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
176 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
177 p->key_frame = 1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
178
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
179 switch(l->mode) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
180 case LOCO_CYUY2: case LOCO_YUY2: case LOCO_UYVY:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
181 decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
182 p->linesize[0], buf, buf_size, 1);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
183 buf += decoded; buf_size -= decoded;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
184 decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
185 p->linesize[1], buf, buf_size, 1);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
186 buf += decoded; buf_size -= decoded;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
187 decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
188 p->linesize[2], buf, buf_size, 1);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
189 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
190 case LOCO_CYV12: case LOCO_YV12:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
191 decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
192 p->linesize[0], buf, buf_size, 1);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
193 buf += decoded; buf_size -= decoded;
2598
6eaebf1fbd74 Fix colors for YV12 case (u/v planes are swapped)
rtognimp
parents: 2587
diff changeset
194 decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height / 2,
6eaebf1fbd74 Fix colors for YV12 case (u/v planes are swapped)
rtognimp
parents: 2587
diff changeset
195 p->linesize[2], buf, buf_size, 1);
6eaebf1fbd74 Fix colors for YV12 case (u/v planes are swapped)
rtognimp
parents: 2587
diff changeset
196 buf += decoded; buf_size -= decoded;
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
197 decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height / 2,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
198 p->linesize[1], buf, buf_size, 1);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
199 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
200 case LOCO_CRGB: case LOCO_RGB:
2599
3e36a706f5b7 Fix upside-down picture for BGR24 images (fixes pig-loco-rgb.avi)
rtognimp
parents: 2598
diff changeset
201 decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height,
3e36a706f5b7 Fix upside-down picture for BGR24 images (fixes pig-loco-rgb.avi)
rtognimp
parents: 2598
diff changeset
202 -p->linesize[0], buf, buf_size, 3);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
203 buf += decoded; buf_size -= decoded;
2599
3e36a706f5b7 Fix upside-down picture for BGR24 images (fixes pig-loco-rgb.avi)
rtognimp
parents: 2598
diff changeset
204 decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 1, avctx->width, avctx->height,
3e36a706f5b7 Fix upside-down picture for BGR24 images (fixes pig-loco-rgb.avi)
rtognimp
parents: 2598
diff changeset
205 -p->linesize[0], buf, buf_size, 3);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
206 buf += decoded; buf_size -= decoded;
2599
3e36a706f5b7 Fix upside-down picture for BGR24 images (fixes pig-loco-rgb.avi)
rtognimp
parents: 2598
diff changeset
207 decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 2, avctx->width, avctx->height,
3e36a706f5b7 Fix upside-down picture for BGR24 images (fixes pig-loco-rgb.avi)
rtognimp
parents: 2598
diff changeset
208 -p->linesize[0], buf, buf_size, 3);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
209 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
210 case LOCO_RGBA:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
211 decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
212 p->linesize[0], buf, buf_size, 4);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
213 buf += decoded; buf_size -= decoded;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
214 decoded = loco_decode_plane(l, p->data[0] + 1, avctx->width, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
215 p->linesize[0], buf, buf_size, 4);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
216 buf += decoded; buf_size -= decoded;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
217 decoded = loco_decode_plane(l, p->data[0] + 2, avctx->width, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
218 p->linesize[0], buf, buf_size, 4);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
219 buf += decoded; buf_size -= decoded;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
220 decoded = loco_decode_plane(l, p->data[0] + 3, avctx->width, avctx->height,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
221 p->linesize[0], buf, buf_size, 4);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
222 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
223 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
224
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
225 *data_size = sizeof(AVFrame);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
226 *(AVFrame*)data = l->pic;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
227
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
228 return buf_size;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
229 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
230
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
231 static av_cold int decode_init(AVCodecContext *avctx){
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
232 LOCOContext * const l = avctx->priv_data;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
233 int version;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
234
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
235 l->avctx = avctx;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
236 if (avctx->extradata_size < 12) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
237 av_log(avctx, AV_LOG_ERROR, "Extradata size must be >= 12 instead of %i\n",
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
238 avctx->extradata_size);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
239 return -1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
240 }
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
241 version = AV_RL32(avctx->extradata);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
242 switch(version) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
243 case 1:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
244 l->lossy = 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
245 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
246 case 2:
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
247 l->lossy = AV_RL32(avctx->extradata + 8);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
248 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
249 default:
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
250 l->lossy = AV_RL32(avctx->extradata + 8);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
251 av_log(avctx, AV_LOG_INFO, "This is LOCO codec version %i, please upload file for study\n", version);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
252 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2599
diff changeset
253
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
254 l->mode = AV_RL32(avctx->extradata + 4);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
255 switch(l->mode) {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
256 case LOCO_CYUY2: case LOCO_YUY2: case LOCO_UYVY:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
257 avctx->pix_fmt = PIX_FMT_YUV422P;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
258 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
259 case LOCO_CRGB: case LOCO_RGB:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
260 avctx->pix_fmt = PIX_FMT_BGR24;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
261 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
262 case LOCO_CYV12: case LOCO_YV12:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
263 avctx->pix_fmt = PIX_FMT_YUV420P;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
264 break;
2587
1e8fbc2b64e0 support some more color modes; patch by Kostya
melanson
parents: 2558
diff changeset
265 case LOCO_CRGBA: case LOCO_RGBA:
4494
ce643a22f049 Replace deprecated PIX_FMT names by the newer variants.
diego
parents: 4364
diff changeset
266 avctx->pix_fmt = PIX_FMT_RGB32;
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
267 break;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
268 default:
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
269 av_log(avctx, AV_LOG_INFO, "Unknown colorspace, index = %i\n", l->mode);
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
270 return -1;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
271 }
2558
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
272 if(avctx->debug & FF_DEBUG_PICT_INFO)
2b01396ab483 optimize & simplify
michael
parents: 2530
diff changeset
273 av_log(avctx, AV_LOG_INFO, "lossy:%i, version:%i, mode: %i\n", l->lossy, version, l->mode);
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
274
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
275 return 0;
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
276 }
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
277
10399
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
278 static av_cold int decode_end(AVCodecContext *avctx){
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
279 LOCOContext * const l = avctx->priv_data;
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
280 AVFrame *pic = &l->pic;
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
281
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
282 if (pic->data[0])
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
283 avctx->release_buffer(avctx, pic);
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
284
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
285 return 0;
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
286 }
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
287
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
288 AVCodec loco_decoder = {
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
289 "loco",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10413
diff changeset
290 AVMEDIA_TYPE_VIDEO,
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
291 CODEC_ID_LOCO,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
292 sizeof(LOCOContext),
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
293 decode_init,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
294 NULL,
10399
136334ad62b3 Release frame after decoding is done
kostya
parents: 9428
diff changeset
295 decode_end,
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
296 decode_frame,
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
297 CODEC_CAP_DR1,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6750
diff changeset
298 .long_name = NULL_IF_CONFIG_SMALL("LOCO"),
2530
eace30b70601 go LOCO, courtesy of Kostya Shishkov
melanson
parents:
diff changeset
299 };