diff options
Diffstat (limited to 'sys/d3dvideosink')
-rw-r--r-- | sys/d3dvideosink/Makefile.am | 6 | ||||
-rw-r--r-- | sys/d3dvideosink/d3dvideosink.c | 392 | ||||
-rw-r--r-- | sys/d3dvideosink/d3dvideosink.h | 25 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx.h | 2 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx10/dx10_d3d.h | 2 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx11/dx11_d3d.h | 2 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx9/dx9_d3d.c | 16 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx9/dx9_d3d.h | 2 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx_d3d.c (renamed from sys/d3dvideosink/directx/d3d.c) | 0 | ||||
-rw-r--r-- | sys/d3dvideosink/directx/directx_d3d.h (renamed from sys/d3dvideosink/directx/d3d.h) | 0 |
10 files changed, 237 insertions, 210 deletions
diff --git a/sys/d3dvideosink/Makefile.am b/sys/d3dvideosink/Makefile.am index 1c6d24b9b..abbb751ff 100644 --- a/sys/d3dvideosink/Makefile.am +++ b/sys/d3dvideosink/Makefile.am @@ -1,17 +1,17 @@ plugin_LTLIBRARIES = libgstd3dvideosink.la -libgstd3dvideosink_la_SOURCES = d3dvideosink.c directx/d3d.c directx/dx.c \ +libgstd3dvideosink_la_SOURCES = d3dvideosink.c directx/directx_d3d.c directx/dx.c \ directx/directx9/dx9.c directx/directx9/dx9_d3d.c \ directx/directx10/dx10.c directx/directx10/dx10_d3d.c \ directx/directx11/dx11.c directx/directx11/dx11_d3d.c libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_CFLAGS) $(DIRECTX_CFLAGS) libgstd3dvideosink_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \ - -lgstvideo-$(GST_API_VERSION) -lgstinterfaces-$(GST_API_VERSION) \ + -lgstvideo-$(GST_API_VERSION) \ $(DIRECT3D_LIBS) libgstd3dvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTX_LDFAGS) libgstd3dvideosink_la_LIBTOOLFLAGS = --tag=disable-static -noinst_HEADERS = d3dvideosink.h directx/d3d.h directx/dx.h directx/directx.h \ +noinst_HEADERS = d3dvideosink.h directx/directx_d3d.h directx/dx.h directx/directx.h \ directx/directx9/dx9.h directx/directx9/dx9_d3d.h \ directx/directx10/dx10.h directx/directx10/dx10_d3d.h \ directx/directx11/dx11.h directx/directx11/dx11_d3d.h diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c index 7e76c60ce..040c21248 100644 --- a/sys/d3dvideosink/d3dvideosink.c +++ b/sys/d3dvideosink/d3dvideosink.c @@ -83,14 +83,22 @@ GST_DEBUG_CATEGORY (d3dvideosink_debug); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ YUY2, UYVY, YV12, I420, NV12 }") - ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_BGRA) + GST_STATIC_CAPS ("video/x-raw, " + "format = (string) { I420, YV12, YUY2, UYVY, BGRx, BGRA, NV12 }, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " + "height = (int) [ 1, MAX ]") ); -static void gst_d3dvideosink_init_interfaces (GType type); - -GST_BOILERPLATE_FULL (GstD3DVideoSink, gst_d3dvideosink, GstVideoSink, - GST_TYPE_VIDEO_SINK, gst_d3dvideosink_init_interfaces); +static void gst_d3dvideosink_navigation_init (GstNavigationInterface * iface); +static void gst_d3dvideosink_video_overlay_init (GstVideoOverlayInterface * + iface); +#define gst_d3dvideosink_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstD3DVideoSink, gst_d3dvideosink, GST_TYPE_VIDEO_SINK, + G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION, + gst_d3dvideosink_navigation_init); + G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY, + gst_d3dvideosink_video_overlay_init)); enum { @@ -113,14 +121,14 @@ static GstStateChangeReturn gst_d3dvideosink_change_state (GstElement * element, static gboolean gst_d3dvideosink_start (GstBaseSink * bsink); static gboolean gst_d3dvideosink_stop (GstBaseSink * bsink); static gboolean gst_d3dvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps); -static GstCaps *gst_d3dvideosink_get_caps (GstBaseSink * bsink); +static GstCaps *gst_d3dvideosink_get_caps (GstBaseSink * bsink, GstCaps * filter); static GstFlowReturn gst_d3dvideosink_show_frame (GstVideoSink * sink, GstBuffer * buffer); -/* GstXOverlay methods */ -static void gst_d3dvideosink_set_window_handle (GstXOverlay * overlay, +/* GstVideoOverlay methods */ +static void gst_d3dvideosink_set_window_handle (GstVideoOverlay * overlay, guintptr window_id); -static void gst_d3dvideosink_expose (GstXOverlay * overlay); +static void gst_d3dvideosink_expose (GstVideoOverlay * overlay); /* GstNavigation methods */ static void gst_d3dvideosink_navigation_send_event (GstNavigation * navigation, @@ -207,77 +215,20 @@ DllMain (HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad) return TRUE; } -static gboolean -gst_d3dvideosink_interface_supported (GstImplementsInterface * iface, - GType type) -{ - return (type == GST_TYPE_X_OVERLAY || type == GST_TYPE_NAVIGATION); -} - static void -gst_d3dvideosink_interface_init (GstImplementsInterfaceClass * klass) -{ - klass->supported = gst_d3dvideosink_interface_supported; -} - -static void -gst_d3dvideosink_xoverlay_interface_init (GstXOverlayClass * iface) +gst_d3dvideosink_video_overlay_init (GstVideoOverlayInterface * iface) { iface->set_window_handle = gst_d3dvideosink_set_window_handle; iface->expose = gst_d3dvideosink_expose; } static void -gst_d3dvideosink_navigation_interface_init (GstNavigationInterface * iface) +gst_d3dvideosink_navigation_init (GstNavigationInterface * iface) { iface->send_event = gst_d3dvideosink_navigation_send_event; } static void -gst_d3dvideosink_init_interfaces (GType type) -{ - static const GInterfaceInfo iface_info = { - (GInterfaceInitFunc) gst_d3dvideosink_interface_init, - NULL, - NULL - }; - - static const GInterfaceInfo xoverlay_info = { - (GInterfaceInitFunc) gst_d3dvideosink_xoverlay_interface_init, - NULL, - NULL - }; - - static const GInterfaceInfo navigation_info = { - (GInterfaceInitFunc) gst_d3dvideosink_navigation_interface_init, - NULL, - NULL, - }; - - g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, - &iface_info); - g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, &xoverlay_info); - g_type_add_interface_static (type, GST_TYPE_NAVIGATION, &navigation_info); - - GST_DEBUG_CATEGORY_INIT (d3dvideosink_debug, "d3dvideosink", 0, - "Direct3D video sink"); -} - -static void -gst_d3dvideosink_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_template)); - - gst_element_class_set_details_simple (element_class, "Direct3D video sink", - "Sink/Video", - "Display data using a Direct3D video renderer", - "David Hoyt <dhoyt@hoytsoft.org>"); -} - -static void gst_d3dvideosink_class_init (GstD3DVideoSinkClass * klass) { GObjectClass *gobject_class; @@ -327,6 +278,14 @@ gst_d3dvideosink_class_init (GstD3DVideoSinkClass * klass) "When enabled, navigation events are sent upstream", TRUE, (GParamFlags) G_PARAM_READWRITE)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_template)); + + gst_element_class_set_static_metadata (gstelement_class, "Direct3D video sink", + "Sink/Video", + "Display data using a Direct3D video renderer", + "David Hoyt <dhoyt@hoytsoft.org>"); + /* Initialize DirectX abstraction */ GST_DEBUG ("Initializing DirectX abstraction layer"); directx_initialize (&directx_init_params); @@ -356,7 +315,7 @@ gst_d3dvideosink_clear (GstD3DVideoSink * sink) } static void -gst_d3dvideosink_init (GstD3DVideoSink * sink, GstD3DVideoSinkClass * klass) +gst_d3dvideosink_init (GstD3DVideoSink * sink) { gst_d3dvideosink_clear (sink); @@ -442,12 +401,83 @@ gst_d3dvideosink_get_property (GObject * object, guint prop_id, } static GstCaps * -gst_d3dvideosink_get_caps (GstBaseSink * basesink) +gst_d3dvideosink_get_device_caps (GstBaseSink *basesink, D3DDISPLAYMODE d3ddm) +{ + GstD3DVideoSink *sink = GST_D3DVIDEOSINK (basesink); + gint i; + GstCaps *caps; + GstCaps *c; + + caps = gst_caps_new_empty (); + c = gst_caps_normalize (gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (sink))); + + for (i = 0; i < gst_caps_get_size (c); i++) { + GstStructure *stru; + stru = gst_caps_get_structure (c, i); + if (gst_structure_has_name (stru, "video/x-raw")) + { + GstVideoFormat format; + const gchar *s; + D3DFORMAT d3dfourcc = 0; + s = gst_structure_get_string (stru, "format"); + format = gst_video_format_from_string (s); + switch (format) + { + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420: + d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'V', '1', '2'); + break; + case GST_VIDEO_FORMAT_RGB: + d3dfourcc = D3DFMT_R8G8B8; + break; + case GST_VIDEO_FORMAT_ARGB: + d3dfourcc = D3DFMT_A8R8G8B8; + break; + case GST_VIDEO_FORMAT_xRGB: + d3dfourcc = D3DFMT_X8R8G8B8; + break; + case GST_VIDEO_FORMAT_RGB16: + d3dfourcc = D3DFMT_R5G6B5; + break; + case GST_VIDEO_FORMAT_ABGR: + d3dfourcc = D3DFMT_A8B8G8R8; + break; + case GST_VIDEO_FORMAT_xBGR: + d3dfourcc = D3DFMT_X8B8G8R8; + break; + case GST_VIDEO_FORMAT_GRAY8: + d3dfourcc = D3DFMT_L8; + break; + case GST_VIDEO_FORMAT_UYVY: + d3dfourcc = D3DFMT_UYVY; + break; + case GST_VIDEO_FORMAT_YUY2: + d3dfourcc = D3DFMT_YUY2; + break; + default: + break; + } + if (d3dfourcc == 0) + continue; + if (SUCCEEDED (IDirect3D9_CheckDeviceFormat (shared.d3d, + D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, 0, D3DRTYPE_SURFACE, + d3dfourcc))) + { + /* hw supports this format */ + gst_caps_append (caps, gst_caps_copy_nth (c, i)); + } + } + } + + gst_caps_unref (c); + return caps; +} + +static GstCaps * +gst_d3dvideosink_get_caps (GstBaseSink * basesink, GstCaps * filter) { GstD3DVideoSink *sink = GST_D3DVIDEOSINK (basesink); GstCaps *caps; - const GstCaps *tempCaps = - gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (sink)); /* restrict caps based on the hw capabilities */ if (shared.d3d) { @@ -455,43 +485,21 @@ gst_d3dvideosink_get_caps (GstBaseSink * basesink) if (FAILED (IDirect3D9_GetAdapterDisplayMode (shared.d3d, D3DADAPTER_DEFAULT, &d3ddm))) { GST_WARNING ("Unable to request adapter display mode"); - caps = tempCaps; + caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (sink)); } else { - gint i; - GstCaps *c; - - caps = gst_caps_new_empty (); - c = gst_caps_normalize (tempCaps); - - for (i = 0; i < gst_caps_get_size (c); i++) { - D3DFORMAT d3dfourcc = 0; - GstStructure *stru = gst_caps_get_structure (c, i); - if (!gst_structure_has_name (stru, "video/x-raw-rgb")) { - gst_structure_get_fourcc (stru, "format", (guint32 *) & d3dfourcc); - switch ((guint32) d3dfourcc) { - case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): - case GST_MAKE_FOURCC ('I', '4', '2', '0'): - d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'V', '1', '2'); - break; - default: - break; - } - if (d3dfourcc && SUCCEEDED (IDirect3D9_CheckDeviceFormat (shared.d3d, - D3DADAPTER_DEFAULT, - D3DDEVTYPE_HAL, - d3ddm.Format, 0, D3DRTYPE_SURFACE, d3dfourcc))) { - /* hw supports this format */ - gst_caps_append (caps, gst_caps_copy_nth (c, i)); - } - } else { - /* rgb formats */ - gst_caps_append (caps, gst_caps_copy_nth (c, i)); - } - } - gst_caps_unref (c); + caps = gst_d3dvideosink_get_device_caps (basesink, d3ddm); } } else { - caps = tempCaps; + caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (sink)); + if (filter) + { + GstCaps *intersection; + + intersection = + gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = intersection; + } } return caps; } @@ -777,7 +785,7 @@ WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) SetWindowLongPtr (hWnd, GWLP_USERDATA, (LONG_PTR) sink); /* signal application we created a window */ - gst_x_overlay_got_window_handle (GST_X_OVERLAY (sink), (guintptr) hWnd); + gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (sink), (guintptr) hWnd); } @@ -1060,7 +1068,7 @@ failed: } static void -gst_d3dvideosink_set_window_handle (GstXOverlay * overlay, guintptr window_id) +gst_d3dvideosink_set_window_handle (GstVideoOverlay * overlay, guintptr window_id) { GstD3DVideoSink *sink = GST_D3DVIDEOSINK (overlay); HWND hWnd = (HWND) window_id; @@ -1360,7 +1368,7 @@ gst_d3dvideosink_prepare_window (GstD3DVideoSink * sink) { /* Give the app a last chance to supply a window id */ if (!sink->window_handle) { - gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (sink)); + gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (sink)); } /* If the app supplied one, use it. Otherwise, go ahead @@ -1434,11 +1442,12 @@ static gboolean gst_d3dvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) { GstD3DVideoSink *sink; + /*GstStructure *structure;*/ GstCaps *sink_caps; + GstVideoInfo info; gint video_width, video_height; gint video_par_n, video_par_d; /* video's PAR */ gint display_par_n, display_par_d; /* display's PAR */ - gint fps_n, fps_d; guint num, den; sink = GST_D3DVIDEOSINK (bsink); @@ -1451,24 +1460,22 @@ gst_d3dvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) if (!gst_caps_can_intersect (sink_caps, caps)) goto incompatible_caps; - if (!gst_video_format_parse_caps (caps, &sink->format, &video_width, - &video_height)) + if (!gst_video_info_from_caps (&info, caps)) goto invalid_format; - if (!gst_video_parse_caps_framerate (caps, &fps_n, &fps_d) || - !video_width || !video_height) - goto incomplete_caps; + /*structure = gst_caps_get_structure (caps, 0);*/ + + video_width = info.width; + video_height = info.height; /* get aspect ratio from caps if it's present, and * convert video width and height to a display width and height * using wd / hd = wv / hv * PARv / PARd */ /* get video's PAR */ - if (!gst_video_parse_caps_pixel_aspect_ratio (caps, &video_par_n, - &video_par_d)) { - video_par_n = 1; - video_par_d = 1; - } + video_par_n = info.par_n; + video_par_d = info.par_d; + /* get display's PAR */ if (sink->par) { display_par_n = gst_value_get_fraction_numerator (sink->par); @@ -1478,8 +1485,8 @@ gst_d3dvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) display_par_d = 1; } - if (!gst_video_calculate_display_ratio (&num, &den, video_width, - video_height, video_par_n, video_par_d, display_par_n, display_par_d)) + if (!gst_video_calculate_display_ratio (&num, &den, info.width, + info.height, video_par_n, video_par_d, display_par_n, display_par_d)) goto no_disp_ratio; GST_DEBUG_OBJECT (sink, @@ -1492,21 +1499,21 @@ gst_d3dvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) /* start with same height, because of interlaced video */ /* check hd / den is an integer scale factor, and scale wd with the PAR */ - if (video_height % den == 0) { + if (info.height % den == 0) { GST_DEBUG_OBJECT (sink, "keeping video height"); GST_VIDEO_SINK_WIDTH (sink) = (guint) - gst_util_uint64_scale_int (video_height, num, den); - GST_VIDEO_SINK_HEIGHT (sink) = video_height; - } else if (video_width % num == 0) { + gst_util_uint64_scale_int (info.height, num, den); + GST_VIDEO_SINK_HEIGHT (sink) = info.height; + } else if (info.width % num == 0) { GST_DEBUG_OBJECT (sink, "keeping video width"); - GST_VIDEO_SINK_WIDTH (sink) = video_width; + GST_VIDEO_SINK_WIDTH (sink) = info.width; GST_VIDEO_SINK_HEIGHT (sink) = (guint) - gst_util_uint64_scale_int (video_width, den, num); + gst_util_uint64_scale_int (info.width, den, num); } else { GST_DEBUG_OBJECT (sink, "approximating while keeping video height"); GST_VIDEO_SINK_WIDTH (sink) = (guint) - gst_util_uint64_scale_int (video_height, num, den); - GST_VIDEO_SINK_HEIGHT (sink) = video_height; + gst_util_uint64_scale_int (info.height, num, den); + GST_VIDEO_SINK_HEIGHT (sink) = info.height; } GST_DEBUG_OBJECT (sink, "scaling to %dx%d", GST_VIDEO_SINK_WIDTH (sink), GST_VIDEO_SINK_HEIGHT (sink)); @@ -1514,8 +1521,8 @@ gst_d3dvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) if (GST_VIDEO_SINK_WIDTH (sink) <= 0 || GST_VIDEO_SINK_HEIGHT (sink) <= 0) goto no_display_size; - sink->width = video_width; - sink->height = video_height; + sink->info = info; + sink->format = GST_VIDEO_INFO_FORMAT (&info); /* Create a window (or start using an application-supplied one, then connect the graph */ gst_d3dvideosink_prepare_window (sink); @@ -1527,12 +1534,6 @@ incompatible_caps: GST_ERROR_OBJECT (sink, "caps incompatible"); return FALSE; } -incomplete_caps: - { - GST_DEBUG_OBJECT (sink, "Failed to retrieve either width, " - "height or framerate from intersected caps"); - return FALSE; - } invalid_format: { gchar *caps_txt = gst_caps_to_string (caps); @@ -1640,42 +1641,40 @@ gst_d3dvideosink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) drawSurface = sink->d3d_offscreen_surface; if (SUCCEEDED (IDirect3DDevice9_BeginScene (sink->d3ddev))) { - if (GST_BUFFER_DATA (buffer)) { + GstMapInfo map; + if (gst_buffer_map (buffer, &map, GST_MAP_READ)) { D3DLOCKED_RECT lr; guint8 *dest, *source; int srcstride, dststride, i; IDirect3DSurface9_LockRect (drawSurface, &lr, NULL, 0); dest = (guint8 *) lr.pBits; - source = GST_BUFFER_DATA (buffer); + source = map.data; if (dest) { - if (gst_video_format_is_yuv (sink->format)) { - guint32 fourcc = gst_video_format_to_fourcc (sink->format); - - switch (fourcc) { - case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): - case GST_MAKE_FOURCC ('Y', 'U', 'Y', 'V'): - case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + if (GST_VIDEO_INFO_IS_YUV (&sink->info)) { + switch (sink->format) { + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_UYVY: dststride = lr.Pitch; - srcstride = GST_BUFFER_SIZE (buffer) / sink->height; - for (i = 0; i < sink->height; ++i) + srcstride = gst_buffer_get_size (buffer) / GST_VIDEO_SINK_HEIGHT (sink); + for (i = 0; i < GST_VIDEO_SINK_HEIGHT (sink); ++i) memcpy (dest + dststride * i, source + srcstride * i, srcstride); break; - case GST_MAKE_FOURCC ('I', '4', '2', '0'): - case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: { int srcystride, srcvstride, srcustride; int dstystride, dstvstride, dstustride; int rows; guint8 *srcv, *srcu, *dstv, *dstu; - rows = sink->height; + rows = GST_VIDEO_SINK_HEIGHT (sink); /* Source y, u and v strides */ - srcystride = GST_ROUND_UP_4 (sink->width); - srcustride = GST_ROUND_UP_8 (sink->width) / 2; + srcystride = GST_ROUND_UP_4 (GST_VIDEO_SINK_WIDTH (sink)); + srcustride = GST_ROUND_UP_8 (GST_VIDEO_SINK_WIDTH (sink)) / 2; srcvstride = GST_ROUND_UP_8 (srcystride) / 2; /* Destination y, u and v strides */ @@ -1686,7 +1685,7 @@ gst_d3dvideosink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) srcu = source + srcystride * GST_ROUND_UP_2 (rows); srcv = srcu + srcustride * GST_ROUND_UP_2 (rows) / 2; - if (fourcc == GST_MAKE_FOURCC ('I', '4', '2', '0')) { + if (sink->format == GST_VIDEO_FORMAT_I420) { /* swap u and v planes */ dstv = dest + dstystride * rows; dstu = dstv + dstustride * rows / 2; @@ -1711,22 +1710,15 @@ gst_d3dvideosink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) } break; } - case GST_MAKE_FOURCC ('N', 'V', '1', '2'): + case GST_VIDEO_FORMAT_NV12: { guint8 *dst = dest; int component; dststride = lr.Pitch; for (component = 0; component < 2; component++) { - const int compHeight = - gst_video_format_get_component_height (sink->format, - component, sink->height); - guint8 *src = - source + - gst_video_format_get_component_offset (sink->format, - component, sink->width, sink->height); - srcstride = - gst_video_format_get_row_stride (sink->format, component, - sink->width); + const int compHeight = GST_VIDEO_INFO_COMP_HEIGHT (&sink->info, component); + guint8 *src = source + GST_VIDEO_INFO_COMP_OFFSET(&sink->info, component); + srcstride = GST_VIDEO_INFO_COMP_STRIDE(&sink->info, component); for (i = 0; i < compHeight; i++) { memcpy (dst + dststride * i, src + srcstride * i, srcstride); } @@ -1737,14 +1729,15 @@ gst_d3dvideosink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) default: g_assert_not_reached (); } - } else if (gst_video_format_is_rgb (sink->format)) { + } else if (GST_VIDEO_INFO_IS_RGB (&sink->info)) { dststride = lr.Pitch; - srcstride = GST_BUFFER_SIZE (buffer) / sink->height; - for (i = 0; i < sink->height; ++i) + srcstride = gst_buffer_get_size (buffer) / GST_VIDEO_SINK_HEIGHT (sink); + for (i = 0; i < GST_VIDEO_SINK_HEIGHT (sink); ++i) memcpy (dest + dststride * i, source + srcstride * i, srcstride); } } IDirect3DSurface9_UnlockRect (drawSurface); + gst_buffer_unmap (buffer, &map); } IDirect3DDevice9_EndScene (sink->d3ddev); } @@ -1925,7 +1918,7 @@ gst_d3dvideosink_stretch (GstD3DVideoSink * sink, LPDIRECT3DSURFACE9 backBuffer) } static void -gst_d3dvideosink_expose (GstXOverlay * overlay) +gst_d3dvideosink_expose (GstVideoOverlay * overlay) { GstBaseSink *sink = GST_BASE_SINK (overlay); gst_d3dvideosink_update (sink); @@ -1934,12 +1927,15 @@ gst_d3dvideosink_expose (GstXOverlay * overlay) static void gst_d3dvideosink_update (GstBaseSink * bsink) { + GstSample *last_sample; GstBuffer *last_buffer; - last_buffer = gst_base_sink_get_last_buffer (bsink); - if (last_buffer) { - gst_d3dvideosink_show_frame (GST_VIDEO_SINK (bsink), last_buffer); - gst_buffer_unref (last_buffer); + last_sample = gst_base_sink_get_last_sample (bsink); + if (last_sample) { + last_buffer = gst_sample_get_buffer (last_sample); + if (last_buffer) + gst_d3dvideosink_show_frame (GST_VIDEO_SINK (bsink), last_buffer); + gst_sample_unref (last_sample); } } @@ -2042,8 +2038,6 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) D3DTEXTUREFILTERTYPE d3dfiltertype; gint width, height; - - /* Get the current size of the window */ gst_d3dvideosink_window_size (sink, &width, &height); @@ -2088,9 +2082,9 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) d3dfiltertype = D3DTEXF_NONE; } - if (gst_video_format_is_yuv (sink->format)) { - switch (gst_video_format_to_fourcc (sink->format)) { - case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + if (GST_VIDEO_INFO_IS_YUV (&sink->info)) { + switch (sink->format) { + case GST_VIDEO_FORMAT_YUY2: d3dformat = D3DFMT_X8R8G8B8; d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'U', 'Y', '2'); break; @@ -2098,16 +2092,16 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) // d3dformat = D3DFMT_X8R8G8B8; // d3dfourcc = (D3DFORMAT)MAKEFOURCC('Y', 'U', 'V', 'Y'); // break; - case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + case GST_VIDEO_FORMAT_UYVY: d3dformat = D3DFMT_X8R8G8B8; d3dfourcc = (D3DFORMAT) MAKEFOURCC ('U', 'Y', 'V', 'Y'); break; - case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): - case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420: d3dformat = D3DFMT_X8R8G8B8; d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'V', '1', '2'); break; - case GST_MAKE_FOURCC ('N', 'V', '1', '2'): + case GST_VIDEO_FORMAT_NV12: d3dformat = D3DFMT_X8R8G8B8; d3dfourcc = (D3DFORMAT) MAKEFOURCC ('N', 'V', '1', '2'); break; @@ -2115,7 +2109,7 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) g_assert_not_reached (); goto error; } - } else if (gst_video_format_is_rgb (sink->format)) { + } else if (GST_VIDEO_INFO_IS_RGB (&sink->info)) { d3dformat = D3DFMT_X8R8G8B8; d3dfourcc = D3DFMT_X8R8G8B8; } else { @@ -2157,8 +2151,8 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) sink->d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; sink->d3dpp.BackBufferCount = 1; //sink->d3dpp.BackBufferFormat = d3dformat; - sink->d3dpp.BackBufferWidth = sink->width; - sink->d3dpp.BackBufferHeight = sink->height; + sink->d3dpp.BackBufferWidth = GST_VIDEO_SINK_WIDTH (sink); + sink->d3dpp.BackBufferHeight = GST_VIDEO_SINK_HEIGHT (sink); sink->d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; sink->d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; @@ -2166,21 +2160,18 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) sink->d3ddev = NULL; - if (FAILED (hr = IDirect3D9_CreateDevice (shared.d3d, - D3DADAPTER_DEFAULT, - D3DDEVTYPE_HAL, hwnd, d3dcreate, &sink->d3dpp, &sink->d3ddev))) { - GST_WARNING ("Unable to create Direct3D device. Result: %ld (0x%lx)", hr, - hr); + hr = IDirect3D9_CreateDevice (shared.d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, d3dcreate, &sink->d3dpp, &sink->d3ddev); + if (FAILED (hr)) + { + GST_WARNING ("Unable to create Direct3D device. Result: %ld (0x%lx)", hr, hr); goto error; } - if (FAILED (IDirect3DDevice9_CreateOffscreenPlainSurface (sink->d3ddev, - sink->width, sink->height, d3dfourcc, D3DPOOL_DEFAULT, - &sink->d3d_offscreen_surface, NULL))) { + hr = IDirect3DDevice9_CreateOffscreenPlainSurface (sink->d3ddev, GST_VIDEO_SINK_WIDTH (sink), GST_VIDEO_SINK_HEIGHT (sink), d3dfourcc, D3DPOOL_DEFAULT, &sink->d3d_offscreen_surface, NULL); + if (FAILED (hr)) { goto error; } - /* Determine texture filtering support. If it's supported for this format, use the filter type determined when we created the dev and checked the dev caps. */ @@ -2491,7 +2482,7 @@ static void gst_d3dvideosink_log_debug (const gchar * file, const gchar * function, gint line, const gchar * format, va_list args) { - if (G_UNLIKELY (GST_LEVEL_DEBUG <= __gst_debug_min)) + if (G_UNLIKELY (GST_LEVEL_DEBUG <= _gst_debug_min)) gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, file, function, line, NULL, format, args); } @@ -2500,7 +2491,7 @@ static void gst_d3dvideosink_log_warning (const gchar * file, const gchar * function, gint line, const gchar * format, va_list args) { - if (G_UNLIKELY (GST_LEVEL_WARNING <= __gst_debug_min)) + if (G_UNLIKELY (GST_LEVEL_WARNING <= _gst_debug_min)) gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, file, function, line, NULL, format, args); } @@ -2509,7 +2500,7 @@ static void gst_d3dvideosink_log_error (const gchar * file, const gchar * function, gint line, const gchar * format, va_list args) { - if (G_UNLIKELY (GST_LEVEL_ERROR <= __gst_debug_min)) + if (G_UNLIKELY (GST_LEVEL_ERROR <= _gst_debug_min)) gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_ERROR, file, function, line, NULL, format, args); } @@ -2523,6 +2514,9 @@ plugin_init (GstPlugin * plugin) GST_RANK_PRIMARY, GST_TYPE_D3DVIDEOSINK)) return FALSE; + GST_DEBUG_CATEGORY_INIT (d3dvideosink_debug, "d3dvideosink", 0, + "Direct3D video sink"); + return TRUE; } diff --git a/sys/d3dvideosink/d3dvideosink.h b/sys/d3dvideosink/d3dvideosink.h index 14b52fd00..67877fa8b 100644 --- a/sys/d3dvideosink/d3dvideosink.h +++ b/sys/d3dvideosink/d3dvideosink.h @@ -23,10 +23,26 @@ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/video/gstvideosink.h> -#include <gst/interfaces/xoverlay.h> -#include <gst/interfaces/navigation.h> +#include <gst/video/videooverlay.h> +#include <gst/video/navigation.h> #include <windows.h> +#if defined(__MINGW32__) +# ifndef _OBJC_NO_COM_ +# if defined(__cplusplus) && !defined(CINTERFACE) +# if defined(__GNUC__) && __GNUC__ < 3 && !defined(NOCOMATTRIBUTE) +# define DECLARE_INTERFACE_IID_(i,b,d) _COM_interface __attribute__((com_interface)) i : public b +# else +# define DECLARE_INTERFACE_IID_(i,b,d) _COM_interface i : public b +# endif +# else +# define DECLARE_INTERFACE_IID_(i,b,d) DECLARE_INTERFACE(i) +# endif +# endif +# if !defined(__MSABI_LONG) +# define __MSABI_LONG(x) x ## l +# endif +#endif #include <d3d9.h> #include <d3dx9tex.h> @@ -55,10 +71,11 @@ struct _GstD3DVideoSink GstVideoSink sink; /* source rectangle */ - gint width; - gint height; + //gint width; + //gint height; GstVideoFormat format; + GstVideoInfo info; gboolean enable_navigation_events; diff --git a/sys/d3dvideosink/directx/directx.h b/sys/d3dvideosink/directx/directx.h index 40c33dda6..2c7481539 100644 --- a/sys/d3dvideosink/directx/directx.h +++ b/sys/d3dvideosink/directx/directx.h @@ -21,7 +21,7 @@ #define __DIRECTX_DIRECTX_H__ #include "dx.h" -#include "d3d.h" +#include "directx_d3d.h" /* TODO: Remove these headers -- they should not be publically distributed. */ /* They're included for now only for expediancy in getting d3dvideosink */ diff --git a/sys/d3dvideosink/directx/directx10/dx10_d3d.h b/sys/d3dvideosink/directx/directx10/dx10_d3d.h index a91c4f684..c8bc9b626 100644 --- a/sys/d3dvideosink/directx/directx10/dx10_d3d.h +++ b/sys/d3dvideosink/directx/directx10/dx10_d3d.h @@ -22,7 +22,7 @@ #include <windows.h> -#include "../d3d.h" +#include "../directx_d3d.h" #define DX10_D3D_API_CALL_FUNC(api, func_name, ...) (DIRECTX_CALL_COMPONENT_SYMBOL(DIRECTX_D3D(api), D3D10DispatchTable, func_name, __VA_ARGS__)) #define DX10_D3D_COMPONENT_CALL_FUNC(component, func_name, ...) (DIRECTX_CALL_COMPONENT_SYMBOL(component, D3D10DispatchTable, func_name, __VA_ARGS__)) diff --git a/sys/d3dvideosink/directx/directx11/dx11_d3d.h b/sys/d3dvideosink/directx/directx11/dx11_d3d.h index 6eb158ba9..3db0d1512 100644 --- a/sys/d3dvideosink/directx/directx11/dx11_d3d.h +++ b/sys/d3dvideosink/directx/directx11/dx11_d3d.h @@ -22,7 +22,7 @@ #include <windows.h> -#include "../d3d.h" +#include "../directx_d3d.h" #define DX11_D3D_API_CALL_FUNC(api, func_name, ...) (DIRECTX_CALL_COMPONENT_SYMBOL(DIRECTX_D3D(api), D3D11DispatchTable, func_name, __VA_ARGS__)) #define DX11_D3D_COMPONENT_CALL_FUNC(component, func_name, ...) (DIRECTX_CALL_COMPONENT_SYMBOL(component, D3D11DispatchTable, func_name, __VA_ARGS__)) diff --git a/sys/d3dvideosink/directx/directx9/dx9_d3d.c b/sys/d3dvideosink/directx/directx9/dx9_d3d.c index 5b50aba0b..81e3ece29 100644 --- a/sys/d3dvideosink/directx/directx9/dx9_d3d.c +++ b/sys/d3dvideosink/directx/directx9/dx9_d3d.c @@ -17,6 +17,22 @@ * Boston, MA 02111-1307, USA. */ +#if defined(__MINGW32__) +# ifndef _OBJC_NO_COM_ +# if defined(__cplusplus) && !defined(CINTERFACE) +# if defined(__GNUC__) && __GNUC__ < 3 && !defined(NOCOMATTRIBUTE) +# define DECLARE_INTERFACE_IID_(i,b,d) _COM_interface __attribute__((com_interface)) i : public b +# else +# define DECLARE_INTERFACE_IID_(i,b,d) _COM_interface i : public b +# endif +# else +# define DECLARE_INTERFACE_IID_(i,b,d) DECLARE_INTERFACE(i) +# endif +# endif +# if !defined(__MSABI_LONG) +# define __MSABI_LONG(x) x ## l +# endif +#endif #include <d3d9.h> #include <d3dx9tex.h> diff --git a/sys/d3dvideosink/directx/directx9/dx9_d3d.h b/sys/d3dvideosink/directx/directx9/dx9_d3d.h index 28e27fe1e..423f8b468 100644 --- a/sys/d3dvideosink/directx/directx9/dx9_d3d.h +++ b/sys/d3dvideosink/directx/directx9/dx9_d3d.h @@ -22,7 +22,7 @@ #include <windows.h> -#include "../d3d.h" +#include "../directx_d3d.h" #define DX9_D3D_API_CALL_FUNC(api, func_name, ...) (DIRECTX_CALL_COMPONENT_SYMBOL(DIRECTX_D3D(api), D3D9DispatchTable, func_name, __VA_ARGS__)) #define DX9_D3D_COMPONENT_CALL_FUNC(component, func_name, ...) (DIRECTX_CALL_COMPONENT_SYMBOL(component, D3D9DispatchTable, func_name, __VA_ARGS__)) diff --git a/sys/d3dvideosink/directx/d3d.c b/sys/d3dvideosink/directx/directx_d3d.c index 33589a380..33589a380 100644 --- a/sys/d3dvideosink/directx/d3d.c +++ b/sys/d3dvideosink/directx/directx_d3d.c diff --git a/sys/d3dvideosink/directx/d3d.h b/sys/d3dvideosink/directx/directx_d3d.h index 238349c27..238349c27 100644 --- a/sys/d3dvideosink/directx/d3d.h +++ b/sys/d3dvideosink/directx/directx_d3d.h |