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