#include "h263.h"
#include "h263_parser.h"
#include "internal.h"
+#include "mpeg_er.h"
#include "mpeg4video.h"
#include "mpeg4video_parser.h"
+#include "mpegutils.h"
#include "mpegvideo.h"
#include "msmpeg4.h"
+#include "qpeldsp.h"
#include "thread.h"
+#include "wmv2.h"
+
+static enum AVPixelFormat h263_get_format(AVCodecContext *avctx)
+{
+ if (avctx->codec->id == AV_CODEC_ID_MSS2)
+ return AV_PIX_FMT_YUV420P;
+
+ return avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
+}
av_cold int ff_h263_decode_init(AVCodecContext *avctx)
{
s->workaround_bugs = avctx->workaround_bugs;
// set defaults
- ff_MPV_decode_defaults(s);
+ ff_mpv_decode_defaults(s);
s->quant_precision = 5;
s->decode_mb = ff_h263_decode_mb;
s->low_delay = 1;
- if (avctx->codec->id == AV_CODEC_ID_MSS2)
- avctx->pix_fmt = AV_PIX_FMT_YUV420P;
- else
- avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
s->unrestricted_mv = 1;
/* select sub codec */
return AVERROR(ENOSYS);
}
s->codec_id = avctx->codec->id;
- avctx->hwaccel = ff_find_hwaccel(avctx);
- /* for h263, we allocate the images after having read the header */
+ /* for H.263, we allocate the images after having read the header */
if (avctx->codec->id != AV_CODEC_ID_H263 &&
- avctx->codec->id != AV_CODEC_ID_MPEG4)
- if ((ret = ff_MPV_common_init(s)) < 0)
+ avctx->codec->id != AV_CODEC_ID_MPEG4) {
+ avctx->pix_fmt = h263_get_format(avctx);
+ ff_mpv_idct_init(s);
+ if ((ret = ff_mpv_common_init(s)) < 0)
return ret;
+ }
ff_h263dsp_init(&s->h263dsp);
+ ff_qpeldsp_init(&s->qdsp);
ff_h263_decode_init_vlc();
return 0;
{
MpegEncContext *s = avctx->priv_data;
- ff_MPV_common_end(s);
+ ff_mpv_common_end(s);
return 0;
}
/* We would have to scan through the whole buf to handle the weird
* reordering ... */
return buf_size;
- } else if (s->flags & CODEC_FLAG_TRUNCATED) {
+ } else if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
pos -= s->parse_context.last_index;
// padding is not really read so this might be -1
if (pos < 0)
s->mv_dir = MV_DIR_FORWARD;
s->mv_type = MV_TYPE_16X16;
- av_dlog(s, "%d %d %06X\n",
- ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
+ ff_dlog(s, "%d %06X\n",
+ get_bits_count(&s->gb), show_bits(&s->gb, 24));
ret = s->decode_mb(s, s->block);
if (s->pict_type != AV_PICTURE_TYPE_B)
if (ret < 0) {
const int xy = s->mb_x + s->mb_y * s->mb_stride;
if (ret == SLICE_END) {
- ff_MPV_decode_mb(s, s->block);
+ ff_mpv_decode_mb(s, s->block);
if (s->loop_filter)
ff_h263_loop_filter(s);
if (++s->mb_x >= s->mb_width) {
s->mb_x = 0;
ff_mpeg_draw_horiz_band(s, s->mb_y * mb_size, mb_size);
- ff_MPV_report_decode_progress(s);
+ ff_mpv_report_decode_progress(s);
s->mb_y++;
}
return 0;
return AVERROR_INVALIDDATA;
}
- ff_MPV_decode_mb(s, s->block);
+ ff_mpv_decode_mb(s, s->block);
if (s->loop_filter)
ff_h263_loop_filter(s);
}
ff_mpeg_draw_horiz_band(s, s->mb_y * mb_size, mb_size);
- ff_MPV_report_decode_progress(s);
+ ff_mpv_report_decode_progress(s);
s->mb_x = 0;
}
}
if (s->workaround_bugs & FF_BUG_AUTODETECT) {
- if (s->padding_bug_score > -2 && !s->data_partitioning)
+ if (s->codec_id == AV_CODEC_ID_H263 ||
+ (s->padding_bug_score > -2 && !s->data_partitioning))
s->workaround_bugs |= FF_BUG_NO_PADDING;
else
s->workaround_bugs &= ~FF_BUG_NO_PADDING;
/* buggy padding but the frame should still end approximately at
* the bitstream end */
if ((s->workaround_bugs & FF_BUG_NO_PADDING) &&
- (s->err_recognition & AV_EF_BUFFER))
+ (s->avctx->err_recognition & AV_EF_BUFFER))
max_extra += 48;
else if ((s->workaround_bugs & FF_BUG_NO_PADDING))
max_extra += 256 * 256 * 256 * 64;
int ret;
AVFrame *pict = data;
- s->flags = avctx->flags;
- s->flags2 = avctx->flags2;
-
/* no supplementary picture */
if (buf_size == 0) {
/* special case for last picture */
if (s->low_delay == 0 && s->next_picture_ptr) {
- if ((ret = av_frame_ref(pict, &s->next_picture_ptr->f)) < 0)
+ if ((ret = av_frame_ref(pict, s->next_picture_ptr->f)) < 0)
return ret;
s->next_picture_ptr = NULL;
return 0;
}
- if (s->flags & CODEC_FLAG_TRUNCATED) {
+ if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
int next;
if (CONFIG_MPEG4_DECODER && s->codec_id == AV_CODEC_ID_MPEG4) {
return ret;
if (!s->context_initialized)
- // we need the idct permutaton for reading a custom matrix
- if ((ret = ff_MPV_common_init(s)) < 0)
- return ret;
-
- /* We need to set current_picture_ptr before reading the header,
- * otherwise we cannot store anyting in there */
- if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
- int i = ff_find_unused_picture(s, 0);
- if (i < 0)
- return i;
- s->current_picture_ptr = &s->picture[i];
- }
+ // we need the idct permutation for reading a custom matrix
+ ff_mpv_idct_init(s);
/* let's go :-) */
if (CONFIG_WMV2_DECODER && s->msmpeg4_version == 5) {
return ret;
}
+ if (!s->context_initialized) {
+ avctx->pix_fmt = h263_get_format(avctx);
+ if ((ret = ff_mpv_common_init(s)) < 0)
+ return ret;
+ }
+
+ if (!s->current_picture_ptr || s->current_picture_ptr->f->data[0]) {
+ int i = ff_find_unused_picture(s->avctx, s->picture, 0);
+ if (i < 0)
+ return i;
+ s->current_picture_ptr = &s->picture[i];
+ }
+
avctx->has_b_frames = !s->low_delay;
#define SET_QPEL_FUNC(postfix1, postfix2) \
- s->dsp.put_ ## postfix1 = ff_put_ ## postfix2; \
- s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \
- s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
+ s->qdsp.put_ ## postfix1 = ff_put_ ## postfix2; \
+ s->qdsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \
+ s->qdsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
if (s->workaround_bugs & FF_BUG_STD_QPEL) {
SET_QPEL_FUNC(qpel_pixels_tab[0][5], qpel16_mc11_old_c)
SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
}
- /* After H263 & mpeg4 header decode we have the height, width,
+ /* After H.263 & MPEG-4 header decode we have the height, width,
* and other parameters. So then we could init the picture.
- * FIXME: By the way H263 decoder is evolving it should have
+ * FIXME: By the way H.263 decoder is evolving it should have
* an H263EncContext */
if (s->width != avctx->coded_width ||
s->height != avctx->coded_height ||
if (ret < 0)
return ret;
- if ((ret = ff_MPV_common_frame_size_change(s)))
+ ff_set_sar(avctx, avctx->sample_aspect_ratio);
+
+ if ((ret = ff_mpv_common_frame_size_change(s)))
return ret;
+
+ if (avctx->pix_fmt != h263_get_format(avctx)) {
+ av_log(avctx, AV_LOG_ERROR, "format change not supported\n");
+ avctx->pix_fmt = AV_PIX_FMT_NONE;
+ return AVERROR_UNKNOWN;
+ }
}
if (s->codec_id == AV_CODEC_ID_H263 ||
s->codec_id == AV_CODEC_ID_H263P ||
s->codec_id == AV_CODEC_ID_H263I)
- s->gob_index = ff_h263_get_gob_height(s);
+ s->gob_index = H263_GOB_HEIGHT(s->height);
// for skipping the frame
- s->current_picture.f.pict_type = s->pict_type;
- s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
+ s->current_picture.f->pict_type = s->pict_type;
+ s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
/* skip B-frames if we don't have reference frames */
- if (s->last_picture_ptr == NULL &&
+ if (!s->last_picture_ptr &&
(s->pict_type == AV_PICTURE_TYPE_B || s->droppable))
return get_consumed_bytes(s, buf_size);
if ((avctx->skip_frame >= AVDISCARD_NONREF &&
}
if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
- s->me.qpel_put = s->dsp.put_qpel_pixels_tab;
- s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
+ s->me.qpel_put = s->qdsp.put_qpel_pixels_tab;
+ s->me.qpel_avg = s->qdsp.avg_qpel_pixels_tab;
} else {
- s->me.qpel_put = s->dsp.put_no_rnd_qpel_pixels_tab;
- s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
+ s->me.qpel_put = s->qdsp.put_no_rnd_qpel_pixels_tab;
+ s->me.qpel_avg = s->qdsp.avg_qpel_pixels_tab;
}
- if ((ret = ff_MPV_frame_start(s, avctx)) < 0)
+ if ((ret = ff_mpv_frame_start(s, avctx)) < 0)
return ret;
- if (!s->divx_packed && !avctx->hwaccel)
+ if (!s->divx_packed)
ff_thread_finish_setup(avctx);
if (avctx->hwaccel) {
/* the second part of the wmv2 header contains the MB skip bits which
* are stored in current_picture->mb_type which is not available before
- * ff_MPV_frame_start() */
+ * ff_mpv_frame_start() */
if (CONFIG_WMV2_DECODER && s->msmpeg4_version == 5) {
ret = ff_wmv2_decode_secondary_picture_header(s);
if (ret < 0)
return ret;
}
- ff_MPV_frame_end(s);
+ ff_mpv_frame_end(s);
if (!s->divx_packed && avctx->hwaccel)
ff_thread_finish_setup(avctx);
- assert(s->current_picture.f.pict_type ==
- s->current_picture_ptr->f.pict_type);
- assert(s->current_picture.f.pict_type == s->pict_type);
+ assert(s->current_picture.f->pict_type ==
+ s->current_picture_ptr->f->pict_type);
+ assert(s->current_picture.f->pict_type == s->pict_type);
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
- if ((ret = av_frame_ref(pict, &s->current_picture_ptr->f)) < 0)
+ if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
return ret;
ff_print_debug_info(s, s->current_picture_ptr);
- } else if (s->last_picture_ptr != NULL) {
- if ((ret = av_frame_ref(pict, &s->last_picture_ptr->f)) < 0)
+ } else if (s->last_picture_ptr) {
+ if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
return ret;
ff_print_debug_info(s, s->last_picture_ptr);
}
const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
#if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG4_VAAPI_HWACCEL
- AV_PIX_FMT_VAAPI_VLD,
+ AV_PIX_FMT_VAAPI,
#endif
-#if CONFIG_H263_VDPAU_HWACCEL || CONFIG_MPEG4_VDPAU_HWACCEL
+#if CONFIG_MPEG4_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
.init = ff_h263_decode_init,
.close = ff_h263_decode_end,
.decode = ff_h263_decode_frame,
- .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
- CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
+ .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 |
+ AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY,
.flush = ff_mpeg_flush,
.pix_fmts = ff_h263_hwaccel_pixfmt_list_420,
};