summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/enc_qsv.c14
-rw-r--r--libhb/qsv_common.c58
-rw-r--r--libhb/qsv_common.h3
3 files changed, 64 insertions, 11 deletions
diff --git a/libhb/enc_qsv.c b/libhb/enc_qsv.c
index a906e6dc2..6f17f2b79 100644
--- a/libhb/enc_qsv.c
+++ b/libhb/enc_qsv.c
@@ -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);
diff --git a/libhb/qsv_common.c b/libhb/qsv_common.c
index 3dcaa25ed..195845200 100644
--- a/libhb/qsv_common.c
+++ b/libhb/qsv_common.c
@@ -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;
diff --git a/libhb/qsv_common.h b/libhb/qsv_common.h
index 8a3b8c79b..c79cd2aa1 100644
--- a/libhb/qsv_common.h
+++ b/libhb/qsv_common.h
@@ -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);