]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/h263dec.c
mpegenccontext: Remove unused opaque pointer
[ffmpeg] / libavcodec / h263dec.c
index 624506849b82139bf2d790ddedd79bd239d79a47..cdd55446c77f8e154891c1890b9a2a791a90c87e 100644 (file)
 #include "h263.h"
 #include "h263_parser.h"
 #include "internal.h"
+#include "mpeg_er.h"
 #include "mpeg4video.h"
 #include "mpeg4video_parser.h"
 #include "mpegvideo.h"
 #include "msmpeg4.h"
+#include "qpeldsp.h"
 #include "thread.h"
 
 av_cold int ff_h263_decode_init(AVCodecContext *avctx)
 {
     MpegEncContext *s = avctx->priv_data;
+    int ret;
 
     s->avctx           = avctx;
     s->out_format      = FMT_H263;
@@ -56,7 +59,7 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
     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);
+        avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
     s->unrestricted_mv = 1;
 
     /* select sub codec */
@@ -102,17 +105,20 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
         s->h263_flv = 1;
         break;
     default:
-        return -1;
+        av_log(avctx, AV_LOG_ERROR, "Unsupported codec %d\n",
+               avctx->codec->id);
+        return AVERROR(ENOSYS);
     }
     s->codec_id    = avctx->codec->id;
-    avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
 
     /* 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_MPEG4)
-        if (ff_MPV_common_init(s) < 0)
-            return -1;
+        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;
@@ -160,6 +166,7 @@ static int decode_slice(MpegEncContext *s)
     const int part_mask = s->partitioned_frame
                           ? (ER_AC_END | ER_AC_ERROR) : 0x7F;
     const int mb_size = 16;
+    int ret;
 
     s->last_resync_gb   = s->gb;
     s->first_slice_line = 1;
@@ -180,8 +187,8 @@ static int decode_slice(MpegEncContext *s)
         const int qscale = s->qscale;
 
         if (CONFIG_MPEG4_DECODER && s->codec_id == AV_CODEC_ID_MPEG4)
-            if (ff_mpeg4_decode_partitions(s) < 0)
-                return -1;
+            if ((ret = ff_mpeg4_decode_partitions(s->avctx->priv_data)) < 0)
+                return ret;
 
         /* restore variables which were modified */
         s->first_slice_line = 1;
@@ -220,7 +227,6 @@ static int decode_slice(MpegEncContext *s)
 
             s->mv_dir  = MV_DIR_FORWARD;
             s->mv_type = MV_TYPE_16X16;
