]> granicus.if.org Git - handbrake/commitdiff
QSV: cleanup keyframe interval code.
authorRodeo <tdskywalker@gmail.com>
Tue, 23 Jul 2013 01:18:28 +0000 (01:18 +0000)
committerRodeo <tdskywalker@gmail.com>
Tue, 23 Jul 2013 01:18:28 +0000 (01:18 +0000)
Intervals are unchanged from previous patch (32 for CQP, 5*fps+1 otherwise).

git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/qsv@5659 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/decavcodec.c
libhb/enc_qsv.c
libhb/enc_qsv.h
libhb/qsv_filter.c

index 8e6e0bfb0f0984ce81be0d778f8d66f92851cffe..3c4f07b5f5953457ceddd0dcda675019038639ea 100644 (file)
@@ -1207,7 +1207,7 @@ static int decavcodecvInit( hb_work_object_t * w, hb_job_t * job )
             int ret;
             hb_dict_t *qsv_opts = NULL;
             hb_dict_entry_t *entry = NULL;
-            qsv_param_set_defaults(&pv->qsv_config, hb_qsv_info,job);
+            qsv_param_set_defaults(&pv->qsv_config);
             if (job->advanced_opts != NULL && *job->advanced_opts != '\0')
             {
                 qsv_opts = hb_encopts_to_dict(job->advanced_opts, job->vcodec);
index 4b490fafbb813d45b5b9d493fd59d7049198681d..8f2843a161b40424dd624022882db2176031c6b2 100644 (file)
@@ -281,20 +281,17 @@ int qsv_enc_init( av_qsv_context* qsv, hb_work_private_t * pv ){
     AV_QSV_ZERO_MEMORY(qsv_encode->m_mfxVideoParam);
     AV_QSV_ZERO_MEMORY(qsv_encode->m_mfxVideoParam.mfx);
 
-    qsv_param_set_defaults(&pv->qsv_config, hb_qsv_info,job);
+    qsv_param_set_defaults(&pv->qsv_config);
 
     hb_dict_t *qsv_opts_dict = NULL;
     if( job->advanced_opts != NULL && *job->advanced_opts != '\0' )
         qsv_opts_dict = hb_encopts_to_dict( job->advanced_opts, job->vcodec );
 
-    int gop_pic_size_force = 0;
     int ret;
     hb_dict_entry_t *entry = NULL;
     while( ( entry = hb_dict_next( qsv_opts_dict, entry ) ) )
     {
         ret = qsv_param_parse( &pv->qsv_config, entry->key, entry->value );
-        if(!strcmp(entry->key,QSV_NAME_gop_pic_size))
-            gop_pic_size_force = 1;
         if( ret == QSV_PARAM_BAD_NAME )
             hb_log( "QSV options: Unknown suboption %s", entry->key );
         else
@@ -421,9 +418,19 @@ int qsv_enc_init( av_qsv_context* qsv, hb_work_private_t * pv ){
         }
     }
 
-    if (!gop_pic_size_force && qsv_encode->m_mfxVideoParam.mfx.RateControlMethod == MFX_RATECONTROL_CQP)
+    if (pv->qsv_config.gop_pic_size < 0)
     {
-        pv->qsv_config.gop_pic_size = 32; // default for CQP, if not forced
+        int rate = (int)((double)job->vrate / (double)job->vrate_base + 0.5);
+        if (qsv_encode->m_mfxVideoParam.mfx.RateControlMethod == MFX_RATECONTROL_CQP)
+        {
+            // ensure B-pyramid is enabled for CQP on Haswell
+            pv->qsv_config.gop_pic_size = 32;
+        }
+        else
+        {
+            // set the keyframe interval based on the framerate
+            pv->qsv_config.gop_pic_size = 5 * rate + 1;
+        }
     }
 
     // version-specific encoder options
@@ -1365,15 +1372,14 @@ int qsv_param_parse( av_qsv_config* config, const char *name, const char *value)
     return ret;
 }
 
-void qsv_param_set_defaults( av_qsv_config* config, hb_qsv_info_t *qsv_info, hb_job_t *job ){
-    if(!config)
-        return;
-
-    config->async_depth     = AV_QSV_ASYNC_DEPTH_DEFAULT;
-    config->target_usage    = MFX_TARGETUSAGE_BEST_QUALITY + 1;
-    config->num_ref_frame   = 0;
-    config->gop_ref_dist    = 4;
-
-    int used_rate = round((float)job->vrate/(float)job->vrate_base);
-    config->gop_pic_size    = (used_rate * 5) + 1;
+void qsv_param_set_defaults(av_qsv_config *config)
+{
+    if (config != NULL)
+    {
+        config->async_depth   = AV_QSV_ASYNC_DEPTH_DEFAULT;
+        config->target_usage  = MFX_TARGETUSAGE_BEST_QUALITY + 1;
+        config->num_ref_frame = 0;  // set automatically by MSDK
+        config->gop_ref_dist  = 4;  // power of 2, >= 4: B-pyramid
+        config->gop_pic_size  = -1; // set automatically based on framerate
+    }
 }
index 5f5d8d4b35171f9bb2627452095e4e7907c940f7..c000a143b7648b0ab63c5d00262ad7216460e0e9 100644 (file)
@@ -60,7 +60,7 @@ typedef enum {
     QSV_PARAM_BAD_CONFIG    = -3,
 } 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, hb_qsv_info_t *qsv_info, hb_job_t *job );
+int  qsv_param_parse(av_qsv_config *config, const char *name, const char *value);
+void qsv_param_set_defaults(av_qsv_config *config);
 
 #endif //ENC_QSV_H
index ad9cd3fc27da2a51c31b5db9b01423023ca4045f..59fbd31494d31bc21737fb9121fd2c992c28d42e 100644 (file)
@@ -111,7 +111,7 @@ static int filter_init( av_qsv_context* qsv, hb_filter_private_t * pv ){
     av_qsv_add_context_usage(qsv,HAVE_THREADS);
 
 
-    qsv_param_set_defaults(&pv->qsv_config, hb_qsv_info,pv->job);
+    qsv_param_set_defaults(&pv->qsv_config);
     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 );