|
|
@ -47,6 +47,7 @@ |
|
|
|
av_cold int ff_h263_decode_init(AVCodecContext *avctx) |
|
|
|
av_cold int ff_h263_decode_init(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
MpegEncContext *s = avctx->priv_data; |
|
|
|
MpegEncContext *s = avctx->priv_data; |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
s->avctx = avctx; |
|
|
|
s->avctx = avctx; |
|
|
|
s->out_format = FMT_H263; |
|
|
|
s->out_format = FMT_H263; |
|
|
@ -110,15 +111,15 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) |
|
|
|
s->h263_flv = 1; |
|
|
|
s->h263_flv = 1; |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
return -1; |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
} |
|
|
|
s->codec_id= avctx->codec->id; |
|
|
|
s->codec_id= avctx->codec->id; |
|
|
|
avctx->hwaccel= ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt); |
|
|
|
avctx->hwaccel= ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt); |
|
|
|
|
|
|
|
|
|
|
|
/* for h263, we allocate the images after having read the header */ |
|
|
|
/* for h263, we allocate the images after having read the header */ |
|
|
|
if (avctx->codec->id != AV_CODEC_ID_H263 && avctx->codec->id != AV_CODEC_ID_H263P && avctx->codec->id != AV_CODEC_ID_MPEG4) |
|
|
|
if (avctx->codec->id != AV_CODEC_ID_H263 && avctx->codec->id != AV_CODEC_ID_H263P && avctx->codec->id != AV_CODEC_ID_MPEG4) |
|
|
|
if (ff_MPV_common_init(s) < 0) |
|
|
|
if ((ret = ff_MPV_common_init(s)) < 0) |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ff_h263_decode_init_vlc(s); |
|
|
|
ff_h263_decode_init_vlc(s); |
|
|
|
|
|
|
|
|
|
|
@ -157,6 +158,8 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){ |
|
|
|
static int decode_slice(MpegEncContext *s){ |
|
|
|
static int decode_slice(MpegEncContext *s){ |
|
|
|
const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F; |
|
|
|
const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F; |
|
|
|
const int mb_size= 16>>s->avctx->lowres; |
|
|
|
const int mb_size= 16>>s->avctx->lowres; |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
s->last_resync_gb= s->gb; |
|
|
|
s->last_resync_gb= s->gb; |
|
|
|
s->first_slice_line= 1; |
|
|
|
s->first_slice_line= 1; |
|
|
|
|
|
|
|
|
|
|
@ -176,8 +179,8 @@ static int decode_slice(MpegEncContext *s){ |
|
|
|
const int qscale= s->qscale; |
|
|
|
const int qscale= s->qscale; |
|
|
|
|
|
|
|
|
|
|
|
if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4){ |
|
|
|
if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4){ |
|
|
|
if(ff_mpeg4_decode_partitions(s) < 0) |
|
|
|
if ((ret = ff_mpeg4_decode_partitions(s)) < 0) |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* restore variables which were modified */ |
|
|
|
/* restore variables which were modified */ |
|
|
@ -246,12 +249,12 @@ static int decode_slice(MpegEncContext *s){ |
|
|
|
}else if(ret==SLICE_NOEND){ |
|
|
|
}else if(ret==SLICE_NOEND){ |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy); |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy); |
|
|
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, ER_MB_END&part_mask); |
|
|
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, ER_MB_END&part_mask); |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
} |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy); |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy); |
|
|
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask); |
|
|
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask); |
|
|
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ff_MPV_decode_mb(s, s->block); |
|
|
|
ff_MPV_decode_mb(s, s->block); |
|
|
@ -339,7 +342,7 @@ static int decode_slice(MpegEncContext *s){ |
|
|
|
|
|
|
|
|
|
|
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask); |
|
|
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask); |
|
|
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int ff_h263_decode_frame(AVCodecContext *avctx, |
|
|
|
int ff_h263_decode_frame(AVCodecContext *avctx, |
|
|
@ -382,7 +385,7 @@ uint64_t time= rdtsc(); |
|
|
|
next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size); |
|
|
|
next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size); |
|
|
|
}else{ |
|
|
|
}else{ |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n"); |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n"); |
|
|
|
return -1; |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if( ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 ) |
|
|
|
if( ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 ) |
|
|
@ -411,8 +414,8 @@ retry: |
|
|
|
s->bitstream_buffer_size=0; |
|
|
|
s->bitstream_buffer_size=0; |
|
|
|
|
|
|
|
|
|
|
|
if (!s->context_initialized) { |
|
|
|
if (!s->context_initialized) { |
|
|
|
if (ff_MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
|
|
|
|
if ((ret = ff_MPV_common_init(s)) < 0) //we need the idct permutaton for reading a custom matrix
|
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* We need to set current_picture_ptr before reading the header,
|
|
|
|
/* We need to set current_picture_ptr before reading the header,
|
|
|
@ -458,7 +461,7 @@ retry: |
|
|
|
/* skip if the header was thrashed */ |
|
|
|
/* skip if the header was thrashed */ |
|
|
|
if (ret < 0){ |
|
|
|
if (ret < 0){ |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "header damaged\n"); |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "header damaged\n"); |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
} else if ((s->width != avctx->coded_width || |
|
|
|
} else if ((s->width != avctx->coded_width || |
|
|
|
s->height != avctx->coded_height || |
|
|
|
s->height != avctx->coded_height || |
|
|
|
(s->width + 15) >> 4 != s->mb_width || |
|
|
|
(s->width + 15) >> 4 != s->mb_width || |
|
|
@ -651,8 +654,8 @@ retry: |
|
|
|
s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab; |
|
|
|
s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(ff_MPV_frame_start(s, avctx) < 0) |
|
|
|
if ((ret = ff_MPV_frame_start(s, avctx)) < 0) |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
if (!s->divx_packed) ff_thread_finish_setup(avctx); |
|
|
|
if (!s->divx_packed) ff_thread_finish_setup(avctx); |
|
|
|
|
|
|
|
|
|
|
@ -662,8 +665,8 @@ retry: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (avctx->hwaccel) { |
|
|
|
if (avctx->hwaccel) { |
|
|
|
if (avctx->hwaccel->start_frame(avctx, s->gb.buffer, s->gb.buffer_end - s->gb.buffer) < 0) |
|
|
|
if ((ret = avctx->hwaccel->start_frame(avctx, s->gb.buffer, s->gb.buffer_end - s->gb.buffer)) < 0) |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ff_er_frame_start(s); |
|
|
|
ff_er_frame_start(s); |
|
|
@ -737,8 +740,8 @@ intrax8_decoded: |
|
|
|
ff_er_frame_end(s); |
|
|
|
ff_er_frame_end(s); |
|
|
|
|
|
|
|
|
|
|
|
if (avctx->hwaccel) { |
|
|
|
if (avctx->hwaccel) { |
|
|
|
if (avctx->hwaccel->end_frame(avctx) < 0) |
|
|
|
if ((ret = avctx->hwaccel->end_frame(avctx)) < 0) |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ff_MPV_frame_end(s); |
|
|
|
ff_MPV_frame_end(s); |
|
|
|