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 band->intra_base = &ivi5_base_quant_8x8_intra[quant_mat][0];
00203 band->inter_base = &ivi5_base_quant_8x8_inter[quant_mat][0];
00204 band->intra_scale = &ivi5_scale_quant_8x8_intra[quant_mat][0];
00205 band->inter_scale = &ivi5_scale_quant_8x8_inter[quant_mat][0];
00206 } else {
00207 band->intra_base = ivi5_base_quant_4x4_intra;
00208 band->inter_base = ivi5_base_quant_4x4_inter;
00209 band->intra_scale = ivi5_scale_quant_4x4_intra;
00210 band->inter_scale = ivi5_scale_quant_4x4_inter;
00211 }
00212
00213 if (get_bits(&ctx->gb, 2)) {
00214 av_log(avctx, AV_LOG_ERROR, "End marker missing!\n");
00215 return -1;
00216 }
00217 }
00218 }
00219
00220
00221 for (i = 0; i < pic_conf.chroma_bands; i++) {
00222 band1 = &ctx->planes[1].bands[i];
00223 band2 = &ctx->planes[2].bands[i];
00224
00225 band2->width = band1->width;
00226 band2->height = band1->height;
00227 band2->mb_size = band1->mb_size;
00228 band2->blk_size = band1->blk_size;
00229 band2->is_halfpel = band1->is_halfpel;
00230 band2->intra_base = band1->intra_base;
00231 band2->inter_base = band1->inter_base;
00232 band2->intra_scale = band1->intra_scale;
00233 band2->inter_scale = band1->inter_scale;
00234 band2->scan = band1->scan;
00235 band2->inv_transform = band1->inv_transform;
00236 band2->dc_transform = band1->dc_transform;
00237 band2->is_2d_trans = band1->is_2d_trans;
00238 band2->transform_size= band1->transform_size;
00239 }
00240
00241
00242 if (blk_size_changed) {
00243 result = ff_ivi_init_tiles(ctx->planes, pic_conf.tile_width,
00244 pic_conf.tile_height);
00245 if (result) {
00246 av_log(avctx, AV_LOG_ERROR,
00247 "Couldn't reallocate internal structures!\n");
00248 return -1;
00249 }
00250 }
00251
00252 if (ctx->gop_flags & 8) {
00253 if (get_bits(&ctx->gb, 3)) {
00254 av_log(avctx, AV_LOG_ERROR, "Alignment bits are not zero!\n");
00255 return -1;
00256 }
00257
00258 if (get_bits1(&ctx->gb))
00259 skip_bits_long(&ctx->gb, 24);
00260 }
00261
00262 align_get_bits(&ctx->gb);
00263
00264 skip_bits(&ctx->gb, 23);
00265
00266
00267 if (get_bits1(&ctx->gb)) {
00268 do {
00269 i = get_bits(&ctx->gb, 16);
00270 } while (i & 0x8000);
00271 }
00272
00273 align_get_bits(&ctx->gb);
00274
00275 return 0;
00276 }
00277
00278
00284 static inline void skip_hdr_extension(GetBitContext *gb)
00285 {
00286 int i, len;
00287
00288 do {
00289 len = get_bits(gb, 8);
00290 for (i = 0; i < len; i++) skip_bits(gb, 8);
00291 } while(len);
00292 }
00293
00294
00302 static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx)
00303 {
00304 if (get_bits(&ctx->gb, 5) != 0x1F) {
00305 av_log(avctx, AV_LOG_ERROR, "Invalid picture start code!\n");
00306 return -1;
00307 }
00308
00309 ctx->prev_frame_type = ctx->frame_type;
00310 ctx->frame_type = get_bits(&ctx->gb, 3);
00311 if (ctx->frame_type >= 5) {
00312 av_log(avctx, AV_LOG_ERROR, "Invalid frame type: %d \n", ctx->frame_type);
00313 return -1;
00314 }
00315
00316 ctx->frame_num = get_bits(&ctx->gb, 8);
00317
00318 if (ctx->frame_type == FRAMETYPE_INTRA) {
00319 ctx->gop_invalid = 1;
00320 if (decode_gop_header(ctx, avctx))
00321 return -1;
00322 ctx->gop_invalid = 0;
00323 }
00324
00325 if (ctx->frame_type == FRAMETYPE_INTER_SCAL && !ctx->is_scalable) {
00326 av_log(avctx, AV_LOG_ERROR, "Scalable inter frame in non scaleable stream\n");
00327 ctx->frame_type = FRAMETYPE_INTER;
00328 return AVERROR_INVALIDDATA;
00329 }
00330
00331 if (ctx->frame_type != FRAMETYPE_NULL) {
00332 ctx->frame_flags = get_bits(&ctx->gb, 8);
00333
00334 ctx->pic_hdr_size = (ctx->frame_flags & 1) ? get_bits_long(&ctx->gb, 24) : 0;
00335
00336 ctx->checksum = (ctx->frame_flags & 0x10) ? get_bits(&ctx->gb, 16) : 0;
00337
00338
00339 if (ctx->frame_flags & 0x20)
00340 skip_hdr_extension(&ctx->gb);
00341
00342
00343 if (ff_ivi_dec_huff_desc(&ctx->gb, ctx->frame_flags & 0x40, IVI_MB_HUFF, &ctx->mb_vlc, avctx))
00344 return -1;
00345
00346 skip_bits(&ctx->gb, 3);
00347 }
00348
00349 align_get_bits(&ctx->gb);
00350
00351 return 0;
00352 }
00353
00354
00363 static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band,
00364 AVCodecContext *avctx)
00365 {
00366 int i;
00367 uint8_t band_flags;
00368
00369 band_flags = get_bits(&ctx->gb, 8);
00370
00371 if (band_flags & 1) {
00372 band->is_empty = 1;
00373 return 0;
00374 }
00375
00376 band->data_size = (ctx->frame_flags & 0x80) ? get_bits_long(&ctx->gb, 24) : 0;
00377
00378 band->inherit_mv = band_flags & 2;
00379 band->inherit_qdelta = band_flags & 8;
00380 band->qdelta_present = band_flags & 4;
00381 if (!band->qdelta_present) band->inherit_qdelta = 1;
00382
00383
00384 band->num_corr = 0;
00385 if (band_flags & 0x10) {
00386 band->num_corr = get_bits(&ctx->gb, 8);
00387 if (band->num_corr > 61) {
00388 av_log(avctx, AV_LOG_ERROR, "Too many corrections: %d\n",
00389 band->num_corr);
00390 return -1;
00391 }
00392
00393
00394 for (i = 0; i < band->num_corr * 2; i++)
00395 band->corr[i] = get_bits(&ctx->gb, 8);
00396 }
00397
00398
00399 band->rvmap_sel = (band_flags & 0x40) ? get_bits(&ctx->gb, 3) : 8;
00400
00401
00402 if (ff_ivi_dec_huff_desc(&ctx->gb, band_flags & 0x80, IVI_BLK_HUFF, &band->blk_vlc, avctx))
00403 return -1;
00404
00405 band->checksum_present = get_bits1(&ctx->gb);
00406 if (band->checksum_present)
00407 band->checksum = get_bits(&ctx->gb, 16);
00408
00409 band->glob_quant = get_bits(&ctx->gb, 5);
00410
00411
00412 if (band_flags & 0x20) {
00413 align_get_bits(&ctx->gb);
00414 skip_hdr_extension(&ctx->gb);
00415 }
00416
00417 align_get_bits(&ctx->gb);
00418
00419 return 0;
00420 }
00421
00422
00433 static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band,
00434 IVITile *tile, AVCodecContext *avctx)
00435 {
00436 int x, y, mv_x, mv_y, mv_delta, offs, mb_offset,
00437 mv_scale, blks_per_mb, s;
00438 IVIMbInfo *mb, *ref_mb;
00439 int row_offset = band->mb_size * band->pitch;
00440
00441 mb = tile->mbs;
00442 ref_mb = tile->ref_mbs;
00443 offs = tile->ypos * band->pitch + tile->xpos;
00444
00445 if (!ref_mb &&
00446 ((band->qdelta_present && band->inherit_qdelta) || band->inherit_mv))
00447 return AVERROR_INVALIDDATA;
00448
00449 if( tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size) ){
00450 av_log(avctx, AV_LOG_ERROR, "allocated tile size %d mismatches parameters %d\n",
00451 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00452 return AVERROR_INVALIDDATA;
00453 }
00454
00455
00456 mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3);
00457 mv_x = mv_y = 0;
00458
00459 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00460 mb_offset = offs;
00461
00462 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00463 mb->xpos = x;
00464 mb->ypos = y;
00465 mb->buf_offs = mb_offset;
00466
00467 if (get_bits1(&ctx->gb)) {
00468 if (ctx->frame_type == FRAMETYPE_INTRA) {
00469 av_log(avctx, AV_LOG_ERROR, "Empty macroblock in an INTRA picture!\n");
00470 return -1;
00471 }
00472 mb->type = 1;
00473 mb->cbp = 0;
00474
00475 mb->q_delta = 0;
00476 if (!band->plane && !band->band_num && (ctx->frame_flags & 8)) {
00477 mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00478 IVI_VLC_BITS, 1);
00479 mb->q_delta = IVI_TOSIGNED(mb->q_delta);
00480 }
00481
00482 mb->mv_x = mb->mv_y = 0;
00483 if (band->inherit_mv && ref_mb){
00484
00485 if (mv_scale) {
00486 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00487 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00488 } else {
00489 mb->mv_x = ref_mb->mv_x;
00490 mb->mv_y = ref_mb->mv_y;
00491 }
00492 }
00493 } else {
00494 if (band->inherit_mv && ref_mb) {
00495 mb->type = ref_mb->type;
00496 } else if (ctx->frame_type == FRAMETYPE_INTRA) {
00497 mb->type = 0;
00498 } else {
00499 mb->type = get_bits1(&ctx->gb);
00500 }
00501
00502 blks_per_mb = band->mb_size != band->blk_size ? 4 : 1;
00503 mb->cbp = get_bits(&ctx->gb, blks_per_mb);
00504
00505 mb->q_delta = 0;
00506 if (band->qdelta_present) {
00507 if (band->inherit_qdelta) {
00508 if (ref_mb) mb->q_delta = ref_mb->q_delta;
00509 } else if (mb->cbp || (!band->plane && !band->band_num &&
00510 (ctx->frame_flags & 8))) {
00511 mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00512 IVI_VLC_BITS, 1);
00513 mb->q_delta = IVI_TOSIGNED(mb->q_delta);
00514 }
00515 }
00516
00517 if (!mb->type) {
00518 mb->mv_x = mb->mv_y = 0;
00519 } else {
00520 if (band->inherit_mv && ref_mb){
00521
00522 if (mv_scale) {
00523 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00524 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00525 } else {
00526 mb->mv_x = ref_mb->mv_x;
00527 mb->mv_y = ref_mb->mv_y;
00528 }
00529 } else {
00530
00531 mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00532 IVI_VLC_BITS, 1);
00533 mv_y += IVI_TOSIGNED(mv_delta);
00534 mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
00535 IVI_VLC_BITS, 1);
00536 mv_x += IVI_TOSIGNED(mv_delta);
00537 mb->mv_x = mv_x;
00538 mb->mv_y = mv_y;
00539 }
00540 }
00541 }
00542
00543 s= band->is_halfpel;
00544 if (mb->type)
00545 if ( x + (mb->mv_x >>s) + (y+ (mb->mv_y >>s))*band->pitch < 0 ||
00546 x + ((mb->mv_x+s)>>s) + band->mb_size - 1
00547 + (y+band->mb_size - 1 +((mb->mv_y+s)>>s))*band->pitch > band->bufsize - 1) {
00548 av_log(avctx, AV_LOG_ERROR, "motion vector %d %d outside reference\n", x*s + mb->mv_x, y*s + mb->mv_y);
00549 return AVERROR_INVALIDDATA;
00550 }
00551
00552 mb++;
00553 if (ref_mb)
00554 ref_mb++;
00555 mb_offset += band->mb_size;
00556 }
00557
00558 offs += row_offset;
00559 }
00560
00561 align_get_bits(&ctx->gb);
00562
00563 return 0;
00564 }
00565
00566
00572 static void switch_buffers(IVI45DecContext *ctx)
00573 {
00574 switch (ctx->prev_frame_type) {
00575 case FRAMETYPE_INTRA:
00576 case FRAMETYPE_INTER:
00577 ctx->buf_switch ^= 1;
00578 ctx->dst_buf = ctx->buf_switch;
00579 ctx->ref_buf = ctx->buf_switch ^ 1;
00580 break;
00581 case FRAMETYPE_INTER_SCAL:
00582 if (!ctx->inter_scal) {
00583 ctx->ref2_buf = 2;
00584 ctx->inter_scal = 1;
00585 }
00586 FFSWAP(int, ctx->dst_buf, ctx->ref2_buf);
00587 ctx->ref_buf = ctx->ref2_buf;
00588 break;
00589 case FRAMETYPE_INTER_NOREF:
00590 break;
00591 }
00592
00593 switch (ctx->frame_type) {
00594 case FRAMETYPE_INTRA:
00595 ctx->buf_switch = 0;
00596
00597 case FRAMETYPE_INTER:
00598 ctx->inter_scal = 0;
00599 ctx->dst_buf = ctx->buf_switch;
00600 ctx->ref_buf = ctx->buf_switch ^ 1;
00601 break;
00602 case FRAMETYPE_INTER_SCAL:
00603 case FRAMETYPE_INTER_NOREF:
00604 case FRAMETYPE_NULL:
00605 break;
00606 }
00607 }
00608
00609
00610 static int is_nonnull_frame(IVI45DecContext *ctx)
00611 {
00612 return ctx->frame_type != FRAMETYPE_NULL;
00613 }
00614
00615
00619 static av_cold int decode_init(AVCodecContext *avctx)
00620 {
00621 IVI45DecContext *ctx = avctx->priv_data;
00622 int result;
00623
00624 ff_ivi_init_static_vlc();
00625
00626
00627 memcpy(ctx->rvmap_tabs, ff_ivi_rvmap_tabs, sizeof(ff_ivi_rvmap_tabs));
00628
00629
00630
00631
00632 ctx->pic_conf.pic_width = avctx->width;
00633 ctx->pic_conf.pic_height = avctx->height;
00634 ctx->pic_conf.chroma_width = (avctx->width + 3) >> 2;
00635 ctx->pic_conf.chroma_height = (avctx->height + 3) >> 2;
00636 ctx->pic_conf.tile_width = avctx->width;
00637 ctx->pic_conf.tile_height = avctx->height;
00638 ctx->pic_conf.luma_bands = ctx->pic_conf.chroma_bands = 1;
00639
00640 avcodec_get_frame_defaults(&ctx->frame);
00641
00642 result = ff_ivi_init_planes(ctx->planes, &ctx->pic_conf);
00643 if (result) {
00644 av_log(avctx, AV_LOG_ERROR, "Couldn't allocate color planes!\n");
00645 return -1;
00646 }
00647
00648 ctx->buf_switch = 0;
00649 ctx->inter_scal = 0;
00650
00651 ctx->decode_pic_hdr = decode_pic_hdr;
00652 ctx->decode_band_hdr = decode_band_hdr;
00653 ctx->decode_mb_info = decode_mb_info;
00654 ctx->switch_buffers = switch_buffers;
00655 ctx->is_nonnull_frame = is_nonnull_frame;
00656
00657 avctx->pix_fmt = PIX_FMT_YUV410P;
00658
00659 return 0;
00660 }
00661
00662 AVCodec ff_indeo5_decoder = {
00663 .name = "indeo5",
00664 .type = AVMEDIA_TYPE_VIDEO,
00665 .id = CODEC_ID_INDEO5,
00666 .priv_data_size = sizeof(IVI45DecContext),
00667 .init = decode_init,
00668 .close = ff_ivi_decode_close,
00669 .decode = ff_ivi_decode_frame,
00670 .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo Video Interactive 5"),
00671 };