00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00030 #define BITSTREAM_READER_LE
00031 #include "avcodec.h"
00032 #include "get_bits.h"
00033 #include "dsputil.h"
00034 #include "ivi_dsp.h"
00035 #include "ivi_common.h"
00036 #include "indeo5data.h"
00037
00041 enum {
00042 FRAMETYPE_INTRA = 0,
00043 FRAMETYPE_INTER = 1,
00044 FRAMETYPE_INTER_SCAL = 2,
00045 FRAMETYPE_INTER_NOREF = 3,
00046 FRAMETYPE_NULL = 4
00047 };
00048
00049 #define IVI5_PIC_SIZE_ESC 15
00050
00060 static int decode_gop_header(IVI45DecContext *ctx, AVCodecContext *avctx)
00061 {
00062 int result, i, p, tile_size, pic_size_indx, mb_size, blk_size, is_scalable;
00063 int quant_mat, blk_size_changed = 0;
00064 IVIBandDesc *band, *band1, *band2;
00065 IVIPicConfig pic_conf;
00066
00067 ctx->gop_flags = get_bits(&ctx->gb, 8);
00068
00069 ctx->gop_hdr_size = (ctx->gop_flags & 1) ? get_bits(&ctx->gb, 16) : 0;
00070
00071 if (ctx->gop_flags & IVI5_IS_PROTECTED)
00072 ctx->lock_word = get_bits_long(&ctx->gb, 32);
00073
00074 tile_size = (ctx->gop_flags & 0x40) ? 64 << get_bits(&ctx->gb, 2) : 0;
00075 if (tile_size > 256) {
00076 av_log(avctx, AV_LOG_ERROR, "Invalid tile size: %d\n", tile_size);
00077 return -1;
00078 }
00079
00080
00081
00082 pic_conf.luma_bands = get_bits(&ctx->gb, 2) * 3 + 1;
00083 pic_conf.chroma_bands = get_bits1(&ctx->gb) * 3 + 1;
00084 is_scalable = pic_conf.luma_bands != 1 || pic_conf.chroma_bands != 1;
00085 if (is_scalable && (pic_conf.luma_bands != 4 || pic_conf.chroma_bands != 1)) {
00086 av_log(avctx, AV_LOG_ERROR, "Scalability: unsupported subdivision! Luma bands: %d, chroma bands: %d\n",
00087 pic_conf.luma_bands, pic_conf.chroma_bands);
00088 return -1;
00089 }
00090
00091 pic_size_indx = get_bits(&ctx->gb, 4);
00092 if (pic_size_indx == IVI5_PIC_SIZE_ESC) {
00093 pic_conf.pic_height = get_bits(&ctx->gb, 13);
00094 pic_conf.pic_width = get_bits(&ctx->gb, 13);
00095 } else {
00096 pic_conf.pic_height = ivi5_common_pic_sizes[pic_size_indx * 2 + 1] << 2;
00097 pic_conf.pic_width = ivi5_common_pic_sizes[pic_size_indx * 2 ] << 2;
00098 }
00099
00100 if (ctx->gop_flags & 2) {
00101 av_log(avctx, AV_LOG_ERROR, "YV12 picture format not supported!\n");
00102 return -1;
00103 }
00104
00105 pic_conf.chroma_height = (pic_conf.pic_height + 3) >> 2;
00106 pic_conf.chroma_width = (pic_conf.pic_width + 3) >> 2;
00107
00108 if (!tile_size) {
00109 pic_conf.tile_height = pic_conf.pic_height;
00110 pic_conf.tile_width = pic_conf.pic_width;
00111 } else {
00112 pic_conf.tile_height = pic_conf.tile_width = tile_size;
00113 }
00114
00115
00116 if (ivi_pic_config_cmp(&pic_conf, &ctx->pic_conf)) {
00117 result = ff_ivi_init_planes(ctx->planes, &pic_conf);
00118 if (result) {
00119 av_log(avctx, AV_LOG_ERROR, "Couldn't reallocate color planes!\n");
00120 return -1;
00121 }
00122 ctx->pic_conf = pic_conf;
00123 ctx->is_scalable = is_scalable;
00124 blk_size_changed = 1;
00125 }
00126
00127 for (p = 0; p <= 1; p++) {
00128 for (i = 0; i < (!p ? pic_conf.luma_bands : pic_conf.chroma_bands); i++) {
00129 band = &ctx->planes[p].bands[i];
00130
00131 band->is_halfpel = get_bits1(&ctx->gb);
00132
00133 mb_size = get_bits1(&ctx->gb);
00134 blk_size = 8 >> get_bits1(&ctx->gb);
00135 mb_size = blk_size << !mb_size;
00136
00137 if (p==0 && blk_size==4) {
00138 av_log(avctx, AV_LOG_ERROR, "4x4 luma blocks are unsupported!\n");
00139 return AVERROR_PATCHWELCOME;
00140 }
00141
00142 blk_size_changed = mb_size != band->mb_size || blk_size != band->blk_size;
00143 if (blk_size_changed) {
00144 band->mb_size = mb_size;
00145 band->blk_size = blk_size;
00146 }
00147
00148 if (get_bits1(&ctx->gb)) {
00149 av_log(avctx, AV_LOG_ERROR, "Extended transform info encountered!\n");
00150 return -1;
00151 }
00152
00153
00154 switch ((p << 2) + i) {
00155 case 0:
00156 band->inv_transform = ff_ivi_inverse_slant_8x8;
00157 band->dc_transform = ff_ivi_dc_slant_2d;
00158 band->scan = ff_zigzag_direct;
00159 band->transform_size= 8;
00160 break;
00161
00162 case 1:
00163 band->inv_transform = ff_ivi_row_slant8;
00164 band->dc_transform = ff_ivi_dc_row_slant;
00165 band->scan = ff_ivi_vertical_scan_8x8;
00166 band->transform_size= 8;
00167 break;
00168
00169 case 2:
00170 band->inv_transform = ff_ivi_col_slant8;
00171 band->dc_transform = ff_ivi_dc_col_slant;
00172 band->scan = ff_ivi_horizontal_scan_8x8;
00173 band->transform_size= 8;
00174 break;
00175
00176 case 3:
00177 band->inv_transform = ff_ivi_put_pixels_8x8;
00178 band->dc_transform = ff_ivi_put_dc_pixel_8x8;
00179 band->scan = ff_ivi_horizontal_scan_8x8;
00180 band->transform_size= 8;
00181 break;
00182
00183 case 4:
00184 band->inv_transform = ff_ivi_inverse_slant_4x4;
00185 band->dc_transform = ff_ivi_dc_slant_2d;
00186 band->scan = ff_ivi_direct_scan_4x4;
00187 band->transform_size= 4;
00188 break;
00189 }
00190
00191 band->is_2d_trans = band->inv_transform == ff_ivi_inverse_slant_8x8 ||
00192 band->inv_transform == ff_ivi_inverse_slant_4x4;
00193
00194
00195 if (!p) {
00196 quant_mat = (pic_conf.luma_bands > 1) ? i+1 : 0;
00197 } else {
00198 quant_mat = 5;
00199 }
00200
00201 if (band->blk_size == 8) {
00202 if(quant_mat >= 5){
00203 av_log(avctx, AV_LOG_ERROR, "quant_mat %d too large!\n", quant_mat);
00204 return -1;
00205 }
00206 band->intra_base = &ivi5_base_quant_8x8_intra[quant_mat][0];
00207 band->inter_base = &ivi5_base_quant_8x8_inter[quant_mat][0];
00208 band->intra_scale = &ivi5_scale_quant_8x8_intra[quant_mat][0];
00209 band->inter_scale = &ivi5_scale_quant_8x8_inter[quant_mat][0];
00210 } else {
00211 band->intra_base = ivi5_base_quant_4x4_intra;
00212 band->inter_base = ivi5_base_quant_4x4_inter;
00213 band->intra_scale = ivi5_scale_quant_4x4_intra;
00214 band->inter_scale = ivi5_scale_quant_4x4_inter;
00215 }
00216
00217 if (get_bits(&ctx->gb, 2)) {
00218 av_log(avctx, AV_LOG_ERROR, "End marker missing!\n");
00219 return -1;
00220 }
00221 }
00222 }
00223
00224
00225 for (i = 0; i < pic_conf.chroma_bands; i++) {
00226 band1 = &ctx->planes[1].bands[i];
00227 band2 = &ctx->planes[2].bands[i];
00228
00229 band2->width = band1->width;
00230 band2->height = band1->height;
00231 band2->mb_size = band1->mb_size;
00232 band2->blk_size = band1->blk_size;
00233 band2->is_halfpel = band1->is_halfpel;
00234 band2->intra_base = band1->intra_base;
00235 band2->inter_base = band1->inter_base;
00236 band2->intra_scale = band1->intra_scale;
00237 band2->inter_scale = band1->inter_scale;
00238 band2->scan = band1->scan;
00239 band2->inv_transform = band1->inv_transform;
00240 band2->dc_transform = band1->dc_transform;
00241 band2->is_2d_trans = band1->is_2d_trans;
00242 band2->transform_size= band1->transform_size;
00243 }
00244
00245
00246 if (blk_size_changed) {
00247 result = ff_ivi_init_tiles(ctx->planes, pic_conf.tile_width,
00248 pic_conf.tile_height);
00249 if (result) {
00250 av_log(avctx, AV_LOG_ERROR,
00251 "Couldn't reallocate internal structures!\n");
00252 return -1;
00253 }
00254 }
00255
00256 if (ctx->gop_flags & 8) {
00257 if (get_bits(&ctx->gb, 3)) {
00258 av_log(avctx, AV_LOG_ERROR, "Alignment bits are not zero!\n");
00259 return -1;
00260 }
00261
00262 if (get_bits1(&ctx->gb))
00263 skip_bits_long(&ctx->gb, 24);
00264 }
00265
00266 align_get_bits(&ctx->gb);
00267
00268 skip_bits(&ctx->gb, 23);
00269
00270
00271 if (get_bits1(&ctx->gb)) {
00272 do {
00273 i = get_bits(&ctx->gb, 16);
00274 } while (i & 0x8000);
00275 }
00276
00277 align_get_bits(&ctx->gb);
00278
00279 return 0;
00280 }
00281
00282
00288 static inline void skip_hdr_extension(GetBitContext *gb)
00289 {
00290 int i, len;
00291
00292 do {
00293 len = get_bits(gb, 8);
00294 for (i = 0; i < len; i++) skip_bits(gb, 8);
00295 } while(len);
00296 }
00297
00298
00306 static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx)
00307 {
00308 if (get_bits(&ctx->gb, 5) != 0x1F) {
00309 av_log(avctx, AV_LOG_ERROR, "Invalid picture start code!\n");
00310 return -1;
00311 }
00312
00313 ctx->prev_frame_type = ctx->frame_type;
00314 ctx->frame_type = get_bits(&ctx->gb, 3);
00315 if (ctx->frame_type >= 5) {
00316 av_log(avctx, AV_LOG_ERROR, "Invalid frame type: %d \n", ctx->frame_type);
00317 return -1;
00318 }
00319
00320 ctx->frame_num = get_bits(&ctx->gb, 8);
00321
00322 if (ctx->frame_type == FRAMETYPE_INTRA) {
00323 ctx->gop_invalid = 1;
00324 if (decode_gop_header(ctx, avctx)) {
00325 av_log(avctx, AV_LOG_ERROR, "Invalid GOP header, skipping frames.\n");
00326 return AVERROR_INVALIDDATA;
00327 }
00328 ctx->gop_invalid = 0;
00329 }
00330
00331 if (ctx->frame_type == FRAMETYPE_INTER_SCAL && !ctx->is_scalable) {
00332 av_log(avctx, AV_LOG_ERROR, "Scalable inter frame in non scaleable stream\n");
00333 ctx->frame_type = FRAMETYPE_INTER;
00334 return AVERROR_INVALIDDATA;
00335 }
00336
00337 if (ctx->frame_type != FRAMETYPE_NULL) {
00338 ctx->frame_flags = get_bits(&ctx->gb, 8);
00339
00340 ctx->pic_hdr_size = (ctx->frame_flags & 1) ? get_bits_long(&ctx->gb, 24) : 0;
00341
00342 ctx->checksum = (ctx->frame_flags & 0x10) ? get_bits(&ctx->gb, 16) : 0;
00343
00344
00345 if (ctx->frame_flags & 0x20)
00346 skip_hdr_extension(&ctx->gb);
00347
00348
00349 if (ff_ivi_dec_huff_desc(&ctx->gb, ctx->frame_flags & 0x40, IVI_MB_HUFF, &ctx->mb_vlc, avctx))
00350 return -1;
00351
00352 skip_bits(&ctx->gb, 3);
00353 }
00354
00355 align_get_bits(&ctx->gb);
00356
00357 return 0;
00358 }
00359
00360
00369 static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band,
00370 AVCodecContext *avctx)
00371 {
00372 int i;
00373 uint8_t band_flags;
00374
00375 band_flags = get_bits(&ctx->gb, 8);
00376
00377 if (band_flags & 1) {
00378 band->is_empty = 1;
00379 return 0;
00380 }
00381
00382 band->data_size = (ctx->frame_flags & 0x80) ? get_bits_long(&ctx->gb, 24) : 0;
00383
00384 band->inherit_mv = band_flags & 2;
00385 band->inherit_qdelta = band_flags & 8;
00386 band->qdelta_present = band_flags & 4;
00387 if (!band->qdelta_present) band->inherit_qdelta = 1;
00388
00389
00390 band->num_corr = 0;
00391 if (band_flags & 0x10) {
00392 band->num_corr = get_bits(&ctx->gb, 8);
00393 if (band->num_corr > 61) {
00394 av_log(avctx, AV_LOG_ERROR, "Too many corrections: %d\n",
00395 band->num_corr);
00396 return -1;
00397 }
00398
00399
00400 for (i = 0; i < band->num_corr * 2; i++)
00401 band->corr[i] = get_bits(&ctx->gb, 8);
00402 }
00403
00404
00405 band->rvmap_sel = (band_flags & 0x40) ? get_bits(&ctx->gb, 3) : 8;
00406
00407
00408 if (ff_ivi_dec_huff_desc(&ctx->gb, band_flags & 0x80, IVI_BLK_HUFF, &band->blk_vlc, avctx))
00409 return -1;
00410
00411 band->checksum_present = get_bits1(&ctx->gb);
00412 if (band->checksum_present)
00413 band->checksum = get_bits(&ctx->gb, 16);
00414
00415 band->glob_quant = get_bits(&ctx->gb, 5);
00416
00417
00418 if (band_flags & 0x20) {
00419 align_get_bits(&ctx->gb);
00420 skip_hdr_extension(&ctx->gb);
00421 }
00422
00423 align_get_bits(&ctx->gb);
00424
00425 return 0;
00426 }
00427
00428
00439 static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band,
00440 IVITile *tile, AVCodecContext *avctx)
00441 {
00442 int x, y, mv_x, mv_y, mv_delta, offs, mb_offset,
00443 mv_scale, blks_per_mb, s;
00444 IVIMbInfo *mb, *ref_mb;
00445 int row_offset = band->mb_size * band->pitch;
00446
00447 mb = tile->mbs;
00448 ref_mb = tile->ref_mbs;
00449 offs = tile->ypos * band->pitch + tile->xpos;
00450
00451 if (!ref_mb &&
00452 ((band->qdelta_present && band->inherit_qdelta) || band->inherit_mv))
00453 return AVERROR_INVALIDDATA;
00454
00455 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
00456 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches parameters %d\n",
00457 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00458 return AVERROR_INVALIDDATA;
00459 }
00460
00461
00462 mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3);
00463 mv_x = mv_y = 0;
00464
00465 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00466 mb_offset = offs;
00467
00468 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00469 mb->xpos = x;
00470 mb->ypos = y;
00471 mb->buf_offs = mb_offset;
00472
00473 if (get_bits1(&ctx->gb)) {
00474 if (ctx->frame_type == FRAMETYPE_INTRA) {
00475 av_log(avctx, AV_LOG_ERROR, "Empty macroblock in an INTRA picture!\n");
00476 return -1;
00477 }
00478 mb->type = 1;
00479 mb->cbp = 0;
00480
00481 mb->q_delta = 0;
00482 if (!band->plane && !band->band_num && (ctx->frame_flags & 8)) {
00483 mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00484 IVI_VLC_BITS, 1);
00485 mb->q_delta = IVI_TOSIGNED(mb->q_delta);
00486 }
00487
00488 mb->mv_x = mb->mv_y = 0;
00489 if (band->inherit_mv && ref_mb){
00490
00491 if (mv_scale) {
00492 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00493 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00494 } else {
00495 mb->mv_x = ref_mb->mv_x;
00496 mb->mv_y = ref_mb->mv_y;
00497 }
00498 }
00499 } else {
00500 if (band->inherit_mv && ref_mb) {
00501 mb->type = ref_mb->type;
00502 } else if (ctx->frame_type == FRAMETYPE_INTRA) {
00503 mb->type = 0;
00504 } else {
00505 mb->type = get_bits1(&ctx->gb);
00506 }
00507
00508 blks_per_mb = band->mb_size != band->blk_size ? 4 : 1;
00509 mb->cbp = get_bits(&ctx->gb, blks_per_mb);
00510
00511 mb->q_delta = 0;
00512 if (band->qdelta_present) {
00513 if (band->inherit_qdelta) {
00514 if (ref_mb) mb->q_delta = ref_mb->q_delta;
00515 } else if (mb->cbp || (!band->plane && !band->band_num &&
00516 (ctx->frame_flags & 8))) {
00517 mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00518 IVI_VLC_BITS, 1);
00519 mb->q_delta = IVI_TOSIGNED(mb->q_delta);
00520 }
00521 }
00522
00523 if (!mb->type) {
00524 mb->mv_x = mb->mv_y = 0;
00525 } else {
00526 if (band->inherit_mv && ref_mb){
00527
00528 if (mv_scale) {
00529 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00530 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00531 } else {
00532 mb->mv_x = ref_mb->mv_x;
00533 mb->mv_y = ref_mb->mv_y;
00534 }
00535 } else {
00536
00537 mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00538 IVI_VLC_BITS, 1);
00539 mv_y += IVI_TOSIGNED(mv_delta);
00540 mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00541 IVI_VLC_BITS, 1);
00542 mv_x += IVI_TOSIGNED(mv_delta);
00543 mb->mv_x = mv_x;
00544 mb->mv_y = mv_y;
00545 }
00546 }
00547 }
00548
00549 s= band->is_halfpel;
00550 if (mb->type)
00551 if ( x + (mb->mv_x >>s) + (y+ (mb->mv_y >>s))*band->pitch < 0 ||
00552 x + ((mb->mv_x+s)>>s) + band->mb_size - 1
00553 + (y+band->mb_size - 1 +((mb->mv_y+s)>>s))*band->pitch > band->bufsize - 1) {
00554 av_log(avctx, AV_LOG_ERROR, "motion vector %d %d outside reference\n", x*s + mb->mv_x, y*s + mb->mv_y);
00555 return AVERROR_INVALIDDATA;
00556 }
00557
00558 mb++;
00559 if (ref_mb)
00560 ref_mb++;
00561 mb_offset += band->mb_size;
00562 }
00563
00564 offs += row_offset;
00565 }
00566
00567 align_get_bits(&ctx->gb);
00568
00569 return 0;
00570 }
00571
00572
00578 static void switch_buffers(IVI45DecContext *ctx)
00579 {
00580 switch (ctx->prev_frame_type) {
00581 case FRAMETYPE_INTRA:
00582 case FRAMETYPE_INTER:
00583 ctx->buf_switch ^= 1;
00584 ctx->dst_buf = ctx->buf_switch;
00585 ctx->ref_buf = ctx->buf_switch ^ 1;
00586 break;
00587 case FRAMETYPE_INTER_SCAL:
00588 if (!ctx->inter_scal) {
00589 ctx->ref2_buf = 2;
00590 ctx->inter_scal = 1;
00591 }
00592 FFSWAP(int, ctx->dst_buf, ctx->ref2_buf);
00593 ctx->ref_buf = ctx->ref2_buf;
00594 break;
00595 case FRAMETYPE_INTER_NOREF:
00596 break;
00597 }
00598
00599 switch (ctx->frame_type) {
00600 case FRAMETYPE_INTRA:
00601 ctx->buf_switch = 0;
00602
00603 case FRAMETYPE_INTER:
00604 ctx->inter_scal = 0;
00605 ctx->dst_buf = ctx->buf_switch;
00606 ctx->ref_buf = ctx->buf_switch ^ 1;
00607 break;
00608 case FRAMETYPE_INTER_SCAL:
00609 case FRAMETYPE_INTER_NOREF:
00610 case FRAMETYPE_NULL:
00611 break;
00612 }
00613 }
00614
00615
00616 static int is_nonnull_frame(IVI45DecContext *ctx)
00617 {
00618 return ctx->frame_type != FRAMETYPE_NULL;
00619 }
00620
00621
00625 static av_cold int decode_init(AVCodecContext *avctx)
00626 {
00627 IVI45DecContext *ctx = avctx->priv_data;
00628 int result;
00629
00630 ff_ivi_init_static_vlc();
00631
00632
00633 memcpy(ctx->rvmap_tabs, ff_ivi_rvmap_tabs, sizeof(ff_ivi_rvmap_tabs));
00634
00635
00636
00637
00638 ctx->pic_conf.pic_width = avctx->width;
00639 ctx->pic_conf.pic_height = avctx->height;
00640 ctx->pic_conf.chroma_width = (avctx->width + 3) >> 2;
00641 ctx->pic_conf.chroma_height = (avctx->height + 3) >> 2;
00642 ctx->pic_conf.tile_width = avctx->width;
00643 ctx->pic_conf.tile_height = avctx->height;
00644 ctx->pic_conf.luma_bands = ctx->pic_conf.chroma_bands = 1;
00645
00646 avcodec_get_frame_defaults(&ctx->frame);
00647
00648 result = ff_ivi_init_planes(ctx->planes, &ctx->pic_conf);
00649 if (result) {
00650 av_log(avctx, AV_LOG_ERROR, "Couldn't allocate color planes!\n");
00651 return -1;
00652 }
00653
00654 ctx->buf_switch = 0;
00655 ctx->inter_scal = 0;
00656
00657 ctx->decode_pic_hdr = decode_pic_hdr;
00658 ctx->decode_band_hdr = decode_band_hdr;
00659 ctx->decode_mb_info = decode_mb_info;
00660 ctx->switch_buffers = switch_buffers;
00661 ctx->is_nonnull_frame = is_nonnull_frame;
00662
00663 avctx->pix_fmt = AV_PIX_FMT_YUV410P;
00664
00665 return 0;
00666 }
00667
00668 AVCodec ff_indeo5_decoder = {
00669 .name = "indeo5",
00670 .type = AVMEDIA_TYPE_VIDEO,
00671 .id = AV_CODEC_ID_INDEO5,
00672 .priv_data_size = sizeof(IVI45DecContext),
00673 .init = decode_init,
00674 .close = ff_ivi_decode_close,
00675 .decode = ff_ivi_decode_frame,
00676 .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo Video Interactive 5"),
00677 .capabilities = CODEC_CAP_DR1,
00678 };