|
|
@ -34,19 +34,6 @@ |
|
|
|
#include "ivi_common.h" |
|
|
|
#include "ivi_common.h" |
|
|
|
#include "indeo4data.h" |
|
|
|
#include "indeo4data.h" |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Indeo 4 frame types. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
enum { |
|
|
|
|
|
|
|
FRAMETYPE_INTRA = 0, |
|
|
|
|
|
|
|
FRAMETYPE_INTRA1 = 1, ///< intra frame with slightly different bitstream coding
|
|
|
|
|
|
|
|
FRAMETYPE_INTER = 2, ///< non-droppable P-frame
|
|
|
|
|
|
|
|
FRAMETYPE_BIDIR = 3, ///< bidirectional frame
|
|
|
|
|
|
|
|
FRAMETYPE_INTER_NOREF = 4, ///< droppable P-frame
|
|
|
|
|
|
|
|
FRAMETYPE_NULL_FIRST = 5, ///< empty frame with no data
|
|
|
|
|
|
|
|
FRAMETYPE_NULL_LAST = 6 ///< empty frame with no data
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define IVI4_PIC_SIZE_ESC 7 |
|
|
|
#define IVI4_PIC_SIZE_ESC 7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -132,7 +119,7 @@ static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if IVI4_STREAM_ANALYSER |
|
|
|
#if IVI4_STREAM_ANALYSER |
|
|
|
if (ctx->frame_type == FRAMETYPE_BIDIR) |
|
|
|
if (ctx->frame_type == IVI4_FRAMETYPE_BIDIR) |
|
|
|
ctx->has_b_frames = 1; |
|
|
|
ctx->has_b_frames = 1; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
@ -152,7 +139,7 @@ static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx) |
|
|
|
ctx->data_size = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 24) : 0; |
|
|
|
ctx->data_size = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 24) : 0; |
|
|
|
|
|
|
|
|
|
|
|
/* null frames don't contain anything else so we just return */ |
|
|
|
/* null frames don't contain anything else so we just return */ |
|
|
|
if (ctx->frame_type >= FRAMETYPE_NULL_FIRST) { |
|
|
|
if (ctx->frame_type >= IVI4_FRAMETYPE_NULL_FIRST) { |
|
|
|
av_dlog(avctx, "Null frame encountered!\n"); |
|
|
|
av_dlog(avctx, "Null frame encountered!\n"); |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
@ -327,7 +314,7 @@ static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band, |
|
|
|
|
|
|
|
|
|
|
|
band->glob_quant = get_bits(&ctx->gb, 5); |
|
|
|
band->glob_quant = get_bits(&ctx->gb, 5); |
|
|
|
|
|
|
|
|
|
|
|
if (!get_bits1(&ctx->gb) || ctx->frame_type == FRAMETYPE_INTRA) { |
|
|
|
if (!get_bits1(&ctx->gb) || ctx->frame_type == IVI4_FRAMETYPE_INTRA) { |
|
|
|
transform_id = get_bits(&ctx->gb, 5); |
|
|
|
transform_id = get_bits(&ctx->gb, 5); |
|
|
|
if (transform_id >= FF_ARRAY_ELEMS(transforms) || |
|
|
|
if (transform_id >= FF_ARRAY_ELEMS(transforms) || |
|
|
|
!transforms[transform_id].inv_trans) { |
|
|
|
!transforms[transform_id].inv_trans) { |
|
|
@ -462,7 +449,7 @@ static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, |
|
|
|
offs = tile->ypos * band->pitch + tile->xpos; |
|
|
|
offs = tile->ypos * band->pitch + tile->xpos; |
|
|
|
|
|
|
|
|
|
|
|
blks_per_mb = band->mb_size != band->blk_size ? 4 : 1; |
|
|
|
blks_per_mb = band->mb_size != band->blk_size ? 4 : 1; |
|
|
|
mb_type_bits = ctx->frame_type == FRAMETYPE_BIDIR ? 2 : 1; |
|
|
|
mb_type_bits = ctx->frame_type == IVI4_FRAMETYPE_BIDIR ? 2 : 1; |
|
|
|
|
|
|
|
|
|
|
|
/* scale factor for motion vectors */ |
|
|
|
/* scale factor for motion vectors */ |
|
|
|
mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3); |
|
|
|
mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3); |
|
|
@ -477,7 +464,7 @@ static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, |
|
|
|
mb->buf_offs = mb_offset; |
|
|
|
mb->buf_offs = mb_offset; |
|
|
|
|
|
|
|
|
|
|
|
if (get_bits1(&ctx->gb)) { |
|
|
|
if (get_bits1(&ctx->gb)) { |
|
|
|
if (ctx->frame_type == FRAMETYPE_INTRA) { |
|
|
|
if (ctx->frame_type == IVI4_FRAMETYPE_INTRA) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Empty macroblock in an INTRA picture!\n"); |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Empty macroblock in an INTRA picture!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
} |
|
|
@ -508,8 +495,8 @@ static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, |
|
|
|
if (!ref_mb) |
|
|
|
if (!ref_mb) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
mb->type = ref_mb->type; |
|
|
|
mb->type = ref_mb->type; |
|
|
|
} else if (ctx->frame_type == FRAMETYPE_INTRA || |
|
|
|
} else if (ctx->frame_type == IVI4_FRAMETYPE_INTRA || |
|
|
|
ctx->frame_type == FRAMETYPE_INTRA1) { |
|
|
|
ctx->frame_type == IVI4_FRAMETYPE_INTRA1) { |
|
|
|
mb->type = 0; /* mb_type is always INTRA for intra-frames */ |
|
|
|
mb->type = 0; /* mb_type is always INTRA for intra-frames */ |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
mb->type = get_bits(&ctx->gb, mb_type_bits); |
|
|
|
mb->type = get_bits(&ctx->gb, mb_type_bits); |
|
|
@ -577,29 +564,29 @@ static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, |
|
|
|
static void switch_buffers(IVI45DecContext *ctx) |
|
|
|
static void switch_buffers(IVI45DecContext *ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
switch (ctx->prev_frame_type) { |
|
|
|
switch (ctx->prev_frame_type) { |
|
|
|
case FRAMETYPE_INTRA: |
|
|
|
case IVI4_FRAMETYPE_INTRA: |
|
|
|
case FRAMETYPE_INTRA1: |
|
|
|
case IVI4_FRAMETYPE_INTRA1: |
|
|
|
case FRAMETYPE_INTER: |
|
|
|
case IVI4_FRAMETYPE_INTER: |
|
|
|
ctx->buf_switch ^= 1; |
|
|
|
ctx->buf_switch ^= 1; |
|
|
|
ctx->dst_buf = ctx->buf_switch; |
|
|
|
ctx->dst_buf = ctx->buf_switch; |
|
|
|
ctx->ref_buf = ctx->buf_switch ^ 1; |
|
|
|
ctx->ref_buf = ctx->buf_switch ^ 1; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case FRAMETYPE_INTER_NOREF: |
|
|
|
case IVI4_FRAMETYPE_INTER_NOREF: |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
switch (ctx->frame_type) { |
|
|
|
switch (ctx->frame_type) { |
|
|
|
case FRAMETYPE_INTRA: |
|
|
|
case IVI4_FRAMETYPE_INTRA: |
|
|
|
case FRAMETYPE_INTRA1: |
|
|
|
case IVI4_FRAMETYPE_INTRA1: |
|
|
|
ctx->buf_switch = 0; |
|
|
|
ctx->buf_switch = 0; |
|
|
|
/* FALLTHROUGH */ |
|
|
|
/* FALLTHROUGH */ |
|
|
|
case FRAMETYPE_INTER: |
|
|
|
case IVI4_FRAMETYPE_INTER: |
|
|
|
ctx->dst_buf = ctx->buf_switch; |
|
|
|
ctx->dst_buf = ctx->buf_switch; |
|
|
|
ctx->ref_buf = ctx->buf_switch ^ 1; |
|
|
|
ctx->ref_buf = ctx->buf_switch ^ 1; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case FRAMETYPE_INTER_NOREF: |
|
|
|
case IVI4_FRAMETYPE_INTER_NOREF: |
|
|
|
case FRAMETYPE_NULL_FIRST: |
|
|
|
case IVI4_FRAMETYPE_NULL_FIRST: |
|
|
|
case FRAMETYPE_NULL_LAST: |
|
|
|
case IVI4_FRAMETYPE_NULL_LAST: |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -607,7 +594,7 @@ static void switch_buffers(IVI45DecContext *ctx) |
|
|
|
|
|
|
|
|
|
|
|
static int is_nonnull_frame(IVI45DecContext *ctx) |
|
|
|
static int is_nonnull_frame(IVI45DecContext *ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return ctx->frame_type < FRAMETYPE_NULL_FIRST; |
|
|
|
return ctx->frame_type < IVI4_FRAMETYPE_NULL_FIRST; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|