#ifdef USE_QSV
if(job){
- qsv_param_set_defaults(&pv->qsv_config);
+ qsv_param_set_defaults(&pv->qsv_config,hb_qsv_info_get(job->h));
hb_dict_t * qsv_opts = NULL;
if( job->advanced_opts != NULL && *job->advanced_opts != '\0' )
AV_QSV_ZERO_MEMORY(qsv_encode->m_mfxVideoParam);
AV_QSV_ZERO_MEMORY(qsv_encode->m_mfxVideoParam.mfx);
- qsv_param_set_defaults(&pv->qsv_config);
+ qsv_param_set_defaults(&pv->qsv_config,hb_qsv_info_get(job->h));
hb_dict_t *qsv_opts_dict = NULL;
if( job->advanced_opts != NULL && *job->advanced_opts != '\0' )
return ret;
}
-void qsv_param_set_defaults( av_qsv_config* config){
+void qsv_param_set_defaults( av_qsv_config* config, hb_qsv_info_t *qsv_info ){
if(!config)
return;
} qsv_param_errors;
int qsv_param_parse( av_qsv_config* config, const char *name, const char *value);
-void qsv_param_set_defaults( av_qsv_config* config);
+void qsv_param_set_defaults( av_qsv_config* config, hb_qsv_info_t *qsv_info );
-#endif //ENC_QSV_H
\ No newline at end of file
+#endif //ENC_QSV_H
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
+#include "libavutil/cpu.h"
#if defined( SYS_MINGW )
#include <io.h>
qsv_info->features |= HB_QSV_FEATURE_CODEC_OPTIONS_2;
}
+ // if running IA
+ if( av_get_cpu_flags() & AV_CPU_FLAG_SSE )
+ {
+ int eax, ebx, ecx, edx;
+ int family = 0, model = 0;
+
+ // cpu fma check
+ ff_cpu_cpuid(1, &eax, &ebx, &ecx, &edx);
+ family = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
+ model = ((eax >> 4) & 0xf) + ((eax >> 12) & 0xf0);
+
+ ff_cpu_cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
+ if( (eax & 0x80000004) < 0x80000004 )
+ {
+ int offset = 0;
+ ff_cpu_cpuid(0x80000002, &qsv_info->cpu_name[offset], &qsv_info->cpu_name[offset+4], &qsv_info->cpu_name[offset+8], &qsv_info->cpu_name[offset+12]);
+ offset += 16;
+ ff_cpu_cpuid(0x80000003, &qsv_info->cpu_name[offset], &qsv_info->cpu_name[offset+4], &qsv_info->cpu_name[offset+8], &qsv_info->cpu_name[offset+12]);
+ offset += 16;
+ ff_cpu_cpuid(0x80000004, &qsv_info->cpu_name[offset], &qsv_info->cpu_name[offset+4], &qsv_info->cpu_name[offset+8], &qsv_info->cpu_name[offset+12]);
+ }
+
+ if( family == 0x06 )
+ if( model == 0x3C ||
+ model == 0x45 )
+ qsv_info->cpu_details = HB_CPU_PLATFORM_INTEL_HSW;
+
+ if( family == 0x06 )
+ if( model == 0x3A ||
+ model == 0x3E )
+ qsv_info->cpu_details = HB_CPU_PLATFORM_INTEL_IVB;
+
+ if( family == 0x06 )
+ if( model == 0x2A ||
+ model == 0x2D )
+ qsv_info->cpu_details = HB_CPU_PLATFORM_INTEL_SNB;
+ }
+
// note: we pass a pointer to MFXInit but it never gets modified
// let's make sure of it just to be safe though
if (qsv_info->minimum_version.Major != HB_QSV_MINVERSION_MAJOR ||
#define HB_QSV_FEATURE_DECODE_TIMESTAMPS 0x0000001
#define HB_QSV_FEATURE_CODEC_OPTIONS_2 0x0000002 // see mfxExtCodingOption2
+ // if a feature depend on cpu
+ char cpu_name[48];
+
+enum
+{
+ // list of microarchitecture codenames
+ HB_CPU_PLATFORM_INTEL_SNB = 1,
+ HB_CPU_PLATFORM_INTEL_IVB,
+ HB_CPU_PLATFORM_INTEL_HSW,
+};
+ int cpu_details;
+
// TODO: add available decoders, filters, encoders,
// maximum decode and encode resolution, etc.
} hb_qsv_info_t;
av_qsv_add_context_usage(qsv,HAVE_THREADS);
- qsv_param_set_defaults(&pv->qsv_config);
+ qsv_param_set_defaults(&pv->qsv_config,hb_qsv_info_get(pv->job->h));
hb_dict_t * qsv_opts = NULL;
if( pv->job->advanced_opts != NULL && *pv->job->advanced_opts != '\0' )
qsv_opts = hb_encopts_to_dict( pv->job->advanced_opts, pv->job->vcodec );
qsv_info->minimum_version.Major,
qsv_info->minimum_version.Minor);
}
+
+ fprintf(stderr,
+ " - hardware details: %s%s\n", qsv_info->cpu_name,
+ qsv_info->cpu_details & HB_CPU_PLATFORM_INTEL_HSW ?
+ "/Fourth Generation Intel Core Processor":
+ "" );
}
#endif