FFmpeg
Loading...
Searching...
No Matches
indeo2.c
Go to the documentation of this file.
1/*
2 * Intel Indeo 2 codec
3 * Copyright (c) 2005 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
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.
11 *
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.
16 *
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
20 */
21
22/**
23 * @file
24 * Intel Indeo 2 decoder.
25 */
26
28#include "libavutil/thread.h"
29
30#define BITSTREAM_READER_LE
31#include "avcodec.h"
32#include "codec_internal.h"
33#include "decode.h"
34#include "get_bits.h"
35#include "indeo2data.h"
36
43
44#define CODE_VLC_BITS 14
46
47/* Indeo 2 codes are in range 0x01..0x7F and 0x81..0x90 */
48static inline int ir2_get_code(GetBitContext *gb)
49{
50 return get_vlc2(gb, ir2_vlc, CODE_VLC_BITS, 1);
51}
52
53static int ir2_decode_plane(Ir2Context *ctx, int width, int height, uint8_t *dst,
54 int pitch, const uint8_t *table)
55{
56 int i;
57 int j;
58 int out = 0;
59
60 if ((width & 1) || width * height / (2*(IR2_CODES - 0x7F)) > get_bits_left(&ctx->gb))
62
63 /* first line contain absolute values, other lines contain deltas */
64 while (out < width) {
65 int c = ir2_get_code(&ctx->gb);
66 if (c >= 0x80) { /* we have a run */
67 c -= 0x7F;
68 if (out + c*2 > width)
70 for (i = 0; i < c * 2; i++)
71 dst[out++] = 0x80;
72 } else { /* copy two values from table */
73 if (c <= 0)
75 dst[out++] = table[c * 2];
76 dst[out++] = table[(c * 2) + 1];
77 }
78 }
79 dst += pitch;
80
81 for (j = 1; j < height; j++) {
82 out = 0;
83 while (out < width) {
84 int c;
85 if (get_bits_left(&ctx->gb) <= 0)
87 c = ir2_get_code(&ctx->gb);
88 if (c >= 0x80) { /* we have a skip */
89 c -= 0x7F;
90 if (out + c*2 > width)
92 for (i = 0; i < c * 2; i++) {
93 dst[out] = dst[out - pitch];
94 out++;
95 }
96 } else { /* add two deltas from table */
97 int t;
98 if (c <= 0)
100 t = dst[out - pitch] + (table[c * 2] - 128);
101 t = av_clip_uint8(t);
102 dst[out] = t;
103 out++;
104 t = dst[out - pitch] + (table[(c * 2) + 1] - 128);
105 t = av_clip_uint8(t);
106 dst[out] = t;
107 out++;
108 }
109 }
110 dst += pitch;
111 }
112 return 0;
113}
114
115static int ir2_decode_plane_inter(Ir2Context *ctx, int width, int height, uint8_t *dst,
116 int pitch, const uint8_t *table)
117{
118 int j;
119 int out = 0;
120 int c;
121 int t;
122
123 if (width & 1)
124 return AVERROR_INVALIDDATA;
125
126 for (j = 0; j < height; j++) {
127 out = 0;
128 while (out < width) {
129 if (get_bits_left(&ctx->gb) <= 0)
130 return AVERROR_INVALIDDATA;
131 c = ir2_get_code(&ctx->gb);
132 if (c >= 0x80) { /* we have a skip */
133 c -= 0x7F;
134 out += c * 2;
135 } else { /* add two deltas from table */
136 if (c <= 0)
137 return AVERROR_INVALIDDATA;
138 t = dst[out] + (((table[c * 2] - 128)*3) >> 2);
139 t = av_clip_uint8(t);
140 dst[out] = t;
141 out++;
142 t = dst[out] + (((table[(c * 2) + 1] - 128)*3) >> 2);
143 t = av_clip_uint8(t);
144 dst[out] = t;
145 out++;
146 }
147 }
148 dst += pitch;
149 }
150 return 0;
151}
152
153static int ir2_decode_frame(AVCodecContext *avctx, AVFrame *picture,
154 int *got_frame, AVPacket *avpkt)
155{
156 Ir2Context * const s = avctx->priv_data;
157 const uint8_t *buf = avpkt->data;
158 int buf_size = avpkt->size;
159 AVFrame * const p = s->picture;
160 int start, ret;
161 int ltab, ctab;
162
163 if ((ret = ff_reget_buffer(avctx, p, 0)) < 0)
164 return ret;
165
166 start = 48; /* hardcoded for now */
167
168 if (start >= buf_size) {
169 av_log(s->avctx, AV_LOG_ERROR, "input buffer size too small (%d)\n", buf_size);
170 return AVERROR_INVALIDDATA;
171 }
172
173 s->decode_delta = buf[18];
174
175 /* decide whether frame uses deltas or not */
176
177 if ((ret = init_get_bits8(&s->gb, buf + start, buf_size - start)) < 0)
178 return ret;
179
180 ltab = buf[0x22] & 3;
181 ctab = buf[0x22] >> 2;
182
183 if (ctab > 3) {
184 av_log(avctx, AV_LOG_ERROR, "ctab %d is invalid\n", ctab);
185 return AVERROR_INVALIDDATA;
186 }
187
188 if (s->decode_delta) { /* intraframe */
189 if ((ret = ir2_decode_plane(s, avctx->width, avctx->height,
190 p->data[0], p->linesize[0],
191 ir2_delta_table[ltab])) < 0)
192 return ret;
193
194 /* swapped U and V */
195 if ((ret = ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2,
196 p->data[2], p->linesize[2],
197 ir2_delta_table[ctab])) < 0)
198 return ret;
199 if ((ret = ir2_decode_plane(s, avctx->width >> 2, avctx->height >> 2,
200 p->data[1], p->linesize[1],
201 ir2_delta_table[ctab])) < 0)
202 return ret;
203 } else { /* interframe */
204 if ((ret = ir2_decode_plane_inter(s, avctx->width, avctx->height,
205 p->data[0], p->linesize[0],
206 ir2_delta_table[ltab])) < 0)
207 return ret;
208 /* swapped U and V */
209 if ((ret = ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2,
210 p->data[2], p->linesize[2],
211 ir2_delta_table[ctab])) < 0)
212 return ret;
213 if ((ret = ir2_decode_plane_inter(s, avctx->width >> 2, avctx->height >> 2,
214 p->data[1], p->linesize[1],
215 ir2_delta_table[ctab])) < 0)
216 return ret;
217 }
218
219 if ((ret = av_frame_ref(picture, p)) < 0)
220 return ret;
221
222 *got_frame = 1;
223
224 return buf_size;
225}
226
227static av_cold void ir2_init_static(void)
228{
230 &ir2_tab[0][1], 2, &ir2_tab[0][0], 2, 1,
232}
233
235{
236 static AVOnce init_static_once = AV_ONCE_INIT;
237 Ir2Context * const ic = avctx->priv_data;
238
239 ic->avctx = avctx;
240
242
243 ic->picture = av_frame_alloc();
244 if (!ic->picture)
245 return AVERROR(ENOMEM);
246
247 ff_thread_once(&init_static_once, ir2_init_static);
248
249 return 0;
250}
251
253{
254 Ir2Context * const ic = avctx->priv_data;
255
257
258 return 0;
259}
260
262 .p.name = "indeo2",
263 CODEC_LONG_NAME("Intel Indeo 2"),
264 .p.type = AVMEDIA_TYPE_VIDEO,
265 .p.id = AV_CODEC_ID_INDEO2,
266 .priv_data_size = sizeof(Ir2Context),
270 .p.capabilities = AV_CODEC_CAP_DR1,
271};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
const FFCodec ff_indeo2_decoder
Definition indeo2.c:261
static FILE * out
static AVFormatContext * ctx
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define av_clip_uint8
Definition common.h:106
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
Definition decode.c:1906
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
bitstream reader API header.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition get_bits.h:645
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AV_CODEC_ID_INDEO2
Definition codec_id.h:125
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
static int ir2_get_code(GetBitContext *gb)
Definition indeo2.c:48
static av_cold void ir2_init_static(void)
Definition indeo2.c:227
static VLCElem ir2_vlc[1<< CODE_VLC_BITS]
Definition indeo2.c:45
static int ir2_decode_plane(Ir2Context *ctx, int width, int height, uint8_t *dst, int pitch, const uint8_t *table)
Definition indeo2.c:53
static int ir2_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
Definition indeo2.c:153
#define CODE_VLC_BITS
Definition indeo2.c:44
static av_cold int ir2_decode_init(AVCodecContext *avctx)
Definition indeo2.c:234
static av_cold int ir2_decode_end(AVCodecContext *avctx)
Definition indeo2.c:252
static int ir2_decode_plane_inter(Ir2Context *ctx, int width, int height, uint8_t *dst, int pitch, const uint8_t *table)
Definition indeo2.c:115
static const uint8_t ir2_tab[IR2_CODES][2]
Definition indeo2data.h:28
#define IR2_CODES
Definition indeo2data.h:27
static const uint8_t ir2_delta_table[4][256]
Definition indeo2data.h:60
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
static const uint16_t table[]
Definition prosumer.c:203
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
AVFrame * picture
Definition indeo2.c:39
AVCodecContext * avctx
Definition indeo2.c:38
int decode_delta
Definition indeo2.c:41
GetBitContext gb
Definition indeo2.c:40
Definition vlc.h:32
#define av_log(a,...)
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
#define VLC_INIT_OUTPUT_LE
Definition vlc.h:196
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
Definition vlc.h:288
static double c[64]