-//            s->mb_skipped = 0;
             av_dlog(s, "%d %d %06X\n",
                     ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
             ret = s->decode_mb(s, s->block);
@@ -253,13 +259,13 @@ static int decode_slice(MpegEncContext *s)
                     ff_er_add_slice(&s->er, 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);
                 ff_er_add_slice(&s->er, 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);
@@ -287,7 +293,6 @@ static int decode_slice(MpegEncContext *s)
         (s->workaround_bugs & FF_BUG_AUTODETECT) &&
         get_bits_left(&s->gb) >= 0               &&
         get_bits_left(&s->gb) < 48               &&
-        // !s->resync_marker                     &&
         !s->data_partitioning) {
         const int bits_count = get_bits_count(&s->gb);
         const int bits_left  = s->gb.size_in_bits - bits_count;
@@ -309,8 +314,7 @@ static int decode_slice(MpegEncContext *s)
     }
 
     if (s->workaround_bugs & FF_BUG_AUTODETECT) {
-        if (s->padding_bug_score > -2 && !s->data_partitioning
-            /* && (s->divx_version >= 0 || !s->resync_marker) */)
+        if (s->padding_bug_score > -2 && !s->data_partitioning)
             s->workaround_bugs |= FF_BUG_NO_PADDING;
         else
             s->workaround_bugs &= ~FF_BUG_NO_PADDING;
@@ -353,7 +357,7 @@ static int decode_slice(MpegEncContext *s)
     ff_er_add_slice(&s->er, 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, void *data, int *got_frame,
@@ -372,7 +376,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
     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;
 
@@ -392,7 +396,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
         } else {
             av_log(s->avctx, AV_LOG_ERROR,
                    "this codec does not support truncated bitstreams\n");
-            return -1;
+            return AVERROR(ENOSYS);
         }
 
         if (ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf,
@@ -401,19 +405,23 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
     }
 
     if (s->bitstream_buffer_size && (s->divx_packed || buf_size < 20)) // divx 5.01+/xvid frame reorder
-        init_get_bits(&s->gb, s->bitstream_buffer,
-                      s->bitstream_buffer_size * 8);
+        ret = init_get_bits8(&s->gb, s->bitstream_buffer,
+                             s->bitstream_buffer_size);
     else
-        init_get_bits(&s->gb, buf, buf_size * 8);
+        ret = init_get_bits8(&s->gb, buf, buf_size);
     s->bitstream_buffer_size = 0;
 
+    if (ret < 0)
+        return ret;
+
     if (!s->context_initialized)
-        if (ff_MPV_common_init(s) < 0) // we need the idct permutaton for reading a custom matrix
-            return -1;
+        // 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]) {
+    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;
@@ -425,15 +433,17 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
         ret = ff_wmv2_decode_picture_header(s);
     } else if (CONFIG_MSMPEG4_DECODER && s->msmpeg4_version) {
         ret = ff_msmpeg4_decode_picture_header(s);
-    } else if (CONFIG_MPEG4_DECODER && s->h263_pred) {
+    } else if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4) {
         if (s->avctx->extradata_size && s->picture_number == 0) {
             GetBitContext gb;
 
-            init_get_bits(&gb, s->avctx->extradata,
-                          s->avctx->extradata_size * 8);
-            ret = ff_mpeg4_decode_picture_header(s, &gb);
+            ret = init_get_bits8(&gb, s->avctx->extradata,
+                                 s->avctx->extradata_size);
+            if (ret < 0)
+                return ret;
+            ff_mpeg4_decode_picture_header(avctx->priv_data, &gb);
         }
-        ret = ff_mpeg4_decode_picture_header(s, &s->gb);
+        ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->gb);
     } else if (CONFIG_H263I_DECODER && s->codec_id == AV_CODEC_ID_H263I) {
         ret = ff_intel_h263_decode_picture_header(s);
     } else if (CONFIG_FLV_DECODER && s->h263_flv) {
@@ -448,105 +458,15 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
     /* skip if the header was thrashed */
     if (ret < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
-        return -1;
+        return ret;
     }
 
     avctx->has_b_frames = !s->low_delay;
 
-    if (s->xvid_build == -1 && s->divx_version == -1 && s->lavc_build == -1) {
-        if (s->stream_codec_tag == AV_RL32("XVID") ||
-            s->codec_tag        == AV_RL32("XVID") ||
-            s->codec_tag        == AV_RL32("XVIX") ||
-            s->codec_tag        == AV_RL32("RMP4") ||
-            s->codec_tag        == AV_RL32("ZMP4") ||
-            s->codec_tag        == AV_RL32("SIPP"))
-            s->xvid_build = 0;
-#if 0
-        if (s->codec_tag == AV_RL32("DIVX") && s->vo_type == 0 &&
-            s->vol_control_parameters == 1 &&
-            s->padding_bug_score > 0 && s->low_delay) // XVID with modified fourcc
-            s->xvid_build = 0;
-#endif
-    }
-
-    if (s->xvid_build == -1 && s->divx_version == -1 && s->lavc_build == -1)
-        if (s->codec_tag == AV_RL32("DIVX") && s->vo_type == 0 &&
-            s->vol_control_parameters == 0)
-            s->divx_version = 400;  // divx 4
-
-    if (s->xvid_build >= 0 && s->divx_version >= 0) {
-        s->divx_version =
-        s->divx_build   = -1;
-    }
-
-    if (s->workaround_bugs & FF_BUG_AUTODETECT) {
-        if (s->codec_tag == AV_RL32("XVIX"))
-            s->workaround_bugs |= FF_BUG_XVID_ILACE;
-
-        if (s->codec_tag == AV_RL32("UMP4"))
-            s->workaround_bugs |= FF_BUG_UMP4;
-
-        if (s->divx_version >= 500 && s->divx_build < 1814)
-            s->workaround_bugs |= FF_BUG_QPEL_CHROMA;
-
-        if (s->divx_version > 502 && s->divx_build < 1814)
-            s->workaround_bugs |= FF_BUG_QPEL_CHROMA2;
-
-        if (s->xvid_build <= 3U)
-            s->padding_bug_score = 256 * 256 * 256 * 64;
-
-        if (s->xvid_build <= 1U)
-            s->workaround_bugs |= FF_BUG_QPEL_CHROMA;
-
-        if (s->xvid_build <= 12U)
-            s->workaround_bugs |= FF_BUG_EDGE;
-
-        if (s->xvid_build <= 32U)
-            s->workaround_bugs |= FF_BUG_DC_CLIP;
-
 #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;
-
-        if (s->lavc_build < 4653U)
-            s->workaround_bugs |= FF_BUG_STD_QPEL;
-
-        if (s->lavc_build < 4655U)
-            s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE;
-
-        if (s->lavc_build < 4670U)
-            s->workaround_bugs |= FF_BUG_EDGE;
-
-        if (s->lavc_build <= 4712U)
-            s->workaround_bugs |= FF_BUG_DC_CLIP;
-
-        if (s->divx_version >= 0)
-            s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE;
-        if (s->divx_version == 501 && s->divx_build == 20020416)
-            s->padding_bug_score = 256 * 256 * 256 * 64;
-
-        if (s->divx_version < 500U)
-            s->workaround_bugs |= FF_BUG_EDGE;
-
-        if (s->divx_version >= 0)
-            s->workaround_bugs |= FF_BUG_HPEL_CHROMA;
-#if 0
-        if (s->divx_version == 500)
-            s->padding_bug_score = 256 * 256 * 256 * 64;
-
-        /* very ugly XVID padding bug detection FIXME/XXX solve this differently
-         * Let us hope this at least works. */
-        if (s->resync_marker == 0 && s->data_partitioning == 0        &&
-            s->divx_version == -1 && s->codec_id == AV_CODEC_ID_MPEG4 &&
-            s->vo_type == 0)
-            s->workaround_bugs |= FF_BUG_NO_PADDING;
-
-        // FIXME not sure about the version num but a 4609 file seems ok
-        if (s->lavc_build < 4609U)
-            s->workaround_bugs |= FF_BUG_NO_PADDING;
-#endif
-    }
+    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)
@@ -564,22 +484,6 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
         SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
     }
 
