Browse code

Merge remote-tracking branch 'qatar/master'

* qatar/master:
ARM: allow runtime masking of CPU features
dsputil: remove unused functions
mov: Treat keyframe indexes as 1-origin if starting at non-zero.
mov: Take stps entries into consideration also about key_off.
Remove lowres video decoding

Conflicts:
ffmpeg.c
ffplay.c
libavcodec/arm/vp8dsp_init_arm.c
libavcodec/libopenjpegdec.c
libavcodec/mjpegdec.c
libavcodec/mpegvideo.c
libavcodec/utils.c
libavformat/mov.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2012/04/23 05:26:42
Showing 52 changed files
... ...
@@ -565,6 +565,14 @@ int opt_cpuflags(const char *opt, const char *arg)
565 565
         { "fma4"    , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_FMA4     },    .unit = "flags" },
566 566
         { "3dnow"   , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_3DNOW    },    .unit = "flags" },
567 567
         { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_3DNOWEXT },    .unit = "flags" },
568
+
569
+        { "armv5te",  NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ARMV5TE  },    .unit = "flags" },
570
+        { "armv6",    NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ARMV6    },    .unit = "flags" },
571
+        { "armv6t2",  NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ARMV6T2  },    .unit = "flags" },
572
+        { "vfp",      NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_VFP      },    .unit = "flags" },
573
+        { "vfpv3",    NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_VFPV3    },    .unit = "flags" },
574
+        { "neon",     NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_NEON     },    .unit = "flags" },
575
+
568 576
         { NULL },
569 577
     };
570 578
     static const AVClass class = {
... ...
@@ -260,7 +260,6 @@ static int64_t duration = AV_NOPTS_VALUE;
260 260
 static int workaround_bugs = 1;
261 261
 static int fast = 0;
262 262
 static int genpts = 0;
263
-static int lowres = 0;
264 263
 static int idct = FF_IDCT_AUTO;
265 264
 static enum AVDiscard skip_frame       = AVDISCARD_DEFAULT;
266 265
 static enum AVDiscard skip_idct        = AVDISCARD_DEFAULT;
... ...
@@ -1325,7 +1324,7 @@ static void alloc_picture(void *opaque)
1325 1325
         /* SDL allocates a buffer smaller than requested if the video
1326 1326
          * overlay hardware is unable to support the requested size. */
1327 1327
         fprintf(stderr, "Error: the video system does not support an image\n"
1328
-                        "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
1328
+                        "size of %dx%d pixels. Try using -vf \"scale=w:h\"\n"
1329 1329
                         "to reduce the image size.\n", vp->width, vp->height );
1330 1330
         do_exit(is);
1331 1331
     }
... ...
@@ -3085,7 +3084,6 @@ static const OptionDef options[] = {
3085 3085
     { "fast", OPT_BOOL | OPT_EXPERT, { (void*)&fast }, "non spec compliant optimizations", "" },
3086 3086
     { "genpts", OPT_BOOL | OPT_EXPERT, { (void*)&genpts }, "generate pts", "" },
3087 3087
     { "drp", OPT_INT | HAS_ARG | OPT_EXPERT, { (void*)&decoder_reorder_pts }, "let decoder reorder pts 0=off 1=on -1=auto", ""},
3088
-    { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT, { (void*)&lowres }, "", "" },
3089 3088
     { "skiploop", OPT_INT | HAS_ARG | OPT_EXPERT, { (void*)&skip_loop_filter }, "", "" },
3090 3089
     { "skipframe", OPT_INT | HAS_ARG | OPT_EXPERT, { (void*)&skip_frame }, "", "" },
3091 3090
     { "skipidct", OPT_INT | HAS_ARG | OPT_EXPERT, { (void*)&skip_idct }, "", "" },
... ...
@@ -336,7 +336,7 @@ void ff_dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx)
336 336
     put_pixels_clamped_axp_p = c->put_pixels_clamped;
337 337
     add_pixels_clamped_axp_p = c->add_pixels_clamped;
338 338
 
