Merge commit '2a6eaeaa85d17b27ee0dd449183ec197c35c9675'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 24 May 2013 11:13:03 +0000 (13:13 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 24 May 2013 11:24:28 +0000 (13:24 +0200)
* commit '2a6eaeaa85d17b27ee0dd449183ec197c35c9675':
  Move get_logical_cpus() from lavc/pthread to lavu/cpu.

Conflicts:
doc/APIchanges
libavcodec/pthread.c
libavutil/cpu.c
libavutil/cpu.h
libavutil/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/APIchanges
libavcodec/pthread.c
libavutil/cpu.c
libavutil/cpu.h
libavutil/version.h

diff --cc doc/APIchanges
@@@ -15,171 -13,12 +15,174 @@@ libavutil:     2012-10-2
  
  API changes, most recent first:
  
 -2013-xx-xx - xxxxxxx - lavu 52.12.0 - cpu.h
 +
- 2013-05-24 - xxxxxxx - lavc 55.7.0 - avcodec.h
++2013-05-24 - xxxxxxx - lavu 52.34.100 - cpu.h
+   Add av_cpu_count() function for getting the number of logical CPUs.
 -2013-05-xx - xxxxxxx - lavc 55.7.0 - avcodec.h
++2013-05-24 - xxxxxxx - lavc 55.12.100 - avcodec.h
    Add picture_structure to AVCodecParserContext.
  
 +2013-05-17 - xxxxxxx - lavu 52.33.100 - opt.h
 +  Add AV_OPT_TYPE_COLOR value to AVOptionType enum.
 +
 +2013-05-13 - xxxxxxx - lavu 52.31.100 - mem.h
 +  Add av_dynarray2_add().
 +
 +2013-05-12 - xxxxxxx - lavfi 3.65.100
 +  Add AVFILTER_FLAG_SUPPORT_TIMELINE* filter flags.
 +
 +2013-04-19 - xxxxxxx - lavc 55.4.100
 +  Add AV_CODEC_PROP_TEXT_SUB property for text based subtitles codec.
 +
 +2013-04-18 - xxxxxxx - lavf 55.3.100
 +  The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default starting lavf 56.0.100.
 +
 +2013-04-10 - xxxxxxx - lavu 25.26.100 - avutil.h,opt.h
 +  Add av_int_list_length()
 +  and av_opt_set_int_list().
 +
 +2013-03-30 - xxxxxxx - lavu 52.24.100 - samplefmt.h
 +  Add av_samples_alloc_array_and_samples().
 +
 +2013-03-29 - xxxxxxx - lavf 55.1.100 - avformat.h
 +  Add av_guess_frame_rate()
 +
 +2013-03-20 - xxxxxxx - lavu 52.22.100 - opt.h
 +  Add AV_OPT_TYPE_DURATION value to AVOptionType enum.
 +
 +2013-03-17 - xxxxxx - lavu 52.20.100 - opt.h
 +  Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum.
 +
 +2013-03-07 - xxxxxx - lavu 52.18.100 - avstring.h,bprint.h
 +  Add av_escape() and av_bprint_escape() API.
 +
 +2013-02-24 - xxxxxx - lavfi 3.41.100 - buffersink.h
 +  Add sample_rates field to AVABufferSinkParams.
 +
 +2013-01-17 - a1a707f - lavf 54.61.100
 +  Add av_codec_get_tag2().
 +
 +2013-01-01 - 2eb2e17 - lavfi 3.34.100
 +  Add avfilter_get_audio_buffer_ref_from_arrays_channels.
 +
 +2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h
 +  Add AVFilterLink.channels, avfilter_link_get_channels()
 +  and avfilter_ref_get_channels().
 +
 +2012-12-15 - 2ada584d - lavc 54.80.100 - avcodec.h
 +  Add pkt_size field to AVFrame.
 +
 +2012-11-25 - c70ec631 - lavu 52.9.100 - opt.h
 +  Add the following convenience functions to opt.h:
 +   av_opt_get_image_size
 +   av_opt_get_pixel_fmt
 +   av_opt_get_sample_fmt
 +   av_opt_set_image_size
 +   av_opt_set_pixel_fmt
 +   av_opt_set_sample_fmt
 +
 +2012-11-17 - 4cd74c81 - lavu 52.8.100 - bprint.h
 +  Add av_bprint_strftime().
 +
 +2012-11-15 - 92648107 - lavu 52.7.100 - opt.h
 +  Add av_opt_get_key_value().
 +
 +2012-11-13 - 79456652 - lavfi 3.23.100 - avfilter.h
 +  Add channels field to AVFilterBufferRefAudioProps.
 +
 +2012-11-03 - 481fdeee - lavu 52.3.100 - opt.h
 +  Add AV_OPT_TYPE_SAMPLE_FMT value to AVOptionType enum.
 +
 +2012-10-21 - 6fb2fd8 - lavc  54.68.100 - avcodec.h
 +                       lavfi  3.20.100 - avfilter.h
 +  Add AV_PKT_DATA_STRINGS_METADATA side data type, used to transmit key/value
 +  strings between AVPacket and AVFrame, and add metadata field to
 +  AVCodecContext (which shall not be accessed by users; see AVFrame metadata
 +  instead).
 +
 +2012-09-27 - a70b493 - lavd 54.3.100 - version.h
 +  Add LIBAVDEVICE_IDENT symbol.
 +
 +2012-09-27 - a70b493 - lavfi 3.18.100 - version.h
 +  Add LIBAVFILTER_IDENT symbol.
 +
 +2012-09-27 - a70b493 - libswr 0.16.100 - version.h
 +  Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD
 +  and LIBSWRESAMPLE_IDENT symbols.
 +
 +2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h
 +  Add av_small_strptime() time parsing function.
 +
 +  Can be used as a stripped-down replacement for strptime(), on
 +  systems which do not support it.
 +
 +2012-08-25 - 2626cc4 - lavf 54.28.100
 +  Matroska demuxer now identifies SRT subtitles as AV_CODEC_ID_SUBRIP instead
 +  of AV_CODEC_ID_TEXT.
 +
 +2012-08-13 - 5c0d8bc - lavfi 3.8.100 - avfilter.h
 +  Add avfilter_get_class() function, and priv_class field to AVFilter
 +  struct.
 +
 +2012-08-12 - a25346e - lavu 51.69.100 - opt.h
 +  Add AV_OPT_FLAG_FILTERING_PARAM symbol in opt.h.
 +
 +2012-07-31 - 23fc4dd - lavc 54.46.100
 +  Add channels field to AVFrame.
 +
 +2012-07-30 - f893904 - lavu 51.66.100
 +  Add av_get_channel_description()
 +  and av_get_standard_channel_layout() functions.
 +
 +2012-07-21 - 016a472 - lavc 54.43.100
 +  Add decode_error_flags field to AVFrame.
 +
 +2012-07-20 - b062936 - lavf 54.18.100
 +  Add avformat_match_stream_specifier() function.
 +
 +2012-07-14 - f49ec1b - lavc 54.38.100 - avcodec.h
 +  Add metadata to AVFrame, and the accessor functions
 +  av_frame_get_metadata() and av_frame_set_metadata().
 +
 +2012-07-10 - 0e003d8 - lavc 54.33.100
 +  Add av_fast_padded_mallocz().
 +
 +2012-07-10 - 21d5609 - lavfi 3.2.0 - avfilter.h
 +  Add init_opaque() callback to AVFilter struct.
 +
 +2012-06-26 - e6674e4 - lavu 51.63.100 - imgutils.h
 +  Add functions to libavutil/imgutils.h:
 +  av_image_get_buffer_size()
 +  av_image_fill_arrays()
 +  av_image_copy_to_buffer()
 +
 +2012-06-24 - c41899a - lavu 51.62.100 - version.h
 +  version moved from avutil.h to version.h
 +
 +2012-04-11 - 359abb1 - lavu 51.58.100 - error.h
 +  Add av_make_error_string() and av_err2str() utilities to
 +  libavutil/error.h.
 +
 +2012-06-05 - 62b39d4 - lavc 54.24.100
 +  Add pkt_duration field to AVFrame.
 +
 +2012-05-24 - f2ee065 - lavu 51.54.100
 +  Move AVPALETTE_SIZE and AVPALETTE_COUNT macros from
 +  libavcodec/avcodec.h to libavutil/pixfmt.h.
 +
 +2012-05-14 - 94a9ac1 - lavf 54.5.100
 +  Add av_guess_sample_aspect_ratio() function.
 +
 +2012-04-20 - 65fa7bc - lavfi 2.70.100
 +  Add avfilter_unref_bufferp() to avfilter.h.
 +
 +2012-04-13 - 162e400 - lavfi 2.68.100
 +  Install libavfilter/asrc_abuffer.h public header.
 +
 +2012-03-26 - a67d9cf - lavfi 2.66.100
 +  Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
 +
  2013-05-xx - xxxxxxx - lavu 52.11.0 - pixdesc.h
    Replace PIX_FMT_* flags with AV_PIX_FMT_FLAG_*.
  
@@@ -166,44 -136,6 +146,15 @@@ typedef struct FrameThreadContext 
   * limit the number of threads to 16 for automatic detection */
  #define MAX_AUTO_THREADS 16
  
-     int ret, nb_cpus = 1;
- #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
-     cpu_set_t cpuset;
-     CPU_ZERO(&cpuset);
-     ret = sched_getaffinity(0, sizeof(cpuset), &cpuset);
-     if (!ret) {
-         nb_cpus = CPU_COUNT(&cpuset);
-     }
- #elif HAVE_GETPROCESSAFFINITYMASK
-     DWORD_PTR proc_aff, sys_aff;
-     ret = GetProcessAffinityMask(GetCurrentProcess(), &proc_aff, &sys_aff);
-     if (ret)
-         nb_cpus = av_popcount64(proc_aff);
- #elif HAVE_SYSCTL && defined(HW_NCPU)
-     int mib[2] = { CTL_HW, HW_NCPU };
-     size_t len = sizeof(nb_cpus);
-     ret = sysctl(mib, 2, &nb_cpus, &len, NULL, 0);
-     if (ret == -1)
-         nb_cpus = 0;
- #elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
-     nb_cpus = sysconf(_SC_NPROC_ONLN);
- #elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
-     nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
- #endif
-     av_log(avctx, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus);
 +int ff_get_logical_cpus(AVCodecContext *avctx)
 +{
++    int nb_cpus = av_cpu_count();
 +    if  (avctx->height)
 +        nb_cpus = FFMIN(nb_cpus, (avctx->height+15)/16);
 +
 +    return nb_cpus;
 +}
 +
  static void* attribute_align_arg worker(void *v)
  {
      AVCodecContext *avctx = v;
@@@ -843,9 -740,8 +794,10 @@@ static int frame_thread_init(AVCodecCon
      int i, err = 0;
  
      if (!thread_count) {
-         int nb_cpus = ff_get_logical_cpus(avctx);
+         int nb_cpus = av_cpu_count();
 +        if ((avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) || avctx->debug_mv)
 +            nb_cpus = 1;
+         av_log(avctx, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus);
          // use number of cores + 1 as thread count if there is more than one
          if (nb_cpus > 1)
              thread_count = avctx->thread_count = FFMIN(nb_cpus + 1, MAX_AUTO_THREADS);
diff --cc libavutil/cpu.c
  #include "config.h"
  #include "opt.h"
  
 -#define _GNU_SOURCE
+ #if HAVE_SCHED_GETAFFINITY
 -static int cpuflags_mask = -1, checked;
++#ifndef _GNU_SOURCE
++# define _GNU_SOURCE
++#endif
+ #include <sched.h>
+ #endif
+ #if HAVE_GETPROCESSAFFINITYMASK
+ #include <windows.h>
+ #endif
+ #if HAVE_SYSCTL
+ #if HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif
+ #include <sys/types.h>
++#include <sys/param.h>
+ #include <sys/sysctl.h>
+ #endif
+ #if HAVE_SYSCONF
+ #include <unistd.h>
+ #endif
 +static int flags, checked;
 +
 +void av_force_cpu_flags(int arg){
 +    flags   = arg;
 +    checked = arg != -1;
 +}
  
  int av_get_cpu_flags(void)
  {
@@@ -111,68 -127,39 +132,102 @@@ int av_parse_cpu_flags(const char *s
      return flags & INT_MAX;
  }
  
 +int av_parse_cpu_caps(unsigned *flags, const char *s)
 +{
 +        static const AVOption cpuflags_opts[] = {
 +        { "flags"   , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
 +#if   ARCH_PPC
 +        { "altivec" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ALTIVEC  },    .unit = "flags" },
 +#elif ARCH_X86
 +        { "mmx"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MMX      },    .unit = "flags" },
 +        { "mmx2"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MMX2     },    .unit = "flags" },
 +        { "mmxext"  , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MMX2     },    .unit = "flags" },
 +        { "sse"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE      },    .unit = "flags" },
 +        { "sse2"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE2     },    .unit = "flags" },
 +        { "sse2slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE2SLOW },    .unit = "flags" },
 +        { "sse3"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE3     },    .unit = "flags" },
 +        { "sse3slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE3SLOW },    .unit = "flags" },
 +        { "ssse3"   , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSSE3    },    .unit = "flags" },
 +        { "atom"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ATOM     },    .unit = "flags" },
 +        { "sse4.1"  , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE4     },    .unit = "flags" },
 +        { "sse4.2"  , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_SSE42    },    .unit = "flags" },
 +        { "avx"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_AVX      },    .unit = "flags" },
 +        { "xop"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_XOP      },    .unit = "flags" },
 +        { "fma4"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_FMA4     },    .unit = "flags" },
 +        { "3dnow"   , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_3DNOW    },    .unit = "flags" },
 +        { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_3DNOWEXT },    .unit = "flags" },
 +        { "cmov",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_CMOV     },    .unit = "flags" },
 +
 +#define CPU_FLAG_P2 AV_CPU_FLAG_CMOV | AV_CPU_FLAG_MMX
 +#define CPU_FLAG_P3 CPU_FLAG_P2 | AV_CPU_FLAG_MMX2 | AV_CPU_FLAG_SSE
 +#define CPU_FLAG_P4 CPU_FLAG_P3| AV_CPU_FLAG_SSE2
 +        { "pentium2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_P2          },    .unit = "flags" },
 +        { "pentium3", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_P3          },    .unit = "flags" },
 +        { "pentium4", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_P4          },    .unit = "flags" },
 +
 +#define CPU_FLAG_K62 AV_CPU_FLAG_MMX | AV_CPU_FLAG_3DNOW
 +#define CPU_FLAG_ATHLON   CPU_FLAG_K62 | AV_CPU_FLAG_CMOV | AV_CPU_FLAG_3DNOWEXT | AV_CPU_FLAG_MMX2
 +#define CPU_FLAG_ATHLONXP CPU_FLAG_ATHLON | AV_CPU_FLAG_SSE
 +#define CPU_FLAG_K8  CPU_FLAG_ATHLONXP | AV_CPU_FLAG_SSE2
 +        { "k6",       NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MMX      },    .unit = "flags" },
 +        { "k62",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_K62         },    .unit = "flags" },
 +        { "athlon",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_ATHLON      },    .unit = "flags" },
 +        { "athlonxp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_ATHLONXP    },    .unit = "flags" },
 +        { "k8",       NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPU_FLAG_K8          },    .unit = "flags" },
 +#elif ARCH_ARM
 +        { "armv5te",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV5TE  },    .unit = "flags" },
 +        { "armv6",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV6    },    .unit = "flags" },
 +        { "armv6t2",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV6T2  },    .unit = "flags" },
 +        { "vfp",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFP      },    .unit = "flags" },
 +        { "vfpv3",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFPV3    },    .unit = "flags" },
 +        { "neon",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_NEON     },    .unit = "flags" },
 +#endif
 +        { NULL },
 +    };
 +    static const AVClass class = {
 +        .class_name = "cpuflags",
 +        .item_name  = av_default_item_name,
 +        .option     = cpuflags_opts,
 +        .version    = LIBAVUTIL_VERSION_INT,
 +    };
 +    const AVClass *pclass = &class;
 +
 +    return av_opt_eval_flags(&pclass, &cpuflags_opts[0], s, flags);
 +}