-    if (avctx->debug & FF_DEBUG_BUGS)
-        av_log(s->avctx, AV_LOG_DEBUG,
-               "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
-               s->workaround_bugs, s->lavc_build, s->xvid_build,
-               s->divx_version, s->divx_build, s->divx_packed ? "p" : "");
-
-#if HAVE_MMX
-    if (s->codec_id == AV_CODEC_ID_MPEG4 && s->xvid_build >= 0 &&
-        avctx->idct_algo == FF_IDCT_AUTO &&
-        (av_get_cpu_flags() & AV_CPU_FLAG_MMX)) {
-        avctx->idct_algo = FF_IDCT_XVIDMMX;
-        ff_dct_common_init(s);
-        s->picture_number = 0;
-    }
-#endif
-
     /* After H263 & mpeg4 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
@@ -590,7 +494,11 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
         /* H.263 could change picture size any time */
         s->context_reinit = 0;
 
-        avcodec_set_dimensions(avctx, s->width, s->height);
+        ret = ff_set_dimensions(avctx, s->width, s->height);
+        if (ret < 0)
+            return ret;
+
+        ff_set_sar(avctx, avctx->sample_aspect_ratio);
 
         if ((ret = ff_MPV_common_frame_size_change(s)))
             return ret;
@@ -602,8 +510,8 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
         s->gob_index = ff_h263_get_gob_height(s);
 
     // 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 &&
