From 43a8eb9e92cc6adef454bcc97d094cfa4f9772a7 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 31 Dec 2019 13:36:59 +0900 Subject: [PATCH] d3d11decoder: Fix build on non-desktop target Although the target platform of D3D11 decoding API are both desktop and UWP app, DXVA header is blocked by "WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)" which is meaning that that's only for desktop app. To workaround this inconsistent annoyingness, we need to define WINAPI_PARTITION_DESKTOP regardless of target WinAPI partition. --- sys/d3d11/gstd3d11decoder.h | 3 -- sys/d3d11/gstd3d11h264dec.c | 60 ++++++++++++++++++++++++++------------- sys/d3d11/gstd3d11h264dec.h | 10 +++---- sys/d3d11/gstd3d11h265dec.c | 69 ++++++++++++++++++++++++++++++--------------- sys/d3d11/gstd3d11h265dec.h | 10 +++---- sys/d3d11/gstd3d11vp9dec.c | 8 ++++++ 6 files changed, 103 insertions(+), 57 deletions(-) diff --git a/sys/d3d11/gstd3d11decoder.h b/sys/d3d11/gstd3d11decoder.h index 93ce11b..1efcfca 100644 --- a/sys/d3d11/gstd3d11decoder.h +++ b/sys/d3d11/gstd3d11decoder.h @@ -22,9 +22,6 @@ #include #include -#include -#include -#include #include "gstd3d11_fwd.h" #include "gstd3d11device.h" #include "gstd3d11utils.h" diff --git a/sys/d3d11/gstd3d11h264dec.c b/sys/d3d11/gstd3d11h264dec.c index 20af28b..b2ef1f8 100644 --- a/sys/d3d11/gstd3d11h264dec.c +++ b/sys/d3d11/gstd3d11h264dec.c @@ -56,6 +56,14 @@ #include "gstd3d11bufferpool.h" #include +/* HACK: to expose dxva data structure on UWP */ +#ifdef WINAPI_PARTITION_DESKTOP +#undef WINAPI_PARTITION_DESKTOP +#endif +#define WINAPI_PARTITION_DESKTOP 1 +#include +#include + GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_h264_dec_debug); #define GST_CAT_DEFAULT gst_d3d11_h264_dec_debug @@ -93,8 +101,19 @@ static GstStaticPadTemplate src_template = (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, "{ NV12, P010_10LE }") "; " GST_VIDEO_CAPS_MAKE ("{ NV12, P010_10LE }"))); +struct _GstD3D11H264DecPrivate +{ + /* Need to hide DXVA_PicEntry_H264 structure from header for UWP */ + DXVA_PicEntry_H264 ref_frame_list[16]; + INT field_order_cnt_list[16][2]; + USHORT frame_num_list[16]; + UINT used_for_reference_flags; + USHORT non_existing_frame_flags; +}; + #define parent_class gst_d3d11_h264_dec_parent_class -G_DEFINE_TYPE (GstD3D11H264Dec, gst_d3d11_h264_dec, GST_TYPE_H264_DECODER); +G_DEFINE_TYPE_WITH_PRIVATE (GstD3D11H264Dec, + gst_d3d11_h264_dec, GST_TYPE_H264_DECODER); static void gst_d3d11_h264_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -189,6 +208,7 @@ gst_d3d11_h264_dec_class_init (GstD3D11H264DecClass * klass) static void gst_d3d11_h264_dec_init (GstD3D11H264Dec * self) { + self->priv = gst_d3d11_h264_dec_get_instance_private (self); self->slice_list = g_array_new (FALSE, TRUE, sizeof (DXVA_Slice_H264_Short)); self->adapter = DEFAULT_ADAPTER; } @@ -610,6 +630,7 @@ gst_d3d11_h264_dec_start_picture (GstH264Decoder * decoder, GstH264Picture * picture, GstH264Slice * slice, GstH264Dpb * dpb) { GstD3D11H264Dec *self = GST_D3D11_H264_DEC (decoder); + GstD3D11H264DecPrivate *priv = self->priv; GstD3D11DecoderOutputView *view; gint i; GArray *dpb_array; @@ -628,13 +649,13 @@ gst_d3d11_h264_dec_start_picture (GstH264Decoder * decoder, } for (i = 0; i < 16; i++) { - self->ref_frame_list[i].bPicEntry = 0xFF; - self->field_order_cnt_list[i][0] = 0; - self->field_order_cnt_list[i][1] = 0; - self->frame_num_list[i] = 0; + priv->ref_frame_list[i].bPicEntry = 0xFF; + priv->field_order_cnt_list[i][0] = 0; + priv->field_order_cnt_list[i][1] = 0; + priv->frame_num_list[i] = 0; } - self->used_for_reference_flags = 0; - self->non_existing_frame_flags = 0; + priv->used_for_reference_flags = 0; + priv->non_existing_frame_flags = 0; dpb_array = gst_h264_dpb_get_pictures_all (dpb); @@ -652,14 +673,14 @@ gst_d3d11_h264_dec_start_picture (GstH264Decoder * decoder, if (other_view) id = other_view->view_id; - self->ref_frame_list[i].Index7Bits = id; - self->ref_frame_list[i].AssociatedFlag = other->long_term; - self->field_order_cnt_list[i][0] = other->top_field_order_cnt; - self->field_order_cnt_list[i][1] = other->bottom_field_order_cnt; - self->frame_num_list[i] = self->ref_frame_list[i].AssociatedFlag + priv->ref_frame_list[i].Index7Bits = id; + priv->ref_frame_list[i].AssociatedFlag = other->long_term; + priv->field_order_cnt_list[i][0] = other->top_field_order_cnt; + priv->field_order_cnt_list[i][1] = other->bottom_field_order_cnt; + priv->frame_num_list[i] = priv->ref_frame_list[i].AssociatedFlag ? other->long_term_pic_num : other->frame_num; - self->used_for_reference_flags |= ref << (2 * i); - self->non_existing_frame_flags |= (other->nonexisting) << i; + priv->used_for_reference_flags |= ref << (2 * i); + priv->non_existing_frame_flags |= (other->nonexisting) << i; } g_array_unref (dpb_array); @@ -995,6 +1016,7 @@ gst_d3d11_h264_dec_decode_slice (GstH264Decoder * decoder, GstH264Picture * picture, GstH264Slice * slice) { GstD3D11H264Dec *self = GST_D3D11_H264_DEC (decoder); + GstD3D11H264DecPrivate *priv = self->priv; GstH264SPS *sps; GstH264PPS *pps; DXVA_PicParams_H264 pic_params = { 0, }; @@ -1031,15 +1053,15 @@ gst_d3d11_h264_dec_decode_slice (GstH264Decoder * decoder, pic_params.CurrFieldOrderCnt[1] = picture->bottom_field_order_cnt; } - memcpy (pic_params.RefFrameList, self->ref_frame_list, + memcpy (pic_params.RefFrameList, priv->ref_frame_list, sizeof (pic_params.RefFrameList)); - memcpy (pic_params.FieldOrderCntList, self->field_order_cnt_list, + memcpy (pic_params.FieldOrderCntList, priv->field_order_cnt_list, sizeof (pic_params.FieldOrderCntList)); - memcpy (pic_params.FrameNumList, self->frame_num_list, + memcpy (pic_params.FrameNumList, priv->frame_num_list, sizeof (pic_params.FrameNumList)); - pic_params.UsedForReferenceFlags = self->used_for_reference_flags; - pic_params.NonExistingFrameFlags = self->non_existing_frame_flags; + pic_params.UsedForReferenceFlags = priv->used_for_reference_flags; + pic_params.NonExistingFrameFlags = priv->non_existing_frame_flags; GST_TRACE_OBJECT (self, "Getting picture param decoder buffer"); diff --git a/sys/d3d11/gstd3d11h264dec.h b/sys/d3d11/gstd3d11h264dec.h index 890e736..13a8019 100644 --- a/sys/d3d11/gstd3d11h264dec.h +++ b/sys/d3d11/gstd3d11h264dec.h @@ -39,6 +39,8 @@ G_BEGIN_DECLS #define GST_IS_D3D11_H264_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_H264_DEC)) +typedef struct _GstD3D11H264DecPrivate GstD3D11H264DecPrivate; + struct _GstD3D11H264Dec { GstH264Decoder parent; @@ -54,12 +56,6 @@ struct _GstD3D11H264Dec guint chroma_format_idc; GstVideoFormat out_format; - DXVA_PicEntry_H264 ref_frame_list[16]; - INT field_order_cnt_list[16][2]; - USHORT frame_num_list[16]; - UINT used_for_reference_flags; - USHORT non_existing_frame_flags; - /* Array of DXVA_Slice_H264_Short */ GArray *slice_list; @@ -73,6 +69,8 @@ struct _GstD3D11H264Dec guint8 * bitstream_buffer_bytes; gboolean use_d3d11_output; + + GstD3D11H264DecPrivate *priv; }; struct _GstD3D11H264DecClass diff --git a/sys/d3d11/gstd3d11h265dec.c b/sys/d3d11/gstd3d11h265dec.c index cc2e233..94f0bf8 100644 --- a/sys/d3d11/gstd3d11h265dec.c +++ b/sys/d3d11/gstd3d11h265dec.c @@ -26,6 +26,14 @@ #include "gstd3d11bufferpool.h" #include +/* HACK: to expose dxva data structure on UWP */ +#ifdef WINAPI_PARTITION_DESKTOP +#undef WINAPI_PARTITION_DESKTOP +#endif +#define WINAPI_PARTITION_DESKTOP 1 +#include +#include + GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_h265_dec_debug); #define GST_CAT_DEFAULT gst_d3d11_h265_dec_debug @@ -61,8 +69,18 @@ static GstStaticPadTemplate src_template = (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, "{ NV12, P010_10LE }") "; " GST_VIDEO_CAPS_MAKE ("{ NV12, P010_10LE }"))); +struct _GstD3D11H265DecPrivate +{ + DXVA_PicEntry_HEVC ref_pic_list[15]; + INT pic_order_cnt_val_list[15]; + UCHAR ref_pic_set_st_curr_before[8]; + UCHAR ref_pic_set_st_curr_after[8]; + UCHAR ref_pic_set_lt_curr[8]; +}; + #define parent_class gst_d3d11_h265_dec_parent_class -G_DEFINE_TYPE (GstD3D11H265Dec, gst_d3d11_h265_dec, GST_TYPE_H265_DECODER); +G_DEFINE_TYPE_WITH_PRIVATE (GstD3D11H265Dec, + gst_d3d11_h265_dec, GST_TYPE_H265_DECODER); static void gst_d3d11_h265_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -157,6 +175,7 @@ gst_d3d11_h265_dec_class_init (GstD3D11H265DecClass * klass) static void gst_d3d11_h265_dec_init (GstD3D11H265Dec * self) { + self->priv = gst_d3d11_h265_dec_get_instance_private (self); self->slice_list = g_array_new (FALSE, TRUE, sizeof (DXVA_Slice_HEVC_Short)); self->adapter = DEFAULT_ADAPTER; } @@ -573,9 +592,11 @@ gst_d3d11_h265_dec_get_output_view_from_picture (GstD3D11H265Dec * self, static gint gst_d3d11_h265_dec_get_ref_index (GstD3D11H265Dec * self, gint view_id) { + GstD3D11H265DecPrivate *priv = self->priv; + gint i; - for (i = 0; i < G_N_ELEMENTS (self->ref_pic_list); i++) { - if (self->ref_pic_list[i].Index7Bits == view_id) + for (i = 0; i < G_N_ELEMENTS (priv->ref_pic_list); i++) { + if (priv->ref_pic_list[i].Index7Bits == view_id) return i; } @@ -587,6 +608,7 @@ gst_d3d11_h265_dec_start_picture (GstH265Decoder * decoder, GstH265Picture * picture, GstH265Slice * slice, GstH265Dpb * dpb) { GstD3D11H265Dec *self = GST_D3D11_H265_DEC (decoder); + GstD3D11H265DecPrivate *priv = self->priv; GstD3D11DecoderOutputView *view; gint i, j; GArray *dpb_array; @@ -605,21 +627,21 @@ gst_d3d11_h265_dec_start_picture (GstH265Decoder * decoder, } for (i = 0; i < 15; i++) { - self->ref_pic_list[i].bPicEntry = 0xff; - self->pic_order_cnt_val_list[i] = 0; + priv->ref_pic_list[i].bPicEntry = 0xff; + priv->pic_order_cnt_val_list[i] = 0; } for (i = 0; i < 8; i++) { - self->ref_pic_set_st_curr_before[i] = 0xff; - self->ref_pic_set_st_curr_after[i] = 0xff; - self->ref_pic_set_lt_curr[i] = 0xff; + priv->ref_pic_set_st_curr_before[i] = 0xff; + priv->ref_pic_set_st_curr_after[i] = 0xff; + priv->ref_pic_set_lt_curr[i] = 0xff; } dpb_array = gst_h265_dpb_get_pictures_all (dpb); GST_LOG_OBJECT (self, "DPB size %d", dpb_array->len); - for (i = 0; i < dpb_array->len && i < G_N_ELEMENTS (self->ref_pic_list); i++) { + for (i = 0; i < dpb_array->len && i < G_N_ELEMENTS (priv->ref_pic_list); i++) { GstH265Picture *other = g_array_index (dpb_array, GstH265Picture *, i); GstD3D11DecoderOutputView *other_view; gint id = 0xff; @@ -634,12 +656,12 @@ gst_d3d11_h265_dec_start_picture (GstH265Decoder * decoder, if (other_view) id = other_view->view_id; - self->ref_pic_list[i].Index7Bits = id; - self->ref_pic_list[i].AssociatedFlag = other->long_term; - self->pic_order_cnt_val_list[i] = other->pic_order_cnt; + priv->ref_pic_list[i].Index7Bits = id; + priv->ref_pic_list[i].AssociatedFlag = other->long_term; + priv->pic_order_cnt_val_list[i] = other->pic_order_cnt; } - for (i = 0, j = 0; i < G_N_ELEMENTS (self->ref_pic_set_st_curr_before); i++) { + for (i = 0, j = 0; i < G_N_ELEMENTS (priv->ref_pic_set_st_curr_before); i++) { GstH265Picture *other = NULL; gint id = 0xff; @@ -656,10 +678,10 @@ gst_d3d11_h265_dec_start_picture (GstH265Decoder * decoder, id = gst_d3d11_h265_dec_get_ref_index (self, other_view->view_id); } - self->ref_pic_set_st_curr_before[i] = id; + priv->ref_pic_set_st_curr_before[i] = id; } - for (i = 0, j = 0; i < G_N_ELEMENTS (self->ref_pic_set_st_curr_after); i++) { + for (i = 0, j = 0; i < G_N_ELEMENTS (priv->ref_pic_set_st_curr_after); i++) { GstH265Picture *other = NULL; gint id = 0xff; @@ -676,10 +698,10 @@ gst_d3d11_h265_dec_start_picture (GstH265Decoder * decoder, id = gst_d3d11_h265_dec_get_ref_index (self, other_view->view_id); } - self->ref_pic_set_st_curr_after[i] = id; + priv->ref_pic_set_st_curr_after[i] = id; } - for (i = 0, j = 0; i < G_N_ELEMENTS (self->ref_pic_set_lt_curr); i++) { + for (i = 0, j = 0; i < G_N_ELEMENTS (priv->ref_pic_set_lt_curr); i++) { GstH265Picture *other = NULL; gint id = 0xff; @@ -696,7 +718,7 @@ gst_d3d11_h265_dec_start_picture (GstH265Decoder * decoder, id = gst_d3d11_h265_dec_get_ref_index (self, other_view->view_id); } - self->ref_pic_set_lt_curr[i] = id; + priv->ref_pic_set_lt_curr[i] = id; } g_array_unref (dpb_array); @@ -1206,6 +1228,7 @@ gst_d3d11_h265_dec_decode_slice (GstH265Decoder * decoder, GstH265Picture * picture, GstH265Slice * slice) { GstD3D11H265Dec *self = GST_D3D11_H265_DEC (decoder); + GstD3D11H265DecPrivate *priv = self->priv; GstH265PPS *pps; DXVA_PicParams_HEVC pic_params = { 0, }; DXVA_Qmatrix_HEVC iq_matrix = { 0, }; @@ -1231,15 +1254,15 @@ gst_d3d11_h265_dec_decode_slice (GstH265Decoder * decoder, pic_params.IntraPicFlag = IS_IRAP (slice->nalu.type); pic_params.CurrPicOrderCntVal = picture->pic_order_cnt; - memcpy (pic_params.RefPicList, self->ref_pic_list, + memcpy (pic_params.RefPicList, priv->ref_pic_list, sizeof (pic_params.RefPicList)); - memcpy (pic_params.PicOrderCntValList, self->pic_order_cnt_val_list, + memcpy (pic_params.PicOrderCntValList, priv->pic_order_cnt_val_list, sizeof (pic_params.PicOrderCntValList)); - memcpy (pic_params.RefPicSetStCurrBefore, self->ref_pic_set_st_curr_before, + memcpy (pic_params.RefPicSetStCurrBefore, priv->ref_pic_set_st_curr_before, sizeof (pic_params.RefPicSetStCurrBefore)); - memcpy (pic_params.RefPicSetStCurrAfter, self->ref_pic_set_st_curr_after, + memcpy (pic_params.RefPicSetStCurrAfter, priv->ref_pic_set_st_curr_after, sizeof (pic_params.RefPicSetStCurrAfter)); - memcpy (pic_params.RefPicSetLtCurr, self->ref_pic_set_lt_curr, + memcpy (pic_params.RefPicSetLtCurr, priv->ref_pic_set_lt_curr, sizeof (pic_params.RefPicSetLtCurr)); #ifndef GST_DISABLE_GST_DEBUG diff --git a/sys/d3d11/gstd3d11h265dec.h b/sys/d3d11/gstd3d11h265dec.h index 402ccf3..71febf9 100644 --- a/sys/d3d11/gstd3d11h265dec.h +++ b/sys/d3d11/gstd3d11h265dec.h @@ -39,6 +39,8 @@ G_BEGIN_DECLS #define GST_IS_D3D11_H265_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_H265_DEC)) +typedef struct _GstD3D11H265DecPrivate GstD3D11H265DecPrivate; + struct _GstD3D11H265Dec { GstH265Decoder parent; @@ -54,12 +56,6 @@ struct _GstD3D11H265Dec guint chroma_format_idc; GstVideoFormat out_format; - DXVA_PicEntry_HEVC ref_pic_list[15]; - INT pic_order_cnt_val_list[15]; - UCHAR ref_pic_set_st_curr_before[8]; - UCHAR ref_pic_set_st_curr_after[8]; - UCHAR ref_pic_set_lt_curr[8]; - /* Array of DXVA_Slice_HEVC_Short */ GArray *slice_list; gboolean submit_iq_data; @@ -74,6 +70,8 @@ struct _GstD3D11H265Dec guint8 * bitstream_buffer_bytes; gboolean use_d3d11_output; + + GstD3D11H265DecPrivate *priv; }; struct _GstD3D11H265DecClass diff --git a/sys/d3d11/gstd3d11vp9dec.c b/sys/d3d11/gstd3d11vp9dec.c index cd2984a..d047e05 100644 --- a/sys/d3d11/gstd3d11vp9dec.c +++ b/sys/d3d11/gstd3d11vp9dec.c @@ -56,6 +56,14 @@ #include "gstd3d11bufferpool.h" #include +/* HACK: to expose dxva data structure on UWP */ +#ifdef WINAPI_PARTITION_DESKTOP +#undef WINAPI_PARTITION_DESKTOP +#endif +#define WINAPI_PARTITION_DESKTOP 1 +#include +#include + GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_vp9_dec_debug); #define GST_CAT_DEFAULT gst_d3d11_vp9_dec_debug -- 2.7.4