++
+ int av_cpu_count(void)
+ {
+     int ret, nb_cpus = 1;
+ #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
+     cpu_set_t cpuset;
+     CPU_ZERO(&cpuset);
+     ret = sched_getaffinity(0, sizeof(cpuset), &cpuset);
+     if (!ret) {
+         nb_cpus = CPU_COUNT(&cpuset);
+     }
+ #elif HAVE_GETPROCESSAFFINITYMASK
+     DWORD_PTR proc_aff, sys_aff;
+     ret = GetProcessAffinityMask(GetCurrentProcess(), &proc_aff, &sys_aff);
+     if (ret)
+         nb_cpus = av_popcount64(proc_aff);
+ #elif HAVE_SYSCTL && defined(HW_NCPU)
+     int mib[2] = { CTL_HW, HW_NCPU };
+     size_t len = sizeof(nb_cpus);
+     ret = sysctl(mib, 2, &nb_cpus, &len, NULL, 0);
+     if (ret == -1)
+         nb_cpus = 0;
+ #elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
+     nb_cpus = sysconf(_SC_NPROC_ONLN);
+ #elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
+     nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
+ #endif
+     return nb_cpus;
+ }
  #ifdef TEST
  
  #include <stdio.h>
diff --cc libavutil/cpu.h
@@@ -94,12 -77,10 +94,17 @@@ attribute_deprecate
  int av_parse_cpu_flags(const char *s);
  
  /**
 + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that.
 + *
 + * @return negative on error.
 + */
 +int av_parse_cpu_caps(unsigned *flags, const char *s);
 +
++/**
+  * @return the number of logical CPU cores present.
+  */
+ int av_cpu_count(void);
  /* The following CPU-specific functions shall not be called directly. */
  int ff_get_cpu_flags_arm(void);
  int ff_get_cpu_flags_ppc(void);
@@@ -74,9 -36,9 +74,9 @@@
   * @{
   */
  
 -#define LIBAVUTIL_VERSION_MAJOR 52
 -#define LIBAVUTIL_VERSION_MINOR 12
 -#define LIBAVUTIL_VERSION_MICRO  0
 +#define LIBAVUTIL_VERSION_MAJOR  52
- #define LIBAVUTIL_VERSION_MINOR  33
++#define LIBAVUTIL_VERSION_MINOR  34
 +#define LIBAVUTIL_VERSION_MICRO 100
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                 LIBAVUTIL_VERSION_MINOR, \