@@ -624,23 +532,25 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
     }
 
     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 (ff_MPV_frame_start(s, avctx) < 0)
-        return -1;
+    if ((ret = ff_MPV_frame_start(s, avctx)) < 0)
+        return ret;
 
     if (!s->divx_packed && !avctx->hwaccel)
         ff_thread_finish_setup(avctx);
 
-    if (avctx->hwaccel)
-        if (avctx->hwaccel->start_frame(avctx, s->gb.buffer,
-                                        s->gb.buffer_end - s->gb.buffer) < 0)
-            return -1;
+    if (avctx->hwaccel) {
+        ret = avctx->hwaccel->start_frame(avctx, s->gb.buffer,
+                                          s->gb.buffer_end - s->gb.buffer);
+        if (ret < 0 )
+            return ret;
+    }
 
     ff_mpeg_er_frame_start(s);
 
@@ -687,62 +597,33 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
             s->er.error_status_table[s->mb_num - 1] = ER_MB_ERROR;
 
     assert(s->bitstream_buffer_size == 0);
-    /* divx 5.01+ bistream reorder stuff */
-    if (s->codec_id == AV_CODEC_ID_MPEG4 && s->divx_packed) {
-        int current_pos     = get_bits_count(&s->gb) >> 3;
-        int startcode_found = 0;
-
-        if (buf_size - current_pos > 5) {
-            int i;
-            for (i = current_pos; i < buf_size - 3; i++)
-                if (buf[i]     == 0 &&
-                    buf[i + 1] == 0 &&
-                    buf[i + 2] == 1 &&
-                    buf[i + 3] == 0xB6) {
-                    startcode_found = 1;
-                    break;
-                }
-        }
-        if (s->gb.buffer == s->bitstream_buffer && buf_size > 7 &&
-            s->xvid_build >= 0) {       // xvid style
-            startcode_found = 1;
-            current_pos     = 0;
-        }
 
-        if (startcode_found) {
-            av_fast_malloc(&s->bitstream_buffer,
-                           &s->allocated_bitstream_buffer_size,
-                           buf_size - current_pos +
-                           FF_INPUT_BUFFER_PADDING_SIZE);
-            if (!s->bitstream_buffer)
-                return AVERROR(ENOMEM);
-            memcpy(s->bitstream_buffer, buf + current_pos,
-                   buf_size - current_pos);
-            s->bitstream_buffer_size = buf_size - current_pos;
-        }
-    }
+    if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4)
+        ff_mpeg4_frame_end(avctx, buf, buf_size);
 
 intrax8_decoded:
     ff_er_frame_end(&s->er);
 
-    if (avctx->hwaccel)
-        if (avctx->hwaccel->end_frame(avctx) < 0)
-            return -1;
+    if (avctx->hwaccel) {
+        ret = avctx->hwaccel->end_frame(avctx);
+        if (ret < 0)
+            return ret;
+    }
 
     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)
+        if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
             return ret;
         ff_print_debug_info(s, s->last_picture_ptr);
     }
@@ -757,10 +638,10 @@ intrax8_decoded:
 }
 
 const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
-#if CONFIG_VAAPI
+#if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG4_VAAPI_HWACCEL
     AV_PIX_FMT_VAAPI_VLD,
 #endif
-#if CONFIG_VDPAU
+#if CONFIG_H263_VDPAU_HWACCEL || CONFIG_MPEG4_VDPAU_HWACCEL
     AV_PIX_FMT_VDPAU,
 #endif
     AV_PIX_FMT_YUV420P,