FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
indeo5.c
Go to the documentation of this file.
1
/*
2
* Indeo Video Interactive v5 compatible decoder
3
* Copyright (c) 2009 Maxim Poliakovski
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
* Indeo Video Interactive version 5 decoder
25
*
26
* Indeo5 data is usually transported within .avi or .mov files.
27
* Known FOURCCs: 'IV50'
28
*/
29
30
#define BITSTREAM_READER_LE
31
#include "
avcodec.h
"
32
#include "
get_bits.h
"
33
#include "
dsputil.h
"
34
#include "
ivi_dsp.h
"
35
#include "
ivi_common.h
"
36
#include "
indeo5data.h
"
37
38
/**
39
* Indeo5 frame types.
40
*/
41
enum
{
42
FRAMETYPE_INTRA
= 0,
43
FRAMETYPE_INTER
= 1,
///< non-droppable P-frame
44
FRAMETYPE_INTER_SCAL
= 2,
///< droppable P-frame used in the scalability mode
45
FRAMETYPE_INTER_NOREF
= 3,
///< droppable P-frame
46
FRAMETYPE_NULL
= 4
///< empty frame with no data
47
};
48
49
#define IVI5_PIC_SIZE_ESC 15
50
51
/**
52
* Decode Indeo5 GOP (Group of pictures) header.
53
* This header is present in key frames only.
54
* It defines parameters for all frames in a GOP.
55
*
56
* @param[in,out] ctx ptr to the decoder context
57
* @param[in] avctx ptr to the AVCodecContext
58
* @return result code: 0 = OK, -1 = error
59
*/
60
static
int
decode_gop_header
(
IVI45DecContext
*ctx,
AVCodecContext
*avctx)
61
{
62
int
result, i, p, tile_size, pic_size_indx, mb_size, blk_size, is_scalable;
63
int
quant_mat, blk_size_changed = 0;
64
IVIBandDesc
*
band
, *band1, *band2;
65
IVIPicConfig
pic_conf;
66
67
ctx->
gop_flags
=
get_bits
(&ctx->
gb
, 8);
68
69
ctx->
gop_hdr_size
= (ctx->
gop_flags
& 1) ?
get_bits
(&ctx->
gb
, 16) : 0;
70
71
if
(ctx->
gop_flags
&
IVI5_IS_PROTECTED
)
72
ctx->
lock_word
=
get_bits_long
(&ctx->
gb
, 32);
73
74
tile_size = (ctx->
gop_flags
& 0x40) ? 64 <<
get_bits
(&ctx->
gb
, 2) : 0;
75
if
(tile_size > 256) {
76
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid tile size: %d\n"
, tile_size);
77
return
-1;
78
}
79
80
/* decode number of wavelet bands */
81
/* num_levels * 3 + 1 */
82
pic_conf.
luma_bands
=
get_bits
(&ctx->
gb
, 2) * 3 + 1;
83
pic_conf.
chroma_bands
=
get_bits1
(&ctx->
gb
) * 3 + 1;
84
is_scalable = pic_conf.
luma_bands
!= 1 || pic_conf.
chroma_bands
!= 1;
85
if
(is_scalable && (pic_conf.
luma_bands
!= 4 || pic_conf.
chroma_bands
!= 1)) {
86
av_log
(avctx,
AV_LOG_ERROR
,
"Scalability: unsupported subdivision! Luma bands: %d, chroma bands: %d\n"
,
87
pic_conf.
luma_bands
, pic_conf.
chroma_bands
);
88
return
-1;
89
}
90
91
pic_size_indx =
get_bits
(&ctx->
gb
, 4);
92
if
(pic_size_indx ==
IVI5_PIC_SIZE_ESC
) {
93
pic_conf.
pic_height
=
get_bits
(&ctx->
gb
, 13);
94
pic_conf.
pic_width
=
get_bits
(&ctx->
gb
, 13);
95
}
else
{
96
pic_conf.
pic_height
=
ivi5_common_pic_sizes
[pic_size_indx * 2 + 1] << 2;
97
pic_conf.
pic_width
=
ivi5_common_pic_sizes
[pic_size_indx * 2 ] << 2;
98
}
99
100
if
(ctx->
gop_flags
& 2) {
101
av_log
(avctx,
AV_LOG_ERROR
,
"YV12 picture format not supported!\n"
);
102
return
-1;
103
}
104
105
pic_conf.
chroma_height
= (pic_conf.
pic_height
+ 3) >> 2;
106
pic_conf.
chroma_width
= (pic_conf.
pic_width
+ 3) >> 2;
107
108
if
(!tile_size) {
109
pic_conf.
tile_height
= pic_conf.
pic_height
;
110
pic_conf.
tile_width
= pic_conf.
pic_width
;
111
}
else
{
112
pic_conf.
tile_height
= pic_conf.
tile_width
= tile_size;
113
}
114
115
/* check if picture layout was changed and reallocate buffers */
116
if
(
ivi_pic_config_cmp
(&pic_conf, &ctx->
pic_conf
)) {
117
result =
ff_ivi_init_planes
(ctx->
planes
, &pic_conf);
118
if
(result) {
119
av_log
(avctx,
AV_LOG_ERROR
,
"Couldn't reallocate color planes!\n"
);
120
return
-1;
121
}
122
ctx->
pic_conf
= pic_conf;
123
ctx->
is_scalable
= is_scalable;
124
blk_size_changed = 1;
/* force reallocation of the internal structures */
125
}
126
127
for
(p = 0; p <= 1; p++) {
128
for
(i = 0; i < (!p ? pic_conf.
luma_bands
: pic_conf.
chroma_bands
); i++) {
129
band = &ctx->
planes
[p].
bands
[i];
130
131
band->
is_halfpel
=
get_bits1
(&ctx->
gb
);
132
133
mb_size =
get_bits1
(&ctx->
gb
);
134
blk_size = 8 >>
get_bits1
(&ctx->
gb
);
135
mb_size = blk_size << !mb_size;
136
137
if
(p==0 && blk_size==4) {
138
av_log
(avctx,
AV_LOG_ERROR
,
"4x4 luma blocks are unsupported!\n"
);
139
return
AVERROR_PATCHWELCOME
;
140
}
141
142
blk_size_changed = mb_size != band->
mb_size
|| blk_size != band->
blk_size
;
143
if
(blk_size_changed) {
144
band->
mb_size
= mb_size;
145
band->
blk_size
= blk_size;
146
}
147
148
if
(
get_bits1
(&ctx->
gb
)) {
149
av_log
(avctx,
AV_LOG_ERROR
,
"Extended transform info encountered!\n"
);
150
return
-1;
151
}
152
153
/* select transform function and scan pattern according to plane and band number */
154
switch
((p << 2) + i) {
155
case
0:
156
band->
inv_transform
=
ff_ivi_inverse_slant_8x8
;
157
band->
dc_transform
=
ff_ivi_dc_slant_2d
;
158
band->
scan
=
ff_zigzag_direct
;
159
band->
transform_size
= 8;
160
break
;
161
162
case
1:
163
band->
inv_transform
=
ff_ivi_row_slant8
;
164
band->
dc_transform
=
ff_ivi_dc_row_slant
;
165
band->
scan
=
ff_ivi_vertical_scan_8x8
;
166
band->
transform_size
= 8;
167
break
;
168
169
case
2:
170
band->
inv_transform
=
ff_ivi_col_slant8
;
171
band->
dc_transform
=
ff_ivi_dc_col_slant
;
172
band->
scan
=
ff_ivi_horizontal_scan_8x8
;
173
band->
transform_size
= 8;
174
break
;
175
176
case
3:
177
band->
inv_transform
=
ff_ivi_put_pixels_8x8
;
178
band->
dc_transform
=
ff_ivi_put_dc_pixel_8x8
;
179
band->
scan
=
ff_ivi_horizontal_scan_8x8
;
180
band->
transform_size
= 8;
181
break
;
182
183
case
4:
184
band->
inv_transform
=
ff_ivi_inverse_slant_4x4
;
185
band->
dc_transform
=
ff_ivi_dc_slant_2d
;
186
band->
scan
=
ff_ivi_direct_scan_4x4
;
187
band->
transform_size
= 4;
188
break
;
189
}
190
191
band->
is_2d_trans
= band->
inv_transform
==
ff_ivi_inverse_slant_8x8
||
192
band->
inv_transform
==
ff_ivi_inverse_slant_4x4
;
193
194
/* select dequant matrix according to plane and band number */
195
if
(!p) {
196
quant_mat = (pic_conf.
luma_bands
> 1) ? i+1 : 0;
197
}
else
{
198
quant_mat = 5;
199
}
200
201
if
(band->
blk_size
== 8) {
202
if
(quant_mat >= 5){
203
av_log
(avctx,
AV_LOG_ERROR
,
"quant_mat %d too large!\n"
, quant_mat);
204
return
-1;
205
}
206
band->
intra_base
= &
ivi5_base_quant_8x8_intra
[quant_mat][0];
207
band->
inter_base
= &
ivi5_base_quant_8x8_inter
[quant_mat][0];
208
band->
intra_scale
= &
ivi5_scale_quant_8x8_intra
[quant_mat][0];
209
band->
inter_scale
= &
ivi5_scale_quant_8x8_inter
[quant_mat][0];
210
}
else
{
211
band->
intra_base
=
ivi5_base_quant_4x4_intra
;
212
band->
inter_base
=
ivi5_base_quant_4x4_inter
;
213
band->
intra_scale
=
ivi5_scale_quant_4x4_intra
;
214
band->
inter_scale
=
ivi5_scale_quant_4x4_inter
;
215
}
216
217
if
(
get_bits
(&ctx->
gb
, 2)) {
218
av_log
(avctx,
AV_LOG_ERROR
,
"End marker missing!\n"
);
219
return
-1;
220
}
221
}
222
}
223
224
/* copy chroma parameters into the 2nd chroma plane */
225
for
(i = 0; i < pic_conf.
chroma_bands
; i++) {
226
band1 = &ctx->
planes
[1].
bands
[i];
227
band2 = &ctx->
planes
[2].
bands
[i];
228
229
band2->
width
= band1->
width
;
230
band2->
height
= band1->
height
;
231
band2->
mb_size
= band1->
mb_size
;
232
band2->
blk_size
= band1->
blk_size
;
233
band2->
is_halfpel
= band1->
is_halfpel
;
234
band2->
intra_base
= band1->
intra_base
;
235
band2->
inter_base
= band1->
inter_base
;
236
band2->
intra_scale
= band1->
intra_scale
;
237
band2->
inter_scale
= band1->
inter_scale
;
238
band2->
scan
= band1->
scan
;
239
band2->
inv_transform
= band1->
inv_transform
;
240
band2->
dc_transform
= band1->
dc_transform
;
241
band2->
is_2d_trans
= band1->
is_2d_trans
;
242
band2->
transform_size
= band1->
transform_size
;
243
}
244
245
/* reallocate internal structures if needed */
246
if
(blk_size_changed) {
247
result =
ff_ivi_init_tiles
(ctx->
planes
, pic_conf.
tile_width
,
248
pic_conf.
tile_height
);
249
if
(result) {
250
av_log
(avctx,
AV_LOG_ERROR
,
251
"Couldn't reallocate internal structures!\n"
);
252
return
-1;
253
}
254
}
255
256
if
(ctx->
gop_flags
& 8) {
257
if
(
get_bits
(&ctx->
gb
, 3)) {
258
av_log
(avctx,
AV_LOG_ERROR
,
"Alignment bits are not zero!\n"
);
259
return
-1;
260
}
261
262
if
(
get_bits1
(&ctx->
gb
))
263
skip_bits_long
(&ctx->
gb
, 24);
/* skip transparency fill color */
264
}
265
266
align_get_bits
(&ctx->
gb
);
267
268
skip_bits
(&ctx->
gb
, 23);
/* FIXME: unknown meaning */
269
270
/* skip GOP extension if any */
271
if
(
get_bits1
(&ctx->
gb
)) {
272
do
{
273
i =
get_bits
(&ctx->
gb
, 16);
274
}
while
(i & 0x8000);
275
}
276
277
align_get_bits
(&ctx->
gb
);
278
279
return
0;
280
}
281
282
283
/**
284
* Skip a header extension.
285
*
286
* @param[in,out] gb the GetBit context
287
*/
288
static
inline
void
skip_hdr_extension
(
GetBitContext
*gb)
289
{
290
int
i,
len
;
291
292
do
{
293
len =
get_bits
(gb, 8);
294
for
(i = 0; i <
len
; i++)
skip_bits
(gb, 8);
295
}
while
(len);
296
}
297
298
299
/**
300
* Decode Indeo5 picture header.
301
*
302
* @param[in,out] ctx ptr to the decoder context
303
* @param[in] avctx ptr to the AVCodecContext
304
* @return result code: 0 = OK, -1 = error
305
*/
306
static
int
decode_pic_hdr
(
IVI45DecContext
*ctx,
AVCodecContext
*avctx)
307
{
308
if
(
get_bits
(&ctx->
gb
, 5) != 0x1F) {
309
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid picture start code!\n"
);
310
return
-1;
311
}
312
313
ctx->
prev_frame_type
= ctx->
frame_type
;
314
ctx->
frame_type
=
get_bits
(&ctx->
gb
, 3);
315
if
(ctx->
frame_type
>= 5) {
316
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid frame type: %d \n"
, ctx->
frame_type
);
317
return
-1;
318
}
319
320
ctx->
frame_num
=
get_bits
(&ctx->
gb
, 8);
321
322
if
(ctx->
frame_type
==
FRAMETYPE_INTRA
) {
323
ctx->
gop_invalid
= 1;
324
if
(
decode_gop_header
(ctx, avctx)) {
325
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid GOP header, skipping frames.\n"
);
326
return
AVERROR_INVALIDDATA
;
327
}
328
ctx->
gop_invalid
= 0;
329
}
330
331
if
(ctx->
frame_type
==
FRAMETYPE_INTER_SCAL
&& !ctx->
is_scalable
) {
332
av_log
(avctx,
AV_LOG_ERROR
,
"Scalable inter frame in non scaleable stream\n"
);
333
ctx->
frame_type
=
FRAMETYPE_INTER
;
334
return
AVERROR_INVALIDDATA
;
335
}
336
337
if
(ctx->
frame_type
!=
FRAMETYPE_NULL
) {
338
ctx->
frame_flags
=
get_bits
(&ctx->
gb
, 8);
339
340
ctx->
pic_hdr_size
= (ctx->
frame_flags
& 1) ?
get_bits_long
(&ctx->
gb
, 24) : 0;
341
342
ctx->
checksum
= (ctx->
frame_flags
& 0x10) ?
get_bits
(&ctx->
gb
, 16) : 0;
343
344
/* skip unknown extension if any */
345
if
(ctx->
frame_flags
& 0x20)
346
skip_hdr_extension
(&ctx->
gb
);
/* XXX: untested */
347
348
/* decode macroblock huffman codebook */
349
if
(
ff_ivi_dec_huff_desc
(&ctx->
gb
, ctx->
frame_flags
& 0x40,
IVI_MB_HUFF
, &ctx->
mb_vlc
, avctx))
350
return
-1;
351
352
skip_bits
(&ctx->
gb
, 3);
/* FIXME: unknown meaning! */
353
}
354
355
align_get_bits
(&ctx->
gb
);
356
357
return
0;
358
}
359
360
361
/**
362
* Decode Indeo5 band header.
363
*
364
* @param[in,out] ctx ptr to the decoder context
365
* @param[in,out] band ptr to the band descriptor
366
* @param[in] avctx ptr to the AVCodecContext
367
* @return result code: 0 = OK, -1 = error
368
*/
369
static
int
decode_band_hdr
(
IVI45DecContext
*ctx,
IVIBandDesc
*
band
,
370
AVCodecContext
*avctx)
371
{
372
int
i;
373
uint8_t
band_flags;
374
375
band_flags =
get_bits
(&ctx->
gb
, 8);
376
377
if
(band_flags & 1) {
378
band->
is_empty
= 1;
379
return
0;
380
}
381
382
band->
data_size
= (ctx->
frame_flags
& 0x80) ?
get_bits_long
(&ctx->
gb
, 24) : 0;
383
384
band->
inherit_mv
= band_flags & 2;
385
band->
inherit_qdelta
= band_flags & 8;
386
band->
qdelta_present
= band_flags & 4;
387
if
(!band->
qdelta_present
) band->
inherit_qdelta
= 1;
388
389
/* decode rvmap probability corrections if any */
390
band->
num_corr
= 0;
/* there are no corrections */
391
if
(band_flags & 0x10) {
392
band->
num_corr
=
get_bits
(&ctx->
gb
, 8);
/* get number of correction pairs */
393
if
(band->
num_corr
> 61) {
394
av_log
(avctx,
AV_LOG_ERROR
,
"Too many corrections: %d\n"
,
395
band->
num_corr
);
396
return
-1;
397
}
398
399
/* read correction pairs */
400
for
(i = 0; i < band->
num_corr
* 2; i++)
401
band->
corr
[i] =
get_bits
(&ctx->
gb
, 8);
402
}
403
404
/* select appropriate rvmap table for this band */
405
band->
rvmap_sel
= (band_flags & 0x40) ?
get_bits
(&ctx->
gb
, 3) : 8;
406
407
/* decode block huffman codebook */
408
if
(
ff_ivi_dec_huff_desc
(&ctx->
gb
, band_flags & 0x80,
IVI_BLK_HUFF
, &band->
blk_vlc
, avctx))
409
return
-1;
410
411
band->
checksum_present
=
get_bits1
(&ctx->
gb
);
412
if
(band->
checksum_present
)
413
band->
checksum
=
get_bits
(&ctx->
gb
, 16);
414
415
band->
glob_quant
=
get_bits
(&ctx->
gb
, 5);
416
417
/* skip unknown extension if any */
418
if
(band_flags & 0x20) {
/* XXX: untested */
419
align_get_bits
(&ctx->
gb
);
420
skip_hdr_extension
(&ctx->
gb
);
421
}
422
423
align_get_bits
(&ctx->
gb
);
424
425
return
0;
426
}
427
428
429
/**
430
* Decode info (block type, cbp, quant delta, motion vector)
431
* for all macroblocks in the current tile.
432
*
433
* @param[in,out] ctx ptr to the decoder context
434
* @param[in,out] band ptr to the band descriptor
435
* @param[in,out] tile ptr to the tile descriptor
436
* @param[in] avctx ptr to the AVCodecContext
437
* @return result code: 0 = OK, -1 = error
438
*/
439
static
int
decode_mb_info
(
IVI45DecContext
*ctx,
IVIBandDesc
*
band
,
440
IVITile
*tile,
AVCodecContext
*avctx)
441
{
442
int
x,
y
, mv_x, mv_y, mv_delta, offs, mb_offset,
443
mv_scale, blks_per_mb,
s
;
444
IVIMbInfo
*
mb
, *ref_mb;
445
int
row_offset = band->
mb_size
* band->
pitch
;
446
447
mb = tile->
mbs
;
448
ref_mb = tile->
ref_mbs
;
449
offs = tile->
ypos
* band->
pitch
+ tile->
xpos
;
450
451
if
(!ref_mb &&
452
((band->
qdelta_present
&& band->
inherit_qdelta
) || band->
inherit_mv
))
453
return
AVERROR_INVALIDDATA
;
454
455
if
(tile->
num_MBs
!=
IVI_MBs_PER_TILE
(tile->
width
, tile->
height
, band->
mb_size
)) {
456
av_log
(avctx,
AV_LOG_ERROR
,
"Allocated tile size %d mismatches parameters %d\n"
,
457
tile->
num_MBs
,
IVI_MBs_PER_TILE
(tile->
width
, tile->
height
, band->
mb_size
));
458
return
AVERROR_INVALIDDATA
;
459
}
460
461
/* scale factor for motion vectors */
462
mv_scale = (ctx->
planes
[0].
bands
[0].
mb_size
>> 3) - (band->
mb_size
>> 3);
463
mv_x = mv_y = 0;
464
465
for
(y = tile->
ypos
; y < (tile->
ypos
+ tile->
height
); y += band->
mb_size
) {
466
mb_offset = offs;
467
468
for
(x = tile->
xpos
; x < (tile->
xpos
+ tile->
width
); x += band->
mb_size
) {
469
mb->
xpos
= x;
470
mb->
ypos
=
y
;
471
mb->
buf_offs
= mb_offset;
472
473
if
(
get_bits1
(&ctx->
gb
)) {
474
if
(ctx->
frame_type
==
FRAMETYPE_INTRA
) {
475
av_log
(avctx,
AV_LOG_ERROR
,
"Empty macroblock in an INTRA picture!\n"
);
476
return
-1;
477
}
478
mb->
type
= 1;
/* empty macroblocks are always INTER */
479
mb->
cbp
= 0;
/* all blocks are empty */
480
481
mb->
q_delta
= 0;
482
if
(!band->
plane
&& !band->
band_num
&& (ctx->
frame_flags
& 8)) {
483
mb->
q_delta
=
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
484
IVI_VLC_BITS
, 1);
485
mb->
q_delta
=
IVI_TOSIGNED
(mb->
q_delta
);
486
}
487
488
mb->
mv_x
= mb->
mv_y
= 0;
/* no motion vector coded */
489
if
(band->
inherit_mv
&& ref_mb){
490
/* motion vector inheritance */
491
if
(mv_scale) {
492
mb->
mv_x
=
ivi_scale_mv
(ref_mb->
mv_x
, mv_scale);
493
mb->
mv_y
=
ivi_scale_mv
(ref_mb->
mv_y
, mv_scale);
494
}
else
{
495
mb->
mv_x
= ref_mb->
mv_x
;
496
mb->
mv_y
= ref_mb->
mv_y
;
497
}
498
}
499
}
else
{
500
if
(band->
inherit_mv
&& ref_mb) {
501
mb->
type
= ref_mb->
type
;
/* copy mb_type from corresponding reference mb */
502
}
else
if
(ctx->
frame_type
==
FRAMETYPE_INTRA
) {
503
mb->
type
= 0;
/* mb_type is always INTRA for intra-frames */
504
}
else
{
505
mb->
type
=
get_bits1
(&ctx->
gb
);
506
}
507
508
blks_per_mb = band->
mb_size
!= band->
blk_size
? 4 : 1;
509
mb->
cbp
=
get_bits
(&ctx->
gb
, blks_per_mb);
510
511
mb->
q_delta
= 0;
512
if
(band->
qdelta_present
) {
513
if
(band->
inherit_qdelta
) {
514
if
(ref_mb) mb->
q_delta
= ref_mb->
q_delta
;
515
}
else
if
(mb->
cbp
|| (!band->
plane
&& !band->
band_num
&&
516
(ctx->
frame_flags
& 8))) {
517
mb->
q_delta
=
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
518
IVI_VLC_BITS
, 1);
519
mb->
q_delta
=
IVI_TOSIGNED
(mb->
q_delta
);
520
}
521
}
522
523
if
(!mb->
type
) {
524
mb->
mv_x
= mb->
mv_y
= 0;
/* there is no motion vector in intra-macroblocks */
525
}
else
{
526
if
(band->
inherit_mv
&& ref_mb){
527
/* motion vector inheritance */
528
if
(mv_scale) {
529
mb->
mv_x
=
ivi_scale_mv
(ref_mb->
mv_x
, mv_scale);
530
mb->
mv_y
=
ivi_scale_mv
(ref_mb->
mv_y
, mv_scale);
531
}
else
{
532
mb->
mv_x
= ref_mb->
mv_x
;
533
mb->
mv_y
= ref_mb->
mv_y
;
534
}
535
}
else
{
536
/* decode motion vector deltas */
537
mv_delta =
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
538
IVI_VLC_BITS
, 1);
539
mv_y +=
IVI_TOSIGNED
(mv_delta);
540
mv_delta =
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
541
IVI_VLC_BITS
, 1);
542
mv_x +=
IVI_TOSIGNED
(mv_delta);
543
mb->
mv_x
= mv_x;
544
mb->
mv_y
= mv_y;
545
}
546
}
547
}
548
549
s= band->
is_halfpel
;
550
if
(mb->
type
)
551
if
( x + (mb->
mv_x
>>s) + (y+ (mb->
mv_y
>>s))*band->
pitch
< 0 ||
552
x + ((mb->
mv_x
+s)>>s) + band->
mb_size
- 1
553
+ (y+band->
mb_size
- 1 +((mb->
mv_y
+s)>>s))*band->
pitch
> band->
bufsize
- 1) {
554
av_log
(avctx,
AV_LOG_ERROR
,
"motion vector %d %d outside reference\n"
, x*s + mb->
mv_x
, y*s + mb->
mv_y
);
555
return
AVERROR_INVALIDDATA
;
556
}
557
558
mb++;
559
if
(ref_mb)
560
ref_mb++;
561
mb_offset += band->
mb_size
;
562
}
563
564
offs += row_offset;
565
}
566
567
align_get_bits
(&ctx->
gb
);
568
569
return
0;
570
}
571
572
573
/**
574
* Switch buffers.
575
*
576
* @param[in,out] ctx ptr to the decoder context
577
*/
578
static
void
switch_buffers
(
IVI45DecContext
*ctx)
579
{
580
switch
(ctx->
prev_frame_type
) {
581
case
FRAMETYPE_INTRA
:
582
case
FRAMETYPE_INTER
:
583
ctx->
buf_switch
^= 1;
584
ctx->
dst_buf
= ctx->
buf_switch
;
585
ctx->
ref_buf
= ctx->
buf_switch
^ 1;
586
break
;
587
case
FRAMETYPE_INTER_SCAL
:
588
if
(!ctx->
inter_scal
) {
589
ctx->
ref2_buf
= 2;
590
ctx->
inter_scal
= 1;
591
}
592
FFSWAP
(
int
, ctx->
dst_buf
, ctx->
ref2_buf
);
593
ctx->
ref_buf
= ctx->
ref2_buf
;
594
break
;
595
case
FRAMETYPE_INTER_NOREF
:
596
break
;
597
}
598
599
switch
(ctx->
frame_type
) {
600
case
FRAMETYPE_INTRA
:
601
ctx->
buf_switch
= 0;
602
/* FALLTHROUGH */
603
case
FRAMETYPE_INTER
:
604
ctx->
inter_scal
= 0;
605
ctx->
dst_buf
= ctx->
buf_switch
;
606
ctx->
ref_buf
= ctx->
buf_switch
^ 1;
607
break
;
608
case
FRAMETYPE_INTER_SCAL
:
609
case
FRAMETYPE_INTER_NOREF
:
610
case
FRAMETYPE_NULL
:
611
break
;
612
}
613
}
614
615
616
static
int
is_nonnull_frame
(
IVI45DecContext
*ctx)
617
{
618
return
ctx->
frame_type
!=
FRAMETYPE_NULL
;
619
}
620
621
622
/**
623
* Initialize Indeo5 decoder.
624
*/
625
static
av_cold
int
decode_init
(
AVCodecContext
*avctx)
626
{
627
IVI45DecContext
*ctx = avctx->
priv_data
;
628
int
result;
629
630
ff_ivi_init_static_vlc
();
631
632
/* copy rvmap tables in our context so we can apply changes to them */
633
memcpy(ctx->
rvmap_tabs
,
ff_ivi_rvmap_tabs
,
sizeof
(
ff_ivi_rvmap_tabs
));
634
635
/* set the initial picture layout according to the basic profile:
636
there is only one band per plane (no scalability), only one tile (no local decoding)
637
and picture format = YVU9 */
638
ctx->
pic_conf
.
pic_width
= avctx->
width
;
639
ctx->
pic_conf
.
pic_height
= avctx->
height
;
640
ctx->
pic_conf
.
chroma_width
= (avctx->
width
+ 3) >> 2;
641
ctx->
pic_conf
.
chroma_height
= (avctx->
height
+ 3) >> 2;
642
ctx->
pic_conf
.
tile_width
= avctx->
width
;
643
ctx->
pic_conf
.
tile_height
= avctx->
height
;
644
ctx->
pic_conf
.
luma_bands
= ctx->
pic_conf
.
chroma_bands
= 1;
645
646
result =
ff_ivi_init_planes
(ctx->
planes
, &ctx->
pic_conf
);
647
if
(result) {
648
av_log
(avctx,
AV_LOG_ERROR
,
"Couldn't allocate color planes!\n"
);
649
return
-1;
650
}
651
652
ctx->
buf_switch
= 0;
653
ctx->
inter_scal
= 0;
654
655
ctx->
decode_pic_hdr
=
decode_pic_hdr
;
656
ctx->
decode_band_hdr
=
decode_band_hdr
;
657
ctx->
decode_mb_info
=
decode_mb_info
;
658
ctx->
switch_buffers
=
switch_buffers
;
659
ctx->
is_nonnull_frame
=
is_nonnull_frame
;
660
661
avctx->
pix_fmt
=
AV_PIX_FMT_YUV410P
;
662
663
return
0;
664
}
665
666
AVCodec
ff_indeo5_decoder
= {
667
.
name
=
"indeo5"
,
668
.type =
AVMEDIA_TYPE_VIDEO
,
669
.id =
AV_CODEC_ID_INDEO5
,
670
.priv_data_size =
sizeof
(
IVI45DecContext
),
671
.
init
=
decode_init
,
672
.
close
=
ff_ivi_decode_close
,
673
.
decode
=
ff_ivi_decode_frame
,
674
.long_name =
NULL_IF_CONFIG_SMALL
(
"Intel Indeo Video Interactive 5"
),
675
.capabilities =
CODEC_CAP_DR1
,
676
};
Generated on Wed Jul 10 2013 23:47:59 for FFmpeg by
1.8.2