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
AVERROR_INVALIDDATA
;
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
AVERROR_INVALIDDATA
;
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
avpriv_report_missing_feature
(avctx,
"YV12 picture format"
);
102
return
AVERROR_PATCHWELCOME
;
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
) || ctx->
gop_invalid
) {
117
result =
ff_ivi_init_planes
(ctx->
planes
, &pic_conf);
118
if
(result < 0) {
119
av_log
(avctx,
AV_LOG_ERROR
,
"Couldn't reallocate color planes!\n"
);
120
return
result;
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
avpriv_report_missing_feature
(avctx,
"Extended transform info"
);
150
return
AVERROR_PATCHWELCOME
;
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
if
(band->
transform_size
!= band->
blk_size
) {
195
av_log
(avctx,
AV_LOG_ERROR
,
"transform and block size mismatch (%d != %d)\n"
, band->
transform_size
, band->
blk_size
);
196
return
AVERROR_INVALIDDATA
;
197
}
198
199
/* select dequant matrix according to plane and band number */
200
if
(!p) {
201
quant_mat = (pic_conf.
luma_bands
> 1) ? i+1 : 0;
202
}
else
{
203
quant_mat = 5;
204
}
205
206
if
(band->
blk_size
== 8) {
207
if
(quant_mat >= 5){
208
av_log
(avctx,
AV_LOG_ERROR
,
"quant_mat %d too large!\n"
, quant_mat);
209
return
-1;
210
}
211
band->
intra_base
= &
ivi5_base_quant_8x8_intra
[quant_mat][0];
212
band->
inter_base
= &
ivi5_base_quant_8x8_inter
[quant_mat][0];
213
band->
intra_scale
= &
ivi5_scale_quant_8x8_intra
[quant_mat][0];
214
band->
inter_scale
= &
ivi5_scale_quant_8x8_inter
[quant_mat][0];
215
}
else
{
216
band->
intra_base
=
ivi5_base_quant_4x4_intra
;
217
band->
inter_base
=
ivi5_base_quant_4x4_inter
;
218
band->
intra_scale
=
ivi5_scale_quant_4x4_intra
;
219
band->
inter_scale
=
ivi5_scale_quant_4x4_inter
;
220
}
221
222
if
(
get_bits
(&ctx->
gb
, 2)) {
223
av_log
(avctx,
AV_LOG_ERROR
,
"End marker missing!\n"
);
224
return
AVERROR_INVALIDDATA
;
225
}
226
}
227
}
228
229
/* copy chroma parameters into the 2nd chroma plane */
230
for
(i = 0; i < pic_conf.
chroma_bands
; i++) {
231
band1 = &ctx->
planes
[1].
bands
[i];
232
band2 = &ctx->
planes
[2].
bands
[i];
233
234
band2->
width
= band1->
width
;
235
band2->
height
= band1->
height
;
236
band2->
mb_size
= band1->
mb_size
;
237
band2->
blk_size
= band1->
blk_size
;
238
band2->
is_halfpel
= band1->
is_halfpel
;
239
band2->
intra_base
= band1->
intra_base
;
240
band2->
inter_base
= band1->
inter_base
;
241
band2->
intra_scale
= band1->
intra_scale
;
242
band2->
inter_scale
= band1->
inter_scale
;
243
band2->
scan
= band1->
scan
;
244
band2->
inv_transform
= band1->
inv_transform
;
245
band2->
dc_transform
= band1->
dc_transform
;
246
band2->
is_2d_trans
= band1->
is_2d_trans
;
247
band2->
transform_size
= band1->
transform_size
;
248
}
249
250
/* reallocate internal structures if needed */
251
if
(blk_size_changed) {
252
result =
ff_ivi_init_tiles
(ctx->
planes
, pic_conf.
tile_width
,
253
pic_conf.
tile_height
);
254
if
(result < 0) {
255
av_log
(avctx,
AV_LOG_ERROR
,
256
"Couldn't reallocate internal structures!\n"
);
257
return
result;
258
}
259
}
260
261
if
(ctx->
gop_flags
& 8) {
262
if
(
get_bits
(&ctx->
gb
, 3)) {
263
av_log
(avctx,
AV_LOG_ERROR
,
"Alignment bits are not zero!\n"
);
264
return
AVERROR_INVALIDDATA
;
265
}
266
267
if
(
get_bits1
(&ctx->
gb
))
268
skip_bits_long
(&ctx->
gb
, 24);
/* skip transparency fill color */
269
}
270
271
align_get_bits
(&ctx->
gb
);
272
273
skip_bits
(&ctx->
gb
, 23);
/* FIXME: unknown meaning */
274
275
/* skip GOP extension if any */
276
if
(
get_bits1
(&ctx->
gb
)) {
277
do
{
278
i =
get_bits
(&ctx->
gb
, 16);
279
}
while
(i & 0x8000);
280
}
281
282
align_get_bits
(&ctx->
gb
);
283
284
return
0;
285
}
286
287
288
/**
289
* Skip a header extension.
290
*
291
* @param[in,out] gb the GetBit context
292
*/
293
static
inline
void
skip_hdr_extension
(
GetBitContext
*gb)
294
{
295
int
i,
len
;
296
297
do
{
298
len =
get_bits
(gb, 8);
299
for
(i = 0; i <
len
; i++)
skip_bits
(gb, 8);
300
}
while
(len);
301
}
302
303
304
/**
305
* Decode Indeo5 picture header.
306
*
307
* @param[in,out] ctx ptr to the decoder context
308
* @param[in] avctx ptr to the AVCodecContext
309
* @return result code: 0 = OK, -1 = error
310
*/
311
static
int
decode_pic_hdr
(
IVI45DecContext
*ctx,
AVCodecContext
*avctx)
312
{
313
int
ret
;
314
315
if
(
get_bits
(&ctx->
gb
, 5) != 0x1F) {
316
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid picture start code!\n"
);
317
return
AVERROR_INVALIDDATA
;
318
}
319
320
ctx->
prev_frame_type
= ctx->
frame_type
;
321
ctx->
frame_type
=
get_bits
(&ctx->
gb
, 3);
322
if
(ctx->
frame_type
>= 5) {
323
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid frame type: %d \n"
, ctx->
frame_type
);
324
return
AVERROR_INVALIDDATA
;
325
}
326
327
ctx->
frame_num
=
get_bits
(&ctx->
gb
, 8);
328
329
if
(ctx->
frame_type
==
FRAMETYPE_INTRA
) {
330
if
((ret =
decode_gop_header
(ctx, avctx)) < 0) {
331
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid GOP header, skipping frames.\n"
);
332
ctx->
gop_invalid
= 1;
333
return
ret
;
334
}
335
ctx->
gop_invalid
= 0;
336
}
337
338
if
(ctx->
frame_type
==
FRAMETYPE_INTER_SCAL
&& !ctx->
is_scalable
) {
339
av_log
(avctx,
AV_LOG_ERROR
,
"Scalable inter frame in non scaleable stream\n"
);
340
ctx->
frame_type
=
FRAMETYPE_INTER
;
341
return
AVERROR_INVALIDDATA
;
342
}
343
344
if
(ctx->
frame_type
!=
FRAMETYPE_NULL
) {
345
ctx->
frame_flags
=
get_bits
(&ctx->
gb
, 8);
346
347
ctx->
pic_hdr_size
= (ctx->
frame_flags
& 1) ?
get_bits_long
(&ctx->
gb
, 24) : 0;
348
349
ctx->
checksum
= (ctx->
frame_flags
& 0x10) ?
get_bits
(&ctx->
gb
, 16) : 0;
350
351
/* skip unknown extension if any */
352
if
(ctx->
frame_flags
& 0x20)
353
skip_hdr_extension
(&ctx->
gb
);
/* XXX: untested */
354
355
/* decode macroblock huffman codebook */
356
ret =
ff_ivi_dec_huff_desc
(&ctx->
gb
, ctx->
frame_flags
& 0x40,
357
IVI_MB_HUFF
, &ctx->
mb_vlc
, avctx);
358
if
(ret < 0)
359
return
ret
;
360
361
skip_bits
(&ctx->
gb
, 3);
/* FIXME: unknown meaning! */
362
}
363
364
align_get_bits
(&ctx->
gb
);
365
366
return
0;
367
}
368
369
370
/**
371
* Decode Indeo5 band header.
372
*
373
* @param[in,out] ctx ptr to the decoder context
374
* @param[in,out] band ptr to the band descriptor
375
* @param[in] avctx ptr to the AVCodecContext
376
* @return result code: 0 = OK, -1 = error
377
*/
378
static
int
decode_band_hdr
(
IVI45DecContext
*ctx,
IVIBandDesc
*
band
,
379
AVCodecContext
*avctx)
380
{
381
int
i,
ret
;
382
uint8_t
band_flags;
383
384
band_flags =
get_bits
(&ctx->
gb
, 8);
385
386
if
(band_flags & 1) {
387
band->
is_empty
= 1;
388
return
0;
389
}
390
391
band->
data_size
= (ctx->
frame_flags
& 0x80) ?
get_bits_long
(&ctx->
gb
, 24) : 0;
392
393
band->
inherit_mv
= band_flags & 2;
394
band->
inherit_qdelta
= band_flags & 8;
395
band->
qdelta_present
= band_flags & 4;
396
if
(!band->
qdelta_present
) band->
inherit_qdelta
= 1;
397
398
/* decode rvmap probability corrections if any */
399
band->
num_corr
= 0;
/* there are no corrections */
400
if
(band_flags & 0x10) {
401
band->
num_corr
=
get_bits
(&ctx->
gb
, 8);
/* get number of correction pairs */
402
if
(band->
num_corr
> 61) {
403
av_log
(avctx,
AV_LOG_ERROR
,
"Too many corrections: %d\n"
,
404
band->
num_corr
);
405
return
AVERROR_INVALIDDATA
;
406
}
407
408
/* read correction pairs */
409
for
(i = 0; i < band->
num_corr
* 2; i++)
410
band->
corr
[i] =
get_bits
(&ctx->
gb
, 8);
411
}
412
413
/* select appropriate rvmap table for this band */
414
band->
rvmap_sel
= (band_flags & 0x40) ?
get_bits
(&ctx->
gb
, 3) : 8;
415
416
/* decode block huffman codebook */
417
ret =
ff_ivi_dec_huff_desc
(&ctx->
gb
, band_flags & 0x80,
IVI_BLK_HUFF
,
418
&band->
blk_vlc
, avctx);
419
if
(ret < 0)
420
return
ret
;
421
422
band->
checksum_present
=
get_bits1
(&ctx->
gb
);
423
if
(band->
checksum_present
)
424
band->
checksum
=
get_bits
(&ctx->
gb
, 16);
425
426
band->
glob_quant
=
get_bits
(&ctx->
gb
, 5);
427
428
/* skip unknown extension if any */
429
if
(band_flags & 0x20) {
/* XXX: untested */
430
align_get_bits
(&ctx->
gb
);
431
skip_hdr_extension
(&ctx->
gb
);
432
}
433
434
align_get_bits
(&ctx->
gb
);
435
436
return
0;
437
}
438
439
440
/**
441
* Decode info (block type, cbp, quant delta, motion vector)
442
* for all macroblocks in the current tile.
443
*
444
* @param[in,out] ctx ptr to the decoder context
445
* @param[in,out] band ptr to the band descriptor
446
* @param[in,out] tile ptr to the tile descriptor
447
* @param[in] avctx ptr to the AVCodecContext
448
* @return result code: 0 = OK, -1 = error
449
*/
450
static
int
decode_mb_info
(
IVI45DecContext
*ctx,
IVIBandDesc
*
band
,
451
IVITile
*tile,
AVCodecContext
*avctx)
452
{
453
int
x,
y
, mv_x, mv_y, mv_delta, offs, mb_offset,
454
mv_scale
, blks_per_mb,
s
;
455
IVIMbInfo
*
mb
, *ref_mb;
456
int
row_offset = band->
mb_size
* band->
pitch
;
457
458
mb = tile->
mbs
;
459
ref_mb = tile->
ref_mbs
;
460
offs = tile->
ypos
* band->
pitch
+ tile->
xpos
;
461
462
if
(!ref_mb &&
463
((band->
qdelta_present
&& band->
inherit_qdelta
) || band->
inherit_mv
))
464
return
AVERROR_INVALIDDATA
;
465
466
if
(tile->
num_MBs
!=
IVI_MBs_PER_TILE
(tile->
width
, tile->
height
, band->
mb_size
)) {
467
av_log
(avctx,
AV_LOG_ERROR
,
"Allocated tile size %d mismatches parameters %d\n"
,
468
tile->
num_MBs
,
IVI_MBs_PER_TILE
(tile->
width
, tile->
height
, band->
mb_size
));
469
return
AVERROR_INVALIDDATA
;
470
}
471
472
/* scale factor for motion vectors */
473
mv_scale = (ctx->
planes
[0].
bands
[0].
mb_size
>> 3) - (band->
mb_size
>> 3);
474
mv_x = mv_y = 0;
475
476
for
(y = tile->
ypos
; y < (tile->
ypos
+ tile->
height
); y += band->
mb_size
) {
477
mb_offset = offs;
478
479
for
(x = tile->
xpos
; x < (tile->
xpos
+ tile->
width
); x += band->
mb_size
) {
480
mb->
xpos
= x;
481
mb->
ypos
=
y
;
482
mb->
buf_offs
= mb_offset;
483
484
if
(
get_bits1
(&ctx->
gb
)) {
485
if
(ctx->
frame_type
==
FRAMETYPE_INTRA
) {
486
av_log
(avctx,
AV_LOG_ERROR
,
"Empty macroblock in an INTRA picture!\n"
);
487
return
AVERROR_INVALIDDATA
;
488
}
489
mb->
type
= 1;
/* empty macroblocks are always INTER */
490
mb->
cbp
= 0;
/* all blocks are empty */
491
492
mb->
q_delta
= 0;
493
if
(!band->
plane
&& !band->
band_num
&& (ctx->
frame_flags
& 8)) {
494
mb->
q_delta
=
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
495
IVI_VLC_BITS
, 1);
496
mb->
q_delta
=
IVI_TOSIGNED
(mb->
q_delta
);
497
}
498
499
mb->
mv_x
= mb->
mv_y
= 0;
/* no motion vector coded */
500
if
(band->
inherit_mv
&& ref_mb){
501
/* motion vector inheritance */
502
if
(mv_scale) {
503
mb->
mv_x
=
ivi_scale_mv
(ref_mb->
mv_x
, mv_scale);
504
mb->
mv_y
=
ivi_scale_mv
(ref_mb->
mv_y
, mv_scale);
505
}
else
{
506
mb->
mv_x
= ref_mb->
mv_x
;
507
mb->
mv_y
= ref_mb->
mv_y
;
508
}
509
}
510
}
else
{
511
if
(band->
inherit_mv
&& ref_mb) {
512
mb->
type
= ref_mb->
type
;
/* copy mb_type from corresponding reference mb */
513
}
else
if
(ctx->
frame_type
==
FRAMETYPE_INTRA
) {
514
mb->
type
= 0;
/* mb_type is always INTRA for intra-frames */
515
}
else
{
516
mb->
type
=
get_bits1
(&ctx->
gb
);
517
}
518
519
blks_per_mb = band->
mb_size
!= band->
blk_size
? 4 : 1;
520
mb->
cbp
=
get_bits
(&ctx->
gb
, blks_per_mb);
521
522
mb->
q_delta
= 0;
523
if
(band->
qdelta_present
) {
524
if
(band->
inherit_qdelta
) {
525
if
(ref_mb) mb->
q_delta
= ref_mb->
q_delta
;
526
}
else
if
(mb->
cbp
|| (!band->
plane
&& !band->
band_num
&&
527
(ctx->
frame_flags
& 8))) {
528
mb->
q_delta
=
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
529
IVI_VLC_BITS
, 1);
530
mb->
q_delta
=
IVI_TOSIGNED
(mb->
q_delta
);
531
}
532
}
533
534
if
(!mb->
type
) {
535
mb->
mv_x
= mb->
mv_y
= 0;
/* there is no motion vector in intra-macroblocks */
536
}
else
{
537
if
(band->
inherit_mv
&& ref_mb){
538
/* motion vector inheritance */
539
if
(mv_scale) {
540
mb->
mv_x
=
ivi_scale_mv
(ref_mb->
mv_x
, mv_scale);
541
mb->
mv_y
=
ivi_scale_mv
(ref_mb->
mv_y
, mv_scale);
542
}
else
{
543
mb->
mv_x
= ref_mb->
mv_x
;
544
mb->
mv_y
= ref_mb->
mv_y
;
545
}
546
}
else
{
547
/* decode motion vector deltas */
548
mv_delta =
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
549
IVI_VLC_BITS
, 1);
550
mv_y +=
IVI_TOSIGNED
(mv_delta);
551
mv_delta =
get_vlc2
(&ctx->
gb
, ctx->
mb_vlc
.
tab
->
table
,
552
IVI_VLC_BITS
, 1);
553
mv_x +=
IVI_TOSIGNED
(mv_delta);
554
mb->
mv_x
= mv_x;
555
mb->
mv_y
= mv_y;
556
}
557
}
558
}
559
560
s= band->
is_halfpel
;
561
if
(mb->
type
)
562
if
( x + (mb->
mv_x
>>s) + (y+ (mb->
mv_y
>>s))*band->
pitch
< 0 ||
563
x + ((mb->
mv_x
+s)>>s) + band->
mb_size
- 1
564
+ (y+band->
mb_size
- 1 +((mb->
mv_y
+s)>>s))*band->
pitch
> band->
bufsize
- 1) {
565
av_log
(avctx,
AV_LOG_ERROR
,
"motion vector %d %d outside reference\n"
, x*s + mb->
mv_x
, y*s + mb->
mv_y
);
566
return
AVERROR_INVALIDDATA
;
567
}
568
569
mb++;
570
if
(ref_mb)
571
ref_mb++;
572
mb_offset += band->
mb_size
;
573
}
574
575
offs += row_offset;
576
}
577
578
align_get_bits
(&ctx->
gb
);
579
580
return
0;
581
}
582
583
584
/**
585
* Switch buffers.
586
*
587
* @param[in,out] ctx ptr to the decoder context
588
*/
589
static
void
switch_buffers
(
IVI45DecContext
*ctx)
590
{
591
switch
(ctx->
prev_frame_type
) {
592
case
FRAMETYPE_INTRA
:
593
case
FRAMETYPE_INTER
:
594
ctx->
buf_switch
^= 1;
595
ctx->
dst_buf
= ctx->
buf_switch
;
596
ctx->
ref_buf
= ctx->
buf_switch
^ 1;
597
break
;
598
case
FRAMETYPE_INTER_SCAL
:
599
if
(!ctx->
inter_scal
) {
600
ctx->
ref2_buf
= 2;
601
ctx->
inter_scal
= 1;
602
}
603
FFSWAP
(
int
, ctx->
dst_buf
, ctx->
ref2_buf
);
604
ctx->
ref_buf
= ctx->
ref2_buf
;
605
break
;
606
case
FRAMETYPE_INTER_NOREF
:
607
break
;
608
}
609
610
switch
(ctx->
frame_type
) {
611
case
FRAMETYPE_INTRA
:
612
ctx->
buf_switch
= 0;
613
/* FALLTHROUGH */
614
case
FRAMETYPE_INTER
:
615
ctx->
inter_scal
= 0;
616
ctx->
dst_buf
= ctx->
buf_switch
;
617
ctx->
ref_buf
= ctx->
buf_switch
^ 1;
618
break
;
619
case
FRAMETYPE_INTER_SCAL
:
620
case
FRAMETYPE_INTER_NOREF
:
621
case
FRAMETYPE_NULL
:
622
break
;
623
}
624
}
625
626
627
static
int
is_nonnull_frame
(
IVI45DecContext
*ctx)
628
{
629
return
ctx->
frame_type
!=
FRAMETYPE_NULL
;
630
}
631
632
633
/**
634
* Initialize Indeo5 decoder.
635
*/
636
static
av_cold
int
decode_init
(
AVCodecContext
*avctx)
637
{
638
IVI45DecContext
*ctx = avctx->
priv_data
;
639
int
result;
640
641
ff_ivi_init_static_vlc
();
642
643
/* copy rvmap tables in our context so we can apply changes to them */
644
memcpy(ctx->
rvmap_tabs
,
ff_ivi_rvmap_tabs
,
sizeof
(
ff_ivi_rvmap_tabs
));
645
646
/* set the initial picture layout according to the basic profile:
647
there is only one band per plane (no scalability), only one tile (no local decoding)
648
and picture format = YVU9 */
649
ctx->
pic_conf
.
pic_width
= avctx->
width
;
650
ctx->
pic_conf
.
pic_height
= avctx->
height
;
651
ctx->
pic_conf
.
chroma_width
= (avctx->
width
+ 3) >> 2;
652
ctx->
pic_conf
.
chroma_height
= (avctx->
height
+ 3) >> 2;
653
ctx->
pic_conf
.
tile_width
= avctx->
width
;
654
ctx->
pic_conf
.
tile_height
= avctx->
height
;
655
ctx->
pic_conf
.
luma_bands
= ctx->
pic_conf
.
chroma_bands
= 1;
656
657
result =
ff_ivi_init_planes
(ctx->
planes
, &ctx->
pic_conf
);
658
if
(result) {
659
av_log
(avctx,
AV_LOG_ERROR
,
"Couldn't allocate color planes!\n"
);
660
return
AVERROR_INVALIDDATA
;
661
}
662
663
ctx->
buf_switch
= 0;
664
ctx->
inter_scal
= 0;
665
666
ctx->
decode_pic_hdr
=
decode_pic_hdr
;
667
ctx->
decode_band_hdr
=
decode_band_hdr
;
668
ctx->
decode_mb_info
=
decode_mb_info
;
669
ctx->
switch_buffers
=
switch_buffers
;
670
ctx->
is_nonnull_frame
=
is_nonnull_frame
;
671
672
avctx->
pix_fmt
=
AV_PIX_FMT_YUV410P
;
673
674
return
0;
675
}
676
677
AVCodec
ff_indeo5_decoder
= {
678
.
name
=
"indeo5"
,
679
.long_name =
NULL_IF_CONFIG_SMALL
(
"Intel Indeo Video Interactive 5"
),
680
.type =
AVMEDIA_TYPE_VIDEO
,
681
.id =
AV_CODEC_ID_INDEO5
,
682
.priv_data_size =
sizeof
(
IVI45DecContext
),
683
.
init
=
decode_init
,
684
.
close
=
ff_ivi_decode_close
,
685
.
decode
=
ff_ivi_decode_frame
,
686
.capabilities =
CODEC_CAP_DR1
,
687
};
Generated on Sat Jan 25 2014 19:51:49 for FFmpeg by
1.8.2