annotate ffmpeg/libavcodec/indeo5.c @ 13:844d341cf643 tip

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