]> granicus.if.org Git - handbrake/commitdiff
qsv: add some frame type helper functions.
authorRodeo <tdskywalker@gmail.com>
Thu, 2 Jan 2014 14:32:46 +0000 (14:32 +0000)
committerRodeo <tdskywalker@gmail.com>
Thu, 2 Jan 2014 14:32:46 +0000 (14:32 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5950 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/enc_qsv.c
libhb/qsv_common.c
libhb/qsv_common.h

index a906e6dc2b400e0ac9c077715070a49893492a3b..6f17f2b798a266f95a03356e5f4401859d22b471 100644 (file)
@@ -1406,18 +1406,10 @@ int encqsvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
                 // see nal_encode
                 buf = hb_video_buffer_init( job->width, job->height );
                 buf->size = 0;
-                buf->s.frametype = 0;
 
-                // maping of FrameType(s)
-                if(task->bs->FrameType & MFX_FRAMETYPE_IDR ) buf->s.frametype = HB_FRAME_IDR;
-                else
-                if(task->bs->FrameType & MFX_FRAMETYPE_I )   buf->s.frametype = HB_FRAME_I;
-                else
-                if(task->bs->FrameType & MFX_FRAMETYPE_P )   buf->s.frametype = HB_FRAME_P;
-                else
-                if(task->bs->FrameType & MFX_FRAMETYPE_B )   buf->s.frametype = HB_FRAME_B;
-
-                if(task->bs->FrameType & MFX_FRAMETYPE_REF ) buf->s.flags      = HB_FRAME_REF;
+                // map Media SDK's FrameType to our internal representation
+                buf->s.frametype = hb_qsv_frametype_xlat(task->bs->FrameType,
+                                                         &buf->s.flags);
 
                 parse_nalus(task->bs->Data + task->bs->DataOffset,task->bs->DataLength, buf, pv->frames_out);
 
index 3dcaa25edef6bda6fc83bfc5620bd7150461bba7..195845200052dafee27ec840b3b4dca3c021182e 100644 (file)
@@ -957,6 +957,64 @@ int hb_qsv_param_default(hb_qsv_param_t *param, mfxVideoParam *videoParam)
     return 0;
 }
 
+const char* hb_qsv_frametype_name(uint16_t qsv_frametype)
+{
+    if      (qsv_frametype & MFX_FRAMETYPE_IDR)
+    {
+        return qsv_frametype & MFX_FRAMETYPE_REF ? "IDR (ref)" : "IDR";
+    }
+    else if (qsv_frametype & MFX_FRAMETYPE_I)
+    {
+        return qsv_frametype & MFX_FRAMETYPE_REF ? "I (ref)"   : "I";
+    }
+    else if (qsv_frametype & MFX_FRAMETYPE_P)
+    {
+        return qsv_frametype & MFX_FRAMETYPE_REF ? "P (ref)"   : "P";
+    }
+    else if (qsv_frametype & MFX_FRAMETYPE_B)
+    {
+        return qsv_frametype & MFX_FRAMETYPE_REF ? "B (ref)"   : "B";
+    }
+    else
+    {
+        return "unknown";
+    }
+}
+
+uint8_t hb_qsv_frametype_xlat(uint16_t qsv_frametype, uint16_t *out_flags)
+{
+    uint16_t flags     = 0;
+    uint8_t  frametype = 0;
+
+    if      (qsv_frametype & MFX_FRAMETYPE_IDR)
+    {
+        frametype = HB_FRAME_IDR;
+    }
+    else if (qsv_frametype & MFX_FRAMETYPE_I)
+    {
+        frametype = HB_FRAME_I;
+    }
+    else if (qsv_frametype & MFX_FRAMETYPE_P)
+    {
+        frametype = HB_FRAME_P;
+    }
+    else if (qsv_frametype & MFX_FRAMETYPE_B)
+    {
+        frametype = HB_FRAME_B;
+    }
+
+    if (qsv_frametype & MFX_FRAMETYPE_REF)
+    {
+        flags |= HB_FRAME_REF;
+    }
+
+    if (out_flags != NULL)
+    {
+       *out_flags = flags;
+    }
+    return frametype;
+}
+
 mfxIMPL hb_qsv_impl_get_preferred()
 {
     return preferred_implementation;
index 8a3b8c79b290e2f9e9c74c892a38cc8986d5efc7..c79cd2aa1dd7ffd0a1f707475d4d2c28f25c4250 100644 (file)
@@ -128,6 +128,9 @@ int hb_qsv_param_default_preset(hb_qsv_param_t *param, mfxVideoParam *videoParam
 int hb_qsv_param_default       (hb_qsv_param_t *param, mfxVideoParam *videoParam);
 int hb_qsv_param_parse         (hb_qsv_param_t *param, const char *key, const char *value, int vcodec);
 
+const char* hb_qsv_frametype_name(uint16_t qsv_frametype);
+uint8_t     hb_qsv_frametype_xlat(uint16_t qsv_frametype, uint16_t *out_flags);
+
 mfxIMPL     hb_qsv_impl_get_preferred();
 const char* hb_qsv_impl_get_name(int impl);