339
-    if (!avctx->lowres && avctx->bits_per_raw_sample <= 8 &&
339
+    if (avctx->bits_per_raw_sample <= 8 &&
340 340
         (avctx->idct_algo == FF_IDCT_AUTO ||
341 341
          avctx->idct_algo == FF_IDCT_SIMPLEALPHA)) {
342 342
         c->idct_put = ff_simple_idct_put_axp;
... ...
@@ -19,6 +19,8 @@
19 19
  */
20 20
 
21 21
 #include <stdint.h>
22
+
23
+#include "libavutil/arm/cpu.h"
22 24
 #include "libavutil/attributes.h"
23 25
 #include "libavcodec/ac3dsp.h"
24 26
 #include "config.h"
... ...
@@ -47,13 +49,15 @@ void ff_ac3_update_bap_counts_arm(uint16_t mant_cnt[16], uint8_t *bap, int len);
47 47
 
48 48
 av_cold void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact)
49 49
 {
50
+    int cpu_flags = av_get_cpu_flags();
51
+
50 52
     c->update_bap_counts         = ff_ac3_update_bap_counts_arm;
51 53
 
52
-    if (HAVE_ARMV6) {
54
+    if (have_armv6(cpu_flags)) {
53 55
         c->bit_alloc_calc_bap    = ff_ac3_bit_alloc_calc_bap_armv6;
54 56
     }
55 57
 
56
-    if (HAVE_NEON) {
58
+    if (have_neon(cpu_flags)) {
57 59
         c->ac3_exponent_min      = ff_ac3_exponent_min_neon;
58 60
         c->ac3_max_msb_abs_int16 = ff_ac3_max_msb_abs_int16_neon;
59 61
         c->ac3_lshift_int16      = ff_ac3_lshift_int16_neon;
... ...
@@ -19,6 +19,8 @@
19 19
  */
20 20
 
21 21
 #include "config.h"
22
+
23
+#include "libavutil/arm/cpu.h"
22 24
 #include "libavutil/attributes.h"
23 25
 #include "libavcodec/dcadsp.h"
24 26
 
... ...
@@ -27,6 +29,8 @@ void ff_dca_lfe_fir_neon(float *out, const float *in, const float *coefs,
27 27
 
28 28
 av_cold void ff_dcadsp_init_arm(DCADSPContext *s)
29 29
 {
30
-    if (HAVE_NEON)
30
+    int cpu_flags = av_get_cpu_flags();
31
+
32
+    if (have_neon(cpu_flags))
31 33
         s->lfe_fir = ff_dca_lfe_fir_neon;
32 34
 }
... ...
@@ -19,6 +19,7 @@
19 19
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 20
  */
21 21
 
22
+#include "libavutil/arm/cpu.h"
22 23
 #include "libavcodec/dsputil.h"
23 24
 #include "dsputil_arm.h"
24 25
 
... ...
@@ -76,11 +77,12 @@ static void simple_idct_arm_add(uint8_t *dest, int line_size, DCTELEM *block)
76 76
 void ff_dsputil_init_arm(DSPContext* c, AVCodecContext *avctx)
77 77
 {
78 78
     const int high_bit_depth = avctx->bits_per_raw_sample > 8;
79
+    int cpu_flags = av_get_cpu_flags();
79 80
 
80 81
     ff_put_pixels_clamped = c->put_pixels_clamped;
81 82
     ff_add_pixels_clamped = c->add_pixels_clamped;
82 83
 
83
-    if (!avctx->lowres && avctx->bits_per_raw_sample <= 8) {
84
+    if (avctx->bits_per_raw_sample <= 8) {
84 85
         if(avctx->idct_algo == FF_IDCT_AUTO ||
85 86
            avctx->idct_algo == FF_IDCT_ARM){
86 87
             c->idct_put              = j_rev_dct_arm_put;
... ...
@@ -117,8 +119,8 @@ void ff_dsputil_init_arm(DSPContext* c, AVCodecContext *avctx)
117 117
     c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_arm;
118 118
     }
119 119
 
120
-    if (HAVE_ARMV5TE) ff_dsputil_init_armv5te(c, avctx);
121
-    if (HAVE_ARMV6)   ff_dsputil_init_armv6(c, avctx);
122
-    if (HAVE_ARMVFP)  ff_dsputil_init_vfp(c, avctx);
123
-    if (HAVE_NEON)    ff_dsputil_init_neon(c, avctx);
120
+    if (have_armv5te(cpu_flags)) ff_dsputil_init_armv5te(c, avctx);
121
+    if (have_armv6(cpu_flags))   ff_dsputil_init_armv6(c, avctx);
122
+    if (have_vfp(cpu_flags))     ff_dsputil_init_vfp(c, avctx);
123
+    if (have_neon(cpu_flags))    ff_dsputil_init_neon(c, avctx);
124 124
 }
... ...
@@ -29,7 +29,7 @@ void ff_prefetch_arm(void *mem, int stride, int h);
29 29
 
30 30
 av_cold void ff_dsputil_init_armv5te(DSPContext *c, AVCodecContext *avctx)
31 31
 {
32
-    if (!avctx->lowres && avctx->bits_per_raw_sample <= 8 &&
32
+    if (avctx->bits_per_raw_sample <= 8 &&
33 33
         (avctx->idct_algo == FF_IDCT_AUTO ||
34 34
          avctx->idct_algo == FF_IDCT_SIMPLEARMV5TE)) {
35 35
         c->idct_put              = ff_simple_idct_put_armv5te;
... ...
@@ -74,7 +74,7 @@ av_cold void ff_dsputil_init_armv6(DSPContext *c, AVCodecContext *avctx)
74 74
 {
75 75
     const int high_bit_depth = avctx->bits_per_raw_sample > 8;
76 76
 
77
-    if (!avctx->lowres && avctx->bits_per_raw_sample <= 8 &&
77
+    if (avctx->bits_per_raw_sample <= 8 &&
78 78
         (avctx->idct_algo == FF_IDCT_AUTO ||
79 79
          avctx->idct_algo == FF_IDCT_SIMPLEARMV6)) {
80 80
         c->idct_put              = ff_simple_idct_put_armv6;
... ...
@@ -182,7 +182,7 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx)
182 182
 {
183 183
     const int high_bit_depth = avctx->bits_per_raw_sample > 8;
184 184
 
185
-    if (!avctx->lowres && avctx->bits_per_raw_sample <= 8) {
185
+    if (avctx->bits_per_raw_sample <= 8) {
186 186
         if (avctx->idct_algo == FF_IDCT_AUTO ||
187 187
             avctx->idct_algo == FF_IDCT_SIMPLENEON) {
188 188
             c->idct_put              = ff_simple_idct_put_neon;
... ...
@@ -18,6 +18,7 @@
18 18
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 19
  */
20 20
 
21
+#include "libavutil/arm/cpu.h"
21 22
 #include "libavcodec/dsputil.h"
22 23
 #include "dsputil_arm.h"
23 24
 
... ...
@@ -28,7 +29,9 @@ void ff_vector_fmul_reverse_vfp(float *dst, const float *src0,
28 28
 
29 29
 void ff_dsputil_init_vfp(DSPContext* c, AVCodecContext *avctx)
30 30
 {
31
-    if (!HAVE_VFPV3)
31
+    int cpu_flags = av_get_cpu_flags();
32
+
33
+    if (!have_vfpv3(cpu_flags))
32 34
         c->vector_fmul = ff_vector_fmul_vfp;
33 35
     c->vector_fmul_reverse = ff_vector_fmul_reverse_vfp;
34 36
 }
... ...
@@ -18,6 +18,8 @@
18 18
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 19
  */
20 20
 
21
+#include "libavutil/arm/cpu.h"
22
+
21 23
 #define CONFIG_FFT_FLOAT 0
22 24
 #include "libavcodec/fft.h"
23 25
 
... ...
@@ -27,7 +29,9 @@ void ff_mdct_fixed_calcw_neon(FFTContext *s, FFTDouble *o, const FFTSample *i);
27 27
 
28 28
 av_cold void ff_fft_fixed_init_arm(FFTContext *s)
29 29
 {
30
-    if (HAVE_NEON) {
30
+    int cpu_flags = av_get_cpu_flags();
31
+
32
+    if (have_neon(cpu_flags)) {
31 33
         s->fft_permutation = FF_FFT_PERM_SWAP_LSBS;
32 34
         s->fft_calc        = ff_fft_fixed_calc_neon;
33 35
 
... ...
@@ -18,6 +18,7 @@
18 18
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 19
  */
20 20
 
21
+#include "libavutil/arm/cpu.h"
21 22
 #include "libavcodec/fft.h"
22 23
 #include "libavcodec/rdft.h"
23 24
 #include "libavcodec/synth_filter.h"
... ...
@@ -39,7 +40,9 @@ void ff_synth_filter_float_neon(FFTContext *imdct,
39 39
 
40 40
 av_cold void ff_fft_init_arm(FFTContext *s)
41 41
 {
42
-    if (HAVE_NEON) {
42
+    int cpu_flags = av_get_cpu_flags();
43
+
44
+    if (have_neon(cpu_flags)) {
43 45
         s->fft_permute  = ff_fft_permute_neon;
44 46
         s->fft_calc     = ff_fft_calc_neon;
45 47
 #if CONFIG_MDCT
... ...
@@ -54,7 +57,9 @@ av_cold void ff_fft_init_arm(FFTContext *s)
54 54
 #if CONFIG_RDFT
55 55
 av_cold void ff_rdft_init_arm(RDFTContext *s)
56 56
 {
57
-    if (HAVE_NEON)
57
+    int cpu_flags = av_get_cpu_flags();
58
+
59
+    if (have_neon(cpu_flags))
58 60
         s->rdft_calc    = ff_rdft_calc_neon;
59 61
 }
60 62
 #endif
... ...
@@ -62,7 +67,9 @@ av_cold void ff_rdft_init_arm(RDFTContext *s)
62 62
 #if CONFIG_DCA_DECODER
63 63
 av_cold void ff_synth_filter_init_arm(SynthFilterContext *s)
64 64
 {
65
-    if (HAVE_NEON)
65
+    int cpu_flags = av_get_cpu_flags();
66
+
67
+    if (have_neon(cpu_flags))
66 68
         s->synth_filter_float = ff_synth_filter_float_neon;
67 69
 }
68 70
 #endif
... ...
@@ -20,6 +20,7 @@
20 20
 
21 21
 #include <stdint.h>
22 22
 
23
+#include "libavutil/arm/cpu.h"
23 24
 #include "libavcodec/avcodec.h"
24 25
 #include "libavcodec/fmtconvert.h"
25 26
 
... ...
@@ -33,11 +34,13 @@ void ff_float_to_int16_vfp(int16_t *dst, const float *src, long len);
33 33
 
34 34
 void ff_fmt_convert_init_arm(FmtConvertContext *c, AVCodecContext *avctx)
35 35
 {
36
-    if (HAVE_ARMVFP && HAVE_ARMV6) {
36
+    int cpu_flags = av_get_cpu_flags();
37
+
38
+    if (have_vfp(cpu_flags) && have_armv6(cpu_flags)) {
37 39
         c->float_to_int16 = ff_float_to_int16_vfp;
38 40
     }
39 41
 
40
-    if (HAVE_NEON) {
42
+    if (have_neon(cpu_flags)) {
41 43
         c->int32_to_float_fmul_scalar = ff_int32_to_float_fmul_scalar_neon;
42 44
 
43 45
         if (!(avctx->flags & CODEC_FLAG_BITEXACT)) {
... ...
@@ -20,6 +20,7 @@
20 20
 
21 21
 #include <stdint.h>
22 22
 
23
+#include "libavutil/arm/cpu.h"
23 24
 #include "libavcodec/dsputil.h"
24 25
 #include "libavcodec/h264dsp.h"
25 26
 
... ...
@@ -99,5 +100,8 @@ static void ff_h264dsp_init_neon(H264DSPContext *c, const int bit_depth, const i
99 99
 
100 100
 void ff_h264dsp_init_arm(H264DSPContext *c, const int bit_depth, const int chroma_format_idc)
101 101
 {
102
-    if (HAVE_NEON) ff_h264dsp_init_neon(c, bit_depth, chroma_format_idc);
102
+    int cpu_flags = av_get_cpu_flags();
103
+
104
+    if (have_neon(cpu_flags))
105
+        ff_h264dsp_init_neon(c, bit_depth, chroma_format_idc);
103 106
 }
... ...
@@ -20,6 +20,7 @@
20 20
 
21 21
 #include <stdint.h>
22 22
 
23
+#include "libavutil/arm/cpu.h"
23 24
 #include "libavcodec/h264pred.h"
24 25
 
25 26
 void ff_pred16x16_vert_neon(uint8_t *src, int stride);
... ...
@@ -77,5 +78,8 @@ static void ff_h264_pred_init_neon(H264PredContext *h, int codec_id, const int b
77 77
 
78 78
 void ff_h264_pred_init_arm(H264PredContext *h, int codec_id, int bit_depth, const int chroma_format_idc)
79 79
 {
80
-    if (HAVE_NEON)    ff_h264_pred_init_neon(h, codec_id, bit_depth, chroma_format_idc);
80
+    int cpu_flags = av_get_cpu_flags();
81
+
82
+    if (have_neon(cpu_flags))
83
+        ff_h264_pred_init_neon(h, codec_id, bit_depth, chroma_format_idc);
81 84
 }
... ...
@@ -19,6 +19,8 @@
19 19
  */
20 20
 
21 21
 #include <stdint.h>
22
+
23
+#include "libavutil/arm/cpu.h"
22 24
 #include "libavcodec/mpegaudiodsp.h"
23 25
 #include "config.h"
24 26
 
... ...
@@ -27,7 +29,9 @@ void ff_mpadsp_apply_window_fixed_armv6(int32_t *synth_buf, int32_t *window,
27 27
 
28 28
 void ff_mpadsp_init_arm(MPADSPContext *s)
29 29
 {
30
-    if (HAVE_ARMV6) {
30
+    int cpu_flags = av_get_cpu_flags();
31
+
32
+    if (have_armv6(cpu_flags)) {
31 33
         s->apply_window_fixed = ff_mpadsp_apply_window_fixed_armv6;
32 34
     }
33 35
 }
... ...
@@ -18,6 +18,7 @@
18 18
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 19
  */
20 20
 
21
+#include "libavutil/arm/cpu.h"
21 22
 #include "libavcodec/avcodec.h"
22 23
 #include "libavcodec/dsputil.h"
23 24
 #include "libavcodec/mpegvideo.h"
... ...
@@ -40,11 +41,12 @@ void ff_dct_unquantize_h263_intra_neon(MpegEncContext *s, DCTELEM *block,
40 40
 
41 41
 void ff_MPV_common_init_arm(MpegEncContext *s)
42 42
 {
43
-#if HAVE_ARMV5TE
44
-    ff_MPV_common_init_armv5te(s);
45
-#endif
43
+    int cpu_flags = av_get_cpu_flags();
44
+
45
+    if (have_armv5te(cpu_flags))
46
+        ff_MPV_common_init_armv5te(s);
46 47
 
47
-    if (HAVE_NEON) {
48
+    if (have_neon(cpu_flags)) {
48 49
         s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_neon;
49 50
         s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_neon;
50 51
     }
... ...
@@ -19,6 +19,7 @@
19 19
  */
20 20
 
21 21
 #include "config.h"
22
+#include "libavutil/arm/cpu.h"
22 23
 #include "libavutil/attributes.h"
23 24
 #include "libavcodec/sbrdsp.h"
24 25
 
... ...
@@ -51,7 +52,9 @@ void ff_sbr_hf_apply_noise_3_neon(float Y[64][2], const float *s_m,
51 51
 
52 52
 av_cold void ff_sbrdsp_init_arm(SBRDSPContext *s)
53 53
 {
54
-    if (HAVE_NEON) {
54
+    int cpu_flags = av_get_cpu_flags();
55
+
56
+    if (have_neon(cpu_flags)) {
55 57
         s->sum64x5 = ff_sbr_sum64x5_neon;
56 58
         s->sum_square = ff_sbr_sum_square_neon;
57 59
         s->neg_odd_64 = ff_sbr_neg_odd_64_neon;
... ...
@@ -19,6 +19,8 @@
19 19
  */
20 20
 
21 21
 #include <stdint.h>
22
+
23
+#include "libavutil/arm/cpu.h"
22 24
 #include "libavcodec/avcodec.h"
23 25
 #include "libavcodec/vp56dsp.h"
24 26
 
... ...
@@ -27,7 +29,9 @@ void ff_vp6_edge_filter_ver_neon(uint8_t *yuv, int stride, int t);
27 27
 
28 28
 void ff_vp56dsp_init_arm(VP56DSPContext *s, enum CodecID codec)
29 29
 {
30
-    if (codec != CODEC_ID_VP5 && HAVE_NEON) {
30
+    int cpu_flags = av_get_cpu_flags();
31
+
32
+    if (codec != CODEC_ID_VP5 && have_neon(cpu_flags)) {
31 33
         s->edge_filter_hor = ff_vp6_edge_filter_hor_neon;
32 34
         s->edge_filter_ver = ff_vp6_edge_filter_ver_neon;
33 35
     }
... ...
@@ -17,6 +17,8 @@
17 17
  */
18 18
 
19 19
 #include <stdint.h>
20
+
21
+#include "libavutil/arm/cpu.h"
20 22
 #include "libavcodec/vp8dsp.h"
21 23
 
22 24
 void ff_vp8_luma_dc_wht_dc_armv6(DCTELEM block[4][4][16], DCTELEM dc[16]);
... ...
@@ -301,7 +303,9 @@ av_cold void ff_vp8dsp_init_arm(VP8DSPContext *dsp)
301 301
         dsp->put_vp8_bilinear_pixels_tab[2][2][0] = ff_put_vp8_bilin4_v_##opt; \
302 302
         dsp->put_vp8_bilinear_pixels_tab[2][2][1] = ff_put_vp8_bilin4_hv_##opt; \
303 303
         dsp->put_vp8_bilinear_pixels_tab[2][2][2] = ff_put_vp8_bilin4_hv_##opt
304
-    if (HAVE_NEON) {
304
+    int cpu_flags = av_get_cpu_flags();
305
+
306
+    if (have_neon(cpu_flags)) {
305 307
         set_func_ptrs(neon);
306 308
     } else if (HAVE_ARMV6) {
307 309
         set_func_ptrs(armv6);
... ...
@@ -1451,7 +1451,7 @@ typedef struct AVCodecContext {
1451 1451
     int width, height;
1452 1452
 
1453 1453
     /**
1454
-     * Bitstream width / height, may be different from width/height if lowres enabled.
1454
+     * Bitstream width / height, may be different from width/height.
1455 1455
      * - encoding: unused
1456 1456
      * - decoding: Set by user before init if known. Codec should override / dynamically change if needed.
1457 1457
      */
... ...
@@ -2649,7 +2649,7 @@ typedef struct AVCodecContext {
2649 2649
      * - encoding: unused
2650 2650
      * - decoding: Set by user.
2651 2651
      */
2652
-     int lowres;
2652
+    attribute_deprecated int lowres;
2653 2653
 
2654 2654
     /**
2655 2655
      * the picture in the bitstream
... ...
@@ -2920,7 +2920,7 @@ typedef struct AVCodec {
2920 2920
     const int *supported_samplerates;       ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
2921 2921
     const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
2922 2922
     const uint64_t *channel_layouts;         ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
2923
-    uint8_t max_lowres;                     ///< maximum value for lowres supported by the decoder
2923
+    attribute_deprecated uint8_t max_lowres; ///< maximum value for lowres supported by the decoder
2924 2924
     const AVClass *priv_class;              ///< AVClass for the private context
2925 2925
     const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
2926 2926
 
... ...
@@ -381,38 +381,6 @@ void ff_put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
381 381
     }
382 382
 }
383 383
 
384
-static void put_pixels_clamped4_c(const DCTELEM *block, uint8_t *restrict pixels,
385
-                                 int line_size)
386
-{
387
-    int i;
388
-
389
-    /* read the pixels */
390
-    for(i=0;i<4;i++) {
391
-        pixels[0] = av_clip_uint8(block[0]);
392
-        pixels[1] = av_clip_uint8(block[1]);
393
-        pixels[2] = av_clip_uint8(block[2]);
394
-        pixels[3] = av_clip_uint8(block[3]);
395
-
396
-        pixels += line_size;
397
-        block += 8;
398
-    }
399
-}
400
-
401
-static void put_pixels_clamped2_c(const DCTELEM *block, uint8_t *restrict pixels,
402
-                                 int line_size)
403
-{
404
-    int i;
405
-
406
-    /* read the pixels */
407
-    for(i=0;i<2;i++) {
408
-        pixels[0] = av_clip_uint8(block[0]);
409
-        pixels[1] = av_clip_uint8(block[1]);
410
-
411
-        pixels += line_size;
412
-        block += 8;
413
-    }
414
-}
415
-
416 384
 void ff_put_signed_pixels_clamped_c(const DCTELEM *block,
417 385
                                     uint8_t *restrict pixels,
418 386
                                     int line_size)
... ...
@@ -454,36 +422,6 @@ void ff_add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
454 454
     }
455 455
 }
456 456
 
457
-static void add_pixels_clamped4_c(const DCTELEM *block, uint8_t *restrict pixels,
458
-                          int line_size)
459
-{
460
-    int i;
461
-
462
-    /* read the pixels */
463
-    for(i=0;i<4;i++) {
464
-        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
465
-        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
466
-        pixels[2] = av_clip_uint8(pixels[2] + block[2]);
467
-        pixels[3] = av_clip_uint8(pixels[3] + block[3]);
468
-        pixels += line_size;
469
-        block += 8;
470
-    }
471
-}
472
-
473
-static void add_pixels_clamped2_c(const DCTELEM *block, uint8_t *restrict pixels,
474
-                          int line_size)
475
-{
476
-    int i;
477
-
478
-    /* read the pixels */
479
-    for(i=0;i<2;i++) {
480
-        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
481
-        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
482
-        pixels += line_size;
483
-        block += 8;
484
-    }
485
-}
486
-
487 457
 static int sum_abs_dctelem_c(DCTELEM *block)
488 458
 {
489 459
     int sum=0, i;
... ...
@@ -2746,37 +2684,6 @@ static void ff_jref_idct_add(uint8_t *dest, int line_size, DCTELEM *block)
2746 2746
     ff_add_pixels_clamped_c(block, dest, line_size);
2747 2747
 }
2748 2748
 
2749
-static void ff_jref_idct4_put(uint8_t *dest, int line_size, DCTELEM *block)
2750
-{
2751
-    ff_j_rev_dct4 (block);
2752
-    put_pixels_clamped4_c(block, dest, line_size);
2753
-}
2754
-static void ff_jref_idct4_add(uint8_t *dest, int line_size, DCTELEM *block)
2755
-{
2756
-    ff_j_rev_dct4 (block);
2757
-    add_pixels_clamped4_c(block, dest, line_size);
2758
-}
2759
-
2760
-static void ff_jref_idct2_put(uint8_t *dest, int line_size, DCTELEM *block)
2761
-{
2762
-    ff_j_rev_dct2 (block);
2763
-    put_pixels_clamped2_c(block, dest, line_size);
2764
-}
2765
-static void ff_jref_idct2_add(uint8_t *dest, int line_size, DCTELEM *block)
2766
-{
2767
-    ff_j_rev_dct2 (block);
2768
-    add_pixels_clamped2_c(block, dest, line_size);
2769
-}
2770
-
2771
-static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block)
2772
-{
2773
-    dest[0] = av_clip_uint8((block[0] + 4)>>3);
2774
-}
2775
-static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block)
2776
-{
2777
-    dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
2778
-}
2779
-
2780 2749
 static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; }
2781 2750
 
2782 2751
 /* init static data */
... ...
@@ -2843,28 +2750,12 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx)
2843 2843
     }
2844 2844
 #endif //CONFIG_ENCODERS
2845 2845
 
2846
-    if(avctx->lowres==1){
2847
-        c->idct_put= ff_jref_idct4_put;
2848
-        c->idct_add= ff_jref_idct4_add;
2849
-        c->idct    = ff_j_rev_dct4;
2850
-        c->idct_permutation_type= FF_NO_IDCT_PERM;
2851
-    }else if(avctx->lowres==2){
2852
-        c->idct_put= ff_jref_idct2_put;
2853
-        c->idct_add= ff_jref_idct2_add;
2854
-        c->idct    = ff_j_rev_dct2;
2855
-        c->idct_permutation_type= FF_NO_IDCT_PERM;
2856
-    }else if(avctx->lowres==3){
2857
-        c->idct_put= ff_jref_idct1_put;
2858
-        c->idct_add= ff_jref_idct1_add;
2859
-        c->idct    = ff_j_rev_dct1;
2860
-        c->idct_permutation_type= FF_NO_IDCT_PERM;
2861
-    }else{
2862
-        if (avctx->bits_per_raw_sample == 10) {
2863
-            c->idct_put              = ff_simple_idct_put_10;
2864
-            c->idct_add              = ff_simple_idct_add_10;
2865
-            c->idct                  = ff_simple_idct_10;
2866
-            c->idct_permutation_type = FF_NO_IDCT_PERM;
2867
-        } else {
2846
+    if (avctx->bits_per_raw_sample == 10) {
2847
+        c->idct_put              = ff_simple_idct_put_10;
2848
+        c->idct_add              = ff_simple_idct_add_10;
2849
+        c->idct                  = ff_simple_idct_10;
2850
+        c->idct_permutation_type = FF_NO_IDCT_PERM;
2851
+    } else {
2868 2852
         if(avctx->idct_algo==FF_IDCT_INT){
2869 2853
             c->idct_put= ff_jref_idct_put;
2870 2854
             c->idct_add= ff_jref_idct_add;
... ...
@@ -2895,7 +2786,6 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx)
2895 2895
             c->idct     = ff_simple_idct_8;
2896 2896
             c->idct_permutation_type= FF_NO_IDCT_PERM;
2897 2897
         }
2898
-        }
2899 2898
     }
2900 2899
 
2901 2900
     c->diff_pixels = diff_pixels_c;
... ...
@@ -46,9 +46,6 @@ void ff_fdct248_islow_8(DCTELEM *data);
46 46
 void ff_fdct248_islow_10(DCTELEM *data);
47 47
 
48 48
 void ff_j_rev_dct (DCTELEM *data);
49
-void ff_j_rev_dct4 (DCTELEM *data);
50
-void ff_j_rev_dct2 (DCTELEM *data);
51
-void ff_j_rev_dct1 (DCTELEM *data);
52 49
 void ff_wmv2_idct_c(DCTELEM *data);
53 50
 
54 51
 void ff_fdct_mmx(DCTELEM *block);
... ...
@@ -311,13 +311,7 @@ av_cold int ff_dvvideo_init(AVCodecContext *avctx)
311 311
     /* 248DCT setup */
312 312
     s->fdct[1]     = dsp.fdct248;
313 313
     s->idct_put[1] = ff_simple_idct248_put;  // FIXME: need to add it to DSP
314
-    if (avctx->lowres){
315
-        for (i = 0; i < 64; i++){
316
-            int j = ff_zigzag248_direct[i];
317
-            s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
318
-        }
319
-    }else
320
-        memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
314
+    memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
321 315
 
322 316
     avctx->coded_frame = &s->picture;
323 317
     s->avctx = avctx;
... ...
@@ -144,7 +144,7 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
144 144
     LOCAL_ALIGNED_16(DCTELEM, sblock, [5*DV_MAX_BPM], [64]);
145 145
     LOCAL_ALIGNED_16(uint8_t, mb_bit_buffer, [  80 + FF_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
146 146
     LOCAL_ALIGNED_16(uint8_t, vs_bit_buffer, [5*80 + FF_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
147
-    const int log2_blocksize = 3-s->avctx->lowres;
147
+    const int log2_blocksize = 3;
148 148
     int is_field_mode[5];
149 149
 
150 150
     assert((((int)mb_bit_buffer) & 7) == 0);
... ...
@@ -382,6 +382,5 @@ AVCodec ff_dvvideo_decoder = {
382 382
     .close          = dvvideo_close,
383 383
     .decode         = dvvideo_decode_frame,
384 384
     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS,
385
-    .max_lowres     = 3,
386 385
     .long_name      = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
387 386
 };
... ...
@@ -907,7 +907,7 @@ void ff_er_frame_end(MpegEncContext *s)
907 907
 
908 908
     /* We do not support ER of field pictures yet,
909 909
      * though it should not crash if enabled. */
910
-    if (!s->err_recognition || s->error_count == 0 || s->avctx->lowres ||
910
+    if (!s->err_recognition || s->error_count == 0                     ||
911 911
         s->avctx->hwaccel                                              ||
912 912
         s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU          ||
913 913
         s->picture_structure != PICT_FRAME                             ||
... ...
@@ -127,7 +127,6 @@ AVCodec ff_flv_decoder = {
127 127
     .close          = ff_h263_decode_end,
128 128
     .decode         = ff_h263_decode_frame,
129 129
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
130
-    .max_lowres     = 3,
131 130
     .long_name      = NULL_IF_CONFIG_SMALL("Flash Video (FLV) / Sorenson Spark / Sorenson H.263"),
132 131
     .pix_fmts       = ff_pixfmt_list_420,
133 132
 };
... ...
@@ -658,6 +658,5 @@ AVCodec ff_h261_decoder = {
658 658
     .close          = h261_decode_end,
659 659
     .decode         = h261_decode_frame,
660 660
     .capabilities   = CODEC_CAP_DR1,
661
-    .max_lowres     = 3,
662 661
     .long_name      = NULL_IF_CONFIG_SMALL("H.261"),
663 662
 };
... ...
@@ -151,7 +151,7 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){
151 151
 
152 152
 static int decode_slice(MpegEncContext *s){
153 153
     const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F;
154
-    const int mb_size= 16>>s->avctx->lowres;
154
+    const int mb_size = 16;
155 155
     s->last_resync_gb= s->gb;
156 156
     s->first_slice_line= 1;
157 157
 
... ...
@@ -764,7 +764,6 @@ AVCodec ff_h263_decoder = {
764 764
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
765 765
                       CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
766 766
     .flush          = ff_mpeg_flush,
767
-    .max_lowres     = 3,
768 767
     .long_name      = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
769 768
     .pix_fmts       = ff_hwaccel_pixfmt_list_420,
770 769
 };
... ...
@@ -716,7 +716,6 @@ av_cold void ff_intrax8_common_end(IntraX8Context * w)
716 716
  * The parent codec must call MPV_frame_start(), ff_er_frame_start() before calling this function.
717 717
  * The parent codec must call ff_er_frame_end(), MPV_frame_end() after calling this function.
718 718
  * This function does not use MPV_decode_mb().
719
- * lowres decoding is theoretically impossible.
720 719
  * @param w pointer to IntraX8Context
721 720
  * @param dquant doubled quantizer, it would be odd in case of VC-1 halfpq==1.
722 721
  * @param quant_offset offset away from zero
... ...
@@ -940,216 +940,3 @@ void ff_j_rev_dct(DCTBLOCK data)
940 940
     dataptr++;                  /* advance pointer to next column */
941 941
   }
942 942
 }
943
-
944
-#undef DCTSIZE
945
-#define DCTSIZE 4
946
-#define DCTSTRIDE 8
947
-
948
-void ff_j_rev_dct4(DCTBLOCK data)
949
-{
950
-  int32_t tmp0, tmp1, tmp2, tmp3;
951
-  int32_t tmp10, tmp11, tmp12, tmp13;
952
-  int32_t z1;
953
-  int32_t d0, d2, d4, d6;
954
-  register DCTELEM *dataptr;
955
-  int rowctr;
956
-
957
-  /* Pass 1: process rows. */
958
-  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
959
-  /* furthermore, we scale the results by 2**PASS1_BITS. */
960
-
961
-  data[0] += 4;
962
-
963
-  dataptr = data;
964
-
965
-  for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
966
-    /* Due to quantization, we will usually find that many of the input
967
-     * coefficients are zero, especially the AC terms.  We can exploit this
968
-     * by short-circuiting the IDCT calculation for any row in which all
969
-     * the AC terms are zero.  In that case each output is equal to the
970
-     * DC coefficient (with scale factor as needed).
971
-     * With typical images and quantization tables, half or more of the
972
-     * row DCT calculations can be simplified this way.
973
-     */
974
-
975
-    register int *idataptr = (int*)dataptr;
976
-
977
-    d0 = dataptr[0];
978
-    d2 = dataptr[1];
979
-    d4 = dataptr[2];
980
-    d6 = dataptr[3];
981
-
982
-    if ((d2 | d4 | d6) == 0) {
983
-      /* AC terms all zero */
984
-      if (d0) {
985
-          /* Compute a 32 bit value to assign. */
986
-          DCTELEM dcval = (DCTELEM) (d0 << PASS1_BITS);
987
-          register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
988
-
989
-          idataptr[0] = v;
990
-          idataptr[1] = v;
991
-      }
992
-
993
-      dataptr += DCTSTRIDE;     /* advance pointer to next row */
994
-      continue;
995
-    }
996
-
997
-    /* Even part: reverse the even part of the forward DCT. */
998
-    /* The rotator is sqrt(2)*c(-6). */
999
-    if (d6) {
1000
-            if (d2) {
1001
-                    /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
1002
-                    z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
1003
-                    tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
1004
-                    tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
1005
-
1006
-                    tmp0 = (d0 + d4) << CONST_BITS;
1007
-                    tmp1 = (d0 - d4) << CONST_BITS;
1008
-
1009
-                    tmp10 = tmp0 + tmp3;
1010
-                    tmp13 = tmp0 - tmp3;
1011
-                    tmp11 = tmp1 + tmp2;
1012
-                    tmp12 = tmp1 - tmp2;
1013
-            } else {
1014
-                    /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
1015
-                    tmp2 = MULTIPLY(-d6, FIX_1_306562965);
1016
-                    tmp3 = MULTIPLY(d6, FIX_0_541196100);
1017
-
1018
-                    tmp0 = (d0 + d4) << CONST_BITS;
1019
-                    tmp1 = (d0 - d4) << CONST_BITS;
1020
-
1021
-                    tmp10 = tmp0 + tmp3;
1022
-                    tmp13 = tmp0 - tmp3;
1023
-                    tmp11 = tmp1 + tmp2;
1024
-                    tmp12 = tmp1 - tmp2;
1025
-            }
1026
-    } else {
1027
-            if (d2) {
1028
-                    /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
1029
-                    tmp2 = MULTIPLY(d2, FIX_0_541196100);
1030
-                    tmp3 = MULTIPLY(d2, FIX_1_306562965);
1031
-
1032
-                    tmp0 = (d0 + d4) << CONST_BITS;
1033
-                    tmp1 = (d0 - d4) << CONST_BITS;
1034
-
1035
-                    tmp10 = tmp0 + tmp3;
1036
-                    tmp13 = tmp0 - tmp3;
1037
-                    tmp11 = tmp1 + tmp2;
1038
-                    tmp12 = tmp1 - tmp2;
1039
-            } else {
1040
-                    /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
1041
-                    tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
1042
-                    tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
1043
-            }
1044
-      }
1045
-
1046
-    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
1047
-
1048
-    dataptr[0] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);
1049
-    dataptr[1] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);
1050
-    dataptr[2] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);
1051
-    dataptr[3] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);
1052
-
1053
-    dataptr += DCTSTRIDE;       /* advance pointer to next row */
1054
-  }
1055
-
1056
-  /* Pass 2: process columns. */
1057
-  /* Note that we must descale the results by a factor of 8 == 2**3, */
1058
-  /* and also undo the PASS1_BITS scaling. */
1059
-
1060
-  dataptr = data;
1061
-  for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
1062
-    /* Columns of zeroes can be exploited in the same way as we did with rows.
1063
-     * However, the row calculation has created many nonzero AC terms, so the
1064
-     * simplification applies less often (typically 5% to 10% of the time).
1065
-     * On machines with very fast multiplication, it's possible that the
1066
-     * test takes more time than it's worth.  In that case this section
1067
-     * may be commented out.
1068
-     */
1069
-
1070
-    d0 = dataptr[DCTSTRIDE*0];
1071
-    d2 = dataptr[DCTSTRIDE*1];
1072
-    d4 = dataptr[DCTSTRIDE*2];
1073
-    d6 = dataptr[DCTSTRIDE*3];
1074
-
1075
-    /* Even part: reverse the even part of the forward DCT. */
1076
-    /* The rotator is sqrt(2)*c(-6). */
1077
-    if (d6) {
1078
-            if (d2) {
1079
-                    /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
1080
-                    z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
1081
-                    tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
1082
-                    tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
1083
-
1084
-                    tmp0 = (d0 + d4) << CONST_BITS;
1085
-                    tmp1 = (d0 - d4) << CONST_BITS;
1086
-
1087
-                    tmp10 = tmp0 + tmp3;
1088
-                    tmp13 = tmp0 - tmp3;
1089
-                    tmp11 = tmp1 + tmp2;
1090
-                    tmp12 = tmp1 - tmp2;
1091
-            } else {
1092
-                    /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
1093
-                    tmp2 = MULTIPLY(-d6, FIX_1_306562965);
1094
-                    tmp3 = MULTIPLY(d6, FIX_0_541196100);
1095
-
1096
-                    tmp0 = (d0 + d4) << CONST_BITS;
1097
-                    tmp1 = (d0 - d4) << CONST_BITS;
1098
-
1099
-                    tmp10 = tmp0 + tmp3;
1100
-                    tmp13 = tmp0 - tmp3;
1101
-                    tmp11 = tmp1 + tmp2;
1102
-                    tmp12 = tmp1 - tmp2;
1103
-            }
1104
-    } else {
1105
-            if (d2) {
1106
-                    /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
1107
-                    tmp2 = MULTIPLY(d2, FIX_0_541196100);
1108
-                    tmp3 = MULTIPLY(d2, FIX_1_306562965);
1109
-
1110
-                    tmp0 = (d0 + d4) << CONST_BITS;
1111
-                    tmp1 = (d0 - d4) << CONST_BITS;
1112
-
1113
-                    tmp10 = tmp0 + tmp3;
1114
-                    tmp13 = tmp0 - tmp3;
1115
-                    tmp11 = tmp1 + tmp2;
1116
-                    tmp12 = tmp1 - tmp2;
1117
-            } else {
1118
-                    /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
1119
-                    tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
1120
-                    tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
1121
-            }
1122
-    }
1123
-
1124
-    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
1125
-
1126
-    dataptr[DCTSTRIDE*0] = tmp10 >> (CONST_BITS+PASS1_BITS+3);
1127
-    dataptr[DCTSTRIDE*1] = tmp11 >> (CONST_BITS+PASS1_BITS+3);
1128
-    dataptr[DCTSTRIDE*2] = tmp12 >> (CONST_BITS+PASS1_BITS+3);
1129
-    dataptr[DCTSTRIDE*3] = tmp13 >> (CONST_BITS+PASS1_BITS+3);
1130
-
1131
-    dataptr++;                  /* advance pointer to next column */
1132
-  }
1133
-}
1134
-
1135
-void ff_j_rev_dct2(DCTBLOCK data){
1136
-  int d00, d01, d10, d11;
1137
-
1138
-  data[0] += 4;
1139
-  d00 = data[0+0*DCTSTRIDE] + data[1+0*DCTSTRIDE];
1140
-  d01 = data[0+0*DCTSTRIDE] - data[1+0*DCTSTRIDE];
1141
-  d10 = data[0+1*DCTSTRIDE] + data[1+1*DCTSTRIDE];
1142
-  d11 = data[0+1*DCTSTRIDE] - data[1+1*DCTSTRIDE];
1143
-
1144
-  data[0+0*DCTSTRIDE]= (d00 + d10)>>3;
1145
-  data[1+0*DCTSTRIDE]= (d01 + d11)>>3;
1146
-  data[0+1*DCTSTRIDE]= (d00 - d10)>>3;
1147
-  data[1+1*DCTSTRIDE]= (d01 - d11)>>3;
1148
-}
1149
-
1150
-void ff_j_rev_dct1(DCTBLOCK data){
1151
-  data[0] = (data[0] + 4)>>3;
1152
-}
1153
-
1154
-#undef FIX
1155
-#undef CONST_BITS
... ...
@@ -286,7 +286,6 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx,
286 286
     }
287 287
 
288 288
     ctx->dec_params.cp_limit_decoding = NO_LIMITATION;
289
-    ctx->dec_params.cp_reduce = avctx->lowres;
290 289
     // Tie decoder with decoding parameters
291 290
     opj_setup_decoder(dec, &ctx->dec_params);
292 291
     stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size);
... ...
@@ -369,6 +368,6 @@ AVCodec ff_libopenjpeg_decoder = {
369 369
     .decode           = libopenjpeg_decode_frame,
370 370
     .capabilities     = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
371 371
     .max_lowres       = 5,
372
-    .long_name      = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"),
372
+    .long_name        = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"),
373 373
     .init_thread_copy = ONLY_IF_THREADS_ENABLED(libopenjpeg_decode_init_thread_copy),
374 374
 };
... ...
@@ -161,6 +161,5 @@ AVCodec ff_mjpegb_decoder = {
161 161
     .close          = ff_mjpeg_decode_end,
162 162
     .decode         = mjpegb_decode_frame,
163 163
     .capabilities   = CODEC_CAP_DR1,
164
-    .max_lowres     = 3,
165 164
     .long_name      = NULL_IF_CONFIG_SMALL("Apple MJPEG-B"),
166 165
 };
... ...
@@ -941,21 +941,6 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor,
941 941
     return 0;
942 942
 }
943 943
 
944
-static av_always_inline void mjpeg_copy_block(uint8_t *dst, const uint8_t *src,
945
-                                              int linesize, int lowres)
946
-{
947
-    switch (lowres) {
948
-    case 0: copy_block8(dst, src, linesize, linesize, 8);
949
-        break;
950
-    case 1: copy_block4(dst, src, linesize, linesize, 4);
951
-        break;
952
-    case 2: copy_block2(dst, src, linesize, linesize, 2);
953
-        break;
954
-    case 3: *dst = *src;
955
-        break;
956
-    }
957
-}
958
-
959 944
 static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
960 945
                              int Al, const uint8_t *mb_bitmask,
961 946
                              const AVFrame *reference)
... ...
@@ -1018,16 +1003,16 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
1018 1018
                 x = 0;
1019 1019
                 y = 0;
1020 1020
                 for (j = 0; j < n; j++) {
1021
-                    block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1022
-                                     (h * mb_x + x) * 8) >> s->avctx->lowres);
1021
+                    block_offset = ((linesize[c] * (v * mb_y + y) * 8) +
1022
+                                    (h * mb_x + x) * 8);
1023 1023
 
1024 1024
                     if (s->interlaced && s->bottom_field)
1025 1025
                         block_offset += linesize[c] >> 1;
1026 1026
                     ptr = data[c] + block_offset;
1027 1027
                     if (!s->progressive) {
1028 1028
                         if (copy_mb)
1029
-                            mjpeg_copy_block(ptr, reference_data[c] + block_offset,
1030
-                                             linesize[c], s->avctx->lowres);
1029
+                            copy_block8(ptr, reference_data[c] + block_offset,
1030
+                                        linesize[c], linesize[c], 8);
1031 1031
                         else {
1032 1032
                             s->dsp.clear_block(s->block);
1033 1033
                             if (decode_block(s, s->block, i,
... ...
@@ -1829,7 +1814,6 @@ AVCodec ff_mjpeg_decoder = {
1829 1829
     .close          = ff_mjpeg_decode_end,
1830 1830
     .decode         = ff_mjpeg_decode_frame,
1831 1831
     .capabilities   = CODEC_CAP_DR1,
1832
-    .max_lowres     = 3,
1833 1832
     .long_name      = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
1834 1833
     .priv_class     = &mjpegdec_class,
1835 1834
 };
... ...
@@ -1843,6 +1827,5 @@ AVCodec ff_thp_decoder = {
1843 1843
     .close          = ff_mjpeg_decode_end,
1844 1844
     .decode         = ff_mjpeg_decode_frame,
1845 1845
     .capabilities   = CODEC_CAP_DR1,
1846
-    .max_lowres     = 3,
1847 1846
     .long_name      = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
1848 1847
 };
... ...
@@ -1676,7 +1676,6 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
1676 1676
                              const uint8_t **buf, int buf_size)
1677 1677
 {
1678 1678
     AVCodecContext *avctx = s->avctx;
1679
-    const int lowres      = s->avctx->lowres;
1680 1679
     const int field_pic   = s->picture_structure != PICT_FRAME;
1681 1680
 
1682 1681
     s->resync_mb_x =
... ...
@@ -1797,14 +1796,14 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
1797 1797
             }
1798 1798
         }
1799 1799
 
1800
-        s->dest[0] += 16 >> lowres;
1801
-        s->dest[1] +=(16 >> lowres) >> s->chroma_x_shift;
1802
-        s->dest[2] +=(16 >> lowres) >> s->chroma_x_shift;
1800
+        s->dest[0] += 16;
1801
+        s->dest[1] += 16 >> s->chroma_x_shift;
1802
+        s->dest[2] += 16 >> s->chroma_x_shift;
1803 1803
 
1804 1804
         ff_MPV_decode_mb(s, s->block);
1805 1805
 
1806 1806
         if (++s->mb_x >= s->mb_width) {
1807
-            const int mb_size = 16 >> s->avctx->lowres;
1807
+            const int mb_size = 16;
1808 1808
 
1809 1809
             ff_draw_horiz_band(s, mb_size*(s->mb_y >> field_pic), mb_size);
1810 1810
             ff_MPV_report_decode_progress(s);
... ...
@@ -2579,7 +2578,6 @@ AVCodec ff_mpeg1video_decoder = {
2579 2579
                              CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
2580 2580
                              CODEC_CAP_SLICE_THREADS,
2581 2581
     .flush                 = flush,
2582
-    .max_lowres            = 3,
2583 2582
     .long_name             = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
2584 2583
     .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context)
2585 2584
 };
... ...
@@ -2596,7 +2594,6 @@ AVCodec ff_mpeg2video_decoder = {
2596 2596
                       CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
2597 2597
                       CODEC_CAP_SLICE_THREADS,
2598 2598
     .flush          = flush,
2599
-    .max_lowres     = 3,
2600 2599
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-2 video"),
2601 2600
     .profiles       = NULL_IF_CONFIG_SMALL(mpeg2_video_profiles),
2602 2601
 };
... ...
@@ -2327,7 +2327,6 @@ AVCodec ff_mpeg4_decoder = {
2327 2327
                              CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
2328 2328
                              CODEC_CAP_FRAME_THREADS,
2329 2329
     .flush                 = ff_mpeg_flush,
2330
-    .max_lowres            = 3,
2331 2330
     .long_name             = NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
2332 2331
     .pix_fmts              = ff_hwaccel_pixfmt_list_420,
2333 2332
     .profiles              = NULL_IF_CONFIG_SMALL(mpeg4_video_profiles),
... ...
@@ -1784,381 +1784,6 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict)
1784 1784
     }
1785 1785
 }
1786 1786
 
1787
-static inline int hpel_motion_lowres(MpegEncContext *s,
1788
-                                     uint8_t *dest, uint8_t *src,
1789
-                                     int field_based, int field_select,
1790
-                                     int src_x, int src_y,
1791
-                                     int width, int height, int stride,
1792
-                                     int h_edge_pos, int v_edge_pos,
1793
-                                     int w, int h, h264_chroma_mc_func *pix_op,
1794
-                                     int motion_x, int motion_y)
1795
-{
1796
-    const int lowres   = s->avctx->lowres;
1797
-    const int op_index = FFMIN(lowres, 2);
1798
-    const int s_mask   = (2 << lowres) - 1;
1799
-    int emu = 0;
1800
-    int sx, sy;
1801
-
1802
-    if (s->quarter_sample) {
1803
-        motion_x /= 2;
1804
-        motion_y /= 2;
1805
-    }
1806
-
1807
-    sx = motion_x & s_mask;
1808
-    sy = motion_y & s_mask;
1809
-    src_x += motion_x >> lowres + 1;
1810
-    src_y += motion_y >> lowres + 1;
1811
-
1812
-    src   += src_y * stride + src_x;
1813
-
1814
-    if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w,                 0) ||
1815
-        (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
1816
-        s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
1817
-                                (h + 1) << field_based, src_x,
1818
-                                src_y   << field_based,
1819
-                                h_edge_pos,
1820
-                                v_edge_pos);
1821
-        src = s->edge_emu_buffer;
1822
-        emu = 1;
1823
-    }
1824
-
1825
-    sx = (sx << 2) >> lowres;
1826
-    sy = (sy << 2) >> lowres;
1827
-    if (field_select)
1828
-        src += s->linesize;
1829
-    pix_op[op_index](dest, src, stride, h, sx, sy);
1830
-    return emu;
1831
-}
1832
-
1833
-/* apply one mpeg motion vector to the three components */
1834
-static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1835
-                                                uint8_t *dest_y,
1836
-                                                uint8_t *dest_cb,
1837
-                                                uint8_t *dest_cr,
1838
-                                                int field_based,
1839
-                                                int bottom_field,
1840
-                                                int field_select,
1841
-                                                uint8_t **ref_picture,
1842
-                                                h264_chroma_mc_func *pix_op,
1843
-                                                int motion_x, int motion_y,
1844
-                                                int h, int mb_y)
1845
-{
1846
-    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1847
-    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
1848
-        uvsx, uvsy;
1849
-    const int lowres     = s->avctx->lowres;
1850
-    const int op_index   = FFMIN(lowres-1+s->chroma_x_shift, 2);
1851
-    const int block_s    = 8>>lowres;
1852
-    const int s_mask     = (2 << lowres) - 1;
1853
-    const int h_edge_pos = s->h_edge_pos >> lowres;
1854
-    const int v_edge_pos = s->v_edge_pos >> lowres;
1855
-    linesize   = s->current_picture.f.linesize[0] << field_based;
1856
-    uvlinesize = s->current_picture.f.linesize[1] << field_based;
1857
-
1858
-    // FIXME obviously not perfect but qpel will not work in lowres anyway
1859
-    if (s->quarter_sample) {
1860
-        motion_x /= 2;
1861
-        motion_y /= 2;
1862
-    }
1863
-
1864
-    if(field_based){
1865
-        motion_y += (bottom_field - field_select)*((1 << lowres)-1);
1866
-    }
1867
-
1868
-    sx = motion_x & s_mask;
1869
-    sy = motion_y & s_mask;
1870
-    src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
1871
-    src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
1872
-
1873
-    if (s->out_format == FMT_H263) {
1874
-        uvsx    = ((motion_x >> 1) & s_mask) | (sx & 1);
1875
-        uvsy    = ((motion_y >> 1) & s_mask) | (sy & 1);
1876
-        uvsrc_x = src_x >> 1;
1877
-        uvsrc_y = src_y >> 1;
1878
-    } else if (s->out_format == FMT_H261) {
1879
-        // even chroma mv's are full pel in H261
1880
-        mx      = motion_x / 4;
1881
-        my      = motion_y / 4;
1882
-        uvsx    = (2 * mx) & s_mask;
1883
-        uvsy    = (2 * my) & s_mask;
1884
-        uvsrc_x = s->mb_x * block_s + (mx >> lowres);
1885
-        uvsrc_y =    mb_y * block_s + (my >> lowres);
1886
-    } else {
1887
-        if(s->chroma_y_shift){
1888
-            mx      = motion_x / 2;
1889
-            my      = motion_y / 2;
1890
-            uvsx    = mx & s_mask;
1891
-            uvsy    = my & s_mask;
1892
-            uvsrc_x = s->mb_x * block_s                 + (mx >> lowres + 1);
1893
-            uvsrc_y =   (mb_y * block_s >> field_based) + (my >> lowres + 1);
1894
-        } else {
1895
-            if(s->chroma_x_shift){
1896
-            //Chroma422
1897
-                mx = motion_x / 2;
1898
-                uvsx = mx & s_mask;
1899
-                uvsy = motion_y & s_mask;
1900
-                uvsrc_y = src_y;
1901
-                uvsrc_x = s->mb_x*block_s               + (mx >> (lowres+1));
1902
-            } else {
1903
-            //Chroma444
1904
-                uvsx = motion_x & s_mask;
1905
-                uvsy = motion_y & s_mask;
1906
-                uvsrc_x = src_x;
1907
-                uvsrc_y = src_y;
1908
-            }
1909
-        }
1910
-    }
1911
-
1912
-    ptr_y  = ref_picture[0] + src_y   * linesize   + src_x;
1913
-    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1914
-    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1915
-
1916
-    if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s,       0) ||
1917
-        (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
1918
-        s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
1919
-                                s->linesize, 17, 17 + field_based,
1920
-                                src_x, src_y << field_based, h_edge_pos,
1921
-                                v_edge_pos);
1922
-        ptr_y = s->edge_emu_buffer;
1923
-        if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
1924
-            uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
1925
-            s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9,
1926
-                                    9 + field_based,
1927
-                                    uvsrc_x, uvsrc_y << field_based,
1928
-                                    h_edge_pos >> 1, v_edge_pos >> 1);
1929
-            s->dsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9,
1930
-                                    9 + field_based,
1931
-                                    uvsrc_x, uvsrc_y << field_based,
1932
-                                    h_edge_pos >> 1, v_edge_pos >> 1);
1933
-            ptr_cb = uvbuf;
1934
-            ptr_cr = uvbuf + 16;
1935
-        }
1936
-    }
1937
-
1938
-    // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
1939
-    if (bottom_field) {
1940
-        dest_y  += s->linesize;
1941
-        dest_cb += s->uvlinesize;
1942
-        dest_cr += s->uvlinesize;
1943
-    }
1944
-
1945
-    if (field_select) {
1946
-        ptr_y   += s->linesize;
1947
-        ptr_cb  += s->uvlinesize;
1948
-        ptr_cr  += s->uvlinesize;
1949
-    }
1950
-
1951
-    sx = (sx << 2) >> lowres;
1952
-    sy = (sy << 2) >> lowres;
1953
-    pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
1954
-
1955
-    if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
1956
-        uvsx = (uvsx << 2) >> lowres;
1957
-        uvsy = (uvsy << 2) >> lowres;
1958
-        if (h >> s->chroma_y_shift) {
1959
-            pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1960
-            pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1961
-        }
1962
-    }
1963
-    // FIXME h261 lowres loop filter
1964
-}
1965
-
1966
-static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1967
-                                            uint8_t *dest_cb, uint8_t *dest_cr,
1968
-                                            uint8_t **ref_picture,
1969
-                                            h264_chroma_mc_func * pix_op,
1970
-                                            int mx, int my)
1971
-{
1972
-    const int lowres     = s->avctx->lowres;
1973
-    const int op_index   = FFMIN(lowres, 2);
1974
-    const int block_s    = 8 >> lowres;
1975
-    const int s_mask     = (2 << lowres) - 1;
1976
-    const int h_edge_pos = s->h_edge_pos >> lowres + 1;
1977
-    const int v_edge_pos = s->v_edge_pos >> lowres + 1;
1978
-    int emu = 0, src_x, src_y, offset, sx, sy;
1979
-    uint8_t *ptr;
1980
-
1981
-    if (s->quarter_sample) {
1982
-        mx /= 2;
1983
-        my /= 2;
1984
-    }
1985
-
1986
-    /* In case of 8X8, we construct a single chroma motion vector
1987
-       with a special rounding */
1988
-    mx = ff_h263_round_chroma(mx);
1989
-    my = ff_h263_round_chroma(my);
1990
-
1991
-    sx = mx & s_mask;
1992
-    sy = my & s_mask;
1993
-    src_x = s->mb_x * block_s + (mx >> lowres + 1);
1994
-    src_y = s->mb_y * block_s + (my >> lowres + 1);
1995
-
1996
-    offset = src_y * s->uvlinesize + src_x;
1997
-    ptr = ref_picture[1] + offset;
1998
-    if (s->flags & CODEC_FLAG_EMU_EDGE) {
1999
-        if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2000
-            (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2001
-            s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
2002
-                                    9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2003
-            ptr = s->edge_emu_buffer;
2004
-            emu = 1;
2005
-        }
2006
-    }
2007
-    sx = (sx << 2) >> lowres;
2008
-    sy = (sy << 2) >> lowres;
2009
-    pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2010
-
2011
-    ptr = ref_picture[2] + offset;
2012
-    if (emu) {
2013
-        s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2014
-                                src_x, src_y, h_edge_pos, v_edge_pos);
2015
-        ptr = s->edge_emu_buffer;
2016
-    }
2017
-    pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2018
-}
2019
-
2020
-/**
2021
- * motion compensation of a single macroblock
2022
- * @param s context
2023
- * @param dest_y luma destination pointer
2024
- * @param dest_cb chroma cb/u destination pointer
2025
- * @param dest_cr chroma cr/v destination pointer
2026
- * @param dir direction (0->forward, 1->backward)
2027
- * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2028
- * @param pix_op halfpel motion compensation function (average or put normally)
2029
- * the motion vectors are taken from s->mv and the MV type from s->mv_type
2030
- */
2031
-static inline void MPV_motion_lowres(MpegEncContext *s,
2032
-                                     uint8_t *dest_y, uint8_t *dest_cb,
2033
-                                     uint8_t *dest_cr,
2034
-                                     int dir, uint8_t **ref_picture,
2035
-                                     h264_chroma_mc_func *pix_op)
2036
-{
2037
-    int mx, my;
2038
-    int mb_x, mb_y, i;
2039
-    const int lowres  = s->avctx->lowres;
2040
-    const int block_s = 8 >>lowres;
2041
-
2042
-    mb_x = s->mb_x;
2043
-    mb_y = s->mb_y;
2044
-
2045
-    switch (s->mv_type) {
2046
-    case MV_TYPE_16X16:
2047
-        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2048
-                           0, 0, 0,
2049
-                           ref_picture, pix_op,
2050
-                           s->mv[dir][0][0], s->mv[dir][0][1],
2051
-                           2 * block_s, mb_y);
2052
-        break;
2053
-    case MV_TYPE_8X8:
2054
-        mx = 0;
2055
-        my = 0;
2056
-        for (i = 0; i < 4; i++) {
2057
-            hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2058
-                               s->linesize) * block_s,
2059
-                               ref_picture[0], 0, 0,
2060
-                               (2 * mb_x + (i & 1)) * block_s,
2061
-                               (2 * mb_y + (i >> 1)) * block_s,
2062
-                               s->width, s->height, s->linesize,
2063
-                               s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2064
-                               block_s, block_s, pix_op,
2065
-                               s->mv[dir][i][0], s->mv[dir][i][1]);
2066
-
2067
-            mx += s->mv[dir][i][0];
2068
-            my += s->mv[dir][i][1];
2069
-        }
2070
-
2071
-        if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2072
-            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2073
-                                     pix_op, mx, my);
2074
-        break;
2075
-    case MV_TYPE_FIELD:
2076
-        if (s->picture_structure == PICT_FRAME) {
2077
-            /* top field */
2078
-            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2079
-                               1, 0, s->field_select[dir][0],
2080
-                               ref_picture, pix_op,
2081
-                               s->mv[dir][0][0], s->mv[dir][0][1],
2082
-                               block_s, mb_y);
2083
-            /* bottom field */
2084
-            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2085
-                               1, 1, s->field_select[dir][1],
2086
-                               ref_picture, pix_op,
2087
-                               s->mv[dir][1][0], s->mv[dir][1][1],
2088
-                               block_s, mb_y);
2089
-        } else {
2090
-            if (s->picture_structure != s->field_select[dir][0] + 1 &&
2091
-                s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2092
-                ref_picture = s->current_picture_ptr->f.data;
2093
-
2094
-            }
2095
-            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2096
-                               0, 0, s->field_select[dir][0],
2097
-                               ref_picture, pix_op,
2098
-                               s->mv[dir][0][0],
2099
-                               s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2100
-            }
2101
-        break;
2102
-    case MV_TYPE_16X8:
2103
-        for (i = 0; i < 2; i++) {
2104
-            uint8_t **ref2picture;
2105
-
2106
-            if (s->picture_structure == s->field_select[dir][i] + 1 ||
2107
-                s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2108
-                ref2picture = ref_picture;
2109
-            } else {
2110
-                ref2picture = s->current_picture_ptr->f.data;
2111
-            }
2112
-
2113
-            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2114
-                               0, 0, s->field_select[dir][i],
2115
-                               ref2picture, pix_op,
2116
-                               s->mv[dir][i][0], s->mv[dir][i][1] +
2117
-                               2 * block_s * i, block_s, mb_y >> 1);
2118
-
2119
-            dest_y  +=  2 * block_s *  s->linesize;
2120
-            dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2121
-            dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2122
-        }
2123
-        break;
2124
-    case MV_TYPE_DMV:
2125
-        if (s->picture_structure == PICT_FRAME) {
2126
-            for (i = 0; i < 2; i++) {
2127
-                int j;
2128
-                for (j = 0; j < 2; j++) {
2129
-                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2130
-                                       1, j, j ^ i,
2131
-                                       ref_picture, pix_op,
2132
-                                       s->mv[dir][2 * i + j][0],
2133
-                                       s->mv[dir][2 * i + j][1],
2134
-                                       block_s, mb_y);
2135
-                }
2136
-                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2137
-            }
2138
-        } else {
2139
-            for (i = 0; i < 2; i++) {
2140
-                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2141
-                                   0, 0, s->picture_structure != i + 1,
2142
-                                   ref_picture, pix_op,
2143
-                                   s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2144
-                                   2 * block_s, mb_y >> 1);
2145
-
2146
-                // after put we make avg of the same block
2147
-                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2148
-
2149
-                // opposite parity is always in the same
2150
-                // frame if this is second field
2151
-                if (!s->first_field) {
2152
-                    ref_picture = s->current_picture_ptr->f.data;
2153
-                }
2154
-            }
2155
-        }
2156
-        break;
2157
-    default:
2158
-        assert(0);
2159
-    }
2160
-}
2161
-
2162 1787
 /**
2163 1788
  * find the lowest MB row referenced in the MVs
2164 1789
  */
... ...
@@ -2268,7 +1893,7 @@ void ff_clean_intra_table_entries(MpegEncContext *s)
2268 2268
  */
2269 2269
 static av_always_inline
2270 2270
 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2271
-                            int lowres_flag, int is_mpeg12)
2271
+                            int is_mpeg12)
2272 2272
 {
2273 2273
     const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2274 2274
     if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
... ...
@@ -2313,8 +1938,8 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2313 2313
         qpel_mc_func (*op_qpix)[16];
2314 2314
         const int linesize   = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2315 2315
         const int uvlinesize = s->current_picture.f.linesize[1];
2316
-        const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2317
-        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2316
+        const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band;
2317
+        const int block_size = 8;
2318 2318
 
2319 2319
         /* avoid copy if macroblock skipped in last frame too */
2320 2320
         /* skip only during decoding as we might trash the buffers during encoding a bit */
... ...
@@ -2363,31 +1988,19 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2363 2363
                     }
2364 2364
                 }
2365 2365
 
2366
-                if(lowres_flag){
2367
-                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2368
-
2369
-                    if (s->mv_dir & MV_DIR_FORWARD) {
2370
-                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2371
-                        op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2372
-                    }
2373
-                    if (s->mv_dir & MV_DIR_BACKWARD) {
2374
-                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2375
-                    }
2366
+                op_qpix= s->me.qpel_put;
2367
+                if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2368
+                    op_pix = s->dsp.put_pixels_tab;
2376 2369
                 }else{
2377
-                    op_qpix= s->me.qpel_put;
2378
-                    if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2379
-                        op_pix = s->dsp.put_pixels_tab;
2380
-                    }else{
2381
-                        op_pix = s->dsp.put_no_rnd_pixels_tab;
2382
-                    }
2383
-                    if (s->mv_dir & MV_DIR_FORWARD) {
2384
-                        MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2385
-                        op_pix = s->dsp.avg_pixels_tab;
2386
-                        op_qpix= s->me.qpel_avg;
2387
-                    }
2388
-                    if (s->mv_dir & MV_DIR_BACKWARD) {
2389
-                        MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2390
-                    }
2370
+                    op_pix = s->dsp.put_no_rnd_pixels_tab;
2371
+                }
2372
+                if (s->mv_dir & MV_DIR_FORWARD) {
2373
+                    MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2374
+                    op_pix = s->dsp.avg_pixels_tab;
2375
+                    op_qpix= s->me.qpel_avg;
2376
+                }
2377
+                if (s->mv_dir & MV_DIR_BACKWARD) {
2378
+                    MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2391 2379
                 }
2392 2380
             }
2393 2381
 
... ...
@@ -2513,12 +2126,10 @@ skip_idct:
2513 2513
 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2514 2514
 #if !CONFIG_SMALL
2515 2515
     if(s->out_format == FMT_MPEG1) {
2516
-        if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2517
-        else                 MPV_decode_mb_internal(s, block, 0, 1);
2516
+        MPV_decode_mb_internal(s, block, 1);
2518 2517
     } else
2519 2518
 #endif
2520
-    if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2521
-    else                  MPV_decode_mb_internal(s, block, 0, 0);
2519
+        MPV_decode_mb_internal(s, block, 0);
2522 2520
 }
2523 2521
 
2524 2522
 /**
... ...
@@ -2593,7 +2204,7 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2593 2593
 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2594 2594
     const int linesize   = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2595 2595
     const int uvlinesize = s->current_picture.f.linesize[1];
2596
-    const int mb_size= 4 - s->avctx->lowres;
2596
+    const int mb_size= 4;
2597 2597
 
2598 2598
     s->block_index[0]= s->b8_stride*(s->mb_y*2    ) - 2 + s->mb_x*2;
2599 2599
     s->block_index[1]= s->b8_stride*(s->mb_y*2    ) - 1 + s->mb_x*2;
... ...
@@ -793,7 +793,7 @@ extern const enum PixelFormat ff_pixfmt_list_420[];
793 793
 extern const enum PixelFormat ff_hwaccel_pixfmt_list_420[];
794 794
 
795 795
 static inline void ff_update_block_index(MpegEncContext *s){
796
-    const int block_size= 8>>s->avctx->lowres;
796
+    const int block_size = 8;
797 797
 
798 798
     s->block_index[0]+=2;
799 799
     s->block_index[1]+=2;
... ...
@@ -1216,7 +1216,6 @@ AVCodec ff_msmpeg4v1_decoder = {
1216 1216
     .close          = ff_h263_decode_end,
1217 1217
     .decode         = ff_h263_decode_frame,
1218 1218
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
1219
-    .max_lowres     = 3,
1220 1219
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
1221 1220
     .pix_fmts       = ff_pixfmt_list_420,
1222 1221
 };
... ...
@@ -1230,7 +1229,6 @@ AVCodec ff_msmpeg4v2_decoder = {
1230 1230
     .close          = ff_h263_decode_end,
1231 1231
     .decode         = ff_h263_decode_frame,
1232 1232
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
1233
-    .max_lowres     = 3,
1234 1233
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
1235 1234
     .pix_fmts       = ff_pixfmt_list_420,
1236 1235
 };
... ...
@@ -1244,7 +1242,6 @@ AVCodec ff_msmpeg4v3_decoder = {
1244 1244
     .close          = ff_h263_decode_end,
1245 1245
     .decode         = ff_h263_decode_frame,
1246 1246
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
1247
-    .max_lowres     = 3,
1248 1247
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
1249 1248
     .pix_fmts       = ff_pixfmt_list_420,
1250 1249
 };
... ...
@@ -1258,7 +1255,6 @@ AVCodec ff_wmv1_decoder = {
1258 1258
     .close          = ff_h263_decode_end,
1259 1259
     .decode         = ff_h263_decode_frame,
1260 1260
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
1261
-    .max_lowres     = 3,
1262 1261
     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
1263 1262
     .pix_fmts       = ff_pixfmt_list_420,
1264 1263
 };
... ...
@@ -339,5 +339,4 @@ AVCodec ff_mxpeg_decoder = {
339 339
     .close          = mxpeg_decode_end,
340 340
     .decode         = mxpeg_decode_frame,
341 341
     .capabilities   = CODEC_CAP_DR1,
342
-    .max_lowres     = 3,
343 342
 };
... ...
@@ -326,7 +326,6 @@ static const AVOption options[]={
326 326
 {"dts_hd_ma", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_PROFILE_DTS_HD_MA }, INT_MIN, INT_MAX, A|E, "profile"},
327 327
 {"level", NULL, OFFSET(level), AV_OPT_TYPE_INT, {.dbl = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "level"},
328 328
 {"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "level"},
329
-{"lowres", "decode at 1= 1/2, 2=1/4, 3=1/8 resolutions", OFFSET(lowres), AV_OPT_TYPE_INT, {.dbl = 0 }, 0, INT_MAX, V|A|D},
330 329
 {"skip_threshold", "frame skip threshold", OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
331 330
 {"skip_factor", "frame skip factor", OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
332 331
 {"skip_exp", "frame skip exponent", OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
... ...
@@ -187,7 +187,7 @@ void ff_dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx)
187 187
         }
188 188
 #endif //CONFIG_ENCODERS
189 189
 
190
-        if (avctx->lowres == 0 && avctx->bits_per_raw_sample <= 8) {
190
+        if (avctx->bits_per_raw_sample <= 8) {
191 191
             if ((avctx->idct_algo == FF_IDCT_AUTO) ||
192 192
                 (avctx->idct_algo == FF_IDCT_ALTIVEC)) {
193 193
                 c->idct_put = ff_idct_put_altivec;
... ...
@@ -435,8 +435,7 @@ av_log(s->avctx, AV_LOG_DEBUG, "\n");*/
435 435
 //    s->obmc=1;
436 436
 //    s->umvplus=1;
437 437
     s->modified_quant=1;
438
-    if(!s->avctx->lowres)
439
-        s->loop_filter=1;
438
+    s->loop_filter=1;
440 439
 
441 440
     if(s->avctx->debug & FF_DEBUG_PICT_INFO){
442 441
             av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
... ...
@@ -755,7 +754,6 @@ AVCodec ff_rv10_decoder = {
755 755
     .close          = rv10_decode_end,
756 756
     .decode         = rv10_decode_frame,
757 757
     .capabilities   = CODEC_CAP_DR1,
758
-    .max_lowres     = 3,
759 758
     .long_name      = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
760 759
     .pix_fmts       = ff_pixfmt_list_420,
761 760
 };
... ...
@@ -770,7 +768,6 @@ AVCodec ff_rv20_decoder = {
770 770
     .decode         = rv10_decode_frame,
771 771
     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
772 772
     .flush          = ff_mpeg_flush,
773
-    .max_lowres     = 3,
774 773
     .long_name      = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
775 774
     .pix_fmts       = ff_pixfmt_list_420,
776 775
 };
... ...
@@ -102,7 +102,6 @@ AVCodec ff_sp5x_decoder = {
102 102
     .close          = ff_mjpeg_decode_end,
103 103
     .decode         = sp5x_decode_frame,
104 104
     .capabilities   = CODEC_CAP_DR1,
105
-    .max_lowres     = 3,
106 105
     .long_name      = NULL_IF_CONFIG_SMALL("Sunplus JPEG (SP5X)"),
107 106
 };
108 107
 
... ...
@@ -149,8 +149,8 @@ unsigned avcodec_get_edge_width(void)
149 149
 void avcodec_set_dimensions(AVCodecContext *s, int width, int height){
150 150
     s->coded_width = width;
151 151
     s->coded_height= height;
152
-    s->width = -((-width )>>s->lowres);
153
-    s->height= -((-height)>>s->lowres);
152
+    s->width  = width;
153
+    s->height = height;
154 154
 }
155 155
 
156 156
 #define INTERNAL_BUFFER_SIZE (32+1)
... ...
@@ -239,9 +239,8 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
239 239
 
240 240
     *width = FFALIGN(*width , w_align);
241 241
     *height= FFALIGN(*height, h_align);
242
-    if(s->codec_id == CODEC_ID_H264 || s->lowres)
242
+    if (s->codec_id == CODEC_ID_H264)
243 243
         *height+=2; // some of the optimized chroma MC reads one line too much
244
-                    // which is also done in mpeg decoders with lowres > 0
245 244
 
246 245
     for (i = 0; i < 4; i++)
247 246
         linesize_align[i] = STRIDE_ALIGN;
... ...
@@ -844,6 +843,7 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
844 844
         ret = AVERROR(EINVAL);
845 845
         goto free_and_end;
846 846
     }
847
+
847 848
     if (av_codec_is_encoder(avctx->codec)) {
848 849
         int i;
849 850
         if (avctx->codec->sample_fmts) {
... ...
@@ -3203,7 +3203,7 @@ void ff_dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx)
3203 3203
     if (mm_flags & AV_CPU_FLAG_MMX) {
3204 3204
         const int idct_algo = avctx->idct_algo;
3205 3205
 
3206
-        if (avctx->lowres == 0 && avctx->bits_per_raw_sample <= 8) {
3206
+        if (avctx->bits_per_raw_sample <= 8) {
3207 3207
             if (idct_algo == FF_IDCT_AUTO || idct_algo == FF_IDCT_SIMPLEMMX) {
3208 3208
                 c->idct_put              = ff_simple_idct_put_mmx;
3209 3209
                 c->idct_add              = ff_simple_idct_add_mmx;
... ...
@@ -1852,7 +1852,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
1852 1852
         unsigned int stts_sample = 0;
1853 1853
         unsigned int sample_size;
1854 1854
         unsigned int distance = 0;
1855
-        int key_off = sc->keyframe_count && sc->keyframes[0] == 1;
1855
+        int key_off = (sc->keyframe_count && sc->keyframes[0] > 0) || (sc->stps_data && sc->stps_data[0] > 0);
1856 1856
 
1857 1857
         current_dts -= sc->dts_shift;
1858 1858
 
1859 1859
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+OBJS += arm/cpu.o
0 1
new file mode 100644
... ...
@@ -0,0 +1,30 @@
0
+/*
1
+ * This file is part of Libav.
2
+ *
3
+ * Libav is free software; you can redistribute it and/or
4
+ * modify it under the terms of the GNU Lesser General Public
5
+ * License as published by the Free Software Foundation; either
6
+ * version 2.1 of the License, or (at your option) any later version.
7
+ *
8
+ * Libav is distributed in the hope that it will be useful,
9
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11
+ * Lesser General Public License for more details.
12
+ *
13
+ * You should have received a copy of the GNU Lesser General Public
14
+ * License along with Libav; if not, write to the Free Software
15
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+ */
17
+
18
+#include "libavutil/cpu.h"
19
+#include "config.h"
20
+
21
+int ff_get_cpu_flags_arm(void)
22
+{
23
+    return AV_CPU_FLAG_ARMV5TE * HAVE_ARMV5TE |
24
+           AV_CPU_FLAG_ARMV6   * HAVE_ARMV6   |
25
+           AV_CPU_FLAG_ARMV6T2 * HAVE_ARMV6T2 |
26
+           AV_CPU_FLAG_VFP     * HAVE_ARMVFP  |
27
+           AV_CPU_FLAG_VFPV3   * HAVE_VFPV3   |
28
+           AV_CPU_FLAG_NEON    * HAVE_NEON;
29
+}
0 30
new file mode 100644
... ...
@@ -0,0 +1,32 @@
0
+/*
1
+ * This file is part of Libav.
2
+ *
3
+ * Libav is free software; you can redistribute it and/or
4
+ * modify it under the terms of the GNU Lesser General Public
5
+ * License as published by the Free Software Foundation; either
6
+ * version 2.1 of the License, or (at your option) any later version.
7
+ *
8
+ * Libav is distributed in the hope that it will be useful,
9
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11
+ * Lesser General Public License for more details.
12
+ *
13
+ * You should have received a copy of the GNU Lesser General Public
14
+ * License along with Libav; if not, write to the Free Software
15
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+ */
17
+
18
+#ifndef AVUTIL_ARM_CPU_H
19
+#define AVUTIL_ARM_CPU_H
20
+
21
+#include "config.h"
22
+#include "libavutil/cpu.h"
23
+
24
+#define have_armv5te(flags) (HAVE_ARMV5TE && ((flags) & AV_CPU_FLAG_ARMV5TE))
25
+#define have_armv6(flags)   (HAVE_ARMV6   && ((flags) & AV_CPU_FLAG_ARMV6))
26
+#define have_armv6t2(flags) (HAVE_ARMV6T2 && ((flags) & AV_CPU_FLAG_ARMV6T2))
27
+#define have_vfp(flags)     (HAVE_ARMVFP  && ((flags) & AV_CPU_FLAG_VFP))
28
+#define have_vfpv3(flags)   (HAVE_VFPV3   && ((flags) & AV_CPU_FLAG_VFPV3))
29
+#define have_neon(flags)    (HAVE_NEON    && ((flags) & AV_CPU_FLAG_NEON))
30
+
31
+#endif
... ...
@@ -31,6 +31,7 @@ int av_get_cpu_flags(void)
31 31
     if (checked)
32 32
         return flags;
33 33
 
34
+    if (ARCH_ARM) flags = ff_get_cpu_flags_arm();
34 35
     if (ARCH_PPC) flags = ff_get_cpu_flags_ppc();
35 36
     if (ARCH_X86) flags = ff_get_cpu_flags_x86();
36 37
 
... ...
@@ -54,7 +55,14 @@ static const struct {
54 54
     int flag;
55 55
     const char *name;
56 56
 } cpu_flag_tab[] = {
57
-#if   ARCH_PPC
57
+#if   ARCH_ARM
58
+    { AV_CPU_FLAG_ARMV5TE,   "armv5te"    },
59
+    { AV_CPU_FLAG_ARMV6,     "armv6"      },
60
+    { AV_CPU_FLAG_ARMV6T2,   "armv6t2"    },
61
+    { AV_CPU_FLAG_VFP,       "vfp"        },
62
+    { AV_CPU_FLAG_VFPV3,     "vfpv3"      },
63
+    { AV_CPU_FLAG_NEON,      "neon"       },
64
+#elif ARCH_PPC
58 65
     { AV_CPU_FLAG_ALTIVEC,   "altivec"    },
59 66
 #elif ARCH_X86
60 67
     { AV_CPU_FLAG_MMX,       "mmx"        },
... ...
@@ -45,6 +45,13 @@
45 45
 #define AV_CPU_FLAG_FMA4         0x0800 ///< Bulldozer FMA4 functions
46 46
 #define AV_CPU_FLAG_ALTIVEC      0x0001 ///< standard
47 47
 
48
+#define AV_CPU_FLAG_ARMV5TE      (1 << 0)
49
+#define AV_CPU_FLAG_ARMV6        (1 << 1)
50
+#define AV_CPU_FLAG_ARMV6T2      (1 << 2)
51
+#define AV_CPU_FLAG_VFP          (1 << 3)
52
+#define AV_CPU_FLAG_VFPV3        (1 << 4)
53
+#define AV_CPU_FLAG_NEON         (1 << 5)
54
+
48 55
 /**
49 56
  * Return the flags which specify extensions supported by the CPU.
50 57
  */
... ...
@@ -66,6 +73,7 @@ void av_force_cpu_flags(int flags);
66 66
 attribute_deprecated void av_set_cpu_flags_mask(int mask);
67 67
 
68 68
 /* The following CPU-specific functions shall not be called directly. */
69
+int ff_get_cpu_flags_arm(void);
69 70
 int ff_get_cpu_flags_ppc(void);
70 71
 int ff_get_cpu_flags_x86(void);
71 72